Estou implementando um driver PCIe e gostaria de entender em que nível as interrupções podem ser ou devem ser ativadas / desativadas. Intencionalmente, não especifiquei o SO, pois estou assumindo que ele deve ser relevante para qualquer plataforma. Por níveis, quero dizer o seguinte:
- Estrutura de manipulação de interrupções específicas do SO
- As interrupções podem ser desabilitadas ou habilitadas nos registros do espaço de configuração PCI / PCIe, por exemplo, registro COMMAND
- As interrupções também podem ser mascaradas no nível do dispositivo, por exemplo, podemos configurar o dispositivo para não acionar certas interrupções no host
Entendo que seja qual for o tipo de interrupção que está sendo usado no PCIe (emulação INTx, MSI ou MSI-X), ele deve ser entregue ao sistema operacional host.
Portanto, minha pergunta é: precisamos realmente ativar ou desativar as interrupções em todas as camadas, ou é suficiente apenas no hardware mais próximo, por exemplo, nos registros PCI relevantes?
interrupts
bus
pcie
Marca
fonte
fonte
Respostas:
Os sistemas operacionais geralmente reclamam muito de interrupções inesperadas, porque esses são erros de programação facilmente detectáveis nos drivers.
Normalmente, seu hardware inicia em um estado bastante inerte após a redefinição, onde espera ser configurado. Nesse estado, não há maneira significativa de gerar uma interrupção, porque ainda não existe um mapeamento estabelecido e você não sabe qual interrupção.
Durante a configuração, o mapeamento de interrupção passa a existir e a placa é informada sobre qual linha de interrupção usar (INTA..INTD como PCI legado ou MSI / MSI-X), mas ainda não há driver para lidar com interrupções. O Linux possui um manipulador padrão aqui que reclama ao log do sistema e desativa a fonte de interrupção, pois o hardware parece estar com defeito (ou seja, por padrão, todas as interrupções estão ativadas, mas somente aquelas em que um manipulador está registrado devem ocorrer) .
Finalmente, o driver registra os manipuladores de interrupção e habilita as interrupções nas quais está interessado. Se o driver não estiver mais interessado em uma condição específica, será necessário desativar a interrupção no dispositivo, porque é aí que as causas específicas da interrupção do dispositivo são mascaradas - as camadas inferiores sabem apenas que "algo aconteceu".
fonte