如何在Linux中读取扩展的PCIE配置空间?

Oli*_*veU 2 linux linux-device-driver linux-kernel pci

我已经尝试在/ proc/bus/pci目录下读取用户空间pci条目并在驱动程序中调用内核空间API pci_read_config_word().但似乎两者都只能读取pci基本配置空间,偏移量小于0x100.

我想要读取的偏移量超过0x100,有人能告诉我如何在Linux中执行此操作吗?如果在内核空间中完成,那么告诉哪个API会非常感激.非常感谢你!

Rol*_*and 10

pci_read_config_word()是正确的API,但要访问扩展配置空间,您需要使用MMCONFIG.这不是你设置的; 如果可用,内核应该选择自己使用MMCONFIG.你看到了什么吗?

e0000000-efffffff : PCI MMCONFIG 0000 [bus 00-ff]
Run Code Online (Sandbox Code Playgroud)

/proc/iomem?同样在您的内核日志中,您应该看到有关ACPI MCFG表和MMCONFIG的一些内容:

ACPI: MCFG 00000000bb7fec63 0003C (v01 LENOVO TP-6U    00001410 LNVO 00000001)
...
PCI: MMCONFIG for domain 0000 [bus 00-ff] at [mem 0xe0000000-0xefffffff] (base 0xe0000000)
Run Code Online (Sandbox Code Playgroud)

当然,你的内核需要构建CONFIG_PCI_MMCONFIG=y.

  • 是的......我不知道我可以更明确地表达“你的内核需要使用 CONFIG_PCI_MMCONFIG=y 构建”。 (3认同)