summaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/dma-mapping.c
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2014-08-19 11:57:23 -0700
committerBrian Norris <computersforpeace@gmail.com>2014-08-19 11:57:23 -0700
commit5b49ab3e03f68eb49db4bce6290e5707b7f6c6f3 (patch)
tree090c7c069bc6c0f2b368ed8d0af861c275525411 /arch/arm/mm/dma-mapping.c
parentb25046b1e5e3f1423434da77ccc859f2f779d1ce (diff)
parent54ea17a597b00e46b3720e75dd7595cd5dfa5670 (diff)
downloadlinux-stable-5b49ab3e03f68eb49db4bce6290e5707b7f6c6f3.tar.gz
linux-stable-5b49ab3e03f68eb49db4bce6290e5707b7f6c6f3.tar.bz2
linux-stable-5b49ab3e03f68eb49db4bce6290e5707b7f6c6f3.zip
Merge l2-mtd/next into l2-mtd/master
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
-rw-r--r--arch/arm/mm/dma-mapping.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 4c88935654ca..7a996aaa061e 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -26,6 +26,7 @@
#include <linux/io.h>
#include <linux/vmalloc.h>
#include <linux/sizes.h>
+#include <linux/cma.h>
#include <asm/memory.h>
#include <asm/highmem.h>
@@ -461,12 +462,21 @@ void __init dma_contiguous_remap(void)
map.type = MT_MEMORY_DMA_READY;
/*
- * Clear previous low-memory mapping
+ * Clear previous low-memory mapping to ensure that the
+ * TLB does not see any conflicting entries, then flush
+ * the TLB of the old entries before creating new mappings.
+ *
+ * This ensures that any speculatively loaded TLB entries
+ * (even though they may be rare) can not cause any problems,
+ * and ensures that this code is architecturally compliant.
*/
for (addr = __phys_to_virt(start); addr < __phys_to_virt(end);
addr += PMD_SIZE)
pmd_clear(pmd_off_k(addr));
+ flush_tlb_kernel_range(__phys_to_virt(start),
+ __phys_to_virt(end));
+
iotable_init(&map, 1);
}
}