1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include <linux/linkage.h>
#include <linux/init.h>
__CPUINIT
CCI400_SI3_SNOOP_CONTROL:
.long 0x10394000
CCI400_STATUS:
.long 0x1039000C
MP1_AXI_CONFIG:
.long 0x1020022C
ENTRY(mt_secondary_startup)
/*
MRRC p15, 1, r0, r1, c15 @ read cpu extended control register
ORR r0, r0, #0x040
MCRR p15, 1, r0, r1, c15 @ write cpu extended control register
DSB
ISB
*/
/* CONFIG_ARM_ERRATA_836870, prevent software livelock */
mrc p15, 0, r9, c0, c0, 0 @ MIDR
movw r10, #0xfff0
movt r10, #0xff0f
and r9, r10
movw r10, #0xD030
movt r10, #0x410F
teq r9, r10
bne 1f
mrrc p15, 0, r0, r1, c15 @ Read CPU Auxiliary Control Register
orr r0, r0, #0x01000000 @ set CPUACTLR[24] = 1
mcrr p15, 0, r0, r1, c15 @ Write CPU Auxiliary Control Register
dsb
isb
1:
mrc p15, 0, r0, c0, c0, 5 @ MPIDR
ubfx r0, r0, #8, #4 @ Cluster Id
cmp r0, #0 @ Cluster 1
beq cluster0
ldr r2, MP1_AXI_CONFIG
ldr r1, [r2]
bic r1, r1, #0x10
str r1, [r2]
ldr r2, CCI400_SI3_SNOOP_CONTROL
ldr r1, [r2]
orr r1, r1, #0x3
str r1, [r2]
ldr r2, CCI400_STATUS
b 1f
0:
dsb
1:
ldr r1, [r2]
tst r1, #1
bne 0b
cluster0:
b secondary_startup
END(mt_secondary_startup)
|