You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM64平台PCIe驱动设置24位DMA掩码时dma_direct_supported失败的原因求助

ARM64平台PCIe驱动设置24位DMA掩码时dma_direct_supported失败的原因求助

各位好,我正在开发一款PCIe驱动,现在卡在DMA掩码设置这一步了,想请大家帮忙分析下原因。

先说明下我的开发环境:

  • 主机是zcu102开发板,搭载四核ARM-Cortex A53处理器
  • PCIe设备是自定义硬件
  • 使用内核版本为v5.15.0-1023-xilinx-zynqmp,系统是Xilinx Ubuntu 22.04.3 LTS

根据DMA API HOWTO的指引,我需要用dma_set_mask_and_coherent()来设置DMA掩码。我的设备仅支持24位DMA掩码,所以写了如下代码:

status=dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(24));

但这个调用返回了-5(即-EIO错误)。

我做了一些测试和排查工作:

  • 当我把掩码改成DMA_BIT_MASK(32)时,调用能成功执行,看来问题确实出在24位掩码的配置上
  • 检查内核配置,执行gunzip -c /proc/config.gz | grep CONFIG_ZONE_DMA,结果如下:
    CONFIG_ZONE_DMA=y
    CONFIG_ZONE_DMA32=y
    
    这看起来是符合要求的
  • 我跟踪了代码调用链:
    1. dma_set_mask_and_coherent()会调用dma_set_mask()
    2. dma_set_mask()会检查dma_supported(dev,mask)的返回值,24位掩码时返回0(失败),32位时返回1(成功)
    3. dma_supported()会先检查get_dma_ops(dev)是否为空指针
    4. 确认内核配置中CONFIG_DMA_OPS=y是开启的,所以get_dma_ops()会检查dev->dma_ops,我用pr_info("pdev->dev.dma_ops: %p\n", pdev->dev.dma_ops);打印出的值是0,这步检查失败
    5. 后续会调用dma_direct_supported(),但就是这里出现了失败

现在我想请教大家:为什么dma_direct_supported()在24位DMA掩码的场景下会失败呢?

备注:内容来源于stack exchange,提问作者GuentherMeyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 07:08:00