閱讀822 返回首頁    go 阿裏雲 go 技術社區[雲棲]


5.4 TLP中與數據負載相關的參數

PCIe總線中,有些TLP含有Data Payload,如存儲器寫請求、存儲器讀完成TLP等。在PCIe總線中,TLP含有的Data Payload大小與Max_Payload_SizeMax_Read_Request_SizeRCB參數相關。下文將分別介紹這些參數的使用。

5.4.1 Max_Payload_Size參數

PCIe總線規定在TLP報文中,數據有效負載的最大值為4KB,但是PCIe設備並不一定能夠發送這麼大的數據報文。PCIe設備含有“Max_Payload_Size”和“Max_Payload_Size Supported”參數,這兩個參數分別在Device Capability寄存器和Device Control寄存器中定義。

Max_Payload_Size Supported”參數存放在一個PCIe設備中,TLP有效負載的最大值,該參數由PCIe設備的硬件邏輯確定,係統軟件不能改寫該參數。而Max_Payload_Size參數存放PCIe設備實際使用的,TLP有效負載的最大值。該參數由PCIe鏈路兩端的設備協商決定,是PCIe設備進行數據傳送時,實際使用的參數。

PCIe設備發送數據報文時,使用Max_Payload_Size參數決定TLP的最大有效負載。當PCIe設備的所傳送的數據大小超過Max_Payload_Size參數時,這段數據將被分割為多個TLP進行發送。當PCIe設備接收TLP時,該TLP的最大有效負載也不能超過Max_Payload_Size參數,如果接收的TLP,其Length字段超過Max_Payload_Size參數,該PCIe設備將認為該TLP非法。

RC或者EP在發送存儲器讀完成TLP時,這個存儲器讀完成TLP的最大Payload也不能超過Max_Payload_Size參數,如果超過該參數,PCIe設備需要發送多個讀完成報文。值得注意的是,這些讀完成報文需要滿足RCB參數的要求,有關RCB參數的詳細說明見下文。

在實際應用中,盡管有些PCIe設備的Max_Payload_Size Supported參數可以為256B512B1024B或者更高,但是如果PCIe鏈路的對端設備可以支持的Max_Payload_Size參數為128B時,係統軟件將使用對端設備的Max_Payload_Size Supported參數,初始化該設備的Max_Payload_Size參數,即選用PCIe鏈路兩端最小的Max_Payload_Size Supported參數初始化Max_Payload_Size參數。

在多數x86處理器係統的MCH或者ICH中,Max_Payload_Size Supported參數為128B。這也意味著在x86處理器中,與MCH或者ICH直接相連的PCIe設備進行DMA讀寫時,數據的有效負載不能超過128B。而在PowerPC處理器係統中,該參數大多為256B

目前在大多數EP中,Max_Payload_Size Supported參數不大於512B,因為在大多數處理器係統的RC中,Max_Payload_Size Supported參數也不大於512B。因此即便EP支持較大的Max_Payload_Size Supported參數,並不會提高數據傳送效率。

Max_Payload_Size參數的大小與PCIe鏈路的傳送效率成正比,該參數越大,PCIe鏈路帶寬的利用率越高,該參數越小,PCIe鏈路帶寬的利用率越低。

PCIe總線規範規定,對於實時性要求較高的PCIe設備,Max_Payload_Size參數不應設置過大,因此這個參數有時會低於PCIe鏈路允許使用的最大值。

5.4.2 Max_Read_Request_Size參數

Max_Read_Request_Size參數由PCIe設備決定,該參數規定了PCIe設備一次能從目標設備讀取多少數據。

Max_Read_Request_Size參數在Device Control寄存器中定義。該參數與存儲器讀請求TLPLength字段相關,其中Length字段不能大於Max_Read_Request_Size參數。在存儲器讀請求TLP中,Length字段表示需要從目標設備讀取多少數據。

值得注意的是,Max_Read_Request_Size參數與Max_Payload_Size參數間沒有直接聯係,Max_Payload_Size參數僅與存儲器寫請求和存儲器讀完成報文相關。

PCIe總線規定存儲器讀請求,其讀取的數據長度不能超過Max_Read_Request_Size參數,即存儲器讀TLP中的Length字段不能大於這個參數。如果一次存儲器讀操作需要讀取的數據範圍大於Max_Read_Request_Size參數時,該PCIe設備需要向目標設備發送多個存儲器讀請求TLP

PCIe總線規定Max_Read_Request_Size參數的最大值為4KB,但是係統軟件需要根據硬件特性決定該參數的值。因為PCIe總線規定EP在進行存儲器讀請求時,需要具有足夠大的緩衝接收來自目標設備的數據。

