高級FPGA開發(fā)之基礎(chǔ)協(xié)議之PCIe(二)
一、TLP報文類型
在PCIe總線中,存儲器讀寫乡括、I/O讀寫和配置讀寫請求TLP主要由以下幾類報文組成:
1.1 存儲器讀請求TLP和讀完成TLP
當PCIe主設(shè)備(RC或者EP)訪問目標設(shè)備的存儲器空間時,使用non-posted總線事務(wù)向目標設(shè)備發(fā)出存儲器讀請求TLP,目標設(shè)備收到這個存儲器讀請求tlp后握牧,使用存儲器讀完成tlp,主動向主設(shè)備傳遞數(shù)據(jù)娩梨。當主設(shè)備收到目標設(shè)備的存儲器讀完成tlp后我碟,將完成一次存儲器讀請求。
1.2 存儲器寫請求tlp
在PCIe總線中姚建,存儲器寫使用posted總線事務(wù)矫俺。PCIe主設(shè)備僅使用存儲器寫請求tlp即可完成存儲器寫操作,主設(shè)備不需要目標設(shè)備的回應(yīng)報文掸冤。
1.3 原子操作請求和完成報文
原子操作由PCIe V2.1總線規(guī)范引入厘托,一個完整的原子操作包括原子操作請求和原子操作完成報文組成。
原子操作的使用方法與其他non-posted總線事務(wù)類似稿湿。
首先PCIe主設(shè)備向目標發(fā)送原子操作請求铅匹,之后目標設(shè)備向主設(shè)備發(fā)送原子操作完成報文,結(jié)束一次原子操作饺藤。
1.4 IO讀寫請求TLP和讀寫完成TLP
在PCIe總線中包斑,IO讀寫操作使用non-posted流礁,IO讀寫TLP讀需要完成報文作為回應(yīng)。只是在IO寫請求的完成報文中不需要”帶數(shù)據(jù)“罗丰,而僅含有IO寫請求是否成功的狀態(tài)信息神帅。
1.5 配置讀寫TLP和配置讀寫完成TLP
從總線事務(wù)的角度來看,配置讀寫請求的操作工程和IO讀寫操作的過程類似萌抵。
配置讀寫請求 TLP 都需要配置讀寫完成作為應(yīng)答,從而完成一個完成的配置讀寫操作找御。
1.6 消息報文
和PCI總線相比,PCIe總線增加了消息請求事務(wù)绍填。PCIe總線使用基于報文的數(shù)據(jù)傳送模式霎桅,所有總線都是通過報文實現(xiàn)的,PCIe總線取消了一些在PCI總線中存在的邊帶信號讨永。
在PCIe總線中滔驶,一些由PCI總線的邊帶信號完成的工作,比如中斷請求和電源管理等卿闹,在PCIe總線中由消息請求報文實現(xiàn)瓜浸。
二、TLP報文詳解
2.1 存儲器讀寫請求TLP
存儲器讀寫請求TLP的格式如下圖:
在PCIe總線上比原,存儲器寫請求TLP使用posted數(shù)據(jù)傳送方式插佛。而其他與存儲器和IO相關(guān)的報文都使用split方式進行數(shù)據(jù)傳送,這些請求報文需要完成報文量窘,存儲器讀寫請求TLP使用地址路由方式進行數(shù)據(jù)傳遞雇寇。
length段:
在存儲器讀請求TLP中,length字段表示需要從目標設(shè)備數(shù)據(jù)區(qū)域讀取的數(shù)據(jù)長度蚌铜。
在存儲器寫TLP中锨侯,length字段表示當前報文的data payload長度。
length字段的最小單位是DW冬殃。當字段為n時囚痴,表示需要獲取的數(shù)據(jù)長度或者當前報文的數(shù)據(jù)長度為n個DW。注意n=0审葬,表示長度為1024的DW深滚。
DW BE字段:
PCIe總線以字節(jié)為基本單位進行數(shù)據(jù)傳輸?shù)模莑ength字段以DW為最小單位涣觉。為此痴荐,TLP使用last DW BE和First DW BE這兩個字段進行字節(jié)使能,使得在一個TLP中官册,有效數(shù)據(jù)以字節(jié)為單位生兆。
這兩個 DW BE 字段各由4位組成,其中 Last DW BE 字段的每一位對應(yīng)數(shù)據(jù) Payload 最后一個雙字的字節(jié)使能位;而 First DW BE 字段的每一位對應(yīng)數(shù)據(jù) Payload 第一個雙字的字節(jié)使能位。其對應(yīng)關(guān)系如下圖所示膝宁。
“Zero-Length”讀請求的引入是為了實現(xiàn)“讀刷新”操作,該操作的主要目的是為了確保之前使用 Posted 方式所傳送的數(shù)據(jù),到達最終的目的地,與“Zero-Length”讀對應(yīng)的讀完成報文中不含有負載,從而提高了 PCIe 鏈路的利用率鸦难。
requester ID:
requester ID字段包含生成這個TLP報文的PCIe設(shè)備的總線號(bus number)根吁、設(shè)備號(device number)、功能號(function number)合蔽。
對于non-posted數(shù)據(jù)請求击敌,目標設(shè)備需要使用完成報文作為回應(yīng)。在這個完成報文中辈末,需要使用源設(shè)備的requester ID字段愚争。
因此在non-posted數(shù)據(jù)請求TLP中映皆,如存儲器讀請求挤聘、IO和配置讀寫請求、必須使用requester ID字段捅彻。
IO讀寫請求TLP規(guī)則:
I/O 讀寫請求 TLP 只能使用32位地址模式和基于地址的路由方式且只能使用 Non-Posted 方式進行傳遞组去。
2.2 完成報文TLP
PCIe 總線支持 Split 傳送方式,目標設(shè)備使用完成報文向源設(shè)備主動發(fā)送數(shù)據(jù)。
完成報文使用 ID 路由方式,由 TLP Predix步淹、報文頭和 Data Payload 組成,但是在某些完成報文可以不含有 Data Payload,如 I/O 或者配置寫完成和 Zero-Length 讀完成報文从隆。
所有的數(shù)據(jù)讀請求,包括存儲器、I/O 讀請求缭裆、配置讀請求和原子操作請求键闺。當一個PCIe設(shè)備發(fā)出這些數(shù)據(jù)請求報文后,必須收到目標設(shè)備的完成報文后,才能結(jié)束一次數(shù)據(jù)傳送。這一類完成報文必須包含 Data Payload澈驼。完成報文格式如下圖:
requester ID和tag字段:
完成報文使用ID路由方式辛燥。完成報文頭的長度為3DW,完成報文頭中包含了transaction ID缝其,由requester ID和tag字段組成挎塌,這個ID必須和源設(shè)備發(fā)送的數(shù)據(jù)請求報文的tansaction ID對應(yīng),完成報文使用transaction ID進行ID路由内边,并將數(shù)據(jù)發(fā)送給源設(shè)備榴都。
當PCIe設(shè)備收到存儲器讀、IO讀寫或者配置讀寫請求TLP時漠其,需要首先保證保存這些報文的transaction ID嘴高,之后當該設(shè)備準備好完成報文后,將完成報文requester ID和tag ID字段賦值為之前保存的transaction ID字段和屎。
completer ID字段:
completer ID字段的含義與requester ID字段較為相似阳惹,只是該字段存放發(fā)送完成報文的PCIe設(shè)備的ID號。
PCIe設(shè)備進行數(shù)據(jù)請求時需要在TLP字段中包含requester ID字段眶俩,而完成報文結(jié)束數(shù)據(jù)請求時莹汤,需要提供completer ID字段。
status字段:
status字段保存當前完成報文的完成狀態(tài)颠印,表示當前TLP是正確地將數(shù)據(jù)傳遞給數(shù)據(jù)請求端纲岭,還是在數(shù)據(jù)傳輸過程中出現(xiàn)錯誤抹竹,或者要求數(shù)據(jù)請求方式進行重試。
BCM 位與 Byte Count 字段:
bcm(byte count modified)字段由pci-x設(shè)備設(shè)置的止潮。
pci-x設(shè)備也支持split transaction傳送方式窃判。當pci-x設(shè)備進行存儲讀請求時,且目標設(shè)備不一定一次將所有數(shù)據(jù)傳遞給源設(shè)備喇闸。此時目標設(shè)備在進行第一次數(shù)據(jù)傳送時袄琳,需要設(shè)置byte count字段和bcm位。
bcm位表示byte count字段是否被更改燃乍,該位僅對pci-x設(shè)備有效唆樊,而PCIe設(shè)備不能操作BCN位。
byte count字段記錄源設(shè)備還需要從目標設(shè)備中刻蟹,獲取多少字節(jié)的數(shù)據(jù)就能完成全部數(shù)據(jù)傳遞逗旁,當前的TLP中的有效負載也被byte count字段統(tǒng)計在內(nèi)。該字段由12位組成舆瘪。
該字段為0b0000-0000-0001表示還剩一個字節(jié),為0b1111-1111-1111表示還剩4095個字節(jié),而為0b0000-0000-0000表示還剩4096個字節(jié)片效。
除了存儲器讀請求的完成報文外,大多數(shù)完成報文的 Byte Count 字段為4。
lower address字段:
如果當前完成報文為存儲器讀完成TLP英古,該字段存放在存儲器讀完成TLP中第一個數(shù)據(jù)所對應(yīng)地址的最低位淀衣。
值得注意的是,在讀完成報文中召调,并不存在first DW BE和last DW BE字段膨桥。
因此接收端必須使用存儲器讀完成 TLP 的 Low Address 字段,識別一個 TLP 中包含數(shù)據(jù)的起始地址。
配置讀寫請求 TLP:
配置讀寫請求 TLP 由 RC 發(fā)起,用來訪問 PCIe 設(shè)備的配置空間某残。配置請求報文使用基于ID 的路由方式国撵。PCIe 總線也支持兩種配置請求報文,分別為 Type 00h 和 Type 01h 配置請求。配置請求 TLP 的格式如下圖玻墅。
消息請求報文:
在 PCIe 總線中,多數(shù)消息報文使用隱式路由方式,其格式如下圖:
)
PCIe 總線規(guī)定了以下幾類消息報文:
INTx 中斷消息報文(INTx Interrupt Signaling)介牙;
電源管理消息報文(Power Management);
錯誤消息報文(Error Signaling)澳厢;
鎖定事務(wù)消息報文(Locked Transaction Support)环础;
插槽電源限制消息報文(Slot Power Limit Support);
Vendor-Defined Messages剩拢;
三线得、TLP中與數(shù)據(jù)負載相關(guān)的參數(shù)
在 PCIe 總線中,有些 TLP 含有 Data Payload,如存儲器寫請求、存儲器讀完成 TLP 等徐伐。
在 PCIe 總線中,TLP 含有的 Data Payload 大小與 Max_Payload_Size贯钩、Max_Read_Request_Size和 RCB 參數(shù)相關(guān)。
Max_Payload_Size 參數(shù):
PCIe 總線規(guī)定在 TLP 報文中,數(shù)據(jù)有效負載的最大值為4KB,但是 PCIe 設(shè)備并不一定能夠發(fā)送這么大的數(shù)據(jù)報文。PCIe 設(shè)備含有“Max_Payload_Size”和“Max_Payload_SizeSupported”參數(shù),這兩個參數(shù)分別在Device Capability 寄存器和Device Control寄存器中定義角雷。
PCIe設(shè)備發(fā)送數(shù)據(jù)報文時,使用Max_Payload_Size 參數(shù)決定 TLP 的最大有效負載祸穷。當PCIe 設(shè)備的所傳送的數(shù)據(jù)大小超過 Max_Payload_Size 參數(shù)時,這段數(shù)據(jù)將被分割為多個 TLP進行發(fā)送。
Max_Payload_Size參數(shù)的大小與 PCIe 鏈路的傳送效率成正比,該參數(shù)越大,PCIe鏈路帶寬的利用率越高,該參數(shù)越小,PCIe 鏈路帶寬的利用率越低勺三。
Max_Read_Request_Size 參數(shù):
Max_Read_Request_Size 參數(shù)由 PCIe 設(shè)備決定,該參數(shù)規(guī)定了 PCIe 設(shè)備一次能從目標設(shè)備讀取多少數(shù)據(jù)雷滚。
PCIe 總線規(guī)定存儲器讀請求,其讀取的數(shù)據(jù)長度不能超過 Max_Read_Request_Size 參數(shù),即存儲器讀 TLP 中的 Length 字段不能大于這個參數(shù)。如果一次存儲器讀操作需要讀取的數(shù)據(jù)范圍大于 Max_Read_Request_Size 參數(shù)時,該 PCIe 設(shè)備需要向目標設(shè)備發(fā)送多個存儲器讀請求 TLP吗坚。
RCB 參數(shù):
RCB 位在 Link Control 寄存器中定義祈远。RCB 位決定了 RCB 參數(shù)的值,在 PCIe 總線中,RCB 參數(shù)的大小為64B 或者128B,如果一個 PCIe 設(shè)備沒有設(shè)置 RCB 的大小,則 RC 的 RCB參數(shù)缺省值為64B,而其他 PCIe 設(shè)備的 RCB 參數(shù)的缺省值為128B。PCIe 總線規(guī)定 RC 的 RCB參數(shù)的值為64B 或者128B,其他 PCIe 設(shè)備的 RCB 參數(shù)為128B商源。
Read Completion Boundary (RCB)车份,讀完成邊界,是 Completer 響應(yīng)讀請求的一種地址邊界對齊策略炊汹,應(yīng)用于 CplD躬充。
第一筆completion必須開始于request的起始地址逃顶,當request的length不大于RCB時不進行切分讨便,當request的length大于RCB時在RCB處結(jié)束。
最后一筆completion返回的地址必須滿足所有completion payload長度滿足request的length以政。
所有中間的completions payload大小必須滿足RCB霸褒。
1. Read request length 不大于RCB
例如RCB為128 Byte,read request length 小于128 Byte盈蛮。這時不會返回multi-completions废菱,所以不會對返回包進行切分,從request的起始地址讀夠length長度的數(shù)據(jù)返回抖誉。
Read request length 大于RCB殊轴,這種情況會返回multi-completions,且與起始地址有關(guān)系
例如:
1. 例如RCB為128 Byte袒炉,read request length 為200 Bytes旁理,起始地址為0X60。這時會有三筆completion返回我磁,
第一筆從0X60開始讀取32 Bytes數(shù)據(jù)孽文,第二筆數(shù)據(jù)從0X80開始讀取128 Bytes數(shù)據(jù),第三筆從0X100地址開始讀取40 Bytes數(shù)據(jù)夺艰。
2. 例如RCB為128 Byte芋哭,read request length 為200 Bytes,起始地址為0X10郁副。這時會有兩筆completion返回减牺,
第一筆從0X10開始讀取112 Bytes數(shù)據(jù),第二筆數(shù)據(jù)從0X80開始讀取88 Bytes數(shù)據(jù)。
四拔疚、未完待續(xù)
下章將繼續(xù)介紹核心的基本概念:內(nèi)核態(tài)的線程/進程技術(shù)斑鸦。
歡迎關(guān)注知乎:北京不北,+vbeijing_bubei
歡迎關(guān)注douyin:near.X (北京不北)
歡迎+V:beijing_bubei
獲得免費答疑草雕,長期技術(shù)交流巷屿。