xref: /openbmc/linux/arch/sh/kernel/dma-coherent.c (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
15933f6d2SKuninori Morimoto // SPDX-License-Identifier: GPL-2.0
246bcde94SChristoph Hellwig /*
346bcde94SChristoph Hellwig  * Copyright (C) 2004 - 2007  Paul Mundt
446bcde94SChristoph Hellwig  */
546bcde94SChristoph Hellwig #include <linux/mm.h>
6*9f4df96bSChristoph Hellwig #include <linux/dma-map-ops.h>
746bcde94SChristoph Hellwig #include <asm/cacheflush.h>
846bcde94SChristoph Hellwig #include <asm/addrspace.h>
946bcde94SChristoph Hellwig 
arch_dma_prep_coherent(struct page * page,size_t size)106dfdf673SChristoph Hellwig void arch_dma_prep_coherent(struct page *page, size_t size)
1146bcde94SChristoph Hellwig {
126dfdf673SChristoph Hellwig 	__flush_purge_region(page_address(page), size);
1346bcde94SChristoph Hellwig }
1446bcde94SChristoph Hellwig 
arch_sync_dma_for_device(phys_addr_t paddr,size_t size,enum dma_data_direction dir)1556e35f9cSChristoph Hellwig void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
1656e35f9cSChristoph Hellwig 		enum dma_data_direction dir)
1746bcde94SChristoph Hellwig {
186fa1d28eSChristoph Hellwig 	void *addr = sh_cacheop_vaddr(phys_to_virt(paddr));
1946bcde94SChristoph Hellwig 
206fa1d28eSChristoph Hellwig 	switch (dir) {
2146bcde94SChristoph Hellwig 	case DMA_FROM_DEVICE:		/* invalidate only */
2246bcde94SChristoph Hellwig 		__flush_invalidate_region(addr, size);
2346bcde94SChristoph Hellwig 		break;
2446bcde94SChristoph Hellwig 	case DMA_TO_DEVICE:		/* writeback only */
2546bcde94SChristoph Hellwig 		__flush_wback_region(addr, size);
2646bcde94SChristoph Hellwig 		break;
2746bcde94SChristoph Hellwig 	case DMA_BIDIRECTIONAL:		/* writeback and invalidate */
2846bcde94SChristoph Hellwig 		__flush_purge_region(addr, size);
2946bcde94SChristoph Hellwig 		break;
3046bcde94SChristoph Hellwig 	default:
3146bcde94SChristoph Hellwig 		BUG();
3246bcde94SChristoph Hellwig 	}
3346bcde94SChristoph Hellwig }
34