]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - cpu/ppc4xx/start.S
ppc4xx: Fix problem with init-ram bigger than 4k on 440 platforms
[karo-tx-uboot.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 /* Function:     ppcDcbf */
1315 /* Description:  Data Cache block flush */
1316 /* Input:        r3 = effective address */
1317 /* Output:       none. */
1318 /*------------------------------------------------------------------------------- */
1319         .globl  ppcDcbf
1320 ppcDcbf:
1321         dcbf    r0,r3
1322         blr
1323
1324 /*------------------------------------------------------------------------------- */
1325 /* Function:     ppcDcbi */
1326 /* Description:  Data Cache block Invalidate */
1327 /* Input:        r3 = effective address */
1328 /* Output:       none. */
1329 /*------------------------------------------------------------------------------- */
1330         .globl  ppcDcbi
1331 ppcDcbi:
1332         dcbi    r0,r3
1333         blr
1334
1335 /*------------------------------------------------------------------------------- */
1336 /* Function:     ppcSync */
1337 /* Description:  Processor Synchronize */
1338 /* Input:        none. */
1339 /* Output:       none. */
1340 /*------------------------------------------------------------------------------- */
1341         .globl  ppcSync
1342 ppcSync:
1343         sync
1344         blr
1345
1346 /*
1347  * void relocate_code (addr_sp, gd, addr_moni)
1348  *
1349  * This "function" does not return, instead it continues in RAM
1350  * after relocating the monitor code.
1351  *
1352  * r3 = dest
1353  * r4 = src
1354  * r5 = length in bytes
1355  * r6 = cachelinesize
1356  */
1357         .globl  relocate_code
1358 relocate_code:
1359 #ifdef CONFIG_4xx_DCACHE
1360         /*
1361          * We need to flush the Init Data before the dcache will be
1362          * invalidated
1363          */
1364
1365         /* save regs */
1366         mr      r9,r3
1367         mr      r10,r4
1368         mr      r11,r5
1369
1370         mr      r3,r4
1371         addi    r4,r4,0x200     /* should be enough for init data */
1372         bl      flush_dcache_range
1373
1374         /* restore regs */
1375         mr      r3,r9
1376         mr      r4,r10
1377         mr      r5,r11
1378 #endif
1379
1380 #ifdef CFG_INIT_RAM_DCACHE
1381         /*
1382          * Unlock the previously locked d-cache
1383          */
1384         msync
1385         isync
1386         /* set TFLOOR/NFLOOR to 0 again */
1387         lis     r6,0x0001
1388         ori     r6,r6,0xf800
1389         mtspr   dvlim,r6
1390         lis     r6,0x0000
1391         ori     r6,r6,0x0000
1392         mtspr   dnv0,r6
1393         mtspr   dnv1,r6
1394         mtspr   dnv2,r6
1395         mtspr   dnv3,r6
1396         mtspr   dtv0,r6
1397         mtspr   dtv1,r6
1398         mtspr   dtv2,r6
1399         mtspr   dtv3,r6
1400         msync
1401         isync
1402 #endif /* CFG_INIT_RAM_DCACHE */
1403
1404 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1405     defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
1406     defined(CONFIG_440SP) || defined(CONFIG_440SPE)
1407         /*
1408          * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1409          * to speed up the boot process. Now this cache needs to be disabled.
1410          */
1411         iccci   0,0                     /* Invalidate inst cache */
1412         dccci   0,0                     /* Invalidate data cache, now no longer our stack */
1413         sync
1414         isync
1415 #ifdef CFG_TLB_FOR_BOOT_FLASH
1416         addi    r1,r0,CFG_TLB_FOR_BOOT_FLASH    /* Use defined TLB */
1417 #else
1418         addi    r1,r0,0x0000            /* Default TLB entry is #0 */
1419 #endif
1420         tlbre   r0,r1,0x0002            /* Read contents */
1421         ori     r0,r0,0x0c00            /* Or in the inhibit, write through bit */
1422         tlbwe   r0,r1,0x0002            /* Save it out */
1423         sync
1424         isync
1425 #endif
1426         mr      r1,  r3         /* Set new stack pointer                */
1427         mr      r9,  r4         /* Save copy of Init Data pointer       */
1428         mr      r10, r5         /* Save copy of Destination Address     */
1429
1430         mr      r3,  r5                         /* Destination Address  */
1431         lis     r4, CFG_MONITOR_BASE@h          /* Source      Address  */
1432         ori     r4, r4, CFG_MONITOR_BASE@l
1433         lwz     r5, GOT(__init_end)
1434         sub     r5, r5, r4
1435         li      r6, L1_CACHE_BYTES              /* Cache Line Size      */
1436
1437         /*
1438          * Fix GOT pointer:
1439          *
1440          * New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address
1441          *
1442          * Offset:
1443          */
1444         sub     r15, r10, r4
1445
1446         /* First our own GOT */
1447         add     r14, r14, r15
1448         /* the the one used by the C code */
1449         add     r30, r30, r15
1450
1451         /*
1452          * Now relocate code
1453          */
1454
1455         cmplw   cr1,r3,r4
1456         addi    r0,r5,3
1457         srwi.   r0,r0,2
1458         beq     cr1,4f          /* In place copy is not necessary       */
1459         beq     7f              /* Protect against 0 count              */
1460         mtctr   r0
1461         bge     cr1,2f
1462
1463         la      r8,-4(r4)
1464         la      r7,-4(r3)
1465 1:      lwzu    r0,4(r8)
1466         stwu    r0,4(r7)
1467         bdnz    1b
1468         b       4f
1469
1470 2:      slwi    r0,r0,2
1471         add     r8,r4,r0
1472         add     r7,r3,r0
1473 3:      lwzu    r0,-4(r8)
1474         stwu    r0,-4(r7)
1475         bdnz    3b
1476
1477 /*
1478  * Now flush the cache: note that we must start from a cache aligned
1479  * address. Otherwise we might miss one cache line.
1480  */
1481 4:      cmpwi   r6,0
1482         add     r5,r3,r5
1483         beq     7f              /* Always flush prefetch queue in any case */
1484         subi    r0,r6,1
1485         andc    r3,r3,r0
1486         mr      r4,r3
1487 5:      dcbst   0,r4
1488         add     r4,r4,r6
1489         cmplw   r4,r5
1490         blt     5b
1491         sync                    /* Wait for all dcbst to complete on bus */
1492         mr      r4,r3
1493 6:      icbi    0,r4
1494         add     r4,r4,r6
1495         cmplw   r4,r5
1496         blt     6b
1497 7:      sync                    /* Wait for all icbi to complete on bus */
1498         isync
1499
1500 /*
1501  * We are done. Do not return, instead branch to second part of board
1502  * initialization, now running from RAM.
1503  */
1504
1505         addi    r0, r10, in_ram - _start + _START_OFFSET
1506         mtlr    r0
1507         blr                             /* NEVER RETURNS! */
1508
1509 in_ram:
1510
1511         /*
1512          * Relocation Function, r14 point to got2+0x8000
1513          *
1514          * Adjust got2 pointers, no need to check for 0, this code
1515          * already puts a few entries in the table.
1516          */
1517         li      r0,__got2_entries@sectoff@l
1518         la      r3,GOT(_GOT2_TABLE_)
1519         lwz     r11,GOT(_GOT2_TABLE_)
1520         mtctr   r0
1521         sub     r11,r3,r11
1522         addi    r3,r3,-4
1523 1:      lwzu    r0,4(r3)
1524         add     r0,r0,r11
1525         stw     r0,0(r3)
1526         bdnz    1b
1527
1528         /*
1529          * Now adjust the fixups and the pointers to the fixups
1530          * in case we need to move ourselves again.
1531          */
1532 2:      li      r0,__fixup_entries@sectoff@l
1533         lwz     r3,GOT(_FIXUP_TABLE_)
1534         cmpwi   r0,0
1535         mtctr   r0
1536         addi    r3,r3,-4
1537         beq     4f
1538 3:      lwzu    r4,4(r3)
1539         lwzux   r0,r4,r11
1540         add     r0,r0,r11
1541         stw     r10,0(r3)
1542         stw     r0,0(r4)
1543         bdnz    3b
1544 4:
1545 clear_bss:
1546         /*
1547          * Now clear BSS segment
1548          */
1549         lwz     r3,GOT(__bss_start)
1550         lwz     r4,GOT(_end)
1551
1552         cmplw   0, r3, r4
1553         beq     7f
1554
1555         li      r0, 0
1556
1557         andi.   r5, r4, 3
1558         beq     6f
1559         sub     r4, r4, r5
1560         mtctr   r5
1561         mr      r5, r4
1562 5:      stb     r0, 0(r5)
1563         addi    r5, r5, 1
1564         bdnz    5b
1565 6:
1566         stw     r0, 0(r3)
1567         addi    r3, r3, 4
1568         cmplw   0, r3, r4
1569         bne     6b
1570
1571 7:
1572         mr      r3, r9          /* Init Data pointer            */
1573         mr      r4, r10         /* Destination Address          */
1574         bl      board_init_r
1575
1576         /*
1577          * Copy exception vector code to low memory
1578          *
1579          * r3: dest_addr
1580          * r7: source address, r8: end address, r9: target address
1581          */
1582         .globl  trap_init
1583 trap_init:
1584         lwz     r7, GOT(_start_of_vectors)
1585         lwz     r8, GOT(_end_of_vectors)
1586
1587         li      r9, 0x100               /* reset vector always at 0x100 */
1588
1589         cmplw   0, r7, r8
1590         bgelr                           /* return if r7>=r8 - just in case */
1591
1592         mflr    r4                      /* save link register           */
1593 1:
1594         lwz     r0, 0(r7)
1595         stw     r0, 0(r9)
1596         addi    r7, r7, 4
1597         addi    r9, r9, 4
1598         cmplw   0, r7, r8
1599         bne     1b
1600
1601         /*
1602          * relocate `hdlr' and `int_return' entries
1603          */
1604         li      r7, .L_MachineCheck - _start + _START_OFFSET
1605         li      r8, Alignment - _start + _START_OFFSET
1606 2:
1607         bl      trap_reloc
1608         addi    r7, r7, 0x100           /* next exception vector */
1609         cmplw   0, r7, r8
1610         blt     2b
1611
1612         li      r7, .L_Alignment - _start + _START_OFFSET
1613         bl      trap_reloc
1614
1615         li      r7, .L_ProgramCheck - _start + _START_OFFSET
1616         bl      trap_reloc
1617
1618 #ifdef CONFIG_440
1619         li      r7, .L_FPUnavailable - _start + _START_OFFSET
1620         bl      trap_reloc
1621
1622         li      r7, .L_Decrementer - _start + _START_OFFSET
1623         bl      trap_reloc
1624
1625         li      r7, .L_APU - _start + _START_OFFSET
1626         bl      trap_reloc
1627
1628         li      r7, .L_InstructionTLBError - _start + _START_OFFSET
1629         bl      trap_reloc
1630
1631         li      r7, .L_DataTLBError - _start + _START_OFFSET
1632         bl      trap_reloc
1633 #else /* CONFIG_440 */
1634         li      r7, .L_PIT - _start + _START_OFFSET
1635         bl      trap_reloc
1636
1637         li      r7, .L_InstructionTLBMiss - _start + _START_OFFSET
1638         bl      trap_reloc
1639
1640         li      r7, .L_DataTLBMiss - _start + _START_OFFSET
1641         bl      trap_reloc
1642 #endif /* CONFIG_440 */
1643
1644         li      r7, .L_DebugBreakpoint - _start + _START_OFFSET
1645         bl      trap_reloc
1646
1647 #if !defined(CONFIG_440)
1648         addi    r7,r0,0x1000            /* set ME bit (Machine Exceptions) */
1649         oris    r7,r7,0x0002            /* set CE bit (Critical Exceptions) */
1650         mtmsr   r7                      /* change MSR */
1651 #else
1652         bl      __440_msr_set
1653         b       __440_msr_continue
1654
1655 __440_msr_set:
1656         addi    r7,r0,0x1000            /* set ME bit (Machine Exceptions) */
1657         oris    r7,r7,0x0002            /* set CE bit (Critical Exceptions) */
1658         mtspr   srr1,r7
1659         mflr    r7
1660         mtspr   srr0,r7
1661         rfi
1662 __440_msr_continue:
1663 #endif
1664
1665         mtlr    r4                      /* restore link register        */
1666         blr
1667
1668         /*
1669          * Function: relocate entries for one exception vector
1670          */
1671 trap_reloc:
1672         lwz     r0, 0(r7)               /* hdlr ...                     */
1673         add     r0, r0, r3              /*  ... += dest_addr            */
1674         stw     r0, 0(r7)
1675
1676         lwz     r0, 4(r7)               /* int_return ...               */
1677         add     r0, r0, r3              /*  ... += dest_addr            */
1678         stw     r0, 4(r7)
1679
1680         blr
1681
1682 #if defined(CONFIG_440)
1683 /*----------------------------------------------------------------------------+
1684 | dcbz_area.
1685 +----------------------------------------------------------------------------*/
1686         function_prolog(dcbz_area)
1687         rlwinm. r5,r4,0,27,31
1688         rlwinm  r5,r4,27,5,31
1689         beq     ..d_ra2
1690         addi    r5,r5,0x0001
1691 ..d_ra2:mtctr   r5
1692 ..d_ag2:dcbz    r0,r3
1693         addi    r3,r3,32
1694         bdnz    ..d_ag2
1695         sync
1696         blr
1697         function_epilog(dcbz_area)
1698
1699 /*----------------------------------------------------------------------------+
1700 | dflush.  Assume 32K at vector address is cachable.
1701 +----------------------------------------------------------------------------*/
1702         function_prolog(dflush)
1703         mfmsr   r9
1704         rlwinm  r8,r9,0,15,13
1705         rlwinm  r8,r8,0,17,15
1706         mtmsr   r8
1707         mfspr   r8,dvlim
1708         addi    r3,r0,0x0000
1709         mtspr   dvlim,r3
1710         mfspr   r3,ivpr
1711         addi    r4,r0,1024
1712         mtctr   r4
1713 ..dflush_loop:
1714         lwz     r6,0x0(r3)
1715         addi    r3,r3,32
1716         bdnz    ..dflush_loop
1717         addi    r3,r3,-32
1718         mtctr   r4
1719 ..ag:   dcbf    r0,r3
1720         addi    r3,r3,-32
1721         bdnz    ..ag
1722         mtspr   dvlim,r8
1723         sync
1724         mtmsr   r9
1725         blr
1726         function_epilog(dflush)
1727 #endif /* CONFIG_440 */
1728 #endif /* CONFIG_NAND_SPL */
1729
1730 /*------------------------------------------------------------------------------- */
1731 /* Function:     in8 */
1732 /* Description:  Input 8 bits */
1733 /*------------------------------------------------------------------------------- */
1734         .globl  in8
1735 in8:
1736         lbz     r3,0x0000(r3)
1737         blr
1738
1739 /*------------------------------------------------------------------------------- */
1740 /* Function:     out8 */
1741 /* Description:  Output 8 bits */
1742 /*------------------------------------------------------------------------------- */
1743         .globl  out8
1744 out8:
1745         stb     r4,0x0000(r3)
1746         blr
1747
1748 /*------------------------------------------------------------------------------- */
1749 /* Function:     out32 */
1750 /* Description:  Output 32 bits */
1751 /*------------------------------------------------------------------------------- */
1752         .globl  out32
1753 out32:
1754         stw     r4,0x0000(r3)
1755         blr
1756
1757 /*------------------------------------------------------------------------------- */
1758 /* Function:     in32 */
1759 /* Description:  Input 32 bits */
1760 /*------------------------------------------------------------------------------- */
1761         .globl  in32
1762 in32:
1763         lwz     3,0x0000(3)
1764         blr
1765
1766 /**************************************************************************/
1767 /* PPC405EP specific stuff                                                */
1768 /**************************************************************************/
1769 #ifdef CONFIG_405EP
1770 ppc405ep_init:
1771
1772 #ifdef CONFIG_BUBINGA
1773         /*
1774          * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1775          * function) to support FPGA and NVRAM accesses below.
1776          */
1777
1778         lis     r3,GPIO0_OSRH@h         /* config GPIO output select */
1779         ori     r3,r3,GPIO0_OSRH@l
1780         lis     r4,CFG_GPIO0_OSRH@h
1781         ori     r4,r4,CFG_GPIO0_OSRH@l
1782         stw     r4,0(r3)
1783         lis     r3,GPIO0_OSRL@h
1784         ori     r3,r3,GPIO0_OSRL@l
1785         lis     r4,CFG_GPIO0_OSRL@h
1786         ori     r4,r4,CFG_GPIO0_OSRL@l
1787         stw     r4,0(r3)
1788
1789         lis     r3,GPIO0_ISR1H@h        /* config GPIO input select */
1790         ori     r3,r3,GPIO0_ISR1H@l
1791         lis     r4,CFG_GPIO0_ISR1H@h
1792         ori     r4,r4,CFG_GPIO0_ISR1H@l
1793         stw     r4,0(r3)
1794         lis     r3,GPIO0_ISR1L@h
1795         ori     r3,r3,GPIO0_ISR1L@l
1796         lis     r4,CFG_GPIO0_ISR1L@h
1797         ori     r4,r4,CFG_GPIO0_ISR1L@l
1798         stw     r4,0(r3)
1799
1800         lis     r3,GPIO0_TSRH@h         /* config GPIO three-state select */
1801         ori     r3,r3,GPIO0_TSRH@l
1802         lis     r4,CFG_GPIO0_TSRH@h
1803         ori     r4,r4,CFG_GPIO0_TSRH@l
1804         stw     r4,0(r3)
1805         lis     r3,GPIO0_TSRL@h
1806         ori     r3,r3,GPIO0_TSRL@l
1807         lis     r4,CFG_GPIO0_TSRL@h
1808         ori     r4,r4,CFG_GPIO0_TSRL@l
1809         stw     r4,0(r3)
1810
1811         lis     r3,GPIO0_TCR@h          /* config GPIO driver output enables */
1812         ori     r3,r3,GPIO0_TCR@l
1813         lis     r4,CFG_GPIO0_TCR@h
1814         ori     r4,r4,CFG_GPIO0_TCR@l
1815         stw     r4,0(r3)
1816
1817         li      r3,pb1ap                /* program EBC bank 1 for RTC access */
1818         mtdcr   ebccfga,r3
1819         lis     r3,CFG_EBC_PB1AP@h
1820         ori     r3,r3,CFG_EBC_PB1AP@l
1821         mtdcr   ebccfgd,r3
1822         li      r3,pb1cr
1823         mtdcr   ebccfga,r3
1824         lis     r3,CFG_EBC_PB1CR@h
1825         ori     r3,r3,CFG_EBC_PB1CR@l
1826         mtdcr   ebccfgd,r3
1827
1828         li      r3,pb1ap                /* program EBC bank 1 for RTC access */
1829         mtdcr   ebccfga,r3
1830         lis     r3,CFG_EBC_PB1AP@h
1831         ori     r3,r3,CFG_EBC_PB1AP@l
1832         mtdcr   ebccfgd,r3
1833         li      r3,pb1cr
1834         mtdcr   ebccfga,r3
1835         lis     r3,CFG_EBC_PB1CR@h
1836         ori     r3,r3,CFG_EBC_PB1CR@l
1837         mtdcr   ebccfgd,r3
1838
1839         li      r3,pb4ap                /* program EBC bank 4 for FPGA access */
1840         mtdcr   ebccfga,r3
1841         lis     r3,CFG_EBC_PB4AP@h
1842         ori     r3,r3,CFG_EBC_PB4AP@l
1843         mtdcr   ebccfgd,r3
1844         li      r3,pb4cr
1845         mtdcr   ebccfga,r3
1846         lis     r3,CFG_EBC_PB4CR@h
1847         ori     r3,r3,CFG_EBC_PB4CR@l
1848         mtdcr   ebccfgd,r3
1849 #endif
1850
1851         /*
1852         !-----------------------------------------------------------------------
1853         ! Check to see if chip is in bypass mode.
1854         ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1855         ! CPU reset   Otherwise, skip this step and keep going.
1856         ! Note:  Running BIOS in bypass mode is not supported since PLB speed
1857         !        will not be fast enough for the SDRAM (min 66MHz)
1858         !-----------------------------------------------------------------------
1859         */
1860         mfdcr   r5, CPC0_PLLMR1
1861         rlwinm  r4,r5,1,0x1            /* get system clock source (SSCS) */
1862         cmpi    cr0,0,r4,0x1
1863
1864         beq    pll_done                   /* if SSCS =b'1' then PLL has */
1865                                           /* already been set */
1866                                           /* and CPU has been reset */
1867                                           /* so skip to next section */
1868
1869 #ifdef CONFIG_BUBINGA
1870         /*
1871         !-----------------------------------------------------------------------
1872         ! Read NVRAM to get value to write in PLLMR.
1873         ! If value has not been correctly saved, write default value
1874         ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1875         ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1876         !
1877         ! WARNING:  This code assumes the first three words in the nvram_t
1878         !           structure in openbios.h.  Changing the beginning of
1879         !           the structure will break this code.
1880         !
1881         !-----------------------------------------------------------------------
1882         */
1883         addis   r3,0,NVRAM_BASE@h
1884         addi    r3,r3,NVRAM_BASE@l
1885
1886         lwz     r4, 0(r3)
1887         addis   r5,0,NVRVFY1@h
1888         addi    r5,r5,NVRVFY1@l
1889         cmp     cr0,0,r4,r5            /* Compare 1st NVRAM Magic number*/
1890         bne     ..no_pllset
1891         addi    r3,r3,4
1892         lwz     r4, 0(r3)
1893         addis   r5,0,NVRVFY2@h
1894         addi    r5,r5,NVRVFY2@l
1895         cmp     cr0,0,r4,r5            /* Compare 2 NVRAM Magic number */
1896         bne     ..no_pllset
1897         addi    r3,r3,8                 /* Skip over conf_size */
1898         lwz     r4, 4(r3)               /* Load PLLMR1 value from NVRAM */
1899         lwz     r3, 0(r3)               /* Load PLLMR0 value from NVRAM */
1900         rlwinm  r5,r4,1,0x1             /* get system clock source (SSCS) */
1901         cmpi     cr0,0,r5,1             /* See if PLL is locked */
1902         beq     pll_write
1903 ..no_pllset:
1904 #endif /* CONFIG_BUBINGA */
1905
1906 #ifdef CONFIG_TAIHU
1907         mfdcr   r4, CPC0_BOOT
1908         andi.   r5, r4, CPC0_BOOT_SEP@l
1909         bne     strap_1                 /* serial eeprom present */
1910         addis   r5,0,CPLD_REG0_ADDR@h
1911         ori     r5,r5,CPLD_REG0_ADDR@l
1912         andi.   r5, r5, 0x10
1913         bne     _pci_66mhz
1914 #endif /* CONFIG_TAIHU */
1915
1916 #if defined(CONFIG_ZEUS)
1917         mfdcr   r4, CPC0_BOOT
1918         andi.   r5, r4, CPC0_BOOT_SEP@l
1919         bne     strap_1         /* serial eeprom present */
1920         lis     r3,0x0000
1921         addi    r3,r3,0x3030
1922         lis     r4,0x8042
1923         addi    r4,r4,0x223e
1924         b       1f
1925 strap_1:
1926         mfdcr   r3, CPC0_PLLMR0
1927         mfdcr   r4, CPC0_PLLMR1
1928         b       1f
1929 #endif
1930
1931         addis   r3,0,PLLMR0_DEFAULT@h       /* PLLMR0 default value */
1932         ori     r3,r3,PLLMR0_DEFAULT@l     /* */
1933         addis   r4,0,PLLMR1_DEFAULT@h       /* PLLMR1 default value */
1934         ori     r4,r4,PLLMR1_DEFAULT@l     /* */
1935
1936 #ifdef CONFIG_TAIHU
1937         b       1f
1938 _pci_66mhz:
1939         addis   r3,0,PLLMR0_DEFAULT_PCI66@h
1940         ori     r3,r3,PLLMR0_DEFAULT_PCI66@l
1941         addis   r4,0,PLLMR1_DEFAULT_PCI66@h
1942         ori     r4,r4,PLLMR1_DEFAULT_PCI66@l
1943         b       1f
1944 strap_1:
1945         mfdcr   r3, CPC0_PLLMR0
1946         mfdcr   r4, CPC0_PLLMR1
1947 #endif /* CONFIG_TAIHU */
1948
1949 1:
1950         b       pll_write                 /* Write the CPC0_PLLMR with new value */
1951
1952 pll_done:
1953         /*
1954         !-----------------------------------------------------------------------
1955         ! Clear Soft Reset Register
1956         ! This is needed to enable PCI if not booting from serial EPROM
1957         !-----------------------------------------------------------------------
1958                 */
1959         addi    r3, 0, 0x0
1960         mtdcr   CPC0_SRR, r3
1961
1962         addis    r3,0,0x0010
1963         mtctr   r3
1964 pci_wait:
1965         bdnz    pci_wait
1966
1967         blr                               /* return to main code */
1968
1969 /*
1970 !-----------------------------------------------------------------------------
1971 ! Function:     pll_write
1972 ! Description:  Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1973 !               That is:
1974 !                         1.  Pll is first disabled (de-activated by putting in bypass mode)
1975 !                         2.  PLL is reset
1976 !                         3.  Clock dividers are set while PLL is held in reset and bypassed
1977 !                         4.  PLL Reset is cleared
1978 !                         5.  Wait 100us for PLL to lock
1979 !                         6.  A core reset is performed
1980 ! Input: r3 = Value to write to CPC0_PLLMR0
1981 ! Input: r4 = Value to write to CPC0_PLLMR1
1982 ! Output r3 = none
1983 !-----------------------------------------------------------------------------
1984 */
1985 pll_write:
1986         mfdcr  r5, CPC0_UCR
1987         andis. r5,r5,0xFFFF
1988         ori    r5,r5,0x0101              /* Stop the UART clocks */
1989         mtdcr  CPC0_UCR,r5               /* Before changing PLL */
1990
1991         mfdcr  r5, CPC0_PLLMR1
1992         rlwinm r5,r5,0,0x7FFFFFFF        /* Disable PLL */
1993         mtdcr   CPC0_PLLMR1,r5
1994         oris   r5,r5,0x4000              /* Set PLL Reset */
1995         mtdcr   CPC0_PLLMR1,r5
1996
1997         mtdcr   CPC0_PLLMR0,r3           /* Set clock dividers */
1998         rlwinm r5,r4,0,0x3FFFFFFF        /* Reset & Bypass new PLL dividers */
1999         oris   r5,r5,0x4000              /* Set PLL Reset */
2000         mtdcr   CPC0_PLLMR1,r5           /* Set clock dividers */
2001         rlwinm r5,r5,0,0xBFFFFFFF        /* Clear PLL Reset */
2002         mtdcr   CPC0_PLLMR1,r5
2003
2004                 /*
2005         ! Wait min of 100us for PLL to lock.
2006         ! See CMOS 27E databook for more info.
2007         ! At 200MHz, that means waiting 20,000 instructions
2008                  */
2009         addi    r3,0,20000              /* 2000 = 0x4e20 */
2010         mtctr   r3
2011 pll_wait:
2012         bdnz    pll_wait
2013
2014         oris   r5,r5,0x8000             /* Enable PLL */
2015         mtdcr   CPC0_PLLMR1,r5          /* Engage */
2016
2017         /*
2018          * Reset CPU to guarantee timings are OK
2019          * Not sure if this is needed...
2020          */
2021         addis r3,0,0x1000
2022         mtspr dbcr0,r3               /* This will cause a CPU core reset, and */
2023                                      /* execution will continue from the poweron */
2024                                      /* vector of 0xfffffffc */
2025 #endif /* CONFIG_405EP */
2026
2027 #if defined(CONFIG_440)
2028 /*----------------------------------------------------------------------------+
2029 | mttlb3.
2030 +----------------------------------------------------------------------------*/
2031         function_prolog(mttlb3)
2032         TLBWE(4,3,2)
2033         blr
2034         function_epilog(mttlb3)
2035
2036 /*----------------------------------------------------------------------------+
2037 | mftlb3.
2038 +----------------------------------------------------------------------------*/
2039         function_prolog(mftlb3)
2040         TLBRE(3,3,2)
2041         blr
2042         function_epilog(mftlb3)
2043
2044 /*----------------------------------------------------------------------------+
2045 | mttlb2.
2046 +----------------------------------------------------------------------------*/
2047         function_prolog(mttlb2)
2048         TLBWE(4,3,1)
2049         blr
2050         function_epilog(mttlb2)
2051
2052 /*----------------------------------------------------------------------------+
2053 | mftlb2.
2054 +----------------------------------------------------------------------------*/
2055         function_prolog(mftlb2)
2056         TLBRE(3,3,1)
2057         blr
2058         function_epilog(mftlb2)
2059
2060 /*----------------------------------------------------------------------------+
2061 | mttlb1.
2062 +----------------------------------------------------------------------------*/
2063         function_prolog(mttlb1)
2064         TLBWE(4,3,0)
2065         blr
2066         function_epilog(mttlb1)
2067
2068 /*----------------------------------------------------------------------------+
2069 | mftlb1.
2070 +----------------------------------------------------------------------------*/
2071         function_prolog(mftlb1)
2072         TLBRE(3,3,0)
2073         blr
2074         function_epilog(mftlb1)
2075 #endif /* CONFIG_440 */