| From dhobsong@igel.co.jp Mon Oct 29 00:54:00 2012 |
| From: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| Date: Mon, 29 Oct 2012 16:51:10 +0900 |
| Subject: [PATCH v2 53/58] ARM: DMA-Mapping: add function for setting coherent pool size from platform code |
| To: greg@kroah.com, laurent.pinchart@ideasonboard.com, horms@verge.net.au |
| Cc: ltsi-dev@lists.linuxfoundation.org, dhobsong@igel.co.jp |
| Message-ID: <1351497075-32717-54-git-send-email-dhobsong@igel.co.jp> |
| |
| |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| |
| 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: Josh Coombs <josh.coombs@gmail.com> |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| (cherry picked from commit 6e5267aa543817015edb4a65c66e15f9809f92bd) |
| |
| Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| --- |
| arch/arm/include/asm/dma-mapping.h | 7 +++++++ |
| arch/arm/mm/dma-mapping.c | 19 ++++++++++++++++++- |
| 2 files changed, 25 insertions(+), 1 deletions(-) |
| |
| diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h |
| index a048033..b5745a8 100644 |
| --- a/arch/arm/include/asm/dma-mapping.h |
| +++ b/arch/arm/include/asm/dma-mapping.h |
| @@ -203,6 +203,13 @@ static inline void dma_free_writecombine(struct device *dev, size_t size, |
| } |
| |
| /* |
| + * 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 |
| * DMA region above it's default value of 2MB. It must be called before the |
| * memory allocator is initialised, i.e. before any core_initcall. |
| diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c |
| index 258da10..3ff2585 100644 |
| --- a/arch/arm/mm/dma-mapping.c |
| +++ b/arch/arm/mm/dma-mapping.c |
| @@ -266,6 +266,8 @@ static void __dma_free_remap(void *cpu_addr, size_t size) |
| vunmap(cpu_addr); |
| } |
| |
| +#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K |
| + |
| struct dma_pool { |
| size_t size; |
| spinlock_t lock; |
| @@ -276,7 +278,7 @@ struct dma_pool { |
| }; |
| |
| static struct dma_pool atomic_pool = { |
| - .size = SZ_256K, |
| + .size = DEFAULT_DMA_COHERENT_POOL_SIZE, |
| }; |
| |
| static int __init early_coherent_pool(char *p) |
| @@ -286,6 +288,21 @@ static int __init early_coherent_pool(char *p) |
| } |
| 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. |
| */ |
| -- |
| 1.7.5.4 |
| |