如何能在Linux内核被迫枚举PCI-E总线?(How can the linux kernel b

2019-06-28 09:05发布

Linux内核2.6

我已经对GPIO连接到开发板运行Linux的加载的FPGA。 在FPGA将发送,并通过PCI-Express总线接收数据。 然而,这是在引导列举,因此,没有链接发现(因为FPGA是不是在引导加载)。

我怎么能强制PCI-E总线的重新枚举在Linux? 有一个简单的命令,否则我将不得不做出改变内核? 我需要热插拔PCIe设备的能力。

Answer 1:

我不知道你是什么平台上:一个解决(又名黑客)对于这一点,在x86系统上的工作原理是,让BIOS基本上是静态配置在任何总线,设备,功能的FPGA通常土地上的PCI设备,那么操作系统将枚举设备,并预留PCI空间为它(即使该设备是不是真的存在)。 然后在你的设备驱动程序,就必须做一些额外的事情一样设置酒吧和FPGA编程后手动诠释线。 当然,这需要修改BIOS,而如果你是一个BIOS供应商工作,你可以承揽他们做出这个改变对你,如果你不与BIOS供应商合作那么这将是非常困难......也请记住我是工作在x86 VxWorks的,我们有一个AMI使自定义BIOS我们的板...

如果没有BIOS,然后再考虑它在引导程序编程,还有你已经从磁盘中读取的能力,并增加GPIO功能可能不是太困难(假设你使用JTAG和个GPIO?),在其实这取决于你用什么引导程序就可能已经能够做到GPIO?

与修改内核这样做的问题是,你必须要找到甜蜜点,你可以读比特文件,在PCI枚举前...。例如,如果磁盘设备驱动程序PCI初始化后,那么很明显,你必须做一些内核彻底改变只是为了阅读之前PCI枚举比特文件,这可能会导致其他恼人的问题...

你可能已经发现了另外一个选择,并且这是真的只确定了开发时间:打开系统电源,程序FPGA开发板,然后做一个复位(无动力循环,例如:命令立即重启),FPGA的应保持它的配置和Linux应该枚举它...



Answer 2:

作为根,请尝试以下命令:

echo "1" > /sys/bus/pci/rescan

请参阅此链接了解更多信息: http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci



Answer 3:

打开电脑后,BIOS枚举PCI总线并试图满足所有IO空间和内存映射IO(MMIO)的请求。 据这些BAR的初步建立,并在操作系统加载这些BAR的可由OS,因为它认为合适的,而PCI总线驱动程序再次枚举总线进行调整。 该系统的超级用户身份运行命令甚至可以setpci后的BIOS已经尝试对它们进行配置和OS加载改变这些BAR的(如果做得不当可能会导致驱动器出现故障和其他一些不好的东西)。

我不得不这样做在有问题的卡,因为该地区的请求的需要一个64位的地址和BIOS只有32位地址分配操作不是由BIOS分配的任何资源的情况。 我能进去后 - 事实上,改变这些地址(最初是由BIOS分配),以我认为合适的任何地址,插入内核模块,和我的司机将映射并使用这些新分配的地址卡,而不知道的差异。

与热插拔PCI-Express卡存在的问题是,电力到槽本身不能被接通/关断,而不需要在主板上/背板存在特定热插拔控制器。 不具有这些热插拔控制器打开插槽的电源,可能导致微小的销之间的短路当卡被物理地插入和/或删除,如果功率是否仍然存在。 热插拔事件,但是,可以通过任一端(主机端点设备)发起。 这似乎并没有这样的情况,但是如果你的FPGA已经与根联合体建立了一个链接,一个可能的解决方案,您的问题将产生热插拔中断导致操作系统中的总线重新扫描。

还有一个重大的问题,虽然 - 如果你的卡实际上没有获得一个链接到根联合体,它不能够产生任何热插拔事件; 这似乎是这样。 开机后,FPGA应触发PCIe总线上线告诉OS有一个卡准备枚举。 一旦检测到操作系统应尝试建立一个链接到该卡,并指定内存区域的设备。 操作系统列举了卡后,您就可以加载驱动程序对,看看它在lspci 。 你说你正在使用2.6内核,它确实有热插拔和动态资源分配的支持,以便为您的FPGA支持切换本的PCIe线的能力,这种方法应该工作多长时间了。



文章来源: How can the linux kernel be forced to enumerate the PCI-e bus?