summaryrefslogtreecommitdiffstats
path: root/arch/arm/cpu
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2019-01-17 16:38:27 -0800
committerSascha Hauer <s.hauer@pengutronix.de>2019-01-21 10:34:06 +0100
commit7179471fd7651e8ddd7758d2c3c94928421e5493 (patch)
tree3782d9e0de5e91a686ba636a3cd4a6eec31b8124 /arch/arm/cpu
parent3e0c800c9b38b6e1eece0e4730919d1f8af09f36 (diff)
downloadbarebox-7179471fd7651e8ddd7758d2c3c94928421e5493.tar.gz
barebox-7179471fd7651e8ddd7758d2c3c94928421e5493.tar.xz
ARM: mmu: Make sure DMA coherent memory is zeroed out
In order to avoid passing random/junky values to DMA/HW as well as to allow simplifying memory initialization in individual drivers, change dma_alloc_coherent() to guarantee that memory it returns is properly zeroed out. Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/cpu')
-rw-r--r--arch/arm/cpu/mmu-common.c3
-rw-r--r--arch/arm/cpu/mmu-common.h1
-rw-r--r--arch/arm/cpu/mmu.c2
-rw-r--r--arch/arm/cpu/mmu_64.c8
4 files changed, 12 insertions, 2 deletions
diff --git a/arch/arm/cpu/mmu-common.c b/arch/arm/cpu/mmu-common.c
index c5b24bff8e..aeefbb2daa 100644
--- a/arch/arm/cpu/mmu-common.c
+++ b/arch/arm/cpu/mmu-common.c
@@ -43,7 +43,8 @@ void *dma_alloc_map(size_t size, dma_addr_t *dma_handle, unsigned flags)
if (dma_handle)
*dma_handle = (dma_addr_t)ret;
- dma_inv_range(ret, size);
+ memset(ret, 0, size);
+ dma_flush_range(ret, size);
arch_remap_range(ret, size, flags);
diff --git a/arch/arm/cpu/mmu-common.h b/arch/arm/cpu/mmu-common.h
index 679799c3c5..0a33b138e1 100644
--- a/arch/arm/cpu/mmu-common.h
+++ b/arch/arm/cpu/mmu-common.h
@@ -2,6 +2,7 @@
#define __ARM_MMU_COMMON_H
void dma_inv_range(void *ptr, size_t size);
+void dma_flush_range(void *ptr, size_t size);
void *dma_alloc_map(size_t size, dma_addr_t *dma_handle, unsigned flags);
void __mmu_init(bool mmu_on);
diff --git a/arch/arm/cpu/mmu.c b/arch/arm/cpu/mmu.c
index 9e261a0bed..29816ad563 100644
--- a/arch/arm/cpu/mmu.c
+++ b/arch/arm/cpu/mmu.c
@@ -97,7 +97,7 @@ static u32 *find_pte(unsigned long adr)
return &table[(adr >> PAGE_SHIFT) & 0xff];
}
-static void dma_flush_range(void *ptr, size_t size)
+void dma_flush_range(void *ptr, size_t size)
{
unsigned long start = (unsigned long)ptr;
unsigned long end = start + size;
diff --git a/arch/arm/cpu/mmu_64.c b/arch/arm/cpu/mmu_64.c
index a3074b10d0..b45a69661e 100644
--- a/arch/arm/cpu/mmu_64.c
+++ b/arch/arm/cpu/mmu_64.c
@@ -233,6 +233,14 @@ void dma_inv_range(void *ptr, size_t size)
v8_inv_dcache_range(start, end);
}
+void dma_flush_range(void *ptr, size_t size)
+{
+ unsigned long start = (unsigned long)ptr;
+ unsigned long end = start + size - 1;
+
+ v8_flush_dcache_range(start, end);
+}
+
void dma_sync_single_for_device(dma_addr_t address, size_t size,
enum dma_data_direction dir)
{