summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tcc780x/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/tcc780x/crt0.S')
-rw-r--r--firmware/target/arm/tcc780x/crt0.S83
1 files changed, 46 insertions, 37 deletions
diff --git a/firmware/target/arm/tcc780x/crt0.S b/firmware/target/arm/tcc780x/crt0.S
index af37b40814..05a8868d51 100644
--- a/firmware/target/arm/tcc780x/crt0.S
+++ b/firmware/target/arm/tcc780x/crt0.S
@@ -121,6 +121,52 @@ copied_start:
121 msr cpsr, r0 121 msr cpsr, r0
122 ldr sp, =stackend 122 ldr sp, =stackend
123 123
124 /* Enable MMU & caches. At present this is just doing what the OF does.
125 Ensure TCMs are enabled before copying the exception vectors to 0x0. */
126
127 mov r1, #0xf7000000 /* Virtual MMU Table base */
128
129 ldr r0, =0x1fe0c /* Region 0: 0x00000000-0xffffffff (4Gb) */
130 str r0, [r1] /* AP: 3 EN: 1 DO: 0 CACHE_ALL */
131
132 ldr r0, =0x2801ae24 /* Region 1: 0x28000000-0x2fffffff (128Mb) */
133 str r0, [r1,#4] /* AP: 3 EN: 1 DO: 1 BUFFERED */
134
135 ldr r0, =0x13e44 /* Region 2: 0x00000000-0x000fffff (1Mb) */
136 str r0, [r1,#8] /* AP: 3 EN: 1 DO: 2 BUFFERED */
137
138 ldr r0, =0x4001ce60 /* Region 3: 0x40000000-0x5fffffff (512Mb) */
139 str r0, [r1,#0xc] /* AP: 3 EN: 1 DO: 3 CACHE_NONE */
140
141 ldr r0, =0x6001be80 /* Region 4: 0x60000000-0x6fffffff (256Mb) */
142 str r0, [r1,#0x10] /* AP: 3 EN: 1 DO: 4 CACHE_NONE */
143
144 ldr r0, =0x3801aea4 /* Region 5: 0x38000000-0x3fffffff (128Mb) */
145 str r0, [r1,#0x14] /* AP: 3 EN: 1 DO: 5 BUFFERED */
146
147 ldr r0, =0x8001eec0 /* Region 6: 0x80000000-0xffffffff (2Gb) */
148 str r0, [r1,#0x18] /* AP: 3 EN: 1 DO: 6 CACHE_NONE */
149
150 ldr r0, =0x1001aee0 /* Region 7: 0x10000000-0x17ffffff (128Mb) */
151 str r0, [r1,#0x1c] /* AP: 3 EN: 1 DO: 7 CACHE_NONE */
152
153 add r1, r1, #0x8000
154 mcr p15, 0, r1, c2, c0, 0 /* Set TTBR = TABBASE (Virtual TLB) */
155
156 ldr r0, =0x55555555
157 mcr p15, 0, r0, c3, c0, 0 /* Domain access d0-d15 = 'client' */
158
159 ldr r0, =0xa0000011
160 mcr p15, 0, r0, c9, c1, 0 /* Data TCM: 0xA0000000-0xA00001fff (8Kb) */
161 mov r0, #0xd
162 mcr p15, 0, r0, c9, c1, 1 /* Instr. TCM: 0x00000000-0x00000fff (4Kb) */
163
164 mov r0, #0
165 mcr p15, 0, r0, c7, c5, 0 /* Invalidate Icache */
166 ldr r2, =0x5507d
167 mcr p15, 0, r2, c1, c0, 0 /* Enable MMU, I & D caches */
168 mcr p15, 0, r0, c7, c6, 0 /* Invalidate Dcache */
169 mcr p15, 0, r1, c8, c7, 0 /* Invalidate TLB */
124 170
125#if !defined(BOOTLOADER) && !defined(STUB) 171#if !defined(BOOTLOADER) && !defined(STUB)
126 172
@@ -193,43 +239,6 @@ copied_start:
193 strhi r4, [r2], #4 239 strhi r4, [r2], #4
194 bhi 1b 240 bhi 1b
195 241
196 /*
197 Enable cache & TCM regions
198 TODO: This is just doing what the OF does at present. It needs to be
199 better understood and moved out to a separate MMU functions package.
200 */
201 ldr r1, =0x1fe0c
202 mov r0, #0xf7000000
203 str r1, [r0]
204 ldr r1, =0x2801ae24
205 str r1, [r0,#4]
206 ldr r1, =0x13e44
207 str r1, [r0,#8]
208 ldr r1, =0x4001ce60
209 str r1, [r0,#0xc]
210 ldr r1, =0x6001be80
211 str r1, [r0,#0x10]
212 ldr r1, =0x3801aea4
213 str r1, [r0,#0x14]
214 ldr r1, =0x8001eec0
215 str r1, [r0,#0x18]
216 ldr r1, =0x1001aee0
217 str r1, [r0,#0x1c]
218 add r1, r0, #0x8000 /* r1 now = 0xf7008000 */
219 ldr r0, =0xa0000011
220 ldr r2, =0x5507d
221 mcr p15, 0, r0,c9,c1 /* data tcm region (enabled; 8kb; 0xa0000000) */
222 mov r0, #0xd
223 mcr p15, 0, r0,c9,c1, 1 /* inst tcm region (enabled, 4kb, 0x00000000) */
224 ldr r0, =0x55555555
225 mcr p15, 0, r1,c2,c0 /* translation table base register = 0xf7008000 */
226 mcr p15, 0, r0,c3,c0 /* domain access d0-d15 = 'client' */
227 mov r0, #0
228 mcr p15, 0, r0,c7,c5 /* invalidate icache */
229 mcr p15, 0, r2,c1,c0 /* enable mmu, i & d caches */
230 mcr p15, 0, r0,c7,c6 /* invalidate dcache */
231 mcr p15, 0, r1,c8,c7 /* invalidate tlb */
232
233 bl main 242 bl main
234 /* main() should never return */ 243 /* main() should never return */
235 244