linux - 在 Linux 中检测从 PCIe 端点到主机内存的事务

标签 linux linux-kernel linux-device-driver pci-e

我正在构建一个 FPGA 设计,其中一些设备(CPU、UART、GPIO Controller )连接到 AXI4 总线。 AXI4 总线通过 Xilinx 的“AXI Memory Mapped to PCI Express (PCIe) Gen2 v2.6 LogiCORE IP”连接到主机,充当桥梁。驻留在 FPGA 上的子系统通过 PCIe 与 Linux 驱动程序连接。该驱动程序创建一个设备文件,为在主机上运行的计算机系统模拟器提供接口(interface),即所谓的虚拟平台 (VP)。部分系统组件将在 VP 中进行仿真,而其余组件将在 FPGA 上实现。 VP的系统总线通过驱动器和上述桥接透明地连接到FPGA上的AXI4总线。源自主机的事务已实现并正常工作。

我想知道是否有一种方法可以检测 Linux 驱动程序中的 PCIe 读取或写入事务,而该事务是由充当总线主控的 PCIe 端点发出的。

到目前为止,我的想法是: (i) 在 FPGA 上实例化 DMA Controller ,它在每次传输结束时向主机发出消息信号中断 (MSI)。然后,驱动程序可以从 DMA 的控制寄存器中检索传输的起始地址和大小。 (ii) 在主机上分配一个缓冲区,PCIe 总线主机从中读取/写入缓冲区。需要轮询此缓冲区以检测更改,这对我来说似乎效率低下,尤其是对于大型缓冲区。

有人有更好的解决方案吗?这是我的第一个问题。请原谅我的问题变得有点冗长。任何反馈将不胜感激。

最佳答案

我正在回答我两个月前的问题,以防其他人将来遇到类似的问题。

我在 VHDL 中实现了一个 IP block ,它被实例化的次数与要与主机上运行的虚拟平台 (VP) 通信的 AXI 主端口的数量一样多。这个 IP block 有两个 AXI 从端口:一个连接到发出请求的 AXI 主端口,另一个可以通过 PCIe/AXI 桥从主机读取。每当 IP block 拦截请求时,都会生成中断以通知主机驱动程序。驱动程序读取请求的地址、数据、类型 (R/W) 和大小,然后由 VP 通过 ioctl() 读取。 VP 处理请求并将响应传达给驱动程序,同样通过 ioctl()。然后,驱动将响应转发给对应AXI主端口连接的IP block ,请求完成。

将来我可能会实现一个新版本的 IP block ,它将使用 DMA Controller 将请求信息写入主机内存中的缓冲区,以减少 PCIe 往返次数。主机缓冲区中新数据的可用性将通过中断发出信号。

关于linux - 在 Linux 中检测从 PCIe 端点到主机内存的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50757762/

相关文章:

c - 我在哪里可以获得 PalmOS SDK?

linux - 如何将内核调试信息构建为单独的文件?

Android:改变build.prop的方法

c - 如何创建用于mmap文件操作的filep(Linux内核驱动)?

java - 分析 Linux 上的 Java 内存使用情况

python - 如何制作自己的命令

c - 如何在Linux内核中打开并读取 `struct inode *`处的文件

linux - 片上系统 (SOC) 的设备驱动程序

c - 如何读取内核空间中关联的 uid 的 gids 列表?

linux - VirtualBox 自定义屏幕分辨率问题