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#include <config.h>
28#include <version.h>
29#include <asm/hardware.h>
30
31
32
33
34
35
36
37
38
39
40.globl _start
41_start: b reset
42 ldr pc, _undefined_instruction
43 ldr pc, _software_interrupt
44 ldr pc, _prefetch_abort
45 ldr pc, _data_abort
46#ifdef CONFIG_LPC2292
47 .word 0xB4405F76
48#else
49 ldr pc, _not_used
50#endif
51 ldr pc, _irq
52 ldr pc, _fiq
53
54_undefined_instruction: .word undefined_instruction
55_software_interrupt: .word software_interrupt
56_prefetch_abort: .word prefetch_abort
57_data_abort: .word data_abort
58_not_used: .word not_used
59_irq: .word irq
60_fiq: .word fiq
61
62 .balignl 16,0xdeadbeef
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78_TEXT_BASE:
79 .word TEXT_BASE
80
81.globl _armboot_start
82_armboot_start:
83 .word _start
84
85
86
87
88.globl _bss_start
89_bss_start:
90 .word __bss_start
91
92.globl _bss_end
93_bss_end:
94 .word _end
95
96#ifdef CONFIG_USE_IRQ
97
98.globl IRQ_STACK_START
99IRQ_STACK_START:
100 .word 0x0badc0de
101
102
103.globl FIQ_STACK_START
104FIQ_STACK_START:
105 .word 0x0badc0de
106#endif
107
108
109
110
111
112
113reset:
114
115
116
117 mrs r0,cpsr
118 bic r0,r0,
119 orr r0,r0,
120 msr cpsr,r0
121
122
123
124
125
126#ifndef CONFIG_SKIP_LOWLEVEL_INIT
127 bl cpu_init_crit
128#endif
129
130#ifdef CONFIG_LPC2292
131 bl lowlevel_init
132#endif
133
134#ifndef CONFIG_SKIP_RELOCATE_UBOOT
135relocate:
136 adr r0, _start
137 ldr r1, _TEXT_BASE
138 cmp r0, r1
139 beq stack_setup
140
141
142#ifndef CONFIG_LPC2292
143 ldr r2, =0x0
144 cmp r1, r2
145 ldmneia r0!, {r3-r10}
146 stmneia r2!, {r3-r10}
147 ldmneia r0, {r3-r9}
148 stmneia r2, {r3-r9}
149 adrne r0, _start
150#endif
151#endif
152
153 ldr r2, _armboot_start
154 ldr r3, _bss_start
155 sub r2, r3, r2
156 add r2, r0, r2
157
158copy_loop:
159 ldmia r0!, {r3-r10}
160 stmia r1!, {r3-r10}
161 cmp r0, r2
162 ble copy_loop
163
164#endif
165
166
167stack_setup:
168 ldr r0, _TEXT_BASE
169 sub r0, r0,
170 sub r0, r0,
171#ifdef CONFIG_USE_IRQ
172 sub r0, r0,
173#endif
174 sub sp, r0,
175
176clear_bss:
177 ldr r0, _bss_start
178 ldr r1, _bss_end
179 mov r2,
180
181clbss_l:str r2, [r0]
182 add r0, r0,
183 cmp r0, r1
184 ble clbss_l
185
186 ldr pc, _start_armboot
187
188_start_armboot: .word start_armboot
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204INTMR1: .word 0x80000280 @ 32 bit size
205INTMR2: .word 0x80001280 @ 16 bit size
206INTMR3: .word 0x80002280 @ 8 bit size
207
208
209SYSCON1: .word 0x80000100
210SYSCON2: .word 0x80001100
211SYSCON3: .word 0x80002200
212
213#define CLKCTL 0x6
214#define CLKCTL_18 0x0
215#define CLKCTL_36 0x2
216#define CLKCTL_49 0x4
217#define CLKCTL_73 0x6
218
219
220PLLCFG_ADR: .word PLLCFG
221PLLFEED_ADR: .word PLLFEED
222PLLCON_ADR: .word PLLCON
223PLLSTAT_ADR: .word PLLSTAT
224VPBDIV_ADR: .word VPBDIV
225MEMMAP_ADR: .word MEMMAP
226
227#endif
228
229cpu_init_crit:
230
231
232
233
234
235 mov r1,
236 ldr r0, INTMR1
237 str r1, [r0]
238 ldr r0, INTMR2
239 str r1, [r0]
240 ldr r0, INTMR3
241 str r1, [r0]
242
243
244
245
246 mov r0,
247 mcr p15, 0, r0, c7, c7, 0
248 mcr p15, 0, r0, c8, c7, 0
249
250
251
252
253 mrc p15,0,r0,c1,c0
254 bic r0, r0,
255 bic r0, r0,
256 orr r0, r0,
257 mcr p15,0,r0,c1,c0
258
259
260
261
262 ldr r0, =NETARM_GEN_MODULE_BASE
263 ldr r1, =(NETARM_GEN_PORT_MODE(0x10) | \
264 NETARM_GEN_PORT_DIR(0x10))
265 str r1, [r0,
266
267
268
269
270 ldr r0, =NETARM_GEN_MODULE_BASE
271 ldr r1, =NETARM_GEN_SW_SVC_RESETA
272 str r1, [r0,
273 ldr r1, =NETARM_GEN_SW_SVC_RESETB
274 str r1, [r0,
275 ldr r1, =NETARM_GEN_SW_SVC_RESETA
276 str r1, [r0,
277 ldr r1, =NETARM_GEN_SW_SVC_RESETB
278 str r1, [r0,
279
280
281
282 ldr r0, =NETARM_GEN_MODULE_BASE
283
284 ldr r1, =( NETARM_GEN_SYS_CFG_LENDIAN | \
285 NETARM_GEN_SYS_CFG_BUSFULL | \
286 NETARM_GEN_SYS_CFG_USER_EN | \
287 NETARM_GEN_SYS_CFG_ALIGN_ABORT | \
288 NETARM_GEN_SYS_CFG_BUSARB_INT | \
289 NETARM_GEN_SYS_CFG_BUSMON_EN )
290
291 str r1, [r0,
292
293#ifndef CONFIG_NETARM_PLL_BYPASS
294 ldr r1, =( NETARM_GEN_PLL_CTL_PLLCNT(NETARM_PLL_COUNT_VAL) | \
295 NETARM_GEN_PLL_CTL_POLTST_DEF | \
296 NETARM_GEN_PLL_CTL_INDIV(1) | \
297 NETARM_GEN_PLL_CTL_ICP_DEF | \
298 NETARM_GEN_PLL_CTL_OUTDIV(2) )
299 str r1, [r0,
300#endif
301
302
303
304
305 mov r1,
306 ldr r0, =NETARM_GEN_MODULE_BASE
307 str r1, [r0,
308
309
310
311
312
313
314 ldr r1, =REG_INTMASK
315 ldr r0, =0x3FFFFF
316 str r0, [r1]
317
318
319
320
321 ldr r0, =REG_SYSCFG
322 ldr r1, =0x83ffffa0
323 str r1, [r0]
324
325
326
327
328
329 mov r3,
330 mov r4,
331
332 ldr r0, PLLCON_ADR
333 mov r1,
334 str r1, [r0]
335 ldr r0, PLLFEED_ADR
336 str r3, [r0]
337 str r4, [r0]
338
339 ldr r0, PLLCFG_ADR
340 mov r1,
341 str r1, [r0]
342 ldr r0, PLLFEED_ADR
343 str r3, [r0]
344 str r4, [r0]
345
346 ldr r0, PLLCON_ADR
347 mov r1,
348 str r1, [r0]
349 ldr r0, PLLFEED_ADR
350 str r3, [r0]
351 str r4, [r0]
352
353 ldr r0, PLLSTAT_ADR
354 mov r1,
355lock_loop:
356 ldr r2, [r0]
357 and r2, r1, r2
358 cmp r2,
359 beq lock_loop
360
361 ldr r0, PLLCON_ADR
362 mov r1,
363 str r1, [r0]
364 ldr r0, PLLFEED_ADR
365 str r3, [r0]
366 str r4, [r0]
367
368 ldr r0, VPBDIV_ADR
369 mov r1,
370 str r1, [r0]
371#else
372
373#endif
374
375#ifdef CONFIG_ARM7_REVD
376
377
378
379 ldr r0, SYSCON3
380 ldr r1, [r0]
381 bic r1, r1,
382 orr r1, r1,
383 str r1, [r0]
384#endif
385
386#ifndef CONFIG_LPC2292
387 mov ip, lr
388
389
390
391
392
393 bl lowlevel_init
394 mov lr, ip
395#endif
396
397 mov pc, lr
398
399
400
401
402
403
404
405
406
407
408@
409@ IRQ stack frame.
410@
411#define S_FRAME_SIZE 72
412
413#define S_OLD_R0 68
414#define S_PSR 64
415#define S_PC 60
416#define S_LR 56
417#define S_SP 52
418
419#define S_IP 48
420#define S_FP 44
421#define S_R10 40
422#define S_R9 36
423#define S_R8 32
424#define S_R7 28
425#define S_R6 24
426#define S_R5 20
427#define S_R4 16
428#define S_R3 12
429#define S_R2 8
430#define S_R1 4
431#define S_R0 0
432
433#define MODE_SVC 0x13
434#define I_BIT 0x80
435
436
437
438
439
440
441 .macro bad_save_user_regs
442 sub sp, sp,
443 stmia sp, {r0 - r12} @ Calling r0-r12
444 add r8, sp,
445
446 ldr r2, _armboot_start
447 sub r2, r2,
448 sub r2, r2,
449 ldmia r2, {r2 - r4} @ get pc, cpsr, old_r0
450 add r0, sp,
451
452 add r5, sp,
453 mov r1, lr
454 stmia r5, {r0 - r4} @ save sp_SVC, lr_SVC, pc, cpsr, old_r
455 mov r0, sp
456 .endm
457
458 .macro irq_save_user_regs
459 sub sp, sp,
460 stmia sp, {r0 - r12} @ Calling r0-r12
461 add r8, sp,
462 stmdb r8, {sp, lr}^ @ Calling SP, LR
463 str lr, [r8,
464 mrs r6, spsr
465 str r6, [r8,
466 str r0, [r8,
467 mov r0, sp
468 .endm
469
470 .macro irq_restore_user_regs
471 ldmia sp, {r0 - lr}^ @ Calling r0 - lr
472 mov r0, r0
473 ldr lr, [sp,
474 add sp, sp,
475 subs pc, lr,
476 .endm
477
478 .macro get_bad_stack
479 ldr r13, _armboot_start @ setup our mode stack
480 sub r13, r13,
481 sub r13, r13,
482
483 str lr, [r13] @ save caller lr / spsr
484 mrs lr, spsr
485 str lr, [r13,
486
487 mov r13,
488 msr spsr_c, r13
489 mov lr, pc
490 movs pc, lr
491 .endm
492
493 .macro get_irq_stack @ setup IRQ stack
494 ldr sp, IRQ_STACK_START
495 .endm
496
497 .macro get_fiq_stack @ setup FIQ stack
498 ldr sp, FIQ_STACK_START
499 .endm
500
501
502
503
504 .align 5
505undefined_instruction:
506 get_bad_stack
507 bad_save_user_regs
508 bl do_undefined_instruction
509
510 .align 5
511software_interrupt:
512 get_bad_stack
513 bad_save_user_regs
514 bl do_software_interrupt
515
516 .align 5
517prefetch_abort:
518 get_bad_stack
519 bad_save_user_regs
520 bl do_prefetch_abort
521
522 .align 5
523data_abort:
524 get_bad_stack
525 bad_save_user_regs
526 bl do_data_abort
527
528 .align 5
529not_used:
530 get_bad_stack
531 bad_save_user_regs
532 bl do_not_used
533
534#ifdef CONFIG_USE_IRQ
535
536 .align 5
537irq:
538 get_irq_stack
539 irq_save_user_regs
540 bl do_irq
541 irq_restore_user_regs
542
543 .align 5
544fiq:
545 get_fiq_stack
546
547 irq_save_user_regs
548 bl do_fiq
549 irq_restore_user_regs
550
551#else
552
553 .align 5
554irq:
555 get_bad_stack
556 bad_save_user_regs
557 bl do_irq
558
559 .align 5
560fiq:
561 get_bad_stack
562 bad_save_user_regs
563 bl do_fiq
564
565#endif
566
567
568 .align 5
569.globl reset_cpu
570reset_cpu:
571 mov ip,
572 mcr p15, 0, ip, c7, c7, 0 @ invalidate cache
573 mcr p15, 0, ip, c8, c7, 0 @ flush TLB (v4)
574 mrc p15, 0, ip, c1, c0, 0 @ get ctrl register
575 bic ip, ip,
576 bic ip, ip,
577 mcr p15, 0, ip, c1, c0, 0 @ ctrl register
578 mov pc, r0
579
580 .align 5
581.globl reset_cpu
582reset_cpu:
583 ldr r1, =NETARM_MEM_MODULE_BASE
584 ldr r0, [r1,
585 ldr r1, =0xFFFFF000
586 and r0, r1, r0
587 ldr r1, =(relocate-TEXT_BASE)
588 add r0, r1, r0
589 ldr r4, =NETARM_GEN_MODULE_BASE
590 ldr r1, =NETARM_GEN_SW_SVC_RESETA
591 str r1, [r4,
592 ldr r1, =NETARM_GEN_SW_SVC_RESETB
593 str r1, [r4,
594 ldr r1, =NETARM_GEN_SW_SVC_RESETA
595 str r1, [r4,
596 ldr r1, =NETARM_GEN_SW_SVC_RESETB
597 str r1, [r4,
598 mov pc, r0
599
600
601
602
603
604
605 .align 5
606.globl reset_cpu
607reset_cpu:
608 mov pc, r0
609#else
610
611#endif
612