gpt4 book ai didi

linux-kernel - 如何对 PCIe 总线进行 TRUE 重新扫描

转载 作者:行者123 更新时间:2023-12-03 14:13:55 30 4
gpt4 key购买 nike

我有一个 FPGA(就像大多数问这个问题的人一样),它在我的 Linux 内核进行初始 PCIe 总线扫描和枚举之后进行配置。您可以猜到,FPGA 实现了一个 PCIe 端点。
我想让 PCIe 内核重新枚举整个 PCIe 总线,这样我的 FPGA 就会显示出来,我可以加载我的驱动程序模块。我还希望能够为不同的配置交换 FPGA 负载。我的意思是我希望能够:

  • 引导 Linux
  • 配置FPGA
  • 枚举 PCIe 端点和加载模块
  • 移除 PCIe 端点
  • 重新配置 FPGA
  • 重新枚举 PCIe 端点

  • 无需重启 Linux
    以下是其他地方提出的解决方案,但并未解决问题。 echo 1 > /sys/bus/pci/rescan这似乎有效(仅有时),如果我想在首次枚举 FPGA 负载后对其进行热交换,则它不起作用。
    可以使用 PCIe 的热插拔/电源管理工具来完成这项工作吗?如果是这样,是否有任何关于如何将 Hotplug 系统与 PCIe 一起使用的好资源? (LDD并没有完全覆盖它)

    最佳答案

    这实际上取决于 FPGA 上发生的变化。问题在于如何完成 PCIe 枚举和地址分配,尤其是如何配置 PCIe 开关。分配必须作为深度优先搜索一次完成。完成后,如果不更改所有后续分配,就无法插入额外的总线编号或地址空间,这将需要重新加载所有相应的设备驱动程序。基本上,一旦枚举了总线并分配了地址,您就无法在不重新枚举整个总线的情况下更改整体分配,这需要重新启动。在特定 PCIe 端口上预分配资源可以缓解此问题,并且是 PCIe 热插拔所必需的。
    如果 PCIe BAR 配置未更改,则通常执行删除/hot reset/rescan 就足够了,不需要重新启动。
    如果 BAR 配置发生了变化,那就另当别论了。如果新的 BAR 更小,那么应该没有问题。但是如果新的 BAR 更大或者有更多的 BAR,如果没有足够的地址空间分配给设备所连接的交换机端口,那么这些 BAR 将无法分配地址空间,设备将无法枚举。在这种情况下,需要重新启动才能重新分配资源。不要忘记还有 32 位 BAR 和 64 位 BAR,这些 BAR 是从两个不同的地址空间池中分配的,因此更改 BAR 类型也可能需要重新启动才能重新枚举。
    如果您要从无设备到设备(即空白 FPGA 到已配置的 FPGA),则可能需要重新分配总线编号,这需要重新启动。

    关于linux-kernel - 如何对 PCIe 总线进行 TRUE 重新扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32334870/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com