diff options
Diffstat (limited to 'arch/parisc/kernel/pci-dma.c')
| -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(); +	}  }  | 
