【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 该字段的值相同。
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 机制默认打开,用户可以将该字段置一来关闭该机制。
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。