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