gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:37:31 27 4
gpt4 key购买 nike

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

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

还是我离基地太远了?

编辑:

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

最佳答案

读完 PCI 规范后,我只需要通过给定的中断向量 (1Ah) 调用 PCI BIOS 函数即可。然而,这因必须事先发生的 PCI 配置而变得复杂。

PCI 配置空间似乎没有使用显式地址进行访问,而是使用 BIOS 函数调用。

编辑:实际上,事实证明 BIOS 的功能比我知道的要多得多。我所要做的就是枚举 PCI 总线,直到找到 IDE Controller 的设备和供应商 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;
}
}
}
}

关于device-driver - 在 PCI 配置空间中访问寄存器的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778121/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com