Estoy implementando un controlador PCIe, y me gustaría entender en qué nivel las interrupciones pueden o deben estar habilitadas / deshabilitadas. No especifico el sistema operativo intencionalmente, ya que supongo que debería ser relevante para cualquier plataforma. Por niveles me refiero a lo siguiente:
- Marco de manejo de interrupciones específicas del sistema operativo
- Las interrupciones se pueden deshabilitar o habilitar en los registros de espacio de configuración PCI / PCIe, por ejemplo, el registro de COMANDO
- Las interrupciones también se pueden enmascarar a nivel de dispositivo, por ejemplo, podemos configurar el dispositivo para que no active ciertas interrupciones al host
Entiendo que cualquier tipo de interrupción que se esté utilizando en PCIe (emulación INTx, MSI o MSI-X), debe entregarse al sistema operativo host.
Entonces mi pregunta es: ¿realmente tenemos que habilitar o deshabilitar las interrupciones en cada capa, o es suficiente solo en el hardware más cercano, por ejemplo, en los registros PCI relevantes?
interrupts
bus
pcie
marca
fuente
fuente
Respuestas:
Los sistemas operativos generalmente se quejan en voz alta por las interrupciones inesperadas, porque estos son errores de programación fácilmente detectables en los controladores.
Por lo general, su hardware comenzaría en un estado bastante inerte después del restablecimiento donde espera ser configurado. En este estado, no hay una manera significativa de generar una interrupción, porque todavía no se ha establecido una asignación y usted no sabe qué interrupción.
Durante la configuración, el mapeo de interrupciones aparece y se le dice a la tarjeta qué línea de interrupción usar (INTA..INTD como PCI heredado o MSI / MSI-X), pero todavía no hay un controlador para manejar las interrupciones. Linux tiene un controlador predeterminado aquí que se queja con el registro del sistema y luego deshabilita la fuente de interrupción, ya que el hardware parece estar defectuoso (es decir, de forma predeterminada, todas las interrupciones están habilitadas, pero solo se espera que ocurran aquellas en las que está registrado un controlador) .
El controlador finalmente registra los manejadores de interrupciones y habilita las interrupciones que le interesan. Si el controlador ya no está interesado en una condición específica, necesita deshabilitar la interrupción en el dispositivo, porque allí es donde se enmascaran las causas de interrupción específicas del dispositivo: las capas inferiores solo saben que "algo sucedió".
fuente