Linux kernel 如何对PCIe总线进行真正的重新扫描

Linux kernel 如何对PCIe总线进行真正的重新扫描,linux-kernel,linux-device-driver,pci-e,hotplugging,Linux Kernel,Linux Device Driver,Pci E,Hotplugging,我有一个FPGA(像大多数问这个问题的人一样),它在我的Linux内核进行初始PCIe总线扫描和枚举后进行配置。您可以猜到,FPGA实现了一个PCIe端点 我想让PCIe核心重新枚举整个PCIe总线,这样我的FPGA就会出现,我可以加载我的驱动程序模块。我还希望能够将FPGA加载换成不同的配置。我的意思是,我希望能够: 引导Linux 配置FPGA 枚举PCIe端点和加载模块 卸下PCIe端点 重新配置FPGA 重新枚举PCIe端点 所有这些都不需要重新启动Linux 以下是其他地方提出的解决方

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

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

  • 引导Linux
  • 配置FPGA
  • 枚举PCIe端点和加载模块
  • 卸下PCIe端点
  • 重新配置FPGA
  • 重新枚举PCIe端点
  • 所有这些都不需要重新启动Linux

    以下是其他地方提出的解决方案,但并不能解决问题

    echo 1>/sys/bus/pci/rescan
    这似乎是可行的(只是有时),如果我想在首次枚举FPGA负载后对其进行热交换,它就不起作用了


    能否使用PCIe的热插拔/电源管理设施来实现此功能?如果是这样的话,对于如何将热插拔系统与PCIe一起使用,是否有好的资源?(LDD没有完全覆盖它)

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

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

    更好的解决方案是只重新扫描连接FPGA的节点。这降低了对系统的总体影响

    此技术用于FPGA云系统。

    来自医生

    下面是如何在windows中重置之前重置Vegas。这基于供应商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
    
    它的输出放入
    /etc/rc.local
    ,以在启动后重置Vegas,类似于devcon重启脚本

    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"
    

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

    如果PCIe条配置未更改,则通常执行移除//重新扫描即可,无需重新启动

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


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

    查看PCIe热插拔机制。新内核支持它。实际上,根据你的意见,霹雳将如何工作?这里也是一样。您是在主机上还是在Xen VM中执行
    重新扫描
    ?Xen在重新扫描PCIe树时遇到问题,并在过去崩溃。我不知道它是否解决了。我想知道你使用的是什么基本硬件。根据我对商用级主板的经验,
    rescan
    方法很少奏效。我采用了部分重新配置的方法来解决这个问题(通过不重新使用)@Paebbels@whh4000你能分享你的设置吗?据我所知,它独立于硬件。枚举已经由BIOS/UEFI完成,第二次由内核完成。如果系统支持重新扫描,则与内核软件和对特定平台的支持有关(根复杂驱动程序,…)。还有一个问题是,内核和驱动程序是否支持在重新组装PCI树之前在短时间内对其进行分解。源代码的主要版权不是我的,但我会转发你的请求。@Claudio一般的设置是一个“云系统”,用户可以在其中分配FPGA资源。有一个登录节点,您可以在其中分配FPGA、编程FPGA、启用ChipScope转发、注册PCI驱动程序并释放FPGA。在未来的状态中,its计划为每个用户分配一个VM,也为集成GPU分配一个VM。是否可以重新扫描特定的总线(以便我们不会干扰其他设备)?应该可以通过
    echo 1>“/sys/bus/pci/devices/$port/rescan”
    实现,如下所述: