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

ton*_*sdg 12 pci-express

我正在尝试诊断系统中性能不佳的 PCI-E 卡,但我意识到它正在协商错误的链接宽度。具体来说,从运行中lspci -vv,我看到:

LnkCap: Port #1, Speed 8GT/s, Width x8, ASPM L1, Exit Latency L0s <4us, L1 <4us
        ClockPM- Surprise- LLActRep- BwNot-
Run Code Online (Sandbox Code Playgroud)

尽管

LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
Run Code Online (Sandbox Code Playgroud)

我的问题是:这种协商是发生在硬件层面还是软件层面?换句话说,卡是直接与 PCI-E 插槽协商,还是在驱动程序中发生这种情况?

(如果这是一个明显的答案,请原谅我……在尝试诊断了一个星期之后,我的头脑有点炸了。)

Kru*_*sai 19

它是在电气层面完成的,而不是通过软件完成的。您在上面列出的两个寄存器 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 在解码寄存器的功能方面做得不错。

  • 我不确定这个答案有什么更令人兴奋的地方 - 它非常详细(说真的,这很漂亮,而且我喜欢学习新事物),或者它帮助我在大约 5 分钟内解决了问题。我最终不得不修改我板上的配置 - 这是一个开发板,看起来它在某个时候被重置了。 (3认同)