|
13 | 13 | */
|
14 | 14 | #include <linux/linkage.h>
|
15 | 15 | #include <linux/init.h>
|
| 16 | +#include <linux/errno.h> |
16 | 17 |
|
17 | 18 | #include <asm/assembler.h>
|
18 | 19 | #include <asm/ptrace.h>
|
@@ -110,8 +111,8 @@ ENTRY(secondary_startup)
|
110 | 111 |
|
111 | 112 | #ifdef CONFIG_ARM_MPU
|
112 | 113 | /* Use MPU region info supplied by __cpu_up */
|
113 |
| - ldr r6, [r7] @ get secondary_data.mpu_szr |
114 |
| - bl __setup_mpu @ Initialize the MPU |
| 114 | + ldr r6, [r7] @ get secondary_data.mpu_rgn_info |
| 115 | + bl __secondary_setup_mpu @ Initialize the MPU |
115 | 116 | #endif
|
116 | 117 |
|
117 | 118 | badr lr, 1f @ return (PIC) address
|
@@ -204,13 +205,13 @@ ENTRY(__setup_mpu)
|
204 | 205 | mrc p15, 0, r0, c0, c1, 4 @ Read ID_MMFR0
|
205 | 206 | and r0, r0, #(MMFR0_PMSA) @ PMSA field
|
206 | 207 | teq r0, #(MMFR0_PMSAv7) @ PMSA v7
|
207 |
| - bne __error_p @ Fail: ARM_MPU on NOT v7 PMSA |
| 208 | + bxne lr |
208 | 209 |
|
209 | 210 | /* Determine whether the D/I-side memory map is unified. We set the
|
210 | 211 | * flags here and continue to use them for the rest of this function */
|
211 | 212 | mrc p15, 0, r0, c0, c0, 4 @ MPUIR
|
212 | 213 | ands r5, r0, #MPUIR_DREGION_SZMASK @ 0 size d region => No MPU
|
213 |
| - beq __error_p @ Fail: ARM_MPU and no MPU |
| 214 | + bxeq lr |
214 | 215 | tst r0, #MPUIR_nU @ MPUIR_nU = 0 for unified
|
215 | 216 |
|
216 | 217 | /* Setup second region first to free up r6 */
|
@@ -238,27 +239,70 @@ ENTRY(__setup_mpu)
|
238 | 239 | setup_region r0, r5, r6, MPU_INSTR_SIDE @ 0x0, BG region, enabled
|
239 | 240 | 2: isb
|
240 | 241 |
|
241 |
| - /* Vectors region */ |
242 |
| - set_region_nr r0, #MPU_VECTORS_REGION |
| 242 | + /* Enable the MPU */ |
| 243 | + mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR |
| 244 | + bic r0, r0, #CR_BR @ Disable the 'default mem-map' |
| 245 | + orr r0, r0, #CR_M @ Set SCTRL.M (MPU on) |
| 246 | + mcr p15, 0, r0, c1, c0, 0 @ Enable MPU |
| 247 | + isb |
| 248 | + |
| 249 | + ret lr |
| 250 | +ENDPROC(__setup_mpu) |
| 251 | + |
| 252 | +#ifdef CONFIG_SMP |
| 253 | +/* |
| 254 | + * r6: pointer at mpu_rgn_info |
| 255 | + */ |
| 256 | + |
| 257 | +ENTRY(__secondary_setup_mpu) |
| 258 | + /* Probe for v7 PMSA compliance */ |
| 259 | + mrc p15, 0, r0, c0, c1, 4 @ Read ID_MMFR0 |
| 260 | + and r0, r0, #(MMFR0_PMSA) @ PMSA field |
| 261 | + teq r0, #(MMFR0_PMSAv7) @ PMSA v7 |
| 262 | + bne __error_p |
| 263 | + |
| 264 | + /* Determine whether the D/I-side memory map is unified. We set the |
| 265 | + * flags here and continue to use them for the rest of this function */ |
| 266 | + mrc p15, 0, r0, c0, c0, 4 @ MPUIR |
| 267 | + ands r5, r0, #MPUIR_DREGION_SZMASK @ 0 size d region => No MPU |
| 268 | + beq __error_p |
| 269 | + |
| 270 | + ldr r4, [r6, #MPU_RNG_INFO_USED] |
| 271 | + mov r5, #MPU_RNG_SIZE |
| 272 | + add r3, r6, #MPU_RNG_INFO_RNGS |
| 273 | + mla r3, r4, r5, r3 |
| 274 | + |
| 275 | +1: |
| 276 | + tst r0, #MPUIR_nU @ MPUIR_nU = 0 for unified |
| 277 | + sub r3, r3, #MPU_RNG_SIZE |
| 278 | + sub r4, r4, #1 |
| 279 | + |
| 280 | + set_region_nr r0, r4 |
243 | 281 | isb
|
244 |
| - /* Shared, inaccessible to PL0, rw PL1 */ |
245 |
| - mov r0, #CONFIG_VECTORS_BASE @ Cover from VECTORS_BASE |
246 |
| - ldr r5,=(MPU_AP_PL1RW_PL0NA | MPU_RGN_NORMAL) |
247 |
| - /* Writing N to bits 5:1 (RSR_SZ) --> region size 2^N+1 */ |
248 |
| - mov r6, #(((2 * PAGE_SHIFT - 1) << MPU_RSR_SZ) | 1 << MPU_RSR_EN) |
249 | 282 |
|
250 |
| - setup_region r0, r5, r6, MPU_DATA_SIDE @ VECTORS_BASE, PL0 NA, enabled |
251 |
| - beq 3f @ Memory-map not unified |
252 |
| - setup_region r0, r5, r6, MPU_INSTR_SIDE @ VECTORS_BASE, PL0 NA, enabled |
253 |
| -3: isb |
| 283 | + ldr r0, [r3, #MPU_RGN_DRBAR] |
| 284 | + ldr r6, [r3, #MPU_RGN_DRSR] |
| 285 | + ldr r5, [r3, #MPU_RGN_DRACR] |
| 286 | + |
| 287 | + setup_region r0, r5, r6, MPU_DATA_SIDE |
| 288 | + beq 2f |
| 289 | + setup_region r0, r5, r6, MPU_INSTR_SIDE |
| 290 | +2: isb |
| 291 | + |
| 292 | + mrc p15, 0, r0, c0, c0, 4 @ Reevaluate the MPUIR |
| 293 | + cmp r4, #0 |
| 294 | + bgt 1b |
254 | 295 |
|
255 | 296 | /* Enable the MPU */
|
256 | 297 | mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR
|
257 |
| - bic r0, r0, #CR_BR @ Disable the 'default mem-map' |
| 298 | + bic r0, r0, #CR_BR @ Disable the 'default mem-map' |
258 | 299 | orr r0, r0, #CR_M @ Set SCTRL.M (MPU on)
|
259 | 300 | mcr p15, 0, r0, c1, c0, 0 @ Enable MPU
|
260 | 301 | isb
|
| 302 | + |
261 | 303 | ret lr
|
262 |
| -ENDPROC(__setup_mpu) |
263 |
| -#endif |
| 304 | +ENDPROC(__secondary_setup_mpu) |
| 305 | + |
| 306 | +#endif /* CONFIG_SMP */ |
| 307 | +#endif /* CONFIG_ARM_MPU */ |
264 | 308 | #include "head-common.S"
|
0 commit comments