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)的结构:
-
不同寄存器之间的区别:
-
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)相关的寄存器状态信息
AER_CE_STS = 0x00002000
表示设备检测到了一个“建议性非致命错误”(Advisory Non-Fatal Error)。
AER_CER_MASK = 0x0000E000
表示系统(或固件)配置为屏蔽包括“建议性非致命错误”在内的三种错误类型。
因此,尽管错误发生了,它被屏蔽了,不会触发中断,也不会被上报到系统软件。这个错误只记录在设备自身的状态寄存器中。软件需要主动去轮询读取AER_CE_STS
寄存器才能发现这个错误,并且需要向Bit 13
写1
来清除状态位。
2.3.2 示例2.网卡reboot报hardware error
[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)来通知系统进行相应的处理。