diff options
Diffstat (limited to 'firmware/target/arm/tcc780x/crt0.S')
-rw-r--r-- | firmware/target/arm/tcc780x/crt0.S | 83 |
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 | ||