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

问题描述 投票:0回答:2

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

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

此时,当我运行

lspci
-> 它什么也没有返回。 当我第一次按照建议执行
echo "1" > /sys/bus/pci/rescan
herehere 然后
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。

linux-kernel embedded-linux pci-e
2个回答
0
投票

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


0
投票

你还需要这个吗? 在 Linux 提示符下尝试:

Linux> sudo echo 1 | sudo tee /sys/bus/pci/rescan

© www.soinside.com 2019 - 2024. All rights reserved.