Pregunta

Cuando se necesita acceder a los registros en el espacio de configuración PCI, ¿necesita simplemente utiliza una función de las funciones del BIOS para leer DWORD / escritura en el espacio de configuración?

Por ejemplo, si estoy tratando de usar un controlador IDE que está en B0: D31: F1 debo proceder para leer / escribir el registro de configuración usando ese BDF como los parámetros a las funciones del BIOS? Así que si quería obtener el ID de proveedor me gustaría leer el primer DWORD en un determinado BDF?

O soy tan lejos de la base?

EDIT:

En la especificación PCI BIOS, he estado mirando por encima de las definiciones de las funciones del BIOS para leer y escribir palabras en el espacio de configuración. Que creo que significa que puedo escribir en los registros en diversos desplazamientos dentro del espacio de configuración. Creo que mi pregunta es, ¿es esta la forma correcta de acceder a estos registros en este nivel?

¿Fue útil?

Solución

Después de leer la especificación PCI, simplemente que llamar a las funciones del BIOS PCI a través de un vector dado de interrupción (1Ah). Sin embargo, esto se complica por la configuración PCI que debe ocurrir antes de la mano.

El espacio de configuración PCI parece no utilizar una dirección explícita para el acceso, pero las llamadas a funciones BIOS.

EDIT: En realidad, resulta que el BIOS hace mucho más de lo que sabía. Todo lo que tenía que hacer era enumerar el bus PCI hasta que encontré dispositivo y de ID del fabricante del controlador IDE. La única asamblea era necesaria la entrada / salida de puerto en envoltorios.


pci_dev_t dev = { 0xffffffff, 0xffffffff, 0xffffffff };

for ( bus = 0; bus < 0xffff; ++bus ) {
  for ( slot = 0; slot < 0xffff; ++slot ) {
    for ( func = 0; func < 0xff; ++func ) {
      uint16_t dev_id  = _pci_read_config_data( bus, slot, func, 0x00, PCI_READ_CONFIG_WORD );
      uint16_t vend_id = _pci_read_config_data( bus, slot, func, 0x02, PCI_READ_CONFIG_WORD );

      if ((vendor == vend_id) && (device == dev_id)) {
        dev.bus      = bus;
        dev.device   = slot;
        dev.function = func;

        return dev;
      }
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top