xref: /openbmc/linux/arch/microblaze/include/asm/cacheflush.h (revision 8beb8503bfa305cd7d9efa590517a9c01e2f97b4)
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