版块:高速接口

"掉速到 Gen1""AER 报 Correctable""偶发 Malformed TLP"——PCIe 问题看着玄,其实从训练到运行每一步都有明确的状态机和错误分类。这篇按"建链→运行→报错"三层梳理排查路径。

一、建链:LTSSM 状态机决定你卡在哪

链路训练经过 Detect → Polling → Configuration → L0;异常兜圈说明问题层级不同:

1. 卡在 Detect:物理层连接问题——REFCLK 是否有、对端是否上电、AC 耦合电容、lane 极性反/顺序错(极性反转 LTSSM 会自己倒相,但 lane 反序要靠 config 里的 lane reversal 支持);
2. Polling 反复:速率协商/均衡失败。Gen3+ 的 EQ 阶段看两端 preset/de-emphasis 组合,长走线(>10 inch 或过 2 个 via)先按 spec 的参考 loss budget 核,不够就调 TX preset;
3. Configuration 兜圈:lane 数不对齐(x16 slot 只见到 x4)、或热插拔 config 空间问题;
4. 建链成功但掉回低速:进入 L0 后的 SRIS/SRNS 时钟架构不匹配、时钟漂移超界、或接收端 CTLE 裕量差。

lspci / 工具侧:setpci 读 Lane Status/Link Status 寄存器可看到每 lane 的训练结果,比只看速率信息量大得多。

二、运行:错误分类决定优先级

PCIe 错误三大桶(spec 明确分类):

| 类别 | 典型事件 | 严重性判定 |
|------|----------|-----------|
| Correctable | Bad TLP、Bad DLLP(LCRC 错重传)、Replay Timeout | 单独看可容忍,看频率趋势 |
| Uncorrectable Non-fatal | Bad DLLP 以外的 LCRC 重传耗尽、Completion Timeout(部分配置) | 影响单业务,可复位恢复 |
| Uncorrectable Fatal | Malformed TLP(协议违例)、ECRC 失败(数据真坏了)、 Surprise Down | 整设备复位,查硬件 |

AER 寄存器读法:Root Port 的 Device Status 里 fatal/non-fatal 哪个置位,配合 Header Log(坏 TLP 前 4 DW)定位请求方。Header Log 解析出是读还是写、请求方 BDF,直接决定是"下游 GPU/NIC 发疯"还是"上游 Root Port 误判"。

三、排查顺序(现场验证)

1. 先看 OS/kernel log 的第一现场时间戳:开机即报 = DPC/SR-IOV 配置或插槽物理问题;运行中偶发 = 看负载相关性(带宽压满就报 → SI 裕量不足;特定温度后报 → 供电/时钟);
2. Correctable 增速(/sys/bus/pci devices aer_dev_correctable):> 1/天的速率要治理,不要等 Fatal;治理动作按成本排序:换/重插卡(金手指氧化是真实高发源)→ 重设 Retimer/Preset → 降 Gen 速度验证 → 查 100M 参考时钟抖动;
3. Retimer 平台(Gen5 服务器):看 retimer 自身的 EQ 收敛报告和 PRBS 计数,把"主板走线段"和"线缆/连接线段"分开定罪;
4. Completion Timeout 高发:先怀疑对设备挂死/热插拔中拔出,再怀疑 BIOS 设的 40ms-500ms 档位对慢设备太短。

四、设计端预防清单(对嵌入式/底板开发者)

- REFCLK:用展频时钟时确认对端支持 SRIS/SRNS 方案与 jitter spec;
- 走线:配对等长按 spec(Gen5 对内 skew 要求极严),换层配地 via;
- 电源:12V 主轨去耦按 datasheet 的 PDN target impedance,别省大容量;
- 复位:PERST# 时序(上电后释放时间)不达标 = "有时能识别有时不能"的经典成因;
- 金手指:反复插拔的验证板做"氧化环境+插拔寿命"测试,量产故障率会给你惊喜。

有过 Gen5 retimer/EQ 调参经验的同事欢迎回帖,特别想听听你们怎么做 preset 遍历的自动化。