【发布时间】:2020-03-30 07:38:04
【问题描述】:
我目前正在为 linux 内核 4.19 编写 PCIe 内核驱动程序。
运行 Intel DMA IP 的 FPGA (Arria 10) 通过 PCIe Gen 2 连接到 Linux CPU (i7-6700TE)。
我想运行从 FPGA 到 CPU RAM 的上游 DMA 传输。
首先初始化 PCIe 驱动程序。我按顺序使用以下说明:
- pci_enable_device
- pci_set_master
- pci_set_mwi
- pci_set_dma_mask DMA_BIT_MASK(64)
- pci_alloc_consistent
分配后,我将物理地址推入 DMA 配置并开始传输。完成后,我发布了一个 MSI,收到并处理。
我遇到的问题是,当使用虚拟地址读取 DMA 数据时,我只读取零,而没有通过 DMA 写入任何零。
我还测试了内存区域,首先通过 CPU 将斜坡写入内存,然后启动 DMA,然后再次读取,斜坡保持不变,因此我非常确信,没有发生对指定区域的内存访问。
为什么 MSI 传输有效(地址空间 CPU),但 RAM 访问无效?
您知道下一步该做什么吗?
提前感谢您的帮助。
【问题讨论】:
标签: linux-kernel pci fpga