我正在尝试诊断系统中性能不佳的 PCI-E 卡,并且我意识到它正在协商错误的链路宽度。具体来说,通过运行lspci -vv
,我看到:
LnkCap: Port #1, Speed 8GT/s, Width x8, ASPM L1, Exit Latency L0s <4us, L1 <4us
ClockPM- Surprise- LLActRep- BwNot-
尽管
LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
我的问题是:这种协商是在硬件层面还是软件层面发生的?换句话说,卡是否直接与 PCI-E 插槽协商,或者这是否发生在驱动程序的某个地方?
(如果这是一个显而易见的答案,请原谅我......在尝试诊断这个问题一周后,我的脑子有点疲惫了。)
答案1
它是在电气层面上完成的,而不是通过软件完成的。上面列出的两个寄存器 LNK_CAP 和 LNK_STA 就是您正确指出的“这是链接能够执行的操作”和“这是当前状态”。还有 SLT_CAP 和 SLT_STA,它们可能值得一看,因为它们特定于机器中的给定“插槽”。
PCIe 规范定义了长期稳定系统管理模块-- 链路训练和状态机。在 PHY/设备级别,这决定了两个设备支持的最大速度、两个设备支持的最大链路宽度,也是处理极性反转/通道反转的地方(为了使我们的布局更容易,规范允许交换 P/N 等)。
设备之间会相互发送已知、有序的符号集,硬件会以 2.5GT/s 的速度运行。可以相互发送速度更改命令,这里还可以定义通道均衡设置。
如果您以错误的速度进行连接,则可能是 PCIe 根端口配置错误,或者存在信号完整性问题,导致链路宽度较低。根据我的经验,如果您以 5 GT/s 而不是 8 GT/s 的速度进行连接,则这更像是 SI 问题 - 以 x4 8 GT/s 而不是 x8 8 GT/s 进行连接似乎是配置问题,或者可能是将卡添加到不支持 x8 宽度的插槽。
根复合体功能寄存器(偏移量 04h)将显示支持的最大宽度,这可能有助于您的诊断。如果我没记错的话,-x 将转储前 4K 配置空间,-xx 或 -xxx 将转储 PCIe 扩展配置空间。如果您在此处转储整个配置空间/将其粘贴到 pastebin 中,我可能会为您深入研究,但 Linux 在解码寄存器的功能方面做得不错。