diff options
Diffstat (limited to 'arch/mn10300/include/asm/cacheflush.h')
-rw-r--r-- | arch/mn10300/include/asm/cacheflush.h | 164 |
1 files changed, 109 insertions, 55 deletions
diff --git a/arch/mn10300/include/asm/cacheflush.h b/arch/mn10300/include/asm/cacheflush.h index 29e692f7f030..faed90240ded 100644 --- a/arch/mn10300/include/asm/cacheflush.h +++ b/arch/mn10300/include/asm/cacheflush.h | |||
@@ -17,66 +17,55 @@ | |||
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | 18 | ||
19 | /* | 19 | /* |
20 | * virtually-indexed cache management (our cache is physically indexed) | 20 | * Primitive routines |
21 | */ | 21 | */ |
22 | #define flush_cache_all() do {} while (0) | 22 | #ifdef CONFIG_MN10300_CACHE_ENABLED |
23 | #define flush_cache_mm(mm) do {} while (0) | 23 | extern void mn10300_local_icache_inv(void); |
24 | #define flush_cache_dup_mm(mm) do {} while (0) | 24 | extern void mn10300_local_icache_inv_page(unsigned long start); |
25 | #define flush_cache_range(mm, start, end) do {} while (0) | 25 | extern void mn10300_local_icache_inv_range(unsigned long start, unsigned long end); |
26 | #define flush_cache_page(vma, vmaddr, pfn) do {} while (0) | 26 | extern void mn10300_local_icache_inv_range2(unsigned long start, unsigned long size); |
27 | #define flush_cache_vmap(start, end) do {} while (0) | 27 | extern void mn10300_local_dcache_inv(void); |
28 | #define flush_cache_vunmap(start, end) do {} while (0) | 28 | extern void mn10300_local_dcache_inv_page(unsigned long start); |
29 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 | 29 | extern void mn10300_local_dcache_inv_range(unsigned long start, unsigned long end); |
30 | #define flush_dcache_page(page) do {} while (0) | 30 | extern void mn10300_local_dcache_inv_range2(unsigned long start, unsigned long size); |
31 | #define flush_dcache_mmap_lock(mapping) do {} while (0) | ||
32 | #define flush_dcache_mmap_unlock(mapping) do {} while (0) | ||
33 | |||
34 | /* | ||
35 | * physically-indexed cache management | ||
36 | */ | ||
37 | #ifndef CONFIG_MN10300_CACHE_DISABLED | ||
38 | |||
39 | extern void flush_icache_range(unsigned long start, unsigned long end); | ||
40 | extern void flush_icache_page(struct vm_area_struct *vma, struct page *pg); | ||
41 | |||
42 | #else | ||
43 | |||
44 | #define flush_icache_range(start, end) do {} while (0) | ||
45 | #define flush_icache_page(vma, pg) do {} while (0) | ||
46 | |||
47 | #endif | ||
48 | |||
49 | #define flush_icache_user_range(vma, pg, adr, len) \ | ||
50 | flush_icache_range(adr, adr + len) | ||
51 | |||
52 | #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ | ||
53 | do { \ | ||
54 | memcpy(dst, src, len); \ | ||
55 | flush_icache_page(vma, page); \ | ||
56 | } while (0) | ||
57 | |||
58 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | ||
59 | memcpy(dst, src, len) | ||
60 | |||
61 | /* | ||
62 | * primitive routines | ||
63 | */ | ||
64 | #ifndef CONFIG_MN10300_CACHE_DISABLED | ||
65 | extern void mn10300_icache_inv(void); | 31 | extern void mn10300_icache_inv(void); |
32 | extern void mn10300_icache_inv_page(unsigned long start); | ||
33 | extern void mn10300_icache_inv_range(unsigned long start, unsigned long end); | ||
34 | extern void mn10300_icache_inv_range2(unsigned long start, unsigned long size); | ||
66 | extern void mn10300_dcache_inv(void); | 35 | extern void mn10300_dcache_inv(void); |
67 | extern void mn10300_dcache_inv_page(unsigned start); | 36 | extern void mn10300_dcache_inv_page(unsigned long start); |
68 | extern void mn10300_dcache_inv_range(unsigned start, unsigned end); | 37 | extern void mn10300_dcache_inv_range(unsigned long start, unsigned long end); |
69 | extern void mn10300_dcache_inv_range2(unsigned start, unsigned size); | 38 | extern void mn10300_dcache_inv_range2(unsigned long start, unsigned long size); |
70 | #ifdef CONFIG_MN10300_CACHE_WBACK | 39 | #ifdef CONFIG_MN10300_CACHE_WBACK |
40 | extern void mn10300_local_dcache_flush(void); | ||
41 | extern void mn10300_local_dcache_flush_page(unsigned long start); | ||
42 | extern void mn10300_local_dcache_flush_range(unsigned long start, unsigned long end); | ||
43 | extern void mn10300_local_dcache_flush_range2(unsigned long start, unsigned long size); | ||
44 | extern void mn10300_local_dcache_flush_inv(void); | ||
45 | extern void mn10300_local_dcache_flush_inv_page(unsigned long start); | ||
46 | extern void mn10300_local_dcache_flush_inv_range(unsigned long start, unsigned long end); | ||
47 | extern void mn10300_local_dcache_flush_inv_range2(unsigned long start, unsigned long size); | ||
71 | extern void mn10300_dcache_flush(void); | 48 | extern void mn10300_dcache_flush(void); |
72 | extern void mn10300_dcache_flush_page(unsigned start); | 49 | extern void mn10300_dcache_flush_page(unsigned long start); |
73 | extern void mn10300_dcache_flush_range(unsigned start, unsigned end); | 50 | extern void mn10300_dcache_flush_range(unsigned long start, unsigned long end); |
74 | extern void mn10300_dcache_flush_range2(unsigned start, unsigned size); | 51 | extern void mn10300_dcache_flush_range2(unsigned long start, unsigned long size); |
75 | extern void mn10300_dcache_flush_inv(void); | 52 | extern void mn10300_dcache_flush_inv(void); |
76 | extern void mn10300_dcache_flush_inv_page(unsigned start); | 53 | extern void mn10300_dcache_flush_inv_page(unsigned long start); |
77 | extern void mn10300_dcache_flush_inv_range(unsigned start, unsigned end); | 54 | extern void mn10300_dcache_flush_inv_range(unsigned long start, unsigned long end); |
78 | extern void mn10300_dcache_flush_inv_range2(unsigned start, unsigned size); | 55 | extern void mn10300_dcache_flush_inv_range2(unsigned long start, unsigned long size); |
79 | #else | 56 | #else |
57 | #define mn10300_local_dcache_flush() do {} while (0) | ||
58 | #define mn10300_local_dcache_flush_page(start) do {} while (0) | ||
59 | #define mn10300_local_dcache_flush_range(start, end) do {} while (0) | ||
60 | #define mn10300_local_dcache_flush_range2(start, size) do {} while (0) | ||
61 | #define mn10300_local_dcache_flush_inv() \ | ||
62 | mn10300_local_dcache_inv() | ||
63 | #define mn10300_local_dcache_flush_inv_page(start) \ | ||
64 | mn10300_local_dcache_inv_page(start) | ||
65 | #define mn10300_local_dcache_flush_inv_range(start, end) \ | ||
66 | mn10300_local_dcache_inv_range(start, end) | ||
67 | #define mn10300_local_dcache_flush_inv_range2(start, size) \ | ||
68 | mn10300_local_dcache_inv_range2(start, size) | ||
80 | #define mn10300_dcache_flush() do {} while (0) | 69 | #define mn10300_dcache_flush() do {} while (0) |
81 | #define mn10300_dcache_flush_page(start) do {} while (0) | 70 | #define mn10300_dcache_flush_page(start) do {} while (0) |
82 | #define mn10300_dcache_flush_range(start, end) do {} while (0) | 71 | #define mn10300_dcache_flush_range(start, end) do {} while (0) |
@@ -90,7 +79,26 @@ extern void mn10300_dcache_flush_inv_range2(unsigned start, unsigned size); | |||
90 | mn10300_dcache_inv_range2((start), (size)) | 79 | mn10300_dcache_inv_range2((start), (size)) |
91 | #endif /* CONFIG_MN10300_CACHE_WBACK */ | 80 | #endif /* CONFIG_MN10300_CACHE_WBACK */ |
92 | #else | 81 | #else |
82 | #define mn10300_local_icache_inv() do {} while (0) | ||
83 | #define mn10300_local_icache_inv_page(start) do {} while (0) | ||
84 | #define mn10300_local_icache_inv_range(start, end) do {} while (0) | ||
85 | #define mn10300_local_icache_inv_range2(start, size) do {} while (0) | ||
86 | #define mn10300_local_dcache_inv() do {} while (0) | ||
87 | #define mn10300_local_dcache_inv_page(start) do {} while (0) | ||
88 | #define mn10300_local_dcache_inv_range(start, end) do {} while (0) | ||
89 | #define mn10300_local_dcache_inv_range2(start, size) do {} while (0) | ||
90 | #define mn10300_local_dcache_flush() do {} while (0) | ||
91 | #define mn10300_local_dcache_flush_inv_page(start) do {} while (0) | ||
92 | #define mn10300_local_dcache_flush_inv() do {} while (0) | ||
93 | #define mn10300_local_dcache_flush_inv_range(start, end)do {} while (0) | ||
94 | #define mn10300_local_dcache_flush_inv_range2(start, size) do {} while (0) | ||
95 | #define mn10300_local_dcache_flush_page(start) do {} while (0) | ||
96 | #define mn10300_local_dcache_flush_range(start, end) do {} while (0) | ||
97 | #define mn10300_local_dcache_flush_range2(start, size) do {} while (0) | ||
93 | #define mn10300_icache_inv() do {} while (0) | 98 | #define mn10300_icache_inv() do {} while (0) |
99 | #define mn10300_icache_inv_page(start) do {} while (0) | ||
100 | #define mn10300_icache_inv_range(start, end) do {} while (0) | ||
101 | #define mn10300_icache_inv_range2(start, size) do {} while (0) | ||
94 | #define mn10300_dcache_inv() do {} while (0) | 102 | #define mn10300_dcache_inv() do {} while (0) |
95 | #define mn10300_dcache_inv_page(start) do {} while (0) | 103 | #define mn10300_dcache_inv_page(start) do {} while (0) |
96 | #define mn10300_dcache_inv_range(start, end) do {} while (0) | 104 | #define mn10300_dcache_inv_range(start, end) do {} while (0) |
@@ -103,10 +111,56 @@ extern void mn10300_dcache_flush_inv_range2(unsigned start, unsigned size); | |||
103 | #define mn10300_dcache_flush_page(start) do {} while (0) | 111 | #define mn10300_dcache_flush_page(start) do {} while (0) |
104 | #define mn10300_dcache_flush_range(start, end) do {} while (0) | 112 | #define mn10300_dcache_flush_range(start, end) do {} while (0) |
105 | #define mn10300_dcache_flush_range2(start, size) do {} while (0) | 113 | #define mn10300_dcache_flush_range2(start, size) do {} while (0) |
106 | #endif /* CONFIG_MN10300_CACHE_DISABLED */ | 114 | #endif /* CONFIG_MN10300_CACHE_ENABLED */ |
115 | |||
116 | /* | ||
117 | * Virtually-indexed cache management (our cache is physically indexed) | ||
118 | */ | ||
119 | #define flush_cache_all() do {} while (0) | ||
120 | #define flush_cache_mm(mm) do {} while (0) | ||
121 | #define flush_cache_dup_mm(mm) do {} while (0) | ||
122 | #define flush_cache_range(mm, start, end) do {} while (0) | ||
123 | #define flush_cache_page(vma, vmaddr, pfn) do {} while (0) | ||
124 | #define flush_cache_vmap(start, end) do {} while (0) | ||
125 | #define flush_cache_vunmap(start, end) do {} while (0) | ||
126 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 | ||
127 | #define flush_dcache_page(page) do {} while (0) | ||
128 | #define flush_dcache_mmap_lock(mapping) do {} while (0) | ||
129 | #define flush_dcache_mmap_unlock(mapping) do {} while (0) | ||
130 | |||
131 | /* | ||
132 | * Physically-indexed cache management | ||
133 | */ | ||
134 | #if defined(CONFIG_MN10300_CACHE_FLUSH_ICACHE) | ||
135 | extern void flush_icache_page(struct vm_area_struct *vma, struct page *page); | ||
136 | extern void flush_icache_range(unsigned long start, unsigned long end); | ||
137 | #elif defined(CONFIG_MN10300_CACHE_INV_ICACHE) | ||
138 | static inline void flush_icache_page(struct vm_area_struct *vma, | ||
139 | struct page *page) | ||
140 | { | ||
141 | mn10300_icache_inv_page(page_to_phys(page)); | ||
142 | } | ||
143 | extern void flush_icache_range(unsigned long start, unsigned long end); | ||
144 | #else | ||
145 | #define flush_icache_range(start, end) do {} while (0) | ||
146 | #define flush_icache_page(vma, pg) do {} while (0) | ||
147 | #endif | ||
148 | |||
149 | |||
150 | #define flush_icache_user_range(vma, pg, adr, len) \ | ||
151 | flush_icache_range(adr, adr + len) | ||
152 | |||
153 | #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ | ||
154 | do { \ | ||
155 | memcpy(dst, src, len); \ | ||
156 | flush_icache_page(vma, page); \ | ||
157 | } while (0) | ||
158 | |||
159 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | ||
160 | memcpy(dst, src, len) | ||
107 | 161 | ||
108 | /* | 162 | /* |
109 | * internal debugging function | 163 | * Internal debugging function |
110 | */ | 164 | */ |
111 | #ifdef CONFIG_DEBUG_PAGEALLOC | 165 | #ifdef CONFIG_DEBUG_PAGEALLOC |
112 | extern void kernel_map_pages(struct page *page, int numpages, int enable); | 166 | extern void kernel_map_pages(struct page *page, int numpages, int enable); |