abilitare / disabilitare gli interrupt PCI


8

Sto implementando un driver PCIe e vorrei capire a che livello possono essere o dovrebbero essere abilitati / disabilitati gli interrupt. Non intendo specificare il sistema operativo, poiché presumo che dovrebbe essere rilevante per qualsiasi piattaforma. Per livelli intendo quanto segue:

  • Sistema operativo specifico interrompe il framework di gestione
  • Gli interrupt possono essere disabilitati o abilitati nei registri dello spazio di configurazione PCI / PCIe, ad es. Il registro COMMAND
  • Gli interrupt possono anche essere mascherati a livello di dispositivo, ad esempio possiamo configurare il dispositivo in modo da non attivare determinati interrupt sull'host

Comprendo che qualunque tipo di interruzione venga utilizzato su PCIe (emulazione INTx, MSI o MSI-X), deve essere consegnato al sistema operativo host.

Quindi la mia domanda è: dobbiamo effettivamente abilitare o disabilitare gli interrupt su ogni livello o è sufficiente solo il più vicino all'hardware, ad esempio nei registri PCI pertinenti?


1
Nei driver KMDF di Windows, specificare nel file .inf del driver quale tipo di interrupt utilizzare (MSI vs INTx vs MSI-x) e il framework dei driver configurerà correttamente lo spazio di configurazione PCIe stesso quando viene caricato. Non conosco altri sistemi operativi, ma poiché .inf sono specifici di Windows penso che probabilmente dipenda dal sistema operativo.
Tom Carpenter,

2
In genere è necessario abilitarli completamente fornendo la configurazione per ciò che dovrebbe essere fatto con l'interrupt. Una volta fatto, la disabilitazione è sulla CPU solo per brevi periodi di elaborazione continua, fino a quando non si deconfigura il dispositivo (ad esempio per il risparmio energetico)
pjc50,

1
Se stai usando Linux, potresti usare il framework DMA per la tua applicazione? È molto bello, crei la transazione e ritorna con un timeout opzionale quando la transazione è completa - non devi ingannare con l'interruzione effettiva
johnnymopo

@ pjc50, se un driver sceglie di utilizzare un certo tipo di interrupt, ad esempio INTx, deve disabilitare la consegna degli interrupt MSI / MSI-X tramite i registri pci MSI_CAP? (E viceversa - disabilita INTx quando usi MSI)
Segna il

Risposte:


1

I sistemi operativi in ​​genere lamentano rumorosamente interruzioni impreviste, poiché si tratta di errori di programmazione facilmente rilevabili nei driver.

In genere, l'hardware si avvia in uno stato abbastanza inerte dopo il ripristino in cui attende di essere configurato. In questo stato, non esiste un modo significativo per generare un interrupt, poiché non è stato ancora stabilito alcun mapping e non si conosce quale interrupt.

Durante la configurazione, viene creata la mappatura degli interrupt e alla scheda viene indicato quale linea di interrupt utilizzare (INTA..INTD come PCI legacy o MSI / MSI-X), ma non esiste ancora alcun driver per gestire gli interrupt. Linux ha qui un gestore predefinito che si lamenta del registro di sistema e quindi disabilita la fonte di interruzione, poiché l'hardware sembra essere difettoso (ovvero, per impostazione predefinita, tutti gli interrupt sono abilitati, ma si prevede che si verifichino effettivamente solo quelli in cui è registrato un gestore) .

Il driver infine registra i gestori di interrupt e abilita gli interrupt a cui è interessato. Se il driver non è più interessato a una condizione specifica, deve disabilitare l'interrupt nel dispositivo, poiché è lì che vengono mascherate le cause di interrupt specifiche del dispositivo - gli strati inferiori sanno solo che "è successo qualcosa".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.