1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file COPYING in the main directory of this archive 4 * for more details. 5 */ 6 7 #include <linux/dma-map-ops.h> 8 #include <linux/kernel.h> 9 #include <asm/cacheflush.h> 10 11 #ifndef CONFIG_COLDFIRE 12 void arch_dma_prep_coherent(struct page *page, size_t size) 13 { 14 cache_push(page_to_phys(page), size); 15 } 16 17 pgprot_t pgprot_dmacoherent(pgprot_t prot) 18 { 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; 26 } 27 #endif /* CONFIG_MMU && !CONFIG_COLDFIRE */ 28 29 void arch_sync_dma_for_device(phys_addr_t handle, size_t size, 30 enum dma_data_direction dir) 31 { 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 } 45 } 46