1
2
3
4
5
6
7
8
9#ifndef _ASM_CACHEFLUSH_H
10#define _ASM_CACHEFLUSH_H
11
12
13#include <linux/mm.h>
14#include <asm/cpu-features.h>
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32extern void (*flush_cache_all)(void);
33extern void (*__flush_cache_all)(void);
34extern void (*flush_cache_mm)(struct mm_struct *mm);
35#define flush_cache_dup_mm(mm) do { (void) (mm); } while (0)
36extern void (*flush_cache_range)(struct vm_area_struct *vma,
37 unsigned long start, unsigned long end);
38extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
39extern void __flush_dcache_page(struct page *page);
40
41#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
42static inline void flush_dcache_page(struct page *page)
43{
44 if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc)
45 __flush_dcache_page(page);
46
47}
48
49#define flush_dcache_mmap_lock(mapping) do { } while (0)
50#define flush_dcache_mmap_unlock(mapping) do { } while (0)
51
52#define ARCH_HAS_FLUSH_ANON_PAGE
53extern void __flush_anon_page(struct page *, unsigned long);
54static inline void flush_anon_page(struct vm_area_struct *vma,
55 struct page *page, unsigned long vmaddr)
56{
57 if (cpu_has_dc_aliases && PageAnon(page))
58 __flush_anon_page(page, vmaddr);
59}
60
61static inline void flush_icache_page(struct vm_area_struct *vma,
62 struct page *page)
63{
64}
65
66extern void (*flush_icache_range)(unsigned long start, unsigned long end);
67extern void (*local_flush_icache_range)(unsigned long start, unsigned long end);
68
69extern void (*__flush_cache_vmap)(void);
70
71static inline void flush_cache_vmap(unsigned long start, unsigned long end)
72{
73 if (cpu_has_dc_aliases)
74 __flush_cache_vmap();
75}
76
77extern void (*__flush_cache_vunmap)(void);
78
79static inline void flush_cache_vunmap(unsigned long start, unsigned long end)
80{
81 if (cpu_has_dc_aliases)
82 __flush_cache_vunmap();
83}
84
85extern void copy_to_user_page(struct vm_area_struct *vma,
86 struct page *page, unsigned long vaddr, void *dst, const void *src,
87 unsigned long len);
88
89extern void copy_from_user_page(struct vm_area_struct *vma,
90 struct page *page, unsigned long vaddr, void *dst, const void *src,
91 unsigned long len);
92
93extern void (*flush_cache_sigtramp)(unsigned long addr);
94extern void (*flush_icache_all)(void);
95extern void (*local_flush_data_cache_page)(void * addr);
96extern void (*flush_data_cache_page)(unsigned long addr);
97
98
99
100
101
102#define PG_dcache_dirty PG_arch_1
103
104#define Page_dcache_dirty(page) \
105 test_bit(PG_dcache_dirty, &(page)->flags)
106#define SetPageDcacheDirty(page) \
107 set_bit(PG_dcache_dirty, &(page)->flags)
108#define ClearPageDcacheDirty(page) \
109 clear_bit(PG_dcache_dirty, &(page)->flags)
110
111
112unsigned long run_uncached(void *func);
113
114extern void *kmap_coherent(struct page *page, unsigned long addr);
115extern void kunmap_coherent(void);
116
117#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
118static inline void flush_kernel_dcache_page(struct page *page)
119{
120 BUG_ON(cpu_has_dc_aliases && PageHighMem(page));
121}
122
123
124
125
126
127extern void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
128
129static inline void flush_kernel_vmap_range(void *vaddr, int size)
130{
131 if (cpu_has_dc_aliases)
132 __flush_kernel_vmap_range((unsigned long) vaddr, size);
133}
134
135static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
136{
137 if (cpu_has_dc_aliases)
138 __flush_kernel_vmap_range((unsigned long) vaddr, size);
139}
140
141#endif
142