void *dma_mem = dma_alloc_coherent(dev, size, &dma_handle, GFP_KERNEL); if (!dma_mem) { // 处理分配失败的情况 printk(KERN_ERR "DMA memory allocation failed "); // 可以进行错误恢复或退出操作 return -ENOMEM; } 2. 检查调用dma_alloc_coherent函数的上下文和参数 设备指针(dev):确保...
dma_alloc_coherent在arm中大小有限制,大概为2M。分配的内存在内核中以链表的形式存在。如果分配大小不一的内存造成碎片或其它程序也在用dma_alloc_coherent,则分配失败也是正常的。当然理论上你可以修改区间大小,但是我没试过。
想提升vpu编解码帧率,在vpu的设备树节点添加dma-coherent属性,vpu编解码timeout(失败); 2. 所做尝试 2.1 vpu内存分配接口 b->virt = dma_alloc_coherent(dev, PAGE_ALIGN(size), &b->dma, GFP_DMA | GFP_KERNEL 2.2 分析 增加了dma-coherent属性之后,vpu编解码失败; vpu是一个与DDR强交互的ip(从ddr中...
据我所知,我可以设置DMA掩码并分配一个连贯的缓冲区,然后简单地将其写入虚拟地址。然后,我的另一个设备可以从物理地址读取。如果有人能证实这是否真的是这样的话,那就太好了。 不幸的是,分配失败了,我无法解释系统日志的原因。我可能是在用结构设备做错事。dma_alloc_coherent中的设备引用是用来干什么的? 这是...
该函数实际获得两个地址。 1、函数的返回值是一个 void *。代表缓冲区的内核虚拟地址 2、相关的总线地址(物理地址),保存在dma_handle中 2、调用 A =dma_alloc_coherent(B,C,D,GFP_KERNEL); 含义: A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存 ...
dma_alloc_coherent在arm中大小有限制,大概为2M。分配的内存在内核中以链表的形式存在。如果分配大小不一的内存造成碎片或其它程序也在用dma_alloc_coherent,则分配失败也是正常的。当然理论上你可以修改区间大小,但是我没试过。