Kernel 4.9 上 dma_alloc_coherent() 函数开辟 DMA 连续内存空间失败 解决办法

编程知识 行业动态 更新时间:2024-06-13 00:19:09

【问题描述】
  将之前可以在 Kernel 3.14 上正常运行的驱动代码移植到 Kernel 4.9 上,发现驱动在进行 probe 时失败,具体失败位置为函数 dma_alloc_coherent(),对应代码段如下:

amaudio_start_addr =
            (unsigned char *)dma_alloc_coherent(amaudio2_dev,
            SOFT_BUFFER_SIZE,
            &amaudio_phy_start_addr,
            GFP_KERNEL);

if (!amaudio_start_addr) {
    pr_info("amaudio2 out soft DMA buffer alloc failed, size %lu\n", SOFT_BUFFER_SIZE);
    ret = -ENOMEM;
    goto err4;
}

【原因及解决】
  造成这一问题的原因在于,基于 Kernel 4.9 的设备驱动在进行 DMA 操作前必须要先对相关的数据结构进行初始化,否则只能分配得到 NULL 指针。
  所以我们只需要在上方所示开辟 DMA 内存的代码前使用 of_dma_configure() 函数先对相关结构初始化一下就好了。如下:

/* dma data structure shall be initialised before being used in Kernel 4.9 */
of_dma_configure(amaudio2_dev, amaudio2_dev->of_node);

if (!amaudio2_dev->dma_mask)
    amaudio2_dev->dma_mask = &amaudio_pcm_dmamask;
if (!amaudio2_dev->coherent_dma_mask)
    amaudio2_dev->coherent_dma_mask = 0xffffffff;

amaudio_start_addr =
            (unsigned char *)dma_alloc_coherent(amaudio2_dev,
            SOFT_BUFFER_SIZE,
            &amaudio_phy_start_addr,
            GFP_KERNEL);

if (!amaudio_start_addr) {
    pr_info("amaudio2 out soft DMA buffer alloc failed, size %lu\n", SOFT_BUFFER_SIZE);
    ret = -ENOMEM;
    goto err4;
}

  重新编译 boot.img 烧入设备进行验证,发现驱动可以正常 probe 了。

更多推荐

Kernel 4.9 上 dma_alloc_coherent() 函数开辟 DMA 连续内存空间失败 解决办法

本文发布于:2023-03-27 22:24:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/232f0fc67baa012d8037b1d8ed73712c.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:解决办法   开辟   函数   内存空间   Kernel

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!