PCIe高级错误报告
PCIe高级错误报告(AER)
PCIe(Peripheral Component Interconnect Express)高级错误报告(AER)是一种机制,用于监控和报告在PCIe设备和链路上发生的错误。AER旨在提供更详细的错误信息,从而帮助工程师快速识别和解决问题。
AER 的主要功能
- 错误检测:实时监测PCIe设备中的错误情况。
- 错误报告:通过状态寄存器报告不同类型的错误。
- 错误处理:支持自动或手动错误恢复机制。
AER 寄存器
AER通过几个关键寄存器来实现其功能:
UESta(不可校正错误状态寄存器):
指示发生的不可校正错误类型,包括多个错误类型的位域。
功能:用于指示不可校正错误的状态。
寄存器字段:
- Bit 0:不可校正错误检测。设置为1表示检测到不可校正错误。
- Bit 1:事务层超时。表示事务层操作超时。
- Bit 2:接收器溢出。指示接收器缓冲区溢出。
- Bit 3:格式错误的TLP。表示收到格式错误的事务层包(TLP)。
- Bit 4:ECRC错误。指示外部循环冗余校验失败。
- Bit 5:不支持的请求。表示收到不支持的请求类型。
- Bit 6:AER不可校正错误。通过AER报告的不可校正错误。
示例:
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-表示当前没有检测到不可校正错误。
UEMsk(不可校正错误掩码寄存器):
控制哪些不可校正错误被掩码(忽略)。
功能:控制哪些不可校正错误可以被报告。
寄存器字段:
- Bit 0:不可校正错误掩码。设置为1表示掩码此类错误。
- Bit 1:事务层超时掩码。
- Bit 2:接收器溢出掩码。
- Bit 3:格式错误的TLP掩码。
- Bit 4:ECRC错误掩码。
- Bit 5:不支持的请求错误掩码。
示例:
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-表示没有错误被掩码,所有不可校正错误均可报告。
UESvrt(不可校正错误服务寄存器):
- 指示哪些不可校正错误已被处理。
- 示例:
UESvrt: DLP+ SDES+ TLP- FCP+表示DLP和FCP错误已被处理。
CESta(可校正错误状态寄存器):
指示发生的可校正错误类型。
功能:用于报告可校正错误的状态。
寄存器字段:
- Bit 0:可校正错误检测。设置为1表示检测到可校正错误。
- Bit 1:数据链路层可校正错误。
- Bit 2:重播超时错误。
- Bit 3:接收错误。
- Bit 4:格式错误的TLP。
- Bit 5:ECRC错误。
- Bit 6:不支持的请求错误。
示例:
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-表示当前没有可校正错误被检测到。
CEMsk(可校正错误掩码寄存器):
控制哪些可校正错误被掩码。
功能:控制哪些可校正错误可以被报告。
寄存器字段:
- Bit 0:可校正错误掩码。设置为1表示掩码此类错误。
- Bit 1:数据链路层错误掩码。
- Bit 2:重播超时错误掩码。
- Bit 3:接收错误掩码。
- Bit 4:格式错误的TLP掩码。
- Bit 5:ECRC错误掩码。
示例:
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+表示所有可校正错误均可报告,但AdvNonFatalErr将被掩码。
AERCap(AER能力寄存器):
- 提供设备支持的AER功能的详细信息,如ECRC生成和检查能力。
- 示例:
AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn-表示设备支持ECRC生成但未启用。
HeaderLog(头部日志):
- 用于记录错误的日志,帮助故障排查。
- 示例:
HeaderLog: 00000000 00000000 00000000 00000000表示当前没有错误日志。
RootCmd(根命令寄存器):
- 控制根复杂设备的错误报告功能。
- 示例:
RootCmd: CERptEn+ NFERptEn+ FERptEn+表示所有错误报告功能已启用。
RootSta(根状态寄存器):
- 显示接收到的错误消息的状态。
- 示例:
RootSta: CERcvd- MultCERcvd- UERcvd-表示没有接收到错误消息。
ErrorSrc(错误源寄存器):
- 指示当前的错误来源,包括可校正和不可校正错误。
- 示例:
ErrorSrc: ERR_COR: 0000 ERR_FATAL/NONFATAL: 0000表示没有检测到可校正或不可校正错误来源。
常见错误类型
在AER报告中,错误类型通常以缩写形式列出,具体包括:
DLP (Data Link Protocol Error)
- 指数据链路层协议错误,这类错误通常是由于数据包在传输过程中未能成功到达目标。
SDES (Surprise Down Error Status)
- 表示突发断开错误状态,通常是由于设备突然失去连接或出现故障引起的。
TLP (Transaction Layer Protocol Error)
- 指事务层协议错误,通常涉及到数据包的事务处理过程中的错误。
FCP (Flow Control Protocol Error)
- 指流控制协议错误,这种错误可能发生在流控制机制出现问题时,例如未能正确地发送或接收流控制信号。
CmpltTO (Completion Timeout)
- 表示完成超时,通常是指在规定时间内未能收到请求的操作的完成响应。
CmpltAbrt (Completion Aborted)
- 指完成操作被中止,可能由于设备错误或其他原因导致请求未能成功完成。
UnxCmplt (Unexpected Completion)
- 表示意外的完成,通常是指收到的完成包与发出的请求不匹配。
RxOF (Receive Overflow)
- 表示接收溢出,通常发生在接收缓冲区已满但仍尝试接收更多数据时。
MalfTLP (Malformed TLP)
- 指格式错误的事务层包(TLP),这通常意味着包的结构不符合协议规范。
ECRC (ECRC Error)
- 指ECRC(End-to-End CRC)错误,这是数据完整性检查的一部分,当发现数据传输错误时会触发。
UnsupReq (Unsupported Request)
- 表示收到不支持的请求,可能是因为设备不支持该请求的类型或参数。
ACSViol (Access Control Service Violation)
- 指访问控制服务违规,通常涉及安全或权限问题,表示某个操作未能遵循预定义的访问控制规则。
错误处理流程
AER机制的有效性依赖于对寄存器的监控与响应,以下是一个典型的错误处理流程:
步骤 1:检测错误
使用lspci命令查看设备的错误状态:
1 | lspci -vvv -s <device_id> |
在输出中,查找CESta和CEMsk、UESta和UEMsk部分。
步骤 2:分析寄存器状态
- CESta:检查哪些可校正错误被检测到。
- CEMsk:检查哪些可校正错误被掩码。
- UESta:检查哪些不可校正错误被检测到。
- UEMsk:检查哪些不可校正错误被掩码。
步骤 3:判断和响应
对于可校正错误:
- 如果
CESta中的位为1且CEMsk中的对应位为0,表示该可校正错误被检测到并会被报告。可以考虑记录该错误并分析原因。 - 如果
CEMsk中的位为1,表示该错误被掩码,主机不会报告。可以根据需求决定是否解除掩码。
- 如果
对于不可校正错误:
- 如果
UESta中的位为1且UEMsk中的对应位为0,表示检测到不可校正错误并将被报告。这通常需要更紧急的响应,例如设备重置或硬件检查。 - 如果
UEMsk中的位为1,表示该错误被掩码,不会被报告。此时可以考虑是否需要调整掩码设置以捕获重要的错误信息。
- 如果
使用 lspci 检查 AER 状态
可以使用lspci命令来查看PCIe设备的AER状态:
1 | lspci -vvv -s <device_id> |
分析
AER 状态分析
1. AER 能力(Capabilities)
1 | Capabilities: [100 v2] Advanced Error Reporting |
- 这表示设备支持AER,并且是版本2。
2. 不可校正错误状态寄存器(UESta)
1 | UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- |
- 此寄存器用于指示是否检测到不可校正错误。
DLP-、SDES-等前面的-表示这些错误类型未被检测到。- 所有项均未设置,表示当前没有不可校正错误。
3. 不可校正错误掩码寄存器(UEMsk)
1 | UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- |
- 此寄存器控制哪些不可校正错误被掩码。
- 同样,所有项前的
-表示没有错误被掩码,所有不可校正错误均可报告。
4. 不可校正错误源寄存器(UESvrt)
1 | UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol- |
- 此寄存器表示哪些不可校正错误被服务。
DLP+、FCP+、RxOF+、MalfTLP+表示这些错误类型已被服务(即被处理)。- 其他项未被服务,表示没有检测到这些类型的错误。
5. 可校正错误状态寄存器(CESta)
1 | CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr- |
- 该寄存器显示检测到的可校正错误状态。
- 所有项均为
-,表示当前没有可校正错误被检测到。
6. 可校正错误掩码寄存器(CEMsk)
1 | CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+ |
- 此寄存器控制哪些可校正错误被掩码。
- 除了
AdvNonFatalErr+外,其他项均为-,表示所有其他类型的可校正错误将被报告。
7. AER 能力寄存器(AERCap)
1 | AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn- |
- First Error Pointer: 00 — 表示最近的错误指针位置。
- ECRCGenCap+: 支持生成ECRC。
- ECRCGenEn-: 生成ECRC功能未启用。
- ECRCChkCap+: 支持ECRC检查。
- ECRCChkEn-: ECRC检查功能未启用。
- MultHdrRecCap+: 支持多个头部接收。
- MultHdrRecEn-: 多个头部接收功能未启用。
- TLPPfxPres: 事务层前缀保留功能。
- HdrLogCap-: 头部日志能力未启用。
8. 头部日志(HeaderLog)
1 | HeaderLog: 00000000 00000000 00000000 00000000 |
- 头部日志显示为零,表示没有错误日志可用。
9. 根命令(RootCmd)
1 | RootCmd: CERptEn+ NFERptEn+ FERptEn+ |
- 指示根命令的错误报告功能均已启用(CERptEn、NFERptEn、FERptEn)。
10. 根状态(RootSta)
1 | RootSta: CERcvd- MultCERcvd- UERcvd- MultUERcvd- |
- 这些字段指示各种错误状态。当前无错误被接收(CERcvd-、UERcvd-)。
11. 错误源(ErrorSrc)
1 | ErrorSrc: ERR_COR: 0000 ERR_FATAL/NONFATAL: 0000 |
- 表示当前没有可校正错误和不可校正错误来源。
示例分析1
假设读取到的寄存器状态如下:
CESta:00000111(可校正错误位0、1和2被设置)CEMsk:00000001(可校正错误掩码位0被设置)UESta:00000001(不可校正错误位0被设置)UEMsk:00000000(不可校正错误掩码位0未设置)
分析:
可校正错误:
CESta中的Bit 0(可校正错误检测)为1,表示检测到可校正错误,但由于CEMsk中对应位为1,因此不会报告。CESta中的Bit 1和2为1,表示数据链路层可校正错误和重播超时错误被检测到,且CEMsk中的对应位均为0,这些错误将被报告。
不可校正错误:
UESta中的Bit 0(不可校正错误检测)为1且UEMsk中对应位为0,表示检测到不可校正错误并将被报告。这需要立即关注和处理。
示例分析2
假设运行lspci -vvv -s 00:1f.6,得到以下输出:
1 | Capabilities: [100 v2] Advanced Error Reporting |
- UESta:无不可校正错误。
- UEMsk:所有不可校正错误可报告。
- CESta:无可校正错误。
- CEMsk:大部分可校正错误可报告。
- AERCap:显示支持的AER功能,如ECRC。
总结
PCIe AER是一个强大的工具,用于检测和报告PCIe设备的错误。通过监控AER寄存器,能够及时发现和处理潜在的问题,确保系统的稳定性和性能。
