Estoy implementando un controlador PCIe, y me gustaría entender en qué nivel se pueden o deben habilitar/deshabilitar las interrupciones. Intencionalmente no especifico el sistema operativo, ya que asumo que debería ser relevante para cualquier plataforma. Por niveles me refiero a lo siguiente:
- Framework de manejo de interrupciones específico del SO
- Las interrupciones pueden ser deshabilitadas o habilitadas en los registros del espacio de configuración PCI/PCIe, por ejemplo en el registro COMMAND
- Las interrupciones también pueden ser enmascaradas a nivel de dispositivo, por ejemplo podemos configurar el dispositivo para que no active ciertas interrupciones en el host
Entiendo que cualquier tipo de interrupción que se esté utilizando en PCIe (emulación INTx, MSI o MSI-X), debe ser entregado al SO anfitrión.
Entonces mi pregunta es -- ¿realmente tenemos que habilitar o deshabilitar interrupciones en cada capa, o es suficiente solo en la más cercana al hardware, por ejemplo en los registros PCI relevantes?
1 votos
En los controladores de Windows KMDF, especificas en el archivo .inf del controlador qué tipo de interrupciones utilizar (MSI vs INTx vs MSI-x) y el marco de trabajo del controlador configurará correctamente el espacio de configuración de PCIe automáticamente cuando se carga. No sé acerca de otros sistemas operativos, pero como los .inf son específicos de Windows, creo que probablemente es dependiente del sistema operativo.
2 votos
Generalmente tienes que habilitar todas las formas proporcionando configuración de lo que se debe hacer con la interrupción. Una vez hecho eso, la desactivación corresponde únicamente a la CPU durante breves períodos de cómputo no interrumpible, hasta que desconfigure el dispositivo (por ejemplo, para ahorrar energía)
1 votos
Si estás utilizando Linux, ¿podrías utilizar el marco de trabajo DMA para tu aplicación? Es muy bueno, creas la transacción y regresa con un tiempo de espera opcional cuando la transacción está completa, no tienes que preocuparte con la interrupción real.
0 votos
@pjc50, si un conductor elige usar un cierto tipo de interrupciones, por ejemplo INTx, ¿tiene que desactivar la entrega de interrupciones MSI/MSI-X a través de los registros pci de MSI_CAP? (Y viceversa: ¿desactivar INTx cuando se usa MSI)