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