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
31#include <asm-offsets.h>
32#include <config.h>
33#include <mpc85xx.h>
34#include <version.h>
35
36#define _LINUX_CONFIG_H 1
37
38#include <ppc_asm.tmpl>
39#include <ppc_defs.h>
40
41#include <asm/cache.h>
42#include <asm/mmu.h>
43
44#undef MSR_KERNEL
45#define MSR_KERNEL ( MSR_ME )
46
47
48
49
50
51
52 START_GOT
53 GOT_ENTRY(_GOT2_TABLE_)
54 GOT_ENTRY(_FIXUP_TABLE_)
55
56#ifndef CONFIG_NAND_SPL
57 GOT_ENTRY(_start)
58 GOT_ENTRY(_start_of_vectors)
59 GOT_ENTRY(_end_of_vectors)
60 GOT_ENTRY(transfer_to_handler)
61#endif
62
63 GOT_ENTRY(__init_end)
64 GOT_ENTRY(__bss_end__)
65 GOT_ENTRY(__bss_start)
66 END_GOT
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 .section .bootpg,"ax"
82 .globl _start_e500
83
84_start_e500:
85
86
87
88
89
90
91
92
93 mfspr r3, SPRN_L2CSR0
94 lis r2, L2CSR0_L2E@h
95 ori r2, r2, L2CSR0_L2E@l
96 and. r4, r3, r2
97 beq l2_disabled
98
99 mfspr r3, SPRN_L2CSR0
100
101 lis r2,(L2CSR0_L2FL)@h
102 ori r2, r2, (L2CSR0_L2FL)@l
103 or r3, r2, r3
104 sync
105 isync
106 mtspr SPRN_L2CSR0,r3
107 isync
1081:
109 mfspr r3, SPRN_L2CSR0
110 and. r1, r3, r2
111 bne 1b
112
113 mfspr r3, SPRN_L2CSR0
114 lis r2, L2CSR0_L2E@h
115 ori r2, r2, L2CSR0_L2E@l
116 andc r4, r3, r2
117 sync
118 isync
119 mtspr SPRN_L2CSR0,r4
120 isync
121
122l2_disabled:
123#endif
124
125
126
127
128 li r0,2
129 mtspr L1CSR0,r0
130 mtspr L1CSR1,r0
131
132 mfspr r1,DBSR
133 mtspr DBSR,r1
134
135
136
137
138
139
140
141
142 li r2,(32 + 0)
143 mtspr L1CSR2,r2
144#endif
145
146
147 lis r2,(L1CSR1_ICFI|L1CSR1_ICLFR)@h
148 ori r2,r2,(L1CSR1_ICFI|L1CSR1_ICLFR)@l
149 mtspr SPRN_L1CSR1,r2
1501:
151 mfspr r3,SPRN_L1CSR1
152 and. r1,r3,r2
153 bne 1b
154
155 lis r3,(L1CSR1_CPE|L1CSR1_ICE)@h
156 ori r3,r3,(L1CSR1_CPE|L1CSR1_ICE)@l
157 mtspr SPRN_L1CSR1,r3
158 isync
1592:
160 mfspr r3,SPRN_L1CSR1
161 andi. r1,r3,L1CSR1_ICE@l
162 beq 2b
163
164
165 lis r2,(L1CSR0_DCFI|L1CSR0_DCLFR)@h
166 ori r2,r2,(L1CSR0_DCFI|L1CSR0_DCLFR)@l
167 mtspr SPRN_L1CSR0,r2
1681:
169 mfspr r3,SPRN_L1CSR0
170 and. r1,r3,r2
171 bne 1b
172
173 lis r3,(L1CSR0_CPE|L1CSR0_DCE)@h
174 ori r3,r3,(L1CSR0_CPE|L1CSR0_DCE)@l
175 mtspr SPRN_L1CSR0,r3
176 isync
1772:
178 mfspr r3,SPRN_L1CSR0
179 andi. r1,r3,L1CSR0_DCE@l
180 beq 2b
181
182
183 lis r1,CONFIG_SYS_MONITOR_BASE@h
184 mtspr IVPR,r1
185
186 li r1,0x0100
187 mtspr IVOR0,r1
188 li r1,0x0200
189 mtspr IVOR1,r1
190 li r1,0x0300
191 mtspr IVOR2,r1
192 li r1,0x0400
193 mtspr IVOR3,r1
194 li r1,0x0500
195 mtspr IVOR4,r1
196 li r1,0x0600
197 mtspr IVOR5,r1
198 li r1,0x0700
199 mtspr IVOR6,r1
200 li r1,0x0800
201 mtspr IVOR7,r1
202 li r1,0x0900
203 mtspr IVOR8,r1
204
205 li r1,0x0a00
206 mtspr IVOR10,r1
207 li r1,0x0b00
208 mtspr IVOR11,r1
209 li r1,0x0c00
210 mtspr IVOR12,r1
211 li r1,0x0d00
212 mtspr IVOR13,r1
213 li r1,0x0e00
214 mtspr IVOR14,r1
215 li r1,0x0f00
216 mtspr IVOR15,r1
217
218
219 li r0,0x0000
220 lis r1,0xffff
221 mtspr DEC,r0
222 mttbl r0
223 mttbu r0
224 mtspr TSR,r1
225 mtspr TCR,r0
226 mtspr ESR,r0
227 mtspr MCSR,r0
228 mtxer r0
229
230#ifdef CONFIG_SYS_BOOK3E_HV
231 mtspr MAS8,r0
232#endif
233
234
235 lis r0,HID0_EMCP@h
236
237 ori r0,r0,HID0_ENMAS7@l
238#endif
239#ifndef CONFIG_E500MC
240 ori r0,r0,HID0_TBEN@l
241#endif
242 mtspr HID0,r0
243
244#ifndef CONFIG_E500MC
245 li r0,(HID1_ASTME|HID1_ABE)@l
246 mfspr r3,PVR
247 andi. r3,r3, 0xff
248 cmpwi r3,0x50@l
249 blt 1f
250
251 ori r0, r0, HID1_MBDD@l
2521:
253 mtspr HID1,r0
254#endif
255
256#ifdef CONFIG_SYS_FSL_ERRATUM_CPU_A003999
257 mfspr r3,977
258 oris r3,r3,0x0100
259 mtspr 977,r3
260#endif
261
262
263
264 lis r0,BUCSR_ENABLE@h
265 ori r0,r0,BUCSR_ENABLE@l
266 mtspr SPRN_BUCSR,r0
267#endif
268
269
270 lis r1,0xffff
271 ori r1,r1,0xffff
272 mtspr DBSR,r1
273 lis r0,CONFIG_SYS_INIT_DBCR@h
274 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
275 mtspr DBCR0,r0
276#endif
277
278#ifdef CONFIG_MPC8569
279#define CONFIG_SYS_LBC_ADDR (CONFIG_SYS_CCSRBAR_DEFAULT + 0x5000)
280#define CONFIG_SYS_LBCR_ADDR (CONFIG_SYS_LBC_ADDR + 0xd0)
281
282
283
284
285
286
287
288 lis r6,FSL_BOOKE_MAS0(0, 0, 0)@h
289 ori r6,r6,FSL_BOOKE_MAS0(0, 0, 0)@l
290
291 lis r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h
292 ori r7,r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l
293
294 lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@h
295 ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@l
296
297 lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0,
298 (MAS3_SX|MAS3_SW|MAS3_SR))@h
299 ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0,
300 (MAS3_SX|MAS3_SW|MAS3_SR))@l
301
302 mtspr MAS0,r6
303 mtspr MAS1,r7
304 mtspr MAS2,r8
305 mtspr MAS3,r9
306 isync
307 msync
308 tlbwe
309
310
311 lis r4,CONFIG_SYS_LBCR_ADDR@h
312 ori r4,r4,CONFIG_SYS_LBCR_ADDR@l
313
314 lis r5,CONFIG_SYS_LBC_LBCR@h
315 ori r5,r5,CONFIG_SYS_LBC_LBCR@l
316 stw r5,0(r4)
317 isync
318
319
320 lis r4,CONFIG_SYS_LBC_ADDR@h
321 ori r4,r4,CONFIG_SYS_LBC_ADDR@l
322 tlbivax 0,r4
323 isync
324
325#endif
326
327
328
329
330
331
332
333
334
335
336
337
338 bl nexti
339nexti: mflr r1
340 li r2, 0
341 mtspr MAS6, r2
342 isync
343 msync
344 tlbsx 0, r1
345
346
347 mfspr r3, MAS1
348 li r2, 0xF00
349 andc r3, r3, r2
350 ori r3, r3, MAS1_TSIZE(BOOKE_PAGESZ_4K)@l
351 mtspr MAS1, r3
352
353
354
355
356
357 lis r3, MAS2_EPN@h
358 ori r3, r3, MAS2_EPN@l
359
360 and r1, r1, r3
361
362 mfspr r2, MAS2
363 andc r2, r2, r3
364 or r2, r2, r1
365 mtspr MAS2, r2
366
367 mfspr r2, MAS3
368 andc r2, r2, r3
369 or r2, r2, r1
370 mtspr MAS3, r2
371
372 isync
373 msync
374 tlbwe
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392#endif
393
394purge_old_ccsr_tlb:
395 lis r8, CONFIG_SYS_CCSRBAR@h
396 ori r8, r8, CONFIG_SYS_CCSRBAR@l
397 lis r9, (CONFIG_SYS_CCSRBAR + 0x1000)@h
398 ori r9, r9, (CONFIG_SYS_CCSRBAR + 0x1000)@l
399
400
401
402
403
404
405
406
407
408 li r1, 0
409 mtspr MAS6, r1
410 isync
411 msync
412 tlbsx 0, r8
413 mfspr r1, MAS1
414 andis. r2, r1, MAS1_VALID@h
415 beq 1f
416
417 rlwinm r1, r1, 0, 1, 31
418 mtspr MAS1, r1
419 isync
420 msync
421 tlbwe
4221:
423
424create_ccsr_new_tlb:
425
426
427
428
429 lis r0, FSL_BOOKE_MAS0(0, 0, 0)@h
430 ori r0, r0, FSL_BOOKE_MAS0(0, 0, 0)@l
431 lis r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h
432 ori r1, r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l
433 lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@h
434 ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@l
435 lis r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW, 0, (MAS3_SW|MAS3_SR))@h
436 ori r3, r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW, 0, (MAS3_SW|MAS3_SR))@l
437 lis r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH@h
438 ori r7, r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH@l
439 mtspr MAS0, r0
440 mtspr MAS1, r1
441 mtspr MAS2, r2
442 mtspr MAS3, r3
443 mtspr MAS7, r7
444 isync
445 msync
446 tlbwe
447
448
449
450
451
452create_ccsr_old_tlb:
453 lis r0, FSL_BOOKE_MAS0(0, 1, 0)@h
454 ori r0, r0, FSL_BOOKE_MAS0(0, 1, 0)@l
455 lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@h
456 ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@l
457 lis r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SW|MAS3_SR))@h
458 ori r3, r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SW|MAS3_SR))@l
459 li r7, 0
460 mtspr MAS0, r0
461
462 mtspr MAS2, r2
463 mtspr MAS3, r3
464 mtspr MAS7, r7
465 isync
466 msync
467 tlbwe
468
469
470
471
472
473
474
475verify_old_ccsr:
476 lis r0, CONFIG_SYS_CCSRBAR_DEFAULT@h
477 ori r0, r0, CONFIG_SYS_CCSRBAR_DEFAULT@l
478#ifdef CONFIG_FSL_CORENET
479 lwz r1, 4(r9)
480#else
481 lwz r1, 0(r9)
482 slwi r1, r1, 12
483#endif
484
485 cmpl 0, r0, r1
486
487
488
489
490
491
492
493infinite_debug_loop:
494 bne infinite_debug_loop
495
496#ifdef CONFIG_FSL_CORENET
497
498#define CCSR_LAWBARH0 (CONFIG_SYS_CCSRBAR + 0x1000)
499#define LAW_EN 0x80000000
500#define LAW_SIZE_4K 0xb
501#define CCSRBAR_LAWAR (LAW_EN | (0x1e << 20) | LAW_SIZE_4K)
502#define CCSRAR_C 0x80000000
503
504create_temp_law:
505
506
507
508
509 lis r0, CONFIG_SYS_CCSRBAR_PHYS_HIGH@h
510 ori r0, r0, CONFIG_SYS_CCSRBAR_PHYS_HIGH@l
511 lis r1, CONFIG_SYS_CCSRBAR_PHYS_LOW@h
512 ori r1, r1, CONFIG_SYS_CCSRBAR_PHYS_LOW@l
513 lis r2, CCSRBAR_LAWAR@h
514 ori r2, r2, CCSRBAR_LAWAR@l
515
516 stw r0, 0xc00(r9)
517 stw r1, 0xc04(r9)
518 sync
519 stw r2, 0xc08(r9)
520
521
522
523
524
525 lwz r0, 0xc08(r9)
526 isync
527
528
529
530
531
532
533read_old_ccsrbar:
534 lwz r0, 0(r9)
535 lwz r0, 4(r9)
536 isync
537
538
539
540
541
542
543
544
545
546
547write_new_ccsrbar:
548 lis r0, CONFIG_SYS_CCSRBAR_PHYS_HIGH@h
549 ori r0, r0, CONFIG_SYS_CCSRBAR_PHYS_HIGH@l
550 lis r1, CONFIG_SYS_CCSRBAR_PHYS_LOW@h
551 ori r1, r1, CONFIG_SYS_CCSRBAR_PHYS_LOW@l
552 lis r2, CCSRAR_C@h
553 ori r2, r2, CCSRAR_C@l
554
555 stw r0, 0(r9)
556 sync
557 stw r1, 4(r9)
558 sync
559
560
561
562
563
564 stw r2, 8(r9)
565 sync
566
567
568delete_temp_law:
569 li r1, 0
570 stw r1, 0xc08(r8)
571 sync
572 stw r1, 0xc00(r8)
573 stw r1, 0xc04(r8)
574 sync
575
576#else
577
578write_new_ccsrbar:
579
580
581
582
583
584 sync
585 lwz r0, 0(r9)
586 isync
587
588
589#define CCSRBAR_PHYS_RS12 ((CONFIG_SYS_CCSRBAR_PHYS_HIGH << 20) | \
590 (CONFIG_SYS_CCSRBAR_PHYS_LOW >> 12))
591
592
593 lis r0, CCSRBAR_PHYS_RS12@h
594 ori r0, r0, CCSRBAR_PHYS_RS12@l
595 stw r0, 0(r9)
596 sync
597
598
599
600
601
602
603
604 isync
605
606
607
608
609
610 lwz r0, 0(r8)
611 isync
612
613#endif
614
615
616delete_temp_tlbs:
617 lis r0, FSL_BOOKE_MAS0(0, 0, 0)@h
618 ori r0, r0, FSL_BOOKE_MAS0(0, 0, 0)@l
619 li r1, 0
620 lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@h
621 ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@l
622 mtspr MAS0, r0
623 mtspr MAS1, r1
624 mtspr MAS2, r2
625 isync
626 msync
627 tlbwe
628
629 lis r0, FSL_BOOKE_MAS0(0, 1, 0)@h
630 ori r0, r0, FSL_BOOKE_MAS0(0, 1, 0)@l
631 lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@h
632 ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@l
633 mtspr MAS0, r0
634 mtspr MAS2, r2
635 isync
636 msync
637 tlbwe
638#endif
639
640create_init_ram_area:
641 lis r6,FSL_BOOKE_MAS0(1, 15, 0)@h
642 ori r6,r6,FSL_BOOKE_MAS0(1, 15, 0)@l
643
644
645
646 lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@h
647 ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@l
648
649 lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, (MAS2_I|MAS2_G))@h
650 ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, (MAS2_I|MAS2_G))@l
651
652
653 lis r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
654 ori r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
655
656
657
658
659 lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h
660 ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l
661
662 lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@h
663 ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@l
664
665 lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0,
666 (MAS3_SX|MAS3_SW|MAS3_SR))@h
667 ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0,
668 (MAS3_SX|MAS3_SW|MAS3_SR))@l
669#else
670
671
672
673
674 lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h
675 ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l
676
677 lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@h
678 ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@l
679
680 lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
681 ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
682#endif
683
684 mtspr MAS0,r6
685 mtspr MAS1,r7
686 mtspr MAS2,r8
687 mtspr MAS3,r9
688 isync
689 msync
690 tlbwe
691
692
693 lis r6,FSL_BOOKE_MAS0(1, 14, 0)@h
694 ori r6,r6,FSL_BOOKE_MAS0(1, 14, 0)@l
695
696 lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@h
697 ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@l
698
699 lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@h
700 ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@l
701
702
703 defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH)
704 lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0,
705 (MAS3_SX|MAS3_SW|MAS3_SR))@h
706 ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0,
707 (MAS3_SX|MAS3_SW|MAS3_SR))@l
708 li r10,CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH
709 mtspr MAS7,r10
710#else
711 lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
712 ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
713#endif
714
715 mtspr MAS0,r6
716 mtspr MAS1,r7
717 mtspr MAS2,r8
718 mtspr MAS3,r9
719 isync
720 msync
721 tlbwe
722
723 lis r6,MSR_IS|MSR_DS@h
724 ori r6,r6,MSR_IS|MSR_DS@l
725 lis r7,switch_as@h
726 ori r7,r7,switch_as@l
727
728 mtspr SPRN_SRR0,r7
729 mtspr SPRN_SRR1,r6
730 rfi
731
732switch_as:
733
734
735
736
737 lis r3,CONFIG_SYS_INIT_RAM_ADDR@h
738 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
739 mfspr r2, L1CFG0
740 andi. r2, r2, 0x1ff
741
742 slwi r2, r2, (10 - 1 - L1_CACHE_SHIFT)
743 mtctr r2
744 li r0,0
7451:
746 dcbz r0,r3
747 dcbtls 0,r0,r3
748 addi r3,r3,CONFIG_SYS_CACHELINE_SIZE
749 bdnz 1b
750
751
752#ifdef CONFIG_SYS_RAMBOOT
753 b _start_cont
754#else
755
756
757 lis r3,CONFIG_SYS_MONITOR_BASE@h
758 ori r3,r3,CONFIG_SYS_MONITOR_BASE@l
759 addi r3,r3,_start_cont - _start + _START_OFFSET
760 mtlr r3
761 blr
762#endif
763
764 .text
765 .globl _start
766_start:
767 .long 0x27051956
768 .globl version_string
769version_string:
770 .ascii U_BOOT_VERSION_STRING, "\0"
771
772 .align 4
773 .globl _start_cont
774_start_cont:
775
776 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
777 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
778
779 li r0,0
780 stwu r0,-4(r1)
781 stwu r0,-4(r1)
782
783 stwu r1,-8(r1)
784 lis r0,RESET_VECTOR@h
785 ori r0,r0,RESET_VECTOR@l
786 stwu r1,-8(r1)
787 stw r0,+12(r1)
788
789 GET_GOT
790 bl cpu_init_early_f
791
792
793 lis r3,(MSR_CE|MSR_ME|MSR_DE)@h
794 ori r3,r3,(MSR_CE|MSR_ME|MSR_DE)@l
795 mtmsr r3
796 isync
797
798 bl cpu_init_f
799 bl board_init_f
800 isync
801
802
803
804#ifndef CONFIG_NAND_SPL
805 . = EXC_OFF_SYS_RESET
806 .globl _start_of_vectors
807_start_of_vectors:
808
809
810 CRIT_EXCEPTION(0x0100, CriticalInput, CritcalInputException)
811
812
813 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
814
815
816 STD_EXCEPTION(0x0300, DataStorage, UnknownException)
817
818
819 STD_EXCEPTION(0x0400, InstStorage, UnknownException)
820
821
822 STD_EXCEPTION(0x0500, ExtInterrupt, ExtIntException)
823
824
825 . = 0x0600
826Alignment:
827 EXCEPTION_PROLOG(SRR0, SRR1)
828 mfspr r4,DAR
829 stw r4,_DAR(r21)
830 mfspr r5,DSISR
831 stw r5,_DSISR(r21)
832 addi r3,r1,STACK_FRAME_OVERHEAD
833 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
834
835
836 . = 0x0700
837ProgramCheck:
838 EXCEPTION_PROLOG(SRR0, SRR1)
839 addi r3,r1,STACK_FRAME_OVERHEAD
840 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
841 MSR_KERNEL, COPY_EE)
842
843
844
845 STD_EXCEPTION(0x0800, FPUnavailable, UnknownException)
846
847 . = 0x0900
848
849
850
851
852SystemCall:
853 addis r11,r0,0
854 ori r11,r11,0
855 addis r12,r0,0
856 ori r12,r12,0
857
858 cmplw 0,r0,r12
859 bge 1f
860
861 rlwinm r0,r0,2,0,31
862 add r11,r11,r0
863 lwz r11,0(r11)
864
865 li r20,0xd00-4
866 lwz r12,0(r20)
867 subi r12,r12,12
868 li r0,0xc00+_end_back-SystemCall
869 cmplw 0,r0,r12
870 bgt 1f
871 stw r12,0(r20)
872
873 mflr r0
874 stw r0,0(r12)
875 mfspr r0,SRR0
876 stw r0,4(r12)
877 mfspr r0,SRR1
878 stw r0,8(r12)
879
880 li r12,0xc00+_back-SystemCall
881 mtlr r12
882 mtspr SRR0,r11
883
8841: SYNC
885 rfi
886_back:
887
888 mfmsr r11
889 li r12,0
890 ori r12,r12,MSR_EE
891 andc r11,r11,r12
892 SYNC
893 mtmsr r11
894 SYNC
895
896 li r12,0xd00-4
897 lwz r12,0(r12)
898
899 lwz r11,0(r12)
900 mtlr r11
901 lwz r11,4(r12)
902 mtspr SRR0,r11
903 lwz r11,8(r12)
904 mtspr SRR1,r11
905
906 addi r12,r12,12
907 li r20,0xd00-4
908 stw r12,0(r20)
909
910 SYNC
911 rfi
912_end_back:
913
914 STD_EXCEPTION(0x0a00, Decrementer, timer_interrupt)
915 STD_EXCEPTION(0x0b00, IntervalTimer, UnknownException)
916 STD_EXCEPTION(0x0c00, WatchdogTimer, UnknownException)
917
918 STD_EXCEPTION(0x0d00, DataTLBError, UnknownException)
919 STD_EXCEPTION(0x0e00, InstructionTLBError, UnknownException)
920
921 CRIT_EXCEPTION(0x0f00, DebugBreakpoint, DebugException )
922
923 .globl _end_of_vectors
924_end_of_vectors:
925
926
927 . = . + (0x100 - ( . & 0xff ))
928
929
930
931
932
933
934 .globl transfer_to_handler
935transfer_to_handler:
936 stw r22,_NIP(r21)
937 lis r22,MSR_POW@h
938 andc r23,r23,r22
939 stw r23,_MSR(r21)
940 SAVE_GPR(7, r21)
941 SAVE_4GPRS(8, r21)
942 SAVE_8GPRS(12, r21)
943 SAVE_8GPRS(24, r21)
944
945 mflr r23
946 andi. r24,r23,0x3f00
947 stw r24,TRAP(r21)
948 li r22,0
949 stw r22,RESULT(r21)
950 mtspr SPRG2,r22
951
952 lwz r24,0(r23)
953 lwz r23,4(r23)
954 mtspr SRR0,r24
955 mtspr SRR1,r20
956 mtlr r23
957 SYNC
958 rfi
959
960int_return:
961 mfmsr r28
962 li r4,0
963 ori r4,r4,MSR_EE
964 andc r28,r28,r4
965 SYNC
966 mtmsr r28
967 SYNC
968 lwz r2,_CTR(r1)
969 lwz r0,_LINK(r1)
970 mtctr r2
971 mtlr r0
972 lwz r2,_XER(r1)
973 lwz r0,_CCR(r1)
974 mtspr XER,r2
975 mtcrf 0xFF,r0
976 REST_10GPRS(3, r1)
977 REST_10GPRS(13, r1)
978 REST_8GPRS(23, r1)
979 REST_GPR(31, r1)
980 lwz r2,_NIP(r1)
981 lwz r0,_MSR(r1)
982 mtspr SRR0,r2
983 mtspr SRR1,r0
984 lwz r0,GPR0(r1)
985 lwz r2,GPR2(r1)
986 lwz r1,GPR1(r1)
987 SYNC
988 rfi
989
990crit_return:
991 mfmsr r28
992 li r4,0
993 ori r4,r4,MSR_EE
994 andc r28,r28,r4
995 SYNC
996 mtmsr r28
997 SYNC
998 lwz r2,_CTR(r1)
999 lwz r0,_LINK(r1)
1000 mtctr r2
1001 mtlr r0
1002 lwz r2,_XER(r1)
1003 lwz r0,_CCR(r1)
1004 mtspr XER,r2
1005 mtcrf 0xFF,r0
1006 REST_10GPRS(3, r1)
1007 REST_10GPRS(13, r1)
1008 REST_8GPRS(23, r1)
1009 REST_GPR(31, r1)
1010 lwz r2,_NIP(r1)
1011 lwz r0,_MSR(r1)
1012 mtspr SPRN_CSRR0,r2
1013 mtspr SPRN_CSRR1,r0
1014 lwz r0,GPR0(r1)
1015 lwz r2,GPR2(r1)
1016 lwz r1,GPR1(r1)
1017 SYNC
1018 rfci
1019
1020mck_return:
1021 mfmsr r28
1022 li r4,0
1023 ori r4,r4,MSR_EE
1024 andc r28,r28,r4
1025 SYNC
1026 mtmsr r28
1027 SYNC
1028 lwz r2,_CTR(r1)
1029 lwz r0,_LINK(r1)
1030 mtctr r2
1031 mtlr r0
1032 lwz r2,_XER(r1)
1033 lwz r0,_CCR(r1)
1034 mtspr XER,r2
1035 mtcrf 0xFF,r0
1036 REST_10GPRS(3, r1)
1037 REST_10GPRS(13, r1)
1038 REST_8GPRS(23, r1)
1039 REST_GPR(31, r1)
1040 lwz r2,_NIP(r1)
1041 lwz r0,_MSR(r1)
1042 mtspr SPRN_MCSRR0,r2
1043 mtspr SPRN_MCSRR1,r0
1044 lwz r0,GPR0(r1)
1045 lwz r2,GPR2(r1)
1046 lwz r1,GPR1(r1)
1047 SYNC
1048 rfmci
1049
1050
1051
1052.globl flush_icache
1053flush_icache:
1054.globl invalidate_icache
1055invalidate_icache:
1056 mfspr r0,L1CSR1
1057 ori r0,r0,L1CSR1_ICFI
1058 msync
1059 isync
1060 mtspr L1CSR1,r0
1061 isync
1062 blr
1063
1064.globl invalidate_dcache
1065invalidate_dcache:
1066 mfspr r0,L1CSR0
1067 ori r0,r0,L1CSR0_DCFI
1068 msync
1069 isync
1070 mtspr L1CSR0,r0
1071 isync
1072 blr
1073
1074 .globl icache_enable
1075icache_enable:
1076 mflr r8
1077 bl invalidate_icache
1078 mtlr r8
1079 isync
1080 mfspr r4,L1CSR1
1081 ori r4,r4,0x0001
1082 oris r4,r4,0x0001
1083 mtspr L1CSR1,r4
1084 isync
1085 blr
1086
1087 .globl icache_disable
1088icache_disable:
1089 mfspr r0,L1CSR1
1090 lis r3,0
1091 ori r3,r3,L1CSR1_ICE
1092 andc r0,r0,r3
1093 mtspr L1CSR1,r0
1094 isync
1095 blr
1096
1097 .globl icache_status
1098icache_status:
1099 mfspr r3,L1CSR1
1100 andi. r3,r3,L1CSR1_ICE
1101 blr
1102
1103 .globl dcache_enable
1104dcache_enable:
1105 mflr r8
1106 bl invalidate_dcache
1107 mtlr r8
1108 isync
1109 mfspr r0,L1CSR0
1110 ori r0,r0,0x0001
1111 oris r0,r0,0x0001
1112 msync
1113 isync
1114 mtspr L1CSR0,r0
1115 isync
1116 blr
1117
1118 .globl dcache_disable
1119dcache_disable:
1120 mfspr r3,L1CSR0
1121 lis r4,0
1122 ori r4,r4,L1CSR0_DCE
1123 andc r3,r3,r4
1124 mtspr L1CSR0,r3
1125 isync
1126 blr
1127
1128 .globl dcache_status
1129dcache_status:
1130 mfspr r3,L1CSR0
1131 andi. r3,r3,L1CSR0_DCE
1132 blr
1133
1134 .globl get_pir
1135get_pir:
1136 mfspr r3,PIR
1137 blr
1138
1139 .globl get_pvr
1140get_pvr:
1141 mfspr r3,PVR
1142 blr
1143
1144 .globl get_svr
1145get_svr:
1146 mfspr r3,SVR
1147 blr
1148
1149 .globl wr_tcr
1150wr_tcr:
1151 mtspr TCR,r3
1152 blr
1153
1154
1155
1156
1157
1158 .globl in8
1159in8:
1160 lbz r3,0x0000(r3)
1161 blr
1162
1163
1164
1165
1166
1167 .globl out8
1168out8:
1169 stb r4,0x0000(r3)
1170 sync
1171 blr
1172
1173
1174
1175
1176
1177 .globl out16
1178out16:
1179 sth r4,0x0000(r3)
1180 sync
1181 blr
1182
1183
1184
1185
1186
1187 .globl out16r
1188out16r:
1189 sthbrx r4,r0,r3
1190 sync
1191 blr
1192
1193
1194
1195
1196
1197 .globl out32
1198out32:
1199 stw r4,0x0000(r3)
1200 sync
1201 blr
1202
1203
1204
1205
1206
1207 .globl out32r
1208out32r:
1209 stwbrx r4,r0,r3
1210 sync
1211 blr
1212
1213
1214
1215
1216
1217 .globl in16
1218in16:
1219 lhz r3,0x0000(r3)
1220 blr
1221
1222
1223
1224
1225
1226 .globl in16r
1227in16r:
1228 lhbrx r3,r0,r3
1229 blr
1230
1231
1232
1233
1234
1235 .globl in32
1236in32:
1237 lwz 3,0x0000(3)
1238 blr
1239
1240
1241
1242
1243
1244 .globl in32r
1245in32r:
1246 lwbrx r3,r0,r3
1247 blr
1248#endif
1249
1250
1251
1252
1253
1254
1255 .globl write_tlb
1256write_tlb:
1257 mtspr MAS0,r3
1258 mtspr MAS1,r4
1259 mtspr MAS2,r5
1260 mtspr MAS3,r6
1261#ifdef CONFIG_ENABLE_36BIT_PHYS
1262 mtspr MAS7,r7
1263#endif
1264 li r3,0
1265#ifdef CONFIG_SYS_BOOK3E_HV
1266 mtspr MAS8,r3
1267#endif
1268 isync
1269 tlbwe
1270 msync
1271 isync
1272 blr
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285 .globl relocate_code
1286relocate_code:
1287 mr r1,r3
1288 mr r9,r4
1289 mr r10,r5
1290
1291 GET_GOT
1292 mr r3,r5
1293 lis r4,CONFIG_SYS_MONITOR_BASE@h
1294 ori r4,r4,CONFIG_SYS_MONITOR_BASE@l
1295 lwz r5,GOT(__init_end)
1296 sub r5,r5,r4
1297 li r6,CONFIG_SYS_CACHELINE_SIZE
1298
1299
1300
1301
1302
1303
1304
1305
1306 sub r15,r10,r4
1307
1308
1309 add r12,r12,r15
1310
1311 add r30,r30,r15
1312
1313
1314
1315
1316
1317 cmplw cr1,r3,r4
1318 addi r0,r5,3
1319 srwi. r0,r0,2
1320 beq cr1,4f
1321 beq 7f
1322 mtctr r0
1323 bge cr1,2f
1324
1325 la r8,-4(r4)
1326 la r7,-4(r3)
13271: lwzu r0,4(r8)
1328 stwu r0,4(r7)
1329 bdnz 1b
1330 b 4f
1331
13322: slwi r0,r0,2
1333 add r8,r4,r0
1334 add r7,r3,r0
13353: lwzu r0,-4(r8)
1336 stwu r0,-4(r7)
1337 bdnz 3b
1338
1339
1340
1341
1342
13434: cmpwi r6,0
1344 add r5,r3,r5
1345 beq 7f
1346 subi r0,r6,1
1347 andc r3,r3,r0
1348 mr r4,r3
13495: dcbst 0,r4
1350 add r4,r4,r6
1351 cmplw r4,r5
1352 blt 5b
1353 sync
1354 mr r4,r3
13556: icbi 0,r4
1356 add r4,r4,r6
1357 cmplw r4,r5
1358 blt 6b
13597: sync
1360 isync
1361
1362
1363
1364
1365 mtspr IVPR,r10
1366
1367
1368
1369
1370
1371
1372 addi r0,r10,in_ram - _start + _START_OFFSET
1373 mtlr r0
1374 blr
1375 .globl in_ram
1376in_ram:
1377
1378
1379
1380
1381
1382
1383
1384 li r0,__got2_entries@sectoff@l
1385 la r3,GOT(_GOT2_TABLE_)
1386 lwz r11,GOT(_GOT2_TABLE_)
1387 mtctr r0
1388 sub r11,r3,r11
1389 addi r3,r3,-4
13901: lwzu r0,4(r3)
1391 cmpwi r0,0
1392 beq- 2f
1393 add r0,r0,r11
1394 stw r0,0(r3)
13952: bdnz 1b
1396
1397
1398
1399
1400
1401 li r0,__fixup_entries@sectoff@l
1402 lwz r3,GOT(_FIXUP_TABLE_)
1403 cmpwi r0,0
1404 mtctr r0
1405 addi r3,r3,-4
1406 beq 4f
14073: lwzu r4,4(r3)
1408 lwzux r0,r4,r11
1409 cmpwi r0,0
1410 add r0,r0,r11
1411 stw r4,0(r3)
1412 beq- 5f
1413 stw r0,0(r4)
14145: bdnz 3b
14154:
1416clear_bss:
1417
1418
1419
1420 lwz r3,GOT(__bss_start)
1421 lwz r4,GOT(__bss_end__)
1422
1423 cmplw 0,r3,r4
1424 beq 6f
1425
1426 li r0,0
14275:
1428 stw r0,0(r3)
1429 addi r3,r3,4
1430 cmplw 0,r3,r4
1431 bne 5b
14326:
1433
1434 mr r3,r9
1435 mr r4,r10
1436 bl board_init_r
1437
1438#ifndef CONFIG_NAND_SPL
1439
1440
1441
1442
1443
1444
1445 .globl trap_init
1446trap_init:
1447 mflr r4
1448 GET_GOT
1449 lwz r7,GOT(_start_of_vectors)
1450 lwz r8,GOT(_end_of_vectors)
1451
1452 li r9,0x100
1453
1454 cmplw 0,r7,r8
1455 bgelr
14561:
1457 lwz r0,0(r7)
1458 stw r0,0(r9)
1459 addi r7,r7,4
1460 addi r9,r9,4
1461 cmplw 0,r7,r8
1462 bne 1b
1463
1464
1465
1466
1467 li r7,.L_CriticalInput - _start + _START_OFFSET
1468 bl trap_reloc
1469 li r7,.L_MachineCheck - _start + _START_OFFSET
1470 bl trap_reloc
1471 li r7,.L_DataStorage - _start + _START_OFFSET
1472 bl trap_reloc
1473 li r7,.L_InstStorage - _start + _START_OFFSET
1474 bl trap_reloc
1475 li r7,.L_ExtInterrupt - _start + _START_OFFSET
1476 bl trap_reloc
1477 li r7,.L_Alignment - _start + _START_OFFSET
1478 bl trap_reloc
1479 li r7,.L_ProgramCheck - _start + _START_OFFSET
1480 bl trap_reloc
1481 li r7,.L_FPUnavailable - _start + _START_OFFSET
1482 bl trap_reloc
1483 li r7,.L_Decrementer - _start + _START_OFFSET
1484 bl trap_reloc
1485 li r7,.L_IntervalTimer - _start + _START_OFFSET
1486 li r8,_end_of_vectors - _start + _START_OFFSET
14872:
1488 bl trap_reloc
1489 addi r7,r7,0x100
1490 cmplw 0,r7,r8
1491 blt 2b
1492
1493 lis r7,0x0
1494 mtspr IVPR,r7
1495
1496 mtlr r4
1497 blr
1498
1499.globl unlock_ram_in_cache
1500unlock_ram_in_cache:
1501
1502 lis r3,(CONFIG_SYS_INIT_RAM_ADDR & ~(CONFIG_SYS_CACHELINE_SIZE-1))@h
1503 ori r3,r3,(CONFIG_SYS_INIT_RAM_ADDR & ~(CONFIG_SYS_CACHELINE_SIZE-1))@l
1504 mfspr r4,L1CFG0
1505 andi. r4,r4,0x1ff
1506 slwi r4,r4,(10 - 1 - L1_CACHE_SHIFT)
1507 mtctr r4
15081: dcbi r0,r3
1509 addi r3,r3,CONFIG_SYS_CACHELINE_SIZE
1510 bdnz 1b
1511 sync
1512
1513
1514 lis r3,CONFIG_SYS_INIT_RAM_ADDR@h
1515 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
1516 tlbivax 0,r3
1517 addi r3,r3,0x1000
1518 tlbivax 0,r3
1519 addi r3,r3,0x1000
1520 tlbivax 0,r3
1521 addi r3,r3,0x1000
1522 tlbivax 0,r3
1523 isync
1524 blr
1525
1526.globl flush_dcache
1527flush_dcache:
1528 mfspr r3,SPRN_L1CFG0
1529
1530 rlwinm r5,r3,9,3
1531 twlgti r5,1
1532
1533
1534 li r4,32
1535 subfic r6,r5,2
1536
1537
1538 slw r5,r4,r5
1539
1540 rlwinm r7,r3,0,0xff
1541 mulli r7,r7,13
1542
1543
1544 slw r7,r7,r6
1545
1546
1547 mfspr r8,SPRN_HID0
1548 ori r9,r8,HID0_DCFA@l
1549 mtspr SPRN_HID0,r9
1550 isync
1551
1552 lis r4,0
1553 mtctr r7
1554
15551: lwz r3,0(r4)
1556 add r4,r4,r5
1557 bdnz 1b
1558
1559 msync
1560 lis r4,0
1561 mtctr r7
1562
15631: dcbf 0,r4
1564 add r4,r4,r5
1565 bdnz 1b
1566
1567
1568 mtspr SPRN_HID0,r8
1569 isync
1570
1571 blr
1572
1573.globl setup_ivors
1574setup_ivors:
1575
1576#include "fixed_ivor.S"
1577 blr
1578#endif
1579