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 链路训练过程中,三种超时类型对应的恢复路径与状态转换关系:

Gen3 训练超时类型与恢复流程 Gen3 训练超时类型与恢复流程 LTSSM 状态机 TS1/TS2 超时 Polling / Config / Recovery 均衡超时 Phase 1 / 2 / 3 电气空闲超时 Detect / L1 / Compliance 回退至 Recovery.RcvrLock 系数重试 / 降级至 Gen2 最多重试 3 次 链路复位 / 重新 Detect 驱动调试建议 • 读取 LTSSM State(0x1A4)确定当前超时类型 • 根据超时类型选择对应的恢复策略(回退 / 重试 / 降级) • 记录超时发生时的 Preset 系数和 Phase 状态

4.7 驱动调试中的超时处理策略

在驱动层面,超时处理应遵循以下步骤:

  1. 轮询 Link Status 寄存器: 以 1 ms 为间隔读取 Link Training 位,避免错过超时窗口。
  2. 读取 LTSSM State: 当 Link Training 位持续置 1 超过 30 ms 时,读取 0x1A4 寄存器确认当前状态。
  3. 区分超时类型:
    • 若状态为 Polling.Active 或 Configuration.Linkwidth,判定为 TS1/TS2 超时。
    • 若状态为 Recovery.Equalization.Phase1/2/3,判定为均衡超时。
    • 若状态为 Detect.Quiet 或 L1,判定为电气空闲超时。
  4. 执行恢复动作:
    • 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)来恢复,避免不必要的链路中断。