Pergunta

Quando você precisa registros de acesso no espaço de configuração PCI, você simplesmente precisa utilizado built-in BIOS funções para leitura / gravação DWORDs no espaço de configuração?

Por exemplo, se eu estou tentando usar um controlador IDE que está em B0: D31: F1 devo proceder para ler / escrever o registro de configuração usando essa BDF como os parâmetros para as funções do BIOS? Então, se eu queria para obter o ID de fornecedor eu lia a primeira DWORD em um determinado BDF?

Ou eu sou só longe de base?

EDIT:

Na especificação PCI BIOS, eu tenho procurado sobre as definições das funções do BIOS para ler e escrever palavras no espaço de configuração. Que eu acredito que significa que eu posso escrever para os registradores em vários deslocamentos dentro do espaço de configuração. Acho que minha pergunta é, é esta a maneira correta de acessar esses registros, a este nível?

Foi útil?

Solução

Depois de ler a especificação PCI, eu simplesmente precisa chamar as funções PCI BIOS através de um vetor de interrupção dada (1Ah). No entanto, isso é complicado pela configuração PCI que deve acontecer antes da mão.

O espaço de configuração PCI parece não usar um endereço explícito para o acesso, mas chamadas de função do BIOS.

EDIT: Na verdade, acontece que o BIOS faz muito mais do que eu sabia. Tudo o que eu tinha a fazer era enumerar o barramento PCI até que encontrei do controlador IDE dispositivo e ID do fornecedor. A única montagem necessário era a in / out invólucros de 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;
      }
    }
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top