3. 链路训练状态机(LTSSM)
PCIe 链路训练状态机(LTSSM, Link Training and Status State Machine)是物理层的核心控制逻辑,负责管理链路的初始化、宽度协商、速度协商、电源状态转换以及错误恢复。LTSSM 定义了一组有限状态,每个状态都有明确的进入条件、行为动作和退出条件。理解 LTSSM 是调试链路训练超时与恢复问题的基础。
3.1 LTSSM 状态总览
LTSSM 包含 11 个主要状态,其中与 Gen3 调试最密切的 8 个状态如下表所示:
| 状态 | 全称 | 核心功能 | 调试关注点 |
|---|---|---|---|
| Detect | 检测 | 检测对端设备是否存在 | 电气空闲、接收器检测逻辑 |
| Polling | 轮询 | 建立位锁定和符号锁定 | TS1/TS2 有序集交换、位锁定失败 |
| Configuration | 配置 | 协商链路宽度和 Lane 映射 | 宽度降级、Lane 反转、极性反转 |
| Recovery | 恢复 | 速度变更、错误恢复、重新训练 | 超时重试、EQ 失败、速度降级 |
| L0 | 全速运行 | 正常数据传输 | 链路稳定、CRC 错误率 |
| L0s | 低功耗待命 | 单方向快速电源关断 | 退出延迟、电气空闲干扰 |
| L1 | 低功耗睡眠 | 双向电源关断,更高延迟 | ASPM 配置、唤醒时序 |
| L2 | 深度睡眠 | 主电源关闭,仅保留辅助电源 | 唤醒信号、复位行为 |
3.2 LTSSM 状态转换图
下图展示了 LTSSM 核心状态之间的转换关系,箭头标注了触发转换的关键条件:
3.3 各状态详解与转换条件
3.3.1 Detect 状态
目的: 检测对端设备是否存在,以及链路是否处于电气空闲状态。
- 进入条件: 复位(Fundamental Reset)、Hot Reset、从 L2/L3 唤醒、或任何状态超时后的回退。
- 行为: 发送器发送 Detect 信号序列;接收器检测接收器终端是否存在(Rx Detection)。
- 退出条件:
- 检测到对端接收器存在 → 进入 Polling。
- 超时(通常 12ms)未检测到 → 重新执行 Detect。
3.3.2 Polling 状态
目的: 建立位锁定(Bit Lock)和符号锁定(Symbol Lock),交换训练序列。
- 进入条件: Detect 阶段成功检测到对端。
- 行为: 连续发送 TS1 有序集;等待接收对端的 TS1/TS2;完成位锁定和符号锁定。
- 退出条件:
- 成功交换 8 个连续的 TS1/TS2 有序集 → 进入 Configuration。
- 超时(24ms)或锁定失败 → 回退 Detect。
3.3.3 Configuration 状态
目的: 协商链路宽度(Link Width)、Lane 映射(Lane-to-Lane Mapping)、极性反转(Polarity Inversion)。
- 进入条件: Polling 阶段成功完成。
- 行为: 通过交换带有 Lane 编号的 TS1/TS2 有序集,确定哪些 Lane 是好的,并建立 Lane 顺序。
- 退出条件:
- 所有 Lane 完成编号协商 → 进入 L0(Gen1/Gen2)或进入 Recovery 进行速度协商(Gen3)。
- 超时或协商失败 → 回退 Detect。
3.3.4 Recovery 状态
目的: 执行速度变更(Speed Change)、链路宽度变更、错误恢复和重新训练。这是 Gen3 调试的 核心状态。
- 进入条件:
- 从 L0 检测到错误(CRC 错误、Rx 缓冲区溢出等)。
- 从 L0 发起速度变更请求(例如从 Gen2 升到 Gen3)。
- 从 Configuration 进入(Gen3 需要先进入 Recovery 进行 Equalization)。
- 行为:
- Recovery.RcvrLock: 重新建立位锁定和符号锁定。
- Recovery.Speed: 执行速度协商(Gen3 的 Equalization 过程在此阶段完成)。
- Recovery.Idle: 等待进入 L0。
- 退出条件:
- 成功完成速度协商和 Equalization → 进入 L0。
- 超时或 Equalization 失败 → 回退 Detect 或降级到 Gen2 后进入 L0。
3.3.5 L0 状态
目的: 正常数据传输状态,链路全速运行。
- 进入条件: Configuration 或 Recovery 成功完成。
- 行为: 发送和接收 TLP(事务层包)和 DLLP(数据链路层包)。
- 退出条件:
- 检测到错误 → 进入 Recovery。
- 满足 ASPM 条件 → 进入 L0s 或 L1。
3.3.6 L0s 状态
目的: 低功耗待命状态,允许单个方向快速关断电源以节省功耗。
- 进入条件: 链路空闲且 ASPM(主动电源管理)启用。
- 行为: 发送器进入电气空闲;接收器保持待命。
- 退出条件: 检测到退出 L0s 信号(Electrical Idle Exit)→ 返回 L0。
3.3.7 L1 状态
目的: 低功耗睡眠状态,双向电源关断,延迟比 L0s 更大但功耗更低。
- 进入条件: 链路空闲且 ASPM L1 条件满足,或软件强制进入。
- 行为: 主电源(Vmain)关闭;仅保留辅助电源(Vaux)。
- 退出条件: 接收唤醒信号(Beacon 或 PME 消息)→ 返回 L0。
3.3.8 L2 状态
目的: 深度睡眠状态,主电源完全关闭,仅保留辅助电源用于唤醒逻辑。
- 进入条件: 软件通过 PME_Turn_Off 消息请求。
- 行为: 链路进入电气空闲;Vmain 关闭。
- 退出条件: 复位或唤醒信号 → 进入 Detect。
3.4 状态转换条件汇总表
| 源状态 | 目标状态 | 触发条件 | 典型超时值 |
|---|---|---|---|
| Detect | Polling | 接收器检测成功 | 12ms |
| Polling | Configuration | 8 个连续 TS1/TS2 交换成功 | 24ms |
| Configuration | L0 / Recovery | 宽度协商完成(Gen3 需进入 Recovery) | 24ms |
| Recovery | L0 | 速度协商 + Equalization 成功 | 24ms |
| L0 | Recovery | 错误检测 / 速度变更请求 | — |
| L0 | L0s | ASPM 空闲条件 | — |
| L0s | L0 | 退出 L0s 信号 | — |
| L0 | L1 | ASPM L1 条件 / 软件请求 | — |
| L1 | L0 | 唤醒信号 | — |
| L1 | L2 | PME_Turn_Off 完成 | — |
| L2 | Detect | 复位 / 唤醒 | — |
| 任何状态 | Detect | 超时 / Hot Reset | 24ms(通用) |
3.5 Gen3 特有的 Recovery 子状态
Gen3 链路训练与 Gen1/Gen2 最大的区别在于 Equalization(均衡) 过程。Equalization 完全在 Recovery 状态内完成,包含以下子阶段:
3.6 状态转换的代码级观察
在驱动调试中,可以通过读取 PCI Express Capability Structure 中的 Link Status Register 来观察当前 LTSSM 状态:
// 读取链路状态寄存器(Offset 0x12 在 PCIe Capability 中)
// 假设 dev 是 pci_dev 结构体指针
u16 link_status;
pci_read_config_word(dev, dev->pcie_cap + PCI_EXP_LNKSTA, &link_status);
// 提取 LTSSM 状态(位 12:15)
u8 ltssm_state = (link_status >> 12) & 0x0F;
// 状态码映射
const char* ltssm_state_names[] = {
[0x00] = "Detect",
[0x01] = "Polling",
[0x02] = "Configuration",
[0x03] = "L0",
[0x04] = "L0s",
[0x05] = "L1",
[0x06] = "L2",
[0x07] = "Recovery",
[0x08] = "L2 Idle",
[0x09] = "Hot Reset",
[0x0A] = "Disable",
[0x0B] = "Loopback"
};
printk(KERN_INFO "Current LTSSM state: %s (0x%x)\n",
ltssm_state_names[ltssm_state], ltssm_state);
// 检查链路速度(位 0:3 的另一个字段)
u8 link_speed = link_status & 0x0F;
printk(KERN_INFO "Current link speed: Gen%d\n", link_speed);
3.7 常见状态转换故障模式
| 故障现象 | 卡住状态 | 可能原因 | 排查手段 |
|---|---|---|---|
| 链路无法训练 | Detect | 接收器检测失败、参考时钟缺失、复位信号异常 | 示波器测量时钟、检查复位时序 |
| 反复进入 Detect | Detect ↔ Polling | 信号完整性差、AC 耦合电容问题、阻抗不匹配 | 眼图测试、TDR 测量 |
| 卡在 Polling | Polling | 位锁定失败、TS1 序列未收到、极性反转未处理 | 逻辑分析仪抓取 TS1 |
| 卡在 Configuration | Configuration | Lane 编号协商失败、宽度降级逻辑错误 | 检查 Lane 映射寄存器 |
| Gen3 训练超时 | Recovery.EQ | Equalization 系数协商失败、Preset 不匹配 | 读取 EQ 控制寄存器、检查 Preset 值 |
| 链路降级到 Gen2 | Recovery → L0 | Gen3 EQ 失败后自动降级 | 检查 Link Status 2 的 EQ 完成位 |