ativar / desativar interrupções PCI

8

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?

Marca
fonte
1
Nos drivers Windows KMDF, você especifica no arquivo .inf do driver que tipo de interrupções usar (MSI x INTx x MSI-x) e a estrutura do driver configurará corretamente o próprio espaço de configuração do PCIe quando for carregado. Eu não sei sobre outros sistemas operacionais, mas como .inf é específico do Windows, acho que provavelmente depende do sistema operacional.
Tom Carpenter
2
Você geralmente precisa habilitá- los totalmente, fornecendo configuração para o que deve ser feito com a interrupção. Uma vez feito isso desativação está na CPU apenas para breves períodos de computação noninterruptible, até que você desconfigurar o dispositivo (por exemplo, para economia de energia)
pjc50
1
Se você estiver usando Linux, você poderia usar a estrutura de DMA para seu aplicativo? É muito bom, você cria a transação, e ele retorna com um tempo limite opcional quando a transação está completa - você não tem que enganar com a interrupção real
johnnymopo
@ pjc50, se um driver optar por usar um certo tipo de interrupção, por exemplo, INTx, ele precisará desativar a entrega de interrupções do MSI / MSI-X por meio dos registros MSI_CAP pci? (E o contrário - disable INTx ao usar MSI)
Mark

Respostas:

1

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".

Simon Richter
fonte