diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index b2b5792b2caa..51c43c1f5630 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -16,8 +16,22 @@ void arch_sync_dma_for_device(phys_addr_t paddr, size_t size, enum dma_data_direction dir) { unsigned long start = (unsigned long)phys_to_virt(paddr); + unsigned long end = start + size; - dcache_clean_poc(start, start + size); + switch (dir) { + case DMA_BIDIRECTIONAL: + dcache_clean_inval_poc(start, end); + break; + case DMA_TO_DEVICE: + dcache_clean_poc(start, end); + break; + case DMA_FROM_DEVICE: + dcache_inval_poc(start, end); + break; + case DMA_NONE: + default: + break; + } } void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,