1
2
3
4
5
6
7
8
9
10
11
12
13#include <asm-offsets.h>
14#include <config.h>
15#include <mpc83xx.h>
16#include <version.h>
17
18#define CONFIG_83XX 1
19
20#include <ppc_asm.tmpl>
21#include <ppc_defs.h>
22
23#include <asm/cache.h>
24#include <asm/mmu.h>
25#include <asm/u-boot.h>
26
27
28
29#undef MSR_KERNEL
30
31
32
33
34#ifdef DEBUG
35#define MSR_KERNEL (MSR_FP|MSR_RI)
36#else
37#define MSR_KERNEL (MSR_FP|MSR_ME|MSR_RI)
38#endif
39
40
41 (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_INIT_MINIMAL))
42#define MINIMAL_SPL
43#endif
44
45
46 !defined(CONFIG_SYS_RAMBOOT)
47#define CONFIG_SYS_FLASHBOOT
48#endif
49
50
51
52
53
54
55 START_GOT
56 GOT_ENTRY(_GOT2_TABLE_)
57 GOT_ENTRY(__bss_start)
58 GOT_ENTRY(__bss_end)
59
60#ifndef MINIMAL_SPL
61 GOT_ENTRY(_FIXUP_TABLE_)
62 GOT_ENTRY(_start)
63 GOT_ENTRY(_start_of_vectors)
64 GOT_ENTRY(_end_of_vectors)
65 GOT_ENTRY(transfer_to_handler)
66#endif
67 END_GOT
68
69
70
71
72
73
74
75 .text
76#define _HRCW_TABLE_ENTRY(w) \
77 .fill 8,1,(((w)>>24)&0xff); \
78 .fill 8,1,(((w)>>16)&0xff); \
79 .fill 8,1,(((w)>> 8)&0xff); \
80 .fill 8,1,(((w) )&0xff)
81
82 _HRCW_TABLE_ENTRY(CONFIG_SYS_HRCW_LOW)
83 _HRCW_TABLE_ENTRY(CONFIG_SYS_HRCW_HIGH)
84
85
86
87
88
89 .long 0x27051956
90
91 .globl version_string
92version_string:
93 .ascii U_BOOT_VERSION_STRING, "\0"
94
95 .align 2
96
97 .globl enable_addr_trans
98enable_addr_trans:
99
100 mfmsr r5
101 ori r5, r5, (MSR_IR | MSR_DR)
102 mtmsr r5
103 isync
104 blr
105
106 .globl disable_addr_trans
107disable_addr_trans:
108
109 mflr r4
110 mfmsr r3
111 andi. r0, r3, (MSR_IR | MSR_DR)
112 beqlr
113 andc r3, r3, r0
114 mtspr SRR0, r4
115 mtspr SRR1, r3
116 rfi
117
118 .globl ppcDWstore
119ppcDWstore:
120 lfd 1, 0(r4)
121 stfd 1, 0(r3)
122 blr
123
124 .globl ppcDWload
125ppcDWload:
126 lfd 1, 0(r3)
127 stfd 1, 0(r4)
128 blr
129
130#ifndef CONFIG_DEFAULT_IMMR
131
132#endif
133#ifndef CONFIG_SYS_IMMR
134#define CONFIG_SYS_IMMR CONFIG_DEFAULT_IMMR
135#endif
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 . = EXC_OFF_SYS_RESET
161
162 .globl _start
163_start:
164 lis r4, CONFIG_DEFAULT_IMMR@h
165 nop
166
167 mfmsr r5
168
169
170 bl 1f
1711: mflr r7
172
173 lis r3, CONFIG_SYS_IMMR@h
174 ori r3, r3, CONFIG_SYS_IMMR@l
175
176 lwz r6, IMMRBAR(r4)
177 isync
178
179 stw r3, IMMRBAR(r4)
180 lwz r6, 0(r7)
181 isync
182
183 lwz r6, IMMRBAR(r3)
184 isync
185
186
187
188
189
190 defined(CONFIG_NAND_SPL)
191
192
193
194
1951: lwz r6, 0x50b0(r3)
196 andi. r6, r6, 1
197 beq 1b
198#endif
199
200 bl init_e300_core
201
202#ifdef CONFIG_SYS_FLASHBOOT
203
204
205
206
207
208 bl map_flash_by_law1
209 lis r4, (CONFIG_SYS_MONITOR_BASE)@h
210 ori r4, r4, (CONFIG_SYS_MONITOR_BASE)@l
211 addi r5, r4, in_flash - _start + EXC_OFF_SYS_RESET
212 mtlr r5
213 blr
214in_flash:
215
216 bl remap_flash_by_law0
217#endif
218#endif
219
220
221 bl setup_bats
222 sync
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238 bl enable_addr_trans
239 sync
240
241
242 bl dcache_enable
243 sync
244#ifdef CONFIG_SYS_INIT_RAM_LOCK
245 bl lock_ram_in_cache
246 sync
247#endif
248
249
250
251
252 lis r3, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET)@h
253 ori r3, r3, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET)@l
254
255
256 addi r4, r3, GENERATED_GBL_DATA_SIZE
257
258
259 li r0, 0
2601:
261 subi r4, r4, 1
262 stb r0, 0(r4)
263 cmplw r3, r4
264 bne 1b
265
266
267
268
269
270#endif
271
272
273 subi r3, r3, CONFIG_VAL(SYS_MALLOC_F_LEN)
274
275
276 stw r3, GD_MALLOC_BASE(r4)
277#endif
278 li r0, 0
279 stwu r0, -4(r3)
280 stwu r0, -4(r3)
281
282
283 mr r1, r3
284
285
286
287
288
289
290 GET_GOT
291
292
293 lis r3, CONFIG_SYS_IMMR@h
294
295 bl cpu_init_f
296
297
298 li r3, 0
299 bl board_init_f
300
301
302
303#ifndef MINIMAL_SPL
304
305
306
307
308 .globl _start_of_vectors
309_start_of_vectors:
310
311
312 STD_EXCEPTION(0x200, MachineCheck, MachineCheckException)
313
314
315 STD_EXCEPTION(0x300, DataStorage, UnknownException)
316
317
318 STD_EXCEPTION(0x400, InstStorage, UnknownException)
319
320
321#ifndef FIXME
322 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
323#endif
324
325
326 . = 0x600
327Alignment:
328 EXCEPTION_PROLOG(SRR0, SRR1)
329 mfspr r4,DAR
330 stw r4,_DAR(r21)
331 mfspr r5,DSISR
332 stw r5,_DSISR(r21)
333 addi r3,r1,STACK_FRAME_OVERHEAD
334 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
335
336
337 . = 0x700
338ProgramCheck:
339 EXCEPTION_PROLOG(SRR0, SRR1)
340 addi r3,r1,STACK_FRAME_OVERHEAD
341 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
342 MSR_KERNEL, COPY_EE)
343
344 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
345
346
347
348
349 STD_EXCEPTION(0x900, Decrementer, timer_interrupt)
350
351 STD_EXCEPTION(0xa00, Trap_0a, UnknownException)
352 STD_EXCEPTION(0xb00, Trap_0b, UnknownException)
353 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
354 STD_EXCEPTION(0xd00, SingleStep, UnknownException)
355
356 STD_EXCEPTION(0xe00, Trap_0e, UnknownException)
357 STD_EXCEPTION(0xf00, Trap_0f, UnknownException)
358
359 STD_EXCEPTION(0x1000, InstructionTLBMiss, UnknownException)
360 STD_EXCEPTION(0x1100, DataLoadTLBMiss, UnknownException)
361 STD_EXCEPTION(0x1200, DataStoreTLBMiss, UnknownException)
362#ifdef DEBUG
363 . = 0x1300
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
3811: b 1b
382#else
383 STD_EXCEPTION(0x1300, InstructionBreakpoint, DebugException)
384#endif
385 STD_EXCEPTION(0x1400, SMI, UnknownException)
386
387 STD_EXCEPTION(0x1500, Trap_15, UnknownException)
388 STD_EXCEPTION(0x1600, Trap_16, UnknownException)
389 STD_EXCEPTION(0x1700, Trap_17, UnknownException)
390 STD_EXCEPTION(0x1800, Trap_18, UnknownException)
391 STD_EXCEPTION(0x1900, Trap_19, UnknownException)
392 STD_EXCEPTION(0x1a00, Trap_1a, UnknownException)
393 STD_EXCEPTION(0x1b00, Trap_1b, UnknownException)
394 STD_EXCEPTION(0x1c00, Trap_1c, UnknownException)
395 STD_EXCEPTION(0x1d00, Trap_1d, UnknownException)
396 STD_EXCEPTION(0x1e00, Trap_1e, UnknownException)
397 STD_EXCEPTION(0x1f00, Trap_1f, UnknownException)
398 STD_EXCEPTION(0x2000, Trap_20, UnknownException)
399 STD_EXCEPTION(0x2100, Trap_21, UnknownException)
400 STD_EXCEPTION(0x2200, Trap_22, UnknownException)
401 STD_EXCEPTION(0x2300, Trap_23, UnknownException)
402 STD_EXCEPTION(0x2400, Trap_24, UnknownException)
403 STD_EXCEPTION(0x2500, Trap_25, UnknownException)
404 STD_EXCEPTION(0x2600, Trap_26, UnknownException)
405 STD_EXCEPTION(0x2700, Trap_27, UnknownException)
406 STD_EXCEPTION(0x2800, Trap_28, UnknownException)
407 STD_EXCEPTION(0x2900, Trap_29, UnknownException)
408 STD_EXCEPTION(0x2a00, Trap_2a, UnknownException)
409 STD_EXCEPTION(0x2b00, Trap_2b, UnknownException)
410 STD_EXCEPTION(0x2c00, Trap_2c, UnknownException)
411 STD_EXCEPTION(0x2d00, Trap_2d, UnknownException)
412 STD_EXCEPTION(0x2e00, Trap_2e, UnknownException)
413 STD_EXCEPTION(0x2f00, Trap_2f, UnknownException)
414
415
416 .globl _end_of_vectors
417_end_of_vectors:
418
419 . = 0x3000
420
421
422
423
424
425
426 .globl transfer_to_handler
427transfer_to_handler:
428 stw r22,_NIP(r21)
429 lis r22,MSR_POW@h
430 andc r23,r23,r22
431 stw r23,_MSR(r21)
432 SAVE_GPR(7, r21)
433 SAVE_4GPRS(8, r21)
434 SAVE_8GPRS(12, r21)
435 SAVE_8GPRS(24, r21)
436 mflr r23
437 andi. r24,r23,0x3f00
438 stw r24,TRAP(r21)
439 li r22,0
440 stw r22,RESULT(r21)
441 lwz r24,0(r23)
442 lwz r23,4(r23)
443 mtspr SRR0,r24
444 mtspr SRR1,r20
445 mtlr r23
446 SYNC
447 rfi
448
449int_return:
450 mfmsr r28
451 li r4,0
452 ori r4,r4,MSR_EE
453 andc r28,r28,r4
454 SYNC
455 mtmsr r28
456 SYNC
457 lwz r2,_CTR(r1)
458 lwz r0,_LINK(r1)
459 mtctr r2
460 mtlr r0
461 lwz r2,_XER(r1)
462 lwz r0,_CCR(r1)
463 mtspr XER,r2
464 mtcrf 0xFF,r0
465 REST_10GPRS(3, r1)
466 REST_10GPRS(13, r1)
467 REST_8GPRS(23, r1)
468 REST_GPR(31, r1)
469 lwz r2,_NIP(r1)
470 lwz r0,_MSR(r1)
471 mtspr SRR0,r2
472 mtspr SRR1,r0
473 lwz r0,GPR0(r1)
474 lwz r2,GPR2(r1)
475 lwz r1,GPR1(r1)
476 SYNC
477 rfi
478#endif
479
480
481
482
483
484
485 .globl init_e300_core
486init_e300_core:
487
488
489
490 li r3, MSR_KERNEL
491 rlwimi r3, r5, 0, 25, 25
492#ifdef DEBUG
493 rlwimi r3, r5, 0, 21, 22
494#endif
495 SYNC
496 mtmsr r3
497 SYNC
498 mtspr SRR1, r3
499
500
501 lis r3, CONFIG_SYS_IMMR@h
502
503
504
505 lis r4, CONFIG_SYS_WATCHDOG_VALUE
506 ori r4, r4, (SWCRR_SWEN | SWCRR_SWRI | SWCRR_SWPR)
507 stw r4, SWCRR(r3)
508
509
510
511 li r4, 0x556C
512 sth r4, SWSRR@l(r3)
513 li r4, -0x55C7
514 sth r4, SWSRR@l(r3)
515#else
516
517
518 lwz r4, SWCRR(r3)
519
520
521 andi. r4, r4, 0x4
522 beq 1f
523 xor r4, r4, r4
524 stw r4, SWCRR(r3)
5251:
526#endif
527
528
529
530
531
532
533
534 lwz r4, 0x0808(r3)
535 rlwinm r0, r4, 0, ~AER_AO
536 stw r0, 0x0808(r3)
537#endif
538
539
540
541
542
543
544 lis r3, CONFIG_SYS_HID0_INIT@h
545 ori r3, r3, (CONFIG_SYS_HID0_INIT | HID0_ICFI | HID0_DCFI)@l
546 SYNC
547 mtspr HID0, r3
548
549 lis r3, CONFIG_SYS_HID0_FINAL@h
550 ori r3, r3, (CONFIG_SYS_HID0_FINAL & ~(HID0_ICFI | HID0_DCFI))@l
551 SYNC
552 mtspr HID0, r3
553
554 lis r3, CONFIG_SYS_HID2@h
555 ori r3, r3, CONFIG_SYS_HID2@l
556 SYNC
557 mtspr HID2, r3
558
559
560
561 blr
562
563
564 .globl setup_bats
565setup_bats:
566 addis r0, r0, 0x0000
567
568
569 addis r4, r0, CONFIG_SYS_IBAT0L@h
570 ori r4, r4, CONFIG_SYS_IBAT0L@l
571 addis r3, r0, CONFIG_SYS_IBAT0U@h
572 ori r3, r3, CONFIG_SYS_IBAT0U@l
573 mtspr IBAT0L, r4
574 mtspr IBAT0U, r3
575
576
577 addis r4, r0, CONFIG_SYS_DBAT0L@h
578 ori r4, r4, CONFIG_SYS_DBAT0L@l
579 addis r3, r0, CONFIG_SYS_DBAT0U@h
580 ori r3, r3, CONFIG_SYS_DBAT0U@l
581 mtspr DBAT0L, r4
582 mtspr DBAT0U, r3
583
584
585 addis r4, r0, CONFIG_SYS_IBAT1L@h
586 ori r4, r4, CONFIG_SYS_IBAT1L@l
587 addis r3, r0, CONFIG_SYS_IBAT1U@h
588 ori r3, r3, CONFIG_SYS_IBAT1U@l
589 mtspr IBAT1L, r4
590 mtspr IBAT1U, r3
591
592
593 addis r4, r0, CONFIG_SYS_DBAT1L@h
594 ori r4, r4, CONFIG_SYS_DBAT1L@l
595 addis r3, r0, CONFIG_SYS_DBAT1U@h
596 ori r3, r3, CONFIG_SYS_DBAT1U@l
597 mtspr DBAT1L, r4
598 mtspr DBAT1U, r3
599
600
601 addis r4, r0, CONFIG_SYS_IBAT2L@h
602 ori r4, r4, CONFIG_SYS_IBAT2L@l
603 addis r3, r0, CONFIG_SYS_IBAT2U@h
604 ori r3, r3, CONFIG_SYS_IBAT2U@l
605 mtspr IBAT2L, r4
606 mtspr IBAT2U, r3
607
608
609 addis r4, r0, CONFIG_SYS_DBAT2L@h
610 ori r4, r4, CONFIG_SYS_DBAT2L@l
611 addis r3, r0, CONFIG_SYS_DBAT2U@h
612 ori r3, r3, CONFIG_SYS_DBAT2U@l
613 mtspr DBAT2L, r4
614 mtspr DBAT2U, r3
615
616
617 addis r4, r0, CONFIG_SYS_IBAT3L@h
618 ori r4, r4, CONFIG_SYS_IBAT3L@l
619 addis r3, r0, CONFIG_SYS_IBAT3U@h
620 ori r3, r3, CONFIG_SYS_IBAT3U@l
621 mtspr IBAT3L, r4
622 mtspr IBAT3U, r3
623
624
625 addis r4, r0, CONFIG_SYS_DBAT3L@h
626 ori r4, r4, CONFIG_SYS_DBAT3L@l
627 addis r3, r0, CONFIG_SYS_DBAT3U@h
628 ori r3, r3, CONFIG_SYS_DBAT3U@l
629 mtspr DBAT3L, r4
630 mtspr DBAT3U, r3
631
632#ifdef CONFIG_HIGH_BATS
633
634 addis r4, r0, CONFIG_SYS_IBAT4L@h
635 ori r4, r4, CONFIG_SYS_IBAT4L@l
636 addis r3, r0, CONFIG_SYS_IBAT4U@h
637 ori r3, r3, CONFIG_SYS_IBAT4U@l
638 mtspr IBAT4L, r4
639 mtspr IBAT4U, r3
640
641
642 addis r4, r0, CONFIG_SYS_DBAT4L@h
643 ori r4, r4, CONFIG_SYS_DBAT4L@l
644 addis r3, r0, CONFIG_SYS_DBAT4U@h
645 ori r3, r3, CONFIG_SYS_DBAT4U@l
646 mtspr DBAT4L, r4
647 mtspr DBAT4U, r3
648
649
650 addis r4, r0, CONFIG_SYS_IBAT5L@h
651 ori r4, r4, CONFIG_SYS_IBAT5L@l
652 addis r3, r0, CONFIG_SYS_IBAT5U@h
653 ori r3, r3, CONFIG_SYS_IBAT5U@l
654 mtspr IBAT5L, r4
655 mtspr IBAT5U, r3
656
657
658 addis r4, r0, CONFIG_SYS_DBAT5L@h
659 ori r4, r4, CONFIG_SYS_DBAT5L@l
660 addis r3, r0, CONFIG_SYS_DBAT5U@h
661 ori r3, r3, CONFIG_SYS_DBAT5U@l
662 mtspr DBAT5L, r4
663 mtspr DBAT5U, r3
664
665
666 addis r4, r0, CONFIG_SYS_IBAT6L@h
667 ori r4, r4, CONFIG_SYS_IBAT6L@l
668 addis r3, r0, CONFIG_SYS_IBAT6U@h
669 ori r3, r3, CONFIG_SYS_IBAT6U@l
670 mtspr IBAT6L, r4
671 mtspr IBAT6U, r3
672
673
674 addis r4, r0, CONFIG_SYS_DBAT6L@h
675 ori r4, r4, CONFIG_SYS_DBAT6L@l
676 addis r3, r0, CONFIG_SYS_DBAT6U@h
677 ori r3, r3, CONFIG_SYS_DBAT6U@l
678 mtspr DBAT6L, r4
679 mtspr DBAT6U, r3
680
681
682 addis r4, r0, CONFIG_SYS_IBAT7L@h
683 ori r4, r4, CONFIG_SYS_IBAT7L@l
684 addis r3, r0, CONFIG_SYS_IBAT7U@h
685 ori r3, r3, CONFIG_SYS_IBAT7U@l
686 mtspr IBAT7L, r4
687 mtspr IBAT7U, r3
688
689
690 addis r4, r0, CONFIG_SYS_DBAT7L@h
691 ori r4, r4, CONFIG_SYS_DBAT7L@l
692 addis r3, r0, CONFIG_SYS_DBAT7U@h
693 ori r3, r3, CONFIG_SYS_DBAT7U@l
694 mtspr DBAT7L, r4
695 mtspr DBAT7U, r3
696#endif
697
698 isync
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719 lis r3, 0
720 lis r5, 2
721
7221:
723 tlbie r3
724 addi r3, r3, 0x1000
725 cmp 0, 0, r3, r5
726 blt 1b
727
728 blr
729
730
731
732
733
734
735#ifndef MINIMAL_SPL
736 .globl icache_enable
737icache_enable:
738 mfspr r3, HID0
739 ori r3, r3, HID0_ICE
740 li r4, HID0_ICFI|HID0_ILOCK
741 andc r3, r3, r4
742 ori r4, r3, HID0_ICFI
743 isync
744 mtspr HID0, r4
745 isync
746 mtspr HID0, r3
747 blr
748
749 .globl icache_disable
750icache_disable:
751 mfspr r3, HID0
752 lis r4, 0
753 ori r4, r4, HID0_ICE|HID0_ICFI|HID0_ILOCK
754 andc r3, r3, r4
755 isync
756 mtspr HID0, r3
757 blr
758
759 .globl icache_status
760icache_status:
761 mfspr r3, HID0
762 rlwinm r3, r3, (31 - HID0_ICE_SHIFT + 1), 31, 31
763 blr
764#endif
765
766 .globl dcache_enable
767dcache_enable:
768 mfspr r3, HID0
769 li r5, HID0_DCFI|HID0_DLOCK
770 andc r3, r3, r5
771 ori r3, r3, HID0_DCE
772 sync
773 mtspr HID0, r3
774 blr
775
776 .globl dcache_disable
777dcache_disable:
778 mflr r4
779 bl flush_dcache
780 mfspr r3, HID0
781 li r5, HID0_DCE|HID0_DLOCK
782 andc r3, r3, r5
783 ori r5, r3, HID0_DCFI
784 sync
785 mtspr HID0, r5
786 sync
787 mtspr HID0, r3
788 mtlr r4
789 blr
790
791 .globl dcache_status
792dcache_status:
793 mfspr r3, HID0
794 rlwinm r3, r3, (31 - HID0_DCE_SHIFT + 1), 31, 31
795 blr
796
797 .globl flush_dcache
798flush_dcache:
799 lis r3, 0
800 lis r5, CONFIG_SYS_CACHELINE_SIZE
8011: cmp 0, 1, r3, r5
802 bge 2f
803 lwz r5, 0(r3)
804 lis r5, CONFIG_SYS_CACHELINE_SIZE
805 addi r3, r3, 0x4
806 b 1b
8072: blr
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822 .globl relocate_code
823relocate_code:
824 mr r1, r3
825 mr r9, r4
826 mr r10, r5
827
828 GET_GOT
829 mr r3, r5
830 lis r4, CONFIG_SYS_MONITOR_BASE@h
831 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
832 lwz r5, GOT(__bss_start)
833 sub r5, r5, r4
834 li r6, CONFIG_SYS_CACHELINE_SIZE
835
836
837
838
839
840
841
842
843
844 sub r15, r10, r4
845
846
847 add r12, r12, r15
848
849 add r30, r30, r15
850
851
852
853
854
855 cmplw cr1,r3,r4
856 addi r0,r5,3
857 srwi. r0,r0,2
858 beq cr1,4f
859 beq 7f
860 mtctr r0
861 bge cr1,2f
862 la r8,-4(r4)
863 la r7,-4(r3)
864
865
8661: lwzu r0,4(r8)
867 stwu r0,4(r7)
868 bdnz 1b
869
870 addi r0,r5,3
871 srwi. r0,r0,2
872 mtctr r0
873 la r8,-4(r4)
874 la r7,-4(r3)
875
876
87720: lwzu r20,4(r8)
878 lwzu r21,4(r7)
879 xor. r22, r20, r21
880 bne 30f
881 bdnz 20b
882 b 4f
883
884
88530: li r3, 0
886 blr
887
8882: slwi r0,r0,2
889 add r8,r4,r0
890 add r7,r3,r0
8913: lwzu r0,-4(r8)
892 stwu r0,-4(r7)
893 bdnz 3b
894
895
896
897
898
8994: cmpwi r6,0
900 add r5,r3,r5
901 beq 7f
902 subi r0,r6,1
903 andc r3,r3,r0
904 mr r4,r3
9055: dcbst 0,r4
906 add r4,r4,r6
907 cmplw r4,r5
908 blt 5b
909 sync
910 mr r4,r3
9116: icbi 0,r4
912 add r4,r4,r6
913 cmplw r4,r5
914 blt 6b
9157: sync
916 isync
917
918
919
920
921
922 addi r0, r10, in_ram - _start + EXC_OFF_SYS_RESET
923 mtlr r0
924 blr
925
926in_ram:
927
928
929
930
931
932
933
934 li r0,__got2_entries@sectoff@l
935 la r3,GOT(_GOT2_TABLE_)
936 lwz r11,GOT(_GOT2_TABLE_)
937 mtctr r0
938 sub r11,r3,r11
939 addi r3,r3,-4
9401: lwzu r0,4(r3)
941 cmpwi r0,0
942 beq- 2f
943 add r0,r0,r11
944 stw r0,0(r3)
9452: bdnz 1b
946
947#ifndef MINIMAL_SPL
948
949
950
951
952 li r0,__fixup_entries@sectoff@l
953 lwz r3,GOT(_FIXUP_TABLE_)
954 cmpwi r0,0
955 mtctr r0
956 addi r3,r3,-4
957 beq 4f
9583: lwzu r4,4(r3)
959 lwzux r0,r4,r11
960 cmpwi r0,0
961 add r0,r0,r11
962 stw r4,0(r3)
963 beq- 5f
964 stw r0,0(r4)
9655: bdnz 3b
9664:
967#endif
968
969clear_bss:
970
971
972
973 lwz r3,GOT(__bss_start)
974 lwz r4,GOT(__bss_end)
975
976 cmplw 0, r3, r4
977 beq 6f
978
979 li r0, 0
9805:
981 stw r0, 0(r3)
982 addi r3, r3, 4
983 cmplw 0, r3, r4
984 bne 5b
9856:
986
987 mr r3, r9
988 mr r4, r10
989 bl board_init_r
990
991#ifndef MINIMAL_SPL
992
993
994
995
996
997
998 .globl trap_init
999trap_init:
1000 mflr r4
1001 GET_GOT
1002 lwz r7, GOT(_start)
1003 lwz r8, GOT(_end_of_vectors)
1004
1005 li r9, 0x100
1006
1007 cmplw 0, r7, r8
1008 bgelr
10091:
1010 lwz r0, 0(r7)
1011 stw r0, 0(r9)
1012 addi r7, r7, 4
1013 addi r9, r9, 4
1014 cmplw 0, r7, r8
1015 bne 1b
1016
1017
1018
1019
1020 li r7, .L_MachineCheck - _start + EXC_OFF_SYS_RESET
1021 li r8, Alignment - _start + EXC_OFF_SYS_RESET
10222:
1023 bl trap_reloc
1024 addi r7, r7, 0x100
1025 cmplw 0, r7, r8
1026 blt 2b
1027
1028 li r7, .L_Alignment - _start + EXC_OFF_SYS_RESET
1029 bl trap_reloc
1030
1031 li r7, .L_ProgramCheck - _start + EXC_OFF_SYS_RESET
1032 bl trap_reloc
1033
1034 li r7, .L_FPUnavailable - _start + EXC_OFF_SYS_RESET
1035 li r8, SystemCall - _start + EXC_OFF_SYS_RESET
10363:
1037 bl trap_reloc
1038 addi r7, r7, 0x100
1039 cmplw 0, r7, r8
1040 blt 3b
1041
1042 li r7, .L_SingleStep - _start + EXC_OFF_SYS_RESET
1043 li r8, _end_of_vectors - _start + EXC_OFF_SYS_RESET
10444:
1045 bl trap_reloc
1046 addi r7, r7, 0x100
1047 cmplw 0, r7, r8
1048 blt 4b
1049
1050 mfmsr r3
1051 lis r7, MSR_IP@h
1052 ori r7, r7, MSR_IP@l
1053 andc r3, r3, r7
1054 SYNC
1055 mtmsr r3
1056 SYNC
1057
1058 mtlr r4
1059 blr
1060
1061#endif
1062
1063#ifdef CONFIG_SYS_INIT_RAM_LOCK
1064lock_ram_in_cache:
1065
1066
1067 lis r3, (CONFIG_SYS_INIT_RAM_ADDR & ~31)@h
1068 ori r3, r3, (CONFIG_SYS_INIT_RAM_ADDR & ~31)@l
1069 li r4, ((CONFIG_SYS_INIT_RAM_SIZE & ~31) + \
1070 (CONFIG_SYS_INIT_RAM_ADDR & 31) + 31) / 32
1071 mtctr r4
10721:
1073 dcbz r0, r3
1074 addi r3, r3, 32
1075 bdnz 1b
1076
1077
1078 mfspr r0, HID0
1079 ori r0, r0, HID0_DLOCK
1080 sync
1081 mtspr HID0, r0
1082 sync
1083 blr
1084
1085#ifndef MINIMAL_SPL
1086.globl unlock_ram_in_cache
1087unlock_ram_in_cache:
1088
1089 lis r3, (CONFIG_SYS_INIT_RAM_ADDR & ~31)@h
1090 ori r3, r3, (CONFIG_SYS_INIT_RAM_ADDR & ~31)@l
1091 li r4, ((CONFIG_SYS_INIT_RAM_SIZE & ~31) + \
1092 (CONFIG_SYS_INIT_RAM_ADDR & 31) + 31) / 32
1093 mtctr r4
10941: icbi r0, r3
1095 dcbi r0, r3
1096 addi r3, r3, 32
1097 bdnz 1b
1098 sync
1099 isync
1100
1101
1102 mfspr r3, HID0
1103 li r5, HID0_DLOCK|HID0_DCFI
1104 andc r3, r3, r5
1105 ori r5, r3, HID0_DCFI
1106 sync
1107 mtspr HID0, r5
1108 sync
1109 mtspr HID0, r3
1110 blr
1111#endif
1112#endif
1113
1114#ifdef CONFIG_SYS_FLASHBOOT
1115map_flash_by_law1:
1116
1117
1118
1119 lis r3, (CONFIG_SYS_IMMR)@h
1120 lwz r4, OR0@l(r3)
1121 li r5, 0x7fff
1122 and r4, r4, r5
1123 stw r4, OR0@l(r3)
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141 lis r4, (CONFIG_SYS_FLASH_BASE)@h
1142 ori r4, r4, (CONFIG_SYS_FLASH_BASE)@l
1143 stw r4, LBLAWBAR1(r3)
1144
1145
1146 lis r4, (0x80000012)@h
1147 ori r4, r4, (0x80000012)@l
1148 li r5, CONFIG_SYS_FLASH_SIZE
11491: srawi. r5, r5, 1
1150 addi r4, r4, 1
1151 bne 1b
1152
1153 stw r4, LBLAWAR1(r3)
1154
1155 lwz r4, LBLAWAR1(r3)
1156 twi 0,r4,0
1157 isync
1158 blr
1159
1160
1161
1162
1163
1164remap_flash_by_law0:
1165
1166 lwz r4, BR0(r3)
1167 li r5, 0x7FFF
1168 and r4, r4, r5
1169 lis r5, (CONFIG_SYS_FLASH_BASE & 0xFFFF8000)@h
1170 ori r5, r5, (CONFIG_SYS_FLASH_BASE & 0xFFFF8000)@l
1171 or r5, r5, r4
1172 stw r5, BR0(r3)
1173
1174 lwz r4, OR0(r3)
1175 lis r5, ~((CONFIG_SYS_FLASH_SIZE << 4) - 1)
1176 or r4, r4, r5
1177 stw r4, OR0(r3)
1178
1179 lis r4, (CONFIG_SYS_FLASH_BASE)@h
1180 ori r4, r4, (CONFIG_SYS_FLASH_BASE)@l
1181 stw r4, LBLAWBAR0(r3)
1182
1183
1184 lis r4, (0x80000012)@h
1185 ori r4, r4, (0x80000012)@l
1186 li r5, CONFIG_SYS_FLASH_SIZE
11871: srawi. r5, r5, 1
1188 addi r4, r4, 1
1189 bne 1b
1190 stw r4, LBLAWAR0(r3)
1191
1192
1193 xor r4, r4, r4
1194 stw r4, LBLAWBAR1(r3)
1195 stw r4, LBLAWAR1(r3)
1196
1197 lwz r4, LBLAWAR1(r3)
1198 twi 0,r4,0
1199 isync
1200 blr
1201#endif
1202