blob: 6a44c0e7ba40eff1101877ed75d3e7fff19b2c1c [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001// SPDX-License-Identifier: GPL-2.0
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002/*
3 * Copyright (C) 2004 - 2007 Paul Mundt
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00004 */
5#include <linux/mm.h>
Olivier Deprez157378f2022-04-04 15:47:50 +02006#include <linux/dma-map-ops.h>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00007#include <asm/cacheflush.h>
8#include <asm/addrspace.h>
9
Olivier Deprez157378f2022-04-04 15:47:50 +020010void arch_dma_prep_coherent(struct page *page, size_t size)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000011{
Olivier Deprez157378f2022-04-04 15:47:50 +020012 __flush_purge_region(page_address(page), size);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000013}
14
Olivier Deprez157378f2022-04-04 15:47:50 +020015void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
16 enum dma_data_direction dir)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000017{
18 void *addr = sh_cacheop_vaddr(phys_to_virt(paddr));
19
20 switch (dir) {
21 case DMA_FROM_DEVICE: /* invalidate only */
22 __flush_invalidate_region(addr, size);
23 break;
24 case DMA_TO_DEVICE: /* writeback only */
25 __flush_wback_region(addr, size);
26 break;
27 case DMA_BIDIRECTIONAL: /* writeback and invalidate */
28 __flush_purge_region(addr, size);
29 break;
30 default:
31 BUG();
32 }
33}