@@ -33,7 +33,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
33
/ * the vector table for secure state and HYP mode * /
34
34
_start:
35
35
b jmp_loader / * reset * /
36
+ #if defined(BCM2711) && (BCM2711 == 1 )
37
+ osc: .word 54000000
38
+ #else
36
39
osc: .word 19200000
40
+ #endif
37
41
38
42
/ *
39
43
* secure monitor handler
@@ -48,38 +52,108 @@ _secure_monitor:
48
52
49
53
movw r0 , # 0x1da @ Set HYP_MODE | F_BIT | I_BIT | A_BIT
50
54
msr spsr_cxfs , r0 @ Set full SPSR
55
+
56
+ #if defined(BCM2711) && (BCM2711 == 1 )
57
+ mrc p15 , 1 , r1 , c9 , c0 , 2 @ Read L2CTLR
58
+ orr r1 , r1 , # 0x22 @ Set L2 read/write latency to 2
59
+ mcr p15 , 1 , r1 , c9 , c0 , 2 @ Write L2CTLR
60
+ #endif
61
+
51
62
movs pc , lr @ return to non - secure SVC
52
63
53
64
value: .word 0x63fff
54
65
machid: .word 3138
66
+ #if defined(BCM2711) && (BCM2711 == 1 )
67
+ mbox: .word 0xFF80008C
68
+ #else
55
69
mbox: .word 0x4000008C
70
+ #endif
71
+ prescaler: .word 0xff800008
72
+ GIC_DISTB: .word 0xff841000
73
+ GIC_CPUB: .word 0xff842000
74
+
75
+ #define GICC_CTRLR 0x0
76
+ #define GICC_PMR 0x4
77
+ #define IT_NR 0x7 @ Number of interrupt enable registers ( 256 total irqs)
78
+ #define GICD_CTRLR 0x0
79
+ #define GICD_IGROUPR 0x80
80
+
81
+ @ Shoehorn the GIC code between the reset vector and fixed - offset magic numbers at 240b
82
+
83
+ setup_gic: @ Called from secure mode - set all interrupts to group 1 and enable.
84
+ mrc p15 , 0 , r0 , c0 , c0 , 5
85
+ ubfx r0 , r0 , # 0 , # 2
86
+ cmp r0 , # 0 @ primary core
87
+ beq 2f
88
+ ldr r2 , GIC_DISTB
89
+ add r2 , r2 , #GICD_CTRLR
90
+ mov r0 , # 3 @ Enable group 0 and 1 IRQs from distributor
91
+ str r0 , [ r2 ]
92
+ 2 :
93
+ ldr r0 , GIC_CPUB
94
+ add r0 , r0 , #GICC_CTRLR
95
+ movw r1 , # 0x1e7
96
+ str r1 , [ r0 ] @ Enable group 1 IRQs from CPU interface
97
+ ldr r0 , GIC_CPUB
98
+ add r0 , r0 , #GICC_PMR @ priority mask
99
+ movw r1 , # 0xff
100
+ str r1 , [ r0 ]
101
+ mov r0 , #IT_NR
102
+ mov r1 , #~ 0 @ group 1 all the things
103
+ ldr r2 , GIC_DISTB
104
+ add r2 , r2 , #(GICD_IGROUPR)
105
+ 3 :
106
+ str r1 , [ r2 ]
107
+ add r2 , r2 , # 4
108
+ sub r0 , r0 , # 1
109
+ cmp r0 , # 0
110
+ bne 3b
111
+ str r1 , [ r2 ]
112
+ mov pc , lr
113
+
114
+ .org 0xf0
115
+ . word 0x5afe570b @ magic value to indicate firmware should overwrite atags and kernel
116
+ . word 0 @ version
117
+ atags: .word 0x0 @ device tree address
118
+ kernel: .word 0x0 @ kernel start address
56
119
57
120
jmp_loader:
58
121
@ Check which proc we are and run proc 0 only
122
+ #ifdef GIC
123
+ bl setup_gic
124
+ #endif
59
125
60
- mrc p15 , 0 , r0 , c1 , c0 , 0 @ Read System Control Register
61
- orr r0 , r0 , #( 1 << 2 ) @ cache enable
62
- orr r0 , r0 , #( 1 << 12 ) @ icache enable
63
- mcr p15 , 0 , r0 , c1 , c0 , 0 @ Write System Control Register
64
126
.if !BCM2710
65
127
mrc p15 , 0 , r0 , c1 , c0 , 1 @ Read Auxiliary Control Register
66
128
orr r0 , r0 , #( 1 << 6 ) @ SMP
67
129
mcr p15 , 0 , r0 , c1 , c0 , 1 @ Write Auxiliary Control Register
68
130
.else
69
131
mrrc p15 , 1 , r0 , r1 , c15 @ CPU Extended Control Register
70
132
orr r0 , r0 , #( 1 << 6 ) @ SMP
133
+ and r1 , r1 , #(~ 3 ) @ Set L2 load data prefetch to 0b00 = 16
71
134
mcrr p15 , 1 , r0 , r1 , c15 @ CPU Extended Control Register
72
135
.endif
73
-
136
+ mrc p15 , 0 , r0 , c1 , c0 , 0 @ Read System Control Register
137
+ / * Cortex A72 manual 4 . 3 . 67 says says SMP must be set before enabling the cache. * /
138
+ #ifndef BCM2711
139
+ orr r0 , r0 , #( 1 << 2 ) @ cache enable
140
+ #endif
141
+ orr r0 , r0 , #( 1 << 12 ) @ icache enable
142
+ mcr p15 , 0 , r0 , c1 , c0 , 0 @ Write System Control Register
74
143
mov r0 , # 1
75
144
mcr p15 , 0 , r0 , c14 , c3 , 1 @ CNTV_CTL (enable= 1 , imask= 0 )
76
145
77
146
@ set to non - sec
78
147
ldr r1 , value @ value = 0x63fff
79
148
mcr p15 , 0 , r1 , c1 , c1 , 2 @ NSACR = all copros to non - sec
80
149
@ timer frequency
81
- ldr r1 , osc @ osc = 19200000
150
+ ldr r1 , osc @ osc = 19 . 2 / 54MHz
82
151
mcr p15 , 0 , r1 , c14 , c0 , 0 @ write CNTFRQ
152
+ #if defined(BCM2711) && (BCM2711 == 1 )
153
+ mov r1 , # 0x80000000 @ Set ARM_LOCAL_TIMER_PRE_ADD to 1
154
+ ldr r2 , prescaler
155
+ str r1 , [ r2 ]
156
+ #endif
83
157
84
158
adr r1 , _start
85
159
mcr p15 , 0 , r1 , c12 , c0 , 1 @ set MVBAR to secure vectors
@@ -122,8 +196,3 @@ jmp_loader:
122
196
wfi
123
197
b 10b
124
198
125
- .org 0xf0
126
- . word 0x5afe570b @ magic value to indicate firmware should overwrite atags and kernel
127
- . word 0 @ version
128
- atags: .word 0x0 @ device tree address
129
- kernel: .word 0x0 @ kernel start address
0 commit comments