阅读 PCI 规范后,我只需要通过给定的中断向量 (1Ah) 调用 PCI BIOS 函数。然而,这因必须事先进行的 PCI 配置而变得复杂。
PCI 配置空间似乎不使用显式地址进行访问,而是使用 BIOS 函数调用。
编辑:实际上,BIOS 做的比我知道的要多得多。我所要做的就是枚举 PCI 总线,直到找到 IDE 控制器的设备和供应商 ID。唯一需要的组件是输入/输出端口包装器。
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;
}
}
}
}