如果一個EPMax_Read_Request_Size參數被設置為4KB,而且這個EP每發出一個4KB大小存儲器讀請求時,EP都需要準備一個4KB大小的緩衝。這對於絕大多數EP,這都是一個相當苛刻的條件。為此在實際設計中,一個EP會對Max_Read_Request_Size參數的大小進行限製。

5.4.3 RCB參數

RCB位在Link Control寄存器中定義。RCB位決定了RCB參數的值,在PCIe總線中,RCB參數的大小為64B或者128B,如果一個PCIe設備沒有設置RCB的大小,則RCRCB參數缺省值為64B,而其他PCIe設備的RCB參數的缺省值為128BPCIe總線規定RCRCB參數的值為64B或者128B,其他PCIe設備的RCB參數為128B

PCIe總線中,一個存儲器讀請求TLP可能收到目標設備發出的多個完成報文後,才能完成一次存儲器讀操作。因為在PCIe總線中,一個存儲器讀請求最多可以請求4KB大小的數據報文,而目標設備可能會使用多個存儲器讀完成TLP才能將數據傳遞完畢。

當一個EPRC或者其他EP讀取數據時,這個EP首先向RC或者其他EP發送存儲器讀請求TLP;之後由RC或者其他EP發送存儲器讀完成TLP,將數據傳遞給這個EP

如果存儲器讀完成報文所傳遞數據的地址範圍沒有跨越RCB參數的邊界,那麼數據發送端隻能使用一個存儲器完成報文將數據傳遞給請求方,否則可以使用多個存儲器讀完成TLP

假定一個EP向地址範圍為0xFFFF-0000~0xFFFF-0010這段區域進行DMA讀操作,RC收到這個存儲器讀請求TLP後,將組織存儲器讀完成TLP,由於這段區域並沒有跨越RCB邊界,因此RC隻能使用一個存儲器讀完成TLP完成數據傳遞。

如果存儲器讀完成報文所傳遞數據的地址範圍跨越了RCB邊界,那麼數據發送端(目標設備)可以使用一個或者多個完成報文進行數據傳遞。數據發送端使用多個存儲器讀完成報文完成數據傳遞時,需要遵循以下原則。

  • 第一個完成報文所傳送的數據,其起始地址與要求的起始地址相同。其結束地址或者為要求的結束地址(使用一個完成報文傳遞所有數據),或者為RCB參數的整數倍(使用多個完成報文傳遞數據)
  • 最後一個完成報文的起始地址或者為要求的起始地址(使用一個完成報文傳遞所有數據),或者為RCB參數的整數倍(使用多個完成報文傳遞數據)。其結束地址必須為要求的結束地址。
  • 中間的完成報文的起始地址和結束地址必須為RCB參數的整數倍。

RC或者EP需要使用多個存儲器讀完成報文將0xFFFE-FFF0~0xFFFF-00C7之間的數據發送給數據請求方時,可以將這些完成報文按照5?9方式組織。

 5?9 存儲器讀完成報文的拆分方法

方式1

方式2

方式3

0xFFFE-FFF0~0xFFFE-FFFF

0xFFFE-FFF0~0xFFFE-FFFF

0xFFFE-FFF0~0xFFFE-FFFF

0xFFFF-0000~0xFFFF-003F

0xFFFF-0000~0xFFFF-007F

0xFFFF-0000~0xFFFF-00C7

0xFFFF-0040~0xFFFF-007F

0xFFFF-0080~0xFFFF-00C7

 

0xFFFF-0080~0xFFFF-00BF

 

 

0xFFFF-00C0~0xFFFF-00C7

 

 

 

上表提供的方式僅供參考,目標設備還可以使用其他拆分方法發送存儲器讀完成TLPPCIe總線使用多個完成報文實現一次數據讀請求的主要原因是考慮Cache行長度和流量控製。在多數x86處理器係統中,存儲器讀完成報文的數據長度為一個Cache行,即一次傳送64B。除此之外,較短的數據完成報文占用流量控製的資源較少,而且可以有效避免數據擁塞。

5.5 小結

   本章重點介紹PCIe總線的事務層。在PCIe總線層次結構中,事務層最易理解,同時也與係統軟件直接相關。


這是流量控製Infinite FC Unit的要求,詳見第9.3.2節。

有些PCIe設備可能沒有Link Control寄存器。

最後更新:2017-04-03 16:48:40

  上一篇:go 解決VC6下調不出MSDN的問題!
  下一篇:go 5.3 存儲器、I/O和配置讀寫請求TLP