4. Gen3 训练超时定义:超时类型与时间窗口
Gen3 链路训练过程中,物理层(PHY)通过状态机在多个阶段发送训练序列(TS1/TS2)并执行均衡协商。任何阶段若在规定时间内未收到预期响应,即触发超时。超时是链路训练失败的最常见原因,驱动调试人员必须准确区分超时类型及其对应的时间窗口。
4.1 超时类型总览
PCIe Base Spec 将 Gen3 训练超时归纳为三种核心类型,分别对应不同的训练阶段和物理机制:
| 超时类型 | 触发阶段 | 根本原因 | 典型现象 |
|---|---|---|---|
| TS1/TS2 超时 | Polling / Configuration / Recovery | 对端未响应训练序列,或链路位锁定失败 | LTSSM 卡在 Polling.Active 或 Recovery.Equalization |
| 均衡超时 | Equalization Phase 1/2/3 | 发送端/接收端系数协商未在规定次数内收敛 | Preset 系数反复切换,无法进入 Phase 3 |
| 电气空闲超时 | Detect / Polling.Compliance / L1 | 电气空闲退出条件未满足,或接收器检测不到信号跳变 | 链路持续处于 Electrical Idle 状态,无法进入 Polling |
调试要点: 驱动在读 Link Status 寄存器(PCIe Cap 0x12)时,若 Link Training 位持续置 1,应首先读取 LTSSM State(0x1A4/0x1A6)以确定当前状态,再对照超时类型定位问题。
4.2 TS1/TS2 超时
TS1/TS2 训练序列是链路建立的基础握手信号。超时发生在以下场景:
- Polling.Active 超时: 发送端连续发送 TS1 序列,但未在 24 ms 内收到对端 TS1 响应。
- Configuration.Linkwidth 超时: 链路宽度协商期间,TS2 序列交换超时,默认窗口为 2 ms。
- Recovery.RcvrLock 超时: 退出 L1 或从电气空闲恢复时,接收器未在 10 μs 内锁定 TS1 序列。
规范参考: PCIe Base Spec Rev 5.0 第 4.2.6.3 节规定,Polling.Active 超时时间为 24 ms(最大值),驱动层应在此窗口内轮询 Link Status 寄存器,避免过早判定训练失败。
4.3 均衡超时
Gen3 引入的均衡过程要求发送端和接收端在 3 个阶段内完成系数协商。超时机制如下:
| 均衡阶段 | 超时条件 | 时间窗口 | 恢复行为 |
|---|---|---|---|
| Phase 1 | 发送端未在 24 ms 内收到接收端 Preset 请求 | 24 ms | 回退至 Recovery.RcvrLock |
| Phase 2 | 接收端系数更新后,发送端未在 10 μs 内确认 | 10 μs | 重发当前系数,最多重试 3 次 |
| Phase 3 | 最终系数协商未在 2 ms 内完成 | 2 ms | 使用默认 Preset 系数,降级至 Gen2 |
常见陷阱: 均衡超时往往不是单次超时,而是系数协商过程中多次微超时的累积。驱动调试时应读取 Equalization Control 寄存器(0x1B0)中的 Phase 状态位,而非仅依赖 Link Training 位。
4.4 电气空闲超时
电气空闲(Electrical Idle)是 PCIe 物理层的一种低功耗信号状态。超时主要发生在:
- Detect.Quiet 超时: 接收器在 12 ms 内未检测到发送端退出电气空闲的信号跳变。
- Polling.Compliance 超时: 进入 Compliance 模式后,若 1 ms 内未收到退出指令,链路自动复位。
- L1 退出超时: 从 L1 状态恢复时,电气空闲退出条件未在 10 μs 内满足。
电气空闲超时通常与信号完整性或参考时钟偏差相关,驱动层可通过读取 Electrical Idle Control 寄存器(0x1A8)中的状态位辅助诊断。
4.5 超时时间窗口汇总
下表汇总了 Gen3 训练过程中所有关键超时时间窗口,供驱动调试时参考:
| 超时场景 | 时间窗口 | 规范章节 |
|---|---|---|
| Polling.Active TS1 超时 | 24 ms | 4.2.6.3 |
| Configuration.Linkwidth TS2 超时 | 2 ms | 4.2.6.4 |
| Recovery.RcvrLock TS1 超时 | 10 μs | 4.2.6.5 |
| 均衡 Phase 1 超时 | 24 ms | 4.2.6.6.1 |
| 均衡 Phase 2 超时 | 10 μs | 4.2.6.6.2 |
| 均衡 Phase 3 超时 | 2 ms | 4.2.6.6.3 |
| Detect.Quiet 电气空闲超时 | 12 ms | 4.2.4.1 |
| L1 退出电气空闲超时 | 10 μs | 4.2.7.2 |
4.6 超时恢复流程 SVG 图
下图展示了 Gen3 链路训练过程中,三种超时类型对应的恢复路径与状态转换关系:
4.7 驱动调试中的超时处理策略
在驱动层面,超时处理应遵循以下步骤:
- 轮询 Link Status 寄存器: 以 1 ms 为间隔读取 Link Training 位,避免错过超时窗口。
- 读取 LTSSM State: 当 Link Training 位持续置 1 超过 30 ms 时,读取 0x1A4 寄存器确认当前状态。
- 区分超时类型:
- 若状态为 Polling.Active 或 Configuration.Linkwidth,判定为 TS1/TS2 超时。
- 若状态为 Recovery.Equalization.Phase1/2/3,判定为均衡超时。
- 若状态为 Detect.Quiet 或 L1,判定为电气空闲超时。
- 执行恢复动作:
- TS1/TS2 超时:触发链路复位(Link Disable/Enable)。
- 均衡超时:读取 Equalization Control 寄存器,尝试重新发起均衡协商。
- 电气空闲超时:检查参考时钟和电源状态,重新触发 Detect 序列。
代码示例: 驱动中轮询超时状态的典型实现片段:
// 轮询 Link Training 状态,超时 30 ms
for (int i = 0; i < 30; i++) {
status = pcie_read16(dev, PCIE_CAP + 0x12);
if (!(status & PCIE_LINK_TRAINING)) {
// 训练完成
return 0;
}
mdelay(1);
}
// 超时后读取 LTSSM State
ltssm_state = pcie_read32(dev, 0x1A4) & 0x1F;
// 根据 ltssm_state 执行对应恢复策略
4.8 超时与链路降级的关系
当 Gen3 训练超时且恢复失败时,链路可能降级至 Gen2 或 Gen1。驱动应记录超时类型和降级原因,以便后续分析:
- 均衡超时 是导致 Gen3 降级至 Gen2 的最常见原因。
- TS1/TS2 超时 通常导致链路宽度降级(如 x8 降为 x4)。
- 电气空闲超时 可能触发链路完全复位,重新从 Detect 开始训练。
重要提示: 驱动不应在超时发生后立即复位链路,应先尝试读取 Equalization Control 和 Link Control 2 寄存器,确认是否可以通过软件触发重新均衡(Retrain Link)来恢复,避免不必要的链路中断。