1*8beb8503SMichal Simek /* 2*8beb8503SMichal Simek * Copyright (C) 2007 PetaLogix 3*8beb8503SMichal Simek * Copyright (C) 2007 John Williams <john.williams@petalogix.com> 4*8beb8503SMichal Simek * based on v850 version which was 5*8beb8503SMichal Simek * Copyright (C) 2001,02,03 NEC Electronics Corporation 6*8beb8503SMichal Simek * Copyright (C) 2001,02,03 Miles Bader <miles@gnu.org> 7*8beb8503SMichal Simek * 8*8beb8503SMichal Simek * This file is subject to the terms and conditions of the GNU General 9*8beb8503SMichal Simek * Public License. See the file COPYING in the main directory of this 10*8beb8503SMichal Simek * archive for more details. 11*8beb8503SMichal Simek * 12*8beb8503SMichal Simek */ 13*8beb8503SMichal Simek 14*8beb8503SMichal Simek #ifndef _ASM_MICROBLAZE_CACHEFLUSH_H 15*8beb8503SMichal Simek #define _ASM_MICROBLAZE_CACHEFLUSH_H 16*8beb8503SMichal Simek 17*8beb8503SMichal Simek /* Somebody depends on this; sigh... */ 18*8beb8503SMichal Simek #include <linux/mm.h> 19*8beb8503SMichal Simek 20*8beb8503SMichal Simek /* 21*8beb8503SMichal Simek * Cache handling functions. 22*8beb8503SMichal Simek * Microblaze has a write-through data cache, meaning that the data cache 23*8beb8503SMichal Simek * never needs to be flushed. The only flushing operations that are 24*8beb8503SMichal Simek * implemented are to invalidate the instruction cache. These are called 25*8beb8503SMichal Simek * after loading a user application into memory, we must invalidate the 26*8beb8503SMichal Simek * instruction cache to make sure we don't fetch old, bad code. 27*8beb8503SMichal Simek */ 28*8beb8503SMichal Simek 29*8beb8503SMichal Simek /* FIXME for LL-temac driver */ 30*8beb8503SMichal Simek #define invalidate_dcache_range(start, end) \ 31*8beb8503SMichal Simek __invalidate_dcache_range(start, end) 32*8beb8503SMichal Simek 33*8beb8503SMichal Simek #define flush_cache_all() __invalidate_cache_all() 34*8beb8503SMichal Simek #define flush_cache_mm(mm) do { } while (0) 35*8beb8503SMichal Simek #define flush_cache_range(vma, start, end) __invalidate_cache_all() 36*8beb8503SMichal Simek #define flush_cache_page(vma, vmaddr, pfn) do { } while (0) 37*8beb8503SMichal Simek 38*8beb8503SMichal Simek #define flush_dcache_range(start, end) __invalidate_dcache_range(start, end) 39*8beb8503SMichal Simek #define flush_dcache_page(page) do { } while (0) 40*8beb8503SMichal Simek #define flush_dcache_mmap_lock(mapping) do { } while (0) 41*8beb8503SMichal Simek #define flush_dcache_mmap_unlock(mapping) do { } while (0) 42*8beb8503SMichal Simek 43*8beb8503SMichal Simek #define flush_icache_range(start, len) __invalidate_icache_range(start, len) 44*8beb8503SMichal Simek #define flush_icache_page(vma, pg) do { } while (0) 45*8beb8503SMichal Simek 46*8beb8503SMichal Simek #define flush_cache_vmap(start, end) do { } while (0) 47*8beb8503SMichal Simek #define flush_cache_vunmap(start, end) do { } while (0) 48*8beb8503SMichal Simek 49*8beb8503SMichal Simek struct page; 50*8beb8503SMichal Simek struct mm_struct; 51*8beb8503SMichal Simek struct vm_area_struct; 52*8beb8503SMichal Simek 53*8beb8503SMichal Simek /* see arch/microblaze/kernel/cache.c */ 54*8beb8503SMichal Simek extern void __invalidate_icache_all(void); 55*8beb8503SMichal Simek extern void __invalidate_icache_range(unsigned long start, unsigned long end); 56*8beb8503SMichal Simek extern void __invalidate_icache_page(struct vm_area_struct *vma, 57*8beb8503SMichal Simek struct page *page); 58*8beb8503SMichal Simek extern void __invalidate_icache_user_range(struct vm_area_struct *vma, 59*8beb8503SMichal Simek struct page *page, 60*8beb8503SMichal Simek unsigned long adr, int len); 61*8beb8503SMichal Simek extern void __invalidate_cache_sigtramp(unsigned long addr); 62*8beb8503SMichal Simek 63*8beb8503SMichal Simek extern void __invalidate_dcache_all(void); 64*8beb8503SMichal Simek extern void __invalidate_dcache_range(unsigned long start, unsigned long end); 65*8beb8503SMichal Simek extern void __invalidate_dcache_page(struct vm_area_struct *vma, 66*8beb8503SMichal Simek struct page *page); 67*8beb8503SMichal Simek extern void __invalidate_dcache_user_range(struct vm_area_struct *vma, 68*8beb8503SMichal Simek struct page *page, 69*8beb8503SMichal Simek unsigned long adr, int len); 70*8beb8503SMichal Simek 71*8beb8503SMichal Simek extern inline void __invalidate_cache_all(void) 72*8beb8503SMichal Simek { 73*8beb8503SMichal Simek __invalidate_icache_all(); 74*8beb8503SMichal Simek __invalidate_dcache_all(); 75*8beb8503SMichal Simek } 76*8beb8503SMichal Simek 77*8beb8503SMichal Simek #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ 78*8beb8503SMichal Simek do { memcpy((dst), (src), (len)); \ 79*8beb8503SMichal Simek flush_icache_range((unsigned) (dst), (unsigned) (dst) + (len)); \ 80*8beb8503SMichal Simek } while (0) 81*8beb8503SMichal Simek 82*8beb8503SMichal Simek #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ 83*8beb8503SMichal Simek memcpy((dst), (src), (len)) 84*8beb8503SMichal Simek 85*8beb8503SMichal Simek #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ 86