如何告诉linux重新培训和扫描PCIe总线



我们有一个嵌入式板,它有一个iMX8M Plus处理器和Linux v4.4.161。该板有一条PCIe总线,该总线连接到FPGA。当我们给板通电时,FPGA尚未配置,因此它的行为就好像它不在PCIe总线上一样。

一旦Linux完全启动,我们配置FPGA,然后它才开始充当PCIe端点(设备(。

此时,当我运行lspci->它什么也不回。当我第一次按照这里和这里的建议执行echo "1" > /sys/bus/pci/rescan,然后执行lspci时,我仍然一无所获。

但是,如果我在没有重置FPGA的情况下重新启动linux,它就会开始在lspci列表中可见。重启linux对我们来说不是一个选择。不知何故,我需要告诉linux,无论它在启动时做什么,请在运行时再做一次。但到目前为止,我还找不到解决这个问题的办法。

根据德克萨斯仪器支持论坛的说法,他们表示,如果PCIe链路在启动时没有经过训练,rescan命令将永远无法工作。

在引导时,当linux加载一个pci驱动程序时,它试图建立一个PCIe链接,我可以看到,通过示波器,PERST引脚被断言并生成PCIe_CLK一段时间,然后如果它无法检测到任何设备,就会停止。但是rescan命令从来没有这样做过。

此外,在系统中没有pcie设备来执行echo 1 > $pcidevice/remove以使rescan起作用。或者没有像echo 0 > /sys/bus/pci/slots/.../power那样的设备或总线来设置电源关闭和打开

我还了解到,在旧的linux时代(v2.6(有一种方法叫做添加一个物理上不存在的假PCIe设备来解决这个问题。为此,我从一个旧的linux repo中获取了fakephp.c驱动程序,并将其移植到我们的上。在解决了几个不推荐使用的函数问题后,它被编译为Linux内核v5.4。modprobe fakephp工作正常,加载了驱动程序,但不知何故,我的设备列表中没有这个假设备。这里提到,由于PCI核心具有类似的功能,fakephp驱动程序已从主流linux中删除,但他从未提及如何删除。

简而言之,我被困在这里,我需要我的FPGA在lspci列表中可见,而无需重新启动linux。

我建议在u-boot中配置FPGA以避免这些问题。将SPI引脚连接到FPGA的配置引脚&在从属配置模式下运行。

相关内容

  • 没有找到相关文章

最新更新