1 // SPDX-License-Identifier: GPL-2.0 << 2 /* 1 /* 3 * Copyright (C) 2009-2010 PetaLogix !! 2 * This file is subject to the terms and conditions of the GNU General Public 4 * Copyright (C) 2006 Benjamin Herrenschmidt, !! 3 * License. See the file COPYING in the main directory of this archive 5 * !! 4 * for more details. 6 * Provide default implementations of the DMA << 7 * directly mapped busses. << 8 */ 5 */ 9 6 10 #include <linux/device.h> << 11 #include <linux/dma-map-ops.h> 7 #include <linux/dma-map-ops.h> 12 #include <linux/gfp.h> !! 8 #include <linux/kernel.h> 13 #include <linux/export.h> << 14 #include <linux/bug.h> << 15 #include <asm/cacheflush.h> 9 #include <asm/cacheflush.h> 16 10 17 static void __dma_sync(phys_addr_t paddr, size !! 11 #ifndef CONFIG_COLDFIRE 18 enum dma_data_direction direct !! 12 void arch_dma_prep_coherent(struct page *page, size_t size) 19 { 13 { 20 switch (direction) { !! 14 cache_push(page_to_phys(page), size); 21 case DMA_TO_DEVICE: << 22 case DMA_BIDIRECTIONAL: << 23 flush_dcache_range(paddr, padd << 24 break; << 25 case DMA_FROM_DEVICE: << 26 invalidate_dcache_range(paddr, << 27 break; << 28 default: << 29 BUG(); << 30 } << 31 } 15 } 32 16 33 void arch_sync_dma_for_device(phys_addr_t padd !! 17 pgprot_t pgprot_dmacoherent(pgprot_t prot) 34 enum dma_data_direction dir) << 35 { 18 { 36 __dma_sync(paddr, size, dir); !! 19 if (CPU_IS_040_OR_060) { >> 20 pgprot_val(prot) &= ~_PAGE_CACHE040; >> 21 pgprot_val(prot) |= _PAGE_GLOBAL040 | _PAGE_NOCACHE_S; >> 22 } else { >> 23 pgprot_val(prot) |= _PAGE_NOCACHE030; >> 24 } >> 25 return prot; 37 } 26 } >> 27 #endif /* CONFIG_MMU && !CONFIG_COLDFIRE */ 38 28 39 void arch_sync_dma_for_cpu(phys_addr_t paddr, !! 29 void arch_sync_dma_for_device(phys_addr_t handle, size_t size, 40 enum dma_data_direction dir) 30 enum dma_data_direction dir) 41 { 31 { 42 __dma_sync(paddr, size, dir); !! 32 switch (dir) { >> 33 case DMA_BIDIRECTIONAL: >> 34 case DMA_TO_DEVICE: >> 35 cache_push(handle, size); >> 36 break; >> 37 case DMA_FROM_DEVICE: >> 38 cache_clear(handle, size); >> 39 break; >> 40 default: >> 41 pr_err_ratelimited("dma_sync_single_for_device: unsupported dir %u\n", >> 42 dir); >> 43 break; >> 44 } 43 } 45 } 44 46
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.