linux3.10.65 DMA缓冲区分配失败
来源:互联网 发布:微信网络错误 编辑:程序博客网 时间:2024/06/11 12:54
今天调试tp固件升级的时候,DMA缓冲区按照以前android4.2(内核版本不记得了),DMA缓冲区的申请方式,发现老是申请失败。原来的申请方式如下:
static u8 *I2CDMABuf_va = NULL;dma_addr_t I2CDMABuf_pa =NULL;I2CDMABuf_va = (u8 *)dma_alloc_coherent(NULL, FTS_DMA_BUF_SIZE, (dma_addr_t *)&I2CDMABuf_pa, GFP_KERNEL);if(!I2CDMABuf_va){dev_dbg(&client->dev,"%s Allocate DMA I2C Buffer failed!\n",__func__);snprintf(dma_alloc_buf, 100,"Allocate DMA I2C Buffer failed!\n");return -EIO;}分析dma_alloc_coherent源码发现如下:
static inline void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags){struct dma_map_ops *ops = get_dma_ops(dev);//得到dma映射操作集void *vaddr;if (dma_alloc_from_coherent(dev, size, dma_handle, &vaddr))return vaddr;vaddr = ops->alloc(dev, size, dma_handle, flags, NULL);debug_dma_alloc_coherent(dev, size, *dma_handle, vaddr);return vaddr;}get_dma_ops源码如下:
static inline struct dma_map_ops *get_dma_ops(struct device *dev){if (unlikely(!dev) || !dev->archdata.dma_ops)//dev为NULL,return dma_ops;elsereturn dev->archdata.dma_ops;}因为传递进来的参数dev为NULL,所以这里返回dma_ops。再来看dma_alloc_from_coherent这个方法,一致性DMA映射:
int dma_alloc_from_coherent(struct device *dev, ssize_t size, dma_addr_t *dma_handle, void **ret){struct dma_coherent_mem *mem;int order = get_order(size);int pageno;if (!dev)//dev为NULLreturn 0;mem = dev->dma_mem;if (!mem)return 0;*ret = NULL;if (unlikely(size > (mem->size << PAGE_SHIFT)))goto err;pageno = bitmap_find_free_region(mem->bitmap, mem->size, order);if (unlikely(pageno < 0))goto err;/* * Memory was found in the per-device area. */*dma_handle = mem->device_base + (pageno << PAGE_SHIFT);*ret = mem->virt_base + (pageno << PAGE_SHIFT);memset(*ret, 0, size);return 1;err:/* * In the case where the allocation can not be satisfied from the * per-device area, try to fall back to generic memory if the * constraints allow it. */return mem->flags & DMA_MEMORY_EXCLUSIVE;}因为dev为NULL,所以这里返回0。所以直接返回了一个未初始化的vaddr的指针。所以,新的内核版本中dma_alloc_coherent的第一个device参数不能为NULL,否则,DMA缓冲区会分配失败。如下:
I2CDMABuf_va = (u8 *)dma_alloc_coherent(&client->dev, FTS_DMA_BUF_SIZE, (dma_addr_t *)&I2CDMABuf_pa, GFP_KERNEL);if(!I2CDMABuf_va){dev_dbg(&client->dev,"%s Allocate DMA I2C Buffer failed!\n",__func__);snprintf(dma_alloc_buf, 100,"Allocate DMA I2C Buffer failed!\n");return -EIO;}
0 0
- linux3.10.65 DMA缓冲区分配失败
- 一个DMA 分配失败问题研究
- 分配DMA缓冲区时LogicalAddress与PhysicalAddress的疑惑
- s5pv210 audio dma分配
- 申请和释放DMA缓冲区
- 内存分配 缓冲区
- linux内核DMA内存分配
- stm32F4 串口DMA+环形缓冲区的实现
- 日志缓冲区失败率
- linux3
- linux3
- linux3
- Linux3
- DMA分配内存常用的几个函数
- DMA设备驱动(三)————基于Linux3.4.2的dma设备驱动的简单实现
- VMware-Player-7.1.0在Linux3.19安装失败解决方法
- stm32f103 I2C DMA方式使用失败
- 处理new分配失败
- No bean named 'springSecurityFilterChain' is defined
- idea-项目初始化注意事项
- easyUI的datagrid,当后台查询结果为空,不执行OnLoadSuccess方法的解决
- 222
- 数据结构实验之链表四:有序链表的归并
- linux3.10.65 DMA缓冲区分配失败
- ARC Semantic issue:No visiable @interface for xxx declares the selector yyy 与arc semantic issue
- 《分布式JAVA应用 基础与实践》 第六章 构建高可用的系统
- Cassandra中的各种策略
- 一般用sudo 执行的需要授权
- [Leetcode] #113 Path Sum II
- 博客起步!
- 分数求和保留两位小数
- iOS 编码注意事项及技巧