Commit f1ae98da authored by Marek Szyprowski's avatar Marek Szyprowski

ARM: dma-mapping: remove unconditional dependency on CMA

CMA has been enabled unconditionally on all ARMv6+ systems to solve the
long standing issue of double kernel mappings for all dma coherent
buffers. This however created a dependency on CONFIG_EXPERIMENTAL for
the whole ARM architecture what should be really avoided. This patch
removes this dependency and lets one use old, well-tested dma-mapping
implementation also on ARMv6+ systems without the need to use
EXPERIMENTAL stuff.
Reported-by: default avatarRussell King <linux@arm.linux.org.uk>
Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
parent f8f5701b
...@@ -7,7 +7,6 @@ config ARM ...@@ -7,7 +7,6 @@ config ARM
select HAVE_IDE if PCI || ISA || PCMCIA select HAVE_IDE if PCI || ISA || PCMCIA
select HAVE_DMA_ATTRS select HAVE_DMA_ATTRS
select HAVE_DMA_CONTIGUOUS if (CPU_V6 || CPU_V6K || CPU_V7) select HAVE_DMA_CONTIGUOUS if (CPU_V6 || CPU_V6K || CPU_V7)
select CMA if (CPU_V6 || CPU_V6K || CPU_V7)
select HAVE_MEMBLOCK select HAVE_MEMBLOCK
select RTC_LIB select RTC_LIB
select SYS_SUPPORTS_APM_EMULATION select SYS_SUPPORTS_APM_EMULATION
......
...@@ -268,10 +268,8 @@ static int __init consistent_init(void) ...@@ -268,10 +268,8 @@ static int __init consistent_init(void)
unsigned long base = consistent_base; unsigned long base = consistent_base;
unsigned long num_ptes = (CONSISTENT_END - base) >> PMD_SHIFT; unsigned long num_ptes = (CONSISTENT_END - base) >> PMD_SHIFT;
#ifndef CONFIG_ARM_DMA_USE_IOMMU if (IS_ENABLED(CONFIG_CMA) && !IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU))
if (cpu_architecture() >= CPU_ARCH_ARMv6)
return 0; return 0;
#endif
consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL); consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL);
if (!consistent_pte) { if (!consistent_pte) {
...@@ -342,7 +340,7 @@ static int __init coherent_init(void) ...@@ -342,7 +340,7 @@ static int __init coherent_init(void)
struct page *page; struct page *page;
void *ptr; void *ptr;
if (cpu_architecture() < CPU_ARCH_ARMv6) if (!IS_ENABLED(CONFIG_CMA))
return 0; return 0;
ptr = __alloc_from_contiguous(NULL, size, prot, &page); ptr = __alloc_from_contiguous(NULL, size, prot, &page);
...@@ -704,7 +702,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, ...@@ -704,7 +702,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
if (arch_is_coherent() || nommu()) if (arch_is_coherent() || nommu())
addr = __alloc_simple_buffer(dev, size, gfp, &page); addr = __alloc_simple_buffer(dev, size, gfp, &page);
else if (cpu_architecture() < CPU_ARCH_ARMv6) else if (!IS_ENABLED(CONFIG_CMA))
addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller); addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller);
else if (gfp & GFP_ATOMIC) else if (gfp & GFP_ATOMIC)
addr = __alloc_from_pool(dev, size, &page, caller); addr = __alloc_from_pool(dev, size, &page, caller);
...@@ -773,7 +771,7 @@ void arm_dma_free(struct device *dev, size_t size, void *cpu_addr, ...@@ -773,7 +771,7 @@ void arm_dma_free(struct device *dev, size_t size, void *cpu_addr,
if (arch_is_coherent() || nommu()) { if (arch_is_coherent() || nommu()) {
__dma_free_buffer(page, size); __dma_free_buffer(page, size);
} else if (cpu_architecture() < CPU_ARCH_ARMv6) { } else if (!IS_ENABLED(CONFIG_CMA)) {
__dma_free_remap(cpu_addr, size); __dma_free_remap(cpu_addr, size);
__dma_free_buffer(page, size); __dma_free_buffer(page, size);
} else { } else {
......
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