Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc58e93a authored by Helge Deller's avatar Helge Deller Committed by Greg Kroah-Hartman
Browse files

parisc: Improve cache flushing for PCXL in arch_sync_dma_for_cpu()



[ Upstream commit 59fa12646d9f56c842b4d5b6418ed77af625c588 ]

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: default avatarHelge Deller <deller@gmx.de>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent da943564
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -464,13 +464,29 @@ void arch_dma_free(struct device *dev, size_t size, void *vaddr,
void arch_sync_dma_for_device(struct device *dev, 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(struct device *dev, 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();
	}
}

void arch_dma_cache_sync(struct device *dev, void *vaddr, size_t size,