| #ifndef __LINUX_CMA_H | 
 | #define __LINUX_CMA_H | 
 |  | 
 | /* | 
 |  * Contiguous Memory Allocator for DMA mapping framework | 
 |  * Copyright (c) 2010-2011 by Samsung Electronics. | 
 |  * Written by: | 
 |  *	Marek Szyprowski <m.szyprowski@samsung.com> | 
 |  *	Michal Nazarewicz <mina86@mina86.com> | 
 |  * | 
 |  * This program is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU General Public License as | 
 |  * published by the Free Software Foundation; either version 2 of the | 
 |  * License or (at your optional) any later version of the license. | 
 |  */ | 
 |  | 
 | /* | 
 |  * Contiguous Memory Allocator | 
 |  * | 
 |  *   The Contiguous Memory Allocator (CMA) makes it possible to | 
 |  *   allocate big contiguous chunks of memory after the system has | 
 |  *   booted. | 
 |  * | 
 |  * Why is it needed? | 
 |  * | 
 |  *   Various devices on embedded systems have no scatter-getter and/or | 
 |  *   IO map support and require contiguous blocks of memory to | 
 |  *   operate.  They include devices such as cameras, hardware video | 
 |  *   coders, etc. | 
 |  * | 
 |  *   Such devices often require big memory buffers (a full HD frame | 
 |  *   is, for instance, more then 2 mega pixels large, i.e. more than 6 | 
 |  *   MB of memory), which makes mechanisms such as kmalloc() or | 
 |  *   alloc_page() ineffective. | 
 |  * | 
 |  *   At the same time, a solution where a big memory region is | 
 |  *   reserved for a device is suboptimal since often more memory is | 
 |  *   reserved then strictly required and, moreover, the memory is | 
 |  *   inaccessible to page system even if device drivers don't use it. | 
 |  * | 
 |  *   CMA tries to solve this issue by operating on memory regions | 
 |  *   where only movable pages can be allocated from.  This way, kernel | 
 |  *   can use the memory for pagecache and when device driver requests | 
 |  *   it, allocated pages can be migrated. | 
 |  * | 
 |  * Driver usage | 
 |  * | 
 |  *   CMA should not be used by the device drivers directly. It is | 
 |  *   only a helper framework for dma-mapping subsystem. | 
 |  * | 
 |  *   For more information, see kernel-docs in drivers/base/dma-contiguous.c | 
 |  */ | 
 |  | 
 | #ifdef __KERNEL__ | 
 |  | 
 | struct cma; | 
 | struct page; | 
 | struct device; | 
 |  | 
 | #ifdef CONFIG_CMA | 
 |  | 
 | /* | 
 |  * There is always at least global CMA area and a few optional device | 
 |  * private areas configured in kernel .config. | 
 |  */ | 
 | #define MAX_CMA_AREAS	(1 + CONFIG_CMA_AREAS) | 
 |  | 
 | extern struct cma *dma_contiguous_default_area; | 
 |  | 
 | void dma_contiguous_reserve(phys_addr_t addr_limit); | 
 | int dma_declare_contiguous(struct device *dev, unsigned long size, | 
 | 			   phys_addr_t base, phys_addr_t limit); | 
 |  | 
 | struct page *dma_alloc_from_contiguous(struct device *dev, int count, | 
 | 				       unsigned int order); | 
 | bool dma_release_from_contiguous(struct device *dev, struct page *pages, | 
 | 				 int count); | 
 |  | 
 | #else | 
 |  | 
 | #define MAX_CMA_AREAS	(0) | 
 |  | 
 | static inline void dma_contiguous_reserve(phys_addr_t limit) { } | 
 |  | 
 | static inline | 
 | int dma_declare_contiguous(struct device *dev, unsigned long size, | 
 | 			   phys_addr_t base, phys_addr_t limit) | 
 | { | 
 | 	return -ENOSYS; | 
 | } | 
 |  | 
 | static inline | 
 | struct page *dma_alloc_from_contiguous(struct device *dev, int count, | 
 | 				       unsigned int order) | 
 | { | 
 | 	return NULL; | 
 | } | 
 |  | 
 | static inline | 
 | bool dma_release_from_contiguous(struct device *dev, struct page *pages, | 
 | 				 int count) | 
 | { | 
 | 	return false; | 
 | } | 
 |  | 
 | #endif | 
 |  | 
 | #endif | 
 |  | 
 | #endif |