错误处理
错误分类
PCIE 错误可以简单2类 :
- Uncorrectable error (不可纠正)
- Fatal error (致命)
- Non-Fatal error (非致命)
- Correctable error (可纠正)
这种分类的好处是可以将功能错误和性能错误分隔开,Correctable 属于性能相关的错,因为它是可以自动纠正的,不需要软件参与,不会影响功能,只会影响性能,Uncorrectable error 属于功能错误,硬件不能自动恢复,可能会影响功能。不可纠正的错按照严重等级又可以分为 Fatal 和 Non-Fatal。
这些又可以发生在数据链路层,物理层,传输层和内部。

Correctable Error
Correctable error 可以通过链路进入 Recovery 或者重传等方式来纠正,不会丢失任何信息,整个过程硬件自动完成,不需要借助软件操作。
Correctable Error 的具体类别如下,Correctable Error Status寄存器的不同比特用于表明改错误是否发生过:

| 比特位 | 寄存器描述 | 属性 | 默认值 |
|---|---|---|---|
| 0 | Reciver Error Status(接收机错误) | RW1CS | 0b |
| 6 | Bad TLP Status | RW1CS/ROZ(VF) | 0b |
| 7 | Bad DLLP Status | RW1CS/ROZ(VF) | 0b |
| 8 | REPLAY_NUM Rollover Status | RW1CS/ROZ(VF) | 0b |
| 12 | Replay Timer Timeout Status | RW1CS/ROZ(VF) | 0b |
| 13 | Advisory Non-Fatal Error Status | RW1CS/ | 0b |
| 14 | Corrected Internal Error Statsu(可选) | RW1CS | 0b |
| 15 | Header Log Overflow Status (可选),如果VF实现了Header Log共享,改比特需要固定为0 | RW1CS | 0b |
其中 Advisory Non-Fatal Error 又是比较特殊的,它是由某些 Non-Fatal Error 演变而来。
Receiver Error
Bad TLP
Flit 模式下没有 Bad TLP 这种错误*
下面这些情况会触发 bad tlp:
- 如果 TLP 是 nullified (无效),但 LCRC 与计算值的逻辑“非”运算结果并不相符。
- 接收到 TLP 中的 LCRC 和计算的不一致
- 如果 TLP Sequence Number 跟期望值不一样, TLP Sequence Number 不满足 (NEXT_RCV_SEQ – TLP Sequence Number) mod 4096 > 2048 且清掉了 NAK_SCHEDULED 标志
- 如果 TLP Sequence Number 跟期望值不一样, TLP Sequence Number 不满足 (NEXT_RCV_SEQ – TLP Sequence Number) mod 4096 > 2048 且设置了 NAK_SCHEDULED 标志,这里是允许但是不推荐设置为 Bad TLP
Bad DLLP
Flit 模式下没有 Bad DLLP 这种错误*
下面这些情况会触发 bad dllp:
- 接受到 DLLPs 中的 CRC 值跟计算出来的不匹配
Advisory Non-Fatal Error
在某些情况下,检查 Non-Fatal 的逻辑可能认为改错误不需要恢复,但是实际情况这种 Non-Fatal是需要恢复的,或者它甚至根本不需要任何恢复措施。
例如,如果软件尝试用 configuration read (配置读) 去访问不存在的设备或功能,Completer 返回的 Completion 中 Completion Status 会是 UR,这会向软件发出错误信号,既软件收到的内容是有误的。Completer 除了发送 ERR_NONFATAL Msg 来发出错误信号之外,Completer 不需要其他软件来发出错误信号。既不需要返回 UR 的 Completion。
事实上,在某些平台上,使用 ERR_NONFATAL 发出错误信号会导致系统错误,从而中断正常的软件探测。
Advisory Non-Fatal Error 主要取决于具体错误和检测代理的角色(Requester, Completer 或者 Receiver )。在某些情况下,启用 AER 的代理在发送 non-fatal error 信号时,实际向软件发送的是 ERR_COR Msg 而不是 ERR_NON FATAL Msg。如果代理不支持 AER,则软件在接收到 ERR_COR 时无法区分是 Advisory Non-Fatal Error(Advisory Non-Fatal Error 是 AER中的一个功能) 还是用于评估链路完整性的Correctable Error,所以没有 AER 功能的代理对于这些情况不会发送任何 error msg。
对于通常属于 Advisory Non-Fatal Error 的情况,如果软件希望某个具有 AER 特性的代理应被视为更为严重的情况,那么软件可以将 uncorrectable error 的严重等级提升至 fatal. 。在这种情况下,如果代理功能已启用,该代理将用 ERR_FATAL 标识该错误。
以下是 Advisory Non-Fatal 的具体情况。请注意,同一个或不同类别的错误(correct able,non-fatl, fatal )可能会出现在同一个 TLP 中,且可能存在多处此类错误。
比如 : 不预期的 Completion 可能也是 poisoned 的,针对这种情况,建议报告 Unexpeced Completion,并且不报告接收到 Poisoned TLP
Complter 发送 UR/CA Stauts 的 Completion
Completer 在收到 Non-Posted 请求后,如果需要记录是一个 uncorrectable error,通常是发送 cpl status 为 UR (Unsupported Request) 或者 CA(Completer Abort) 的 Completion,如果 UR/CA 的严重等级是 non-fatal,Complter 在这种情况下必须处理为 Advisory Non-Fatal Error。支持 AER 的 Complter 通过发送 ERR_COR Msg 来记录 non-fatal error (如果启用)。不支持 AER 的 Completer 在这种情况下不会发送 error msg。 如果 UR/CA 的严重等级是 fatal, 则当成fatal error 来处理
Intermediate Receiver (中间接收方)
当接收机接收到一个TLP,但是这个 TLP 的最终目录的不是指向自己,且该 TLP 是一个 non-fatal 的错误,中间的接收机必须把这个处理为 Advisory Non-Fatal Error。如果接收机支持 AER 并且使能了错误记录,那么会通过发送 ERR_COR msg 来记录这个错误。如果接受不支持 AER,在这种情况下将不会发送 error msg。
例如 : switch 在路由的 TLP 中检测到了 poison 或者错误的 ECRC,即使该错误在 TLP 路由规则中属于 uncorrectable (但不是 non-fatal ),中间的接收机必须把这处理为 Advisory Non-Fatal Error,这样一来,TLP 的最终接收方(即请求 TLP 的 Completer,或者 Completion TLP 需要发送给的 Requester )就能够根据自身的错误设置更恰当地处理错误了。例如,某个特定的 Completer 检测到 Memory Write 是 posion 的,可能会将该错误屏蔽(从而不会发出信号),而同一层级中的另一个 Completer 则可能会以 ERR_NONFATAL 标识该错误。
Poisoned TLP Egress Blocked error 永远不会被当作中间接收方的情况进行处理,因为该错误并非在处理接收到的 TLP 过程中被检测到的。
当一个 TLP 在两个 Root Ports 之间点对点传输时,如果 RC 检测到了一个 non-fatal error,但是 RC 在继续传播事务时并不支持传播这些错误相关的信息(比如 TLP Digest, EP 位或者 equivalent),且使能了错误记录,则 RC 必须发送 ERR_NONFATAL 来记录这个错误并且不能在继续转发该事务。
比如 : 一个(RC)需要在 Root Ports 之间点对点的转发 poisoned TLP,但 RC 的内部架构并不支持 poison 指示功能。
Ultimate PCI Express Receiver of a Poisoned TLP or IDE TLP with PCRC Check Failed
最终的 PCIe 接收方收到的 Poisoned TLP 或者 IDE TLP 中 PCRC 检查不过
当最终的 PCIe 接收方收到一个 poisoned TLP,如果严重等级是 non-fatal 并且接收机选择不把这种情况处理为 uncorrectable error,接收既必须把这种情况处理为 Advisory Non-Fatal Error。
当在最终目的地端口确定一个 IDE TLP 会出现 PCRC 检查失败的错误时,如果该严重性为非 non-fatal,并且接收方以允许继续运行的方式处理了 poisoned 的数据,接收机必须将这种情况处理为 Advisory Non-Fatal Error,接收机如果支持 AER 并且使能了错误记录,则通过发送 ERR_COR msg 来记录该错误,不支持 AER 的接收机在这种情况下不会发送 error msg
在下列情况下,接收机紧张处理为 Advisory Non-Fatal Error:
- 把某个错误当成 Correctable Error 后,并且在配置正确的情况下持续工作,但是会导致数据静默错误(突然出错,没法纠正)
- pcie6.2 2.7.2.1 中的一些规则需要处理为 uncorrectable error
例如 : RC 收到的一笔 Memroy Write TLP 是 poisoned 的,该 TLP 的目标是 host memory, 如果 RC 继续传播该 poisoned 数据到 host memory,如果使能了错误记录,则 RC 需要发送 ERR_COR 来记录该错误;如果 RC 不继续传播 poison 数据到 host memroy, 在使能了错误记录的情况下,RC 通过发送 ERR_NONFATAL msg 来记录该错误
Requester 收到了一笔 Memory Read Completion TLP,该 TLP 是 poisoned 的,如果 Requester 在内部传播了 poisoned 的数据,或者像处理带有 UR/CA 的 Completion 那样来处理此错误,在使能了错误记录的情况下,通过发送 ERR_COR msg 来记录该错误,如果 Requester 未能以一种能确保系统继续运行的方式处理 poison 的数据,在使能了错误记录的情况下,他通过发送 ERR_NONFATAL 来记录这个错误
Requester with Completion Timeout
适用出 Root Ports 之外的 Requester 执行 programmed I/O (PIO).
当 Requester 发送出一个 Non-Posted 请求,等待对应的 Completion 超时后,Requester 允许随后在发送一个单独的请求来从错误中恢复。Requester 允许尝试恢复 0 次,1 次和多次(有限次),但是如果使能了错误记录且如果不再进行任何进一步的恢复尝试的话,则需要通过发送 uncorrectable error msg 来记录这个错误。
如果 Completion Timeout 的严重等级是 non-fatal, 并且 Requester 选择通过发出新的请求来尝试进行恢复操作,Requester 必须首先把当前错误情况情况当作 Advisory Non-Fatal Error ,如果 Requster 具有 AER 且使能了错误记录,通过发送 ERR_COR msg 来记录这个错误,Requester 如果不具备 AER,在这种情况下不会发送 error msg。
请注意,只有在 Non-Posted 没有产生任何副作用的情况下,Requester 才能通过自动恢复机制从 Completion Timeout 机制中恢复过来,但这也可能取决于本规范范围之外的其他因素。
Receiver of an Unexpected Completion
当接收机收到一个 unexpected Completion 并且 unexpected completion 的严重等级是 non-fatal, 接收机必须把这种情况处理为 Advisory Non-Fatal 错误。如果接收机支持 AER 且使能了错误记录,则需要发送 ERR_COR msg 来记录,不支持 AER 的接收机在此情况下不会发送 error msg.
如果 unexpected completion 是错误路由的结果,相关联的 Requester 最终会触发 Completion Timeout 机制,Requester 可以选择尝试恢复,接收机通过将 unexpected completion 的视为 Advisory Non-Fatal Error,可以避免对 Requester 恢复过程的干扰。
Uncorrectable Errors
Uncorrectable Errors 不能通过重新进入Recovery等简单方式来恢复,协议没有定义任何机制来纠正这些错误,上报 uncorrectable error 跟 PCI/PCI-X 中设置 SERR# 类似,
Uncorrectable Error 的具体类别如下,Uncorrectable Error Status (AER 中偏移地址为 04h)寄存器用来表示 PCI Express Function 检测到的每一种单独的错误。当某个错误状态被置起来后,就表明检测到了相应的错误(只有支持 AER 的 Function 才会置位),但是反过来就不一定了,发生了某个错误后,并不一定就会置位对应的比特,还涉及到该种错误类型是否被屏蔽 (mask)以及该种错误的严重等级 (serviery)。系统软件可以往对应的比特写 1 来清掉对应的比特,某个 Function 没有实现的寄存器比特必须在硬件上固定为 0.

