Правильный способ доступа к регистрам в пространстве конфигурации PCI

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

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

Или я совсем не на базе?

РЕДАКТИРОВАТЬ:

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


person Mr. Shickadance    schedule 22.04.2009    source источник
comment
Целевая ОС - это школьный проект: очень простая ОС, разрабатываемая в течение семестра. Мой проект - разработать простой драйвер для диска.   -  person Mr. Shickadance    schedule 22.04.2009


Ответы (1)


После прочтения спецификации PCI мне просто нужно вызвать функции PCI 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;
      }
    }
  }
}
person Mr. Shickadance    schedule 01.05.2009
comment
@IanVaughan Может быть, вопрос не был так хорошо задан изначально, но опубликованный код был тем, что мне было нужно. Я просто пробежал кучу циклов, прежде чем понял, что это проще. - person Mr. Shickadance; 05.03.2011