2009-12-01 11 views
12

Sto cercando una chiamata in modalità kernel che possa essere eseguita da un driver, un'utilità userland o una chiamata di sistema che chiederà al kernel di guardare il bus PCI e riavviare completamente l'inizializzazione o inizializzarla un dispositivo specifico. In particolare, ho bisogno che il kernel riconosca un dispositivo che è stato aggiunto al bus dopo l'avvio e quindi configura il suo spazio indirizzo, l'interrupt e altri parametri di configurazione e infine abilita il dispositivo in modo che possa caricare il driver per esso (a meno che non sia tutto accade come parte del carico del driver).C'è un modo per chiedere al kernel Linux di rieseguire il suo codice di inizializzazione PCI?

Sono bloccato sul kernel della serie 2.4.x per questo, e sto attualmente lavorando con 2.4.20, ma passerò al 2.4.37 se è importante. La distro è una versione ridotta di Red Hat 7.3 che gira su un ram disk, ma posso aggiungere tutti gli strumenti necessari per farlo funzionare (a patto che suonino bene con la serie 2.4).

Se qualche background aiuterebbe a chiarire cosa sto cercando di fare: da un avvio a freddo, una volta in Linux uso GPIO per programmare un FPGA. Una parte dell'FPGA, una volta programmata, implementa un semplice dispositivo PCI. Attualmente, dopo aver programmato l'FPGA, riavvio il sistema e Linux riconosce il dispositivo dopo l'avvio e carica il driver per esso.

Invece di aver bisogno che il riavvio, vorrei semplicemente chiedere al kernel di fare quello che fa durante l'avvio di trovare periferiche PCI (ho il kernel configurato per trovare i dispositivi PCI da solo, invece di chiedere il BIOS per queste informazioni, quindi il BIOS non avrà bisogno di sapere su questo dispositivo (spero)).

Credo che Linux sia in grado di vedere il dispositivo dopo che è stato programmato ma prima di un riavvio, perché scanpci mostrerà il dispositivo dopo che l'ho programmato, così come lo sarà lspci -H 1. Ho solo bisogno di un modo per farlo entrare in /proc/pci, configurato e abilitato.

+2

Si dovrebbe andare al sito "sorella": http://serverfault.com/ e chiedere lì. Questo è per i problemi relativi alla codifica, il tuo problema esatto sembra essere più legato a sysadmin in modo che possano aiutarti a velocizzare/migliorare. – Stan

risposta

3

È possibile velocizzare il riavvio con kexec, se non si riesce a capire come ottenere la scansione PCI risanata. Potresti chiederlo a LKML, se non lo hai già fatto.

scaricare/ricaricare il modulo non aiuta, vero?

1

Probabilmente arresterebbe il sistema in caso di riconfigurazione degli indirizzi di altri dispositivi PCI mentre sono in uso.

Un modo migliore sarebbe semplicemente configurare la nuova scheda. Se il tuo kernel supporta i dispositivi Cardus, sa già come configurare un dispositivo PCI appena inserito (che è ciò che è Cardbus). Hai solo bisogno di capire come ottenere il kernel per farlo ...

Dovrebbe essere possibile per un modulo del kernel fare questo. Anche se non puoi ottenere il codice hotplug incorporato, dovresti essere in grado di impostare le risorse pci utilizzando le chiamate a pci_bus_write_config_dword() e gli amici. Probabilmente c'è anche qualche installazione di routing IRQ da fare.

2

Questo comando di seguito aiuterà l'utente a eseguire nuovamente la scansione del root hub.

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