2009-04-22 3 views
3

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

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

Или я просто от основания?

EDIT:

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

+0

Что такое целевая ОС? – Michael

+0

Целевая ОС - школьный проект: очень простая ОС, разработанная в течение семестра. Мой проект - разработать простой драйвер диска. –

ответ

2

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

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

EDIT: На самом деле, получается, что 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; 
     } 
    } 
    } 
} 
+0

Возможно, представлены примеры кода/звонков? –

+0

@IanVaughan Возможно, вопрос не был задан так хорошо изначально, но опубликованный код был тем, что мне нужно. Я просто пробежал кучу петель, прежде чем понял, что это было проще. –

Смежные вопросы