PCIe高级错误报告(AER)

PCIe(Peripheral Component Interconnect Express)高级错误报告(AER)是一种机制,用于监控和报告在PCIe设备和链路上发生的错误。AER旨在提供更详细的错误信息,从而帮助工程师快速识别和解决问题。

AER 的主要功能

  1. 错误检测:实时监测PCIe设备中的错误情况。
  2. 错误报告:通过状态寄存器报告不同类型的错误。
  3. 错误处理:支持自动或手动错误恢复机制。

AER 寄存器

AER通过几个关键寄存器来实现其功能:

  1. UESta(不可校正错误状态寄存器)

    • 指示发生的不可校正错误类型,包括多个错误类型的位域。

    • 功能:用于指示不可校正错误的状态。

    • 寄存器字段

      • Bit 0不可校正错误检测。设置为1表示检测到不可校正错误。
      • Bit 1事务层超时。表示事务层操作超时。
      • Bit 2接收器溢出。指示接收器缓冲区溢出。
      • Bit 3格式错误的TLP。表示收到格式错误的事务层包(TLP)。
      • Bit 4ECRC错误。指示外部循环冗余校验失败。
      • Bit 5不支持的请求。表示收到不支持的请求类型。
      • Bit 6AER不可校正错误。通过AER报告的不可校正错误。
    • 示例:UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- 表示当前没有检测到不可校正错误。

  2. UEMsk(不可校正错误掩码寄存器)

    • 控制哪些不可校正错误被掩码(忽略)。

    • 功能:控制哪些不可校正错误可以被报告。

    • 寄存器字段

      • Bit 0不可校正错误掩码。设置为1表示掩码此类错误。
      • Bit 1事务层超时掩码
      • Bit 2接收器溢出掩码
      • Bit 3格式错误的TLP掩码
      • Bit 4ECRC错误掩码
      • Bit 5不支持的请求错误掩码
    • 示例:UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- 表示没有错误被掩码,所有不可校正错误均可报告。

  3. UESvrt(不可校正错误服务寄存器)

    • 指示哪些不可校正错误已被处理。
    • 示例:UESvrt: DLP+ SDES+ TLP- FCP+ 表示DLP和FCP错误已被处理。
  4. CESta(可校正错误状态寄存器)

    • 指示发生的可校正错误类型。

    • 功能:用于报告可校正错误的状态。

    • 寄存器字段

      • Bit 0可校正错误检测。设置为1表示检测到可校正错误。
      • Bit 1数据链路层可校正错误
      • Bit 2重播超时错误
      • Bit 3接收错误
      • Bit 4格式错误的TLP
      • Bit 5ECRC错误
      • Bit 6不支持的请求错误
    • 示例:CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr- 表示当前没有可校正错误被检测到。

  5. CEMsk(可校正错误掩码寄存器)

    • 控制哪些可校正错误被掩码。

    • 功能:控制哪些可校正错误可以被报告。

    • 寄存器字段

      • Bit 0可校正错误掩码。设置为1表示掩码此类错误。
      • Bit 1数据链路层错误掩码
      • Bit 2重播超时错误掩码
      • Bit 3接收错误掩码
      • Bit 4格式错误的TLP掩码
      • Bit 5ECRC错误掩码
    • 示例:CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+ 表示所有可校正错误均可报告,但AdvNonFatalErr将被掩码。

  6. AERCap(AER能力寄存器)

    • 提供设备支持的AER功能的详细信息,如ECRC生成和检查能力。
    • 示例:AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- 表示设备支持ECRC生成但未启用。
  7. HeaderLog(头部日志)

    • 用于记录错误的日志,帮助故障排查。
    • 示例:HeaderLog: 00000000 00000000 00000000 00000000 表示当前没有错误日志。
  8. RootCmd(根命令寄存器)

    • 控制根复杂设备的错误报告功能。
    • 示例:RootCmd: CERptEn+ NFERptEn+ FERptEn+ 表示所有错误报告功能已启用。
  9. RootSta(根状态寄存器)

    • 显示接收到的错误消息的状态。
    • 示例:RootSta: CERcvd- MultCERcvd- UERcvd- 表示没有接收到错误消息。
  10. ErrorSrc(错误源寄存器)

    • 指示当前的错误来源,包括可校正和不可校正错误。
    • 示例:ErrorSrc: ERR_COR: 0000 ERR_FATAL/NONFATAL: 0000 表示没有检测到可校正或不可校正错误来源。

