Partager via


Interruption de synchronisation pour les pilotes de contrôleur GPIO

Les pilotes de contrôleur GPIO peuvent appeler les méthodes GPIO_CLX_AcquireInterruptLock et GPIO_CLX_ReleaseInterruptLock pour acquérir et libérer des verrous d’interruption implémentés en interne par l’extension d’infrastructure GPIO (GpioClx). Code de pilote qui s’exécute à IRQL = PASSIVE_LEVEL pouvez appeler ces méthodes pour se synchroniser avec la routine de service d’interruption (ISR) dans GpioClx. GpioClx dédie un verrou d’interruption distinct à chaque banque de broches dans le contrôleur GPIO.

Si les registres matériels du contrôleur GPIO sont mappés à la mémoire, l’ISR dans GpioClx appelle certaines fonctions de rappel d’événements implémentées par le pilote au niveau du DIRQL ; GpioClx appelle le reste des fonctions de rappel à PASSIVE_LEVEL. Une fonction de rappel de niveau passif qui accède à une banque de registres peut avoir besoin d’utiliser un verrou d’interruption pour se synchroniser avec les fonctions de rappel qui s’exécutent au niveau DIRQL et qui accèdent aux mêmes registres.

Par exemple, les fonctions de rappel au niveau passif CLIENT_EnableInterrupt et CLIENT_DisableInterrupt modifient les paramètres matériels qui affectent le fonctionnement d’autres routines de rappel liées aux interruptions qui s’exécutent sur DIRQL. Les fonctions CLIENT_EnableInterrupt et CLIENT_DisableInterrupt utilisent généralement les verrous d’interruption bancaire pour synchroniser leurs accès au registre.

GpioClx sérialise automatiquement les rappels liés aux interruptions et aux E/S qui se produisent au niveau de la DIRQL. GpioClx acquiert le verrou d’interruption pour la banque cible avant d’appeler une fonction de rappel à DIRQL et libère le verrou après le retour de la fonction. Il s’agit d’une erreur pour qu’une fonction de rappel appelée au niveau de la DIRQL tente de récupérer à nouveau le verrou d’interruption bancaire en appelant GPIO_CLX_AcquireInterruptLock.

De même, GpioClx sérialise automatiquement les rappels qui se produisent à PASSIVE_LEVEL. GpioClx implémente en interne un verrou d’attente par banque. GpioClx acquiert le verrou d’attente de la banque cible avant d’appeler une fonction de rappel à PASSIVE_LEVEL et libère le verrou lorsque la fonction retourne. Pour un contrôleur GPIO mappé en mémoire, GpioClx gère les verrous d’attente bancaires pour le compte du pilote, mais ne permet pas au pilote d’acquérir et de libérer explicitement les verrous.

Toutefois, pour un contrôleur GPIO non mappé en mémoire, GPIO_CLX_AcquireInterruptLock et GPIO_CLX_ReleaseInterruptLock acquérir et libérer un verrou d’attente au lieu d’un verrou d’interruption. GpioClx implémente un verrou d’attente distinct pour chaque banque de broches dans le contrôleur GPIO. Étant donné que les registres ne sont pas mappés en mémoire, toutes les fonctions de rappel liées aux interruptions et aux E/S sont appelées à PASSIVE_LEVEL afin qu’elles puissent utiliser les demandes d’E/S pour accéder aux registres via un bus série, comme I²C. GpioClx acquiert le verrou d’attente de la banque cible avant d’appeler l’une de ces fonctions de rappel et libère le verrou après le retour de la fonction.

Il s’agit d’une erreur pour une fonction de rappel pour un contrôleur non mappé à la mémoire d’essayer de récupérer le verrou d’attente bancaire en appelant GPIO_CLX_AcquireInterruptLock. Toutefois, le code de pilote de niveau passif en dehors des fonctions de rappel peut appeler les méthodes InterruptLock GPIO_CLX_Xxx pour se synchroniser avec les fonctions de rappel. Étant donné que GpioClx appelle toutes les fonctions de rappel liées aux interruptions et aux E/S au PASSIVE_LEVEL, les verrous d’attente bancaires remplacent les verrous d’interruption bancaire pour les contrôleurs non mappés en mémoire.

Une autre option pour un contrôleur non mappé en mémoire consiste à permettre au pilote du contrôleur d’implémenter un ensemble de verrous d’attente. Ces verrous d’attente peuvent permettre aux routines de rappel d’effectuer un verrouillage et un déverrouillage plus précis des ressources partagées que ce qui est possible avec les verrous d’attente implémentés par GpioClx.

Pendant l’appel à l’CLIENT_QueryControllerBasicInformation routine de rappel, un pilote de contrôleur GPIO indique à GpioClx si les registres du contrôleur sont mappés en mémoire. Pour plus d’informations, consultez la description de l’indicateur MemoryMappedController dans CLIENT_CONTROLLER_BASIC_INFORMATION.

Pour plus d’informations sur les verrous d’interruption et les verrous d’attente, consultez Utilisation des verrous d’infrastructure.

