8 votos

Habilitar/deshabilitar interrupciones PCI

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.

1voto

dwestbrook Puntos 1754

Los sistemas operativos generalmente se quejan bastante de interrupciones inesperadas, porque son errores de programación fácilmente detectables en controladores.

Por lo general, su hardware comenzará en un estado bastante inerte después de un reinicio donde espera ser configurado. En este estado, no hay una forma significativa de generar una interrupción, porque aún no se ha establecido ningún mapeo y no se sabe qué interrupción.

Durante la configuración, el mapeo de interrupciones entra en existencia, y se le dice a la tarjeta qué línea de interrupción usar (INTA..INTD como herencia PCI, o MSI/MSI-X), pero aún no hay un controlador para manejar interrupciones. Linux tiene un manejador predeterminado aquí que se queja en el registro del sistema y luego deshabilita la fuente de interrupción, ya que el hardware parece estar defectuoso (es decir, por defecto, todas las interrupciones están habilitadas, pero se espera que solo ocurran aquellas para las cuales se ha registrado un controlador).

Finalmente, el controlador registra los manejadores de interrupciones y habilita las interrupciones en las que está interesado. Si el controlador ya no está interesado en una condición específica, necesita deshabilitar la interrupción en el dispositivo, porque ahí es donde las causas específicas de interrupción del dispositivo están enmascaradas -- las capas inferiores solo saben que "algo sucedió".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X