2009-12-01 7 views
12

Estoy buscando ya sea una llamada en modo kernel que pueda hacer desde un controlador, una utilidad de usuario o una llamada al sistema que le solicitará al Kernel que mire el bus PCI y vuelva a ejecutar completamente su inicialización o inicialice un dispositivo específico. Específicamente, necesito que el Kernel reconozca un dispositivo que se agregó al bus después del inicio y luego configure su espacio de direcciones, interrupción y otros parámetros de configuración, y finalmente habilite el dispositivo para que pueda cargar el controlador (a menos que este todo sucede como parte de la carga del controlador).¿Hay alguna manera de pedirle al Kernel de Linux que vuelva a ejecutar su código de inicialización de PCI?

Estoy atascado en el Kernel de la serie 2.4.x para esto, y actualmente estoy trabajando con 2.4.20, pero pasaré a 2.4.37 si es importante. La distribución es una versión reducida de Red Hat 7.3 que se ejecuta en un disco RAM, pero puedo agregar las herramientas necesarias para que funcione (siempre que jueguen bien con la serie 2.4).

Si algunos antecedentes ayudan a aclarar lo que estoy tratando de hacer: desde un arranque en frío, una vez en Linux, uso GPIO para programar un FPGA. Parte del FPGA, una vez programado, implementa un dispositivo PCI simple. Actualmente, después de programar el FPGA, reinicio el sistema y Linux reconoce el dispositivo después de subir y carga el controlador para ello.

En lugar de necesitar ese reinicio, me gustaría simplemente pedirle al Kernel que haga lo que haga durante el arranque para encontrar dispositivos PCI (tengo el Kernel configurado para encontrar dispositivos PCI por sí mismo, en lugar de preguntar el BIOS para esa información, por lo que el BIOS no necesitará saber acerca de este dispositivo (espero)).

Creo que Linux es capaz de ver el dispositivo después de haberlo programado pero antes de reiniciarlo, porque scanpci mostrará el dispositivo después de que lo programe, al igual que lspci -H 1. Solo necesito una forma de ponerlo en /proc/pci, configurado y habilitado.

+2

Debe dirigirse al sitio "hermana": http://serverfault.com/ y pregunte allí. Esto es para problemas relacionados con la codificación, su problema exacto parece ser más relacionado con los administradores de sistemas para que puedan ayudarlo más rápido/mejor. – Stan

Respuesta

3

Puede acelerar el reinicio con kexec, si no encuentra la manera de hacer que se vuelva a realizar el escaneo PCI. Puede preguntar esto en el LKML, si aún no lo ha hecho.

descarga/recarga el módulo no ayuda, ¿o sí?

1

Probablemente bloquee el sistema si reconfigura las direcciones de otros dispositivos PCI mientras están en uso.

Una mejor manera sería simplemente configurar la nueva tarjeta. Si su núcleo tiene soporte para dispositivos Cardus, ya sabe cómo configurar un dispositivo PCI recién insertado (que es lo que Cardbus es). Solo necesita averiguar cómo hacer que el kernel lo haga ...

Debería ser posible que un módulo kernel lo haga. Incluso si no puede obtener el código de hotplug incorporado, debería poder establecer los recursos de pci mediante llamadas al pci_bus_write_config_dword() y sus amigos. Probablemente haya alguna configuración de enrutamiento IRQ para hacerlo también.

2

Este comando a continuación ayudará al usuario a volver a examinarlo para completar el centro de la raíz.

echo "1" > /sys/class/pci_bus/0000\:00/rescan 
Cuestiones relacionadas