【问题标题】:How to access pci express configuration space via MMIO?如何通过 MMIO 访问 pci express 配置空间?
【发布时间】:2019-02-07 17:08:49
【问题描述】:

我是 PCI Express 的新手,我想通过 MMIO 地址读取/写入 PCI Express 配置空间。我知道端口如何通过 0xCFC 和 0xCF8 端口地址(在 x86 上)将 IO 读/写映射到 PCI Express 配置空间。我还编写了一个示例 linux 内核模块,以通过端口映射 io 读取 pci 配置空间,效果很好。我想通过 MMIO/MMCFG 访问来做同样的事情。

我也进行了搜索,但找不到令人信服的答案。我正在寻找详细信息以及一些代码示例以更好地理解它。

感谢任何帮助。

【问题讨论】:

    标签: pci pci-e


    【解决方案1】:

    硬件

    ACPI table MCFG 中给出了 PCI 段组中每个 PCIe 设备的配置空间的 MMIO 区域的基地址。

    MCFG 表为每个 PCI 段组列出了 PCI 段组的第一个和最后一个(包括)总线号以及扩展配置空间的基地址。

    MCFG 表由 BIOS/UEFI 根据位于 Host Bridge/DRAM 寄存器 设备中的 PCIEXBAR 的值(对于我的处理器位于偏移 60h)进行设置>00:00.0。
    这是通常的地址,该设备自 Nehalem 架构以来就集成在处理器插槽中,并且从未更改过地址。
    您可以谷歌您的处理器代数据表以获取正确的设备地址和寄存器偏移量。

    另请注意,并非所有 256 MiB 区域都可以映射,我的处理器允许 256/128/64 MiB 映射,其中 128 MiB 是由 BIOS/UEFI 选择的。


    Linux

    我不知道如何在 Linux 中正确处理这个问题,有 pci_{read|write}_config_XXX function 函数似乎使用了 PCIe 扩展配置空间。
    所以访问配置空间应该很容易。

    另外,pci_mcfg_lookup 将为 PCI 段组和总线范围提供扩展配置空间的物理地址(您应该能够通过仅使用 startend 字段设置为总线号)。
    如果您想要一个较低级别的方法。

    最后,您可以获取MCFG 表的地址并自己(重新)解析它 - 我不知道如何在 Linux 中获取这样的地址。
    有一个acpi_tb_find_table,您可以在其中传递表的签名以及null oem 和表ID 以获得表索引
    在同一文件的114 行有一段代码可以通过索引访问表,您可以将其用作文档。
    您可能必须从 ACPI 模块导入一个或多个符号。

    【讨论】:

      猜你喜欢
      • 2017-10-26
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2015-01-04
      • 2012-07-06
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多