|
@@ -487,7 +487,26 @@ __fixup_smp:
|
|
|
mrc p15, 0, r0, c0, c0, 5 @ read MPIDR
|
|
|
and r0, r0, #0xc0000000 @ multiprocessing extensions and
|
|
|
teq r0, #0x80000000 @ not part of a uniprocessor system?
|
|
|
- moveq pc, lr @ yes, assume SMP
|
|
|
+ bne __fixup_smp_on_up @ no, assume UP
|
|
|
+
|
|
|
+ @ Core indicates it is SMP. Check for Aegis SOC where a single
|
|
|
+ @ Cortex-A9 CPU is present but SMP operations fault.
|
|
|
+ mov r4, #0x41000000
|
|
|
+ orr r4, r4, #0x0000c000
|
|
|
+ orr r4, r4, #0x00000090
|
|
|
+ teq r3, r4 @ Check for ARM Cortex-A9
|
|
|
+ movne pc, lr @ Not ARM Cortex-A9,
|
|
|
+
|
|
|
+ @ If a future SoC *does* use 0x0 as the PERIPH_BASE, then the
|
|
|
+ @ below address check will need to be #ifdef'd or equivalent
|
|
|
+ @ for the Aegis platform.
|
|
|
+ mrc p15, 4, r0, c15, c0 @ get SCU base address
|
|
|
+ teq r0, #0x0 @ '0' on actual UP A9 hardware
|
|
|
+ beq __fixup_smp_on_up @ So its an A9 UP
|
|
|
+ ldr r0, [r0, #4] @ read SCU Config
|
|
|
+ and r0, r0, #0x3 @ number of CPUs
|
|
|
+ teq r0, #0x0 @ is 1?
|
|
|
+ movne pc, lr
|
|
|
|
|
|
__fixup_smp_on_up:
|
|
|
adr r0, 1f
|