這篇文章來詳細地聊一聊Non-Posted Transaction(包括Ordinary Read、Locked Read和IO/Configuration Writes)與Posted Writes(包括Memory Writes和Message Writes)。
Non-Posted Transaction
o Ordinary Reads
下圖顯示的是一個Endpoint向System Memory發送讀請求(Read Request)的例子。
在這個例子中,Endpoint的讀請求通過了兩個Switch,然后到達其目標,即Root。Root對讀請求的包進行解碼后,并從中識別出操作的地址,然后鎖存數據,并將數據發送至Endpoint,即包含數據的Completion包,ClpD。需要注意的是,PCIe允許每個包的最大數據量(Max Data Payload)為4KB,但實際上經常需要發送大于4KB的數據。因此,常常一個讀請求會對應多個ClpD,即將大于4KB的數據分成多個包發送。如果遇到錯誤,則Root會通過Completion包告知相應的Endpoint。
注:Root向發送請求的Endpoint發送Completion包,是通過Request包中的BDF信息(Bus,Device和Function)進行查找對應的Endpoint的。關于BDF,會在后面的文章詳細地介紹。
o Locked Reads
Locked請求實際上是PCIe為了兼容早期的PCI總線而設置的一種方式,對于非PCI兼容的設計中,是不允許使用Locked操作的。并且也只有Root可以發起Locked請求操作,Endpoint是不可以發起Locked請求操作的。下圖顯示的是一個簡單的Locked Read請求操作:
Locked Read主要用于支持一種叫做Atomic Read-Modify-Write操作,這是一種高優先級且不可被打斷的操作。主要用于測試鏈路狀況等任務(針對PCI設備,PCIe設備禁止使用Locked操作)。此外,Locked操作采用的是目標存儲尋址(Target Memory Address)來尋找Legacy Endpoint(PCI設備),而不是采用前面介紹的BDF。
o IO/Configuration Writes
下圖是一個Non-Posted IO寫操作的例子。和Locked操作一樣,IO操作也是為了兼容早期的PCI設備,在PCIe設備中也是不建議使用。
Posted Writes
o Memory Writes
前面的文章有所提及,PCIe中的Memory寫操作都是Posted的,因此Requester并不需要來自Completer的Completion。一個簡單的Memory Writes例子如下圖所示:
因此沒有返回Completion,所以當發生錯誤時,Requester也不會知道。但是,此時Completer會將錯誤記錄到日志(Log),然后向Root發送包含錯誤信息的Message。
o Message Writes
和其他的幾種類型不太一樣,Message支持多種Routing方式。比如Requester可以將Message發送至一個指定的Completer,但是不管指定的Completer是不是Root,Root都會自動的收到來自任何一個Endpoint發送的Message。此外,當Requester是Root的時候,Requester還可以向所有的Endpoint進行廣播發送Message。
不得不說,Message機制的提出幫助PCIe總線省去了很多PCI總線中的邊帶信號。PCI中很多用于中斷、功耗管理、錯誤報告的邊帶信號,在PCIe中都通過了Message來進行實現了。
-
pci總線
+關注
關注
1文章
203瀏覽量
31820 -
總線
+關注
關注
10文章
2878瀏覽量
88052 -
PCIe
+關注
關注
15文章
1234瀏覽量
82584
原文標題:【博文連載】PCIe掃盲——PCIe總線事務層入門(二)
文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論