pcie receiver error
目录
⇦
Link Error/Receiver Error/Framing Error 等
Link Error 是链路错误,不是一种特定的错,而是一些错误的统称。
在 pcie Correctable Error Status 寄存器中,只有 Receiver Error Status,没有 Framing Error,Symbol Lock 丢失等其它错误的状态标识。因此软件没法精确是发生了哪一种错误。Receiver Error 和 Framing Error 对比
| 类型 | Receiver Error | Framing Error |
|---|---|---|
| 来源 | 接收机检查出来的错误,可能在组帧前就发现了 | 组帧完成后,检查出来的一些错误 |
| 是否需要置位 Receiver Error status | 在特定 LTSSM 状态需要 | 不一定 |
ltssm 和错误是否需要置位 Receiver Error Status 之间的关系
| ltssm 状态 | 置为 Receiver Error Status | In-Band Presence |
|---|---|---|
| Detect | 不 | 0 |
| Polling | 不 | 1 |
| Configuration | 8b/10b 相关错误置位(如果实现需要置位) 128b/130b 置位 (可选) |
1 |
| Recovery | 可选 | 1 |
| L0 | 置位 | 1 |
| L0s/L1/L2 | 不 | 1 |
| Disabled/Hot Reset | 8b/10b相关错误置位(可选) | 1 |
| Loopback | 无 | 1 |
Link Error 在 8b/10b下包括:
| 类型 | 是否需要检查 | 是否触发 Reciever Error |
|---|---|---|
| 8b/10b decode Errors | 需要 | 特定 LTSSM 状态触发 |
| Non-Flit Mode Framing 相关的错误 | 可选 | 可选 |
| loss of Symbol Lock | 数据可能不对 | 可选 |
| Elasticity Buffer Overflow/Underflow | 数据可能不对 | 可选 |
| Lane-to-Lane de-skew 失败 | 数据可能不对 | 可选 |
note :
- 8b/10 decode Error 不一定需要触发 Reciver Error,比如在 Polling 状态,刚开始数据还没稳定,不用触发 Receiver Error
- 数据不对后,就没法直接检查,可能是由内部信号指示发生了改错误,内部信号指示后也可将 Reciver Error Status 置为 1
Link Error 在 128b/130b 编码下包括:
| 类型 | 是否需要检查 | 是否触发 Reciever Error |
|---|---|---|
| Framing Error | 需要 | 特定 LTSSM 状态触发 |
| loss of Block Alignment | 数据可能不对 | 可选 |
| Elasticity Buffer Overflow/Underflow | 数据可能不对 | 可选 |
| Lane-to-Lane de-skew 失败 | 数据可能不对 | 可选 |
| note: |
- Framing Error 在 non flit 128b/130b 编码下,基本都是可选检查,在 128b/130b flit 模式下,是必须检查
Link Error 在 1b/1b 编码下包括:
| 类型 | 是否需要检查 | 是否触发 Reciever Error |
|---|---|---|
| Framing Error | 需要 | 特定 LTSSM 状态触发 |
| Elasticity Buffer Overflow/Underflow | 数据可能不对 | 可选 |
| Lane-to-Lane de-skew 失败 | 数据可能不对 | 可选 |
Receiver Error 触发行为
8b/10b 触发 Receiver Error 的行为
| 模式 | 是否需要检查 | 错误类型 | 触发 Receiver Error 的行为 |
|---|---|---|---|
| Non-Flit | 需要 | decode error | 接受到的 symbol 不在 8b/10b 编码表中 |
| Non-Flit | 需要 | decode error | 接受到的 symbol 在 8b/10b 编码表中,但是 running disparity 跟编码表中的不一致 |
| Non-Flit | 可以不检查 | framing error | STP 和 END 或者 STP 和 EDB 之间的 symbol 个数小于 18 (gen1/2 TLP 的最小长度为 18 个 Symbol |
| Non-Flit | 可以不检查 | framing error | 大于 x1 的链路,当准备从 Logical Idle 状态过渡到传输 TLP 时,STP Symbol 没有在 lane0 上 |
| Non-Flit | 可以不检查 | framing error | 大于 x1 的链路,当准备从 Logical Idle 状态过渡到传输 DLLP 时,SDP Symbol 没有在 lane0 上 |
| Non-Flit | 可以不检查 | framing error | 一个 Symbol Time (Symbol Timed的解释) 之内出现了 2 个或更多个 STP Symbol |
| Non-Flit | 可以不检查 | framing error | 一个 Symbol Time 之内出现了 2 个或者更多个 SDP Symbol |
| Non-Flit | 可以不检查 | framing error | 如果链路宽度大于 x4,STP 或者 SDP Symbol 不在 4N (N为正整数)上。例如,x8的链路,STP 和 SDP 不在 lane 0 和 lane 4 上 |
| Non-Flit | 可以不检查 | framing error | 对于 xN 的链路,END 或者EDB Symbol 在 K ( K 不等于N-1 )上且 Lane K+1 不是 STP 或者 SDP Symbol 时且lanes K+1到lane N-1不为PAD |
| Non-Flit/Flit | 数据错误 | loss of Symbol Lockl | 自定义实现是否置位 Receiver Error Status |
| Non-Flit/Flit | 数据可能不对 | Elasticity Buffer Overflow/Underflow | 自定义实现是否置位 Receiver Error Status |
| Non-Flit/Flit | 数据可能不对 | Lane-to-Lane de-skew 失败 | 自定义实现是否置位 Receiver Error Status |
- note
- 8b/10b 编解码错误可以在 Flit 模式下可以通过 FEC 逻辑纠正回来
- decode error 在 pipe rxstatus 有明确的编码
- 在 pcie 2.0 的协议中没有明确指明哪些是 framing error,但是对 symbol 的一些要求是在 Frame 相关的章节,在 “Link Error Recovery” 这一章节也有提到 “Non-Flit Mode framing related errors” 就是上述 Framing Error相关的内容
- 数据错误后没法直接检查
128b/130b 编解码触发 Framing Error 的行为
| 模式 | 是否需要检查 | 触发 Receiver Error 的行为 |
|---|---|---|
| Non-Flit | 可选 | 处理期望是一个 Faming Token 的 Symbols 时,接受到的 Symbol 或者 Symbol 序列跟 Framing Token 定义不一致 |
| Non-Flit | 可选 | 收到 STP Token 后,接收机根据收到的 TLP 计算Frame CRC 和 Frame Parity,计算出来的和接收到的Frame CRC 或者 Frame Parity 不一致 |
| Non-Flit | 可选 | 收到 STP Token 后,接收机可以检查 TLP Length 字段是否为 0,如果检查且为 0 |
| Non-Flit | 可选 | 收到 STP Token 后,接收机可以检查 TLP Length 字段是否为 2/3/4,如果检查且为2,3,4 (TLP 最短为 5 个 DW) |
| Non-Flit | 可选 | 收到 STP Token 后,接受机可以检查 TLP Length 字段是否在 1152 到 1535 (包括1535) 之间,如果检查且TLP Length 字段在1152到1535之间 |
| Non-Flit | 可选 | 收到 STP Token 后,不支持协议复用的 port 可以检查 TLP Length 字段是否大于 1535,如果检查且 TLP Length 字段大于1535 |
| Non-Flit | 可选 | 收到 STP Token 后,接收机可以检查一个 Symbol Time 内是否收到了超过 1 个 STP Token,如果检查且一个 Symbol Time 收到不止 1个 STP Token |
| Non-Flit | 可选 | 接收机检查 EDB Token 中的所有 Symbol,如果某个 Symbol 不符合 EDB Token 的定义 |
| Non-Flit | 可选 | EDB 后面紧接着跟 TLP |
| Non-Flit | 可选 | 收到EDS Token之后,在链路上,数据块的最后四个 symbol 收到 EDS Token 之后,在下一个 Block 开始时,如果不是 SKPOS,EIOS 或者 EIEOS (EDS Token出现在最后,其它 lane 没有发送 idle data 的机会) |
| Non-Flit | 可选 | 收到 SDP Token 之后,接收机可以检查一个 symbol time 之内是否收到了超过 1 个 SDP Token,如果检查且一个 Symbol Time 之内收到的 SDP Token 大于1 |
| Non-Flit | 可选 | 收到 IDL Token 之后,对于 x2 的链路,接收机允许检查 lane 1 上的 Symbol,如果 lane 0 上收到了 IDL Token (或者IDL),lane 1上收到的不是 IDL (IDL Token为8’h00,跟IDL是一样的) |
| Non-Flit | 可选 | 收到 IDL Token 之后,对于 x4 的链路,接收机允许检查 lane1-3 上的 Symbol,如果 lane 0 上收到了 IDL Token (也是IDL),lane 1-3 上收到的不是 IDL |
| Non-Flit | 可选 | 对于 x8 或者 x16 的链路,下一个要处理的 symbol 没有跟收到 IDL Token 后的下一个 DW ( 4 个 symbol 对齐),比如,x16的链路,lane 4 收到了 IDL Token,下一个 Token 的起始位置为这个 Symbol Time 的 lane 8,如果 IDL Token 出现在 x8 链路的 lane 4,则下一个Token的起点在下一个 Symbol Time 的 lane 0。如果检查且 IDL Token 和下一个 Token 之间的 Symbol 不是IDL |
| Non-Flit | 可选 | 任意一条 lane 上接收到 OS 块后跟着 SDSOS |
| Non-Flit | 可选 | 接收到未定义的数据块类型 (如 sync header 为 11b 或者 00b ) |
| Non-Flit | 可选 | 任意一条 lane 上接受到 OS block,但是前一个 Block 没有收到 EDS Token
比如收到了 SKPOS 但是前面没有 EDS Token ,所以需要发送完 TLP 后才可以插入 SKPOS。 |
| Non-Flit | 可选 | 在数据流中,SKPOS 后面跟着跟着其它 os (包括 SKPOS ) |
| Non-Flit | 可选 | 任意一条 lane 上收到 Data Block,但是前面一个 Block 包含 EDS Token |
| Non-Flit | 可选 | 接收机允许检查不同 lane 上是否有不同的 os,如果检查且不同 lane 上的Ordered Sets不一样
如 lane 0 收到 SKPOS,lane 1 收到 EIOS |
| Flit | 需要 | 处理数据流时,任意一条 lane 上收到了 SDSOS,如果 SDSOS 后面紧跟着的不是 SKPOS 而是数据块 |
| Flit | 需要 | 处理数据流时,接收到的块是未定义的块类型 (如 Sync header 为 11b 或者 00b ) |
| Flit | 需要 | 处理数据流时,针对 L0p 过程中不需要退出或者进入 EI 状态的 lane,- 任意一条 lane 在不是计划的 block 边界收到 OS – Flit长度固定,所以 block 边界不是随意 |
| Flit | 需要 | 处理数据流时,针对 L0p 过程中不需要退出或者进入 EI 状态的 lane,在固定 block 边界没有收到 EIEOS,SKPOS 和 EIOS 中的任意一个 |
| Flit | 需要 | 处理数据流时,针对 L0p 过程中不需要退出或者进入 EI 状态的 lane,接收机允许不同 lane 上是否出现不同的Ordered Sets,如果检查且不同 lane 上收到的 Ordered Set 不同 (但是在通过 L0p 改变链路宽度时允许不同的 lane 上出现不同的 Ordered Sets)
ig. 如果 lane 0 收到 SKPOS,lane 1 收到 EIOS,此时不是通过L0p改变链路宽度,那么就是 Framing Error |
1b/1b 编解码触发 Framing Error的行为
| 模式 | 是否需要检查 | 触发 Framing Error 的行为 |
|---|---|---|
| Flit | 检查 | 处理数据流后的 OS 时,在第一个对齐的 8 byte 对齐的快中,跟 SKPOS, EIOS 或者 EIEOS 能匹配的 byte 少于 5 |
| Flit | 检查 | 处理数据流后的 OS 时,如果从第一个 8 bytes 中已经推出来是 SKPOS,而 SKPOS 没收到 5 个字节对应的 SKP_ |
| Flit | 检查 | 在两条有效的 lanes 上,同时收到 EIEOS 和 EIOS 或者 EIEOS 和 S |
| Flit | 检查 | 所有 lane 上收到的 SKPOS |
| Flit | 检查 | Framing E 收到 EIOS 和 SKPOS 的组合,且满足下面其一 : 1. 链路没有设置 L0p 2. 收到 EIOS 的 lane 不是连续的 (ie. lane 1/3 收到,2,4没收到) 3. 收到 SKPOS 的 lane 不是连续的 4. 收到 SKPOS 的lane 不是有效的宽度(1,2,4,8) 5. 有些 lane 中既没收到 SKPOS 也没收到 EIOS |
发生 Receiver Error 的行为
- Receiver Error 需要跟 port 关联
- Receiver Error 是一种可纠正的错误,会发送 ERR_COR Message 给 RC
- ltssm 需要进入
Recovery
相关的寄存器
Lane Error Status
| bit | 描述 | 属性 |
|---|---|---|
| [31:0] | Lane Error Status Bits :每一个比特代表对应的 lane 是否有基于 lane 的错误 1 : 表明在对应 lane 上出现了基于 lane 的错误 0 : 默认值,对应 lane 上没有出现基于 lane 的错误 如果 port 支持的最大宽度小于 32 条 lane,[31:Maximum Link Width] 是无用的,且属性为 RsvdZ 如果 port 不支持 8.0 GT/s,并且 8b/10b 相关错误不设置这些比特,允许固定为 0 |
RW1CS |
如果在这个过程中遇到了其它问题,欢迎在评论区留言,如果你已解决,也欢迎把具体的解决方法留在评论区,以供后来者参考
×
感谢您的支持,请扫码打赏
求receiver error总结
@znn 了解,周末加急处理
不知楼主在哪个城市?有空可以线下约着见见?我也在做物理层这块
@Gordon Wu 在西南柬埔寨😊,不过我现在做其他层去了,物理层还有很多东西也不是特别清楚