PCIe TLP包內容 全
一個完整的TLP由1個或者多個TLP Prefix, TLP頭, Data Payload 和 TLP Diseset組成。不同TLP頭定義不同,TLP Data Payload的長度可變0-1024DW。TLP頭由3個或者4個DW組成,第一個DW中儲存通用TLP頭,其他DW與通用TLP頭的Type欄位相關,通用頭如下:
Fmt和Type欄位:
Fmt和Type欄位確認了當前TLP使用的匯流排事務和是否含有有效負載,TLP頭的大小是由3個DW還是4DW組成,具體含義如下:
TLP型別 |
Fmt[2:0] |
Type[4:0] |
描述 |
MRd |
0b000/0b001 |
0b0_0000 |
儲存器讀請求,TLP頭大小為3或者4DW,不帶資料 |
MWr |
0b010/0b011 |
0b0_0000 |
儲存器寫請求,TLP頭大小為3或者4DW,帶資料 |
CplD |
0b001 |
0b0_1010 |
帶資料的完成報文,TLP頭大小為3個DW,包括儲存器讀,I/O讀,配置讀和原子操作讀完成 |
CfgRd0 |
0b000 |
0b0_0100 |
配置0讀請求,TLP頭大小問3DW,不帶資料 |
CfgRd1 |
0b000 |
0b0_0101 |
配置1讀請求,不帶資料 |
CfgWr0 |
0b010 |
0b0_0100 |
配置0寫請求,TLP頭大小為3DW,帶資料 |
CfgWr1 |
0b010 |
0b0_0101 |
配置1寫請求,帶資料 |
Msg |
0b001 |
0b1_0R2R1R0 |
訊息請求,TLP頭大小為4DW,不帶資料,RRR欄位是訊息請求報文的Route欄位 |
Cpl |
0b000 |
0b_1010 |
部帶資料的完成報文,TLP頭大小為3個DW,包括儲存器,配置讀和I/O寫完成 |
TC欄位:
表示當前TLp的傳送型別,PCIe匯流排規定了8種傳輸型別,分別為TC0-TC7,預設值為TC0,不同的TC可以使用PCIe鏈路中不同的VC,而不同的VC的仲裁級別並不相同。EP或者RC通過調整其發出TLP的TC欄位,可以調整TLP使用的VC,從而調整TLP的優先順序。
Attr[2]欄位:
Attr欄位由三位組成,其中第二位表示該TLP是否支援PCIe匯流排的ID-baser Ordering;第一位表示是否支援Relaxed Ordering;而第0位表示該TLP在經過RC到達儲存器時是否進行Cache共享一致性處理。
TLP支援的序
Attr[2] |
Attr[1] |
型別 |
0 |
0 |
預設序,即強制模型 |
0 |
1 |
PCI-X Relaxed Oedering模型 |
1 |
0 |
ID-BaserOrdering(IDO)模型 |
1 |
1 |
同時支援Relaxed Ordering和IDO模型 |
當使用標準的強序模型時,在資料整個傳送路徑中,PCIe裝置在處理相同型別的TLP時,如PCIe裝置傳送兩個儲存器寫TLP時,後面的儲存器寫TLP必須等待前一個儲存器寫TLP完成後才能被處理,即便當前報文在傳送過程中被阻塞,後一個報文也必須等待。
TH欄位,TD欄位,EP欄位:
TH位為1表示當前TLP中含有TPH資訊,TLP的傳送端可以使用THP資訊,通知接收端即將訪問資料的特性,以便接收端合理預讀和管理資料
TD位表示TLP中的TLP Digest是否有效,為1表示有效,為0表示無效。
EP位表示當前TLP中的資料是否有效,1表示無效,0表示有效。
AT欄位:
AT欄位與PCIe匯流排的地址轉換相關。在一些PCIe裝置中設定了(ATCAddress Translation Cache)部件,這個部件主要功能是進行地址轉換。只有在支援IOMMU技術的處理器系統中,PCIe裝置才能使用該欄位。
Length欄位:
Length欄位用來描述有效負載(Data Payload)的大小。儲存器讀請求TLP中沒有DataPayload欄位,此時該TLP使用Length欄位表示需要讀取多少資料,單位為DW,範圍0-1024DW。
儲存器讀寫請求TLP(MRd,MWr)
儲存器讀寫使用地址路由, TLP格式如下
Length範圍為0-0X3FF,當Length為0時,表示資料長度為1024個DW。
Last DW BE[3:0] First DW BE[3:0]欄位:
PCIe匯流排以位元組為基本單位進行資料傳遞,但是Length欄位以DW為最小單位。為此TLP使用Last DW BE和First DW BE 這兩個欄位進行位元組使能,使得在一個TLP中,有效資料以位元組為單位。
Last DW BE |
第3位 |
為1表示DataPayload的最後一個雙子的位元組3有效 |
第2位 |
為1表示DataPayload的最後一個雙子的位元組2有效 |
|
第1位 |
為1表示DataPayload的最後一個雙子的位元組1有效 |
|
第0位 |
為1表示DataPayload的最後一個雙子的位元組0有效 |
|
First DW BE |
第3位 |
為1表示DataPayload的第一個雙子的位元組3有效 |
第2位 |
為1表示DataPayload的第一個雙子的位元組2有效 |
|
第1位 |
為1表示DataPayload的第一個雙子的位元組1有效 |
|
第0位 |
為1表示DataPayload的第一個雙子的位元組0有效 |
使用規則:
·如果傳送的資料長度在一個對界的雙字之內,則Last DW BE欄位為0b0000,而First DW BE的對應位置1;如果資料長度超過1DW,Last DW BE欄位一定不能為0b0000。PCIe匯流排使用Last DW BE欄位為0b0000表示所傳送的資料在一個對界的DW之內。
·如果所傳送的資料長度超過1DW,則First DW BE 欄位至少有一個使能位。不能出現First DW BE為0b0000的情況。
·如果傳送的資料長度大於等於3DW,則在First DW BE和Last DW BE欄位中不能出現不連續的置1位。
·如果傳送的資料在1DW之內時,在First DW BE欄位中允許有不連續置1位、此時PCIe匯流排允許在TLP中傳送1個DW的第1,3位元組或者0,2,位元組。
·如果傳送資料長度在2DW之內時,則First DW BE欄位和Last DW BE欄位允許有不連續的置1位。
“Zero-Length”:當Length欄位的長度為1DW,而First DW BE和Last DW BE 欄位都為0b0000,即所有位元組都不使能,此時TLP中不包含有效資料。
該操作為讀重新整理操作,能夠確保之前使用Posted方式所傳送的資料,到達最終的目的地,與“Zero-Length”讀對應的讀完成報文中不含有負載,從而提高PCIe鏈路利用率。
Requester ID欄位:
Requester ID 包含“生成這個TLP報文”的PCIe裝置Bus Number、Device Number 和 Function Number。
Request ID Tag
7:0 |
4:0 |
2:0 |
7:0 |
Bus Number Device Number Function Number
一個源裝置在傳送Non-Posted資料請求之後,如果沒有收到目標裝置回覆的完成報文,TLP報文的傳送端需要儲存這個Non-Posted資料請求,此時該裝置使用的Transaction ID(Tag欄位)不能被再次使用,直到一次資料傳送結束,即資料傳送端收齊與該TLP對應的所有完成報文。
同意時間段斷內,PCIe發出的每一個Non-Posted資料請求TLP,其Tag必須是唯一的。
源裝置傳送Non-Posted資料請求之後,在沒有獲得全部完成報文之前,不能釋放這個Transaction ID佔用的資源。在同一個PCie裝置傳送的TLP中,其Requester ID欄位是相同的,因此PCIe裝置的設計者所能管理的資源是Tag欄位。
Tga的長度決定了能暫存多少個同類型的TLP。
完成報文TLP(CplD,Cpl)
完成報文TLP使用ID路由方式,格式如下
Completer ID |
Status |
BCM |
ByteCount |
||
Requester ID |
Tag |
R |
Lower Address |
Byte4
Byte8
完成報文一次最多能夠傳送的報文大小不能超過Max_Payload_Size引數。
Requester ID 和 Tag欄位
完成報文使用Transaction ID進行ID路由,並將資料傳送給源裝置。
Completer ID欄位
該欄位存放“傳送完成報文”的PCIe裝置的ID號。PCIe裝置進行資料請求時需要在TLP欄位中包含Requester ID欄位;而使用完成報文結束資料請求時,需要提供Completer ID欄位。
Statue欄位
該欄位儲存當前完成報文的完成狀態,表示是否正常結束。
Status[2:0] |
描述 |
0b000 |
SC(successful Completion),正常結束 |
0b001 |
UR(Unsupported Request),不支援的資料請求 |
0b010 |
CRS(Configuration Request Retry Status),要求資料請求方進行重試,比如目標裝置未準備好。 |
0b100 |
CA(Completion Abort),資料夭折,表示目標裝置無法完成本次資料請求。 |
其他 |
保留 |
BCM位與Byte Count欄位
BCM位由PCI-X裝置設定,只對PCI-X裝置有效。
Byte Count欄位記錄源裝置還需要從目標中獲得多少位元組的資料就能完成全部資料傳遞,當前TLP中的有效負載也被ByteCount欄位統計在內。該欄位由12位組成,單位為位元組,為0時表示還剩4096位元組,為0xFFF表示還剩4095位元組。
Low Address欄位
如果當前完成報文為儲存器讀完成TLP,該欄位存放在儲存器讀完成TLP中第一個資料所對應的最低位,值得注意的是,在完成報文中,並不存在First DW BE和Last DW BE欄位,因此接收端必須使用儲存器讀完成TLP的Low Address欄位,識別一個TLP中包含資料的起始地址。
一個MRd TLP傳送給裝置後,CplD TLP報文可能會有多個,但是這些報文將以地支順序先後到達。因此,收到CplD欄位後首先分析Tag欄位,確定當前CplD TLP與那個MRd TLP請求對應。CplD TLP中的Length欄位存放當前CplD TLP所包含的資料長度,但是可能會超過這個CplD TLP包含的有效資料長度,因為當前MRd的讀地址可能不是1DW對齊的,但是Length的值卻是按照1DW對齊。
但是CplD TLP中並不含有First DW BE欄位,此時需要用Lower Address欄位識別Data0中的有效位元組。對於第一個CplD TLP Lower Address[1:0] = 0bA1A0,對於其他剩餘的CplD TLP,Lower Address[1:0] = 0b00,Data0[A1A0]即為Data0中的有效資料。
配置讀寫請求TLP(CfgRd0,CfgRd1,CfgWr0,CfgWr1)
配置讀寫請求TLP由RC發起,用來訪問PCIe裝置的配置空間。配置請求報文使用ID的路由方式。PCIe匯流排也支援兩種配置請求報文,分別為Type 00h和Type 01h配置請求。配置請求TLP的格式如下:
Byte4 |
Request ID |
Tag |
Last DWBE 0 0 0 0 |
First DW BE |
||||
Byte8 |
Bus Number |
Device Number |
Function Number |
Reserved |
Ext Reg Number |
Register Number |
R |
配置請求TLP中的4-7位元組與儲存器請求TLP類似,第8-11位元組中的Bus,Device和Function Number中存放該TLP訪問的目標裝置的相應號碼,Ext Register 和 RegisterNumber存放暫存器號。配置請求報文的其他欄位必須為以下值。
·TC[2:0]必須為0,。
·TH位為保留位,Attr2位為保留,Attr[1:0]必須為“00b”,這表示I/O請求報文使用PCI匯流排的強序資料傳送模式;AT[1:0]必須為“0b00”,表示不進行地址轉換。
·Length[9:0]為“0b00_0000_0001”,表示配置讀寫請求最大Payload為1DW。
·Last DW BE欄位為“0b0000”。而First DW BE欄位根據配置讀寫請求的大小設定。
訊息請求TLP(Msg)
在PCIe匯流排中多數訊息報文使用隱式路由方式,其格式如下
Byte4 |
Requester ID |
Tag |
Message Code |
Byte8 |
除Vendor_defined Message之外,其Message不能使用Byte8-15 |
||
Byte12 |
PCIe匯流排對定了以下幾類訊息報文。
·INTx中斷訊息報文(INTx Interrupt Signaling)。
·電源管理訊息報文(Power Management)。
·錯誤訊息報文(Error Signaling)。
·鎖定事務訊息報文(Locked Transaction Support)。
·插槽電源限制訊息報文(Slot Power Limit Support)。
·Vendor-Defined Messages。
INTx中斷訊息報文
PCIe匯流排,使用INTx中斷訊息報文模擬PCI原有的INTx訊號,向RC提出中斷請求。在PCIe匯流排中,總共有8種INTx中斷訊息報文。
名稱 |
Code[7:0] |
Routing r [2:0] |
Requester ID |
描述 |
Assert_INTA |
0010_0000 |
100 |
包括匯流排號和裝置號,功能號保留 |
置INTA#訊號有效 |
Assert_INTB |
0010_0001 |
100 |
同上 |
置INTB#訊號有效 |
Assert_INTC |
0010_0010 |
100 |
同上 |
置INTC#訊號有效 |
Assert_INTD |
0010_0011 |
100 |
同上 |
置INTD#訊號有效 |
Deassert_INTA |
0010_0100 |
100 |
同上 |
置INTA#訊號無效 |
Deassert_INTB |
0010_0101 |
100 |
同上 |
置INTB#訊號無效 |
Deassert_INTC |
0010_0110 |
100 |
同上 |
置INTC#訊號無效 |
Deassert_INTD |
0010_0111 |
100 |
同上 |
置INTD#訊號無效 |
當裝置不使用MSI報文向RC提交中斷請求時,可以首先使用Assert_INTx報文向處理器系統提交中斷請求,當中斷處理完畢,再使用Deassert_INTx報文。這下INTx中短訊息報文的r [2:0]欄位為0b100,即為Local訊息報文。裝置接收到該訊息報文後,將結束收到的INTx中斷訊息報文,然後產生一個新的INTx中斷訊息報文。
TLP的路由
PCIe定義了三種路由方法,分別是基於地址的路由,基於ID的路由和隱式路由。
儲存器和I/O讀寫請求TLP使用基於地址的路由方式,這種方式使用TLP總的Address欄位進行路由選徑,最終到底目的地。
配置讀寫報文,“Vendor_Defined Messages”報文,Cpl和CplD報文使用基於ID的路由方式。
Message報文中除了“Vendor_Defined Messages”報文,其他全部使用隱式路由方式。