我们有一块嵌入式板,配有 iMX8M-Plus 处理器和 Linux v5.4.161。该板有一条 PCIe 总线,该总线连接到 FPGA。当我们给开发板加电时,FPGA 尚未配置,因此它的行为就好像它不在 PCIe 总线上一样。
Linux 完全启动后,我们配置 FPGA,然后它才开始充当 PCIe 端点(设备)。
此时,当我运行
lspci
-> 它什么也没有返回。
当我第一次按照建议执行 echo "1" > /sys/bus/pci/rescan
here 和 here 然后 lspci
时,我仍然什么也没得到。
但是,如果我在不重置 FPGA 的情况下重新启动 Linux,它就会开始在
lspci
列表中可见。重新启动 Linux 对我们来说不是一个选择。我需要以某种方式告诉Linux,无论它在启动时做什么,请在运行时再次执行。但到目前为止我还没有找到解决方案。
根据德州仪器 (TI) 支持论坛,他们表示,如果 PCIe 链路在启动时未经过训练,
rescan
命令将永远无法工作。
在启动时,当linux加载pci驱动程序时,它会尝试建立PCIe链接,我可以通过示波器看到,PERST引脚被置位并生成PCIE_CLK一段时间,然后如果检测不到任何设备则停止。但
rescan
命令永远不会这样做。
此外,系统中没有要执行
echo 1 > $pcidevice/remove
以使 rescan
发挥作用的 PCIe 设备。或者没有设备或总线可以像echo 0 > /sys/bus/pci/slots/.../power
那样设置电源关闭和重新打开
我还了解到,在旧的linux时代(v2.6)有一种称为添加物理上不存在的假PCIe设备来解决这个问题的方法。为此,我从旧的 Linux 存储库中获取了
fakephp.c
驱动程序并将其移植到我们的存储库中。在解决了几个已弃用的函数问题后,它是针对 Linux Kernel v5.4 进行编译的。 modprobe fakephp
工作并加载了驱动程序,但不知何故我没有在我的设备列表中找到这个假设备。 这里提到fakephp驱动已经从主流linux中移除了,因为PCI核心也有类似的功能,但他没有提到如何移除。
简而言之,我被困在这里,我需要我的 FPGA 在
lspci
列表中可见,而无需重新启动 Linux。
我建议在 u-boot 中配置 FPGA 以避免此类问题。将 SPI 引脚连接到 FPGA 的配置引脚并在从配置模式下运行。
你还需要这个吗? 在 Linux 提示符下尝试:
Linux> sudo echo 1 | sudo tee /sys/bus/pci/rescan