PCIe内核驱动程序DMA写入错误的地址

时间:2020-03-30 07:38:04

标签: linux-kernel pci fpga

我目前正在为Linux内核4.19编写PCIe内核驱动程序。
通过PCIe Gen 2将运行Intel DMA IP的FPGA(Arria 10)连接到Linux CPU(i7-6700TE)。
我想运行从FPGA到CPU RAM的上游DMA传输。
首先,初始化PCIe驱动程序。我按顺序使用以下说明:

  1. pci_enable_device
  2. pci_set_master
  3. pci_set_mwi
  4. pci_set_dma_mask DMA_BIT_MASK(64)
  5. pci_alloc_consistent

分配后,我将物理地址压入DMA配置并开始传输。完成后,我发布一个MSI,该MSI将被接收并处理。
我遇到的问题是,使用虚拟地址读取DMA数据时,我只能读取零,而不能通过DMA写入任何零。
我还测试了内存区域,方法是首先通过CPU向内存写入一个斜坡,然后启动DMA,然后再次读取,并且斜坡保持不变,因此,我非常确信没有发生对指定区域的内存访问。 > 为什么MSI传输能工作(地址空间CPU),但RAM访问不起作用?
你有下一步的想法吗?
预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

欢迎使用Unix和Linux StackExchange!

您的问题与Linux内核编程有关,因此可能更适合于Stack Overflow。但是无论如何...

您已阅读kernel DMA API HOWTO?

您说您已将物理地址推送到DMA配置中。但是总线上具有DMA功能的设备需要不同类型的地址,因为它对总线的看法可能不同:“总线地址”。它可能与物理地址相同或不同,具体取决于系统架构。