我正在我的服务器上进行一些测试,并想降低我的 PCIe 设备(或其 PCIe 桥)的宽度。
如果相关的话,我弄清楚了如何根据 PCI 规范使用 Linux 的 setpci 并更改 Link Control 2 Register 的“目标链接速度”来降低速度。这使我能够从 8GT/s 降至 5GT/s 甚至 2.5GT/s。
下面是一个工作示例:
Server:~ # setpci -s 83:04.0 98.w=1:ff
Server:~ # setpci -s 83:04.0 78.w=20:20
Server:~ # ./check_speed_width
84:00.0 has reported reduced PCIe speed: 2.5GT/s instead of 8GT/s
bridge device 83:04.0 has reported reduced PCIe speed: 2.5GT/s instead of 8GT/s
Server:~ # setpci -s 83:04.0 98.w=2:ff
Server:~ # setpci -s 83:04.0 78.w=20:20
Server:~ # ./check_speed_width
84:00.0 has reported reduced PCIe speed: 5GT/s instead of 8GT/s
bridge device 83:04.0 has reported reduced PCIe speed: 5GT/s instead of 8GT/s
到目前为止,我对降低宽度的一些想法是:
也许我只是错过了一个可写寄存器?目标链接速度是一个具有读写功能的寄存器。说到宽度寄存器,我只看到 PCI 规范中列出的只读寄存器。
也许有一种方法可以禁用一些与 PCIe 规范无关的通道?
我知道如果出现问题,设备可以训练/初始化到较低的宽度。那么也许我可以向特定车道注入错误并导致其丢弃车道?