Merge branch 'master' of git://www.denx.de/git/u-boot-ppc4xx
[platform/kernel/u-boot.git] / cpu / ppc4xx / start.S
1 /*
2  *  Copyright (C) 1998  Dan Malek <dmalek@jlc.net>
3  *  Copyright (C) 1999  Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
4  *  Copyright (C) 2000,2001,2002 Wolfgang Denk <wd@denx.de>
5  *  Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
6  *
7  * See file CREDITS for list of people who contributed to this
8  * project.
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License as
12  * published by the Free Software Foundation; either version 2 of
13  * the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23  * MA 02111-1307 USA
24  */
25 /*------------------------------------------------------------------------------+
26  *
27  *       This source code has been made available to you by IBM on an AS-IS
28  *       basis.  Anyone receiving this source is licensed under IBM
29  *       copyrights to use it in any way he or she deems fit, including
30  *       copying it, modifying it, compiling it, and redistributing it either
31  *       with or without modifications.  No license under IBM patents or
32  *       patent applications is to be implied by the copyright license.
33  *
34  *       Any user of this software should understand that IBM cannot provide
35  *       technical support for this software and will not be responsible for
36  *       any consequences resulting from the use of this software.
37  *
38  *       Any person who transfers this source code or any derivative work
39  *       must include the IBM copyright notice, this paragraph, and the
40  *       preceding two paragraphs in the transferred software.
41  *
42  *       COPYRIGHT   I B M   CORPORATION 1995
43  *       LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M
44  *-------------------------------------------------------------------------------
45  */
46
47 /*  U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
48  *
49  *
50  *  The processor starts at 0xfffffffc and the code is executed
51  *  from flash/rom.
52  *  in memory, but as long we don't jump around before relocating.
53  *  board_init lies at a quite high address and when the cpu has
54  *  jumped there, everything is ok.
55  *  This works because the cpu gives the FLASH (CS0) the whole
56  *  address space at startup, and board_init lies as a echo of
57  *  the flash somewhere up there in the memorymap.
58  *
59  *  board_init will change CS0 to be positioned at the correct
60  *  address and (s)dram will be positioned at address 0
61  */
62 #include <config.h>
63 #include <ppc4xx.h>
64 #include <version.h>
65
66 #define _LINUX_CONFIG_H 1       /* avoid reading Linux autoconf.h file  */
67
68 #include <ppc_asm.tmpl>
69 #include <ppc_defs.h>
70
71 #include <asm/cache.h>
72 #include <asm/mmu.h>
73
74 #ifndef  CONFIG_IDENT_STRING
75 #define  CONFIG_IDENT_STRING ""
76 #endif
77
78 #ifdef CFG_INIT_DCACHE_CS
79 # if (CFG_INIT_DCACHE_CS == 0)
80 #  define PBxAP pb0ap
81 #  define PBxCR pb0cr
82 # endif
83 # if (CFG_INIT_DCACHE_CS == 1)
84 #  define PBxAP pb1ap
85 #  define PBxCR pb1cr
86 # endif
87 # if (CFG_INIT_DCACHE_CS == 2)
88 #  define PBxAP pb2ap
89 #  define PBxCR pb2cr
90 # endif
91 # if (CFG_INIT_DCACHE_CS == 3)
92 #  define PBxAP pb3ap
93 #  define PBxCR pb3cr
94 # endif
95 # if (CFG_INIT_DCACHE_CS == 4)
96 #  define PBxAP pb4ap
97 #  define PBxCR pb4cr
98 # endif
99 # if (CFG_INIT_DCACHE_CS == 5)
100 #  define PBxAP pb5ap
101 #  define PBxCR pb5cr
102 # endif
103 # if (CFG_INIT_DCACHE_CS == 6)
104 #  define PBxAP pb6ap
105 #  define PBxCR pb6cr
106 # endif
107 # if (CFG_INIT_DCACHE_CS == 7)
108 #  define PBxAP pb7ap
109 #  define PBxCR pb7cr
110 # endif
111 #endif /* CFG_INIT_DCACHE_CS */
112
113 #if (defined(CFG_INIT_RAM_DCACHE) && (CFG_INIT_RAM_END > (4 << 10)))
114 #error Only 4k of init-ram is supported - please adjust CFG_INIT_RAM_END!
115 #endif
116
117 #define function_prolog(func_name)      .text; \
118                                         .align 2; \
119                                         .globl func_name; \
120                                         func_name:
121 #define function_epilog(func_name)      .type func_name,@function; \
122                                         .size func_name,.-func_name
123
124 /* We don't want the  MMU yet.
125 */
126 #undef  MSR_KERNEL
127 #define MSR_KERNEL ( MSR_ME  )  /* Machine Check */
128
129
130         .extern ext_bus_cntlr_init
131         .extern sdram_init
132 #ifdef CONFIG_NAND_U_BOOT
133         .extern reconfig_tlb0
134 #endif
135
136 /*
137  * Set up GOT: Global Offset Table
138  *
139  * Use r14 to access the GOT
140  */
141 #if !defined(CONFIG_NAND_SPL)
142         START_GOT
143         GOT_ENTRY(_GOT2_TABLE_)
144         GOT_ENTRY(_FIXUP_TABLE_)
145
146         GOT_ENTRY(_start)
147         GOT_ENTRY(_start_of_vectors)
148         GOT_ENTRY(_end_of_vectors)
149         GOT_ENTRY(transfer_to_handler)
150
151         GOT_ENTRY(__init_end)
152         GOT_ENTRY(_end)
153         GOT_ENTRY(__bss_start)
154         END_GOT
155 #endif /* CONFIG_NAND_SPL */
156
157 #if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
158         /*
159          * NAND U-Boot image is started from offset 0
160          */
161         .text
162 #if defined(CONFIG_440)
163         bl      reconfig_tlb0
164 #endif
165         GET_GOT
166         bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
167         bl      board_init_f
168 #endif
169
170 /*
171  * 440 Startup -- on reset only the top 4k of the effective
172  * address space is mapped in by an entry in the instruction
173  * and data shadow TLB. The .bootpg section is located in the
174  * top 4k & does only what's necessary to map in the the rest
175  * of the boot rom. Once the boot rom is mapped in we can
176  * proceed with normal startup.
177  *
178  * NOTE: CS0 only covers the top 2MB of the effective address
179  * space after reset.
180  */
181
182 #if defined(CONFIG_440)
183 #if !defined(CONFIG_NAND_SPL)
184     .section .bootpg,"ax"
185 #endif
186     .globl _start_440
187
188 /**************************************************************************/
189 _start_440:
190         /*--------------------------------------------------------------------+
191         | 440EPX BUP Change - Hardware team request
192         +--------------------------------------------------------------------*/
193 #if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
194         sync
195         nop
196         nop
197 #endif
198         /*----------------------------------------------------------------+
199         | Core bug fix.  Clear the esr
200         +-----------------------------------------------------------------*/
201         li      r0,0
202         mtspr   esr,r0
203         /*----------------------------------------------------------------*/
204         /* Clear and set up some registers. */
205         /*----------------------------------------------------------------*/
206         iccci   r0,r0           /* NOTE: operands not used for 440 */
207         dccci   r0,r0           /* NOTE: operands not used for 440 */
208         sync
209         li      r0,0
210         mtspr   srr0,r0
211         mtspr   srr1,r0
212         mtspr   csrr0,r0
213         mtspr   csrr1,r0
214         /* NOTE: 440GX adds machine check status regs */
215 #if defined(CONFIG_440) && !defined(CONFIG_440GP)
216         mtspr   mcsrr0,r0
217         mtspr   mcsrr1,r0
218         mfspr   r1,mcsr
219         mtspr   mcsr,r1
220 #endif
221
222         /*----------------------------------------------------------------*/
223         /* CCR0 init */
224         /*----------------------------------------------------------------*/
225         /* Disable store gathering & broadcast, guarantee inst/data
226         * cache block touch, force load/store alignment
227         * (see errata 1.12: 440_33)
228         */
229         lis     r1,0x0030       /* store gathering & broadcast disable */
230         ori     r1,r1,0x6000    /* cache touch */
231         mtspr   ccr0,r1
232
233         /*----------------------------------------------------------------*/
234         /* Initialize debug */
235         /*----------------------------------------------------------------*/
236         mfspr   r1,dbcr0
237         andis.  r1, r1, 0x8000  /* test DBCR0[EDM] bit                  */
238         bne     skip_debug_init /* if set, don't clear debug register   */
239         mtspr   dbcr0,r0
240         mtspr   dbcr1,r0
241         mtspr   dbcr2,r0
242         mtspr   iac1,r0
243         mtspr   iac2,r0
244         mtspr   iac3,r0
245         mtspr   dac1,r0
246         mtspr   dac2,r0
247         mtspr   dvc1,r0
248         mtspr   dvc2,r0
249
250         mfspr   r1,dbsr
251         mtspr   dbsr,r1         /* Clear all valid bits */
252 skip_debug_init:
253
254 #if defined (CONFIG_440SPE)
255         /*----------------------------------------------------------------+
256         | Initialize Core Configuration Reg1.
257         | a. ICDPEI: Record even parity. Normal operation.
258         | b. ICTPEI: Record even parity. Normal operation.
259         | c. DCTPEI: Record even parity. Normal operation.
260         | d. DCDPEI: Record even parity. Normal operation.
261         | e. DCUPEI: Record even parity. Normal operation.
262         | f. DCMPEI: Record even parity. Normal operation.
263         | g. FCOM:   Normal operation
264         | h. MMUPEI: Record even parity. Normal operation.
265         | i. FFF:    Flush only as much data as necessary.
266         | j. TCS:    Timebase increments from CPU clock.
267         +-----------------------------------------------------------------*/
268         li      r0,0
269         mtspr   ccr1, r0
270
271         /*----------------------------------------------------------------+
272         | Reset the timebase.
273         | The previous write to CCR1 sets the timebase source.
274         +-----------------------------------------------------------------*/
275         mtspr   tbl, r0
276         mtspr   tbu, r0
277 #endif
278
279         /*----------------------------------------------------------------*/
280         /* Setup interrupt vectors */
281         /*----------------------------------------------------------------*/
282         mtspr   ivpr,r0         /* Vectors start at 0x0000_0000 */
283         li      r1,0x0100
284         mtspr   ivor0,r1        /* Critical input */
285         li      r1,0x0200
286         mtspr   ivor1,r1        /* Machine check */
287         li      r1,0x0300
288         mtspr   ivor2,r1        /* Data storage */
289         li      r1,0x0400
290         mtspr   ivor3,r1        /* Instruction storage */
291         li      r1,0x0500
292         mtspr   ivor4,r1        /* External interrupt */
293         li      r1,0x0600
294         mtspr   ivor5,r1        /* Alignment */
295         li      r1,0x0700
296         mtspr   ivor6,r1        /* Program check */
297         li      r1,0x0800
298         mtspr   ivor7,r1        /* Floating point unavailable */
299         li      r1,0x0c00
300         mtspr   ivor8,r1        /* System call */
301         li      r1,0x0a00
302         mtspr   ivor9,r1        /* Auxiliary Processor unavailable */
303         li      r1,0x0900
304         mtspr   ivor10,r1       /* Decrementer */
305         li      r1,0x1300
306         mtspr   ivor13,r1       /* Data TLB error */
307         li      r1,0x1400
308         mtspr   ivor14,r1       /* Instr TLB error */
309         li      r1,0x2000
310         mtspr   ivor15,r1       /* Debug */
311
312         /*----------------------------------------------------------------*/
313         /* Configure cache regions  */
314         /*----------------------------------------------------------------*/
315         mtspr   inv0,r0
316         mtspr   inv1,r0
317         mtspr   inv2,r0
318         mtspr   inv3,r0
319         mtspr   dnv0,r0
320         mtspr   dnv1,r0
321         mtspr   dnv2,r0
322         mtspr   dnv3,r0
323         mtspr   itv0,r0
324         mtspr   itv1,r0
325         mtspr   itv2,r0
326         mtspr   itv3,r0
327         mtspr   dtv0,r0
328         mtspr   dtv1,r0
329         mtspr   dtv2,r0
330         mtspr   dtv3,r0
331
332         /*----------------------------------------------------------------*/
333         /* Cache victim limits */
334         /*----------------------------------------------------------------*/
335         /* floors 0, ceiling max to use the entire cache -- nothing locked
336         */
337         lis     r1,0x0001
338         ori     r1,r1,0xf800
339         mtspr   ivlim,r1
340         mtspr   dvlim,r1
341
342         /*----------------------------------------------------------------+
343         |Initialize MMUCR[STID] = 0.
344         +-----------------------------------------------------------------*/
345         mfspr   r0,mmucr
346         addis   r1,0,0xFFFF
347         ori     r1,r1,0xFF00
348         and     r0,r0,r1
349         mtspr   mmucr,r0
350
351         /*----------------------------------------------------------------*/
352         /* Clear all TLB entries -- TID = 0, TS = 0 */
353         /*----------------------------------------------------------------*/
354         addis   r0,0,0x0000
355         li      r1,0x003f       /* 64 TLB entries */
356         mtctr   r1
357 rsttlb: tlbwe   r0,r1,0x0000    /* Invalidate all entries (V=0)*/
358         tlbwe   r0,r1,0x0001
359         tlbwe   r0,r1,0x0002
360         subi    r1,r1,0x0001
361         bdnz    rsttlb
362
363         /*----------------------------------------------------------------*/
364         /* TLB entry setup -- step thru tlbtab */
365         /*----------------------------------------------------------------*/
366 #if defined(CONFIG_440SPE)
367         /*----------------------------------------------------------------*/
368         /* We have different TLB tables for revA and rev B of 440SPe */
369         /*----------------------------------------------------------------*/
370         mfspr   r1, PVR
371         lis     r0,0x5342
372         ori     r0,r0,0x1891
373         cmpw    r7,r1,r0
374         bne     r7,..revA
375         bl      tlbtabB
376         b       ..goon
377 ..revA:
378         bl      tlbtabA
379 ..goon:
380 #else
381         bl      tlbtab          /* Get tlbtab pointer */
382 #endif
383         mr      r5,r0
384         li      r1,0x003f       /* 64 TLB entries max */
385         mtctr   r1
386         li      r4,0            /* TLB # */
387
388         addi    r5,r5,-4
389 1:      lwzu    r0,4(r5)
390         cmpwi   r0,0
391         beq     2f              /* 0 marks end */
392         lwzu    r1,4(r5)
393         lwzu    r2,4(r5)
394         tlbwe   r0,r4,0         /* TLB Word 0 */
395         tlbwe   r1,r4,1         /* TLB Word 1 */
396         tlbwe   r2,r4,2         /* TLB Word 2 */
397         addi    r4,r4,1         /* Next TLB */
398         bdnz    1b
399
400         /*----------------------------------------------------------------*/
401         /* Continue from 'normal' start */
402         /*----------------------------------------------------------------*/
403 2:
404
405 #if defined(CONFIG_NAND_SPL)
406 #if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
407         /*
408          * Enable internal SRAM (only on 440EPx/GRx, 440EP/GR have no OCM)
409          */
410         lis     r2,0x7fff
411         ori     r2,r2,0xffff
412         mfdcr   r1,isram0_dpc
413         and     r1,r1,r2                /* Disable parity check */
414         mtdcr   isram0_dpc,r1
415         mfdcr   r1,isram0_pmeg
416         and     r1,r1,r2                /* Disable pwr mgmt */
417         mtdcr   isram0_pmeg,r1
418 #endif
419 #if defined(CONFIG_440EP)
420         /*
421          * On 440EP with no internal SRAM, we setup SDRAM very early
422          * and copy the NAND_SPL to SDRAM and jump to it
423          */
424         /* Clear Dcache to use as RAM */
425         addis   r3,r0,CFG_INIT_RAM_ADDR@h
426         ori     r3,r3,CFG_INIT_RAM_ADDR@l
427         addis   r4,r0,CFG_INIT_RAM_END@h
428         ori     r4,r4,CFG_INIT_RAM_END@l
429         rlwinm. r5,r4,0,27,31
430         rlwinm  r5,r4,27,5,31
431         beq     ..d_ran3
432         addi    r5,r5,0x0001
433 ..d_ran3:
434         mtctr   r5
435 ..d_ag3:
436         dcbz    r0,r3
437         addi    r3,r3,32
438         bdnz    ..d_ag3
439         /*----------------------------------------------------------------*/
440         /* Setup the stack in internal SRAM */
441         /*----------------------------------------------------------------*/
442         lis     r1,CFG_INIT_RAM_ADDR@h
443         ori     r1,r1,CFG_INIT_SP_OFFSET@l
444         li      r0,0
445         stwu    r0,-4(r1)
446         stwu    r0,-4(r1)               /* Terminate call chain */
447
448         stwu    r1,-8(r1)               /* Save back chain and move SP */
449         lis     r0,RESET_VECTOR@h       /* Address of reset vector */
450         ori     r0,r0, RESET_VECTOR@l
451         stwu    r1,-8(r1)               /* Save back chain and move SP */
452         stw     r0,+12(r1)              /* Save return addr (underflow vect) */
453         sync
454         bl      early_sdram_init
455         sync
456 #endif /* CONFIG_440EP */
457
458         /*
459          * Copy SPL from cache into internal SRAM
460          */
461         li      r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
462         mtctr   r4
463         lis     r2,CFG_NAND_BOOT_SPL_SRC@h
464         ori     r2,r2,CFG_NAND_BOOT_SPL_SRC@l
465         lis     r3,CFG_NAND_BOOT_SPL_DST@h
466         ori     r3,r3,CFG_NAND_BOOT_SPL_DST@l
467 spl_loop:
468         lwzu    r4,4(r2)
469         stwu    r4,4(r3)
470         bdnz    spl_loop
471
472         /*
473          * Jump to code in RAM
474          */
475         bl      00f
476 00:     mflr    r10
477         lis     r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
478         ori     r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
479         sub     r10,r10,r3
480         addi    r10,r10,28
481         mtlr    r10
482         blr
483
484 start_ram:
485         sync
486         isync
487 #endif /* CONFIG_NAND_SPL */
488
489         bl      3f
490         b       _start
491
492 3:      li      r0,0
493         mtspr   srr1,r0         /* Keep things disabled for now */
494         mflr    r1
495         mtspr   srr0,r1
496         rfi
497 #endif /* CONFIG_440 */
498
499 /*
500  * r3 - 1st arg to board_init(): IMMP pointer
501  * r4 - 2nd arg to board_init(): boot flag
502  */
503 #ifndef CONFIG_NAND_SPL
504         .text
505         .long   0x27051956              /* U-Boot Magic Number                  */
506         .globl  version_string
507 version_string:
508         .ascii U_BOOT_VERSION
509         .ascii " (", __DATE__, " - ", __TIME__, ")"
510         .ascii CONFIG_IDENT_STRING, "\0"
511
512         . = EXC_OFF_SYS_RESET
513         .globl  _start_of_vectors
514 _start_of_vectors:
515
516 /* Critical input. */
517         CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
518
519 #ifdef CONFIG_440
520 /* Machine check */
521         MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
522 #else
523         CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
524 #endif /* CONFIG_440 */
525
526 /* Data Storage exception. */
527         STD_EXCEPTION(0x300, DataStorage, UnknownException)
528
529 /* Instruction Storage exception. */
530         STD_EXCEPTION(0x400, InstStorage, UnknownException)
531
532 /* External Interrupt exception. */
533         STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
534
535 /* Alignment exception. */
536         . = 0x600
537 Alignment:
538         EXCEPTION_PROLOG(SRR0, SRR1)
539         mfspr   r4,DAR
540         stw     r4,_DAR(r21)
541         mfspr   r5,DSISR
542         stw     r5,_DSISR(r21)
543         addi    r3,r1,STACK_FRAME_OVERHEAD
544         li      r20,MSR_KERNEL
545         rlwimi  r20,r23,0,16,16         /* copy EE bit from saved MSR */
546         lwz     r6,GOT(transfer_to_handler)
547         mtlr    r6
548         blrl
549 .L_Alignment:
550         .long   AlignmentException - _start + _START_OFFSET
551         .long   int_return - _start + _START_OFFSET
552
553 /* Program check exception */
554         . = 0x700
555 ProgramCheck:
556         EXCEPTION_PROLOG(SRR0, SRR1)
557         addi    r3,r1,STACK_FRAME_OVERHEAD
558         li      r20,MSR_KERNEL
559         rlwimi  r20,r23,0,16,16         /* copy EE bit from saved MSR */
560         lwz     r6,GOT(transfer_to_handler)
561         mtlr    r6
562         blrl
563 .L_ProgramCheck:
564         .long   ProgramCheckException - _start + _START_OFFSET
565         .long   int_return - _start + _START_OFFSET
566
567 #ifdef CONFIG_440
568         STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
569         STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
570         STD_EXCEPTION(0xa00, APU, UnknownException)
571 #endif
572         STD_EXCEPTION(0xc00, SystemCall, UnknownException)
573
574 #ifdef CONFIG_440
575         STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
576         STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
577 #else
578         STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
579         STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
580         STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
581 #endif
582         CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
583
584         .globl  _end_of_vectors
585 _end_of_vectors:
586         . = _START_OFFSET
587 #endif
588         .globl  _start
589 _start:
590
591 /*****************************************************************************/
592 #if defined(CONFIG_440)
593
594         /*----------------------------------------------------------------*/
595         /* Clear and set up some registers. */
596         /*----------------------------------------------------------------*/
597         li      r0,0x0000
598         lis     r1,0xffff
599         mtspr   dec,r0                  /* prevent dec exceptions */
600         mtspr   tbl,r0                  /* prevent fit & wdt exceptions */
601         mtspr   tbu,r0
602         mtspr   tsr,r1                  /* clear all timer exception status */
603         mtspr   tcr,r0                  /* disable all */
604         mtspr   esr,r0                  /* clear exception syndrome register */
605         mtxer   r0                      /* clear integer exception register */
606
607         /*----------------------------------------------------------------*/
608         /* Debug setup -- some (not very good) ice's need an event*/
609         /* to establish control :-( Define CFG_INIT_DBCR to the dbsr */
610         /* value you need in this case 0x8cff 0000 should do the trick */
611         /*----------------------------------------------------------------*/
612 #if defined(CFG_INIT_DBCR)
613         lis     r1,0xffff
614         ori     r1,r1,0xffff
615         mtspr   dbsr,r1                 /* Clear all status bits */
616         lis     r0,CFG_INIT_DBCR@h
617         ori     r0,r0,CFG_INIT_DBCR@l
618         mtspr   dbcr0,r0
619         isync
620 #endif
621
622         /*----------------------------------------------------------------*/
623         /* Setup the internal SRAM */
624         /*----------------------------------------------------------------*/
625         li      r0,0
626
627 #ifdef CFG_INIT_RAM_DCACHE
628         /* Clear Dcache to use as RAM */
629         addis   r3,r0,CFG_INIT_RAM_ADDR@h
630         ori     r3,r3,CFG_INIT_RAM_ADDR@l
631         addis   r4,r0,CFG_INIT_RAM_END@h
632         ori     r4,r4,CFG_INIT_RAM_END@l
633         rlwinm. r5,r4,0,27,31
634         rlwinm  r5,r4,27,5,31
635         beq     ..d_ran
636         addi    r5,r5,0x0001
637 ..d_ran:
638         mtctr   r5
639 ..d_ag:
640         dcbz    r0,r3
641         addi    r3,r3,32
642         bdnz    ..d_ag
643
644         /*
645          * Lock the init-ram/stack in d-cache, so that other regions
646          * may use d-cache as well
647          * Note, that this current implementation locks exactly 4k
648          * of d-cache, so please make sure that you don't define a
649          * bigger init-ram area. Take a look at the lwmon5 440EPx
650          * implementation as a reference.
651          */
652         msync
653         isync
654         /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
655         lis     r1,0x0201
656         ori     r1,r1,0xf808
657         mtspr   dvlim,r1
658         lis     r1,0x0808
659         ori     r1,r1,0x0808
660         mtspr   dnv0,r1
661         mtspr   dnv1,r1
662         mtspr   dnv2,r1
663         mtspr   dnv3,r1
664         mtspr   dtv0,r1
665         mtspr   dtv1,r1
666         mtspr   dtv2,r1
667         mtspr   dtv3,r1
668         msync
669         isync
670 #endif /* CFG_INIT_RAM_DCACHE */
671
672         /* 440EP & 440GR are only 440er PPC's without internal SRAM */
673 #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
674         /* not all PPC's have internal SRAM usable as L2-cache */
675 #if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
676         mtdcr   l2_cache_cfg,r0         /* Ensure L2 Cache is off */
677 #endif
678
679         lis     r2,0x7fff
680         ori     r2,r2,0xffff
681         mfdcr   r1,isram0_dpc
682         and     r1,r1,r2                /* Disable parity check */
683         mtdcr   isram0_dpc,r1
684         mfdcr   r1,isram0_pmeg
685         and     r1,r1,r2                /* Disable pwr mgmt */
686         mtdcr   isram0_pmeg,r1
687
688         lis     r1,0x8000               /* BAS = 8000_0000 */
689 #if defined(CONFIG_440GX) || defined(CONFIG_440SP)
690         ori     r1,r1,0x0980            /* first 64k */
691         mtdcr   isram0_sb0cr,r1
692         lis     r1,0x8001
693         ori     r1,r1,0x0980            /* second 64k */
694         mtdcr   isram0_sb1cr,r1
695         lis     r1, 0x8002
696         ori     r1,r1, 0x0980           /* third 64k */
697         mtdcr   isram0_sb2cr,r1
698         lis     r1, 0x8003
699         ori     r1,r1, 0x0980           /* fourth 64k */
700         mtdcr   isram0_sb3cr,r1
701 #elif defined(CONFIG_440SPE)
702         lis     r1,0x0000               /* BAS = 0000_0000 */
703         ori     r1,r1,0x0984            /* first 64k */
704         mtdcr   isram0_sb0cr,r1
705         lis     r1,0x0001
706         ori     r1,r1,0x0984            /* second 64k */
707         mtdcr   isram0_sb1cr,r1
708         lis     r1, 0x0002
709         ori     r1,r1, 0x0984           /* third 64k */
710         mtdcr   isram0_sb2cr,r1
711         lis     r1, 0x0003
712         ori     r1,r1, 0x0984           /* fourth 64k */
713         mtdcr   isram0_sb3cr,r1
714 #elif defined(CONFIG_440GP)
715         ori     r1,r1,0x0380            /* 8k rw */
716         mtdcr   isram0_sb0cr,r1
717         mtdcr   isram0_sb1cr,r0         /* Disable bank 1 */
718 #endif
719 #endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
720
721         /*----------------------------------------------------------------*/
722         /* Setup the stack in internal SRAM */
723         /*----------------------------------------------------------------*/
724         lis     r1,CFG_INIT_RAM_ADDR@h
725         ori     r1,r1,CFG_INIT_SP_OFFSET@l
726         li      r0,0
727         stwu    r0,-4(r1)
728         stwu    r0,-4(r1)               /* Terminate call chain */
729
730         stwu    r1,-8(r1)               /* Save back chain and move SP */
731         lis     r0,RESET_VECTOR@h       /* Address of reset vector */
732         ori     r0,r0, RESET_VECTOR@l
733         stwu    r1,-8(r1)               /* Save back chain and move SP */
734         stw     r0,+12(r1)              /* Save return addr (underflow vect) */
735
736 #ifdef CONFIG_NAND_SPL
737         bl      nand_boot               /* will not return */
738 #else
739         GET_GOT
740
741         bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
742         bl      board_init_f
743 #endif
744
745 #endif /* CONFIG_440 */
746
747 /*****************************************************************************/
748 #ifdef CONFIG_IOP480
749         /*----------------------------------------------------------------------- */
750         /* Set up some machine state registers. */
751         /*----------------------------------------------------------------------- */
752         addi    r0,r0,0x0000            /* initialize r0 to zero */
753         mtspr   esr,r0                  /* clear Exception Syndrome Reg */
754         mttcr   r0                      /* timer control register */
755         mtexier r0                      /* disable all interrupts */
756         addis   r4,r0,0xFFFF            /* set r4 to 0xFFFFFFFF (status in the */
757         ori     r4,r4,0xFFFF            /* dbsr is cleared by setting bits to 1) */
758         mtdbsr  r4                      /* clear/reset the dbsr */
759         mtexisr r4                      /* clear all pending interrupts */
760         addis   r4,r0,0x8000
761         mtexier r4                      /* enable critical exceptions */
762         addis   r4,r0,0x0000            /* assume 403GCX - enable core clk */
763         ori     r4,r4,0x4020            /* dbling (no harm done on GA and GC */
764         mtiocr  r4                      /* since bit not used) & DRC to latch */
765                                         /* data bus on rising edge of CAS */
766         /*----------------------------------------------------------------------- */
767         /* Clear XER. */
768         /*----------------------------------------------------------------------- */
769         mtxer   r0
770         /*----------------------------------------------------------------------- */
771         /* Invalidate i-cache and d-cache TAG arrays. */
772         /*----------------------------------------------------------------------- */
773         addi    r3,0,1024               /* 1/4 of I-cache size, half of D-cache */
774         addi    r4,0,1024               /* 1/4 of I-cache */
775 ..cloop:
776         iccci   0,r3
777         iccci   r4,r3
778         dccci   0,r3
779         addic.  r3,r3,-16               /* move back one cache line */
780         bne     ..cloop                 /* loop back to do rest until r3 = 0 */
781
782         /* */
783         /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
784         /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
785         /* */
786
787         /* first copy IOP480 register base address into r3 */
788         addis   r3,0,0x5000             /* IOP480 register base address hi */
789 /*      ori     r3,r3,0x0000            /  IOP480 register base address lo */
790
791 #ifdef CONFIG_ADCIOP
792         /* use r4 as the working variable */
793         /* turn on CS3 (LOCCTL.7) */
794         lwz     r4,0x84(r3)             /* LOCTL is at offset 0x84 */
795         andi.   r4,r4,0xff7f            /* make bit 7 = 0 -- CS3 mode */
796         stw     r4,0x84(r3)             /* LOCTL is at offset 0x84 */
797 #endif
798
799 #ifdef CONFIG_DASA_SIM
800         /* use r4 as the working variable */
801         /* turn on MA17 (LOCCTL.7) */
802         lwz     r4,0x84(r3)             /* LOCTL is at offset 0x84 */
803         ori     r4,r4,0x80              /* make bit 7 = 1 -- MA17 mode */
804         stw     r4,0x84(r3)             /* LOCTL is at offset 0x84 */
805 #endif
806
807         /* turn on MA16..13 (LCS0BRD.12 = 0) */
808         lwz     r4,0x100(r3)            /* LCS0BRD is at offset 0x100 */
809         andi.   r4,r4,0xefff            /* make bit 12 = 0 */
810         stw     r4,0x100(r3)            /* LCS0BRD is at offset 0x100 */
811
812         /* make sure above stores all comlete before going on */
813         sync
814
815         /* last thing, set local init status done bit (DEVINIT.31) */
816         lwz     r4,0x80(r3)             /* DEVINIT is at offset 0x80 */
817         oris    r4,r4,0x8000            /* make bit 31 = 1 */
818         stw     r4,0x80(r3)             /* DEVINIT is at offset 0x80 */
819
820         /* clear all pending interrupts and disable all interrupts */
821         li      r4,-1                   /* set p1 to 0xffffffff */
822         stw     r4,0x1b0(r3)            /* clear all pending interrupts */
823         stw     r4,0x1b8(r3)            /* clear all pending interrupts */
824         li      r4,0                    /* set r4 to 0 */
825         stw     r4,0x1b4(r3)            /* disable all interrupts */
826         stw     r4,0x1bc(r3)            /* disable all interrupts */
827
828         /* make sure above stores all comlete before going on */
829         sync
830
831         /*----------------------------------------------------------------------- */
832         /* Enable two 128MB cachable regions. */
833         /*----------------------------------------------------------------------- */
834         addis   r1,r0,0xc000
835         addi    r1,r1,0x0001
836         mticcr  r1                      /* instruction cache */
837
838         addis   r1,r0,0x0000
839         addi    r1,r1,0x0000
840         mtdccr  r1                      /* data cache */
841
842         addis   r1,r0,CFG_INIT_RAM_ADDR@h
843         ori     r1,r1,CFG_INIT_SP_OFFSET          /* set up the stack to SDRAM */
844         li      r0, 0                   /* Make room for stack frame header and */
845         stwu    r0, -4(r1)              /* clear final stack frame so that      */
846         stwu    r0, -4(r1)              /* stack backtraces terminate cleanly   */
847
848         GET_GOT                 /* initialize GOT access                        */
849
850         bl      board_init_f    /* run first part of init code (from Flash)     */
851
852 #endif  /* CONFIG_IOP480 */
853
854 /*****************************************************************************/
855 #if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
856     defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
857     defined(CONFIG_405EX) || defined(CONFIG_405)
858         /*----------------------------------------------------------------------- */
859         /* Clear and set up some registers. */
860         /*----------------------------------------------------------------------- */
861         addi    r4,r0,0x0000
862 #if !defined(CONFIG_405EX)
863         mtspr   sgr,r4
864 #else
865         /*
866          * On 405EX, completely clearing the SGR leads to PPC hangup
867          * upon PCIe configuration access. The PCIe memory regions
868          * need to be guarded!
869          */
870         lis     r3,0x0000
871         ori     r3,r3,0x7FFC
872         mtspr   sgr,r3
873 #endif
874         mtspr   dcwr,r4
875         mtesr   r4                      /* clear Exception Syndrome Reg */
876         mttcr   r4                      /* clear Timer Control Reg */
877         mtxer   r4                      /* clear Fixed-Point Exception Reg */
878         mtevpr  r4                      /* clear Exception Vector Prefix Reg */
879         addi    r4,r0,(0xFFFF-0x10000)          /* set r4 to 0xFFFFFFFF (status in the */
880                                         /* dbsr is cleared by setting bits to 1) */
881         mtdbsr  r4                      /* clear/reset the dbsr */
882
883         /*----------------------------------------------------------------------- */
884         /* Invalidate I and D caches. Enable I cache for defined memory regions */
885         /* to speed things up. Leave the D cache disabled for now. It will be */
886         /* enabled/left disabled later based on user selected menu options. */
887         /* Be aware that the I cache may be disabled later based on the menu */
888         /* options as well. See miscLib/main.c. */
889         /*----------------------------------------------------------------------- */
890         bl      invalidate_icache
891         bl      invalidate_dcache
892
893         /*----------------------------------------------------------------------- */
894         /* Enable two 128MB cachable regions. */
895         /*----------------------------------------------------------------------- */
896         lis     r4,0xc000
897         ori     r4,r4,0x0001
898         mticcr  r4                      /* instruction cache */
899         isync
900
901         lis     r4,0x0000
902         ori     r4,r4,0x0000
903         mtdccr  r4                      /* data cache */
904
905 #if !(defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR)) || defined(CONFIG_405EX)
906         /*----------------------------------------------------------------------- */
907         /* Tune the speed and size for flash CS0  */
908         /*----------------------------------------------------------------------- */
909         bl      ext_bus_cntlr_init
910 #endif
911 #if !(defined(CFG_INIT_DCACHE_CS) || defined(CFG_TEMP_STACK_OCM))
912         /*
913          * Boards like the Kilauea (405EX) don't have OCM and can't use
914          * DCache for init-ram. So setup stack here directly after the
915          * SDRAM is initialized.
916          */
917         lis     r1, CFG_INIT_RAM_ADDR@h
918         ori     r1,r1,CFG_INIT_SP_OFFSET /* set up the stack in SDRAM */
919
920         li      r0, 0                   /* Make room for stack frame header and */
921         stwu    r0, -4(r1)              /* clear final stack frame so that      */
922         stwu    r0, -4(r1)              /* stack backtraces terminate cleanly   */
923         /*
924          * Set up a dummy frame to store reset vector as return address.
925          * this causes stack underflow to reset board.
926          */
927         stwu    r1, -8(r1)              /* Save back chain and move SP */
928         lis     r0, RESET_VECTOR@h      /* Address of reset vector */
929         ori     r0, r0, RESET_VECTOR@l
930         stwu    r1, -8(r1)              /* Save back chain and move SP */
931         stw     r0, +12(r1)             /* Save return addr (underflow vect) */
932 #endif /* !(CFG_INIT_DCACHE_CS  || !CFG_TEM_STACK_OCM) */
933
934 #if defined(CONFIG_405EP)
935         /*----------------------------------------------------------------------- */
936         /* DMA Status, clear to come up clean */
937         /*----------------------------------------------------------------------- */
938         addis   r3,r0, 0xFFFF         /* Clear all existing DMA status */
939         ori     r3,r3, 0xFFFF
940         mtdcr   dmasr, r3
941
942         bl      ppc405ep_init         /* do ppc405ep specific init */
943 #endif /* CONFIG_405EP */
944
945 #if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)
946 #if defined(CONFIG_405EZ)
947         /********************************************************************
948          * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
949          *******************************************************************/
950         /*
951          * We can map the OCM on the PLB3, so map it at
952          * CFG_OCM_DATA_ADDR + 0x8000
953          */
954         lis     r3,CFG_OCM_DATA_ADDR@h  /* OCM location */
955         ori     r3,r3,CFG_OCM_DATA_ADDR@l
956         ori     r3,r3,0x0270            /* 16K for Bank 1, R/W/Enable */
957         mtdcr   ocmplb3cr1,r3           /* Set PLB Access */
958         ori     r3,r3,0x4000            /* Add 0x4000 for bank 2 */
959         mtdcr   ocmplb3cr2,r3           /* Set PLB Access */
960         isync
961
962         lis     r3,CFG_OCM_DATA_ADDR@h  /* OCM location */
963         ori     r3,r3,CFG_OCM_DATA_ADDR@l
964         ori     r3,r3,0x0270            /* 16K for Bank 1, R/W/Enable */
965         mtdcr   ocmdscr1, r3            /* Set Data Side */
966         mtdcr   ocmiscr1, r3            /* Set Instruction Side */
967         ori     r3,r3,0x4000            /* Add 0x4000 for bank 2 */
968         mtdcr   ocmdscr2, r3            /* Set Data Side */
969         mtdcr   ocmiscr2, r3            /* Set Instruction Side */
970         addis   r3,0,0x0800             /* OCM Data Parity Disable - 1 Wait State */
971         mtdcr   ocmdsisdpc,r3
972
973         isync
974 #else /* CONFIG_405EZ */
975         /********************************************************************
976          * Setup OCM - On Chip Memory
977          *******************************************************************/
978         /* Setup OCM */
979         lis     r0, 0x7FFF
980         ori     r0, r0, 0xFFFF
981         mfdcr   r3, ocmiscntl           /* get instr-side IRAM config */
982         mfdcr   r4, ocmdscntl           /* get data-side IRAM config */
983         and     r3, r3, r0              /* disable data-side IRAM */
984         and     r4, r4, r0              /* disable data-side IRAM */
985         mtdcr   ocmiscntl, r3           /* set instr-side IRAM config */
986         mtdcr   ocmdscntl, r4           /* set data-side IRAM config */
987         isync
988
989         lis     r3,CFG_OCM_DATA_ADDR@h  /* OCM location */
990         ori     r3,r3,CFG_OCM_DATA_ADDR@l
991         mtdcr   ocmdsarc, r3
992         addis   r4, 0, 0xC000           /* OCM data area enabled */
993         mtdcr   ocmdscntl, r4
994         isync
995 #endif /* CONFIG_405EZ */
996 #endif
997
998 #ifdef CONFIG_NAND_SPL
999         /*
1000          * Copy SPL from cache into internal SRAM
1001          */
1002         li      r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
1003         mtctr   r4
1004         lis     r2,CFG_NAND_BOOT_SPL_SRC@h
1005         ori     r2,r2,CFG_NAND_BOOT_SPL_SRC@l
1006         lis     r3,CFG_NAND_BOOT_SPL_DST@h
1007         ori     r3,r3,CFG_NAND_BOOT_SPL_DST@l
1008 spl_loop:
1009         lwzu    r4,4(r2)
1010         stwu    r4,4(r3)
1011         bdnz    spl_loop
1012
1013         /*
1014          * Jump to code in RAM
1015          */
1016         bl      00f
1017 00:     mflr    r10
1018         lis     r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
1019         ori     r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
1020         sub     r10,r10,r3
1021         addi    r10,r10,28
1022         mtlr    r10
1023         blr
1024
1025 start_ram:
1026         sync
1027         isync
1028 #endif /* CONFIG_NAND_SPL */
1029
1030         /*----------------------------------------------------------------------- */
1031         /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1032         /*----------------------------------------------------------------------- */
1033 #ifdef CFG_INIT_DCACHE_CS
1034         /*----------------------------------------------------------------------- */
1035         /* Memory Bank x (nothingness) initialization 1GB+64MEG */
1036         /* used as temporary stack pointer for stage0  */
1037         /*----------------------------------------------------------------------- */
1038         li      r4,PBxAP
1039         mtdcr   ebccfga,r4
1040         lis     r4,0x0380
1041         ori     r4,r4,0x0480
1042         mtdcr   ebccfgd,r4
1043
1044         addi    r4,0,PBxCR
1045         mtdcr   ebccfga,r4
1046         lis     r4,0x400D
1047         ori     r4,r4,0xa000
1048         mtdcr   ebccfgd,r4
1049
1050         /* turn on data cache for this region */
1051         lis     r4,0x0080
1052         mtdccr  r4
1053
1054         /* set stack pointer and clear stack to known value */
1055
1056         lis     r1,CFG_INIT_RAM_ADDR@h
1057         ori     r1,r1,CFG_INIT_SP_OFFSET@l
1058
1059         li      r4,2048                 /* we store 2048 words to stack */
1060         mtctr   r4
1061
1062         lis     r2,CFG_INIT_RAM_ADDR@h          /* we also clear data area */
1063         ori     r2,r2,CFG_INIT_RAM_END@l        /* so cant copy value from r1 */
1064
1065         lis     r4,0xdead               /* we store 0xdeaddead in the stack */
1066         ori     r4,r4,0xdead
1067
1068 ..stackloop:
1069         stwu    r4,-4(r2)
1070         bdnz    ..stackloop
1071
1072         li      r0, 0                   /* Make room for stack frame header and */
1073         stwu    r0, -4(r1)              /* clear final stack frame so that      */
1074         stwu    r0, -4(r1)              /* stack backtraces terminate cleanly   */
1075         /*
1076          * Set up a dummy frame to store reset vector as return address.
1077          * this causes stack underflow to reset board.
1078          */
1079         stwu    r1, -8(r1)              /* Save back chain and move SP */
1080         addis   r0, 0, RESET_VECTOR@h   /* Address of reset vector */
1081         ori     r0, r0, RESET_VECTOR@l
1082         stwu    r1, -8(r1)              /* Save back chain and move SP */
1083         stw     r0, +12(r1)             /* Save return addr (underflow vect) */
1084
1085 #elif defined(CFG_TEMP_STACK_OCM) && \
1086         (defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE))
1087         /*
1088          * Stack in OCM.
1089          */
1090
1091         /* Set up Stack at top of OCM */
1092         lis     r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@h
1093         ori     r1, r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@l
1094
1095         /* Set up a zeroized stack frame so that backtrace works right */
1096         li      r0, 0
1097         stwu    r0, -4(r1)
1098         stwu    r0, -4(r1)
1099
1100         /*
1101          * Set up a dummy frame to store reset vector as return address.
1102          * this causes stack underflow to reset board.
1103          */
1104         stwu    r1, -8(r1)              /* Save back chain and move SP */
1105         lis     r0, RESET_VECTOR@h      /* Address of reset vector */
1106         ori     r0, r0, RESET_VECTOR@l
1107         stwu    r1, -8(r1)              /* Save back chain and move SP */
1108         stw     r0, +12(r1)             /* Save return addr (underflow vect) */
1109 #endif /* CFG_INIT_DCACHE_CS */
1110
1111         /*----------------------------------------------------------------------- */
1112         /* Initialize SDRAM Controller  */
1113         /*----------------------------------------------------------------------- */
1114         bl      sdram_init
1115
1116 #ifdef CONFIG_NAND_SPL
1117         bl      nand_boot               /* will not return */
1118 #else
1119         GET_GOT                 /* initialize GOT access                        */
1120
1121         bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
1122
1123         /* NEVER RETURNS! */
1124         bl      board_init_f    /* run first part of init code (from Flash)     */
1125 #endif /* CONFIG_NAND_SPL */
1126
1127 #endif  /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1128         /*----------------------------------------------------------------------- */
1129
1130
1131 #ifndef CONFIG_NAND_SPL
1132 /*
1133  * This code finishes saving the registers to the exception frame
1134  * and jumps to the appropriate handler for the exception.
1135  * Register r21 is pointer into trap frame, r1 has new stack pointer.
1136  */
1137         .globl  transfer_to_handler
1138 transfer_to_handler:
1139         stw     r22,_NIP(r21)
1140         lis     r22,MSR_POW@h
1141         andc    r23,r23,r22
1142         stw     r23,_MSR(r21)
1143         SAVE_GPR(7, r21)
1144         SAVE_4GPRS(8, r21)
1145         SAVE_8GPRS(12, r21)
1146         SAVE_8GPRS(24, r21)
1147         mflr    r23
1148         andi.   r24,r23,0x3f00          /* get vector offset */
1149         stw     r24,TRAP(r21)
1150         li      r22,0
1151         stw     r22,RESULT(r21)
1152         mtspr   SPRG2,r22               /* r1 is now kernel sp */
1153         lwz     r24,0(r23)              /* virtual address of handler */
1154         lwz     r23,4(r23)              /* where to go when done */
1155         mtspr   SRR0,r24
1156         mtspr   SRR1,r20
1157         mtlr    r23
1158         SYNC
1159         rfi                             /* jump to handler, enable MMU */
1160
1161 int_return:
1162         mfmsr   r28             /* Disable interrupts */
1163         li      r4,0
1164         ori     r4,r4,MSR_EE
1165         andc    r28,r28,r4
1166         SYNC                    /* Some chip revs need this... */
1167         mtmsr   r28
1168         SYNC
1169         lwz     r2,_CTR(r1)
1170         lwz     r0,_LINK(r1)
1171         mtctr   r2
1172         mtlr    r0
1173         lwz     r2,_XER(r1)
1174         lwz     r0,_CCR(r1)
1175         mtspr   XER,r2
1176         mtcrf   0xFF,r0
1177         REST_10GPRS(3, r1)
1178         REST_10GPRS(13, r1)
1179         REST_8GPRS(23, r1)
1180         REST_GPR(31, r1)
1181         lwz     r2,_NIP(r1)     /* Restore environment */
1182         lwz     r0,_MSR(r1)
1183         mtspr   SRR0,r2
1184         mtspr   SRR1,r0
1185         lwz     r0,GPR0(r1)
1186         lwz     r2,GPR2(r1)
1187         lwz     r1,GPR1(r1)
1188         SYNC
1189         rfi
1190
1191 crit_return:
1192         mfmsr   r28             /* Disable interrupts */
1193         li      r4,0
1194         ori     r4,r4,MSR_EE
1195         andc    r28,r28,r4
1196         SYNC                    /* Some chip revs need this... */
1197         mtmsr   r28
1198         SYNC
1199         lwz     r2,_CTR(r1)
1200         lwz     r0,_LINK(r1)
1201         mtctr   r2
1202         mtlr    r0
1203         lwz     r2,_XER(r1)
1204         lwz     r0,_CCR(r1)
1205         mtspr   XER,r2
1206         mtcrf   0xFF,r0
1207         REST_10GPRS(3, r1)
1208         REST_10GPRS(13, r1)
1209         REST_8GPRS(23, r1)
1210         REST_GPR(31, r1)
1211         lwz     r2,_NIP(r1)     /* Restore environment */
1212         lwz     r0,_MSR(r1)
1213         mtspr   csrr0,r2
1214         mtspr   csrr1,r0
1215         lwz     r0,GPR0(r1)
1216         lwz     r2,GPR2(r1)
1217         lwz     r1,GPR1(r1)
1218         SYNC
1219         rfci
1220
1221 #ifdef CONFIG_440
1222 mck_return:
1223         mfmsr   r28             /* Disable interrupts */
1224         li      r4,0
1225         ori     r4,r4,MSR_EE
1226         andc    r28,r28,r4
1227         SYNC                    /* Some chip revs need this... */
1228         mtmsr   r28
1229         SYNC
1230         lwz     r2,_CTR(r1)
1231         lwz     r0,_LINK(r1)
1232         mtctr   r2
1233         mtlr    r0
1234         lwz     r2,_XER(r1)
1235         lwz     r0,_CCR(r1)
1236         mtspr   XER,r2
1237         mtcrf   0xFF,r0
1238         REST_10GPRS(3, r1)
1239         REST_10GPRS(13, r1)
1240         REST_8GPRS(23, r1)
1241         REST_GPR(31, r1)
1242         lwz     r2,_NIP(r1)     /* Restore environment */
1243         lwz     r0,_MSR(r1)
1244         mtspr   mcsrr0,r2
1245         mtspr   mcsrr1,r0
1246         lwz     r0,GPR0(r1)
1247         lwz     r2,GPR2(r1)
1248         lwz     r1,GPR1(r1)
1249         SYNC
1250         rfmci
1251 #endif /* CONFIG_440 */
1252
1253
1254         .globl get_pvr
1255 get_pvr:
1256         mfspr   r3, PVR
1257         blr
1258
1259 /*------------------------------------------------------------------------------- */
1260 /* Function:     out16 */
1261 /* Description:  Output 16 bits */
1262 /*------------------------------------------------------------------------------- */
1263         .globl  out16
1264 out16:
1265         sth     r4,0x0000(r3)
1266         blr
1267
1268 /*------------------------------------------------------------------------------- */
1269 /* Function:     out16r */
1270 /* Description:  Byte reverse and output 16 bits */
1271 /*------------------------------------------------------------------------------- */
1272         .globl  out16r
1273 out16r:
1274         sthbrx  r4,r0,r3
1275         blr
1276
1277 /*------------------------------------------------------------------------------- */
1278 /* Function:     out32r */
1279 /* Description:  Byte reverse and output 32 bits */
1280 /*------------------------------------------------------------------------------- */
1281         .globl  out32r
1282 out32r:
1283         stwbrx  r4,r0,r3
1284         blr
1285
1286 /*------------------------------------------------------------------------------- */
1287 /* Function:     in16 */
1288 /* Description:  Input 16 bits */
1289 /*------------------------------------------------------------------------------- */
1290         .globl  in16
1291 in16:
1292         lhz     r3,0x0000(r3)
1293         blr
1294
1295 /*------------------------------------------------------------------------------- */
1296 /* Function:     in16r */
1297 /* Description:  Input 16 bits and byte reverse */
1298 /*------------------------------------------------------------------------------- */
1299         .globl  in16r
1300 in16r:
1301         lhbrx   r3,r0,r3
1302         blr
1303
1304 /*------------------------------------------------------------------------------- */
1305 /* Function:     in32r */
1306 /* Description:  Input 32 bits and byte reverse */
1307 /*------------------------------------------------------------------------------- */
1308         .globl  in32r
1309 in32r:
1310         lwbrx   r3,r0,r3
1311         blr
1312
1313 /*
1314  * void relocate_code (addr_sp, gd, addr_moni)
1315  *
1316  * This "function" does not return, instead it continues in RAM
1317  * after relocating the monitor code.
1318  *
1319  * r3 = dest
1320  * r4 = src
1321  * r5 = length in bytes
1322  * r6 = cachelinesize
1323  */
1324         .globl  relocate_code
1325 relocate_code:
1326 #ifdef CONFIG_4xx_DCACHE
1327         /*
1328          * We need to flush the Init Data before the dcache will be
1329          * invalidated
1330          */
1331
1332         /* save regs */
1333         mr      r9,r3
1334         mr      r10,r4
1335         mr      r11,r5
1336
1337         mr      r3,r4
1338         addi    r4,r4,0x200     /* should be enough for init data */
1339         bl      flush_dcache_range
1340
1341         /* restore regs */
1342         mr      r3,r9
1343         mr      r4,r10
1344         mr      r5,r11
1345 #endif
1346
1347 #ifdef CFG_INIT_RAM_DCACHE
1348         /*
1349          * Unlock the previously locked d-cache
1350          */
1351         msync
1352         isync
1353         /* set TFLOOR/NFLOOR to 0 again */
1354         lis     r6,0x0001
1355         ori     r6,r6,0xf800
1356         mtspr   dvlim,r6
1357         lis     r6,0x0000
1358         ori     r6,r6,0x0000
1359         mtspr   dnv0,r6
1360         mtspr   dnv1,r6
1361         mtspr   dnv2,r6
1362         mtspr   dnv3,r6
1363         mtspr   dtv0,r6
1364         mtspr   dtv1,r6
1365         mtspr   dtv2,r6
1366         mtspr   dtv3,r6
1367         msync
1368         isync
1369 #endif /* CFG_INIT_RAM_DCACHE */
1370
1371 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1372     defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
1373     defined(CONFIG_440SP) || defined(CONFIG_440SPE)
1374         /*
1375          * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1376          * to speed up the boot process. Now this cache needs to be disabled.
1377          */
1378         iccci   0,0                     /* Invalidate inst cache */
1379         dccci   0,0                     /* Invalidate data cache, now no longer our stack */
1380         sync
1381         isync
1382 #ifdef CFG_TLB_FOR_BOOT_FLASH
1383         addi    r1,r0,CFG_TLB_FOR_BOOT_FLASH    /* Use defined TLB */
1384 #else
1385         addi    r1,r0,0x0000            /* Default TLB entry is #0 */
1386 #endif
1387         tlbre   r0,r1,0x0002            /* Read contents */
1388         ori     r0,r0,0x0c00            /* Or in the inhibit, write through bit */
1389         tlbwe   r0,r1,0x0002            /* Save it out */
1390         sync
1391         isync
1392 #endif
1393         mr      r1,  r3         /* Set new stack pointer                */
1394         mr      r9,  r4         /* Save copy of Init Data pointer       */
1395         mr      r10, r5         /* Save copy of Destination Address     */
1396
1397         mr      r3,  r5                         /* Destination Address  */
1398         lis     r4, CFG_MONITOR_BASE@h          /* Source      Address  */
1399         ori     r4, r4, CFG_MONITOR_BASE@l
1400         lwz     r5, GOT(__init_end)
1401         sub     r5, r5, r4
1402         li      r6, L1_CACHE_BYTES              /* Cache Line Size      */
1403
1404         /*
1405          * Fix GOT pointer:
1406          *
1407          * New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address
1408          *
1409          * Offset:
1410          */
1411         sub     r15, r10, r4
1412
1413         /* First our own GOT */
1414         add     r14, r14, r15
1415         /* the the one used by the C code */
1416         add     r30, r30, r15
1417
1418         /*
1419          * Now relocate code
1420          */
1421
1422         cmplw   cr1,r3,r4
1423         addi    r0,r5,3
1424         srwi.   r0,r0,2
1425         beq     cr1,4f          /* In place copy is not necessary       */
1426         beq     7f              /* Protect against 0 count              */
1427         mtctr   r0
1428         bge     cr1,2f
1429
1430         la      r8,-4(r4)
1431         la      r7,-4(r3)
1432 1:      lwzu    r0,4(r8)
1433         stwu    r0,4(r7)
1434         bdnz    1b
1435         b       4f
1436
1437 2:      slwi    r0,r0,2
1438         add     r8,r4,r0
1439         add     r7,r3,r0
1440 3:      lwzu    r0,-4(r8)
1441         stwu    r0,-4(r7)
1442         bdnz    3b
1443
1444 /*
1445  * Now flush the cache: note that we must start from a cache aligned
1446  * address. Otherwise we might miss one cache line.
1447  */
1448 4:      cmpwi   r6,0
1449         add     r5,r3,r5
1450         beq     7f              /* Always flush prefetch queue in any case */
1451         subi    r0,r6,1
1452         andc    r3,r3,r0
1453         mr      r4,r3
1454 5:      dcbst   0,r4
1455         add     r4,r4,r6
1456         cmplw   r4,r5
1457         blt     5b
1458         sync                    /* Wait for all dcbst to complete on bus */
1459         mr      r4,r3
1460 6:      icbi    0,r4
1461         add     r4,r4,r6
1462         cmplw   r4,r5
1463         blt     6b
1464 7:      sync                    /* Wait for all icbi to complete on bus */
1465         isync
1466
1467 /*
1468  * We are done. Do not return, instead branch to second part of board
1469  * initialization, now running from RAM.
1470  */
1471
1472         addi    r0, r10, in_ram - _start + _START_OFFSET
1473         mtlr    r0
1474         blr                             /* NEVER RETURNS! */
1475
1476 in_ram:
1477
1478         /*
1479          * Relocation Function, r14 point to got2+0x8000
1480          *
1481          * Adjust got2 pointers, no need to check for 0, this code
1482          * already puts a few entries in the table.
1483          */
1484         li      r0,__got2_entries@sectoff@l
1485         la      r3,GOT(_GOT2_TABLE_)
1486         lwz     r11,GOT(_GOT2_TABLE_)
1487         mtctr   r0
1488         sub     r11,r3,r11
1489         addi    r3,r3,-4
1490 1:      lwzu    r0,4(r3)
1491         add     r0,r0,r11
1492         stw     r0,0(r3)
1493         bdnz    1b
1494
1495         /*
1496          * Now adjust the fixups and the pointers to the fixups
1497          * in case we need to move ourselves again.
1498          */
1499 2:      li      r0,__fixup_entries@sectoff@l
1500         lwz     r3,GOT(_FIXUP_TABLE_)
1501         cmpwi   r0,0
1502         mtctr   r0
1503         addi    r3,r3,-4
1504         beq     4f
1505 3:      lwzu    r4,4(r3)
1506         lwzux   r0,r4,r11
1507         add     r0,r0,r11
1508         stw     r10,0(r3)
1509         stw     r0,0(r4)
1510         bdnz    3b
1511 4:
1512 clear_bss:
1513         /*
1514          * Now clear BSS segment
1515          */
1516         lwz     r3,GOT(__bss_start)
1517         lwz     r4,GOT(_end)
1518
1519         cmplw   0, r3, r4
1520         beq     7f
1521
1522         li      r0, 0
1523
1524         andi.   r5, r4, 3
1525         beq     6f
1526         sub     r4, r4, r5
1527         mtctr   r5
1528         mr      r5, r4
1529 5:      stb     r0, 0(r5)
1530         addi    r5, r5, 1
1531         bdnz    5b
1532 6:
1533         stw     r0, 0(r3)
1534         addi    r3, r3, 4
1535         cmplw   0, r3, r4
1536         bne     6b
1537
1538 7:
1539         mr      r3, r9          /* Init Data pointer            */
1540         mr      r4, r10         /* Destination Address          */
1541         bl      board_init_r
1542
1543         /*
1544          * Copy exception vector code to low memory
1545          *
1546          * r3: dest_addr
1547          * r7: source address, r8: end address, r9: target address
1548          */
1549         .globl  trap_init
1550 trap_init:
1551         lwz     r7, GOT(_start_of_vectors)
1552         lwz     r8, GOT(_end_of_vectors)
1553
1554         li      r9, 0x100               /* reset vector always at 0x100 */
1555
1556         cmplw   0, r7, r8
1557         bgelr                           /* return if r7>=r8 - just in case */
1558
1559         mflr    r4                      /* save link register           */
1560 1:
1561         lwz     r0, 0(r7)
1562         stw     r0, 0(r9)
1563         addi    r7, r7, 4
1564         addi    r9, r9, 4
1565         cmplw   0, r7, r8
1566         bne     1b
1567
1568         /*
1569          * relocate `hdlr' and `int_return' entries
1570          */
1571         li      r7, .L_MachineCheck - _start + _START_OFFSET
1572         li      r8, Alignment - _start + _START_OFFSET
1573 2:
1574         bl      trap_reloc
1575         addi    r7, r7, 0x100           /* next exception vector */
1576         cmplw   0, r7, r8
1577         blt     2b
1578
1579         li      r7, .L_Alignment - _start + _START_OFFSET
1580         bl      trap_reloc
1581
1582         li      r7, .L_ProgramCheck - _start + _START_OFFSET
1583         bl      trap_reloc
1584
1585 #ifdef CONFIG_440
1586         li      r7, .L_FPUnavailable - _start + _START_OFFSET
1587         bl      trap_reloc
1588
1589         li      r7, .L_Decrementer - _start + _START_OFFSET
1590         bl      trap_reloc
1591
1592         li      r7, .L_APU - _start + _START_OFFSET
1593         bl      trap_reloc
1594
1595         li      r7, .L_InstructionTLBError - _start + _START_OFFSET
1596         bl      trap_reloc
1597
1598         li      r7, .L_DataTLBError - _start + _START_OFFSET
1599         bl      trap_reloc
1600 #else /* CONFIG_440 */
1601         li      r7, .L_PIT - _start + _START_OFFSET
1602         bl      trap_reloc
1603
1604         li      r7, .L_InstructionTLBMiss - _start + _START_OFFSET
1605         bl      trap_reloc
1606
1607         li      r7, .L_DataTLBMiss - _start + _START_OFFSET
1608         bl      trap_reloc
1609 #endif /* CONFIG_440 */
1610
1611         li      r7, .L_DebugBreakpoint - _start + _START_OFFSET
1612         bl      trap_reloc
1613
1614 #if !defined(CONFIG_440)
1615         addi    r7,r0,0x1000            /* set ME bit (Machine Exceptions) */
1616         oris    r7,r7,0x0002            /* set CE bit (Critical Exceptions) */
1617         mtmsr   r7                      /* change MSR */
1618 #else
1619         bl      __440_msr_set
1620         b       __440_msr_continue
1621
1622 __440_msr_set:
1623         addi    r7,r0,0x1000            /* set ME bit (Machine Exceptions) */
1624         oris    r7,r7,0x0002            /* set CE bit (Critical Exceptions) */
1625         mtspr   srr1,r7
1626         mflr    r7
1627         mtspr   srr0,r7
1628         rfi
1629 __440_msr_continue:
1630 #endif
1631
1632         mtlr    r4                      /* restore link register        */
1633         blr
1634
1635         /*
1636          * Function: relocate entries for one exception vector
1637          */
1638 trap_reloc:
1639         lwz     r0, 0(r7)               /* hdlr ...                     */
1640         add     r0, r0, r3              /*  ... += dest_addr            */
1641         stw     r0, 0(r7)
1642
1643         lwz     r0, 4(r7)               /* int_return ...               */
1644         add     r0, r0, r3              /*  ... += dest_addr            */
1645         stw     r0, 4(r7)
1646
1647         blr
1648
1649 #if defined(CONFIG_440)
1650 /*----------------------------------------------------------------------------+
1651 | dcbz_area.
1652 +----------------------------------------------------------------------------*/
1653         function_prolog(dcbz_area)
1654         rlwinm. r5,r4,0,27,31
1655         rlwinm  r5,r4,27,5,31
1656         beq     ..d_ra2
1657         addi    r5,r5,0x0001
1658 ..d_ra2:mtctr   r5
1659 ..d_ag2:dcbz    r0,r3
1660         addi    r3,r3,32
1661         bdnz    ..d_ag2
1662         sync
1663         blr
1664         function_epilog(dcbz_area)
1665
1666 /*----------------------------------------------------------------------------+
1667 | dflush.  Assume 32K at vector address is cachable.
1668 +----------------------------------------------------------------------------*/
1669         function_prolog(dflush)
1670         mfmsr   r9
1671         rlwinm  r8,r9,0,15,13
1672         rlwinm  r8,r8,0,17,15
1673         mtmsr   r8
1674         mfspr   r8,dvlim
1675         addi    r3,r0,0x0000
1676         mtspr   dvlim,r3
1677         mfspr   r3,ivpr
1678         addi    r4,r0,1024
1679         mtctr   r4
1680 ..dflush_loop:
1681         lwz     r6,0x0(r3)
1682         addi    r3,r3,32
1683         bdnz    ..dflush_loop
1684         addi    r3,r3,-32
1685         mtctr   r4
1686 ..ag:   dcbf    r0,r3
1687         addi    r3,r3,-32
1688         bdnz    ..ag
1689         mtspr   dvlim,r8
1690         sync
1691         mtmsr   r9
1692         blr
1693         function_epilog(dflush)
1694 #endif /* CONFIG_440 */
1695 #endif /* CONFIG_NAND_SPL */
1696
1697 /*------------------------------------------------------------------------------- */
1698 /* Function:     in8 */
1699 /* Description:  Input 8 bits */
1700 /*------------------------------------------------------------------------------- */
1701         .globl  in8
1702 in8:
1703         lbz     r3,0x0000(r3)
1704         blr
1705
1706 /*------------------------------------------------------------------------------- */
1707 /* Function:     out8 */
1708 /* Description:  Output 8 bits */
1709 /*------------------------------------------------------------------------------- */
1710         .globl  out8
1711 out8:
1712         stb     r4,0x0000(r3)
1713         blr
1714
1715 /*------------------------------------------------------------------------------- */
1716 /* Function:     out32 */
1717 /* Description:  Output 32 bits */
1718 /*------------------------------------------------------------------------------- */
1719         .globl  out32
1720 out32:
1721         stw     r4,0x0000(r3)
1722         blr
1723
1724 /*------------------------------------------------------------------------------- */
1725 /* Function:     in32 */
1726 /* Description:  Input 32 bits */
1727 /*------------------------------------------------------------------------------- */
1728         .globl  in32
1729 in32:
1730         lwz     3,0x0000(3)
1731         blr
1732
1733 /**************************************************************************/
1734 /* PPC405EP specific stuff                                                */
1735 /**************************************************************************/
1736 #ifdef CONFIG_405EP
1737 ppc405ep_init:
1738
1739 #ifdef CONFIG_BUBINGA
1740         /*
1741          * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1742          * function) to support FPGA and NVRAM accesses below.
1743          */
1744
1745         lis     r3,GPIO0_OSRH@h         /* config GPIO output select */
1746         ori     r3,r3,GPIO0_OSRH@l
1747         lis     r4,CFG_GPIO0_OSRH@h
1748         ori     r4,r4,CFG_GPIO0_OSRH@l
1749         stw     r4,0(r3)
1750         lis     r3,GPIO0_OSRL@h
1751         ori     r3,r3,GPIO0_OSRL@l
1752         lis     r4,CFG_GPIO0_OSRL@h
1753         ori     r4,r4,CFG_GPIO0_OSRL@l
1754         stw     r4,0(r3)
1755
1756         lis     r3,GPIO0_ISR1H@h        /* config GPIO input select */
1757         ori     r3,r3,GPIO0_ISR1H@l
1758         lis     r4,CFG_GPIO0_ISR1H@h
1759         ori     r4,r4,CFG_GPIO0_ISR1H@l
1760         stw     r4,0(r3)
1761         lis     r3,GPIO0_ISR1L@h
1762         ori     r3,r3,GPIO0_ISR1L@l
1763         lis     r4,CFG_GPIO0_ISR1L@h
1764         ori     r4,r4,CFG_GPIO0_ISR1L@l
1765         stw     r4,0(r3)
1766
1767         lis     r3,GPIO0_TSRH@h         /* config GPIO three-state select */
1768         ori     r3,r3,GPIO0_TSRH@l
1769         lis     r4,CFG_GPIO0_TSRH@h
1770         ori     r4,r4,CFG_GPIO0_TSRH@l
1771         stw     r4,0(r3)
1772         lis     r3,GPIO0_TSRL@h
1773         ori     r3,r3,GPIO0_TSRL@l
1774         lis     r4,CFG_GPIO0_TSRL@h
1775         ori     r4,r4,CFG_GPIO0_TSRL@l
1776         stw     r4,0(r3)
1777
1778         lis     r3,GPIO0_TCR@h          /* config GPIO driver output enables */
1779         ori     r3,r3,GPIO0_TCR@l
1780         lis     r4,CFG_GPIO0_TCR@h
1781         ori     r4,r4,CFG_GPIO0_TCR@l
1782         stw     r4,0(r3)
1783
1784         li      r3,pb1ap                /* program EBC bank 1 for RTC access */
1785         mtdcr   ebccfga,r3
1786         lis     r3,CFG_EBC_PB1AP@h
1787         ori     r3,r3,CFG_EBC_PB1AP@l
1788         mtdcr   ebccfgd,r3
1789         li      r3,pb1cr
1790         mtdcr   ebccfga,r3
1791         lis     r3,CFG_EBC_PB1CR@h
1792         ori     r3,r3,CFG_EBC_PB1CR@l
1793         mtdcr   ebccfgd,r3
1794
1795         li      r3,pb1ap                /* program EBC bank 1 for RTC access */
1796         mtdcr   ebccfga,r3
1797         lis     r3,CFG_EBC_PB1AP@h
1798         ori     r3,r3,CFG_EBC_PB1AP@l
1799         mtdcr   ebccfgd,r3
1800         li      r3,pb1cr
1801         mtdcr   ebccfga,r3
1802         lis     r3,CFG_EBC_PB1CR@h
1803         ori     r3,r3,CFG_EBC_PB1CR@l
1804         mtdcr   ebccfgd,r3
1805
1806         li      r3,pb4ap                /* program EBC bank 4 for FPGA access */
1807         mtdcr   ebccfga,r3
1808         lis     r3,CFG_EBC_PB4AP@h
1809         ori     r3,r3,CFG_EBC_PB4AP@l
1810         mtdcr   ebccfgd,r3
1811         li      r3,pb4cr
1812         mtdcr   ebccfga,r3
1813         lis     r3,CFG_EBC_PB4CR@h
1814         ori     r3,r3,CFG_EBC_PB4CR@l
1815         mtdcr   ebccfgd,r3
1816 #endif
1817
1818         /*
1819         !-----------------------------------------------------------------------
1820         ! Check to see if chip is in bypass mode.
1821         ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1822         ! CPU reset   Otherwise, skip this step and keep going.
1823         ! Note:  Running BIOS in bypass mode is not supported since PLB speed
1824         !        will not be fast enough for the SDRAM (min 66MHz)
1825         !-----------------------------------------------------------------------
1826         */
1827         mfdcr   r5, CPC0_PLLMR1
1828         rlwinm  r4,r5,1,0x1            /* get system clock source (SSCS) */
1829         cmpi    cr0,0,r4,0x1
1830
1831         beq    pll_done                   /* if SSCS =b'1' then PLL has */
1832                                           /* already been set */
1833                                           /* and CPU has been reset */
1834                                           /* so skip to next section */
1835
1836 #ifdef CONFIG_BUBINGA
1837         /*
1838         !-----------------------------------------------------------------------
1839         ! Read NVRAM to get value to write in PLLMR.
1840         ! If value has not been correctly saved, write default value
1841         ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1842         ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1843         !
1844         ! WARNING:  This code assumes the first three words in the nvram_t
1845         !           structure in openbios.h.  Changing the beginning of
1846         !           the structure will break this code.
1847         !
1848         !-----------------------------------------------------------------------
1849         */
1850         addis   r3,0,NVRAM_BASE@h
1851         addi    r3,r3,NVRAM_BASE@l
1852
1853         lwz     r4, 0(r3)
1854         addis   r5,0,NVRVFY1@h
1855         addi    r5,r5,NVRVFY1@l
1856         cmp     cr0,0,r4,r5            /* Compare 1st NVRAM Magic number*/
1857         bne     ..no_pllset
1858         addi    r3,r3,4
1859         lwz     r4, 0(r3)
1860         addis   r5,0,NVRVFY2@h
1861         addi    r5,r5,NVRVFY2@l
1862         cmp     cr0,0,r4,r5            /* Compare 2 NVRAM Magic number */
1863         bne     ..no_pllset
1864         addi    r3,r3,8                 /* Skip over conf_size */
1865         lwz     r4, 4(r3)               /* Load PLLMR1 value from NVRAM */
1866         lwz     r3, 0(r3)               /* Load PLLMR0 value from NVRAM */
1867         rlwinm  r5,r4,1,0x1             /* get system clock source (SSCS) */
1868         cmpi     cr0,0,r5,1             /* See if PLL is locked */
1869         beq     pll_write
1870 ..no_pllset:
1871 #endif /* CONFIG_BUBINGA */
1872
1873 #ifdef CONFIG_TAIHU
1874         mfdcr   r4, CPC0_BOOT
1875         andi.   r5, r4, CPC0_BOOT_SEP@l
1876         bne     strap_1                 /* serial eeprom present */
1877         addis   r5,0,CPLD_REG0_ADDR@h
1878         ori     r5,r5,CPLD_REG0_ADDR@l
1879         andi.   r5, r5, 0x10
1880         bne     _pci_66mhz
1881 #endif /* CONFIG_TAIHU */
1882
1883 #if defined(CONFIG_ZEUS)
1884         mfdcr   r4, CPC0_BOOT
1885         andi.   r5, r4, CPC0_BOOT_SEP@l
1886         bne     strap_1         /* serial eeprom present */
1887         lis     r3,0x0000
1888         addi    r3,r3,0x3030
1889         lis     r4,0x8042
1890         addi    r4,r4,0x223e
1891         b       1f
1892 strap_1:
1893         mfdcr   r3, CPC0_PLLMR0
1894         mfdcr   r4, CPC0_PLLMR1
1895         b       1f
1896 #endif
1897
1898         addis   r3,0,PLLMR0_DEFAULT@h       /* PLLMR0 default value */
1899         ori     r3,r3,PLLMR0_DEFAULT@l     /* */
1900         addis   r4,0,PLLMR1_DEFAULT@h       /* PLLMR1 default value */
1901         ori     r4,r4,PLLMR1_DEFAULT@l     /* */
1902
1903 #ifdef CONFIG_TAIHU
1904         b       1f
1905 _pci_66mhz:
1906         addis   r3,0,PLLMR0_DEFAULT_PCI66@h
1907         ori     r3,r3,PLLMR0_DEFAULT_PCI66@l
1908         addis   r4,0,PLLMR1_DEFAULT_PCI66@h
1909         ori     r4,r4,PLLMR1_DEFAULT_PCI66@l
1910         b       1f
1911 strap_1:
1912         mfdcr   r3, CPC0_PLLMR0
1913         mfdcr   r4, CPC0_PLLMR1
1914 #endif /* CONFIG_TAIHU */
1915
1916 1:
1917         b       pll_write                 /* Write the CPC0_PLLMR with new value */
1918
1919 pll_done:
1920         /*
1921         !-----------------------------------------------------------------------
1922         ! Clear Soft Reset Register
1923         ! This is needed to enable PCI if not booting from serial EPROM
1924         !-----------------------------------------------------------------------
1925                 */
1926         addi    r3, 0, 0x0
1927         mtdcr   CPC0_SRR, r3
1928
1929         addis    r3,0,0x0010
1930         mtctr   r3
1931 pci_wait:
1932         bdnz    pci_wait
1933
1934         blr                               /* return to main code */
1935
1936 /*
1937 !-----------------------------------------------------------------------------
1938 ! Function:     pll_write
1939 ! Description:  Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1940 !               That is:
1941 !                         1.  Pll is first disabled (de-activated by putting in bypass mode)
1942 !                         2.  PLL is reset
1943 !                         3.  Clock dividers are set while PLL is held in reset and bypassed
1944 !                         4.  PLL Reset is cleared
1945 !                         5.  Wait 100us for PLL to lock
1946 !                         6.  A core reset is performed
1947 ! Input: r3 = Value to write to CPC0_PLLMR0
1948 ! Input: r4 = Value to write to CPC0_PLLMR1
1949 ! Output r3 = none
1950 !-----------------------------------------------------------------------------
1951 */
1952 pll_write:
1953         mfdcr  r5, CPC0_UCR
1954         andis. r5,r5,0xFFFF
1955         ori    r5,r5,0x0101              /* Stop the UART clocks */
1956         mtdcr  CPC0_UCR,r5               /* Before changing PLL */
1957
1958         mfdcr  r5, CPC0_PLLMR1
1959         rlwinm r5,r5,0,0x7FFFFFFF        /* Disable PLL */
1960         mtdcr   CPC0_PLLMR1,r5
1961         oris   r5,r5,0x4000              /* Set PLL Reset */
1962         mtdcr   CPC0_PLLMR1,r5
1963
1964         mtdcr   CPC0_PLLMR0,r3           /* Set clock dividers */
1965         rlwinm r5,r4,0,0x3FFFFFFF        /* Reset & Bypass new PLL dividers */
1966         oris   r5,r5,0x4000              /* Set PLL Reset */
1967         mtdcr   CPC0_PLLMR1,r5           /* Set clock dividers */
1968         rlwinm r5,r5,0,0xBFFFFFFF        /* Clear PLL Reset */
1969         mtdcr   CPC0_PLLMR1,r5
1970
1971                 /*
1972         ! Wait min of 100us for PLL to lock.
1973         ! See CMOS 27E databook for more info.
1974         ! At 200MHz, that means waiting 20,000 instructions
1975                  */
1976         addi    r3,0,20000              /* 2000 = 0x4e20 */
1977         mtctr   r3
1978 pll_wait:
1979         bdnz    pll_wait
1980
1981         oris   r5,r5,0x8000             /* Enable PLL */
1982         mtdcr   CPC0_PLLMR1,r5          /* Engage */
1983
1984         /*
1985          * Reset CPU to guarantee timings are OK
1986          * Not sure if this is needed...
1987          */
1988         addis r3,0,0x1000
1989         mtspr dbcr0,r3               /* This will cause a CPU core reset, and */
1990                                      /* execution will continue from the poweron */
1991                                      /* vector of 0xfffffffc */
1992 #endif /* CONFIG_405EP */
1993
1994 #if defined(CONFIG_440)
1995 /*----------------------------------------------------------------------------+
1996 | mttlb3.
1997 +----------------------------------------------------------------------------*/
1998         function_prolog(mttlb3)
1999         TLBWE(4,3,2)
2000         blr
2001         function_epilog(mttlb3)
2002
2003 /*----------------------------------------------------------------------------+
2004 | mftlb3.
2005 +----------------------------------------------------------------------------*/
2006         function_prolog(mftlb3)
2007         TLBRE(3,3,2)
2008         blr
2009         function_epilog(mftlb3)
2010
2011 /*----------------------------------------------------------------------------+
2012 | mttlb2.
2013 +----------------------------------------------------------------------------*/
2014         function_prolog(mttlb2)
2015         TLBWE(4,3,1)
2016         blr
2017         function_epilog(mttlb2)
2018
2019 /*----------------------------------------------------------------------------+
2020 | mftlb2.
2021 +----------------------------------------------------------------------------*/
2022         function_prolog(mftlb2)
2023         TLBRE(3,3,1)
2024         blr
2025         function_epilog(mftlb2)
2026
2027 /*----------------------------------------------------------------------------+
2028 | mttlb1.
2029 +----------------------------------------------------------------------------*/
2030         function_prolog(mttlb1)
2031         TLBWE(4,3,0)
2032         blr
2033         function_epilog(mttlb1)
2034
2035 /*----------------------------------------------------------------------------+
2036 | mftlb1.
2037 +----------------------------------------------------------------------------*/
2038         function_prolog(mftlb1)
2039         TLBRE(3,3,0)
2040         blr
2041         function_epilog(mftlb1)
2042 #endif /* CONFIG_440 */