我是PCI express的新手,我想通过MMIO地址读写PCI配置空间。我知道端口映射的IO是如何通过0xCFC和0xCF8端口地址(在x86上)读写到PCI配置空间的。我还编写了一个示例linux内核模块,通过端口映射io读取pci配置空间,这个模块工作得很好。我也想通过MMIO/MMCFG访问来做同样的事情。
我也做了一个搜索,但找不到令人信服的答案。我正在寻找细节和一些代码示例,以更好地理解它。
任何帮助都是非常感谢的。
发布于 2018-09-09 16:10:37
硬件
PCI段组中每个PCIe设备的配置空间的MMIO区域的基址在ACPI表MCFG中给出。
MCFG表为每个PCI段组列出PCI段组的第一个和最后一个(包括)总线号以及扩展配置空间的基址。
MCFG表是由BIOS/UEFI根据位于00:00.0的主机桥/DRAM寄存器设备中的PCIEXBAR值设置的(因为我的处理器位于偏移量60h)。
这是通常的地址,设备集成在处理器套接字中,因为Nehalem体系结构和地址从未改变。
您可以谷歌您的处理器生成数据表,以获得正确的设备地址和注册偏移量。
还请注意,不是所有的256个MiB区域都可以映射,我的处理器允许256/ 128 /64 MiB映射,其中128个MiB是由BIOS/UEFI选择的。
Linux
我不知道如何在Linux中正确地处理这个问题,函数函数似乎使用了PCIe扩展配置空间。
因此访问配置空间应该非常容易。
或者,pci_mcfg_lookup将为PCI段组和总线范围提供扩展配置空间的物理地址(您应该能够通过定义只将start和end字段设置为总线号的resource结构来使其工作)。
如果你想要一个更低层次的方法。
最后,您可以获得MCFG表的地址,并(重新)自己解析它--我不知道如何准确地在Linux中获得这样的地址。
有一个acpi_tb_find_table,您可以在这里传递表的签名、null oem和表is来获取表索引。
在同一文件的114行中,有一段按索引访问表的代码,您可以使用它作为文档。
您可能必须从ACPI模块导入一个或多个符号。
https://stackoverflow.com/questions/52136259
复制相似问题