如何进行TRUE重新扫描PCIe总线

whh*_*000 17 linux-device-driver linux-kernel hotplugging pci-e

在我的Linux内核进行初始PCIe总线扫描和枚举之后,我有一个FPGA(就像大多数人问这个问题一样).您可以猜到,FPGA实现了PCIe端点.

我想让PCIe核心重新枚举整个PCIe总线,这样我的FPGA就会出现,我可以加载我的驱动模块.我还希望能够为不同的配置交换FPGA负载.我的意思是,我希望能够:

  1. 启动Linux
  2. 配置FPGA
  3. 枚举PCIe端点和加载模块
  4. 删除PCIe端点
  5. 重新配置FPGA
  6. 重新枚举PCIe端点

所有这些都没有重启Linux

以下是其他地方提出的解决方案,但没有解决问题.

echo 1 > /sys/bus/pci/rescan 这似乎有效(仅在某些情况下),如果我想在首次枚举后热插拔FPGA负载,它就无法工作.

这是一个相当侵入性的方法(我没有测试过),也有人在其他地方提出过.https://community.freescale.com/thread/305355

可以使用PCIe的Hotplug /电源管理设施来完成这项工作吗?如果是这样,有什么好的资源可以用于如何使用PCIe的Hotplug系统?(LDD并没有完全覆盖它)

Pae*_*els 14

重新枚举PCIe总线/树通过echo 1 > /sys/bus/pci/rescan是正确的解决方案.我们以与您描述的相同的方式使用它.

我们正在使用echo 1 > $pcidevice/remove断开驱动程序与设备的连接并将设备从树中分离.驱动程序(xillybus)没有卸载,只是断开连接.

更好的解决方案是仅重新扫描连接FPGA的节点.这减少了对系统的全部影响.

该技术用于RC3E FPGA云系统.

  • 应该可以通过 `echo 1 > "/sys/bus/pci/devices/$port/rescan"` 来实现,如下所述:https://unix.stackexchange.com/a/474378/191102 (2认同)

ale*_*ich 7

这实际上取决于 FPGA 上的具体更改。问题在于如何完成 PCIe 枚举和地址分配,特别是如何配置 PCIe 交换机。分配必须作为深度优先搜索一次性完成。完成此操作后,不可能在不更改所有后续分配的情况下插入额外的总线号或地址空间,这将需要重新加载所有相应的设备驱动程序。基本上,一旦枚举了总线并分配了地址,您就无法在不重新枚举整个总线的情况下更改总体分配,这需要重新启动。在特定 PCIe 端口上预分配资源可以缓解此问题,并且是 PCIe 热插拔所必需的。

如果 PCIe BAR 配置未更改,通常执行删除/热重置/重新扫描就足够了,无需重新启动。

如果 BAR 配置发生了变化,那么情况就不同了。如果新的 BAR 较小,那么应该没有问题。但是,如果新的 BAR 更大或有更多 BAR,如果没有足够的地址空间分配给设备所连接的交换机端口,则无法为这些 BAR 分配地址空间,并且设备将无法枚举。在这种情况下,需要重新启动才能重新分配资源。不要忘记还有 32 位 BAR 和 64 位 BAR,并且这些 BAR 是从两个不同的地址空间池分配的,因此更改 BAR 类型也可能需要重新启动才能重新枚举。

如果您要从无设备到有设备(即从空白 FPGA 到已配置的 FPGA),则可能需要重新分配总线编号,这需要重新启动。