27

我有一个 FPGA(就像大多数问这个问题的人一样),它在我的 Linux 内核进行初始 PCIe 总线扫描和枚举之后进行配置。您可以猜到,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 负载后对其进行热交换,则它不起作用。

可以使用 PCIe 的热插拔/电源管理工具来完成这项工作吗?如果是这样,是否有任何关于如何将 Hotplug 系统与 PCIe 一起使用的好资源?(LDD并没有完全覆盖它)

4

3 回答 3

18

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

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

更好的解决方案是仅重新扫描 FPGA 所连接的节点。这减少了对系统的整体影响。

该技术用于RC3E FPGA 云系统。

于 2015-09-01T20:44:17.940 回答
3

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

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

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

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

于 2020-10-08T00:22:40.563 回答
0

From The Doctor

Here is how to reset the Vegas before same as a reset in windows. This is based on the Vendor ID.

lspci -n | grep 1002: | egrep -v ".1"| awk '{print "find /sys | grep ""$1"/rescan" -| tac -;"}' | sh - | sed s/^/echo\ 1\ >\ "&/g | sed s/$/"/g

The output of that put in your /etc/rc.local to reset your Vegas after bootup similar to the devcon restart script.

echo 1 > "/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1d.0/0000:06:00.0/rescan"
echo 1 > "/sys/devices/pci0000:00/0000:00:1d.1/0000:07:00.0/rescan"
于 2018-07-16T21:13:56.030 回答