PCIe【7】PCIe错误处理

1. 错误类型

  • 可纠正错误(Correctable Errors):可以由硬件自行纠正,过程不丢失硬件信息,无需软件介入。

  • 不可纠正错误(Uncorrectable Errors):影响接口功能的错误。

    • 致命错误(Fatal Errors):使得特定的链路和相关硬件变得不可靠。

    • 非致命错误(Non-Fatal Errors):某个特定的事务变得不可靠,但链路本身是完全可用的。

2. 错误信号

以下三种方式可以检测并通知系统发生了错误:

  • 完成状态Completion Status

    • 请求处理完成后,系统返回一个完成头部(Completion header),读取其中的Completion Status字段。

    完成状态

  • 内部错误消息Error Messages

    • 根据错误的严重性被发送到 Root Complex端口以报告错误的检测情况,包含AER的相关信息。

      • 从PCI Express或传统端点发出的错误消息将发送到相应的Root Ports。

      • 从Root Port本身发出的错误将通过同一Root Port进行报告。

  • 错误转发Error Forwarding (Data Poisoning)

    • 错误转发,也称为数据中毒,通过在TLP中设置EP位来指示。

3. AER

AER的相关信息位于PCIe协议4.0的7.8.4 Advanced Error Reporting Capability,有详细描述。

2.1 AER结构

AER(Advanced Error Reporting Capability)的结构:

AER结构

  • 不同寄存器之间的区别:

    • Uncorrectable Error Status Register 是用来查看当前发生了哪些不可纠正的错误。

    • Uncorrectable Error Mask Register 提供了一种机制来决定哪些错误应当被忽视,从而避免不必要的警告或中断。

    • Uncorrectable Error Severity Register 则是设定当发生不可纠正错误时应采取的行动等级,从简单的记录到紧急停机都有可能。

2.2 硬件寄存器属性

注意硬件寄存器的不同属性:

Attributes 含义
RW1CS 可读取写入,写入1会复位
RWS 可读取写入,支持直接设置寄存器的内容
ROS 只读但可通过硬件自动设置,软件无法设置
RO 只读

2.3. AER示例

2.3.1 示例1

ARM IIO REGISTER DUMP:ARM架构中中断接口(IIO)相关的寄存器状态信息

ARM IIO REGISTER DUMP

AER_CE_STS = 0x00002000表示设备检测到了一个“建议性非致命错误”(Advisory Non-Fatal Error)。

AER_CER_MASK = 0x0000E000表示系统(或固件)配置为屏蔽包括“建议性非致命错误”在内的三种错误类型。

因此,尽管错误发生了,它被屏蔽了,不会触发中断,也不会被上报到系统软件。这个错误只记录在设备自身的状态寄存器中。软件需要主动去轮询读取AER_CE_STS寄存器才能发现这个错误,并且需要向Bit 131来清除状态位。

2.3.2 示例2.网卡reboot报hardware error

image

[Hardware Error Log Number]: 8    Time: 2025-07-30 18:05:57 UTC
Collect: IMU(INT)    				【集成在SoC内部的中断管理单元模块】
Serial Number: 0    				【采集序列号】
Collect Integrity: Validate(0X00)	【采集数据完整性,0X00未验证通过,无错误】
CPU: 0 (Socket: CPU1)    			【错误与CPU0相关,该CPU位于CPU1插槽】
Module: IIO    						【错误发生在IIO模块,IIO(Integrated I/O,集成I/O模块),在ARM服务器SoC中,IIO管理所有外部设备的连接】
Sub Module: NIC    					【IIO下的子模块NIC(网络接口控制器)】
Root Port: (0X7C:0X00:0X00)[NIC 1 (SF221Q)]    
DEV: (0X7D:0X00:0X00)(VID_0X19E5,DID_0XA224)
----------------------- ARM AER REPORTING ERROR -----------------------
Error Type: Non Fatal Error 
BER_STATUS0: Bit(15:8)nic_ras_intr_nfe(PPU)    	
	【BER:Bus Error Register(总线错误寄存器)
	Bit(15:8):Bit15到Bit8置位
	此错误通常由DMA描述符异常、内存访问错误或队列溢出引起】
----------------------- ARM IIO INTEGRATED DEVICE REGISTER DUMP -----------------------
【ARM IIO INTEGRATED DEVICE REGISTER DUMP:IIO 模块中该集成设备的寄存器转储(Register Dump)】

PCIHDR_VID: 0X19E5
PCIHDR_DID: 0XA224
PCIE_TYPE: 0X00             【Type0配置头,表示为EP设备】
BER_STATUS0: 0X00000800		【Bit11置位,对应nic_ras_intr_nfe(PPU)】
BER_STATUS1: 0X00000000
BER_STATUS2: 0X00000000
BER_STATUS3: 0X00000000
BER_STATUS4: 0X00000000
BER_STATUS5: 0X00000000
BER_STATUS6: 0X00000000
BER_STATUS7: 0X00000000		【STATUS1-STATUS7全0,其它错误未触发】


ras:Reliability, Availability, and Serviceability(可靠性、可用性与可维护性)
intr:Interrupt
nfe:Non-Fatal Error
PPU:Packet Processing Unit(包处理单元)

因此,nic_ras_intr_nfe(PPU)指:
	NIC(Network Interface Controller,网卡)内部的PPU模块检测到了一个非致命错误 (nfe),并通过RAS机制报告了这个错误,同时触发了一个中断(intr)来通知系统进行相应的处理。
posted @ 2025-07-31 17:35  midorii  阅读(82)  评论(0)    收藏  举报