使用 mmap 访问 PCI-e 内存 space

PCI-e memory space access with mmap

我在 Freescale MPC8308 处理器(基于 PowerPC 架构)上使用 PCI-e 端口,但在尝试使用它时遇到了一些问题。端点 PCI-e 设备的内存 space 等于 256 MB。我可以使用 "pciutils" 包轻松读写端点设备的配置 space。

在配置寄存器中写入正确的值并获得访问内存的权限后space;我试图通过在 C 中使用 "mmap()" 函数来访问内存 space,并使用了位于 :

的文件描述符

"/sys/devices/pci0000:00/0000:00:00.0/resource0"

正好是 256 MB(等于端点设备的内存 space)所以我似乎使用了正确的文件描述符路径。在这里您可以使用 "mmap()" 找到我的代码,如 https://github.com/billfarrow/pcimem:

中所述

https://github.com/billfarrow/pcimem/blob/master/pcimem.c

但不幸的是,当我尝试通过使用 "mmap()" 函数的返回地址来使用内存 space 时;我无法正确读取端点设备的只读寄存器。此外,当我读取大于“0x7FFFFFC”的地址时,MPC8308 重新启动。 考虑到上述情况,我是否遗漏了任何初始化 PCI-e 接口的步骤?我应该更改 Linux 内核映像或 U-Boot 代码中的任何内容吗?使用带 mmap() 的 PowerPC PCI-e 有什么不同吗?你有任何示例代码可以帮助我读取 PCI-e 内存 space?

谢谢

mmap() 是从用户 space.

访问 PCIe 设备的一种非常有用但随意的方式

我注意到您将 0 作为第一个参数传递给 mmap。在我将 FPGA 卡插入 x86 计算机的情况下,我调用 lspci 以获取 pcie 插槽中卡的物理地址。然后我将该物理地址用作 mmap 的第一个参数。我知道您正在设备的配置 space 中编写 BAR,但可能会使用 lspci 仔细检查。

$ sudo lspci -s 02:00 -v
02:00.0 Memory controller: Xilinx Corporation Device 8028
    Subsystem: Xilinx Corporation Device 0007
    Flags: bus master, fast devsel, latency 0, IRQ 11
    Memory at f7e00000 (32-bit, non-prefetchable) [size=1M]
    Capabilities: [80] Power Management version 3
    Capabilities: [90] MSI: Enable- Count=1/1 Maskable- 64bit+
    Capabilities: [c0] Express Endpoint, MSI 00
    Capabilities: [100] Advanced Error Reporting