diff options
Diffstat (limited to 'arch/arm/mm/proc-v7.S')
-rw-r--r-- | arch/arm/mm/proc-v7.S | 65 |
1 files changed, 54 insertions, 11 deletions
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 2c73a7301ff7..7ef3ad05df39 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -98,9 +98,11 @@ ENTRY(cpu_v7_do_suspend) | |||
98 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | 98 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID |
99 | mrc p15, 0, r5, c13, c0, 3 @ User r/o thread ID | 99 | mrc p15, 0, r5, c13, c0, 3 @ User r/o thread ID |
100 | stmia r0!, {r4 - r5} | 100 | stmia r0!, {r4 - r5} |
101 | #ifdef CONFIG_MMU | ||
101 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID | 102 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID |
102 | mrc p15, 0, r7, c2, c0, 1 @ TTB 1 | 103 | mrc p15, 0, r7, c2, c0, 1 @ TTB 1 |
103 | mrc p15, 0, r11, c2, c0, 2 @ TTB control register | 104 | mrc p15, 0, r11, c2, c0, 2 @ TTB control register |
105 | #endif | ||
104 | mrc p15, 0, r8, c1, c0, 0 @ Control register | 106 | mrc p15, 0, r8, c1, c0, 0 @ Control register |
105 | mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register | 107 | mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register |
106 | mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control | 108 | mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control |
@@ -110,13 +112,14 @@ ENDPROC(cpu_v7_do_suspend) | |||
110 | 112 | ||
111 | ENTRY(cpu_v7_do_resume) | 113 | ENTRY(cpu_v7_do_resume) |
112 | mov ip, #0 | 114 | mov ip, #0 |
113 | mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs | ||
114 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache | 115 | mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache |
115 | mcr p15, 0, ip, c13, c0, 1 @ set reserved context ID | 116 | mcr p15, 0, ip, c13, c0, 1 @ set reserved context ID |
116 | ldmia r0!, {r4 - r5} | 117 | ldmia r0!, {r4 - r5} |
117 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | 118 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID |
118 | mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID | 119 | mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID |
119 | ldmia r0, {r6 - r11} | 120 | ldmia r0, {r6 - r11} |
121 | #ifdef CONFIG_MMU | ||
122 | mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs | ||
120 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID | 123 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID |
121 | #ifndef CONFIG_ARM_LPAE | 124 | #ifndef CONFIG_ARM_LPAE |
122 | ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP) | 125 | ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP) |
@@ -125,14 +128,15 @@ ENTRY(cpu_v7_do_resume) | |||
125 | mcr p15, 0, r1, c2, c0, 0 @ TTB 0 | 128 | mcr p15, 0, r1, c2, c0, 0 @ TTB 0 |
126 | mcr p15, 0, r7, c2, c0, 1 @ TTB 1 | 129 | mcr p15, 0, r7, c2, c0, 1 @ TTB 1 |
127 | mcr p15, 0, r11, c2, c0, 2 @ TTB control register | 130 | mcr p15, 0, r11, c2, c0, 2 @ TTB control register |
128 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register | ||
129 | teq r4, r9 @ Is it already set? | ||
130 | mcrne p15, 0, r9, c1, c0, 1 @ No, so write it | ||
131 | mcr p15, 0, r10, c1, c0, 2 @ Co-processor access control | ||
132 | ldr r4, =PRRR @ PRRR | 131 | ldr r4, =PRRR @ PRRR |
133 | ldr r5, =NMRR @ NMRR | 132 | ldr r5, =NMRR @ NMRR |
134 | mcr p15, 0, r4, c10, c2, 0 @ write PRRR | 133 | mcr p15, 0, r4, c10, c2, 0 @ write PRRR |
135 | mcr p15, 0, r5, c10, c2, 1 @ write NMRR | 134 | mcr p15, 0, r5, c10, c2, 1 @ write NMRR |
135 | #endif /* CONFIG_MMU */ | ||
136 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register | ||
137 | teq r4, r9 @ Is it already set? | ||
138 | mcrne p15, 0, r9, c1, c0, 1 @ No, so write it | ||
139 | mcr p15, 0, r10, c1, c0, 2 @ Co-processor access control | ||
136 | isb | 140 | isb |
137 | dsb | 141 | dsb |
138 | mov r0, r8 @ control register | 142 | mov r0, r8 @ control register |
@@ -140,6 +144,29 @@ ENTRY(cpu_v7_do_resume) | |||
140 | ENDPROC(cpu_v7_do_resume) | 144 | ENDPROC(cpu_v7_do_resume) |
141 | #endif | 145 | #endif |
142 | 146 | ||
147 | #ifdef CONFIG_CPU_PJ4B | ||
148 | globl_equ cpu_pj4b_switch_mm, cpu_v7_switch_mm | ||
149 | globl_equ cpu_pj4b_set_pte_ext, cpu_v7_set_pte_ext | ||
150 | globl_equ cpu_pj4b_proc_init, cpu_v7_proc_init | ||
151 | globl_equ cpu_pj4b_proc_fin, cpu_v7_proc_fin | ||
152 | globl_equ cpu_pj4b_reset, cpu_v7_reset | ||
153 | #ifdef CONFIG_PJ4B_ERRATA_4742 | ||
154 | ENTRY(cpu_pj4b_do_idle) | ||
155 | dsb @ WFI may enter a low-power mode | ||
156 | wfi | ||
157 | dsb @barrier | ||
158 | mov pc, lr | ||
159 | ENDPROC(cpu_pj4b_do_idle) | ||
160 | #else | ||
161 | globl_equ cpu_pj4b_do_idle, cpu_v7_do_idle | ||
162 | #endif | ||
163 | globl_equ cpu_pj4b_dcache_clean_area, cpu_v7_dcache_clean_area | ||
164 | globl_equ cpu_pj4b_do_suspend, cpu_v7_do_suspend | ||
165 | globl_equ cpu_pj4b_do_resume, cpu_v7_do_resume | ||
166 | globl_equ cpu_pj4b_suspend_size, cpu_v7_suspend_size | ||
167 | |||
168 | #endif | ||
169 | |||
143 | __CPUINIT | 170 | __CPUINIT |
144 | 171 | ||
145 | /* | 172 | /* |
@@ -155,7 +182,8 @@ ENDPROC(cpu_v7_do_resume) | |||
155 | */ | 182 | */ |
156 | __v7_ca5mp_setup: | 183 | __v7_ca5mp_setup: |
157 | __v7_ca9mp_setup: | 184 | __v7_ca9mp_setup: |
158 | mov r10, #(1 << 0) @ TLB ops broadcasting | 185 | __v7_cr7mp_setup: |
186 | mov r10, #(1 << 0) @ Cache/TLB ops broadcasting | ||
159 | b 1f | 187 | b 1f |
160 | __v7_ca7mp_setup: | 188 | __v7_ca7mp_setup: |
161 | __v7_ca15mp_setup: | 189 | __v7_ca15mp_setup: |
@@ -350,6 +378,9 @@ __v7_setup_stack: | |||
350 | 378 | ||
351 | @ define struct processor (see <asm/proc-fns.h> and proc-macros.S) | 379 | @ define struct processor (see <asm/proc-fns.h> and proc-macros.S) |
352 | define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1 | 380 | define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1 |
381 | #ifdef CONFIG_CPU_PJ4B | ||
382 | define_processor_functions pj4b, dabort=v7_early_abort, pabort=v7_pabort, suspend=1 | ||
383 | #endif | ||
353 | 384 | ||
354 | .section ".rodata" | 385 | .section ".rodata" |
355 | 386 | ||
@@ -362,7 +393,7 @@ __v7_setup_stack: | |||
362 | /* | 393 | /* |
363 | * Standard v7 proc info content | 394 | * Standard v7 proc info content |
364 | */ | 395 | */ |
365 | .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 | 396 | .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0, proc_fns = v7_processor_functions |
366 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ | 397 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
367 | PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags) | 398 | PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags) |
368 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ | 399 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
@@ -375,7 +406,7 @@ __v7_setup_stack: | |||
375 | .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \ | 406 | .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \ |
376 | HWCAP_EDSP | HWCAP_TLS | \hwcaps | 407 | HWCAP_EDSP | HWCAP_TLS | \hwcaps |
377 | .long cpu_v7_name | 408 | .long cpu_v7_name |
378 | .long v7_processor_functions | 409 | .long \proc_fns |
379 | .long v7wbi_tlb_fns | 410 | .long v7wbi_tlb_fns |
380 | .long v6_user_fns | 411 | .long v6_user_fns |
381 | .long v7_cache_fns | 412 | .long v7_cache_fns |
@@ -407,12 +438,24 @@ __v7_ca9mp_proc_info: | |||
407 | /* | 438 | /* |
408 | * Marvell PJ4B processor. | 439 | * Marvell PJ4B processor. |
409 | */ | 440 | */ |
441 | #ifdef CONFIG_CPU_PJ4B | ||
410 | .type __v7_pj4b_proc_info, #object | 442 | .type __v7_pj4b_proc_info, #object |
411 | __v7_pj4b_proc_info: | 443 | __v7_pj4b_proc_info: |
412 | .long 0x562f5840 | 444 | .long 0x560f5800 |
413 | .long 0xfffffff0 | 445 | .long 0xff0fff00 |
414 | __v7_proc __v7_pj4b_setup | 446 | __v7_proc __v7_pj4b_setup, proc_fns = pj4b_processor_functions |
415 | .size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info | 447 | .size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info |
448 | #endif | ||
449 | |||
450 | /* | ||
451 | * ARM Ltd. Cortex R7 processor. | ||
452 | */ | ||
453 | .type __v7_cr7mp_proc_info, #object | ||
454 | __v7_cr7mp_proc_info: | ||
455 | .long 0x410fc170 | ||
456 | .long 0xff0ffff0 | ||
457 | __v7_proc __v7_cr7mp_setup | ||
458 | .size __v7_cr7mp_proc_info, . - __v7_cr7mp_proc_info | ||
416 | 459 | ||
417 | /* | 460 | /* |
418 | * ARM Ltd. Cortex A7 processor. | 461 | * ARM Ltd. Cortex A7 processor. |