這一篇文章講一講,進階錯誤報告(Advanced Error Reporting,AER)關于可校正和不可校正錯誤的相關寄存器,以及Root如何處理來自其他PCIe裝置的錯誤消息等内容。
Ø 進階可校正錯誤處理(Advanced Correctable Error Handling)
o 進階可校正錯誤狀态
進階可校正錯誤狀态寄存器如下圖所示,當相關錯誤發生後,硬體會自動地将對應bit置1。軟體可以通過向對應bit寫1,來清零。
o 進階可校正錯誤屏蔽
進階可校正錯誤屏蔽寄存器如下圖所示,預設情況下,這些bit的值都是0。也就是說,隻要發生相關錯誤,且該錯誤報告功能被使能,則相關錯誤便會被報告(不被屏蔽)。當然,軟體可以通過将相關bit置1,來屏蔽相關的錯誤報告資訊。
Ø 進階不可校正錯誤處理(Advanced Uncorrectable Error Handling)
o 進階不可校正錯誤狀态
進階不可校正錯誤狀态寄存器如下圖所示,當相關錯誤發生時,不管這些錯誤會不會被報告到Root,相關的bit都會被置1。
回顧一下,前一篇文章中的目前錯誤指針(First Error Pointer)。假設該指針的值為18d,則表明不可校正錯誤狀态寄存器中的第18位對應的錯誤——異常的TLP(Malformed TLP)将會被最先處理。一旦該錯誤被處理後,軟體将會向不可校正錯誤狀态寄存器的第18位寫1,來清除該bit。然後,目前錯誤指針将會被更新到下一個值。
軟體可以通過進階不可校正錯誤嚴重度寄存器(Advanced Uncorrectable Error Severity Register)來修改不可校正錯誤是否被作為緻命的(Fatal)錯誤處理,進而使得這些錯誤得到區分處理。如下圖所示,其中,0表示非緻命的(Non-Fatal),1表示緻命的(Fatal)。
o 進階不可校正錯誤屏蔽
進階不可校正錯誤評級寄存器如下圖所示,當相關bit被置1時,對應的錯誤類型将不會被報告。
配置空間中的進階錯誤報告結構中包含有一個4DW的子空間,用于緩存接收到的,發生不可校正錯誤的(未被屏蔽的)的TLP的標頭。PCIe Spec規定,當裝置支援AER功能時,必須有能力至少緩存一個TLP標頭(4DW)。當然,有些裝置可能支援緩存更多的TLP標頭。該子空間被稱為標頭緩存寄存器(Header Log Register),其支援的錯誤類型如下圖所示。
在PCIe總線拓撲結構中,Root是所有其他PCIe裝置錯誤報告的目标(Target)。當Root接收到來自其他PCIe裝置的錯誤消息(Error Message)後,Root會根據系統的參數設定選擇是否向系統報告錯誤,并以何種方式(中斷等)報告。
注:關于PCIe的中斷機制會在後續的文章中詳細介紹。
當Root接收到錯誤消息後,便會将Root錯誤狀态寄存器中的對應位置位。需要注意的時,由于Root自身也是PCIe裝置,當其自身發生錯誤時,也會導緻Root錯誤狀态寄存器中的對應位置位,就像是其收到了錯誤消息了一樣。該寄存器如下圖所示:
前面的文章介紹過,錯誤消息也是消息(Message)的一種。錯誤消息中包含了錯誤源裝置的ID資訊(BDF,Bus,Device and Function),根據ID資訊,便可以确定錯誤源的位置等資訊,同時将該資訊緩存在進階源ID寄存器中,如下圖所示。
可以通過Root錯誤指令寄存器(Root Error Command Register)的相關bit來使能或者禁止相關類型的錯誤是否被報告至系統。如下圖所示:
注:原文最早發表于本人的ChinaAET部落格(http://blog.chinaaet.com/justlxy/)