第3章 常见故障分类
做PCIe DMA驱动这些年,我碰到过形形色色的问题。有的直接挂死,有的性能上不去,有的时而正常时而异常。追根溯源,绝大多数故障逃不出四个大类:链路层、事务层、软件配置和硬件设计。
说得直白点,链路层问题好比路没修通,事务层问题好比快递送错了门,软件配置错是钥匙没拿对,硬件设计缺陷则是这栋楼本身就盖歪了。下面咱们一个一个拆开来聊。
链路层故障
链路层是PCIe的最底层,负责物理连接、信号质量和状态机。你想想看,如果链路都没起来,后面全是白搭。
- LTSSM 卡死:链路训练状态机没走到
L0,一直停在Detect或Polling。我遇到过好几次,都是因为参考时钟没起振,或者复位时序不够长。用逻辑分析仪抓一下 PERST# 就清楚了。 - 时钟抖动超标:REFCLK 抖动太大,链路会频繁降速甚至断开。我记得有一次,板子上一个电容焊反了,导致 100MHz 时钟被严重污染,后来用示波器一看,幅度都变形了。
- 信号完整性问题:眼图不张开,误码率飙升。特别是高速 Gen4/Gen5,走线稍微长了点就会出问题。我的建议是:做板子前一定先仿一下通道。
小贴士:查链路层问题,优先看 lspci -vvv 里的 LnkSta。如果速率只有 2.5GT/s 而不是预期的 8.0GT/s,链路降速了,大概率是信号质量问题。
事务层故障
事务层管的是 TLP(事务层包)的组装、拆分和路由。链路通了但数据传不对,十有八九是这层的问题。
- TLP 格式错误:比如 Memory Read 的
Fmt字段写成了 3DW 需要 4DW 的数据。这种错一般硬件会通过Unsupported Request报出来。我在调试时喜欢在驱动里开Root Port Error Log,直接读Correctable/Uncorrectable Error Status寄存器。 - Completion 超时:CPU发起读请求,结果等不到回应。原因可能是地址写错了、对端没解完,或者中断丢了。我曾经被一个Completion Timeout折磨了两天,最后发现是 MSI 中断配置里的
Multiple Message Capable写成了 0,导致门铃没有被正确清除。 - 地址映射错:DMA 描述符里的物理地址写的是
0x12345678,但对应的PCIe地址空间根本没划给这个设备。系统 IOMMU 会直接给你个PAGE FAULT。
注意:事务层错误经常被驱动误判为“硬件无响应”。如果你发现某个DMA传输一直不完成,先检查 AER Capability 里的 Uncorrectable Error Severity 寄存器,看看有没有被mask掉。
软件配置错误
这一块是我入行时踩坑最多的领域。说白了,很多问题不是因为硬件坏了,而是驱动代码里某个不起眼的位没设对。
| 常见错误 | 典型现象 | 排查切入点 |
|---|---|---|
| BAR 空间未使能 | 读BAR地址全是 0xFFFFFFFF |
检查 PCI_COMMAND 寄存器的 Bus Master 位 |
| DMA 描述符链表指针错 | DMA 只传了一次就停掉了 | 确认描述符的 Next Pointer 是否写了物理地址 |
| 中断路由配错 | 中断函数不被调用,或者一直 spuriously 触发 | 查看 MSI Capability 的 Multiple Message Enable 是否匹配 |
| Max Payload Size 不一致 | TLP 被对端拆包,性能下降 | 比较上下游的 Device Control 寄存器里的 Max_Payload_Size |
我个人习惯是,拿到一个新板子,先用 lspci -xxx 把配置空间完整 dump 下来,对照 spec 走一遍。实践证明,这一步能拦截掉 70% 的软件配置问题。
硬件设计缺陷
这一块最让人头疼,因为一旦投板,几乎没法改。只能通过驱动层规避。
- DMA 引擎状态机 Bug:比如在特定条件下,内部计数器溢出导致死锁。我亲身经历过一个 case:某款 FPGA 实现的 DMA,在连续发 256 次写后就再也不响应了。后来查出是 LFSR 重置逻辑少了一个状态。解决方案是驱动里每 200 次传输就插入一个 dummy 读,强行喂一个时钟。
- Desired 时序不满足:芯片的 PCIe 核要求
PERST#保持低电平 100ms 后才能拉高,但板卡只给了 50ms。结果 10% 的板子无法 link up。可以试试在驱动里延长pciehp的探测时间,但这只是缓兵之计。 - 电源/地平面缺陷:大电流时局部电压掉到 0.9V 以下,SerDes 锁相环失锁。这种问题很难复现,可能需要上热成像仪或者改 layout。
我的经验总结:硬件设计缺陷往往表现为“偶尔出现”、“温度敏感”、“更换某些元件后消失”。如果你遇到这种玄学问题,别急着怀疑软件,先让硬件同事把信号质量和电源纹波报告甩过来。