這篇文章來詳細地分析一下各種錯誤源的產生原理,由於內容較多,因此分為兩篇文章。第一篇介紹一下ecrc校檢錯誤和data poisoning等;第二篇文章介紹事務(transaction)錯誤、鏈路流量控制(link flow control)相關的錯誤、異常的tlp(malformed tlp)以及內部錯誤(internal errors)等。
前面的文章中提到過,ecrc是可選的,主要用於包含有switch的pcie匯流排系統中。且只有支援aer的pcie裝置才有能力支援ecrc功能。配置軟體通過檢查配置空間,確認pcie裝置的某個功能(function)支援ecrc後,可以通過向錯誤功能控制暫存器(error capability and control register)中的響應為寫0或者1來禁止或者使能ecrc功能。
如果使能了ecrc功能,可以通過tlp包頭中的td(tlp digest,ecrc也被稱為digest)為來標記當前的tlp是否使用ecrc,如下圖所示。需要特別注意的是,如果td為1(表示使用ecrc),但是tlp中卻沒有ecrc;或者td為0,tlp中卻包含了ecrc,則會被判定為tlp格式錯誤,即malformed tlp錯誤。
ecrc是基於tlp的包頭和資料(header and data payload)計算的,接收端會重新基於這些內容計算並與收到的tlp中的ecrc(傳送端計算的)作對比,如果不一致,則認為資料傳輸過程中發生了問題,資料被破壞了,進而產生ecrc校檢錯誤。需要注意的是,在tlp包頭中,有兩位實際上是不參與ercr計算的——type域的bit0和ep位。這兩位通常被稱為variant bits,且在ecrc計算的時候,這兩位的對應位置始終被認為是1,而非使用實際的數值。
當接收端(completer)接收到的請求(request)tlp中存在ecrc校檢錯誤時,接收端通常會選擇不對該請求傳送返回tlp(completion),並將ecrc錯誤狀態位(配置空間中的)置位。傳送端由於長時間未接收到completion,進而會產生completion超時錯誤(timeout error)。而大部分傳送端,會選擇重新傳送先前的請求request。
當傳送端(requester)在傳送完請求後收到了來自接收端返回的tlp(completion)時,卻發現該completion tlp中存在ecrc校檢錯誤,會將ecrc錯誤狀態位(配置空間中的)置位。傳送端可以選擇重新傳送先前的請求request,還可以選擇通過特殊功能中斷(function specific interrupt)向系統報告錯誤。
以上兩種情況中,如果使能了錯誤訊息報告功能的話,不可校正的非致命錯誤訊息(uncorrectable non-fatal error message)會被傳送至系統。
data poisoning也被稱為錯誤傳遞(error forwarding),指的是在已知tlp data payload被破壞(corrupted)的情況下,該tlp仍然被傳送至其他的pcie裝置。此時,該tlp包頭的ep位(error poisoned)被置位為1,表明該tlp已經被破壞。如下圖所示:
有人可能要有疑惑了,你既然都已經知道該tlp data payload被破壞了,為什麼還要再將其進一步傳遞呢?實際上,這樣做主要是針對某些特殊的應用的:
☆ 便於傳送端(request)和系統分析錯誤:假設傳送端(request)向接收端(completer)傳送了讀資料請求,接收端從某個記憶體裝置中讀取資料後通過completion返回資料給傳送端。但是在此過程中發生了錯誤,接收端(completer)因此不向傳送端(request)返回completion,則傳送端只會產生completion timeout錯誤,卻難以分析錯誤原因。如果接收端返回poisoned completion tlp給傳送端(tlp包頭中ep為1),則傳送端至少可以確認接收端正確地接收到了其發出的請求(request)。
☆便於發現switch(或其他橋裝置)中的錯誤:假設tlp中的data payload是在switch中被破壞的,採用錯誤傳遞的方式有助於發現該錯誤。
☆資料可能通過應用層恢復:有些應用可能採用了特殊的編碼 ,該編碼可以恢復某些被破壞的資料(如ecc可恢復1位的錯誤)。
需要特別注意的是,錯誤傳遞(data poisoning or error forwarding)只是針對tlp中的data payload是否被破壞,和tlp包頭的內容無關。也就是說錯誤傳遞只是針對那些帶有data payload的tlp的,如memory、configuration、i/o寫或者帶有返回資料的completion。pcie spec沒有定義對沒有data payload的tlp,其tlp包頭中的ep卻為1的情況,應當如何處理。
注:需要注意的是,poisoning操作只能在事務層進行。原因很簡單:資料鏈路層和物理層在任何情況下,都不會檢查tlp包頭的內容,更不會修改tlp包頭。
PCIe掃盲 TLP Header詳解(一)
事務層包 tlp 的一般格式如下圖所示 前面的文章介紹過,tlp header為3dw或者4dw,data payload為1 1024dw,最後的tlp digest ecrc 是可選的,為1dw。tlp header在整個tlp的位置如下圖所示,需要注意的是,tlp header的格式和內容都會...
PCIe掃盲 TLP Header詳解(三)
completions completions的tlp header的格式如下圖所示 這裡來解釋一下completion status codes 000b sc successful completion 表示請求 request 被正確的處理 001b ur unsupported reques...
PCIe掃盲 PCIe匯流排體系結構入門
和很多的序列傳輸協議一樣,乙個完整的pcie體系結構包括應用層 事務層 transaction layer 資料鏈路層 data link layer 和物理層 physical layer 其中,應用層並不是pcie spec所規定的內容,完全由使用者根據自己的需求進行設計,另外三層都是pcie ...