[PATCH 01/12] ARM: Add init_consistent_dma_size()

Nicolas Pitre nico at fluxnic.net
Thu Aug 18 09:02:26 EDT 2011


On Mon, 8 Aug 2011, Jon Medhurst wrote:

> This function 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.
> 
> Signed-off-by: Jon Medhurst <tixy at yxit.co.uk>

I'd add a comment above the declaration for init_consistent_dma_size() 
repeating the above commit message so it is clearer what this call does 
without having to look up the git history log.  Otherwise you can add:

Acked-by: Nicolas Pitre <nicolas.pitre at linaro.org>

> ---
>  arch/arm/include/asm/dma-mapping.h |    3 ++
>  arch/arm/include/asm/memory.h      |    9 ------
>  arch/arm/mm/dma-mapping.c          |   49 +++++++++++++++++++++++++++--------
>  arch/arm/mm/init.c                 |    9 ------
>  4 files changed, 41 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
> index 7a21d0b..328416b 100644
> --- a/arch/arm/include/asm/dma-mapping.h
> +++ b/arch/arm/include/asm/dma-mapping.h
> @@ -206,6 +206,9 @@ int dma_mmap_writecombine(struct device *, struct vm_area_struct *,
>  		void *, dma_addr_t, size_t);
>  
>  
> +extern void __init init_consistent_dma_size(unsigned long size);
> +
> +
>  #ifdef CONFIG_DMABOUNCE
>  /*
>   * For SA-1111, IXP425, and ADI systems  the dma-mapping functions are "magic"
> diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
> index b8de516..652fccc 100644
> --- a/arch/arm/include/asm/memory.h
> +++ b/arch/arm/include/asm/memory.h
> @@ -77,16 +77,7 @@
>   */
>  #define IOREMAP_MAX_ORDER	24
>  
> -/*
> - * Size of DMA-consistent memory region.  Must be multiple of 2M,
> - * between 2MB and 14MB inclusive.
> - */
> -#ifndef CONSISTENT_DMA_SIZE
> -#define CONSISTENT_DMA_SIZE 	SZ_2M
> -#endif
> -
>  #define CONSISTENT_END		(0xffe00000UL)
> -#define CONSISTENT_BASE		(CONSISTENT_END - CONSISTENT_DMA_SIZE)
>  
>  #else /* CONFIG_MMU */
>  
> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> index 0a0a1e7..5b59ce5 100644
> --- a/arch/arm/mm/dma-mapping.c
> +++ b/arch/arm/mm/dma-mapping.c
> @@ -18,12 +18,14 @@
>  #include <linux/device.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/highmem.h>
> +#include <linux/slab.h>
>  
>  #include <asm/memory.h>
>  #include <asm/highmem.h>
>  #include <asm/cacheflush.h>
>  #include <asm/tlbflush.h>
>  #include <asm/sizes.h>
> +#include <asm/mach/arch.h>
>  
>  #include "mm.h"
>  
> @@ -117,26 +119,41 @@ static void __dma_free_buffer(struct page *page, size_t size)
>  }
>  
>  #ifdef CONFIG_MMU
> -/* Sanity check size */
> -#if (CONSISTENT_DMA_SIZE % SZ_2M)
> -#error "CONSISTENT_DMA_SIZE must be multiple of 2MiB"
> -#endif
>  
> -#define CONSISTENT_OFFSET(x)	(((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
> -#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT)
> -#define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT)
> +
> +#define CONSISTENT_OFFSET(x)	(((unsigned long)(x) - consistent_base) >> PAGE_SHIFT)
> +#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - consistent_base) >> PGDIR_SHIFT)
>  
>  /*
>   * These are the page tables (2MB each) covering uncached, DMA consistent allocations
>   */
> -static pte_t *consistent_pte[NUM_CONSISTENT_PTES];
> +static pte_t **consistent_pte;
> +
> +#ifdef CONSISTENT_DMA_SIZE
> +#define DEFAULT_CONSISTENT_DMA_SIZE CONSISTENT_DMA_SIZE
> +#else
> +#define DEFAULT_CONSISTENT_DMA_SIZE SZ_2M
> +#endif
> +
> +unsigned long consistent_base = CONSISTENT_END - DEFAULT_CONSISTENT_DMA_SIZE;
> +
> +void __init init_consistent_dma_size(unsigned long size)
> +{
> +	unsigned long base = CONSISTENT_END - ALIGN(size, SZ_2M);
> +
> +	BUG_ON(consistent_pte); /* Check we're called before DMA region init */
> +	BUG_ON(base < VMALLOC_END);
> +
> +	/* Grow region to accommodate specified size  */
> +	if (base < consistent_base)
> +		consistent_base = base;
> +}
>  
>  #include "vmregion.h"
>  
>  static struct arm_vmregion_head consistent_head = {
>  	.vm_lock	= __SPIN_LOCK_UNLOCKED(&consistent_head.vm_lock),
>  	.vm_list	= LIST_HEAD_INIT(consistent_head.vm_list),
> -	.vm_start	= CONSISTENT_BASE,
>  	.vm_end		= CONSISTENT_END,
>  };
>  
> @@ -155,7 +172,17 @@ static int __init consistent_init(void)
>  	pmd_t *pmd;
>  	pte_t *pte;
>  	int i = 0;
> -	u32 base = CONSISTENT_BASE;
> +	unsigned long base = consistent_base;
> +	unsigned long num_ptes = (CONSISTENT_END - base) >> PGDIR_SHIFT;
> +
> +	consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL);
> +	if (!consistent_pte) {
> +		pr_err("%s: no memory\n", __func__);
> +		return -ENOMEM;
> +	}
> +
> +	pr_debug("DMA memory: 0x%08lx - 0x%08lx:\n", base, CONSISTENT_END);
> +	consistent_head.vm_start = base;
>  
>  	do {
>  		pgd = pgd_offset(&init_mm, base);
> @@ -198,7 +225,7 @@ __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot)
>  	size_t align;
>  	int bit;
>  
> -	if (!consistent_pte[0]) {
> +	if (!consistent_pte) {
>  		printk(KERN_ERR "%s: not initialised\n", __func__);
>  		dump_stack();
>  		return NULL;
> diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
> index 2fee782..2a7c173 100644
> --- a/arch/arm/mm/init.c
> +++ b/arch/arm/mm/init.c
> @@ -653,9 +653,6 @@ void __init mem_init(void)
>  			"    ITCM    : 0x%08lx - 0x%08lx   (%4ld kB)\n"
>  #endif
>  			"    fixmap  : 0x%08lx - 0x%08lx   (%4ld kB)\n"
> -#ifdef CONFIG_MMU
> -			"    DMA     : 0x%08lx - 0x%08lx   (%4ld MB)\n"
> -#endif
>  			"    vmalloc : 0x%08lx - 0x%08lx   (%4ld MB)\n"
>  			"    lowmem  : 0x%08lx - 0x%08lx   (%4ld MB)\n"
>  #ifdef CONFIG_HIGHMEM
> @@ -674,9 +671,6 @@ void __init mem_init(void)
>  			MLK(ITCM_OFFSET, (unsigned long) itcm_end),
>  #endif
>  			MLK(FIXADDR_START, FIXADDR_TOP),
> -#ifdef CONFIG_MMU
> -			MLM(CONSISTENT_BASE, CONSISTENT_END),
> -#endif
>  			MLM(VMALLOC_START, VMALLOC_END),
>  			MLM(PAGE_OFFSET, (unsigned long)high_memory),
>  #ifdef CONFIG_HIGHMEM
> @@ -699,9 +693,6 @@ void __init mem_init(void)
>  	 * be detected at build time already.
>  	 */
>  #ifdef CONFIG_MMU
> -	BUILD_BUG_ON(VMALLOC_END			> CONSISTENT_BASE);
> -	BUG_ON(VMALLOC_END				> CONSISTENT_BASE);
> -
>  	BUILD_BUG_ON(TASK_SIZE				> MODULES_VADDR);
>  	BUG_ON(TASK_SIZE 				> MODULES_VADDR);
>  #endif
> -- 
> 1.7.2.5
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 



More information about the linux-arm-kernel mailing list