在以前的驱动中,一般给LCD/GPU/camera预留部分内存,满足这些模块内存分配的同时,也能够提供物理地址连续内存.
但是,如果GPU/camera/LCD没有使用时,这部分内存就白白浪费了,所以就有了CMA机制.
CMA给驱动提供了一种分配连续内存的方法, 在驱动没有分配CMA内存时,这部分内存可以用于migrate type为moveable的内存分配,在驱动需要CMA内存时,先释放之前分配的CMA内存,然后重新给moveable内存进行映射.
DMA内存分配可以基于CMA提供的接口分配内存.
1. CMA内存的初始化:
setup_arch--->arm64_memblock_init->dma_contiguous_reserve->dma_contiguous_reserve_area->cma_declare_contiguous->cma_init_reserved_mem
定义一个全局的CMA内存,每个驱动程序也可以定制自己的CMA内存.
可以通过: cma_init_reserved_mem函数申请保留一段内存用于CMA操作。
当CMA 区域注册完成后,core_initcall(cma_init_reserved_areas); 把CMA内存释放到伙伴系统中.
2. CMA内存分配和释放
struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)
bool cma_release(struct cma *cma, const struct page *pages, unsigned int count)
http://www.wowotech.net/memory_management/cma.html