diff options
Diffstat (limited to 'arch/xtensa/mm/misc.S')
-rw-r--r-- | arch/xtensa/mm/misc.S | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/arch/xtensa/mm/misc.S b/arch/xtensa/mm/misc.S new file mode 100644 index 000000000000..327c0f17187c --- /dev/null +++ b/arch/xtensa/mm/misc.S | |||
@@ -0,0 +1,374 @@ | |||
1 | /* | ||
2 | * arch/xtensa/mm/misc.S | ||
3 | * | ||
4 | * Miscellaneous assembly functions. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | * | ||
12 | * Chris Zankel <chris@zankel.net> | ||
13 | */ | ||
14 | |||
15 | /* Note: we might want to implement some of the loops as zero-overhead-loops, | ||
16 | * where applicable and if supported by the processor. | ||
17 | */ | ||
18 | |||
19 | #include <linux/linkage.h> | ||
20 | #include <asm/page.h> | ||
21 | #include <asm/pgtable.h> | ||
22 | |||
23 | #include <xtensa/cacheasm.h> | ||
24 | #include <xtensa/cacheattrasm.h> | ||
25 | |||
26 | /* clear_page (page) */ | ||
27 | |||
28 | ENTRY(clear_page) | ||
29 | entry a1, 16 | ||
30 | addi a4, a2, PAGE_SIZE | ||
31 | movi a3, 0 | ||
32 | |||
33 | 1: s32i a3, a2, 0 | ||
34 | s32i a3, a2, 4 | ||
35 | s32i a3, a2, 8 | ||
36 | s32i a3, a2, 12 | ||
37 | s32i a3, a2, 16 | ||
38 | s32i a3, a2, 20 | ||
39 | s32i a3, a2, 24 | ||
40 | s32i a3, a2, 28 | ||
41 | addi a2, a2, 32 | ||
42 | blt a2, a4, 1b | ||
43 | |||
44 | retw | ||
45 | |||
46 | /* | ||
47 | * copy_page (void *to, void *from) | ||
48 | * a2 a3 | ||
49 | */ | ||
50 | |||
51 | ENTRY(copy_page) | ||
52 | entry a1, 16 | ||
53 | addi a4, a2, PAGE_SIZE | ||
54 | |||
55 | 1: l32i a5, a3, 0 | ||
56 | l32i a6, a3, 4 | ||
57 | l32i a7, a3, 8 | ||
58 | s32i a5, a2, 0 | ||
59 | s32i a6, a2, 4 | ||
60 | s32i a7, a2, 8 | ||
61 | l32i a5, a3, 12 | ||
62 | l32i a6, a3, 16 | ||
63 | l32i a7, a3, 20 | ||
64 | s32i a5, a2, 12 | ||
65 | s32i a6, a2, 16 | ||
66 | s32i a7, a2, 20 | ||
67 | l32i a5, a3, 24 | ||
68 | l32i a6, a3, 28 | ||
69 | s32i a5, a2, 24 | ||
70 | s32i a6, a2, 28 | ||
71 | addi a2, a2, 32 | ||
72 | addi a3, a3, 32 | ||
73 | blt a2, a4, 1b | ||
74 | |||
75 | retw | ||
76 | |||
77 | |||
78 | /* | ||
79 | * void __flush_invalidate_cache_all(void) | ||
80 | */ | ||
81 | |||
82 | ENTRY(__flush_invalidate_cache_all) | ||
83 | entry sp, 16 | ||
84 | dcache_writeback_inv_all a2, a3 | ||
85 | icache_invalidate_all a2, a3 | ||
86 | retw | ||
87 | |||
88 | /* | ||
89 | * void __invalidate_icache_all(void) | ||
90 | */ | ||
91 | |||
92 | ENTRY(__invalidate_icache_all) | ||
93 | entry sp, 16 | ||
94 | icache_invalidate_all a2, a3 | ||
95 | retw | ||
96 | |||
97 | /* | ||
98 | * void __flush_invalidate_dcache_all(void) | ||
99 | */ | ||
100 | |||
101 | ENTRY(__flush_invalidate_dcache_all) | ||
102 | entry sp, 16 | ||
103 | dcache_writeback_inv_all a2, a3 | ||
104 | retw | ||
105 | |||
106 | |||
107 | /* | ||
108 | * void __flush_invalidate_cache_range(ulong start, ulong size) | ||
109 | */ | ||
110 | |||
111 | ENTRY(__flush_invalidate_cache_range) | ||
112 | entry sp, 16 | ||
113 | mov a4, a2 | ||
114 | mov a5, a3 | ||
115 | dcache_writeback_inv_region a4, a5, a6 | ||
116 | icache_invalidate_region a2, a3, a4 | ||
117 | retw | ||
118 | |||
119 | /* | ||
120 | * void __invalidate_icache_page(ulong start) | ||
121 | */ | ||
122 | |||
123 | ENTRY(__invalidate_icache_page) | ||
124 | entry sp, 16 | ||
125 | movi a3, PAGE_SIZE | ||
126 | icache_invalidate_region a2, a3, a4 | ||
127 | retw | ||
128 | |||
129 | /* | ||
130 | * void __invalidate_dcache_page(ulong start) | ||
131 | */ | ||
132 | |||
133 | ENTRY(__invalidate_dcache_page) | ||
134 | entry sp, 16 | ||
135 | movi a3, PAGE_SIZE | ||
136 | dcache_invalidate_region a2, a3, a4 | ||
137 | retw | ||
138 | |||
139 | /* | ||
140 | * void __invalidate_icache_range(ulong start, ulong size) | ||
141 | */ | ||
142 | |||
143 | ENTRY(__invalidate_icache_range) | ||
144 | entry sp, 16 | ||
145 | icache_invalidate_region a2, a3, a4 | ||
146 | retw | ||
147 | |||
148 | /* | ||
149 | * void __invalidate_dcache_range(ulong start, ulong size) | ||
150 | */ | ||
151 | |||
152 | ENTRY(__invalidate_dcache_range) | ||
153 | entry sp, 16 | ||
154 | dcache_invalidate_region a2, a3, a4 | ||
155 | retw | ||
156 | |||
157 | /* | ||
158 | * void __flush_dcache_page(ulong start) | ||
159 | */ | ||
160 | |||
161 | ENTRY(__flush_dcache_page) | ||
162 | entry sp, 16 | ||
163 | movi a3, PAGE_SIZE | ||
164 | dcache_writeback_region a2, a3, a4 | ||
165 | retw | ||
166 | |||
167 | /* | ||
168 | * void __flush_invalidate_dcache_page(ulong start) | ||
169 | */ | ||
170 | |||
171 | ENTRY(__flush_invalidate_dcache_page) | ||
172 | entry sp, 16 | ||
173 | movi a3, PAGE_SIZE | ||
174 | dcache_writeback_inv_region a2, a3, a4 | ||
175 | retw | ||
176 | |||
177 | /* | ||
178 | * void __flush_invalidate_dcache_range(ulong start, ulong size) | ||
179 | */ | ||
180 | |||
181 | ENTRY(__flush_invalidate_dcache_range) | ||
182 | entry sp, 16 | ||
183 | dcache_writeback_inv_region a2, a3, a4 | ||
184 | retw | ||
185 | |||
186 | /* | ||
187 | * void __invalidate_dcache_all(void) | ||
188 | */ | ||
189 | |||
190 | ENTRY(__invalidate_dcache_all) | ||
191 | entry sp, 16 | ||
192 | dcache_invalidate_all a2, a3 | ||
193 | retw | ||
194 | |||
195 | /* | ||
196 | * void __flush_invalidate_dcache_page_phys(ulong start) | ||
197 | */ | ||
198 | |||
199 | ENTRY(__flush_invalidate_dcache_page_phys) | ||
200 | entry sp, 16 | ||
201 | |||
202 | movi a3, XCHAL_DCACHE_SIZE | ||
203 | movi a4, PAGE_MASK | 1 | ||
204 | addi a2, a2, 1 | ||
205 | |||
206 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
207 | |||
208 | ldct a6, a3 | ||
209 | dsync | ||
210 | and a6, a6, a4 | ||
211 | beq a6, a2, 2f | ||
212 | bgeui a3, 2, 1b | ||
213 | retw | ||
214 | |||
215 | 2: diwbi a3, 0 | ||
216 | bgeui a3, 2, 1b | ||
217 | retw | ||
218 | |||
219 | ENTRY(check_dcache_low0) | ||
220 | entry sp, 16 | ||
221 | |||
222 | movi a3, XCHAL_DCACHE_SIZE / 4 | ||
223 | movi a4, PAGE_MASK | 1 | ||
224 | addi a2, a2, 1 | ||
225 | |||
226 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
227 | |||
228 | ldct a6, a3 | ||
229 | dsync | ||
230 | and a6, a6, a4 | ||
231 | beq a6, a2, 2f | ||
232 | bgeui a3, 2, 1b | ||
233 | retw | ||
234 | |||
235 | 2: j 2b | ||
236 | |||
237 | ENTRY(check_dcache_high0) | ||
238 | entry sp, 16 | ||
239 | |||
240 | movi a5, XCHAL_DCACHE_SIZE / 4 | ||
241 | movi a3, XCHAL_DCACHE_SIZE / 2 | ||
242 | movi a4, PAGE_MASK | 1 | ||
243 | addi a2, a2, 1 | ||
244 | |||
245 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
246 | addi a5, a5, -XCHAL_DCACHE_LINESIZE | ||
247 | |||
248 | ldct a6, a3 | ||
249 | dsync | ||
250 | and a6, a6, a4 | ||
251 | beq a6, a2, 2f | ||
252 | bgeui a5, 2, 1b | ||
253 | retw | ||
254 | |||
255 | 2: j 2b | ||
256 | |||
257 | ENTRY(check_dcache_low1) | ||
258 | entry sp, 16 | ||
259 | |||
260 | movi a5, XCHAL_DCACHE_SIZE / 4 | ||
261 | movi a3, XCHAL_DCACHE_SIZE * 3 / 4 | ||
262 | movi a4, PAGE_MASK | 1 | ||
263 | addi a2, a2, 1 | ||
264 | |||
265 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
266 | addi a5, a5, -XCHAL_DCACHE_LINESIZE | ||
267 | |||
268 | ldct a6, a3 | ||
269 | dsync | ||
270 | and a6, a6, a4 | ||
271 | beq a6, a2, 2f | ||
272 | bgeui a5, 2, 1b | ||
273 | retw | ||
274 | |||
275 | 2: j 2b | ||
276 | |||
277 | ENTRY(check_dcache_high1) | ||
278 | entry sp, 16 | ||
279 | |||
280 | movi a5, XCHAL_DCACHE_SIZE / 4 | ||
281 | movi a3, XCHAL_DCACHE_SIZE | ||
282 | movi a4, PAGE_MASK | 1 | ||
283 | addi a2, a2, 1 | ||
284 | |||
285 | 1: addi a3, a3, -XCHAL_DCACHE_LINESIZE | ||
286 | addi a5, a5, -XCHAL_DCACHE_LINESIZE | ||
287 | |||
288 | ldct a6, a3 | ||
289 | dsync | ||
290 | and a6, a6, a4 | ||
291 | beq a6, a2, 2f | ||
292 | bgeui a5, 2, 1b | ||
293 | retw | ||
294 | |||
295 | 2: j 2b | ||
296 | |||
297 | |||
298 | /* | ||
299 | * void __invalidate_icache_page_phys(ulong start) | ||
300 | */ | ||
301 | |||
302 | ENTRY(__invalidate_icache_page_phys) | ||
303 | entry sp, 16 | ||
304 | |||
305 | movi a3, XCHAL_ICACHE_SIZE | ||
306 | movi a4, PAGE_MASK | 1 | ||
307 | addi a2, a2, 1 | ||
308 | |||
309 | 1: addi a3, a3, -XCHAL_ICACHE_LINESIZE | ||
310 | |||
311 | lict a6, a3 | ||
312 | isync | ||
313 | and a6, a6, a4 | ||
314 | beq a6, a2, 2f | ||
315 | bgeui a3, 2, 1b | ||
316 | retw | ||
317 | |||
318 | 2: iii a3, 0 | ||
319 | bgeui a3, 2, 1b | ||
320 | retw | ||
321 | |||
322 | |||
323 | #if 0 | ||
324 | |||
325 | movi a3, XCHAL_DCACHE_WAYS - 1 | ||
326 | movi a4, PAGE_SIZE | ||
327 | |||
328 | 1: mov a5, a2 | ||
329 | add a6, a2, a4 | ||
330 | |||
331 | 2: diwbi a5, 0 | ||
332 | diwbi a5, XCHAL_DCACHE_LINESIZE | ||
333 | diwbi a5, XCHAL_DCACHE_LINESIZE * 2 | ||
334 | diwbi a5, XCHAL_DCACHE_LINESIZE * 3 | ||
335 | |||
336 | addi a5, a5, XCHAL_DCACHE_LINESIZE * 4 | ||
337 | blt a5, a6, 2b | ||
338 | |||
339 | addi a3, a3, -1 | ||
340 | addi a2, a2, XCHAL_DCACHE_SIZE / XCHAL_DCACHE_WAYS | ||
341 | bgez a3, 1b | ||
342 | |||
343 | retw | ||
344 | |||
345 | ENTRY(__invalidate_icache_page_index) | ||
346 | entry sp, 16 | ||
347 | |||
348 | movi a3, XCHAL_ICACHE_WAYS - 1 | ||
349 | movi a4, PAGE_SIZE | ||
350 | |||
351 | 1: mov a5, a2 | ||
352 | add a6, a2, a4 | ||
353 | |||
354 | 2: iii a5, 0 | ||
355 | iii a5, XCHAL_ICACHE_LINESIZE | ||
356 | iii a5, XCHAL_ICACHE_LINESIZE * 2 | ||
357 | iii a5, XCHAL_ICACHE_LINESIZE * 3 | ||
358 | |||
359 | addi a5, a5, XCHAL_ICACHE_LINESIZE * 4 | ||
360 | blt a5, a6, 2b | ||
361 | |||
362 | addi a3, a3, -1 | ||
363 | addi a2, a2, XCHAL_ICACHE_SIZE / XCHAL_ICACHE_WAYS | ||
364 | bgez a3, 2b | ||
365 | |||
366 | retw | ||
367 | |||
368 | #endif | ||
369 | |||
370 | |||
371 | |||
372 | |||
373 | |||
374 | |||