ARM架构 修改DMA大小
2016-03-20 13:04
926 查看
问题描述:
在ZYNQ上加载一个视频编码芯片驱动失败,芯片接口为PCIE。
查看现象,是调用 pci_alloc_consistent 申请DMA空间失败。
这个函数要被调用很多次,前几次成功,然后就失败了,第一反应就是DMA预留空间不足。
问题解决思路:
1. 在网上看到有 CONSISTENT_DMA_SIZE 这个宏可以定义,但是在我的内核代码中没有发现,然后谷歌了一把,发现这个宏已经被修改。
2.在谷歌上看到,内核3.5版本以后,内核启动命令行,有一个cma的参数可以控制,于是在设备树种修改启动参数,发现还是没用。
bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk vmalloc=300M cma=64M";
3.在检查内核启动时,看到这么一条:DMA: preallocated 256 KiB pool for atomic coherent allocations. 刚好我们的驱动也是申请了200多K的DMA后失败了。
于是在代码中查找这个打印,然后修改DMA分配的大小。
4.驱动终于加载成功。
5. 倒退回去,把第2步的cma=64M去掉,发现还是失败。
6. 一次最终方案:
a.在内核启动参数中添加cma=64M
b. 修改DMA大小。
PS: 具体的原理后续再查,项目比较赶,先放在这里,后续补充。
在ZYNQ上加载一个视频编码芯片驱动失败,芯片接口为PCIE。
查看现象,是调用 pci_alloc_consistent 申请DMA空间失败。
这个函数要被调用很多次,前几次成功,然后就失败了,第一反应就是DMA预留空间不足。
问题解决思路:
1. 在网上看到有 CONSISTENT_DMA_SIZE 这个宏可以定义,但是在我的内核代码中没有发现,然后谷歌了一把,发现这个宏已经被修改。
2.在谷歌上看到,内核3.5版本以后,内核启动命令行,有一个cma的参数可以控制,于是在设备树种修改启动参数,发现还是没用。
bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk vmalloc=300M cma=64M";
3.在检查内核启动时,看到这么一条:DMA: preallocated 256 KiB pool for atomic coherent allocations. 刚好我们的驱动也是申请了200多K的DMA后失败了。
于是在代码中查找这个打印,然后修改DMA分配的大小。
vi arch/arm/mm/dma-mapping.c +320
#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_64M
4.驱动终于加载成功。
5. 倒退回去,把第2步的cma=64M去掉,发现还是失败。
6. 一次最终方案:
a.在内核启动参数中添加cma=64M
b. 修改DMA大小。
PS: 具体的原理后续再查,项目比较赶,先放在这里,后续补充。
相关文章推荐
- php基础学习网站地址
- Kafka学习之五 Kafka架构以及设计原理
- 查看网站后台
- 2016年3月16日作业含论文架构
- 2016年3月16日作业含论文架构
- 自己做网站一定要加上的head代码(收集)
- 架构师基本功:消息队列
- 架构师基本功:消息队列
- MyBatis架构图
- 中国大陆开源镜像网站汇总
- Hadoop 基础架构 详解
- SSDC_高可用系统在点评的实践与经验
- SSDC_新型架构案例与实践
- SSDC_创业公司的架构变迁--宅米网
- 网站图标
- [国嵌攻略][163][linux-usb软件系统架构]
- 如何免费搭建自己的个人网站
- iOS应用架构谈 本地持久化方案
- iOS应用架构谈 动态部署方案
- iOS 应用架构谈:view 层的组织和调用方案