1/* cacheflush.h: FRV cache flushing routines 2 * 3 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 12#ifndef _ASM_CACHEFLUSH_H 13#define _ASM_CACHEFLUSH_H 14 15/* Keep includes the same across arches. */ 16#include <linux/mm.h> 17 18/* 19 * virtually-indexed cache management (our cache is physically indexed) 20 */ 21#define flush_cache_all() do {} while(0) 22#define flush_cache_mm(mm) do {} while(0) 23#define flush_cache_dup_mm(mm) do {} while(0) 24#define flush_cache_range(mm, start, end) do {} while(0) 25#define flush_cache_page(vma, vmaddr, pfn) do {} while(0) 26#define flush_cache_vmap(start, end) do {} while(0) 27#define flush_cache_vunmap(start, end) do {} while(0) 28#define flush_dcache_mmap_lock(mapping) do {} while(0) 29#define flush_dcache_mmap_unlock(mapping) do {} while(0) 30 31/* 32 * physically-indexed cache management 33 * - see arch/frv/lib/cache.S 34 */ 35extern void frv_dcache_writeback(unsigned long start, unsigned long size); 36extern void frv_cache_invalidate(unsigned long start, unsigned long size); 37extern void frv_icache_invalidate(unsigned long start, unsigned long size); 38extern void frv_cache_wback_inv(unsigned long start, unsigned long size); 39 40static inline void __flush_cache_all(void) 41{ 42 asm volatile(" dcef @(gr0,gr0),#1 \n" 43 " icei @(gr0,gr0),#1 \n" 44 " membar \n" 45 : : : "memory" 46 ); 47} 48 49/* dcache/icache coherency... */ 50#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1 51#ifdef CONFIG_MMU 52extern void flush_dcache_page(struct page *page); 53#else 54static inline void flush_dcache_page(struct page *page) 55{ 56 unsigned long addr = page_to_phys(page); 57 frv_dcache_writeback(addr, addr + PAGE_SIZE); 58} 59#endif 60 61static inline void flush_page_to_ram(struct page *page) 62{ 63 flush_dcache_page(page); 64} 65 66static inline void flush_icache(void) 67{ 68 __flush_cache_all(); 69} 70 71static inline void flush_icache_range(unsigned long start, unsigned long end) 72{ 73 frv_cache_wback_inv(start, end); 74} 75 76#ifdef CONFIG_MMU 77extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, 78 unsigned long start, unsigned long len); 79#else 80static inline void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, 81 unsigned long start, unsigned long len) 82{ 83 frv_cache_wback_inv(start, start + len); 84} 85#endif 86 87static inline void flush_icache_page(struct vm_area_struct *vma, struct page *page) 88{ 89 flush_icache_user_range(vma, page, page_to_phys(page), PAGE_SIZE); 90} 91 92/* 93 * permit ptrace to access another process's address space through the icache 94 * and the dcache 95 */ 96#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ 97do { \ 98 memcpy((dst), (src), (len)); \ 99 flush_icache_user_range((vma), (page), (vaddr), (len)); \ 100} while(0) 101 102#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ 103 memcpy((dst), (src), (len)) 104 105#endif /* _ASM_CACHEFLUSH_H */ 106