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

如何强制linux内核枚举PCI-e总线?,linux,configure,fpga,pci-e,Linux,Configure,Fpga,Pci E,Linux内核2.6 我有一个fpga,它通过GPIO加载,连接到运行linux的开发板上。 fpga将通过pci express总线发送和接收数据。然而,这是列举的 在引导时,也就是说,没有发现任何链接(因为引导时没有加载fpga) 如何在linux中强制重新枚举pci-e总线? 是否有一个简单的命令,或者我必须进行内核更改? 我需要热插拔pcie设备的功能 我想知道您在哪个平台上:x86系统上的一个解决方法(也称为hack)是让BIOS基本上静态地配置一个PCI设备,无论FPGA通常位于什么

Linux内核2.6

我有一个fpga,它通过GPIO加载,连接到运行linux的开发板上。 fpga将通过pci express总线发送和接收数据。然而,这是列举的 在引导时,也就是说,没有发现任何链接(因为引导时没有加载fpga)

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

我想知道您在哪个平台上:x86系统上的一个解决方法(也称为hack)是让BIOS基本上静态地配置一个PCI设备,无论FPGA通常位于什么总线、设备、功能上,然后操作系统将枚举该设备并为其保留PCI空间(即使该设备实际上并不在那里)。然后在您的设备驱动程序中,您将不得不做一些额外的事情,如在fpga编程后手动设置条和int行。当然,这需要修改BIOS,如果您与BIOS供应商合作,您可以与他们签订合同,让他们为您进行此更改,如果您不与BIOS供应商合作,那么这将非常困难。。。还要记住,我在x86上开发VxWorks,我们有一个AMI为我们的主板定制BIOS

如果你没有BIOS,那么考虑在Bootloader中编程它,你就已经具备了从磁盘中读取的能力,并且添加GPIO能力可能不是太困难(假设你正在使用JTAG和GPIOs?),事实上取决于你使用的Bootloader,它可能已经能够做GPIO了?p> 修改内核来实现这一点的问题是,在PCI枚举之前,您必须找到读取位文件的最佳位置。。。例如,如果磁盘设备驱动程序在PCI之后初始化,那么显然您必须对内核进行一些根本性的更改,以便在PCI枚举之前读取位文件,这可能会导致其他恼人的问题


您可能已经发现了另一个选项,它实际上只适合于开发时间:打开系统电源,对fpga板进行编程,然后进行重置(无电源循环,例如:sudo立即重新启动),fpga应该保持其配置,linux应该枚举它

作为root用户,请尝试以下命令:

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

有关更多信息,请参阅此链接:

打开计算机后,BIOS将枚举PCI总线并尝试满足所有IO空间和内存映射IO(MMIO)请求。它最初设置这些条,当操作系统加载这些条时,操作系统可以根据需要更改这些条,同时PCI总线驱动程序再次枚举总线。系统的超级用户甚至可以在BIOS已尝试配置这些条并加载操作系统后运行命令
setpci
,以更改这些条(如果操作不当,可能会导致驱动程序失败和其他一些不好的事情)

我必须这样做,以防BIOS没有为相关卡分配任何资源,因为请求的区域需要64位地址,BIOS仅使用32位地址分配操作。我能够在事后将这些地址(最初由BIOS分配)更改为我认为合适的任何地址,插入内核模块,我的驱动程序将映射并使用这些新分配的卡地址,而不知道它们之间的差异

热插拔PCI Express卡存在的问题是,如果主板/背板上没有特定的热插拔控制器,插槽本身的电源就无法打开/关闭。如果没有这些热插拔控制器来关闭插槽的电源,则在实际插入和/或拔出卡时,如果电源仍然存在,可能会导致微小引脚之间短路。但是,热插拔事件可以由任意一端(主机或端点设备)启动。情况似乎并非如此,但是,如果您的FPGA已经与根复合体建立了链接,那么问题的一个可能解决方案是生成热插拔中断,从而导致操作系统中的总线重新扫描


不过,有一个主要问题——如果您的卡实际上没有获得到根复合体的链接,它将无法生成任何热插拔事件;这似乎是事实。引导后,FPGA应切换PCIe总线上的PRESENT线路,以告知操作系统有一个卡可供枚举。一旦检测到,操作系统应尝试建立到卡的链接,并为设备分配内存区域。操作系统枚举该卡后,您将能够针对该卡加载驱动程序,并在
lspci
中看到它。您声明您正在使用内核2.6,它确实支持热插拔和动态资源分配,因此只要您的FPGA也支持切换当前PCIe线路,这种方法就可以工作。

设备驱动程序不应该处理这个问题吗?不,似乎pci-e驱动程序只会在引导时自动枚举,如果启动后设备被插入,什么也不会发生。lspci显示没有设备,也没有设备文件存在。我认为答案是“没有”,尽管我很愿意错。Altera似乎有一种变通方法,谷歌称之为“Altera FPGA通过协议配置”。如果我对本文的理解正确,Altera在(某些?)Stratix V设备中提供了一个闪存,该闪存始终可用于PCIe总线枚举,而大部分FPGA可能会在空闲时(重新)编程。我们目前正在做的是使用最小的QEMU示例:重新启动循环。这是一个Marvell ARM平台,充当Altera Arria II fpga的控制器板。我还认为可以修改内核,使其在枚举之前加载fpga。我不确定这是否可行。关于引导加载程序mods,还有一件事:如果你的引导加载程序不是