常见错误类型

在AER报告中,错误类型通常以缩写形式列出,具体包括:

  1. DLP (Data Link Protocol Error)

    • 指数据链路层协议错误,这类错误通常是由于数据包在传输过程中未能成功到达目标。
  2. SDES (Surprise Down Error Status)

    • 表示突发断开错误状态,通常是由于设备突然失去连接或出现故障引起的。
  3. TLP (Transaction Layer Protocol Error)

    • 指事务层协议错误,通常涉及到数据包的事务处理过程中的错误。
  4. FCP (Flow Control Protocol Error)

    • 指流控制协议错误,这种错误可能发生在流控制机制出现问题时,例如未能正确地发送或接收流控制信号。
  5. CmpltTO (Completion Timeout)

    • 表示完成超时,通常是指在规定时间内未能收到请求的操作的完成响应。
  6. CmpltAbrt (Completion Aborted)

    • 指完成操作被中止,可能由于设备错误或其他原因导致请求未能成功完成。
  7. UnxCmplt (Unexpected Completion)

    • 表示意外的完成,通常是指收到的完成包与发出的请求不匹配。
  8. RxOF (Receive Overflow)

    • 表示接收溢出,通常发生在接收缓冲区已满但仍尝试接收更多数据时。
  9. MalfTLP (Malformed TLP)

    • 指格式错误的事务层包(TLP),这通常意味着包的结构不符合协议规范。
  10. ECRC (ECRC Error)

    • 指ECRC(End-to-End CRC)错误,这是数据完整性检查的一部分,当发现数据传输错误时会触发。
  11. UnsupReq (Unsupported Request)

    • 表示收到不支持的请求,可能是因为设备不支持该请求的类型或参数。
  12. ACSViol (Access Control Service Violation)

    • 指访问控制服务违规,通常涉及安全或权限问题,表示某个操作未能遵循预定义的访问控制规则。

错误处理流程

AER机制的有效性依赖于对寄存器的监控与响应,以下是一个典型的错误处理流程:

步骤 1:检测错误

使用lspci命令查看设备的错误状态:

1
lspci -vvv -s <device_id>

在输出中,查找CEStaCEMskUEStaUEMsk部分。

步骤 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
2
AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn-
MultHdrRecCap+ MultHdrRecEn- TLPPfxPres- HdrLogCap-
  • 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
2
RootSta: CERcvd- MultCERcvd- UERcvd- MultUERcvd-
FirstFatal- NonFatalMsg- FatalMsg- IntMsg 0
  • 这些字段指示各种错误状态。当前无错误被接收(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
2
3
4
5
6
7
8
9
10
11
12
Capabilities: [100 v2] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn-
MultHdrRecCap+ MultHdrRecEn- TLPPfxPres- HdrLogCap-
HeaderLog: 00000000 00000000 00000000 00000000
RootCmd: CERptEn+ NFERptEn+ FERptEn+
RootSta: CERcvd- MultCERcvd- UERcvd- MultUERcvd-
FirstFatal- NonFatalMsg- FatalMsg- IntMsg 0
ErrorSrc: ERR_COR: 0000 ERR_FATAL/NONFATAL: 0000
  • UESta:无不可校正错误。
  • UEMsk:所有不可校正错误可报告。
  • CESta:无可校正错误。
  • CEMsk:大部分可校正错误可报告。
  • AERCap:显示支持的AER功能,如ECRC。

总结

PCIe AER是一个强大的工具,用于检测和报告PCIe设备的错误。通过监控AER寄存器,能够及时发现和处理潜在的问题,确保系统的稳定性和性能。