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

时间:2018-06-08 09:42:51

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

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

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

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

有人对更好的解决方案有所了解吗?这是我的第一个问题。请原谅我的问题变得有点冗长。任何反馈都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

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

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

将来,我可能会实现IP模块的新版本,该模块将使用DMA控制器将请求信息写入主机内存中的缓冲区,以减少PCIe往返次数。主机将通过中断来通知新数据在主机缓冲区中的可用性。