1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#include <linux/linkage.h>
30#include <linux/init.h>
31#include <asm/assembler.h>
32#include <asm/hwcap.h>
33#include <asm/pgtable-hwdef.h>
34#include <asm/pgtable.h>
35#include <asm/page.h>
36#include <asm/ptrace.h>
37#include "proc-macros.S"
38
39
40
41
42#define CACHE_DLINESIZE 32
43
44
45
46
47#define CACHE_DSEGMENTS 4
48
49
50
51
52#define CACHE_DENTRIES 64
53
54
55
56
57
58
59
60#define CACHE_DLIMIT 8192
61
62
63 .text
64
65
66
67ENTRY(cpu_arm922_proc_init)
68 ret lr
69
70
71
72
73ENTRY(cpu_arm922_proc_fin)
74 mrc p15, 0, r0, c1, c0, 0 @ ctrl register
75 bic r0, r0,
76 bic r0, r0,
77 mcr p15, 0, r0, c1, c0, 0 @ disable caches
78 ret lr
79
80
81
82
83
84
85
86
87
88
89 .align 5
90 .pushsection .idmap.text, "ax"
91ENTRY(cpu_arm922_reset)
92 mov ip,
93 mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches
94 mcr p15, 0, ip, c7, c10, 4 @ drain WB
95#ifdef CONFIG_MMU
96 mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
97#endif
98 mrc p15, 0, ip, c1, c0, 0 @ ctrl register
99 bic ip, ip,
100 bic ip, ip,
101 mcr p15, 0, ip, c1, c0, 0 @ ctrl register
102 ret r0
103ENDPROC(cpu_arm922_reset)
104 .popsection
105
106
107
108
109 .align 5
110ENTRY(cpu_arm922_do_idle)
111 mcr p15, 0, r0, c7, c0, 4 @ Wait for interrupt
112 ret lr
113
114
115#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
116
117
118
119
120
121
122ENTRY(arm922_flush_icache_all)
123 mov r0,
124 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
125 ret lr
126ENDPROC(arm922_flush_icache_all)
127
128
129
130
131
132
133
134ENTRY(arm922_flush_user_cache_all)
135
136
137
138
139
140
141
142ENTRY(arm922_flush_kern_cache_all)
143 mov r2,
144 mov ip,
145__flush_whole_cache:
146 mov r1,
1471: orr r3, r1,
1482: mcr p15, 0, r3, c7, c14, 2 @ clean+invalidate D index
149 subs r3, r3,
150 bcs 2b @ entries 63 to 0
151 subs r1, r1,
152 bcs 1b @ segments 7 to 0
153 tst r2,
154 mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache
155 mcrne p15, 0, ip, c7, c10, 4 @ drain WB
156 ret lr
157
158
159
160
161
162
163
164
165
166
167
168ENTRY(arm922_flush_user_cache_range)
169 mov ip,
170 sub r3, r1, r0 @ calculate total size
171 cmp r3,
172 bhs __flush_whole_cache
173
1741: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
175 tst r2,
176 mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
177 add r0, r0,
178 cmp r0, r1
179 blo 1b
180 tst r2,
181 mcrne p15, 0, ip, c7, c10, 4 @ drain WB
182 ret lr
183
184
185
186
187
188
189
190
191
192
193
194ENTRY(arm922_coherent_kern_range)
195
196
197
198
199
200
201
202
203
204
205
206
207ENTRY(arm922_coherent_user_range)
208 bic r0, r0,
2091: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
210 mcr p15, 0, r0, c7, c5, 1 @ invalidate I entry
211 add r0, r0,
212 cmp r0, r1
213 blo 1b
214 mcr p15, 0, r0, c7, c10, 4 @ drain WB
215 mov r0,
216 ret lr
217
218
219
220
221
222
223
224
225
226
227ENTRY(arm922_flush_kern_dcache_area)
228 add r1, r0, r1
2291: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
230 add r0, r0,
231 cmp r0, r1
232 blo 1b
233 mov r0,
234 mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
235 mcr p15, 0, r0, c7, c10, 4 @ drain WB
236 ret lr
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251arm922_dma_inv_range:
252 tst r0,
253 bic r0, r0,
254 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
255 tst r1,
256 mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
2571: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
258 add r0, r0,
259 cmp r0, r1
260 blo 1b
261 mcr p15, 0, r0, c7, c10, 4 @ drain WB
262 ret lr
263
264
265
266
267
268
269
270
271
272
273
274arm922_dma_clean_range:
275 bic r0, r0,
2761: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
277 add r0, r0,
278 cmp r0, r1
279 blo 1b
280 mcr p15, 0, r0, c7, c10, 4 @ drain WB
281 ret lr
282
283
284
285
286
287
288
289
290
291ENTRY(arm922_dma_flush_range)
292 bic r0, r0,
2931: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
294 add r0, r0,
295 cmp r0, r1
296 blo 1b
297 mcr p15, 0, r0, c7, c10, 4 @ drain WB
298 ret lr
299
300
301
302
303
304
305
306ENTRY(arm922_dma_map_area)
307 add r1, r1, r0
308 cmp r2,
309 beq arm922_dma_clean_range
310 bcs arm922_dma_inv_range
311 b arm922_dma_flush_range
312ENDPROC(arm922_dma_map_area)
313
314
315
316
317
318
319
320ENTRY(arm922_dma_unmap_area)
321 ret lr
322ENDPROC(arm922_dma_unmap_area)
323
324 .globl arm922_flush_kern_cache_louis
325 .equ arm922_flush_kern_cache_louis, arm922_flush_kern_cache_all
326
327 @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
328 define_cache_functions arm922
329#endif
330
331
332ENTRY(cpu_arm922_dcache_clean_area)
333#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
3341: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
335 add r0, r0,
336 subs r1, r1,
337 bhi 1b
338#endif
339 ret lr
340
341
342
343
344
345
346
347
348
349
350 .align 5
351ENTRY(cpu_arm922_switch_mm)
352#ifdef CONFIG_MMU
353 mov ip,
354#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
355 mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache
356#else
357@ && 'Clean & Invalidate whole DCache'
358@ && Re-written to use Index Ops.
359@ && Uses registers r1, r3 and ip
360
361 mov r1,
3621: orr r3, r1,
3632: mcr p15, 0, r3, c7, c14, 2 @ clean & invalidate D index
364 subs r3, r3,
365 bcs 2b @ entries 63 to 0
366 subs r1, r1,
367 bcs 1b @ segments 7 to 0
368#endif
369 mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
370 mcr p15, 0, ip, c7, c10, 4 @ drain WB
371 mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
372 mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
373#endif
374 ret lr
375
376
377
378
379
380
381 .align 5
382ENTRY(cpu_arm922_set_pte_ext)
383#ifdef CONFIG_MMU
384 armv3_set_pte_ext
385 mov r0, r0
386 mcr p15, 0, r0, c7, c10, 1 @ clean D entry
387 mcr p15, 0, r0, c7, c10, 4 @ drain WB
388#endif
389 ret lr
390
391 .type __arm922_setup,
392__arm922_setup:
393 mov r0,
394 mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4
395 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4
396#ifdef CONFIG_MMU
397 mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4
398#endif
399 adr r5, arm922_crval
400 ldmia r5, {r5, r6}
401 mrc p15, 0, r0, c1, c0 @ get control register v4
402 bic r0, r0, r5
403 orr r0, r0, r6
404 ret lr
405 .size __arm922_setup, . - __arm922_setup
406
407
408
409
410
411
412
413 .type arm922_crval,
414arm922_crval:
415 crval clear=0x00003f3f, mmuset=0x00003135, ucset=0x00001130
416
417 __INITDATA
418 @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
419 define_processor_functions arm922, dabort=v4t_early_abort, pabort=legacy_pabort
420
421 .section ".rodata"
422
423 string cpu_arch_name, "armv4t"
424 string cpu_elf_name, "v4"
425 string cpu_arm922_name, "ARM922T"
426
427 .align
428
429 .section ".proc.info.init",
430
431 .type __arm922_proc_info,
432__arm922_proc_info:
433 .long 0x41009220
434 .long 0xff00fff0
435 .long PMD_TYPE_SECT | \
436 PMD_SECT_BUFFERABLE | \
437 PMD_SECT_CACHEABLE | \
438 PMD_BIT4 | \
439 PMD_SECT_AP_WRITE | \
440 PMD_SECT_AP_READ
441 .long PMD_TYPE_SECT | \
442 PMD_BIT4 | \
443 PMD_SECT_AP_WRITE | \
444 PMD_SECT_AP_READ
445 initfn __arm922_setup, __arm922_proc_info
446 .long cpu_arch_name
447 .long cpu_elf_name
448 .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
449 .long cpu_arm922_name
450 .long arm922_processor_functions
451 .long v4wbi_tlb_fns
452 .long v4wb_user_fns
453#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
454 .long arm922_cache_fns
455#else
456 .long v4wt_cache_fns
457#endif
458 .size __arm922_proc_info, . - __arm922_proc_info
459