PCI-E链路宽度协商在哪里发生?


8

我正在尝试诊断系统中性能不佳的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插槽协商,还是在驱动程序中的某处发生?

(如果发现这是一个明显的答案,请原谅我……尝试诊断一周后,我的想法有些沮丧。)

Answers:


17

它是在电气级别完成的,而不是通过软件完成的。上面列出的两个寄存器LNK_CAP和LNK_STA是正确标记为“这是链接所能执行的操作”和“此处为当前状态”的内容。还有SLT_CAP和SLT_STA,可能值得一看,因为它特定于机器中的给定“插槽”。

PCIe规范定义了LTSSM-链接训练和状态状态机。在PHY /设备级别上,这是确定两个设备都支持的最大速度,两个设备都支持的最大链路宽度的地方,这也是处理极性反转/通道反转的地方(为了使布局更简单,我们允许P / N,以此类推)。

在此处输入图片说明

这些设备相互发送已知的,有序的符号集,并且硬件以2.5GT / s的速度递增。有些变速命令可以相互发送,这也是定义通道均衡设置的地方。

如果您以错误的速度进行链接,则可能是PCIe根端口配置错误,或者存在信号完整性问题,迫使链路宽度减小。以我的经验,如果您以5 GT / s而不是8 GT / s的速度连接,那更多的是SI问题-以x4 8 GT / s而不是x8 8 GT / s的速度连接似乎是一个配置问题,或将卡添加到不支持x8宽度的插槽中。

根复杂功能寄存器(偏移量04h)将显示支持的最大宽度,这可能有助于诊断。IIRC -x将转储配置空间的前4K,-xx或-xxx将转储PCIe扩展配置空间。如果您将整个配置空间转储到此处/ pastebin,我可能会为您进行挖掘,但是Linux在解码寄存器的作用方面做得不错。


2
我不确定该答案的更刺激之处-如此详尽(严重,它很漂亮,并且我喜欢学习新事物),或者它在大约5分钟内帮助我解决了问题。我最终不得不修改开发板上的配置-这是一个开发板,看起来好像在某个时候被重置了。
tonysdg '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.