一尘不染

如何强制Linux内核枚举PCI-e总线?

linux

Linux内核2.6

我有一个通过GPIO加载的fpga,该GPIO连接到运行Linux的开发板。fpga将通过pci-
express总线发送和接收数据。但是,这是在启动时枚举的,因此,未发现任何链接(因为在启动时未加载fpga)。

如何在Linux中强制重新枚举pci-e总线?是否有一个简单的命令,或者我必须进行内核更改?我需要热插拔PCIe设备的功能。


阅读 617

收藏
2020-06-07

共1个答案

一尘不染

我想知道您使用的平台是什么:要在x86系统上运行,可以解决此问题(也称为hack)是让BIOS基本上在FPGA正常运行的任何总线,设备,功能上静态配置PCI设备。枚举设备并为其保留PCI空间(即使设备并不真正存在)。然后,在设备驱动程序中,您必须做一些额外的事情,例如在对fpga进行编程之后手动设置BAR和int行。当然,这需要修改BIOS,如果您与BIOS供应商合作,则可以与他们签约以为您进行更改;如果您与BIOS供应商合作,则将更加困难…也请记住我在x86上使用VxWorks进行工作,我们有一个AMI为我们的主板制作了自定义BIOS

如果没有BIOS,则考虑在引导加载程序中对其进行编程,那里已经可以从磁盘读取数据,并且添加GPIO功能可能不太难(假设您正在使用jtag和GPIO?),事实取决于您使用的引导加载程序可能已经可以执行GPIO?

修改内核以执行此操作的问题在于,必须在PCI枚举之前找到可以读取位文件的最佳位置…例如,如果磁盘设备驱动程序在PCI之后初始化,那么显然您必须执行一些操作仅在PCI枚举之前读取位文件而对内核进行的彻底更改,这可能会导致其他令人烦恼的问题…

您可能已经发现了另一种选择,并且对于开发时间来说这实际上是唯一可行的选择:接通系统电源,对fpga板进行编程,然后进行复位(例如,无需重新启动电源,例如:sudo现在重启),FPGA应该保持其配置,Linux应该枚举它。

2020-06-07