Правильный способ доступа к регистрам в пространстве конфигурации PCI - PullRequest
3 голосов
/ 22 апреля 2009

Когда вам нужен доступ к регистрам в пространстве конфигурации PCI, вам просто нужно использовать встроенные функции BIOS для чтения / записи файлов DWORD в пространство конфигурации?

Например, если я пытаюсь использовать контроллер IDE, который находится на B0: D31: F1, я продолжаю читать / записывать регистр конфигурации, используя этот BDF в качестве параметров функций BIOS? Так что, если бы я хотел получить идентификатор поставщика, я бы прочитал первый DWORD в данном BDF?

Или я просто далеко от базы?

EDIT:

В спецификации PCI BIOS я просматривал определения функций BIOS для чтения и записи слов в пространство конфигурации. То, что я считаю, означает, что я могу записывать в регистры с различными смещениями в пространстве конфигурации. Наверное, мой вопрос: правильный ли это доступ к этим регистрам на этом уровне?

1 Ответ

2 голосов
/ 01 мая 2009

После прочтения спецификации PCI мне просто нужно вызвать функции BIOS BIOS через заданный вектор прерывания (1Ah). Однако это усложняется конфигурацией PCI, которая должна произойти заранее.

Пространство конфигурации PCI, по-видимому, не использует явный адрес для доступа, но вызывает функции BIOS.

РЕДАКТИРОВАТЬ: На самом деле, оказывается, BIOS делает гораздо больше, чем я знал. Все, что мне нужно было сделать, это перечислить шину PCI, пока я не нашел устройство контроллера IDE и идентификатор поставщика. Единственной необходимой сборкой были упаковщики портов ввода / вывода.


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;
      }
    }
  }
}
...