mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
parisc: Improve cache flushing for PCXL in arch_sync_dma_for_cpu()
[ Upstream commit 59fa12646d ]
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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
73102fdb5b
commit
3f7625e086
@@ -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,
|
void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
|
||||||
enum dma_data_direction dir)
|
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);
|
flush_kernel_dcache_range((unsigned long)phys_to_virt(paddr), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
|
void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
|
||||||
enum dma_data_direction dir)
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user