| 比特位置 | 寄存器描述 | 属性 | 默认值 |
|---|---|---|---|
| 0 | 未定义-该比特读出来的值是未定义的,在以前的版本中,用来表示是否发生了Link Training Error.系统软件必须忽略这个比特的值。系统软件不需要往改比特中写任何值 | 未定义 | 0 |
| 4 | Data Link Protocol Error Status | RW1CS VF ROZ |
0b |
| 5 | Suprise Down Error Status(可选,Note1) | RW1CS VF ROZ |
0b |
| 12 | Poisoned TLP Received Status | RW1CS | 0b |
| 13 | Flow Control Protocol Error Status(可选,Note1) | RW1CS VF ROZ |
0b |
| 14 | Completion Timeout Status,对于Switch Ports而言,如果Switch Port可以发出自己发出Non-Posted请求(与之相对应的是只能转发其它设备产生的Non-Posted请求),则需要实现该比特,如果Switch Port不支持发出Non-Posted请求,那么该比特不适用并且必须在硬件上固定为0 | RW1CS | 0b |
| 15 | Completer Abort Status (可选,Note1) | RW1CS | 0b |
| 16 | Unexpected Completions Status | RW1CS | 0b |
| 17 | Receiver Overflow Status (可选,Note1 ) | RW1CS VF ROZ |
0b |
| 18 | Malformed TLP Status | RW1CS VF ROZ |
0b |
| 19 | ECRC Error Status(可选,Note1) | RW1CS | 0b |
| 20 | Unsupported Request Error Status | RW1CS | 0b |
| 21 | ACS Violation Status(可选,Note1) | RW1CS | 0b |
| 22 | Uncorrectable Internal Error Status | RW1CS | 0b |
| 23 | MC Blocked TLP Status(可选,Note1) | RW1CS | 0b |
| 24 | AtomicOp Egress Blocked Status(可选,Note1) | RW1CS VF ROZ(Note 2) |
0b |
| 25 | TLP Prefix Blocked Error Status(可选,Note1) | RW1CS VF ROZ(Note 2) |
0b |
| 26 | Poisoned TLP Egress Blocked Status(可选,Note1) | RW1CS VF ROZ(Note 2) |
0b |
| 27 | DMWr Request Egress Block Status(可选,Note1) | RW1CS VF ROZ(note 2) |
0b |
| 28 | IDE Check Failed Status(可选,Note1) | RW1CS VF ROZ(Note 2) |
0b |
| 29 | Misrouted IDE TLP Status (可选,Note1) | RW1CS VF ROZ(Note 2) |
0b |
| 30 | PCRC Check Failed Status(可选,Note1) | RW1CS VR ROZ(Note 2) |
0b |
| 31 | TLP Translation Egress Blocked Status(可选,Note1) | RW1CS VF ROZ(Note 2) |
0b |
Uncorrectable Error 按照严重程度可以分为 Non-Fatal Error 和 Fatal Error,将 Non-Fatal Errors 与 Fatal Errors 区分开来的好处:
- 设备或系统管理软件中的请求者/接收者可以不重置链路上的组件
- 不干扰正在进行的其他事务的情况下可以尝试恢复
是否屏蔽某种错误是由 AER 中 Uncorrectable Error Mask Register (偏移地址为 08h) 来决定,当对应比特设置为 1 时,就表示屏蔽该种错误,及时产生了该种错误,也不会记录在 AER 中的 Uncorrectable Error Register 中。