Les tableaux suivants fournissent des informations plus détaillées sur les fonctions de rappel appelées dans DIRQL au lieu de PASSIVE_LEVEL si les registres sont mappés en mémoire. Les notes qui suivent les tableaux expliquent quand les fonctions de rappel de niveau passif doivent utiliser des verrous d’interruption.

Pour prendre en charge les broches GPIO configurées en tant qu’entrées d’interruption, un pilote de contrôleur GPIO implémente un ensemble de fonctions de rappel d’événements pour gérer les demandes d’interruption via ces broches. Dans le tableau suivant, la colonne centrale indique l’IRQL auquel les fonctions sont appelées si les registres matériels du contrôleur GPIO sont mappés en mémoire. La colonne la plus à droite indique l’IRQL auquel les fonctions sont appelées si les registres ne sont pas mappés en mémoire et doivent être accessibles via un bus série.

Fonction de rappel IRQL si la mémoire est mappée (MemoryMappedController = 1) IRQL en cas d’accès en série (MemoryMappedController = 0)

CLIENT_EnableInterrupt

CLIENT_DisableInterrupt

PASSIVE_LEVEL

(Voir la note 1.)

PASSIVE_LEVEL

(Voir la note 2.)

CLIENT_ClearActiveInterrupts

CLIENT_MaskInterrupts

CLIENT_QueryActiveInterrupts

CLIENT_QueryEnabledInterrupts

CLIENT_ReconfigureInterrupt

CLIENT_UnmaskInterrupt

DIRQL

(Voir la note 3.)

PASSIVE_LEVEL

(Voir la note 4.)

CLIENT_PreProcessControllerInterrupt

DIRQL

(Voir la note 5.)

DIRQL

(Voir la note 6.)

Remarques

  1. GpioClx n’acquiert pas le verrou d’interruption bancaire avant d’appeler cette fonction de rappel. La fonction de rappel peut acquérir le verrou d’interruption bancaire, si nécessaire, pour synchroniser les accès des registres qui sont partagés avec les fonctions de rappel qui s’exécutent au niveau DIRQL.

  2. GpioClx sérialise l’appel à cette fonction de rappel avec d’autres fonctions de rappel liées aux interruptions et aux E/S appelées à PASSIVE_LEVEL. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’attente bancaire.

  3. GpioClx acquiert le verrou d’interruption bancaire avant d’appeler cette fonction de rappel et libère le verrou après le retour de la fonction. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’interruption bancaire.

  4. GpioClx sérialise l’appel à cette fonction de rappel avec d’autres fonctions de rappel liées aux interruptions et aux E/S appelées à PASSIVE_LEVEL. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’attente bancaire.

  5. GpioClx acquiert le verrou d’interruption bancaire avant d’appeler cette fonction de rappel et libère le verrou après le retour de la fonction. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’interruption bancaire.

  6. GpioClx n’acquiert pas le verrou d’interruption bancaire avant d’appeler cette fonction de rappel. Le pilote de contrôleur GPIO est chargé de fournir toute synchronisation nécessaire.

Pour prendre en charge les broches GPIO configurées en tant que broches d’E/S de données, un pilote de contrôleur GPIO implémente un ensemble de fonctions de rappel d’événements pour gérer les opérations d’E/S via ces broches. Dans le tableau suivant, la colonne centrale indique l’IRQL auquel les fonctions sont appelées si les registres matériels du contrôleur GPIO sont mappés en mémoire. La colonne la plus à droite indique l’IRQL auquel les fonctions sont appelées si les registres ne sont pas mappés en mémoire et doivent être accessibles via un bus série.

Fonction de rappel IRQL si la mémoire est mappée (MemoryMappedController = 1) IRQL en cas d’accès en série (MemoryMappedController = 0)

CLIENT_ConnectIoPins

CLIENT_DisconnectIoPins

PASSIVE_LEVEL

(Voir la note 1.)

PASSIVE_LEVEL

(Voir la note 2.)

CLIENT_ReadGpioPins

CLIENT_ReadGpioPinsUsingMask

CLIENT_WriteGpioPins

CLIENT_WriteGpioPinsUsingMask

DIRQL

(Voir la note 3.)

PASSIVE_LEVEL

(Voir la note 4.)

Remarques

  1. GpioClx n’acquiert pas le verrou d’interruption bancaire avant d’appeler cette fonction de rappel. La fonction de rappel peut acquérir le verrou d’interruption, si nécessaire, pour synchroniser les accès aux registres partagés avec les fonctions de rappel qui s’exécutent sur DIRQL.

  2. GpioClx sérialise l’appel à cette fonction de rappel avec d’autres fonctions de rappel liées aux interruptions et aux E/S appelées à PASSIVE_LEVEL. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’attente de la banque.

  3. GpioClx acquiert le verrou d’interruption bancaire avant d’appeler cette fonction de rappel et libère le verrou après le retour de la fonction. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’interruption bancaire.

  4. GpioClx sérialise l’appel à cette fonction de rappel avec d’autres fonctions de rappel liées aux interruptions et aux E/S appelées à PASSIVE_LEVEL. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’attente de la banque.

