Sincronização de interrupção para drivers de controlador GPIO
Os drivers do controlador GPIO podem chamar os métodos GPIO_CLX_AcquireInterruptLock e GPIO_CLX_ReleaseInterruptLock para adquirir e liberar bloqueios de interrupção implementados internamente pela extensão da estrutura GPIO (GpioClx). O código do driver executado em IRQL = PASSIVE_LEVEL pode chamar esses métodos para sincronizar com a rotina de serviço de interrupção (ISR) em GpioClx. GpioClx dedica um bloqueio de interrupção separado a cada banco de pinos no controlador GPIO.
Se os registros de hardware do controlador GPIO forem mapeados para memória, o ISR em GpioClx chamará determinadas funções de retorno de chamada de evento implementadas pelo driver em DIRQL; GpioClx chama o restante das funções de retorno de chamada em PASSIVE_LEVEL. Uma função de retorno de chamada de nível passivo que acessa um banco de registros pode precisar usar um bloqueio de interrupção para sincronizar com funções de retorno de chamada executadas no DIRQL e que acessam os mesmos registros.
Por exemplo, as funções de retorno de chamada de nível passivo CLIENT_EnableInterrupt e CLIENT_DisableInterrupt modificam as configurações de hardware que afetam a operação de outras rotinas de retorno de chamada relacionadas à interrupção executadas no DIRQL. As funções CLIENT_EnableInterrupt e CLIENT_DisableInterrupt normalmente usam os bloqueios de interrupção bancária para sincronizar seus acessos de registro.
O GpioClx serializa automaticamente os retornos de chamada relacionados à interrupção e à E/S que ocorrem no DIRQL. O GpioClx adquire o bloqueio de interrupção para o banco de destino antes de chamar uma função de retorno de chamada no DIRQL e libera o bloqueio após o retorno da função. É um erro para uma função de retorno de chamada chamada no DIRQL tentar adquirir novamente o bloqueio de interrupção bancária chamando GPIO_CLX_AcquireInterruptLock.
Da mesma forma, o GpioClx serializa automaticamente os retornos de chamada que ocorrem em PASSIVE_LEVEL. O GpioClx implementa internamente um bloqueio de espera por banco. O GpioClx adquire o bloqueio de espera do banco de destino antes de chamar uma função de retorno de chamada em PASSIVE_LEVEL e libera o bloqueio quando a função retorna. Para um controlador GPIO mapeado pela memória, o GpioClx gerencia os bloqueios de espera do banco em nome do driver, mas não permite que o driver adquira e libere explicitamente os bloqueios.
No entanto, para um controlador GPIO não mapeado para memória, GPIO_CLX_AcquireInterruptLock e GPIO_CLX_ReleaseInterruptLock adquirir e liberar um bloqueio de espera em vez de um bloqueio de interrupção. GpioClx implementa um bloqueio de espera separado para cada banco de pinos no controlador GPIO. Como os registros não são mapeados na memória, todas as funções de retorno de chamada relacionadas a interrupção e E/S são chamadas em PASSIVE_LEVEL para que possam usar solicitações de E/S para acessar os registros por meio de um barramento serial, como I²C. O GpioClx adquire o bloqueio de espera para o banco de destino antes de chamar uma dessas funções de retorno de chamada e libera o bloqueio após o retorno da função.
É um erro para uma função de retorno de chamada para um controlador não mapeado na memória tentar adquirir novamente o bloqueio de espera do banco chamando GPIO_CLX_AcquireInterruptLock. No entanto, o código do driver de nível passivo fora das funções de retorno de chamada pode chamar os métodos InterruptLock GPIO_CLX_Xxx para sincronizar com as funções de retorno de chamada. Como o GpioClx chama todas as funções de retorno de chamada relacionadas a interrupções e de E/S em PASSIVE_LEVEL, os bloqueios de espera do banco efetivamente tomam o lugar dos bloqueios de interrupção bancária para controladores não mapeados na memória.
Outra opção para um controlador não mapeado para memória é que o driver do controlador implemente um conjunto de bloqueios de espera. Esses bloqueios de espera podem permitir que as rotinas de retorno de chamada façam mais bloqueios refinados e desbloqueio de recursos compartilhados do que é possível com os bloqueios de espera implementados pelo GpioClx.
Durante a chamada para o CLIENT_QueryControllerBasicInformation rotina de retorno de chamada, um driver de controlador GPIO informa ao GpioClx se os registros do controlador são mapeados pela memória. Para obter mais informações, consulte a descrição do sinalizador MemoryMappedController no CLIENT_CONTROLLER_BASIC_INFORMATION.
Para obter mais informações sobre bloqueios de interrupção e bloqueios de espera, consulte Usando bloqueios de estrutura.
As tabelas a seguir fornecem informações mais detalhadas sobre quais funções de retorno de chamada são chamadas em DIRQL em vez de em PASSIVE_LEVEL se os registros forem mapeados pela memória. As anotações que seguem as tabelas explicam quando as funções de retorno de chamada de nível passivo devem usar bloqueios de interrupção.
- Funções de retorno de chamada relacionadas à interrupção
- Funções de retorno de chamada relacionadas a E/S
- Funções de retorno de chamada relacionadas à instalação e inicialização do GPIO
- Funções de retorno de chamada relacionadas ao gerenciamento de energia gpio
- Outras funções de retorno de chamada
Funções de retorno de chamada relacionadas à interrupção
Para dar suporte a pinos GPIO configurados como entradas de interrupção, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de evento para gerenciar solicitações de interrupção por meio desses pinos. Na tabela a seguir, a coluna intermediária indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO forem mapeados pela memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registros não são mapeados pela memória e devem ser acessados por meio de um barramento serial.
Função de retorno de chamada | IRQL se mapeado em memória (MemoryMappedController = 1) | IRQL se acessado serialmente (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Consulte a observação 1.) |
PASSIVE_LEVEL (Consulte a observação 2.) |
|
DIRQL (Consulte a observação 3.) |
PASSIVE_LEVEL (Consulte a nota 4.) |
|
DIRQL (Confira a nota 5.) |
DIRQL (Confira a nota 6.) |
Observações
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. A função de retorno de chamada pode adquirir o bloqueio de interrupção bancária, se necessário, para sincronizar acessos de registros compartilhados com funções de retorno de chamada executadas no DIRQL.
O GpioClx serializa a chamada para essa função de retorno de chamada com outras funções de retorno de chamada relacionadas a interrupção e E/S que são chamadas em PASSIVE_LEVEL. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.
O GpioClx adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada e libera o bloqueio após o retorno da função. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de interrupção bancária.
O GpioClx serializa a chamada para essa função de retorno de chamada com outras funções de retorno de chamada relacionadas a interrupção e E/S que são chamadas em PASSIVE_LEVEL. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.
O GpioClx adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada e libera o bloqueio após o retorno da função. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de interrupção bancária.
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. O driver do controlador GPIO é responsável por fornecer qualquer sincronização que possa ser necessária.
Funções de retorno de chamada relacionadas a E/S
Para dar suporte a pinos GPIO configurados como pinos de E/S de dados, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de evento para gerenciar operações de E/S por meio desses pinos. Na tabela a seguir, a coluna intermediária indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO forem mapeados pela memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registros não são mapeados pela memória e devem ser acessados por meio de um barramento serial.
Função de retorno de chamada | IRQL se mapeado em memória (MemoryMappedController = 1) | IRQL se acessado serialmente (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Consulte a observação 1.) |
PASSIVE_LEVEL (Consulte a observação 2.) |
|
DIRQL (Consulte a observação 3.) |
PASSIVE_LEVEL (Consulte a nota 4.) |
Observações
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. A função de retorno de chamada pode adquirir o bloqueio de interrupção, se necessário, para sincronizar acessos de registros compartilhados com funções de retorno de chamada executadas no DIRQL.
O GpioClx serializa a chamada para essa função de retorno de chamada com outras funções de retorno de chamada relacionadas a interrupção e E/S que são chamadas em PASSIVE_LEVEL. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.
O GpioClx adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada e libera o bloqueio após o retorno da função. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de interrupção bancária.
O GpioClx serializa a chamada para essa função de retorno de chamada com outras funções de retorno de chamada relacionadas a interrupção e E/S que são chamadas em PASSIVE_LEVEL. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.
Funções de retorno de chamada relacionadas à instalação e inicialização do GPIO
Para configurar um controlador GPIO para executar operações de E/S e interrupção, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de evento para inicializar o controlador. Na tabela a seguir, a coluna intermediária indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO forem mapeados pela memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registros não são mapeados pela memória e devem ser acessados por meio de um barramento serial.
Função de retorno de chamada | IRQL se mapeado em memória (MemoryMappedController = 1) | IRQL se acessado serialmente (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Consulte a observação 1.) |
PASSIVE_LEVEL (Consulte a observação 2.) |
Observações
Quando o GpioClx chama qualquer uma dessas funções de retorno de chamada, os bloqueios de interrupção bancária não estão disponíveis. Portanto, essas funções de retorno de chamada não devem tentar adquirir o bloqueio de interrupção bancária.
Os bloqueios de espera do banco GpioClx não estão disponíveis quando essas funções de retorno de chamada são chamadas. Portanto, o driver não deve tentar adquirir um bloqueio de espera bancária para sincronizar com essas funções de retorno de chamada.
Funções de retorno de chamada relacionadas ao gerenciamento de energia gpio
Para permitir que um controlador GPIO altere os estados de energia do dispositivo, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de evento para salvar e restaurar as configurações de hardware durante essas alterações. Na tabela a seguir, a coluna intermediária indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO forem mapeados pela memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registros não são mapeados pela memória e devem ser acessados por meio de um barramento serial.
Função de retorno de chamada | IRQL se mapeado em memória (MemoryMappedController = 1) | IRQL se acessado serialmente (MemoryMappedController = 0) |
---|---|---|
DIRQL ou HIGH_LEVEL (Consulte Anotações.) |
Não há suporte. |
Observações
- Para transições regulares de estado F: as funções de retorno de chamada de salvamento/restauração são chamadas com o bloqueio de interrupção bancária mantido pelo GpioClx em DIRQL. Portanto, nenhuma função de retorno de chamada deve tentar adquirir o bloqueio de interrupção bancária.
- Para transições críticas de estado F: os retornos de chamada de salvamento/restauração são chamados quando o PEP (plug-in do power engine) é invocado para salvar e restaurar o estado gpio. As funções de retorno de chamada de salvamento/restauração são chamadas em HIGH_LEVEL no contexto do último processador a ficar ocioso, o que ocorre no final da sequência de transição profunda e ociosa da plataforma. Portanto, nenhuma função de retorno de chamada deve tentar adquirir o bloqueio de interrupção bancária.
Para obter mais informações sobre estados F, consulte Gerenciamento de energia no nível do componente. Para obter mais informações sobre o PEP, consulte PoFxPowerControl.
Outras funções de retorno de chamada
Para habilitar um controlador GPIO para dar suporte a operações específicas do controlador, um driver de controlador GPIO implementa uma função de retorno de chamada de evento CLIENT_ControllerSpecificFunction. Na tabela a seguir, a coluna intermediária indica o IRQL no qual a função é chamada se os registros de hardware do controlador GPIO forem mapeados pela memória. A coluna mais à direita indica o IRQL no qual a função é chamada se os registros não são mapeados pela memória e devem ser acessados por meio de um barramento serial.
Função de retorno de chamada | IRQL se mapeado em memória (MemoryMappedController = 1) | IRQL se acessado serialmente (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Consulte a observação 1.) |
PASSIVE_LEVEL (Consulte a observação 2.) |
Observações
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. A função de retorno de chamada pode adquirir o bloqueio de interrupção bancária, se necessário, para sincronizar acessos de registros compartilhados com funções de retorno de chamada executadas no DIRQL.
O GpioClx serializa a chamada para essa função de retorno de chamada com outras funções de retorno de chamada relacionadas a interrupção e E/S que são chamadas em PASSIVE_LEVEL. Portanto, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.