0.寫在前面
本文首發於公眾號【兩猿社】,后續將在公眾號內持續更新~
其實算下來接觸PCIe很久了,但是由於之前換工作,一直沒有系統的學習和練手項目,現在新項目買了Synopsys的PCIe IP,總算是有機會和時間來整理學習了~~~
目前PCI Express總線取代PCI總線成為PC局部總線的主流,且PCIe在很大程度上繼承了PCI的設計思想,可以說PCI是PCIe的基礎,本文所重點講解的Posted和Non-Posted傳輸也是基於PCI總線講解,但在PCIe總線中絕大部分是相同的,PCI中的HOST主橋可以看做RC,PCI橋可以看做Switch,PCI設備即EP。
1.簡介
PCI規定了兩種數據傳輸方式,分別是Posted傳輸和Non-posted傳輸,也叫做Posted事務和Non-Posted事務。在PCIe數據傳輸中同樣也使用這兩種方式,但在PCI總線中,Non-Posted傳輸可以使用Delayed方式完成,而在PCIe總線中所有的 Non-Posted傳輸都使用Split方式完成,不再使用Delayed方式。
1.Posted傳輸
Posted總線事務是指PCI主設備向目標設備進行數據傳輸時,數據到達PCI橋后,由PCI橋接管來自上游總線的總線事務,並將其轉發到下游總線,此時上游總線可釋放。
使用這種數據傳輸方式,數據請求在通過PCI總線后,就可以逐級釋放總線資源。
下面以DMA寫操作為例,說明PCI的Posted傳輸(DMA操作即PCI設備主動對系統存儲器進行操作)。
PCI設備11向主存儲器寫數據:
- 首先PC設備11將主存儲器寫請求發向PCI總線x1,注意這個寫請求使用的地址是PCI總線域的地址。
- PCI總線x1上的所有設備監聽這個請求,因為PCI設備11是向處理器的存儲器寫數據,所以PCI總線x1上的 PCI Agent都不會接收這個數據請求。
- PCI橋x1發現當前總線事務使用的PCI總線地址不是其下游設備使用的PCI總線地址,則接收這個請求,並結束來自PCI設備11的 Posted存儲器寫請求,將這個數據請求推到上游PCI總線上,即PCI總線x0。
- PCI總線x0上的所有設備包括HOST主橋將監聽這個請求,PCI總線x0上的PCI設備也不會接收這個請求,此時這個數據請求由HOST主橋x接收,並結束PCI橋x1的Posted存儲器寫請求。
- HOST主橋x發現這個數據請求發向存儲器,則將來自PCI總線x0的PCI總線地址轉換為存儲器域地址,通過存儲器控制器將數據寫入存儲器,完成PCI設備11的DMA寫操作(沒有完成報文)。
2.Non-Posted傳輸
Non-Posted總線事務是指PCI主設備向目標設備進行數據傳輸時,數據必須到達最終目的地后才能結束當前事務總線的傳輸方式。
PCI總線在沒有結束當前總線事務時必須等待傳輸完成,不會釋放總線資源。這種等待將嚴重阻塞當前的PCI總線的其他數據傳送。因此在PCI總線中使用Delayed方式完成Non-Posted,在PCIe總線中使用Split方式完成 Non-Posted總線事務。
PCI設備進行DMA讀與DMA寫過程類似,不過存儲器讀總線事務是使用Non-Posted總線事務。
PCI設備11向主存儲器讀數據:
- 首先PCI設備11將存儲器讀請求發向PCI總線x1。
- PCI總線x1上的所有設備監聽這個請求,因為PCI設備11是從存儲器中讀取數據,所以PCI總線x1上的設備不會接收這個請求。PCI橋x1發現下游PCI總線沒有設備接收,則接收這個數據請求,並將它推到上游PCI總線上,即PCI總線x0上。
- PCI總線x0上的設備監聽這個請求,也不會接受這個數據請求,最后這個數據請求被HOST主橋x接收。
- HOST主橋發現這個數據請求是發向主存儲器的,則將PCI總線x0的PCI總線地址轉為存儲器地址,之后通過控制器將數據讀出,帶着讀完成信息轉發到HOST主橋x。
- HOST主橋x將這個帶數據的讀完成事務經由PCI橋x1傳遞到PCI設備11,設備11接收到這個數據后結束DMA讀(有完成報文)。
在上述Non-Posted總線事務中,只有讀完成依次通過PCI總線x1和x0后,存儲器讀總線事務才不繼續占用PCI總線x1和x0的資源。可以發現這種傳輸並不合理,PCI總線為了解決這個總線擁塞問題,使用Delayed傳輸方式。
3.Split傳輸方式
在PCIe總線中,有以下幾種傳輸:存儲器讀寫、I/O讀寫和配置讀寫請求TLP,這些TLP由以下幾類報文組成。
-
存儲器讀請求TLP和讀完成TLP
-
存儲器寫請求TLP
-
原子操作請求和完成報文
-
I/O讀寫請求TLP和讀寫完成TLP
-
配置讀寫請求TLP和配置讀寫完成TLP
-
消息報文(Messages)
以上幾種類型中,除存儲器寫請求使用Posted總線事務外,其余的傳輸類型都使用Non-Posted總線事務,上面提到Non-Posted總線事務在PCI和PCIe中會轉換為Delayed事務和Split事務進行。
PCI總線的Delayed傳輸使用Retry的方式進行,這里不再講解,重點對PCIe總線中的Split總線事務進行講解。
Split總線事務替代了PCI總線的Delayed數據傳輸方式,提高了Non-Posted總線事務的傳輸效率。Split總線事務是在PCI-X中提出,而PCIe也繼承了這種傳輸方式。
下面以PCI-X中的Split傳輸為例。
PCI-X在進行存儲器讀總線事務時,總線事務的發起方(Requester)使用Split總線事務與總線事務的接收端(Completer)進行數據交換,步驟如下:
- Requester向 Completer發起存儲器讀請求總線事務;
- 這個請求事務在到達 Completer之前,可能會經過多級PCI橋。這些PCI橋使用 Split response周期結束當前總線事務,釋放上游PC總線,之后繼續轉發這個存儲器讀請求,直到 Completer認領這個存儲器讀請求事務。
- completer認領存儲器讀請求總線事務后,會記錄 Requester的D號,並使用 Split Response 周期結束存儲器讀請求總線事務。
- Completer准備好數據后,將重新申請總線,並使用存儲器讀完成總線事務主動將數據傳送給 Requester。在這個報文中包含 Requester的號(完成報文使用的是ID路由)。
- 這些完成報文根據ID路由方式,最終到達 Requester。 Requester從完成報文中接收數據並完成整個存儲器讀請求。
Split傳輸可以看成是將請求和完成分開,分別使用Posted方式進行的傳輸。
Posted與Non-Posted總線事務是PCIe的基礎,PCI Express相關知識總結會持續更新哦,有需要的關注公眾號的后續文章,咱們一起學習~~
關注公眾號【兩猿社】,回復【PCIE】獲取PCI-SIG原版PCI Express標准2.0~4.0。