也可以通过设置 uncorrectable error 的严重等级,让该错误变为 Fatal 或者 Non-Fatal,具体是由 AER 中的 Uncorrectable Error Severity Register (偏移地址为0Ch) 寄存器来控制,如果为 1,则该错误是 Fatal,如果是 0,则对应的错是 non-Fatal 的,而某些 Non-Fatal 在特定情况下又可以变为 advisory non fatal(比如Unexpected Completion),属于 correctable error,不同的错 severity 默认值不一样,因为某些错误默认是 Fatal 的

| 比特位置 | 寄存器描述 | 属性 | 默认值 |
|---|---|---|---|
| 0 | 未定义-该比特读出来的值是未定义的,在以前的版本中,用来表示Link Training Error 的 severity.系统软件必须忽略这个比特的值。系统软件不需要往改比特中写任何值 | 未定义 | 未定义 |
| 4 | Data Link Protocol Error Severity | RWS VF ROZ |
1b |
| 5 | Surprise Down Error Severity (Optional – Note 1) | RWS VF ROZ |
1b |
| 12 | Poisoned TLP Received Severity | RWS VF RsvdP |
0b |
| 14 | Completion Timeout Error Severity | RWS VF RsvdP |
0b |
| 15 | Completer Abort Error Severity (Optional – Note 1) | RWS VF RsvdP |
0b |
| 16 | Unexpected Completion Error Severity | RWS VF RsvdP |
0b |
| 17 | Receiver Overflow Severity (Optional – Note 1) | RWS VF ROZ |
1b |
| 18 | Malformed TLP Severity | RWS VF ROZ |
1b |
| 19 | ECRC Error Severity (Optional – Note 1) | RWS VF ROZ |
0b |
| 20 | Unsupported Request Error Severity | RWS VF RsvdP |
0b |
| 21 | ACS Violation Severity (Optional – Note 1) | RWS VF RsvdP |
0b |
| 22 | Uncorrectable Internal Error Severity (Optional – Note 1) | RWS | 0b |
| 23 | MC Blocked TLP Severity (Optional – Note 1) | RWS | 0b |
| 24 | AtomicOp Egress Blocked Severity (Optional – Note 1) | RWS VF ROZ |
0b |
| 25 | TLP Prefix Blocked Error Severity (Optional – Note 1) | RWS VF ROZ |
0b |
| 26 | Poisoned TLP Egress Blocked Severity (Optional – Note 1) | RWS VF ROZ |
0b |
| 27 | DMWr Request Egress Blocked Severity (Optional – Note 1) | RWS VF ROZ |
0b |
| 28 | IDE Check Failed Severity (Optional – Note 1) | RWS VF ROZ |
1b |
| 29 | Misrouted IDE TLP Severity (Optional – Note 1) | RWS VF ROZ |
0b |
| 30 | PCRC CHeck Failed Severity (Optional – Note 1) | RWS | 0b |
| 31 | TLP Translation Egress Blocked Severity (Optional – Note 1) | RWS VF ROZ |
0b |
Note 1 : 如果对应的 mask 实现了,则 Severity 也需要实现,否则硬件固定为 0
Fatal Errors
Fatal Errors 表明链路或者硬件已经不在可信。对于 Fatal Errors,需要链路复位来重新获得可靠的操作,平台如何处理 Fatal Errors,和怎么限制 Fatal Errors 的效果,需要平台自定义实现。
在 Uncorrectable Errors 中,下面这些属于 Fatal Error :
- Data Link Protocol Error
- Surprise Down
- Receiver Overflow
- Flow Control Protocol Error
- Malformed TLP
- IDE Check Failed
Data Link Protocol Error
下面这些行为会触发 Data Link Protocol Error:
- non Flit mode 下
- 收到 Ack 和 Nak DLLPs 时,如果由 AckNak_Seq_Num 指定的 sequence number 与 unacknowledged TLP (没回 ack 的 TLP )或 ACKD_SEQ 中的值不匹配 – non Flit mode
- flit mode 下
- non-NOP TLPs , Flit 的 bytes 0 到 127 或者 bytes 128 到 235 中,少于 8 个 TLPs(包括不完整的 TLP) – flit mode
- 收到 Flit Usage 字段为保留的 Flit (可选检查)
- 收到 Flit_Marker 中 Flit_Status 为保留编码的 Flit (可选检查)
- 收到无效 sequence number 的 Flit
- 违反 TLP 组包规则
- 收到 Ack Flit 或者 Nak Flit 中,Flit Sequence Number 无效且下面条件都不满足
- ((NEXT_TX_FLIT_SEQ_NUM – 1) – N) mod 1023 > MAX_UNACKNOWLEDGED_FLITS
- (N – ACKD_FLIT_SEQ_NUM) mod 1023 > MAX_UNACKNOWLEDGED_FLITS
Non-Fatal Errors
Non-Fatal Errors 是指无法修正的错误,这类错误会导致特定传输不可靠,但链接本身仍能正常运行。与该事务无关的设备不会受到此错误的影响。
在 Uncorrectable Errors 中,下面这些属于 Non-Fatal Error :
- Poisoned TLP Received
- Poisoned TLP Egress Blocked
- ECRC Check Failed
- Unsupported Request (UR)
- Completion Timeout
- Completer Abort
- Unexpected Completion
- ACS Violation
- MC Blocked TLP
- AtomicOp Egress Blocked
- DMWr Request Egress Blocked
- TLP Translation Egress Blocked
- TLP Prefix Blocked
- Misrouted IDE TLP
- PCRC Check Failed
错误来源
在pcie中,错误可能是由于链路上发生,或者是在内部产生。

