diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2019-01-17 16:38:27 -0800 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-01-21 10:34:06 +0100 |
commit | 7179471fd7651e8ddd7758d2c3c94928421e5493 (patch) | |
tree | 3782d9e0de5e91a686ba636a3cd4a6eec31b8124 /arch | |
parent | 3e0c800c9b38b6e1eece0e4730919d1f8af09f36 (diff) | |
download | barebox-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')
-rw-r--r-- | arch/arm/cpu/mmu-common.c | 3 | ||||
-rw-r--r-- | arch/arm/cpu/mmu-common.h | 1 | ||||
-rw-r--r-- | arch/arm/cpu/mmu.c | 2 | ||||
-rw-r--r-- | arch/arm/cpu/mmu_64.c | 8 |
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) { |