Commit 6e5267aa authored by Marek Szyprowski's avatar Marek Szyprowski

ARM: DMA-Mapping: add function for setting coherent pool size from platform code

Some platforms might require to increase atomic coherent pool to make
sure that their device will be able to allocate all their buffers from
atomic context. This function can be also used to decrease atomic
coherent pool size if coherent allocations are not used for the given
sub-platform.
Suggested-by: default avatarJosh Coombs <josh.coombs@gmail.com>
Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
parent e092705b
...@@ -202,6 +202,13 @@ static inline void dma_free_writecombine(struct device *dev, size_t size, ...@@ -202,6 +202,13 @@ static inline void dma_free_writecombine(struct device *dev, size_t size,
return dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs); return dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs);
} }
/*
* This can be called during early boot to increase the size of the atomic
* coherent DMA pool above the default value of 256KiB. It must be called
* before postcore_initcall.
*/
extern void __init init_dma_coherent_pool_size(unsigned long size);
/* /*
* This can be called during boot to increase the size of the consistent * This can be called during boot to increase the size of the consistent
* DMA region above it's default value of 2MB. It must be called before the * DMA region above it's default value of 2MB. It must be called before the
......
...@@ -267,6 +267,8 @@ static void __dma_free_remap(void *cpu_addr, size_t size) ...@@ -267,6 +267,8 @@ static void __dma_free_remap(void *cpu_addr, size_t size)
vunmap(cpu_addr); vunmap(cpu_addr);
} }
#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K
struct dma_pool { struct dma_pool {
size_t size; size_t size;
spinlock_t lock; spinlock_t lock;
...@@ -277,7 +279,7 @@ struct dma_pool { ...@@ -277,7 +279,7 @@ struct dma_pool {
}; };
static struct dma_pool atomic_pool = { static struct dma_pool atomic_pool = {
.size = SZ_256K, .size = DEFAULT_DMA_COHERENT_POOL_SIZE,
}; };
static int __init early_coherent_pool(char *p) static int __init early_coherent_pool(char *p)
...@@ -287,6 +289,21 @@ static int __init early_coherent_pool(char *p) ...@@ -287,6 +289,21 @@ static int __init early_coherent_pool(char *p)
} }
early_param("coherent_pool", early_coherent_pool); early_param("coherent_pool", early_coherent_pool);
void __init init_dma_coherent_pool_size(unsigned long size)
{
/*
* Catch any attempt to set the pool size too late.
*/
BUG_ON(atomic_pool.vaddr);
/*
* Set architecture specific coherent pool size only if
* it has not been changed by kernel command line parameter.
*/
if (atomic_pool.size == DEFAULT_DMA_COHERENT_POOL_SIZE)
atomic_pool.size = size;
}
/* /*
* Initialise the coherent pool for atomic allocations. * Initialise the coherent pool for atomic allocations.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment