[PATCH] Offer 'uncacheable memory' as DMA coherent memory for ARMv6

Aguirre, Sergio saaguirre at ti.com
Wed Jan 13 13:22:11 EST 2010


(Replacing linux-arm-kernel at lists.arm.linux.org.uk with linux-arm-kernel at lists.infradead.org, as I got a SMTP error: "550 Please direct your message to the new mailing lists on lists.infradead.org")

Russell,

> -----Original Message-----
> From: Russell King - ARM Linux [mailto:linux at arm.linux.org.uk]
> Sent: Wednesday, January 13, 2010 12:03 PM
> To: linux-arm-kernel at lists.arm.linux.org.uk
> Subject: [PATCH] Offer 'uncacheable memory' as DMA coherent memory for
> ARMv6
> 
> ARMv7 uses 'uncacheable normal memory' to implement DMA coherent memory,
> since mapping the same memory as two different types is defined to be
> unpredictable.
> 
> The same is strictly true for ARMv6 as well, although no bad behaviour
> has been observed thus far.  However, we do want to move ARMv6 to be
> architecturally compliant.  The down side is that some drivers may only
> have been tested on ARMv6, and may be missing the necessary barriers to
> make them work.
> 
> So, offer this as a configuration option, defaulting to enabled (to
> encourage drivers to be fixed.)
> 
> Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
> ---
> Note that I do not have any ARMv6 platforms which make use of DMA
> coherent memory, so this is completely untested.
> 
>  arch/arm/include/asm/pgtable.h |    2 +-
>  arch/arm/include/asm/system.h  |    2 +-
>  arch/arm/mm/Kconfig            |   19 +++++++++++++++++++
>  3 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/include/asm/pgtable.h
> b/arch/arm/include/asm/pgtable.h
> index 1139768..ab68cf1 100644
> --- a/arch/arm/include/asm/pgtable.h
> +++ b/arch/arm/include/asm/pgtable.h
> @@ -314,7 +314,7 @@ static inline pte_t pte_mkspecial(pte_t pte) { return
> pte; }
>  	__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED)
>  #define pgprot_writecombine(prot) \
>  	__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE)
> -#if __LINUX_ARM_ARCH__ >= 7
> +#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
>  #define pgprot_dmacoherent(prot) \
>  	__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE)
>  #else
> diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h
> index 058e7e9..020891e 100644
> --- a/arch/arm/include/asm/system.h
> +++ b/arch/arm/include/asm/system.h
> @@ -138,7 +138,7 @@ extern unsigned int user_debug;
>  #define dmb() __asm__ __volatile__ ("" : : : "memory")
>  #endif
> 
> -#if __LINUX_ARM_ARCH__ >= 7 || defined(CONFIG_SMP)
> +#if defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP)
>  #define mb()		dmb()
>  #define rmb()		dmb()
>  #define wmb()		dmb()
> diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
> index baf6384..f0a3576 100644
> --- a/arch/arm/mm/Kconfig
> +++ b/arch/arm/mm/Kconfig
> @@ -781,3 +781,22 @@ config ARM_L1_CACHE_SHIFT
>  	int
>  	default 6 if ARCH_OMAP3 || ARCH_S5PC1XX
>  	default 5
> +
> +config ARM_DMA_MEM_BUFFERABLE
> +	bool "Use non-cacheable memory for DMA" if CPU_V6 && !CPU_V7
> +	default y

Perhaps you meant here:

default y if CPU_V6 && !CPU_V7

?

Regards,
Sergio

> +	help
> +	  Historically, the kernel has used strongly ordered mappings to
> +	  provide DMA coherent memory.  With the advent of ARMv7, mapping
> +	  memory with differing types results in unpredictable behaviour,
> +	  so on these CPUs, this option is forced on.
> +
> +	  Multiple mappings with differing attributes is also unpredictable
> +	  on ARMv6 CPUs, but since they do not have aggressive speculative
> +	  prefetch, no harm appears to occur.
> +
> +	  However, drivers may be missing the necessary barriers for ARMv6,
> +	  and therefore turning this on may result in unpredictable driver
> +	  behaviour.  Therefore, we offer this as an option.
> +
> +	  You are recommended say 'Y' here and debug any affected drivers.
> 
> 
> -------------------------------------------------------------------
> List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-
> kernel
> FAQ:        http://www.arm.linux.org.uk/mailinglists/faq.php
> Etiquette:  http://www.arm.linux.org.uk/mailinglists/etiquette.php



More information about the linux-arm-kernel mailing list