【问题标题】:PCIe Kerneldriver DMA writes to incorrect addressesPCIe 内核驱动程序 DMA 写入不正确的地址
【发布时间】: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 驱动程序。我按顺序使用以下说明:

  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,收到并处理。
我遇到的问题是,当使用虚拟地址读取 DMA 数据时,我只读取零,而没有通过 DMA 写入任何零。
我还测试了内存区域,首先通过 CPU 将斜坡写入内存,然后启动 DMA,然后再次读取,斜坡保持不变,因此我非常确信,没有发生对指定区域的内存访问。
为什么 MSI 传输有效(地址空间 CPU),但 RAM 访问无效?
您知道下一步该做什么吗?
提前感谢您的帮助。

【问题讨论】:

    标签: linux-kernel pci fpga


    【解决方案1】:

    欢迎来到 Unix 和 Linux StackExchange!

    您的问题是关于 Linux 内核编程的,因此可能更适合 Stack Overflow。不过不管怎样……

    你读过kernel DMA API HOWTO?

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

    【讨论】:

    • 感谢您的回答。我已经阅读了 DMA 文档并有这样的印象,即 pci_alloc_consistent 返回一个总线地址 引用:“它返回两个值:您可以用来从 CPU 访问它的虚拟地址和传递给卡的 dma_handle。”
    • 是的,对不起...我知道这一点,但我的措辞是错误的,所以这不应该是看不到 RAM 中数据的原因...我不能真的很关心它,但由于某种原因,北桥似乎没有将内存写入路由到 RAM,而 CPU 访问似乎工作。是否有可能进一步调试?顺便说一句...如果有帮助的话,我正在使用 i7-6700TE
    猜你喜欢
    • 2012-03-12
    • 2019-11-19
    • 1970-01-01
    • 2020-12-20
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多