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