有没有办法要求Linux内核重新运行其PCI初始化代码?

时间:2009-12-01 17:02:20

标签: linux linux-kernel linux-device-driver pci

我正在寻找一个内核模式调用,我可以通过驱动程序,userland实用程序或系统调用来请求内核查看PCI总线并完全重新运行其初始化,或者初始化特定设备。具体来说,我需要内核识别启动后添加到总线的设备,然后配置其地址空间,中断和其他配置参数,最后启用设备以便我可以为其加载驱动程序(除非这一切作为驱动程序负载的一部分发生。)

我为此坚持2.4.x系列内核,目前正在使用2.4.20,但如果重要的话将会转向2.4.37。这个发行版是一个在ram磁盘上运行的Red Hat 7.3,但我可以添加任何工具来实现这个功能(只要它们与2.4系列配合使用)。

如果某些背景有助于澄清我正在尝试做的事情:从冷启动开始,一旦在Linux中,我就使用GPIO对FPGA进行编程。 FPGA的一部分,一旦编程,就实现了一个简单的PCI设备。目前,在对FPGA进行编程之后,我重新启动系统,Linux启动后识别设备并为其加载驱动程序。

而不是需要重新启动,我想简单地要求内核在启动时做任何事情以找到PCI设备(我已将内核配置为自行查找PCI设备) ,而不是向BIOS询问该信息,所以BIOS不需要知道这个设备(我希望)。)

我相信Linux能够在设置之后但在重启之前看到设备,因为scanpci会在我编程后显示设备,lspci -H 1也是如此。我只需要一种方法将其导入/proc/pci,配置并启用。

4 个答案:

答案 0 :(得分:3)

如果您不知道如何重做PCI扫描,可以使用kexec加快重启速度。你可以在LKML上问这个问题,如果你还没有。

卸载/重新加载模块没有用,是吗?

答案 1 :(得分:3)

以下命令将帮助用户重新扫描完整的根集线器。

echo "1" > /sys/class/pci_bus/0000\:00/rescan

答案 2 :(得分:2)

http://www.linuxjournal.com/article/5633建议你应该能够使用pcihpfs使用2.4内核来完成它。

如果不起作用,也许驱动程序不支持hotplug?

答案 3 :(得分:1)

如果您在使用其他PCI设备时重新配置其地址,可能会导致系统崩溃。

更好的方法是配置新卡。如果您的内核支持Cardus设备,它已经知道如何配置新插入的PCI设备(这就是Cardbus的设备)。你只需要弄清楚如何让内核去做...

内核模块应该可以这样做。即使您无法获得内置的热插拔代码,也应该能够使用pci_bus_write_config_dword()和朋友的呼叫来设置pci资源。可能还有一些IRQ路由设置。