Pour configurer un contrôleur GPIO afin d’effectuer des opérations d’E/S et d’interruption, un pilote de contrôleur GPIO implémente un ensemble de fonctions de rappel d’événements pour initialiser le contrôleur. Dans le tableau suivant, la colonne du milieu indique l’IRQL auquel les fonctions sont appelées si les registres matériels du contrôleur GPIO sont mappés en mémoire. La colonne la plus à droite indique l’IRQL auquel les fonctions sont appelées si les registres ne sont pas mappés en mémoire et doivent être accessibles via un bus série.

Fonction de rappel IRQL si la mémoire est mappée (MemoryMappedController = 1) IRQL en cas d’accès en série (MemoryMappedController = 0)

CLIENT_PrepareController

CLIENT_ReleaseController

CLIENT_StartController

CLIENT_StopController

CLIENT_QueryControllerBasicInformation

CLIENT_QuerySetControllerInformation

PASSIVE_LEVEL

(Voir la note 1.)

PASSIVE_LEVEL

(Voir la note 2.)

Remarques

  1. Lorsque GpioClx appelle l’une de ces fonctions de rappel, les verrous d’interruption bancaire ne sont pas disponibles. Par conséquent, ces fonctions de rappel ne doivent pas essayer d’acquérir le verrou d’interruption bancaire.

  2. Les verrous d’attente de la banque GpioClx ne sont pas disponibles lorsque ces fonctions de rappel sont appelées. Par conséquent, le pilote ne doit pas essayer d’acquérir un verrou d’attente bancaire pour se synchroniser avec ces fonctions de rappel.

Pour permettre à un contrôleur GPIO de modifier les états d’alimentation de l’appareil, un pilote de contrôleur GPIO implémente un ensemble de fonctions de rappel d’événements pour enregistrer et restaurer les paramètres matériels pendant ces modifications. Dans le tableau suivant, la colonne du milieu indique l’IRQL auquel les fonctions sont appelées si les registres matériels du contrôleur GPIO sont mappés en mémoire. La colonne la plus à droite indique l’IRQL auquel les fonctions sont appelées si les registres ne sont pas mappés en mémoire et doivent être accessibles via un bus série.

Fonction de rappel IRQL si la mémoire est mappée (MemoryMappedController = 1) IRQL en cas d’accès en série (MemoryMappedController = 0)

CLIENT_RestoreBankHardwareContext

CLIENT_SaveBankHardwareContext

DIRQL ou HIGH_LEVEL

(Voir Notes.)

Non pris en charge.

Remarques

  • Pour les transitions d’état F standard : les fonctions de rappel d’enregistrement/restauration sont appelées avec le verrou d’interruption bancaire détenu par GpioClx au niveau de DIRQL. Par conséquent, aucune fonction de rappel ne doit tenter d’acquérir le verrou d’interruption bancaire.
  • Pour les transitions d’état F critiques : les rappels d’enregistrement/restauration sont appelés lorsque le plug-in du moteur d’alimentation (PEP) est appelé pour enregistrer et restaurer l’état GPIO. Les fonctions de rappel d’enregistrement/restauration sont appelées à HIGH_LEVEL dans le contexte du dernier processeur à être inactif, ce qui se produit tard dans la séquence de transition d’inactivité profonde de la plateforme. Par conséquent, aucune fonction de rappel ne doit tenter d’acquérir le verrou d’interruption bancaire.

Pour plus d’informations sur les états F, consultez Gestion de l’alimentation au niveau des composants. Pour plus d’informations sur le PEP, consultez PoFxPowerControl.

Autres fonctions de rappel

Pour permettre à un contrôleur GPIO de prendre en charge des opérations spécifiques au contrôleur, un pilote de contrôleur GPIO implémente une fonction de rappel d’événement CLIENT_ControllerSpecificFunction . Dans le tableau suivant, la colonne du milieu indique l’IRQL auquel la fonction est appelée si les registres matériels du contrôleur GPIO sont mappés en mémoire. La colonne la plus à droite indique l’IRQL auquel la fonction est appelée si les registres ne sont pas mappés en mémoire et doivent être accessibles via un bus série.

Fonction de rappel IRQL si la mémoire est mappée (MemoryMappedController = 1) IRQL en cas d’accès en série (MemoryMappedController = 0)

CLIENT_ControllerSpecificFunction

PASSIVE_LEVEL

(Voir la note 1.)

PASSIVE_LEVEL

(Voir la note 2.)

Remarques

  1. GpioClx n’acquiert pas le verrou d’interruption bancaire avant d’appeler cette fonction de rappel. La fonction de rappel peut acquérir le verrou d’interruption bancaire, si nécessaire, pour synchroniser les accès aux registres partagés avec les fonctions de rappel qui s’exécutent sur DIRQL.

  2. GpioClx sérialise l’appel à cette fonction de rappel avec d’autres fonctions de rappel liées aux interruptions et aux E/S appelées à PASSIVE_LEVEL. Par conséquent, la fonction de rappel ne doit pas essayer d’acquérir le verrou d’attente de la banque.