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#include <config.h>
31#include <version.h>
32#include <asm/arch/ixp425.h>
33
34#define MMU_Control_M 0x001
35#define MMU_Control_A 0x002
36#define MMU_Control_C 0x004
37#define MMU_Control_W 0x008
38#define MMU_Control_P 0x010
39#define MMU_Control_D 0x020
40#define MMU_Control_L 0x040
41#define MMU_Control_B 0x080
42#define MMU_Control_S 0x100
43#define MMU_Control_R 0x200
44#define MMU_Control_I 0x1000
45#define MMU_Control_X 0x2000
46#define MMU_Control_Init (MMU_Control_P|MMU_Control_D|MMU_Control_L)
47
48
49
50
51
52
53 .macro DELAY_FOR cycles, reg0
54 ldr \reg0, =\cycles
55 subs \reg0, \reg0,
56 subne pc, pc,
57 .endm
58
59
60 .macro CPWAIT reg
61 mrc p15,0,\reg,c2,c0,0
62 mov \reg,\reg
63 sub pc,pc,
64 .endm
65
66.globl _start
67_start: b reset
68 ldr pc, _undefined_instruction
69 ldr pc, _software_interrupt
70 ldr pc, _prefetch_abort
71 ldr pc, _data_abort
72 ldr pc, _not_used
73 ldr pc, _irq
74 ldr pc, _fiq
75
76_undefined_instruction: .word undefined_instruction
77_software_interrupt: .word software_interrupt
78_prefetch_abort: .word prefetch_abort
79_data_abort: .word data_abort
80_not_used: .word not_used
81_irq: .word irq
82_fiq: .word fiq
83
84 .balignl 16,0xdeadbeef
85
86
87
88
89
90
91
92
93
94
95
96_TEXT_BASE:
97 .word TEXT_BASE
98
99.globl _armboot_start
100_armboot_start:
101 .word _start
102
103
104
105
106.globl _bss_start
107_bss_start:
108 .word __bss_start
109
110.globl _bss_end
111_bss_end:
112 .word _end
113
114#ifdef CONFIG_USE_IRQ
115
116.globl IRQ_STACK_START
117IRQ_STACK_START:
118 .word 0x0badc0de
119
120
121.globl FIQ_STACK_START
122FIQ_STACK_START:
123 .word 0x0badc0de
124#endif
125
126
127
128
129
130
131
132reset:
133
134 mov r0,
135 mcr p15, 0, r0, c1, c0, 0
136 CPWAIT r0
137
138
139 mcr p15, 0, r0, c7, c7, 0
140 CPWAIT r0
141
142
143 mcr p15, 0, r0, c8, c7, 0
144 CPWAIT r0
145
146
147 mcr p15, 0, r0, c7, c10, 4
148 CPWAIT r0
149
150
151 mrc p15, 0, r0, c1, c0, 1
152 orr r0, r0,
153 mcr p15, 0, r0, c1, c0, 1
154 CPWAIT r0
155
156
157 ldr r1, =CONFIG_SYS_EXP_CS0
158 ldr r2, =IXP425_EXP_CS0
159 str r1, [r2]
160
161
162
163 ldr r2, =IXP425_EXP_CFG0
164 ldr r1, [r2]
165 orr r1, r1,
166 str r1, [r2]
167#endif
168 mov r1,
169 ldr r2, =IXP425_SDR_CONFIG
170 str r1, [r2]
171
172
173 mov r1,
174 ldr r3, =IXP425_SDR_REFRESH
175 str r1, [r3]
176
177
178 mov r1,
179 ldr r4, =IXP425_SDR_IR
180 str r1, [r4]
181 DELAY_FOR 0x4000, r0
182
183
184 ldr r1, =CONFIG_SYS_SDRAM_REFRESH_CNT
185 str r1, [r3]
186 DELAY_FOR 0x4000, r0
187
188
189 mov r1,
190 str r1, [r4]
191 DELAY_FOR 0x4000, r0
192
193
194 mov r1,
195 mov r5,
196111: str r1, [r4]
197 DELAY_FOR 0x100, r0
198 subs r5, r5,
199 bne 111b
200
201
202 mov r1,
203 str r1, [r4]
204 DELAY_FOR 0x4000, r0
205
206
207 mov r1,
208 str r1, [r4]
209 DELAY_FOR 0x4000, r0
210
211
212 mov r0,
213 mov r4, r0
214 add r2, r0,
215 mov r1,
216 mov r5, r1
217
218 30:
219 ldr r3, [r0],
220 str r3, [r1],
221 cmp r0, r2
222 bne 30b
223
224
225 mcr p15, 0, r0, c7, c7, 0
226 CPWAIT r0
227
228
229 mcr p15, 0, r0, c8, c7, 0
230 CPWAIT r0
231
232
233 mcr p15, 0, r0, c7, c10, 4
234 CPWAIT r0
235
236
237 ldr r2, =IXP425_EXP_CFG0
238 ldr r1, [r2]
239 bic r1, r1,
240 str r1, [r2]
241
242 nop
243 nop
244 nop
245 nop
246 nop
247 nop
248
249
250 mcr p15, 0, r0, c8, c7, 0
251 CPWAIT r0
252
253
254 mrc p15, 0, r0, c1, c0, 0
255 orr r0, r0,
256 mcr p15, 0, r0, c1, c0, 0
257 CPWAIT r0
258
259 mrs r0,cpsr
260 bic r0,r0,
261 orr r0,r0,
262 msr cpsr,r0
263
264#ifndef CONFIG_SKIP_RELOCATE_UBOOT
265relocate:
266 adr r0, _start
267 ldr r1, _TEXT_BASE
268 cmp r0, r1
269 beq stack_setup
270
271 ldr r2, _armboot_start
272 ldr r3, _bss_start
273 sub r2, r3, r2
274 add r2, r0, r2
275
276copy_loop:
277 ldmia r0!, {r3-r10}
278 stmia r1!, {r3-r10}
279 cmp r0, r2
280 ble copy_loop
281#endif
282
283
284stack_setup:
285 ldr r0, _TEXT_BASE
286 sub r0, r0,
287 sub r0, r0,
288#ifdef CONFIG_USE_IRQ
289 sub r0, r0,
290#endif
291 sub sp, r0,
292
293clear_bss:
294 ldr r0, _bss_start
295 ldr r1, _bss_end
296 mov r2,
297
298clbss_l:str r2, [r0]
299 add r0, r0,
300 cmp r0, r1
301 ble clbss_l
302
303 ldr pc, _start_armboot
304
305_start_armboot: .word start_armboot
306
307
308
309
310
311
312
313
314
315
316#define S_FRAME_SIZE 72
317
318#define S_OLD_R0 68
319#define S_PSR 64
320#define S_PC 60
321#define S_LR 56
322#define S_SP 52
323
324#define S_IP 48
325#define S_FP 44
326#define S_R10 40
327#define S_R9 36
328#define S_R8 32
329#define S_R7 28
330#define S_R6 24
331#define S_R5 20
332#define S_R4 16
333#define S_R3 12
334#define S_R2 8
335#define S_R1 4
336#define S_R0 0
337
338#define MODE_SVC 0x13
339
340
341
342 .macro bad_save_user_regs
343 sub sp, sp,
344 stmia sp, {r0 - r12}
345 add r8, sp,
346
347 ldr r2, _armboot_start
348 sub r2, r2,
349 sub r2, r2,
350 ldmia r2, {r2 - r4}
351 add r0, sp,
352
353 add r5, sp,
354 mov r1, lr
355 stmia r5, {r0 - r4}
356 mov r0, sp
357 .endm
358
359
360
361
362
363 .macro irq_save_user_regs
364 sub sp, sp,
365 stmia sp, {r0 - r12}
366 add r8, sp,
367 stmdb r8, {sp, lr}^
368 str lr, [r8,
369 mrs r6, spsr
370 str r6, [r8,
371 str r0, [r8,
372 mov r0, sp
373 .endm
374
375 .macro irq_restore_user_regs
376 ldmia sp, {r0 - lr}^ @ Calling r0 - lr
377 mov r0, r0
378 ldr lr, [sp,
379 add sp, sp,
380 subs pc, lr,
381 .endm
382
383 .macro get_bad_stack
384 ldr r13, _armboot_start @ setup our mode stack
385 sub r13, r13,
386 sub r13, r13,
387
388 str lr, [r13] @ save caller lr / spsr
389 mrs lr, spsr
390 str lr, [r13,
391
392 mov r13,
393 msr spsr_c, r13
394 mov lr, pc
395 movs pc, lr
396 .endm
397
398 .macro get_irq_stack @ setup IRQ stack
399 ldr sp, IRQ_STACK_START
400 .endm
401
402 .macro get_fiq_stack @ setup FIQ stack
403 ldr sp, FIQ_STACK_START
404 .endm
405
406
407
408
409
410
411
412
413 .align 5
414undefined_instruction:
415 get_bad_stack
416 bad_save_user_regs
417 bl do_undefined_instruction
418
419 .align 5
420software_interrupt:
421 get_bad_stack
422 bad_save_user_regs
423 bl do_software_interrupt
424
425 .align 5
426prefetch_abort:
427 get_bad_stack
428 bad_save_user_regs
429 bl do_prefetch_abort
430
431 .align 5
432data_abort:
433 get_bad_stack
434 bad_save_user_regs
435 bl do_data_abort
436
437 .align 5
438not_used:
439 get_bad_stack
440 bad_save_user_regs
441 bl do_not_used
442
443#ifdef CONFIG_USE_IRQ
444
445 .align 5
446irq:
447 get_irq_stack
448 irq_save_user_regs
449 bl do_irq
450 irq_restore_user_regs
451
452 .align 5
453fiq:
454 get_fiq_stack
455 irq_save_user_regs
456 bl do_fiq
457 irq_restore_user_regs
458
459#else
460
461 .align 5
462irq:
463 get_bad_stack
464 bad_save_user_regs
465 bl do_irq
466
467 .align 5
468fiq:
469 get_bad_stack
470 bad_save_user_regs
471 bl do_fiq
472
473#endif
474
475
476
477
478
479
480
481 .align 5
482.globl reset_cpu
483
484reset_cpu:
485 ldr r1, =0x482e
486 ldr r2, =IXP425_OSWK
487 str r1, [r2]
488 ldr r1, =0x0fff
489 ldr r2, =IXP425_OSWT
490 str r1, [r2]
491 ldr r1, =0x5
492 ldr r2, =IXP425_OSWE
493 str r1, [r2]
494 b reset_endless
495
496
497reset_endless:
498
499 b reset_endless
500
501#ifdef CONFIG_USE_IRQ
502
503.LC0: .word loops_per_jiffy
504
505
506
507
508.globl udelay
509udelay:
510 mov r2,
511 orr r2, r2,
512 mul r0, r2, r0
513 ldr r2, .LC0
514 ldr r2, [r2] @ max = 0x0fffffff
515 mov r0, r0, lsr
516 mov r2, r2, lsr
517 mul r0, r2, r0 @ max = 2^32-1
518 movs r0, r0, lsr
519
520delay_loop:
521 subs r0, r0,
522 bne delay_loop
523 mov pc, lr
524
525#endif
526