Interrompere la sincronizzazione per i driver del controller GPIO

I driver del controller GPIO possono chiamare i metodi GPIO_CLX_AcquireInterruptLock e GPIO_CLX_ReleaseInterruptLock per acquisire e rilasciare blocchi di interrupt implementati internamente dall'estensione del framework GPIO (GpioClx). Il codice driver eseguito in IRQL = PASSIVE_LEVEL può chiamare questi metodi per la sincronizzazione con la routine del servizio interrupt (ISR) in GpioClx. GpioClx dedica un blocco di interrupt separato a ogni banca di pin nel controller GPIO.

Se i registri hardware del controller GPIO sono mappati alla memoria, l'ISR in GpioClx chiama determinate funzioni di callback degli eventi implementate dal driver in DIRQL; GpioClx chiama il resto delle funzioni di callback in PASSIVE_LEVEL. Una funzione di callback a livello passivo che accede a una banca di registri potrebbe dover usare un blocco di interrupt per sincronizzare le funzioni di callback eseguite in DIRQL e che accedono agli stessi registri.

Ad esempio, le CLIENT_EnableInterrupt funzioni di callback a livello passivo e CLIENT_DisableInterrupt modificano le impostazioni hardware che influiscono sul funzionamento di altre routine di callback correlate agli interrupt eseguite in DIRQL. Le funzioni CLIENT_EnableInterrupt e CLIENT_DisableInterrupt usano in genere i blocchi di interruzione della banca per sincronizzare gli accessi al registro.

GpioClx serializza automaticamente i callback correlati all'interrupt e i/O correlati a I/O che si verificano in DIRQL. GpioClx acquisisce il blocco di interrupt per la banca di destinazione prima di chiamare una funzione di callback in DIRQL e rilascia il blocco dopo la restituzione della funzione. Si tratta di un errore per una funzione di callback chiamata a DIRQL per provare ad acquisire nuovamente il blocco di interrupt della banca chiamando GPIO_CLX_AcquireInterruptLock.

Analogamente, GpioClx serializza automaticamente i callback che si verificano in PASSIVE_LEVEL. GpioClx implementa internamente un blocco di attesa per ogni banca. GpioClx acquisisce il blocco di attesa per la banca di destinazione prima di chiamare una funzione di callback a PASSIVE_LEVEL e rilascia il blocco quando la funzione restituisce. Per un controller GPIO mappato alla memoria, GpioClx gestisce i blocchi di attesa della banca per conto del driver, ma non consente al driver di acquisire e rilasciare in modo esplicito i blocchi.

Tuttavia, per un controller GPIO non mappato alla memoria, GPIO_CLX_AcquireInterruptLock e GPIO_CLX_ReleaseInterruptLock acquisire e rilasciare un blocco di attesa anziché un blocco di interruzione. GpioClx implementa un blocco di attesa separato per ogni banca di pin nel controller GPIO. Poiché i registri non sono mappati alla memoria, tutte le funzioni di callback correlate a interrupt e I/O vengono chiamate in PASSIVE_LEVEL in modo che possano usare le richieste di I/O per accedere ai registri tramite un bus seriale, ad esempio I²C. GpioClx acquisisce il blocco di attesa per la banca di destinazione prima di chiamare una di queste funzioni di callback e rilascia il blocco dopo la restituzione della funzione.

Si tratta di un errore per una funzione di callback per un controller non mappato alla memoria per tentare di acquisire nuovamente il blocco di attesa della banca chiamando GPIO_CLX_AcquireInterruptLock. Tuttavia, il codice driver a livello passivo all'esterno delle funzioni di callback può chiamare i metodi GPIO_CLX_XxxInterruptLock per la sincronizzazione con le funzioni di callback. Poiché GpioClx chiama tutte le funzioni di callback correlate agli interrupt e alle operazioni di I/O in PASSIVE_LEVEL, i blocchi di attesa della banca prendono effettivamente il posto dei blocchi di interruzione della banca per i controller non mappati alla memoria.

Un'altra opzione per un controller non mappato alla memoria è che il driver del controller implementi un set di blocchi di attesa. Questi blocchi di attesa potrebbero consentire alle routine di callback di eseguire blocchi con granularità più fine e sblocco delle risorse condivise di quanto sia possibile con i blocchi di attesa implementati da GpioClx.

Durante la chiamata alla routine di callback CLIENT_QueryControllerBasicInformation, un driver del controller GPIO segnala a GpioClx se i registri del controller sono mappati alla memoria. Per altre informazioni, vedere la descrizione del flag MemoryMappedController in CLIENT_CONTROLLER_BASIC_INFORMATION.

Per altre informazioni sui blocchi di interruzione e sui blocchi di attesa, vedere Using Framework Locks.For more information about interrupt locks and wait locks, see Using Framework Locks.

Le tabelle seguenti forniscono informazioni più dettagliate sulle funzioni di callback chiamate in DIRQL anziché in PASSIVE_LEVEL se i registri sono mappati alla memoria. Le note che seguono le tabelle spiegano quando le funzioni di callback a livello passivo devono usare blocchi di interruzione.

