diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/cpu/dma_32.c | 17 | ||||
-rw-r--r-- | arch/arm/cpu/dma_64.c | 13 | ||||
-rw-r--r-- | arch/arm/cpu/mmu-common.c | 9 | ||||
-rw-r--r-- | arch/arm/include/asm/dma.h | 12 | ||||
-rw-r--r-- | arch/arm/mach-bcm283x/mbox.c | 4 | ||||
-rw-r--r-- | arch/kvx/lib/dma-default.c | 16 | ||||
-rw-r--r-- | arch/mips/lib/dma-default.c | 18 | ||||
-rw-r--r-- | arch/riscv/cpu/dma.c | 23 | ||||
-rw-r--r-- | arch/sandbox/include/asm/dma.h | 12 | ||||
-rw-r--r-- | arch/x86/include/asm/dma.h | 12 |
10 files changed, 68 insertions, 68 deletions
diff --git a/arch/arm/cpu/dma_32.c b/arch/arm/cpu/dma_32.c index a66aa26b9b..842ea7033a 100644 --- a/arch/arm/cpu/dma_32.c +++ b/arch/arm/cpu/dma_32.c @@ -1,20 +1,19 @@ #include <dma.h> #include <asm/mmu.h> -void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { - /* - * FIXME: This function needs a device argument to support non 1:1 mappings - */ + unsigned long start = (unsigned long)vaddr; + unsigned long end = start + size; if (dir == DMA_FROM_DEVICE) { - __dma_inv_range(address, address + size); + __dma_inv_range(start, end); if (outer_cache.inv_range) - outer_cache.inv_range(address, address + size); + outer_cache.inv_range(start, end); } else { - __dma_clean_range(address, address + size); + __dma_clean_range(start, end); if (outer_cache.clean_range) - outer_cache.clean_range(address, address + size); + outer_cache.clean_range(start, end); } } diff --git a/arch/arm/cpu/dma_64.c b/arch/arm/cpu/dma_64.c index b4ae736c9b..74d7167860 100644 --- a/arch/arm/cpu/dma_64.c +++ b/arch/arm/cpu/dma_64.c @@ -2,15 +2,14 @@ #include <asm/mmu.h> #include <asm/cache.h> -void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { - /* - * FIXME: This function needs a device argument to support non 1:1 mappings - */ + unsigned long start = (unsigned long)vaddr; + unsigned long end = start + size - 1; if (dir == DMA_FROM_DEVICE) - v8_inv_dcache_range(address, address + size - 1); + v8_inv_dcache_range(start, end); else - v8_flush_dcache_range(address, address + size - 1); + v8_flush_dcache_range(start, end); } diff --git a/arch/arm/cpu/mmu-common.c b/arch/arm/cpu/mmu-common.c index 5208db21ec..acd4a9d354 100644 --- a/arch/arm/cpu/mmu-common.c +++ b/arch/arm/cpu/mmu-common.c @@ -14,14 +14,11 @@ #include <zero_page.h> #include "mmu-common.h" -void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir) +void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { - /* - * FIXME: This function needs a device argument to support non 1:1 mappings - */ if (dir != DMA_TO_DEVICE) - dma_inv_range((void *)address, size); + dma_inv_range(vaddr, size); } void *dma_alloc_map(size_t size, dma_addr_t *dma_handle, unsigned flags) diff --git a/arch/arm/include/asm/dma.h b/arch/arm/include/asm/dma.h index 75a6c1ad86..53953a4863 100644 --- a/arch/arm/include/asm/dma.h +++ b/arch/arm/include/asm/dma.h @@ -35,15 +35,15 @@ static inline void dma_free_coherent(void *mem, dma_addr_t dma_handle, free(mem); } -#define dma_sync_single_for_cpu dma_sync_single_for_cpu -static inline void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_cpu arch_sync_dma_for_cpu +static inline void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { } -#define dma_sync_single_for_device dma_sync_single_for_device -static inline void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_device arch_sync_dma_for_device +static inline void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { } #endif diff --git a/arch/arm/mach-bcm283x/mbox.c b/arch/arm/mach-bcm283x/mbox.c index 3abb81cc9b..32d646f4ad 100644 --- a/arch/arm/mach-bcm283x/mbox.c +++ b/arch/arm/mach-bcm283x/mbox.c @@ -66,7 +66,7 @@ static int bcm2835_mbox_call_raw(u32 chan, struct bcm2835_mbox_hdr *buffer, /* Send the request */ val = BCM2835_MBOX_PACK(chan, send); pr_debug("mbox: TX raw: 0x%08x\n", val); - dma_sync_single_for_device((unsigned long)send, buffer->buf_size, + dma_sync_single_for_device(NULL, (unsigned long)send, buffer->buf_size, DMA_BIDIRECTIONAL); writel(val, mbox_base + MAIL1_WRT); @@ -84,7 +84,7 @@ static int bcm2835_mbox_call_raw(u32 chan, struct bcm2835_mbox_hdr *buffer, /* Read the response */ val = readl(mbox_base + MAIL0_RD); pr_debug("mbox: RX raw: 0x%08x\n", val); - dma_sync_single_for_cpu((unsigned long)send, buffer->buf_size, + dma_sync_single_for_cpu(NULL, (unsigned long)send, buffer->buf_size, DMA_BIDIRECTIONAL); /* Validate the response */ diff --git a/arch/kvx/lib/dma-default.c b/arch/kvx/lib/dma-default.c index c84a32954e..1d37fb27a6 100644 --- a/arch/kvx/lib/dma-default.c +++ b/arch/kvx/lib/dma-default.c @@ -20,13 +20,15 @@ * (see https://lkml.org/lkml/2018/5/18/979) */ -void dma_sync_single_for_device(dma_addr_t addr, size_t size, - enum dma_data_direction dir) +void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { + unsigned long start = (unsigned long)vaddr; + /* dcache is Write-Through: no need to flush to force writeback */ switch (dir) { case DMA_FROM_DEVICE: - invalidate_dcache_range(addr, addr + size); + invalidate_dcache_range(start, start + size); break; case DMA_TO_DEVICE: case DMA_BIDIRECTIONAL: @@ -38,9 +40,11 @@ void dma_sync_single_for_device(dma_addr_t addr, size_t size, } } -void dma_sync_single_for_cpu(dma_addr_t addr, size_t size, - enum dma_data_direction dir) +void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { + unsigned long start = (unsigned long)vaddr; + /* CPU does not speculatively prefetches */ switch (dir) { case DMA_FROM_DEVICE: @@ -48,7 +52,7 @@ void dma_sync_single_for_cpu(dma_addr_t addr, size_t size, case DMA_TO_DEVICE: break; case DMA_BIDIRECTIONAL: - invalidate_dcache_range(addr, addr + size); + invalidate_dcache_range(start, start + size); break; default: BUG(); diff --git a/arch/mips/lib/dma-default.c b/arch/mips/lib/dma-default.c index 0347d7a7db..54e6665468 100644 --- a/arch/mips/lib/dma-default.c +++ b/arch/mips/lib/dma-default.c @@ -6,35 +6,35 @@ #include <dma.h> #include <asm/io.h> -void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir) +void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { - unsigned long virt = (unsigned long)phys_to_virt(address); + unsigned long start = (unsigned long)vaddr; switch (dir) { case DMA_TO_DEVICE: break; case DMA_FROM_DEVICE: case DMA_BIDIRECTIONAL: - dma_inv_range(virt, virt + size); + dma_inv_range(start, start + size); break; default: BUG(); } } -void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { - unsigned long virt = (unsigned long)phys_to_virt(address); + unsigned long start = (unsigned long)vaddr; switch (dir) { case DMA_FROM_DEVICE: - dma_inv_range(virt, virt + size); + dma_inv_range(start, start + size); break; case DMA_TO_DEVICE: case DMA_BIDIRECTIONAL: - dma_flush_range(virt, virt + size); + dma_flush_range(start, start + size); break; default: BUG(); diff --git a/arch/riscv/cpu/dma.c b/arch/riscv/cpu/dma.c index 5a4d714e5e..511170aaa4 100644 --- a/arch/riscv/cpu/dma.c +++ b/arch/riscv/cpu/dma.c @@ -52,23 +52,24 @@ void dma_set_ops(const struct dma_ops *ops) dma_ops = ops; } -void dma_sync_single_for_cpu(dma_addr_t address, size_t size, enum dma_data_direction dir) +void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { - /* - * FIXME: This function needs a device argument to support non 1:1 mappings - */ + unsigned long start = (unsigned long)vaddr; + unsigned long end = start + size; + if (dir != DMA_TO_DEVICE) - dma_ops->inv_range(address, address + size); + dma_ops->inv_range(start, end); } -void dma_sync_single_for_device(dma_addr_t address, size_t size, enum dma_data_direction dir) +void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { - /* - * FIXME: This function needs a device argument to support non 1:1 mappings - */ + unsigned long start = (unsigned long)vaddr; + unsigned long end = start + size; if (dir == DMA_FROM_DEVICE) - dma_ops->inv_range(address, address + size); + dma_ops->inv_range(start, end); else - dma_ops->flush_range(address, address + size); + dma_ops->flush_range(start, end); } diff --git a/arch/sandbox/include/asm/dma.h b/arch/sandbox/include/asm/dma.h index 958d10e2a1..ac8b408aae 100644 --- a/arch/sandbox/include/asm/dma.h +++ b/arch/sandbox/include/asm/dma.h @@ -43,15 +43,15 @@ static inline void dma_free_coherent(void *mem, dma_addr_t dma_handle, free(mem); } -#define dma_sync_single_for_cpu dma_sync_single_for_cpu -static inline void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_cpu arch_sync_dma_for_cpu +static inline void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { } -#define dma_sync_single_for_device dma_sync_single_for_device -static inline void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_device arch_sync_dma_for_device +static inline void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { } diff --git a/arch/x86/include/asm/dma.h b/arch/x86/include/asm/dma.h index 90791ecf3e..fe486c687f 100644 --- a/arch/x86/include/asm/dma.h +++ b/arch/x86/include/asm/dma.h @@ -32,15 +32,15 @@ static inline void dma_free_coherent(void *mem, dma_addr_t dma_handle, free(mem); } -#define dma_sync_single_for_cpu dma_sync_single_for_cpu -static inline void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_cpu arch_sync_dma_for_cpu +static inline void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir) { } -#define dma_sync_single_for_device dma_sync_single_for_device -static inline void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +#define arch_sync_dma_for_device arch_sync_dma_for_device +static inline void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir) { } |