物理层错误列表
| 错误名称 | 错误类型 | 检测到的行为 |
|---|---|---|
| Receiver Error | Correctable | 接收机:发送 ERR_COR msg 给 RC |
数据链路层错误列表
| 错误名称 | 错误类型 | 检测到的行为 |
|---|---|---|
| Bad TLP | Correctable | 接收机:发送 ERR_COR Msg 给 RC |
| Bad DLLP | Correctable | 接收机: 发送 ERR_COR Msg 给 RC |
| Replay Timer Timeout | Correctable | 发射机:发送 ERR_COR Msg 给 RC |
| REPLAY_NUM Rollover | Correctalbe | 发射机:发送 ERR_COR Msg 给 RC |
| Data Link Protocol Error | Uncorrectable (Fatal) | 如果检查,发送 ERR_FATAL Msg 给 RC |
| Surprise Down | Uncorrectable (Fatal) | 如果检查,发送 ERR_FATAL 给 Msg RC |
传输层错误列表
| 错误名称 | 错误类型 | 检测到的行为 |
|---|---|---|
| Poisoned TLP Received | Uncorrectable (Non-Fatal) | 接收机:发送 ERR_NONFATAL 给 RC ,对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录 Poisoned TLP 中的 prefix/header |
| Poisoned TLP Egress Blocked | Uncorrectable (Non-Fatal) | DSP 发射机:发送 ERR_NONFATAL 给 RC,对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录 Poisoned TLP 中的 prefix/header |
| ECRC Check Failed | Uncorrectable (Non-Fatal) | 接收机(如果支持 ECRC 检查):发送 ERR_NONFATAL 给 RC, 对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录 ECRC 检查失败那笔 TLP 的 prefix/header |
| Unsupported Request (UR) | Uncorrectable (Non-Fatal) | 要求的接收机:发送 ERR_NONFATAL 给 RC, 对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录导致错误那笔 TLP 的 prefix/header |
| Completion Timeout | Uncorrectable (Non-Fatal) | Requster :发送 ERR_NONFATAL 给 RC, 对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 如果 Advanced Error Capabilities and Control 寄存器中的 Completion Timeout Prefix/Header Log Capable 比特为1,则需要记录导致错误那笔 TLP 的 prefix/header |
| Completer Abort | Uncorrectable (Non-Fatal) | Completer :发送 ERR_NONFATAL 给 RC, 对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录导致出错那笔 TLP 的 prefix/header |
| Unexpected Completion | Uncorrectable (Non-Fatal) | 发送 ERR_COR Msg 给 RC,属于 Advisory Non-Fatal Error 记录导致出错那笔 TLP 的 prefix/header |
| ACS Violation | Uncorrectable (Non-Fatal) | 接收机(如果检查):发送 ERR_NONFATAL 给 RC, 对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录导致出错那笔 TLP 的 prefix/header |
| MC Blocked TLP | Uncorrectable (Non-Fatal) | 接收机(如果检查):发送 ERR_NONFATAL 给 RC 记录导致出错那笔 TLP 的 prefix/header |
| AtomicOp Egress Blocked | Uncorrectable (Non-Fatal) | Egress Port : 发送 ERR_COR Msg 给 RC,属于 Advisory Non-Fatal Error 记录导致出错那笔 AtomicOp 请求的 prefix/header |
| DMWr Request Egress Blocked | Uncorrectable (Non-Fatal) | Egress Port : 发送 ERR_COR Msg 给 RC,属于 Advisory Non-Fatal Error 记录导致出错那笔 DMWr 请求中的 prefix/header |
| TLP Translation Egress Blocked | Uncorrectable (Non-Fatal) | Egress Port : xxxx |
| TLP Prefix Blocked | Uncorrectable (Non-Fatal) | Egress Port : 发送 ERR_NONFATAL 给 RC, 对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录导致出错那笔 TLP 的 prefix/header |
| Receiver Overflow | Uncorrectable (Fatal) | 接收机(如果检查):发送 ERR_FATAL 给 RC |
| Flow Control Protocol Error | Uncorrectable (Fatal) | 接收机(如果检查):发送 ERR_FATAL 给 RC |
| Malformed TLP | Uncorrectable (Fatal) | 接收机(如果检查):发送 ERR_FATAL 给 RC 记录导致出错那笔 TLP 的 prefix/header |
| IDE Check Failed | Uncorrectable (Fatal) | Receiving IDE Terminus: xxx |
| Misrouted IDE TLP | Uncorrectable (Non-Fatal) | Ingress/Egress Port : 发送 ERR_FATAL 给 RC 记录导致出错那笔 TLP 的 prefix/header |
| PCRC Check Failed | Uncorrectable (Non-Fatal) | Receiving IDE Terminus : 发送 ERR_NONFATAL 给 RC, 对于 Advisory Non-Fatal Error 的情况,发送 ERR_COR Msg 给 RC 记录导致出错那笔 TLP 的 prefix/header |
错误相关寄存器和信号
错误信号和记录
在pcie标准协议中,分为必须检查的错误和可选检查的错误。每一种错误要么是跟port关联,要么是跟一个特殊设置关联(或者多功能设备中的一个function)。
PCIe定义了两种错误示范:baseline capability和AER。Baseline capability需要所有PCIe设置都支持,Baseline capability定义了最小的错误报告需求。AER定义了更多鲁棒性(robust)的错误,在PCI Express Capability结构中实现。
所有的SR-IOV设备必须支持baseline Capability,通过一定的修改来考虑降低成本和实现复杂性的目标。AER Extended Capability是可选的,但是AER在PF中是不先实现通过一定的修改来考虑降低成本和实现复杂性的目标的
错误相关的寄存器
command 和 StatusError Control/Status
针对具有Type 1配置空间头的Root Port
- primary side Error Control/Status 寄存器表示跟Root Complex内部关联产生的一些错
- secondary side Error Control/Status寄存器表示链路上检测到的错误,链路是指Root Port对应的链路
针对具有Type 1配置空间头的Swtich Upstream Ports
- primary side Error Control/Status寄存器表示Switch的Upstream Link(上游链路)检测到的错误
- secondary side Error Control/Status寄存器表示Switch内部检测到的错误
针对具有Type 1配置空间头的Switch Downstream Ports
- primary side Error Control/Status寄存器表示Switch内部逻辑检测到的错
- secondary side Error Control/Status寄存器表示Switch的Downstream Link(下游链路)检测的错误
Command 寄存器
| 比特 | 描述 | 属性 |
|---|---|---|
| 11 | Signaled Target Abort 置1的条件:当function完成一笔Posted或者Non-Posted请求时,该请求是Completer Abort error. 适用于当Type 1配置空间头的function在Primary Side产生了Completer Abort 具有Type 0配置空头的function,如果不发出终止信号,允许固定该比特为0 默认值是0 |
RW1C |
| 12 | Received Target Abort 置1的条件:在具有Type 0配置空间头的function中(简单理解为EP),当Requester收到带有一笔Completion,且Completion的Completion Status为Completer Abort(CA)时. 置1的条件:在具有Type 1配置空间头的function中(RC或者switch),当他的Primary side收到一个Completion,且状态为CA时,置为该比特 |
RW1C |
| 13 | Received Master Abort 置1的条件: 1.在具有 Type 0 配置空间头的 function 中(简单理解为EP),当 Requester 收到带有一笔 Completion,且 Completion 的Completion Status 为 Unsupported Request(UR) 时,置位该比特。 置1的条件: 2. 在具有 Type 1 配置空间头的 function 中( RC或者switch ),当他的 Primary side 收到 UR 的 completions. 在具有 Type 0 配置空间头的 function 中,如果自生行为不会产生 Non-Posted 请求,则允许固定该比特为0 默认值是0 |
RW1C |
| 14 | Signaled System Error 置1的条件:当 function 发送 ERR_FATAL 或者 ERR_NONFATL message且 command status 寄存器中的 SERR# Enable比特为1. 具有Type 0配置空间头的 function 如果不发送ERR_FATAL或者ERR_NONFATAL message,则允许讲此比特固定为0 默认值为0 |
RW1C |
| 15 | Detected Parity Error 置1的条件: 1. 不管 Command 寄存器中的Parity Error Response为何值,只要 function 收到 Poisoned TLP。 置1的条件: 2. 具有 Type 1 配置空间头的 Function 中,当 Poisoned TLP 在他的 primary side 收到时也会置1 默认值为0 |
RW1C |
Device Status 寄存器
| 比特 | 描述 | 属性 |
|---|---|---|
| 0 | Correctable Error Detect, 当检测到correctable errors时,置位改比特。不管错误报告是否使能,也 | RW1C |
Secondary Status寄存器
| 比特 | 描述 | 属性 |
|---|---|---|
| 11 | Signaled Target Abort 置1的条件:当具有Type 1配置空间头的Function(swus或者rc)的secondary side作为完成了一笔Posted或者Non-Posted请求,该请求时作为Complter Abort error 默认值时0 |
RW1C |
| 12 | Received Target Abort 置1的条件:当具有Type 1配置空间头的Function(swus或者RC)的secondary side收到了一笔completion,且completion status为Completer Abort(CA) 默认值为0 |
RW1C |
| 13 | Received Master Abort 置1的条件:当具有Type 1配置空间头的Function(swus或者RC)的secondary side收到了一笔Completion,且Completion Status为Unsupported Status(UR) 默认值为0 |
RW1C |
| 14 | Received System Error 置1的条件:当具有Type 1配置空间头的Function(SWUS或者RC)的Secondray side收到了一笔ERR_FATAL或者ERR_NONFATAL的message 默认值为0 |
RW1C |
| 15 | Detected Parity Error 置1的条件:不管Bridge Control寄存器的Parity Error Response Enable为何值,当具有Type 1配置空间头的Function(SWUS或者RC)的Secondary Side收到了一笔Posioned TLP 默认值为0 |
RW1C |
高级错误报告扩展能力(AER)
PCI Express Advanced Error Report(AER)是一个可选的能力,
Advanced Error Reporting Extend Capability Header(Offset 00h)
Advanced Error Reporting Extended Capability 是001h
| 比特位置 | 寄存器描述 |
|---|---|
| 15:0 | PCI Express Extended Capability ID – PCI-SIG定义的ID号,用来表明Extended Capability的格式和特征,对于Advanced Error Reporting Extended Capability来说是0001h |
| 19:16 | Capability Version – PCI-SIG定义的版本号,用来表明Capability结构 |
| 31:20 | Next Capability Offset – 用来表明下一个PCI Express Capability结构,如果没有下一个Capability,则该比特是000h 对于在配置空间中的PCI Extended Capability而言,这个偏移是相对于PCI兼容配置空间起始地址,并且必须大于0FFh或者000h(Capabilities的结束) |
错误处理流程

错误上传流程

感谢您的支持,请扫码打赏