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。