0.寫在前面
本文首發(fā)于公眾號【兩猿社】检诗,后續(xù)將在公眾號內(nèi)持續(xù)更新~
其實算下來接觸PCIe很久了拉宗,但是由于之前換工作,一直沒有系統(tǒng)的學(xué)習(xí)和練手項目,現(xiàn)在新項目買了Synopsys的PCIe IP踊兜,總算是有機(jī)會和時間來整理學(xué)習(xí)了~~~
目前PCI Express總線取代PCI總線成為PC局部總線的主流,且PCIe在很大程度上繼承了PCI的設(shè)計思想佳恬,可以說PCI是PCIe的基礎(chǔ)捏境,本文所重點講解的Posted和Non-Posted傳輸也是基于PCI總線講解,但在PCIe總線中絕大部分是相同的毁葱,PCI中的HOST主橋可以看做RC垫言,PCI橋可以看做Switch,PCI設(shè)備即EP倾剿。
1.簡介
PCI規(guī)定了兩種數(shù)據(jù)傳輸方式筷频,分別是Posted傳輸和Non-posted傳輸,也叫做Posted事務(wù)和Non-Posted事務(wù)前痘。在PCIe數(shù)據(jù)傳輸中同樣也使用這兩種方式凛捏,但在PCI總線中,Non-Posted傳輸可以使用Delayed方式完成芹缔,而在PCIe總線中所有的 Non-Posted傳輸都使用Split方式完成坯癣,不再使用Delayed方式。
1.Posted傳輸
Posted總線事務(wù)是指PCI主設(shè)備向目標(biāo)設(shè)備進(jìn)行數(shù)據(jù)傳輸時最欠,數(shù)據(jù)到達(dá)PCI橋后示罗,由PCI橋接管來自上游總線的總線事務(wù)惩猫,并將其轉(zhuǎn)發(fā)到下游總線,此時上游總線可釋放蚜点。
使用這種數(shù)據(jù)傳輸方式轧房,數(shù)據(jù)請求在通過PCI總線后,就可以逐級釋放總線資源禽额。
下面以DMA寫操作為例锯厢,說明PCI的Posted傳輸(DMA操作即PCI設(shè)備主動對系統(tǒng)存儲器進(jìn)行操作)。
PCI設(shè)備11向主存儲器寫數(shù)據(jù):
- 首先PC設(shè)備11將主存儲器寫請求發(fā)向PCI總線x1脯倒,注意這個寫請求使用的地址是PCI總線域的地址实辑。
- PCI總線x1上的所有設(shè)備監(jiān)聽這個請求,因為PCI設(shè)備11是向處理器的存儲器寫數(shù)據(jù)藻丢,所以PCI總線x1上的 PCI Agent都不會接收這個數(shù)據(jù)請求剪撬。
- PCI橋x1發(fā)現(xiàn)當(dāng)前總線事務(wù)使用的PCI總線地址不是其下游設(shè)備使用的PCI總線地址,則接收這個請求悠反,并結(jié)束來自PCI設(shè)備11的 Posted存儲器寫請求残黑,將這個數(shù)據(jù)請求推到上游PCI總線上,即PCI總線x0斋否。
- PCI總線x0上的所有設(shè)備包括HOST主橋?qū)⒈O(jiān)聽這個請求梨水,PCI總線x0上的PCI設(shè)備也不會接收這個請求,此時這個數(shù)據(jù)請求由HOST主橋x接收茵臭,并結(jié)束PCI橋x1的Posted存儲器寫請求疫诽。
- HOST主橋x發(fā)現(xiàn)這個數(shù)據(jù)請求發(fā)向存儲器,則將來自PCI總線x0的PCI總線地址轉(zhuǎn)換為存儲器域地址旦委,通過存儲器控制器將數(shù)據(jù)寫入存儲器奇徒,完成PCI設(shè)備11的DMA寫操作(沒有完成報文)。
2.Non-Posted傳輸
Non-Posted總線事務(wù)是指PCI主設(shè)備向目標(biāo)設(shè)備進(jìn)行數(shù)據(jù)傳輸時缨硝,數(shù)據(jù)必須到達(dá)最終目的地后才能結(jié)束當(dāng)前事務(wù)總線的傳輸方式摩钙。
PCI總線在沒有結(jié)束當(dāng)前總線事務(wù)時必須等待傳輸完成,不會釋放總線資源查辩。這種等待將嚴(yán)重阻塞當(dāng)前的PCI總線的其他數(shù)據(jù)傳送胖笛。因此在PCI總線中使用Delayed方式完成Non-Posted,在PCIe總線中使用Split方式完成 Non-Posted總線事務(wù)宜岛。
PCI設(shè)備進(jìn)行DMA讀與DMA寫過程類似长踊,不過存儲器讀總線事務(wù)是使用Non-Posted總線事務(wù)。
PCI設(shè)備11向主存儲器讀數(shù)據(jù):
- 首先PCI設(shè)備11將存儲器讀請求發(fā)向PCI總線x1谬返。
- PCI總線x1上的所有設(shè)備監(jiān)聽這個請求之斯,因為PCI設(shè)備11是從存儲器中讀取數(shù)據(jù),所以PCI總線x1上的設(shè)備不會接收這個請求。PCI橋x1發(fā)現(xiàn)下游PCI總線沒有設(shè)備接收佑刷,則接收這個數(shù)據(jù)請求莉擒,并將它推到上游PCI總線上,即PCI總線x0上瘫絮。
- PCI總線x0上的設(shè)備監(jiān)聽這個請求涨冀,也不會接受這個數(shù)據(jù)請求,最后這個數(shù)據(jù)請求被HOST主橋x接收麦萤。
- HOST主橋發(fā)現(xiàn)這個數(shù)據(jù)請求是發(fā)向主存儲器的鹿鳖,則將PCI總線x0的PCI總線地址轉(zhuǎn)為存儲器地址,之后通過控制器將數(shù)據(jù)讀出壮莹,帶著讀完成信息轉(zhuǎn)發(fā)到HOST主橋x翅帜。
- HOST主橋x將這個帶數(shù)據(jù)的讀完成事務(wù)經(jīng)由PCI橋x1傳遞到PCI設(shè)備11,設(shè)備11接收到這個數(shù)據(jù)后結(jié)束DMA讀(有完成報文)命满。
在上述Non-Posted總線事務(wù)中涝滴,只有讀完成依次通過PCI總線x1和x0后,存儲器讀總線事務(wù)才不繼續(xù)占用PCI總線x1和x0的資源胶台〖叽可以發(fā)現(xiàn)這種傳輸并不合理,PCI總線為了解決這個總線擁塞問題诈唬,使用Delayed傳輸方式韩脏。
3.Split傳輸方式
在PCIe總線中,有以下幾種傳輸:存儲器讀寫铸磅、I/O讀寫和配置讀寫請求TLP赡矢,這些TLP由以下幾類報文組成。
存儲器讀請求TLP和讀完成TLP
存儲器寫請求TLP
原子操作請求和完成報文
I/O讀寫請求TLP和讀寫完成TLP
配置讀寫請求TLP和配置讀寫完成TLP
消息報文(Messages)
以上幾種類型中愚屁,除存儲器寫請求使用Posted總線事務(wù)外济竹,其余的傳輸類型都使用Non-Posted總線事務(wù)痕檬,上面提到Non-Posted總線事務(wù)在PCI和PCIe中會轉(zhuǎn)換為Delayed事務(wù)和Split事務(wù)進(jìn)行霎槐。
PCI總線的Delayed傳輸使用Retry的方式進(jìn)行,這里不再講解梦谜,重點對PCIe總線中的Split總線事務(wù)進(jìn)行講解丘跌。
Split總線事務(wù)替代了PCI總線的Delayed數(shù)據(jù)傳輸方式,提高了Non-Posted總線事務(wù)的傳輸效率唁桩。Split總線事務(wù)是在PCI-X中提出闭树,而PCIe也繼承了這種傳輸方式。
下面以PCI-X中的Split傳輸為例荒澡。
PCI-X在進(jìn)行存儲器讀總線事務(wù)時报辱,總線事務(wù)的發(fā)起方(Requester)使用Split總線事務(wù)與總線事務(wù)的接收端(Completer)進(jìn)行數(shù)據(jù)交換,步驟如下:
- Requester向 Completer發(fā)起存儲器讀請求總線事務(wù)单山;
- 這個請求事務(wù)在到達(dá) Completer之前碍现,可能會經(jīng)過多級PCI橋幅疼。這些PCI橋使用 Split response周期結(jié)束當(dāng)前總線事務(wù),釋放上游PC總線昼接,之后繼續(xù)轉(zhuǎn)發(fā)這個存儲器讀請求爽篷,直到 Completer認(rèn)領(lǐng)這個存儲器讀請求事務(wù)。
- completer認(rèn)領(lǐng)存儲器讀請求總線事務(wù)后慢睡,會記錄 Requester的D號逐工,并使用 Split Response 周期結(jié)束存儲器讀請求總線事務(wù)。
- Completer準(zhǔn)備好數(shù)據(jù)后,將重新申請總線漂辐,并使用存儲器讀完成總線事務(wù)主動將數(shù)據(jù)傳送給 Requester泪喊。在這個報文中包含 Requester的號(完成報文使用的是ID路由)。
- 這些完成報文根據(jù)ID路由方式髓涯,最終到達(dá) Requester窘俺。 Requester從完成報文中接收數(shù)據(jù)并完成整個存儲器讀請求。
Split傳輸可以看成是將請求和完成分開复凳,分別使用Posted方式進(jìn)行的傳輸瘤泪。
Posted與Non-Posted總線事務(wù)是PCIe的基礎(chǔ),PCI Express相關(guān)知識總結(jié)會持續(xù)更新哦育八,有需要的關(guān)注公眾號的后續(xù)文章对途,咱們一起學(xué)習(xí)~~
關(guān)注公眾號【兩猿社】,回復(fù)【PCIE】獲取PCI-SIG原版PCI Express標(biāo)準(zhǔn)2.0~4.0髓棋。