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 - 我跟踪了代码调用链:
dma_set_mask_and_coherent()会调用dma_set_mask()dma_set_mask()会检查dma_supported(dev,mask)的返回值,24位掩码时返回0(失败),32位时返回1(成功)dma_supported()会先检查get_dma_ops(dev)是否为空指针- 确认内核配置中
CONFIG_DMA_OPS=y是开启的,所以get_dma_ops()会检查dev->dma_ops,我用pr_info("pdev->dev.dma_ops: %p\n", pdev->dev.dma_ops);打印出的值是0,这步检查失败 - 后续会调用
dma_direct_supported(),但就是这里出现了失败
现在我想请教大家:为什么dma_direct_supported()在24位DMA掩码的场景下会失败呢?
备注:内容来源于stack exchange,提问作者GuentherMeyer
相关产品推荐
相关产品推荐

