|  | #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 |