2009-12-01 19 views
12

我正在尋找一個內核模式調用,我可以從驅動程序,用戶空間實用程序或系統調用中調用內核模式調用,它會要求內核查看PCI總線並完全重新運行其初始化或初始化一個特定的設備。具體來說,我需要內核識別引導後添加到總線的設備,然後配置其地址空間,中斷和其他配置參數,最後啓用設備,以便我可以爲它加載驅動程序(除非這一切作爲驅動程序負載的一部分發生)。有沒有辦法讓Linux內核重新運行它的PCI初始化代碼?

我卡上的2.4.x系列的內核對於這一點,和我目前正在與2.4.20工作,但將轉移到2.4.37,如果它很重要。發行版是一個精簡版的Red Hat 7.3,運行在RAM磁盤上,但是我可以添加任何需要的工具來完成這個工作(只要它們與2.4系列兼容)。

如果一些背景將有助於澄清我想要做的事:從冷啓動,在Linux下一次我用GPIO編程的FPGA。部分FPGA一經編程就實現了一個簡單的PCI設備。目前,在對FPGA進行編程之後,我重新啓動系統,Linux在啓動後識別設備併爲其加載驅動程序。

而不是需要重新啓動,我想簡單地要求內核在啓動過程中執行任何操作以查找PCI設備(我將內核配置爲自行查找PCI設備,而不是詢問BIOS的信息,所以BIOS不需要知道這個設備(我希望))。

我相信Linux能夠在設備編程之後但在重新啓動之前看到該設備,因爲scanpci將在編程後顯示設備,lspci -H 1也會顯示。我只需要一種方法將其設置爲/proc/pci,並已配置並啓用。

+2

您應該前往「姐妹」網站:http://serverfault.com/並在那裏詢問。這是與編碼相關的問題,你的確切問題似乎更多的是與系統管理員有關,所以他們可能能夠幫助你更快/更好。 – Stan 2009-12-02 23:48:41

回答

3

你可以加快重啓,與kexec,如果你不知道如何獲得PCI掃描重做。如果你還沒有的話,你可以在LKML上提問。

卸載/重裝模塊沒有幫助,是嗎?

1

這可能會導致系統崩潰,如果你重新配置其他PCI設備的地址,而他們都在使用。

更好的方法是配置新卡。如果您的內核支持Cardus設備,則它已經知道如何配置新插入的PCI設備(這是Cardbus的用途)。你只需要弄清楚如何讓內核做...

它應該是可能的內核模塊做到這一點。即使您無法獲得內置的熱插拔代碼,您也應該能夠使用致電pci_bus_write_config_dword()和朋友的方式來設置pci資源。可能還需要一些IRQ路由設置。

2

以下命令將幫助用戶重新掃描完整的根集線器。

echo "1" > /sys/class/pci_bus/0000\:00/rescan 
相關問題