Domanda

Quando è necessario accedere a registri nello spazio di configurazione PCI, fate dovete semplicemente usato funzioni built-in del BIOS per leggere DWORD / scrittura nello spazio di configurazione?

Per esempio, se sto cercando di utilizzare un controller IDE che è sul B0: D31: F1 procedo a leggere / scrivere il registro di configurazione utilizzando tale BDF come parametri alle funzioni del BIOS? Quindi, se volevo ottenere il Vendor ID avrei letto il primo DWORD in un dato BDF?

O sono solo fuori strada?

EDIT:

Nella specifica BIOS PCI, ho cercato nel corso degli definizioni delle funzioni del BIOS per la lettura e la scrittura parole nello spazio di configurazione. Che credo significa che posso scrivere nei registri in diversi offset all'interno dello spazio di configurazione. Credo che la mia domanda è, è questo il modo corretto di accesso a questi registri a questo livello?

È stato utile?

Soluzione

Dopo aver letto la specifica PCI, ho semplicemente bisogno di chiamare le funzioni del BIOS PCI attraverso un vettore determinato interrupt (1Ah). Tuttavia, questo è complicata dalla configurazione PCI che devono accadere prima della mano.

Lo spazio di configurazione PCI sembra di non utilizzare un indirizzo esplicito per l'accesso, ma chiamate di funzione del BIOS.

EDIT: In realtà, si rivela il BIOS fa molto di più di quello che sapevo. Tutto quello che dovevo fare era enumerare il bus PCI fino a quando ho trovato dispositivo e fornitore ID del controller IDE. L'unica assemblea necessario era in / out involucri di porta.


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;
      }
    }
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top