访问PCI配置空间中的寄存器的正确方法

时间:2009-04-22 16:32:11

标签: device-driver bios pci-bus

当您需要访问PCI配置空间中的寄存器时,您是否只需要使用内置BIOS功能将DWORD读/写到配置空间中?

例如,如果我尝试使用B0上的IDE控制器:D31:F1我是否继续使用该BDF读取/写入配置寄存器作为BIOS功能的参数?因此,如果我想获得供应商ID,我会在给定的BDF中读取第一个DWORD吗?

或者我离基地不远?

编辑:

在PCI BIOS规范中,我一直在查看用于在配置空间中读取和写入单词的BIOS功能的定义。我相信这意味着我可以在配置空间内的各种偏移量中写入寄存器。我想我的问题是,这是在这个级别访问这些寄存器的正确方法吗?

1 个答案:

答案 0 :(得分:2)

在阅读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;
      }
    }
  }
}