Per supportare i pin GPIO configurati come input di interrupt, un driver del controller GPIO implementa un set di funzioni di callback degli eventi per gestire le richieste di interruzione tramite questi pin. Nella tabella seguente la colonna centrale indica l'IRQL in corrispondenza del quale vengono chiamate le funzioni se i registri hardware del controller GPIO sono mappati alla memoria. La colonna più a destra indica l'IRQL in cui vengono chiamate le funzioni se i registri non sono mappati alla memoria e devono essere accessibili tramite un bus seriale.

Funzione di callback IRQL se è stato eseguito il mapping della memoria (MemoryMappedController = 1) IRQL se si accede in modo seriale (MemoryMappedController = 0)

CLIENT_EnableInterrupt

CLIENT_DisableInterrupt

PASSIVE_LEVEL

(Vedere la nota 1.)

PASSIVE_LEVEL

(Vedere la nota 2.)

CLIENT_ClearActiveInterrupts

CLIENT_MaskInterrupts

CLIENT_QueryActiveInterrupts

CLIENT_QueryEnabledInterrupts

CLIENT_ReconfigureInterrupt

CLIENT_UnmaskInterrupt

DIRQL

(Vedere la nota 3.)

PASSIVE_LEVEL

(Vedere la nota 4.)

CLIENT_PreProcessControllerInterrupt

DIRQL

(Vedere la nota 5.)

DIRQL

(Vedere la nota 6.)

Note

  1. GpioClx non acquisisce il blocco di interruzione della banca prima di chiamare questa funzione di callback. La funzione di callback può acquisire il blocco di interrupt della banca, se necessario, per sincronizzare gli accessi dei registri condivisi con le funzioni di callback eseguite in DIRQL.

  2. GpioClx serializza la chiamata a questa funzione di callback con altre funzioni di callback correlate all'interrupt e alle funzioni di callback relative alle operazioni di I/O chiamate in PASSIVE_LEVEL. Pertanto, la funzione di callback non deve tentare di acquisire il blocco di attesa della banca.

  3. GpioClx acquisisce il blocco di interruzione della banca prima di chiamare questa funzione di callback e rilascia il blocco dopo la restituzione della funzione. Pertanto, la funzione di callback non deve tentare di acquisire il blocco di interrupt della banca.

  4. GpioClx serializza la chiamata a questa funzione di callback con altre funzioni di callback correlate all'interrupt e alle funzioni di callback relative alle operazioni di I/O chiamate in PASSIVE_LEVEL. Pertanto, la funzione di callback non deve tentare di acquisire il blocco di attesa della banca.

  5. GpioClx acquisisce il blocco di interruzione della banca prima di chiamare questa funzione di callback e rilascia il blocco dopo la restituzione della funzione. Pertanto, la funzione di callback non deve tentare di acquisire il blocco di interrupt della banca.

  6. GpioClx non acquisisce il blocco di interruzione della banca prima di chiamare questa funzione di callback. Il driver del controller GPIO è responsabile della fornitura di qualsiasi sincronizzazione che potrebbe essere necessaria.

Per supportare i pin GPIO configurati come pin di I/O dati, un driver del controller GPIO implementa un set di funzioni di callback degli eventi per gestire le operazioni di I/O tramite questi pin. Nella tabella seguente la colonna centrale indica l'IRQL in corrispondenza del quale vengono chiamate le funzioni se i registri hardware del controller GPIO sono mappati alla memoria. La colonna più a destra indica l'IRQL in cui vengono chiamate le funzioni se i registri non sono mappati alla memoria e devono essere accessibili tramite un bus seriale.

Funzione di callback IRQL se è stato eseguito il mapping della memoria (MemoryMappedController = 1) IRQL se si accede in modo seriale (MemoryMappedController = 0)

CLIENT_ConnectIoPins

CLIENT_DisconnectIoPins

PASSIVE_LEVEL

(Vedere la nota 1.)

PASSIVE_LEVEL

(Vedere la nota 2.)

CLIENT_ReadGpioPins

CLIENT_ReadGpioPinsUsingMask

CLIENT_WriteGpioPins

CLIENT_WriteGpioPinsUsingMask

DIRQL

(Vedere la nota 3.)

PASSIVE_LEVEL

(Vedere la nota 4.)

Note

  1. GpioClx non acquisisce il blocco di interruzione della banca prima di chiamare questa funzione di callback. La funzione di callback può acquisire il blocco di interruzione, se necessario, per sincronizzare gli accessi dei registri condivisi con le funzioni di callback eseguite in DIRQL.

  2. GpioClx serializza la chiamata a questa funzione di callback con altre funzioni di callback correlate all'interruzione e alle funzioni di callback correlate all'I/O chiamate in PASSIVE_LEVEL. Pertanto, la funzione di callback non deve provare ad acquisire il blocco di attesa della banca.

  3. GpioClx acquisisce il blocco di interruzione della banca prima di chiamare questa funzione di callback e rilascia il blocco dopo che la funzione restituisce. Pertanto, la funzione di callback non deve provare ad acquisire il blocco di interruzione della banca.

  4. GpioClx serializza la chiamata a questa funzione di callback con altre funzioni di callback correlate all'interruzione e alle funzioni di callback correlate all'I/O chiamate in PASSIVE_LEVEL. Pertanto, la funzione di callback non deve provare ad acquisire il blocco di attesa della banca.

