Fork me on GitHub
侧边栏

【PCIe】PCIe 完成超时机制

定义

PCIe 设备发出的请求中有些请求需要 Completer 反馈 Completion,此时 Requester 会等待 Completion 再进行下一步操作。在某些异常情况下,比如配置不当、系统故障等,Requeser 无法收到或收齐 Completion。

为了不影响进一步使用,需要一种超时退出机制让 Requester 从这种等待状态恢复过来,这就是 Completion Timeout 机制(完成超时退出机制)。

软件配置

PCIe 通过 Device Capabilities 2 Register 和 Device Control 2 Register 两个寄存器中的相关字段来对 Completion Timeout 进行指示及控制。对于支持 Completion Timeout 机制的 Function,软件随时可以更改 Device Control 2 Register 中 Completion Timeout 相关配置。

Device Capabilities 2 Register 如图 1 所示,Completion Timeout 用到的字段释义如下:

  • Completion Timeout Ranges Supported,用以指示当前 Function 支持的 Completion Timeout 范围,仅用于 RP 及 EP。共有 4 个范围,Range A~D,每 1 bit 对应一个范围。
  • Completion Timeout Disable Supported,用以指示是否能够关闭 Completion Timeout 机制。该字段对 RP 是可选的,对于需要发送 NP 请求的 EP 是必选的。各 VF 该字段的值必须与 PF 该字段的值相同。

image

Device Control 2 Register 如图 2 所示,Completion Timeout 用到的字段释义如下:

  • Completion Timeout Value,通过配置该字段来选择 Completion Timeout 的范围。若开启了 Completion Timeout,用户可以通过配置 Device Control 2 寄存器的 Completion Timeout Value 来选择 Timeout Limit。
  • Completion Timeout Disable,通过配置该字段来决定打开或关闭 CompletionTimeout。Completion Timeout 机制默认打开,用户可以将该字段置一来关闭该机制。

image

Completion Timeout Value 共有五个范围,Default Range 及 Range A~D,每个 Range 包含两个子范围。如果为 Default Range 或设备不支持可变的 Timeout Value 配置,那么在设计的时候,Flit Mode 下应把 Timeout Value 设置为 40 ms ~ 50 ms,Non-Flit Mode 下应设置为 50 us ~ 50 ms(建议最少 10 ms)。其他几个范围编码及范围具体值如下表所示。

Completion Timeout Value Code Range Name Time Range
0000b Default Range 40ms~50ms@FM 50us~50ms@NFM
0001b A 50us~100us
0010b A 1ms~10ms
0101b B 16ms~55ms;
40ms~55ms MUST@FM
0110b B 65ms~210ms
1001b C 260ms~900ms
1010b C 1s~3.5s
1101b D 4s~13s
1110b D 17s~64s
Others Reserved Reserved

使用限制

对于 RC 发出的 Configuration 读写请求,由于 PCIe-PCI/PCI-X Bridge 不支持请求重传(RRS),可能会导致 Completion 时间较长,RC 的 Completion Timeout 应考虑到这一点。

除了上述提到的 Configuration 请求,对于能够发出 NP 类型请求的 PCIe Function,必须实现 Completion Timeout 机制。每一笔 NP 请求发出后自动触发针对该请求的 Completion Timeout Timer。由于 Switch 仅用于交换请求不自发生成请求,Completion Timeout 机制仅限于用在 RC、EP 及 Bridge 上,不适用与 Switch。

处置方式

发生Completion Timeout 时,Requester 上报错误。对于 Memory Read 请求,若 Completer 响应多笔 CplD 但 CplD 被中断,Requester 可以保留此前收到的 CplD 中的 Data,也可以丢弃。

AER 提供了相关机制来指示 Memory / IO / Configuration 相关 Completion Timeout 的状态指示、Error Mask,并提供了 Completion Timeout Prefix/Header Log 寄存器来存放相关请求的 TLP Prefix/Header,便于后期 Debug。

posted @ 2025-06-30 18:08  yooooooo  阅读(376)  评论(0)    收藏  举报