activar / desactivar interrupciones PCI

8

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?

marca
fuente
1
En los controladores KMDF de Windows, usted especifica en el archivo .inf del controlador qué tipo de interrupciones usar (MSI vs INTx vs MSI-x) y el marco del controlador configurará correctamente el espacio de configuración PCIe cuando se cargue. No sé sobre otros sistemas operativos, pero como los .inf son específicos de Windows, creo que probablemente dependan del sistema operativo.
Tom Carpenter
2
Por lo general, debe habilitarlos por completo proporcionando la configuración de lo que se debe hacer con la interrupción. Una vez hecho esto, la desactivación está en la CPU solo durante breves períodos de computación no interrumpible, hasta que desconfigure el dispositivo (por ejemplo, para ahorrar energía)
pjc50
1
SI está utilizando Linux, ¿podría utilizar el marco DMA para su aplicación? Es muy agradable, crea la transacción, y regresa con un tiempo de espera opcional cuando se completa la transacción, no tiene que engañar con la interrupción real
Johnnymopo
@ pjc50, si un controlador selecciona usar cierto tipo de interrupciones, por ejemplo, INTx, ¿tiene que deshabilitar la entrega de interrupciones MSI / MSI-X a través de registros pci MSI_CAP? (Y a la inversa: deshabilite INTx cuando use MSI)
Marque el

Respuestas:

1

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

Simon Richter
fuente