aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/proc-v6.S
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/arm/mm/proc-v6.S
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'arch/arm/mm/proc-v6.S')
-rw-r--r--arch/arm/mm/proc-v6.S121
1 files changed, 78 insertions, 43 deletions
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S
index 22aac8515196..1d2b8451bf25 100644
--- a/arch/arm/mm/proc-v6.S
+++ b/arch/arm/mm/proc-v6.S
@@ -30,13 +30,10 @@
30#define TTB_RGN_WT (2 << 3) 30#define TTB_RGN_WT (2 << 3)
31#define TTB_RGN_WB (3 << 3) 31#define TTB_RGN_WB (3 << 3)
32 32
33#ifndef CONFIG_SMP 33#define TTB_FLAGS_UP TTB_RGN_WBWA
34#define TTB_FLAGS TTB_RGN_WBWA 34#define PMD_FLAGS_UP PMD_SECT_WB
35#define PMD_FLAGS PMD_SECT_WB 35#define TTB_FLAGS_SMP TTB_RGN_WBWA|TTB_S
36#else 36#define PMD_FLAGS_SMP PMD_SECT_WBWA|PMD_SECT_S
37#define TTB_FLAGS TTB_RGN_WBWA|TTB_S
38#define PMD_FLAGS PMD_SECT_WBWA|PMD_SECT_S
39#endif
40 37
41ENTRY(cpu_v6_proc_init) 38ENTRY(cpu_v6_proc_init)
42 mov pc, lr 39 mov pc, lr
@@ -97,7 +94,8 @@ ENTRY(cpu_v6_switch_mm)
97#ifdef CONFIG_MMU 94#ifdef CONFIG_MMU
98 mov r2, #0 95 mov r2, #0
99 ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id 96 ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id
100 orr r0, r0, #TTB_FLAGS 97 ALT_SMP(orr r0, r0, #TTB_FLAGS_SMP)
98 ALT_UP(orr r0, r0, #TTB_FLAGS_UP)
101 mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB 99 mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
102 mcr p15, 0, r2, c7, c10, 4 @ drain write buffer 100 mcr p15, 0, r2, c7, c10, 4 @ drain write buffer
103 mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 101 mcr p15, 0, r0, c2, c0, 0 @ set TTB 0
@@ -123,6 +121,53 @@ ENTRY(cpu_v6_set_pte_ext)
123#endif 121#endif
124 mov pc, lr 122 mov pc, lr
125 123
124/* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */
125.globl cpu_v6_suspend_size
126.equ cpu_v6_suspend_size, 4 * 8
127#ifdef CONFIG_PM_SLEEP
128ENTRY(cpu_v6_do_suspend)
129 stmfd sp!, {r4 - r11, lr}
130 mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
131 mrc p15, 0, r5, c13, c0, 1 @ Context ID
132 mrc p15, 0, r6, c3, c0, 0 @ Domain ID
133 mrc p15, 0, r7, c2, c0, 0 @ Translation table base 0
134 mrc p15, 0, r8, c2, c0, 1 @ Translation table base 1
135 mrc p15, 0, r9, c1, c0, 1 @ auxiliary control register
136 mrc p15, 0, r10, c1, c0, 2 @ co-processor access control
137 mrc p15, 0, r11, c1, c0, 0 @ control register
138 stmia r0, {r4 - r11}
139 ldmfd sp!, {r4- r11, pc}
140ENDPROC(cpu_v6_do_suspend)
141
142ENTRY(cpu_v6_do_resume)
143 mov ip, #0
144 mcr p15, 0, ip, c7, c14, 0 @ clean+invalidate D cache
145 mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
146 mcr p15, 0, ip, c7, c15, 0 @ clean+invalidate cache
147 mcr p15, 0, ip, c7, c10, 4 @ drain write buffer
148 ldmia r0, {r4 - r11}
149 mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
150 mcr p15, 0, r5, c13, c0, 1 @ Context ID
151 mcr p15, 0, r6, c3, c0, 0 @ Domain ID
152 mcr p15, 0, r7, c2, c0, 0 @ Translation table base 0
153 mcr p15, 0, r8, c2, c0, 1 @ Translation table base 1
154 mcr p15, 0, r9, c1, c0, 1 @ auxiliary control register
155 mcr p15, 0, r10, c1, c0, 2 @ co-processor access control
156 mcr p15, 0, ip, c2, c0, 2 @ TTB control register
157 mcr p15, 0, ip, c7, c5, 4 @ ISB
158 mov r0, r11 @ control register
159 mov r2, r7, lsr #14 @ get TTB0 base
160 mov r2, r2, lsl #14
161 ldr r3, cpu_resume_l1_flags
162 b cpu_resume_mmu
163ENDPROC(cpu_v6_do_resume)
164cpu_resume_l1_flags:
165 ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP)
166 ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP)
167#else
168#define cpu_v6_do_suspend 0
169#define cpu_v6_do_resume 0
170#endif
126 171
127 172
128 .type cpu_v6_name, #object 173 .type cpu_v6_name, #object
@@ -130,14 +175,9 @@ cpu_v6_name:
130 .asciz "ARMv6-compatible processor" 175 .asciz "ARMv6-compatible processor"
131 .size cpu_v6_name, . - cpu_v6_name 176 .size cpu_v6_name, . - cpu_v6_name
132 177
133 .type cpu_pj4_name, #object
134cpu_pj4_name:
135 .asciz "Marvell PJ4 processor"
136 .size cpu_pj4_name, . - cpu_pj4_name
137
138 .align 178 .align
139 179
140 __INIT 180 __CPUINIT
141 181
142/* 182/*
143 * __v6_setup 183 * __v6_setup
@@ -156,9 +196,11 @@ cpu_pj4_name:
156 */ 196 */
157__v6_setup: 197__v6_setup:
158#ifdef CONFIG_SMP 198#ifdef CONFIG_SMP
159 mrc p15, 0, r0, c1, c0, 1 @ Enable SMP/nAMP mode 199 ALT_SMP(mrc p15, 0, r0, c1, c0, 1) @ Enable SMP/nAMP mode
200 ALT_UP(nop)
160 orr r0, r0, #0x20 201 orr r0, r0, #0x20
161 mcr p15, 0, r0, c1, c0, 1 202 ALT_SMP(mcr p15, 0, r0, c1, c0, 1)
203 ALT_UP(nop)
162#endif 204#endif
163 205
164 mov r0, #0 206 mov r0, #0
@@ -169,8 +211,11 @@ __v6_setup:
169#ifdef CONFIG_MMU 211#ifdef CONFIG_MMU
170 mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs 212 mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs
171 mcr p15, 0, r0, c2, c0, 2 @ TTB control register 213 mcr p15, 0, r0, c2, c0, 2 @ TTB control register
172 orr r4, r4, #TTB_FLAGS 214 ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP)
173 mcr p15, 0, r4, c2, c0, 1 @ load TTB1 215 ALT_UP(orr r4, r4, #TTB_FLAGS_UP)
216 ALT_SMP(orr r8, r8, #TTB_FLAGS_SMP)
217 ALT_UP(orr r8, r8, #TTB_FLAGS_UP)
218 mcr p15, 0, r8, c2, c0, 1 @ load TTB1
174#endif /* CONFIG_MMU */ 219#endif /* CONFIG_MMU */
175 adr r5, v6_crval 220 adr r5, v6_crval
176 ldmia r5, {r5, r6} 221 ldmia r5, {r5, r6}
@@ -192,6 +237,8 @@ __v6_setup:
192v6_crval: 237v6_crval:
193 crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c 238 crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c
194 239
240 __INITDATA
241
195 .type v6_processor_functions, #object 242 .type v6_processor_functions, #object
196ENTRY(v6_processor_functions) 243ENTRY(v6_processor_functions)
197 .word v6_early_abort 244 .word v6_early_abort
@@ -203,8 +250,13 @@ ENTRY(v6_processor_functions)
203 .word cpu_v6_dcache_clean_area 250 .word cpu_v6_dcache_clean_area
204 .word cpu_v6_switch_mm 251 .word cpu_v6_switch_mm
205 .word cpu_v6_set_pte_ext 252 .word cpu_v6_set_pte_ext
253 .word cpu_v6_suspend_size
254 .word cpu_v6_do_suspend
255 .word cpu_v6_do_resume
206 .size v6_processor_functions, . - v6_processor_functions 256 .size v6_processor_functions, . - v6_processor_functions
207 257
258 .section ".rodata"
259
208 .type cpu_arch_name, #object 260 .type cpu_arch_name, #object
209cpu_arch_name: 261cpu_arch_name:
210 .asciz "armv6" 262 .asciz "armv6"
@@ -225,10 +277,16 @@ cpu_elf_name:
225__v6_proc_info: 277__v6_proc_info:
226 .long 0x0007b000 278 .long 0x0007b000
227 .long 0x0007f000 279 .long 0x0007f000
228 .long PMD_TYPE_SECT | \ 280 ALT_SMP(.long \
281 PMD_TYPE_SECT | \
282 PMD_SECT_AP_WRITE | \
283 PMD_SECT_AP_READ | \
284 PMD_FLAGS_SMP)
285 ALT_UP(.long \
286 PMD_TYPE_SECT | \
229 PMD_SECT_AP_WRITE | \ 287 PMD_SECT_AP_WRITE | \
230 PMD_SECT_AP_READ | \ 288 PMD_SECT_AP_READ | \
231 PMD_FLAGS 289 PMD_FLAGS_UP)
232 .long PMD_TYPE_SECT | \ 290 .long PMD_TYPE_SECT | \
233 PMD_SECT_XN | \ 291 PMD_SECT_XN | \
234 PMD_SECT_AP_WRITE | \ 292 PMD_SECT_AP_WRITE | \
@@ -244,26 +302,3 @@ __v6_proc_info:
244 .long v6_user_fns 302 .long v6_user_fns
245 .long v6_cache_fns 303 .long v6_cache_fns
246 .size __v6_proc_info, . - __v6_proc_info 304 .size __v6_proc_info, . - __v6_proc_info
247
248 .type __pj4_v6_proc_info, #object
249__pj4_v6_proc_info:
250 .long 0x560f5810
251 .long 0xff0ffff0
252 .long PMD_TYPE_SECT | \
253 PMD_SECT_AP_WRITE | \
254 PMD_SECT_AP_READ | \
255 PMD_FLAGS
256 .long PMD_TYPE_SECT | \
257 PMD_SECT_XN | \
258 PMD_SECT_AP_WRITE | \
259 PMD_SECT_AP_READ
260 b __v6_setup
261 .long cpu_arch_name
262 .long cpu_elf_name
263 .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
264 .long cpu_pj4_name
265 .long v6_processor_functions
266 .long v6wbi_tlb_fns
267 .long v6_user_fns
268 .long v6_cache_fns
269 .size __pj4_v6_proc_info, . - __pj4_v6_proc_info