diff options
Diffstat (limited to 'arch/arm/mm/proc-v7.S')
-rw-r--r-- | arch/arm/mm/proc-v7.S | 395 |
1 files changed, 304 insertions, 91 deletions
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 089c0b5e454..38c78253f76 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -58,9 +58,17 @@ ENDPROC(cpu_v7_proc_fin) | |||
58 | * to what would be the reset vector. | 58 | * to what would be the reset vector. |
59 | * | 59 | * |
60 | * - loc - location to jump to for soft reset | 60 | * - loc - location to jump to for soft reset |
61 | * | ||
62 | * This code must be executed using a flat identity mapping with | ||
63 | * caches disabled. | ||
61 | */ | 64 | */ |
62 | .align 5 | 65 | .align 5 |
63 | ENTRY(cpu_v7_reset) | 66 | ENTRY(cpu_v7_reset) |
67 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register | ||
68 | bic r1, r1, #0x1 @ ...............m | ||
69 | THUMB( bic r1, r1, #1 << 30 ) @ SCTLR.TE (Thumb exceptions) | ||
70 | mcr p15, 0, r1, c1, c0, 0 @ disable MMU | ||
71 | isb | ||
64 | mov pc, r0 | 72 | mov pc, r0 |
65 | ENDPROC(cpu_v7_reset) | 73 | ENDPROC(cpu_v7_reset) |
66 | 74 | ||
@@ -168,13 +176,14 @@ ENTRY(cpu_v7_set_pte_ext) | |||
168 | ARM( str r3, [r0, #2048]! ) | 176 | ARM( str r3, [r0, #2048]! ) |
169 | THUMB( add r0, r0, #2048 ) | 177 | THUMB( add r0, r0, #2048 ) |
170 | THUMB( str r3, [r0] ) | 178 | THUMB( str r3, [r0] ) |
171 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | 179 | mrc p15, 0, r3, c0, c1, 7 @ read ID_MMFR3 |
180 | tst r3, #0xf << 20 @ check the coherent walk bits | ||
181 | mcreq p15, 0, r0, c7, c10, 1 @ flush_pte | ||
172 | #endif | 182 | #endif |
173 | mov pc, lr | 183 | mov pc, lr |
174 | ENDPROC(cpu_v7_set_pte_ext) | 184 | ENDPROC(cpu_v7_set_pte_ext) |
175 | 185 | ||
176 | cpu_v7_name: | 186 | string cpu_v7_name, "ARMv7 Processor" |
177 | .ascii "ARMv7 Processor" | ||
178 | .align | 187 | .align |
179 | 188 | ||
180 | /* | 189 | /* |
@@ -205,49 +214,254 @@ cpu_v7_name: | |||
205 | * NS1 = PRRR[19] = 1 - normal shareable property | 214 | * NS1 = PRRR[19] = 1 - normal shareable property |
206 | * NOS = PRRR[24+n] = 1 - not outer shareable | 215 | * NOS = PRRR[24+n] = 1 - not outer shareable |
207 | */ | 216 | */ |
208 | .equ PRRR, 0xff0a81a8 | 217 | .equ PRRR, 0xff0a89a8 |
209 | .equ NMRR, 0x40e040e0 | 218 | .equ NMRR, 0xc0e044e0 |
210 | 219 | ||
211 | /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ | 220 | /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ |
221 | .local cpu_v7_debug_suspend_size | ||
222 | #ifdef CONFIG_ARM_SAVE_DEBUG_CONTEXT | ||
223 | /* | ||
224 | * Debug context: | ||
225 | * 8 CP14 registers | ||
226 | * 16x2 CP14 breakpoint registers (maximum) | ||
227 | * 16x2 CP14 watchpoint registers (maximum) | ||
228 | */ | ||
229 | .equ cpu_v7_debug_suspend_size, (4 * (8 + (16 * 2) + (16 * 2))) | ||
230 | |||
231 | .macro save_brkpt cm | ||
232 | mrc p14, 0, r4, c0, \cm, 4 | ||
233 | mrc p14, 0, r5, c0, \cm, 5 | ||
234 | stmia r0!, {r4 - r5} | ||
235 | .endm | ||
236 | |||
237 | .macro restore_brkpt cm | ||
238 | ldmia r0!, {r4 - r5} | ||
239 | mcr p14, 0, r4, c0, \cm, 4 | ||
240 | mcr p14, 0, r5, c0, \cm, 5 | ||
241 | .endm | ||
242 | |||
243 | .macro save_wpt cm | ||
244 | mrc p14, 0, r4, c0, \cm, 6 | ||
245 | mrc p14, 0, r5, c0, \cm, 7 | ||
246 | stmia r0!, {r4 - r5} | ||
247 | .endm | ||
248 | |||
249 | .macro restore_wpt cm | ||
250 | ldmia r0!, {r4 - r5} | ||
251 | mcr p14, 0, r4, c0, \cm, 6 | ||
252 | mcr p14, 0, r5, c0, \cm, 7 | ||
253 | .endm | ||
254 | |||
255 | #else | ||
256 | .equ cpu_v7_debug_suspend_size, 0 | ||
257 | #endif | ||
258 | |||
212 | .globl cpu_v7_suspend_size | 259 | .globl cpu_v7_suspend_size |
213 | .equ cpu_v7_suspend_size, 4 * 9 | 260 | .equ cpu_v7_suspend_size, (4 * 10) + cpu_v7_debug_suspend_size |
214 | #ifdef CONFIG_PM_SLEEP | 261 | #ifdef CONFIG_PM_SLEEP |
215 | ENTRY(cpu_v7_do_suspend) | 262 | ENTRY(cpu_v7_do_suspend) |
216 | stmfd sp!, {r4 - r11, lr} | 263 | stmfd sp!, {r0, r3 - r11, lr} |
264 | mrc p15, 0, r3, c15, c0, 1 @ diag | ||
217 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | 265 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID |
218 | mrc p15, 0, r5, c13, c0, 1 @ Context ID | 266 | mrc p15, 0, r5, c13, c0, 1 @ Context ID |
219 | mrc p15, 0, r6, c13, c0, 3 @ User r/o thread ID | 267 | mrc p15, 0, r6, c13, c0, 3 @ User r/o thread ID |
220 | stmia r0!, {r4 - r6} | 268 | stmia r0!, {r3 - r6} |
221 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID | 269 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID |
222 | mrc p15, 0, r7, c2, c0, 0 @ TTB 0 | 270 | mrc p15, 0, r7, c2, c0, 0 @ TTB 0 |
223 | mrc p15, 0, r8, c2, c0, 1 @ TTB 1 | 271 | mrc p15, 0, r8, c2, c0, 1 @ TTB 1 |
224 | mrc p15, 0, r9, c1, c0, 0 @ Control register | 272 | mrc p15, 0, r9, c1, c0, 0 @ Control register |
225 | mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register | 273 | mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register |
226 | mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control | 274 | mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control |
227 | stmia r0, {r6 - r11} | 275 | stmia r0!, {r6 - r11} |
228 | ldmfd sp!, {r4 - r11, pc} | 276 | |
277 | #ifdef CONFIG_ARM_SAVE_DEBUG_CONTEXT | ||
278 | /* Save CP14 debug controller context */ | ||
279 | |||
280 | mrc p14, 0, r4, c0, c2, 2 @ DBGDSCRext | ||
281 | mrc p14, 0, r5, c0, c6, 0 @ DBGWFAR | ||
282 | mrc p14, 0, r6, c0, c7, 0 @ DBGVCR | ||
283 | mrc p14, 0, r7, c7, c9, 6 @ DBGCLAIMCLR | ||
284 | stmia r0!, {r4-r7} | ||
285 | |||
286 | mrc p14, 0, r4, c0, c10, 0 @ DBGDSCCR | ||
287 | mrc p14, 0, r5, c0, c11, 0 @ DBGDSMCR | ||
288 | stmia r0!, {r4-r5} | ||
289 | |||
290 | tst r4, #(1 << 29) @ DBGDSCRext.TXfull | ||
291 | mrcne p14, 0, r4, c0, c3, 2 @ DBGDTRTXext | ||
292 | strne r4, [r0], #4 | ||
293 | |||
294 | tst r4, #(1 << 30) @ DBGDSCRext.RXfull | ||
295 | mrcne p14, 0, r4, c0, c0, 2 @ DBGDTRRXext | ||
296 | strne r4, [r0], #4 | ||
297 | |||
298 | mrc p14, 0, r8, c0, c0, 0 @ read IDR | ||
299 | mov r3, r8, lsr #24 | ||
300 | and r3, r3, #0xf @ r3 has the number of brkpt | ||
301 | rsb r3, r3, #0xf | ||
302 | |||
303 | /* r3 = (15 - #of brkpt) ; | ||
304 | switch offset = r3*12 - 4 = (r3*3 - 1)<<2 | ||
305 | */ | ||
306 | add r3, r3, r3, lsl #1 | ||
307 | sub r3, r3, #1 | ||
308 | add pc, pc, r3, lsl #2 | ||
309 | |||
310 | save_brkpt c15 | ||
311 | save_brkpt c14 | ||
312 | save_brkpt c13 | ||
313 | save_brkpt c12 | ||
314 | save_brkpt c11 | ||
315 | save_brkpt c10 | ||
316 | save_brkpt c9 | ||
317 | save_brkpt c8 | ||
318 | save_brkpt c7 | ||
319 | save_brkpt c6 | ||
320 | save_brkpt c5 | ||
321 | save_brkpt c4 | ||
322 | save_brkpt c3 | ||
323 | save_brkpt c2 | ||
324 | save_brkpt c1 | ||
325 | save_brkpt c0 | ||
326 | |||
327 | mov r3, r8, lsr #28 @ r3 has the number of wpt | ||
328 | rsb r3, r3, #0xf | ||
329 | |||
330 | /* r3 = (15 - #of wpt) ; | ||
331 | switch offset = r3*12 - 4 = (r3*3 - 1)<<2 | ||
332 | */ | ||
333 | add r3, r3, r3, lsl #1 | ||
334 | sub r3, r3, #1 | ||
335 | add pc, pc, r3, lsl #2 | ||
336 | |||
337 | save_wpt c15 | ||
338 | save_wpt c14 | ||
339 | save_wpt c13 | ||
340 | save_wpt c12 | ||
341 | save_wpt c11 | ||
342 | save_wpt c10 | ||
343 | save_wpt c9 | ||
344 | save_wpt c8 | ||
345 | save_wpt c7 | ||
346 | save_wpt c6 | ||
347 | save_wpt c5 | ||
348 | save_wpt c4 | ||
349 | save_wpt c3 | ||
350 | save_wpt c2 | ||
351 | save_wpt c1 | ||
352 | save_wpt c0 | ||
353 | #endif | ||
354 | ldmfd sp!, {r0, r3 - r11, pc} | ||
229 | ENDPROC(cpu_v7_do_suspend) | 355 | ENDPROC(cpu_v7_do_suspend) |
230 | 356 | ||
231 | ENTRY(cpu_v7_do_resume) | 357 | ENTRY(cpu_v7_do_resume) |
232 | mov ip, #0 | 358 | mov ip, #0 |
233 | mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs | 359 | mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs |
234 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache | 360 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache |
235 | ldmia r0!, {r4 - r6} | 361 | ldmia r0!, {r3 - r6} |
362 | #ifndef CONFIG_TRUSTED_FOUNDATIONS | ||
363 | mcr p15, 0, r3, c15, c0, 1 @ diag | ||
364 | #endif | ||
236 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | 365 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID |
237 | mcr p15, 0, r5, c13, c0, 1 @ Context ID | 366 | mcr p15, 0, r5, c13, c0, 1 @ Context ID |
238 | mcr p15, 0, r6, c13, c0, 3 @ User r/o thread ID | 367 | mcr p15, 0, r6, c13, c0, 3 @ User r/o thread ID |
239 | ldmia r0, {r6 - r11} | 368 | ldmia r0!, {r6 - r11} |
240 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID | 369 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID |
241 | mcr p15, 0, r7, c2, c0, 0 @ TTB 0 | 370 | mcr p15, 0, r7, c2, c0, 0 @ TTB 0 |
242 | mcr p15, 0, r8, c2, c0, 1 @ TTB 1 | 371 | mcr p15, 0, r8, c2, c0, 1 @ TTB 1 |
243 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register | 372 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register |
244 | mcr p15, 0, r10, c1, c0, 1 @ Auxiliary control register | 373 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register |
374 | teq r4, r10 @ Is it already set? | ||
375 | mcrne p15, 0, r10, c1, c0, 1 @ No, so write it | ||
245 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access control | 376 | mcr p15, 0, r11, c1, c0, 2 @ Co-processor access control |
246 | ldr r4, =PRRR @ PRRR | 377 | ldr r4, =PRRR @ PRRR |
247 | ldr r5, =NMRR @ NMRR | 378 | ldr r5, =NMRR @ NMRR |
248 | mcr p15, 0, r4, c10, c2, 0 @ write PRRR | 379 | mcr p15, 0, r4, c10, c2, 0 @ write PRRR |
249 | mcr p15, 0, r5, c10, c2, 1 @ write NMRR | 380 | mcr p15, 0, r5, c10, c2, 1 @ write NMRR |
250 | isb | 381 | isb |
382 | |||
383 | #ifdef CONFIG_ARM_SAVE_DEBUG_CONTEXT | ||
384 | /* Restore CP14 debug controller context */ | ||
385 | |||
386 | ldmia r0!, {r2 - r5} | ||
387 | mcr p14, 0, r3, c0, c6, 0 @ DBGWFAR | ||
388 | mcr p14, 0, r4, c0, c7, 0 @ DBGVCR | ||
389 | mcr p14, 0, r5, c7, c8, 6 @ DBGCLAIMSET | ||
390 | |||
391 | ldmia r0!, {r4-r5} | ||
392 | mcr p14, 0, r4, c0, c10, 0 @ DBGDSCCR | ||
393 | mcr p14, 0, r5, c0, c11, 0 @ DBGDSMCR | ||
394 | |||
395 | tst r2, #(1 << 29) @ DBGDSCRext.TXfull | ||
396 | ldrne r4, [r0], #4 | ||
397 | mcrne p14, 0, r4, c0, c3, 2 @ DBGDTRTXext | ||
398 | |||
399 | tst r2, #(1 << 30) @ DBGDSCRext.RXfull | ||
400 | ldrne r4, [r0], #4 | ||
401 | mcrne p14, 0, r4, c0, c0, 2 @ DBGDTRRXext | ||
402 | |||
403 | mrc p14, 0, r8, c0, c0, 0 @ read IDR | ||
404 | mov r3, r8, lsr #24 | ||
405 | and r3, r3, #0xf @ r3 has the number of brkpt | ||
406 | rsb r3, r3, #0xf | ||
407 | |||
408 | /* r3 = (15 - #of wpt) ; | ||
409 | switch offset = r3*12 - 4 = (r3*3 - 1)<<2 | ||
410 | */ | ||
411 | add r3, r3, r3, lsl #1 | ||
412 | sub r3, r3, #1 | ||
413 | add pc, pc, r3, lsl #2 | ||
414 | |||
415 | restore_brkpt c15 | ||
416 | restore_brkpt c14 | ||
417 | restore_brkpt c13 | ||
418 | restore_brkpt c12 | ||
419 | restore_brkpt c11 | ||
420 | restore_brkpt c10 | ||
421 | restore_brkpt c9 | ||
422 | restore_brkpt c8 | ||
423 | restore_brkpt c7 | ||
424 | restore_brkpt c6 | ||
425 | restore_brkpt c5 | ||
426 | restore_brkpt c4 | ||
427 | restore_brkpt c3 | ||
428 | restore_brkpt c2 | ||
429 | restore_brkpt c1 | ||
430 | restore_brkpt c0 | ||
431 | |||
432 | mov r3, r8, lsr #28 @ r3 has the number of wpt | ||
433 | rsb r3, r3, #0xf | ||
434 | |||
435 | /* r3 = (15 - #of wpt) ; | ||
436 | switch offset = r3*12 - 4 = (r3*3 - 1)<<2 | ||
437 | */ | ||
438 | add r3, r3, r3, lsl #1 | ||
439 | sub r3, r3, #1 | ||
440 | add pc, pc, r3, lsl #2 | ||
441 | |||
442 | start_restore_wpt: | ||
443 | restore_wpt c15 | ||
444 | restore_wpt c14 | ||
445 | restore_wpt c13 | ||
446 | restore_wpt c12 | ||
447 | restore_wpt c11 | ||
448 | restore_wpt c10 | ||
449 | restore_wpt c9 | ||
450 | restore_wpt c8 | ||
451 | restore_wpt c7 | ||
452 | restore_wpt c6 | ||
453 | restore_wpt c5 | ||
454 | restore_wpt c4 | ||
455 | restore_wpt c3 | ||
456 | restore_wpt c2 | ||
457 | restore_wpt c1 | ||
458 | restore_wpt c0 | ||
459 | isb | ||
460 | |||
461 | mcr p14, 0, r2, c0, c2, 2 @ DSCR | ||
462 | isb | ||
463 | #endif | ||
464 | dsb | ||
251 | mov r0, r9 @ control register | 465 | mov r0, r9 @ control register |
252 | mov r2, r7, lsr #14 @ get TTB0 base | 466 | mov r2, r7, lsr #14 @ get TTB0 base |
253 | mov r2, r2, lsl #14 | 467 | mov r2, r2, lsl #14 |
@@ -257,9 +471,6 @@ ENDPROC(cpu_v7_do_resume) | |||
257 | cpu_resume_l1_flags: | 471 | cpu_resume_l1_flags: |
258 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP) | 472 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP) |
259 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP) | 473 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP) |
260 | #else | ||
261 | #define cpu_v7_do_suspend 0 | ||
262 | #define cpu_v7_do_resume 0 | ||
263 | #endif | 474 | #endif |
264 | 475 | ||
265 | __CPUINIT | 476 | __CPUINIT |
@@ -270,22 +481,25 @@ cpu_resume_l1_flags: | |||
270 | * Initialise TLB, Caches, and MMU state ready to switch the MMU | 481 | * Initialise TLB, Caches, and MMU state ready to switch the MMU |
271 | * on. Return in r0 the new CP15 C1 control register setting. | 482 | * on. Return in r0 the new CP15 C1 control register setting. |
272 | * | 483 | * |
273 | * We automatically detect if we have a Harvard cache, and use the | ||
274 | * Harvard cache control instructions insead of the unified cache | ||
275 | * control instructions. | ||
276 | * | ||
277 | * This should be able to cover all ARMv7 cores. | 484 | * This should be able to cover all ARMv7 cores. |
278 | * | 485 | * |
279 | * It is assumed that: | 486 | * It is assumed that: |
280 | * - cache type register is implemented | 487 | * - cache type register is implemented |
281 | */ | 488 | */ |
489 | __v7_ca5mp_setup: | ||
282 | __v7_ca9mp_setup: | 490 | __v7_ca9mp_setup: |
491 | mov r10, #(1 << 0) @ TLB ops broadcasting | ||
492 | b 1f | ||
493 | __v7_ca15mp_setup: | ||
494 | mov r10, #0 | ||
495 | 1: | ||
283 | #ifdef CONFIG_SMP | 496 | #ifdef CONFIG_SMP |
284 | ALT_SMP(mrc p15, 0, r0, c1, c0, 1) | 497 | ALT_SMP(mrc p15, 0, r0, c1, c0, 1) |
285 | ALT_UP(mov r0, #(1 << 6)) @ fake it for UP | 498 | ALT_UP(mov r0, #(1 << 6)) @ fake it for UP |
286 | tst r0, #(1 << 6) @ SMP/nAMP mode enabled? | 499 | tst r0, #(1 << 6) @ SMP/nAMP mode enabled? |
287 | orreq r0, r0, #(1 << 6) | (1 << 0) @ Enable SMP/nAMP mode and | 500 | orreq r0, r0, #(1 << 6) @ Enable SMP/nAMP mode |
288 | mcreq p15, 0, r0, c1, c0, 1 @ TLB ops broadcasting | 501 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits |
502 | mcreq p15, 0, r0, c1, c0, 1 | ||
289 | #endif | 503 | #endif |
290 | __v7_setup: | 504 | __v7_setup: |
291 | adr r12, __v7_setup_stack @ the local stack | 505 | adr r12, __v7_setup_stack @ the local stack |
@@ -332,6 +546,17 @@ __v7_setup: | |||
332 | 2: ldr r10, =0x00000c09 @ Cortex-A9 primary part number | 546 | 2: ldr r10, =0x00000c09 @ Cortex-A9 primary part number |
333 | teq r0, r10 | 547 | teq r0, r10 |
334 | bne 3f | 548 | bne 3f |
549 | #ifndef CONFIG_TRUSTED_FOUNDATIONS | ||
550 | cmp r6, #0x10 @ power ctrl reg added r1p0 | ||
551 | mrcge p15, 0, r10, c15, c0, 0 @ read power control register | ||
552 | orrge r10, r10, #1 @ enable dynamic clock gating | ||
553 | mcrge p15, 0, r10, c15, c0, 0 @ write power control register | ||
554 | #ifdef CONFIG_ARM_ERRATA_720791 | ||
555 | teq r5, #0x00100000 @ only present in r1p* | ||
556 | mrceq p15, 0, r10, c15, c0, 2 @ read "chicken power ctrl" reg | ||
557 | orreq r10, r10, #0x30 @ disable core clk gate on | ||
558 | mcreq p15, 0, r10, c15, c0, 2 @ instr-side waits | ||
559 | #endif | ||
335 | #ifdef CONFIG_ARM_ERRATA_742230 | 560 | #ifdef CONFIG_ARM_ERRATA_742230 |
336 | cmp r6, #0x22 @ only present up to r2p2 | 561 | cmp r6, #0x22 @ only present up to r2p2 |
337 | mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register | 562 | mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register |
@@ -351,6 +576,8 @@ __v7_setup: | |||
351 | teq r6, #0x20 @ present in r2p0 | 576 | teq r6, #0x20 @ present in r2p0 |
352 | teqne r6, #0x21 @ present in r2p1 | 577 | teqne r6, #0x21 @ present in r2p1 |
353 | teqne r6, #0x22 @ present in r2p2 | 578 | teqne r6, #0x22 @ present in r2p2 |
579 | teqne r6, #0x27 @ present in r2p7 | ||
580 | teqne r6, #0x29 @ present in r2p9 | ||
354 | mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register | 581 | mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register |
355 | orreq r10, r10, #1 << 6 @ set bit #6 | 582 | orreq r10, r10, #1 << 6 @ set bit #6 |
356 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register | 583 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register |
@@ -361,11 +588,16 @@ __v7_setup: | |||
361 | orrlt r10, r10, #1 << 11 @ set bit #11 | 588 | orrlt r10, r10, #1 << 11 @ set bit #11 |
362 | mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register | 589 | mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register |
363 | #endif | 590 | #endif |
591 | #ifdef CONFIG_ARM_ERRATA_752520 | ||
592 | cmp r6, #0x29 @ present prior to r2p9 | ||
593 | mrclt p15, 0, r10, c15, c0, 1 @ read diagnostic register | ||
594 | orrlt r10, r10, #1 << 20 @ set bit #20 | ||
595 | mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register | ||
596 | #endif | ||
597 | #endif | ||
364 | 598 | ||
365 | 3: mov r10, #0 | 599 | 3: mov r10, #0 |
366 | #ifdef HARVARD_CACHE | ||
367 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate | 600 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate |
368 | #endif | ||
369 | dsb | 601 | dsb |
370 | #ifdef CONFIG_MMU | 602 | #ifdef CONFIG_MMU |
371 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs | 603 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs |
@@ -411,94 +643,75 @@ __v7_setup_stack: | |||
411 | 643 | ||
412 | __INITDATA | 644 | __INITDATA |
413 | 645 | ||
414 | .type v7_processor_functions, #object | 646 | @ define struct processor (see <asm/proc-fns.h> and proc-macros.S) |
415 | ENTRY(v7_processor_functions) | 647 | define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1 |
416 | .word v7_early_abort | ||
417 | .word v7_pabort | ||
418 | .word cpu_v7_proc_init | ||
419 | .word cpu_v7_proc_fin | ||
420 | .word cpu_v7_reset | ||
421 | .word cpu_v7_do_idle | ||
422 | .word cpu_v7_dcache_clean_area | ||
423 | .word cpu_v7_switch_mm | ||
424 | .word cpu_v7_set_pte_ext | ||
425 | .word cpu_v7_suspend_size | ||
426 | .word cpu_v7_do_suspend | ||
427 | .word cpu_v7_do_resume | ||
428 | .size v7_processor_functions, . - v7_processor_functions | ||
429 | 648 | ||
430 | .section ".rodata" | 649 | .section ".rodata" |
431 | 650 | ||
432 | .type cpu_arch_name, #object | 651 | string cpu_arch_name, "armv7" |
433 | cpu_arch_name: | 652 | string cpu_elf_name, "v7" |
434 | .asciz "armv7" | ||
435 | .size cpu_arch_name, . - cpu_arch_name | ||
436 | |||
437 | .type cpu_elf_name, #object | ||
438 | cpu_elf_name: | ||
439 | .asciz "v7" | ||
440 | .size cpu_elf_name, . - cpu_elf_name | ||
441 | .align | 653 | .align |
442 | 654 | ||
443 | .section ".proc.info.init", #alloc, #execinstr | 655 | .section ".proc.info.init", #alloc, #execinstr |
444 | 656 | ||
445 | .type __v7_ca9mp_proc_info, #object | 657 | /* |
446 | __v7_ca9mp_proc_info: | 658 | * Standard v7 proc info content |
447 | .long 0x410fc090 @ Required ID value | 659 | */ |
448 | .long 0xff0ffff0 @ Mask for ID | 660 | .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 |
449 | ALT_SMP(.long \ | 661 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
450 | PMD_TYPE_SECT | \ | 662 | PMD_FLAGS_SMP | \mm_mmuflags) |
451 | PMD_SECT_AP_WRITE | \ | 663 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
452 | PMD_SECT_AP_READ | \ | 664 | PMD_FLAGS_UP | \mm_mmuflags) |
453 | PMD_FLAGS_SMP) | 665 | .long PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_AP_WRITE | \ |
454 | ALT_UP(.long \ | 666 | PMD_SECT_AP_READ | \io_mmuflags |
455 | PMD_TYPE_SECT | \ | 667 | W(b) \initfunc |
456 | PMD_SECT_AP_WRITE | \ | ||
457 | PMD_SECT_AP_READ | \ | ||
458 | PMD_FLAGS_UP) | ||
459 | .long PMD_TYPE_SECT | \ | ||
460 | PMD_SECT_XN | \ | ||
461 | PMD_SECT_AP_WRITE | \ | ||
462 | PMD_SECT_AP_READ | ||
463 | W(b) __v7_ca9mp_setup | ||
464 | .long cpu_arch_name | 668 | .long cpu_arch_name |
465 | .long cpu_elf_name | 669 | .long cpu_elf_name |
466 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS | 670 | .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \ |
671 | HWCAP_EDSP | HWCAP_TLS | \hwcaps | ||
467 | .long cpu_v7_name | 672 | .long cpu_v7_name |
468 | .long v7_processor_functions | 673 | .long v7_processor_functions |
469 | .long v7wbi_tlb_fns | 674 | .long v7wbi_tlb_fns |
470 | .long v6_user_fns | 675 | .long v6_user_fns |
471 | .long v7_cache_fns | 676 | .long v7_cache_fns |
677 | .endm | ||
678 | |||
679 | /* | ||
680 | * ARM Ltd. Cortex A5 processor. | ||
681 | */ | ||
682 | .type __v7_ca5mp_proc_info, #object | ||
683 | __v7_ca5mp_proc_info: | ||
684 | .long 0x410fc050 | ||
685 | .long 0xff0ffff0 | ||
686 | __v7_proc __v7_ca5mp_setup | ||
687 | .size __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info | ||
688 | |||
689 | /* | ||
690 | * ARM Ltd. Cortex A9 processor. | ||
691 | */ | ||
692 | .type __v7_ca9mp_proc_info, #object | ||
693 | __v7_ca9mp_proc_info: | ||
694 | .long 0x410fc090 | ||
695 | .long 0xff0ffff0 | ||
696 | __v7_proc __v7_ca9mp_setup | ||
472 | .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info | 697 | .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info |
473 | 698 | ||
474 | /* | 699 | /* |
700 | * ARM Ltd. Cortex A15 processor. | ||
701 | */ | ||
702 | .type __v7_ca15mp_proc_info, #object | ||
703 | __v7_ca15mp_proc_info: | ||
704 | .long 0x410fc0f0 | ||
705 | .long 0xff0ffff0 | ||
706 | __v7_proc __v7_ca15mp_setup, hwcaps = HWCAP_IDIV | ||
707 | .size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info | ||
708 | |||
709 | /* | ||
475 | * Match any ARMv7 processor core. | 710 | * Match any ARMv7 processor core. |
476 | */ | 711 | */ |
477 | .type __v7_proc_info, #object | 712 | .type __v7_proc_info, #object |
478 | __v7_proc_info: | 713 | __v7_proc_info: |
479 | .long 0x000f0000 @ Required ID value | 714 | .long 0x000f0000 @ Required ID value |
480 | .long 0x000f0000 @ Mask for ID | 715 | .long 0x000f0000 @ Mask for ID |
481 | ALT_SMP(.long \ | 716 | __v7_proc __v7_setup |
482 | PMD_TYPE_SECT | \ | ||
483 | PMD_SECT_AP_WRITE | \ | ||
484 | PMD_SECT_AP_READ | \ | ||
485 | PMD_FLAGS_SMP) | ||
486 | ALT_UP(.long \ | ||
487 | PMD_TYPE_SECT | \ | ||
488 | PMD_SECT_AP_WRITE | \ | ||
489 | PMD_SECT_AP_READ | \ | ||
490 | PMD_FLAGS_UP) | ||
491 | .long PMD_TYPE_SECT | \ | ||
492 | PMD_SECT_XN | \ | ||
493 | PMD_SECT_AP_WRITE | \ | ||
494 | PMD_SECT_AP_READ | ||
495 | W(b) __v7_setup | ||
496 | .long cpu_arch_name | ||
497 | .long cpu_elf_name | ||
498 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS | ||
499 | .long cpu_v7_name | ||
500 | .long v7_processor_functions | ||
501 | .long v7wbi_tlb_fns | ||
502 | .long v6_user_fns | ||
503 | .long v7_cache_fns | ||
504 | .size __v7_proc_info, . - __v7_proc_info | 717 | .size __v7_proc_info, . - __v7_proc_info |