前言
项目中需要通过驱动与fpga通讯,获取fpga往内存里写的数据。因为数据量比较大,需要驱动分配600多M的内存给fpga来写数据,且因为是与fpga通讯,需要连续的内存,还得是uncached的,因此打算采用dma接口dma_alloc_coherent
来分配如此大的内存。然而,在分配的过程中遇到了一些问题,下面对这次的调试进行总结。
环境说明
- soc: zc702(32bit arm + fpga)
- ddr: 1g
- linux kernel: 3.15.0
分配200M DMA空间失败
原因分析:
系统默认的DMA最大允许空间为128M,其他模块,如网卡驱动用去了一些,导致可使用的DMA空间低于128M了。要去分配200M,当然不够!
解决方法:
修改默认配置选项为CONFIG_CMA_SIZE_MBYTES=384
,重新编译内核即可解决。当然,也可以通过给内核传参cma=384M,这样就不用重新编译内核了。
分配600M DMA空间失败
当期望的dma分配为600M时,通过修改CMA_SIZE_MBYTES=700
已经没用了,这会导致系统启动时报cma失败,进而导致系统其他模块dma申请都失败。CMA_SIZE