Per configurare un controller GPIO per eseguire operazioni di I/O e interruzioni, un driver controller GPIO implementa un set di funzioni di callback eventi per inizializzare il controller. Nella tabella seguente la colonna centrale indica irQL in corrispondenza del quale vengono chiamate le funzioni se i registri hardware del controller GPIO vengono mappati alla memoria. La colonna più a destra indica irQL in corrispondenza della quale vengono chiamate le funzioni se i registri non sono mappati dalla memoria e devono essere accessibili tramite un bus seriale.

Funzione di callback IRQL se mappato alla memoria (MemoryMappedController = 1) IRQL se viene eseguito l'accesso seriale (MemoryMappedController = 0)

CLIENT_PrepareController

CLIENT_ReleaseController

CLIENT_StartController

CLIENT_StopController

CLIENT_QueryControllerBasicInformation

CLIENT_QuerySetControllerInformation

PASSIVE_LEVEL

(Vedere la nota 1.)

PASSIVE_LEVEL

(Vedere la nota 2.)

Note

  1. Quando GpioClx chiama una di queste funzioni di callback, i blocchi di interruzione della banca non sono disponibili. Pertanto, queste funzioni di callback non devono provare ad acquisire il blocco di interruzione della banca.

  2. I blocchi di attesa della banca GpioClx non sono disponibili quando vengono chiamate queste funzioni di callback. Pertanto, il driver non deve provare a acquisire un blocco di attesa bancario per sincronizzare queste funzioni di callback.

Per abilitare un controller GPIO per modificare gli stati di alimentazione del dispositivo, un driver del controller GPIO implementa un set di funzioni di callback eventi per salvare e ripristinare le impostazioni hardware durante queste modifiche. Nella tabella seguente la colonna centrale indica irQL in corrispondenza del quale vengono chiamate le funzioni se i registri hardware del controller GPIO vengono mappati alla memoria. La colonna più a destra indica irQL in corrispondenza della quale vengono chiamate le funzioni se i registri non sono mappati dalla memoria e devono essere accessibili tramite un bus seriale.

Funzione di callback IRQL se mappato alla memoria (MemoryMappedController = 1) IRQL se viene eseguito l'accesso seriale (MemoryMappedController = 0)

CLIENT_RestoreBankHardwareContext

CLIENT_SaveBankHardwareContext

DIRQL o HIGH_LEVEL

Vedere Note.

Non supportato.

Note

  • Per le transizioni di F-state regolari: le funzioni di callback di salvataggio/ripristino vengono chiamate con il blocco di interruzione della banca tenuto da GpioClx in DIRQL. Pertanto, nessuna funzione di callback deve tentare di acquisire il blocco di interruzione della banca.
  • Per le transizioni F-state critiche: i callback di salvataggio/ripristino vengono chiamati quando viene richiamato il plug-in del motore di alimentazione (PEP) per salvare e ripristinare lo stato GPIO. Le funzioni di callback di salvataggio/ripristino vengono chiamate in HIGH_LEVEL nel contesto dell'ultimo processore inattivo, che si verifica in ritardo nella sequenza di transizione inattiva della piattaforma. Pertanto, nessuna funzione di callback deve tentare di acquisire il blocco di interruzione della banca.

Per altre informazioni sugli stati F, vedere Power Management a livello di componente. Per altre informazioni sul PEP, vedere PoFxPowerControl.

Altre funzioni di callback

Per abilitare un controller GPIO per supportare operazioni specifiche del controller, un driver del controller GPIO implementa una funzione di callback degli eventi CLIENT_ControllerSpecificFunction . Nella tabella seguente la colonna centrale indica irQL in corrispondenza del quale viene chiamata la funzione se i registri hardware del controller GPIO vengono mappati alla memoria. La colonna più a destra indica irQL in corrispondenza della quale viene chiamata la funzione se i registri non sono mappati dalla memoria e devono essere accessibili tramite un bus seriale.

Funzione di callback IRQL se mappato alla memoria (MemoryMappedController = 1) IRQL se viene eseguito l'accesso seriale (MemoryMappedController = 0)

CLIENT_ControllerSpecificFunction

PASSIVE_LEVEL

(Vedere la nota 1.)

PASSIVE_LEVEL

(Vedere la nota 2.)

Note

  1. GpioClx non acquisisce il blocco di interruzione della banca prima di chiamare questa funzione di callback. La funzione di callback può acquisire il blocco di interruzione della banca, se necessario, per sincronizzare gli accessi dei registri condivisi con le funzioni di callback eseguite in DIRQL.

  2. GpioClx serializza la chiamata a questa funzione di callback con altre funzioni di callback correlate all'interruzione e alle funzioni di callback correlate all'I/O chiamate in PASSIVE_LEVEL. Pertanto, la funzione di callback non deve provare ad acquisire il blocco di attesa della banca.