diff options
author | Helge Deller <deller@gmx.de> | 2023-05-17 15:52:30 +0200 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2023-05-22 18:30:52 +0200 |
commit | 59fa12646d9f56c842b4d5b6418ed77af625c588 (patch) | |
tree | 36097c869963712a909e4e6f689eec4c8ea739a7 /arch/parisc | |
parent | Linux 6.4-rc3 (diff) | |
download | linux-59fa12646d9f56c842b4d5b6418ed77af625c588.tar.xz linux-59fa12646d9f56c842b4d5b6418ed77af625c588.zip |
parisc: Improve cache flushing for PCXL in arch_sync_dma_for_cpu()
Add comment in arch_sync_dma_for_device() and handle the direction flag in
arch_sync_dma_for_cpu().
When receiving data from the device (DMA_FROM_DEVICE) unconditionally
purge the data cache in arch_sync_dma_for_cpu().
Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'arch/parisc')
-rw-r--r-- | arch/parisc/kernel/pci-dma.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index ba87f791323b..71ed5391f29d 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c @@ -446,11 +446,27 @@ void arch_dma_free(struct device *dev, size_t size, void *vaddr, void arch_sync_dma_for_device(phys_addr_t paddr, size_t size, enum dma_data_direction dir) { + /* + * fdc: The data cache line is written back to memory, if and only if + * it is dirty, and then invalidated from the data cache. + */ flush_kernel_dcache_range((unsigned long)phys_to_virt(paddr), size); } void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, enum dma_data_direction dir) { - flush_kernel_dcache_range((unsigned long)phys_to_virt(paddr), size); + unsigned long addr = (unsigned long) phys_to_virt(paddr); + + switch (dir) { + case DMA_TO_DEVICE: + case DMA_BIDIRECTIONAL: + flush_kernel_dcache_range(addr, size); + return; + case DMA_FROM_DEVICE: + purge_kernel_dcache_range_asm(addr, addr + size); + return; + default: + BUG(); + } } |