blob: f5a135f1a01406a1cb0a0033b26cd856b5f127e7 [file] [log] [blame]
wdenk0442ed82002-11-03 10:24:00 +00001/*
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>
Stefan Roesef6c7b762007-03-24 15:45:34 +01005 * Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
wdenk0442ed82002-11-03 10:24:00 +00006 *
7 * See file CREDITS for list of people who contributed to this
8 * project.
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of
13 * the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23 * MA 02111-1307 USA
24 */
Wolfgang Denk09675ef2007-06-20 18:14:24 +020025/*------------------------------------------------------------------------------+
26 *
27 * This source code has been made available to you by IBM on an AS-IS
28 * basis. Anyone receiving this source is licensed under IBM
29 * copyrights to use it in any way he or she deems fit, including
30 * copying it, modifying it, compiling it, and redistributing it either
31 * with or without modifications. No license under IBM patents or
32 * patent applications is to be implied by the copyright license.
33 *
34 * Any user of this software should understand that IBM cannot provide
35 * technical support for this software and will not be responsible for
36 * any consequences resulting from the use of this software.
37 *
38 * Any person who transfers this source code or any derivative work
39 * must include the IBM copyright notice, this paragraph, and the
40 * preceding two paragraphs in the transferred software.
41 *
42 * COPYRIGHT I B M CORPORATION 1995
43 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
44 *-------------------------------------------------------------------------------
45 */
wdenk0442ed82002-11-03 10:24:00 +000046
Wolfgang Denk0ee70772005-09-23 11:05:55 +020047/* U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
wdenk0442ed82002-11-03 10:24:00 +000048 *
49 *
50 * The processor starts at 0xfffffffc and the code is executed
51 * from flash/rom.
52 * in memory, but as long we don't jump around before relocating.
53 * board_init lies at a quite high address and when the cpu has
54 * jumped there, everything is ok.
55 * This works because the cpu gives the FLASH (CS0) the whole
56 * address space at startup, and board_init lies as a echo of
57 * the flash somewhere up there in the memorymap.
58 *
59 * board_init will change CS0 to be positioned at the correct
60 * address and (s)dram will be positioned at address 0
61 */
62#include <config.h>
wdenk0442ed82002-11-03 10:24:00 +000063#include <ppc4xx.h>
64#include <version.h>
65
66#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
67
68#include <ppc_asm.tmpl>
69#include <ppc_defs.h>
70
71#include <asm/cache.h>
72#include <asm/mmu.h>
73
74#ifndef CONFIG_IDENT_STRING
75#define CONFIG_IDENT_STRING ""
76#endif
77
78#ifdef CFG_INIT_DCACHE_CS
79# if (CFG_INIT_DCACHE_CS == 0)
80# define PBxAP pb0ap
81# define PBxCR pb0cr
82# endif
83# if (CFG_INIT_DCACHE_CS == 1)
84# define PBxAP pb1ap
85# define PBxCR pb1cr
86# endif
87# if (CFG_INIT_DCACHE_CS == 2)
88# define PBxAP pb2ap
89# define PBxCR pb2cr
90# endif
91# if (CFG_INIT_DCACHE_CS == 3)
92# define PBxAP pb3ap
93# define PBxCR pb3cr
94# endif
95# if (CFG_INIT_DCACHE_CS == 4)
96# define PBxAP pb4ap
97# define PBxCR pb4cr
98# endif
99# if (CFG_INIT_DCACHE_CS == 5)
100# define PBxAP pb5ap
101# define PBxCR pb5cr
102# endif
103# if (CFG_INIT_DCACHE_CS == 6)
104# define PBxAP pb6ap
105# define PBxCR pb6cr
106# endif
107# if (CFG_INIT_DCACHE_CS == 7)
108# define PBxAP pb7ap
109# define PBxCR pb7cr
110# endif
111#endif /* CFG_INIT_DCACHE_CS */
112
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200113#define function_prolog(func_name) .text; \
Stefan Roese42743512007-06-01 15:27:11 +0200114 .align 2; \
115 .globl func_name; \
116 func_name:
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200117#define function_epilog(func_name) .type func_name,@function; \
Stefan Roese42743512007-06-01 15:27:11 +0200118 .size func_name,.-func_name
119
wdenk0442ed82002-11-03 10:24:00 +0000120/* We don't want the MMU yet.
121*/
122#undef MSR_KERNEL
123#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
124
125
126 .extern ext_bus_cntlr_init
127 .extern sdram_init
Stefan Roese42fbddd2006-09-07 11:51:23 +0200128#ifdef CONFIG_NAND_U_BOOT
129 .extern reconfig_tlb0
130#endif
wdenk0442ed82002-11-03 10:24:00 +0000131
132/*
133 * Set up GOT: Global Offset Table
134 *
135 * Use r14 to access the GOT
136 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200137#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000138 START_GOT
139 GOT_ENTRY(_GOT2_TABLE_)
140 GOT_ENTRY(_FIXUP_TABLE_)
141
142 GOT_ENTRY(_start)
143 GOT_ENTRY(_start_of_vectors)
144 GOT_ENTRY(_end_of_vectors)
145 GOT_ENTRY(transfer_to_handler)
146
wdenkb9a83a92003-05-30 12:48:29 +0000147 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000148 GOT_ENTRY(_end)
wdenkbf2f8c92003-05-22 22:52:13 +0000149 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000150 END_GOT
Stefan Roese42fbddd2006-09-07 11:51:23 +0200151#endif /* CONFIG_NAND_SPL */
152
153#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
154 /*
155 * NAND U-Boot image is started from offset 0
156 */
157 .text
Stefan Roese23d8d342007-06-06 11:42:13 +0200158#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200159 bl reconfig_tlb0
Stefan Roese23d8d342007-06-06 11:42:13 +0200160#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200161 GET_GOT
162 bl cpu_init_f /* run low-level CPU init code (from Flash) */
163 bl board_init_f
164#endif
wdenk0442ed82002-11-03 10:24:00 +0000165
166/*
167 * 440 Startup -- on reset only the top 4k of the effective
168 * address space is mapped in by an entry in the instruction
169 * and data shadow TLB. The .bootpg section is located in the
170 * top 4k & does only what's necessary to map in the the rest
171 * of the boot rom. Once the boot rom is mapped in we can
172 * proceed with normal startup.
173 *
174 * NOTE: CS0 only covers the top 2MB of the effective address
175 * space after reset.
176 */
177
178#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200179#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000180 .section .bootpg,"ax"
Stefan Roese42fbddd2006-09-07 11:51:23 +0200181#endif
wdenk0442ed82002-11-03 10:24:00 +0000182 .globl _start_440
183
184/**************************************************************************/
185_start_440:
Wolfgang Denk4df0da52006-10-09 00:42:01 +0200186 /*--------------------------------------------------------------------+
187 | 440EPX BUP Change - Hardware team request
188 +--------------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200189#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
190 sync
191 nop
192 nop
193#endif
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200194 /*----------------------------------------------------------------+
195 | Core bug fix. Clear the esr
196 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200197 li r0,0
Wolfgang Denkba940932006-07-19 13:50:38 +0200198 mtspr esr,r0
wdenk0442ed82002-11-03 10:24:00 +0000199 /*----------------------------------------------------------------*/
200 /* Clear and set up some registers. */
201 /*----------------------------------------------------------------*/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200202 iccci r0,r0 /* NOTE: operands not used for 440 */
203 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000204 sync
205 li r0,0
206 mtspr srr0,r0
207 mtspr srr1,r0
208 mtspr csrr0,r0
209 mtspr csrr1,r0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200210 /* NOTE: 440GX adds machine check status regs */
211#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200212 mtspr mcsrr0,r0
213 mtspr mcsrr1,r0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200214 mfspr r1,mcsr
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200215 mtspr mcsr,r1
wdenk544e9732004-02-06 23:19:44 +0000216#endif
Stefan Roese0100cc12006-11-22 13:20:50 +0100217
218 /*----------------------------------------------------------------*/
219 /* CCR0 init */
220 /*----------------------------------------------------------------*/
221 /* Disable store gathering & broadcast, guarantee inst/data
222 * cache block touch, force load/store alignment
223 * (see errata 1.12: 440_33)
224 */
225 lis r1,0x0030 /* store gathering & broadcast disable */
226 ori r1,r1,0x6000 /* cache touch */
227 mtspr ccr0,r1
228
wdenk0442ed82002-11-03 10:24:00 +0000229 /*----------------------------------------------------------------*/
230 /* Initialize debug */
231 /*----------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200232 mfspr r1,dbcr0
233 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
234 bne skip_debug_init /* if set, don't clear debug register */
wdenk0442ed82002-11-03 10:24:00 +0000235 mtspr dbcr0,r0
236 mtspr dbcr1,r0
237 mtspr dbcr2,r0
238 mtspr iac1,r0
239 mtspr iac2,r0
240 mtspr iac3,r0
241 mtspr dac1,r0
242 mtspr dac2,r0
243 mtspr dvc1,r0
244 mtspr dvc2,r0
245
246 mfspr r1,dbsr
247 mtspr dbsr,r1 /* Clear all valid bits */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200248skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000249
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200250#if defined (CONFIG_440SPE)
251 /*----------------------------------------------------------------+
252 | Initialize Core Configuration Reg1.
253 | a. ICDPEI: Record even parity. Normal operation.
254 | b. ICTPEI: Record even parity. Normal operation.
255 | c. DCTPEI: Record even parity. Normal operation.
256 | d. DCDPEI: Record even parity. Normal operation.
257 | e. DCUPEI: Record even parity. Normal operation.
258 | f. DCMPEI: Record even parity. Normal operation.
259 | g. FCOM: Normal operation
260 | h. MMUPEI: Record even parity. Normal operation.
261 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200262 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200263 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200264 li r0,0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200265 mtspr ccr1, r0
266
267 /*----------------------------------------------------------------+
268 | Reset the timebase.
269 | The previous write to CCR1 sets the timebase source.
270 +-----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200271 mtspr tbl, r0
272 mtspr tbu, r0
273#endif
274
wdenk0442ed82002-11-03 10:24:00 +0000275 /*----------------------------------------------------------------*/
276 /* Setup interrupt vectors */
277 /*----------------------------------------------------------------*/
278 mtspr ivpr,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200279 li r1,0x0100
wdenk0442ed82002-11-03 10:24:00 +0000280 mtspr ivor0,r1 /* Critical input */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200281 li r1,0x0200
wdenk0442ed82002-11-03 10:24:00 +0000282 mtspr ivor1,r1 /* Machine check */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200283 li r1,0x0300
wdenk0442ed82002-11-03 10:24:00 +0000284 mtspr ivor2,r1 /* Data storage */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200285 li r1,0x0400
wdenk0442ed82002-11-03 10:24:00 +0000286 mtspr ivor3,r1 /* Instruction storage */
287 li r1,0x0500
288 mtspr ivor4,r1 /* External interrupt */
289 li r1,0x0600
290 mtspr ivor5,r1 /* Alignment */
291 li r1,0x0700
292 mtspr ivor6,r1 /* Program check */
293 li r1,0x0800
294 mtspr ivor7,r1 /* Floating point unavailable */
295 li r1,0x0c00
296 mtspr ivor8,r1 /* System call */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200297 li r1,0x0a00
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200298 mtspr ivor9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200299 li r1,0x0900
300 mtspr ivor10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000301 li r1,0x1300
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200302 mtspr ivor13,r1 /* Data TLB error */
303 li r1,0x1400
wdenk0442ed82002-11-03 10:24:00 +0000304 mtspr ivor14,r1 /* Instr TLB error */
305 li r1,0x2000
306 mtspr ivor15,r1 /* Debug */
307
308 /*----------------------------------------------------------------*/
309 /* Configure cache regions */
310 /*----------------------------------------------------------------*/
311 mtspr inv0,r0
312 mtspr inv1,r0
313 mtspr inv2,r0
314 mtspr inv3,r0
315 mtspr dnv0,r0
316 mtspr dnv1,r0
317 mtspr dnv2,r0
318 mtspr dnv3,r0
319 mtspr itv0,r0
320 mtspr itv1,r0
321 mtspr itv2,r0
322 mtspr itv3,r0
323 mtspr dtv0,r0
324 mtspr dtv1,r0
325 mtspr dtv2,r0
326 mtspr dtv3,r0
327
328 /*----------------------------------------------------------------*/
329 /* Cache victim limits */
330 /*----------------------------------------------------------------*/
331 /* floors 0, ceiling max to use the entire cache -- nothing locked
332 */
333 lis r1,0x0001
334 ori r1,r1,0xf800
335 mtspr ivlim,r1
336 mtspr dvlim,r1
337
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200338 /*----------------------------------------------------------------+
339 |Initialize MMUCR[STID] = 0.
340 +-----------------------------------------------------------------*/
341 mfspr r0,mmucr
342 addis r1,0,0xFFFF
343 ori r1,r1,0xFF00
344 and r0,r0,r1
345 mtspr mmucr,r0
346
wdenk0442ed82002-11-03 10:24:00 +0000347 /*----------------------------------------------------------------*/
348 /* Clear all TLB entries -- TID = 0, TS = 0 */
349 /*----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200350 addis r0,0,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000351 li r1,0x003f /* 64 TLB entries */
352 mtctr r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200353rsttlb: tlbwe r0,r1,0x0000 /* Invalidate all entries (V=0)*/
354 tlbwe r0,r1,0x0001
355 tlbwe r0,r1,0x0002
wdenk0442ed82002-11-03 10:24:00 +0000356 subi r1,r1,0x0001
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200357 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000358
359 /*----------------------------------------------------------------*/
360 /* TLB entry setup -- step thru tlbtab */
361 /*----------------------------------------------------------------*/
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200362#if defined(CONFIG_440SPE)
363 /*----------------------------------------------------------------*/
364 /* We have different TLB tables for revA and rev B of 440SPe */
365 /*----------------------------------------------------------------*/
366 mfspr r1, PVR
367 lis r0,0x5342
368 ori r0,r0,0x1891
369 cmpw r7,r1,r0
370 bne r7,..revA
371 bl tlbtabB
372 b ..goon
373..revA:
374 bl tlbtabA
375..goon:
376#else
wdenk0442ed82002-11-03 10:24:00 +0000377 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200378#endif
wdenk0442ed82002-11-03 10:24:00 +0000379 mr r5,r0
380 li r1,0x003f /* 64 TLB entries max */
381 mtctr r1
382 li r4,0 /* TLB # */
383
384 addi r5,r5,-4
3851: lwzu r0,4(r5)
386 cmpwi r0,0
387 beq 2f /* 0 marks end */
388 lwzu r1,4(r5)
389 lwzu r2,4(r5)
390 tlbwe r0,r4,0 /* TLB Word 0 */
391 tlbwe r1,r4,1 /* TLB Word 1 */
392 tlbwe r2,r4,2 /* TLB Word 2 */
393 addi r4,r4,1 /* Next TLB */
394 bdnz 1b
395
396 /*----------------------------------------------------------------*/
397 /* Continue from 'normal' start */
398 /*----------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +02003992:
400
401#if defined(CONFIG_NAND_SPL)
Stefan Roese42743512007-06-01 15:27:11 +0200402#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200403 /*
Stefan Roese42743512007-06-01 15:27:11 +0200404 * Enable internal SRAM (only on 440EPx/GRx, 440EP/GR have no OCM)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200405 */
406 lis r2,0x7fff
407 ori r2,r2,0xffff
408 mfdcr r1,isram0_dpc
409 and r1,r1,r2 /* Disable parity check */
410 mtdcr isram0_dpc,r1
411 mfdcr r1,isram0_pmeg
412 and r1,r1,r2 /* Disable pwr mgmt */
413 mtdcr isram0_pmeg,r1
Stefan Roese42743512007-06-01 15:27:11 +0200414#endif
415#if defined(CONFIG_440EP)
416 /*
417 * On 440EP with no internal SRAM, we setup SDRAM very early
418 * and copy the NAND_SPL to SDRAM and jump to it
419 */
420 /* Clear Dcache to use as RAM */
421 addis r3,r0,CFG_INIT_RAM_ADDR@h
422 ori r3,r3,CFG_INIT_RAM_ADDR@l
423 addis r4,r0,CFG_INIT_RAM_END@h
424 ori r4,r4,CFG_INIT_RAM_END@l
425 rlwinm. r5,r4,0,27,31
426 rlwinm r5,r4,27,5,31
427 beq ..d_ran3
428 addi r5,r5,0x0001
429..d_ran3:
430 mtctr r5
431..d_ag3:
432 dcbz r0,r3
433 addi r3,r3,32
434 bdnz ..d_ag3
435 /*----------------------------------------------------------------*/
436 /* Setup the stack in internal SRAM */
437 /*----------------------------------------------------------------*/
438 lis r1,CFG_INIT_RAM_ADDR@h
439 ori r1,r1,CFG_INIT_SP_OFFSET@l
440 li r0,0
441 stwu r0,-4(r1)
442 stwu r0,-4(r1) /* Terminate call chain */
443
444 stwu r1,-8(r1) /* Save back chain and move SP */
445 lis r0,RESET_VECTOR@h /* Address of reset vector */
446 ori r0,r0, RESET_VECTOR@l
447 stwu r1,-8(r1) /* Save back chain and move SP */
448 stw r0,+12(r1) /* Save return addr (underflow vect) */
449 sync
450 bl early_sdram_init
451 sync
452#endif /* CONFIG_440EP */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200453
454 /*
455 * Copy SPL from cache into internal SRAM
456 */
457 li r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
458 mtctr r4
459 lis r2,CFG_NAND_BOOT_SPL_SRC@h
460 ori r2,r2,CFG_NAND_BOOT_SPL_SRC@l
461 lis r3,CFG_NAND_BOOT_SPL_DST@h
462 ori r3,r3,CFG_NAND_BOOT_SPL_DST@l
463spl_loop:
464 lwzu r4,4(r2)
465 stwu r4,4(r3)
466 bdnz spl_loop
467
468 /*
469 * Jump to code in RAM
470 */
471 bl 00f
47200: mflr r10
473 lis r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
474 ori r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
475 sub r10,r10,r3
476 addi r10,r10,28
477 mtlr r10
478 blr
479
480start_ram:
481 sync
482 isync
Stefan Roese42743512007-06-01 15:27:11 +0200483#endif /* CONFIG_NAND_SPL */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200484
485 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000486 b _start
487
4883: li r0,0
489 mtspr srr1,r0 /* Keep things disabled for now */
490 mflr r1
491 mtspr srr0,r1
492 rfi
stroese434979e2003-05-23 11:18:02 +0000493#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000494
495/*
496 * r3 - 1st arg to board_init(): IMMP pointer
497 * r4 - 2nd arg to board_init(): boot flag
498 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200499#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000500 .text
501 .long 0x27051956 /* U-Boot Magic Number */
502 .globl version_string
503version_string:
504 .ascii U_BOOT_VERSION
505 .ascii " (", __DATE__, " - ", __TIME__, ")"
506 .ascii CONFIG_IDENT_STRING, "\0"
507
wdenk0442ed82002-11-03 10:24:00 +0000508 . = EXC_OFF_SYS_RESET
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200509 .globl _start_of_vectors
510_start_of_vectors:
511
512/* Critical input. */
513 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
514
515#ifdef CONFIG_440
516/* Machine check */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200517 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200518#else
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200519 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200520#endif /* CONFIG_440 */
521
522/* Data Storage exception. */
523 STD_EXCEPTION(0x300, DataStorage, UnknownException)
524
525/* Instruction Storage exception. */
526 STD_EXCEPTION(0x400, InstStorage, UnknownException)
527
528/* External Interrupt exception. */
529 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
530
531/* Alignment exception. */
532 . = 0x600
533Alignment:
534 EXCEPTION_PROLOG(SRR0, SRR1)
535 mfspr r4,DAR
536 stw r4,_DAR(r21)
537 mfspr r5,DSISR
538 stw r5,_DSISR(r21)
539 addi r3,r1,STACK_FRAME_OVERHEAD
540 li r20,MSR_KERNEL
541 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
542 lwz r6,GOT(transfer_to_handler)
543 mtlr r6
544 blrl
545.L_Alignment:
546 .long AlignmentException - _start + _START_OFFSET
547 .long int_return - _start + _START_OFFSET
548
549/* Program check exception */
550 . = 0x700
551ProgramCheck:
552 EXCEPTION_PROLOG(SRR0, SRR1)
553 addi r3,r1,STACK_FRAME_OVERHEAD
554 li r20,MSR_KERNEL
555 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
556 lwz r6,GOT(transfer_to_handler)
557 mtlr r6
558 blrl
559.L_ProgramCheck:
560 .long ProgramCheckException - _start + _START_OFFSET
561 .long int_return - _start + _START_OFFSET
562
563#ifdef CONFIG_440
564 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
565 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
566 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roese80d99a42007-06-19 16:42:31 +0200567#endif
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200568 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
569
570#ifdef CONFIG_440
571 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
572 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
573#else
574 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
575 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
576 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
577#endif
578 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
579
580 .globl _end_of_vectors
581_end_of_vectors:
582 . = _START_OFFSET
Stefan Roese42fbddd2006-09-07 11:51:23 +0200583#endif
wdenk0442ed82002-11-03 10:24:00 +0000584 .globl _start
585_start:
586
587/*****************************************************************************/
588#if defined(CONFIG_440)
589
590 /*----------------------------------------------------------------*/
591 /* Clear and set up some registers. */
592 /*----------------------------------------------------------------*/
593 li r0,0x0000
594 lis r1,0xffff
595 mtspr dec,r0 /* prevent dec exceptions */
596 mtspr tbl,r0 /* prevent fit & wdt exceptions */
597 mtspr tbu,r0
598 mtspr tsr,r1 /* clear all timer exception status */
599 mtspr tcr,r0 /* disable all */
600 mtspr esr,r0 /* clear exception syndrome register */
601 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000602
603 /*----------------------------------------------------------------*/
604 /* Debug setup -- some (not very good) ice's need an event*/
605 /* to establish control :-( Define CFG_INIT_DBCR to the dbsr */
606 /* value you need in this case 0x8cff 0000 should do the trick */
607 /*----------------------------------------------------------------*/
608#if defined(CFG_INIT_DBCR)
609 lis r1,0xffff
610 ori r1,r1,0xffff
611 mtspr dbsr,r1 /* Clear all status bits */
612 lis r0,CFG_INIT_DBCR@h
613 ori r0,r0,CFG_INIT_DBCR@l
614 mtspr dbcr0,r0
615 isync
616#endif
617
618 /*----------------------------------------------------------------*/
619 /* Setup the internal SRAM */
620 /*----------------------------------------------------------------*/
621 li r0,0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200622
623#ifdef CFG_INIT_RAM_DCACHE
Stefan Roese326c9712005-08-01 16:41:48 +0200624 /* Clear Dcache to use as RAM */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200625 addis r3,r0,CFG_INIT_RAM_ADDR@h
626 ori r3,r3,CFG_INIT_RAM_ADDR@l
627 addis r4,r0,CFG_INIT_RAM_END@h
628 ori r4,r4,CFG_INIT_RAM_END@l
Stefan Roese326c9712005-08-01 16:41:48 +0200629 rlwinm. r5,r4,0,27,31
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200630 rlwinm r5,r4,27,5,31
631 beq ..d_ran
632 addi r5,r5,0x0001
Stefan Roese326c9712005-08-01 16:41:48 +0200633..d_ran:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200634 mtctr r5
Stefan Roese326c9712005-08-01 16:41:48 +0200635..d_ag:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200636 dcbz r0,r3
637 addi r3,r3,32
638 bdnz ..d_ag
Stefan Roese42fbddd2006-09-07 11:51:23 +0200639#endif /* CFG_INIT_RAM_DCACHE */
640
641 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
642#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
643 /* not all PPC's have internal SRAM usable as L2-cache */
644#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200645 mtdcr l2_cache_cfg,r0 /* Ensure L2 Cache is off */
wdenk544e9732004-02-06 23:19:44 +0000646#endif
wdenk0442ed82002-11-03 10:24:00 +0000647
Stefan Roese42fbddd2006-09-07 11:51:23 +0200648 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000649 ori r2,r2,0xffff
650 mfdcr r1,isram0_dpc
651 and r1,r1,r2 /* Disable parity check */
652 mtdcr isram0_dpc,r1
653 mfdcr r1,isram0_pmeg
Stefan Roese42fbddd2006-09-07 11:51:23 +0200654 and r1,r1,r2 /* Disable pwr mgmt */
wdenk0442ed82002-11-03 10:24:00 +0000655 mtdcr isram0_pmeg,r1
656
657 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese99644742005-11-29 18:18:21 +0100658#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenk544e9732004-02-06 23:19:44 +0000659 ori r1,r1,0x0980 /* first 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200660 mtdcr isram0_sb0cr,r1
wdenk544e9732004-02-06 23:19:44 +0000661 lis r1,0x8001
662 ori r1,r1,0x0980 /* second 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200663 mtdcr isram0_sb1cr,r1
wdenk544e9732004-02-06 23:19:44 +0000664 lis r1, 0x8002
665 ori r1,r1, 0x0980 /* third 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200666 mtdcr isram0_sb2cr,r1
wdenk544e9732004-02-06 23:19:44 +0000667 lis r1, 0x8003
668 ori r1,r1, 0x0980 /* fourth 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200669 mtdcr isram0_sb3cr,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200670#elif defined(CONFIG_440SPE)
671 lis r1,0x0000 /* BAS = 0000_0000 */
672 ori r1,r1,0x0984 /* first 64k */
673 mtdcr isram0_sb0cr,r1
674 lis r1,0x0001
675 ori r1,r1,0x0984 /* second 64k */
676 mtdcr isram0_sb1cr,r1
677 lis r1, 0x0002
678 ori r1,r1, 0x0984 /* third 64k */
679 mtdcr isram0_sb2cr,r1
680 lis r1, 0x0003
681 ori r1,r1, 0x0984 /* fourth 64k */
682 mtdcr isram0_sb3cr,r1
Stefan Roese42fbddd2006-09-07 11:51:23 +0200683#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000684 ori r1,r1,0x0380 /* 8k rw */
685 mtdcr isram0_sb0cr,r1
Stefan Roese42fbddd2006-09-07 11:51:23 +0200686 mtdcr isram0_sb1cr,r0 /* Disable bank 1 */
Stefan Roese326c9712005-08-01 16:41:48 +0200687#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200688#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000689
690 /*----------------------------------------------------------------*/
691 /* Setup the stack in internal SRAM */
692 /*----------------------------------------------------------------*/
693 lis r1,CFG_INIT_RAM_ADDR@h
694 ori r1,r1,CFG_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000695 li r0,0
696 stwu r0,-4(r1)
697 stwu r0,-4(r1) /* Terminate call chain */
698
699 stwu r1,-8(r1) /* Save back chain and move SP */
700 lis r0,RESET_VECTOR@h /* Address of reset vector */
701 ori r0,r0, RESET_VECTOR@l
702 stwu r1,-8(r1) /* Save back chain and move SP */
703 stw r0,+12(r1) /* Save return addr (underflow vect) */
704
Stefan Roese42fbddd2006-09-07 11:51:23 +0200705#ifdef CONFIG_NAND_SPL
706 bl nand_boot /* will not return */
707#else
wdenk0442ed82002-11-03 10:24:00 +0000708 GET_GOT
Stefan Roesec443fe92005-11-22 13:20:42 +0100709
710 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000711 bl board_init_f
Stefan Roese42fbddd2006-09-07 11:51:23 +0200712#endif
wdenk0442ed82002-11-03 10:24:00 +0000713
714#endif /* CONFIG_440 */
715
716/*****************************************************************************/
717#ifdef CONFIG_IOP480
718 /*----------------------------------------------------------------------- */
719 /* Set up some machine state registers. */
720 /*----------------------------------------------------------------------- */
721 addi r0,r0,0x0000 /* initialize r0 to zero */
722 mtspr esr,r0 /* clear Exception Syndrome Reg */
723 mttcr r0 /* timer control register */
724 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000725 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
726 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
727 mtdbsr r4 /* clear/reset the dbsr */
728 mtexisr r4 /* clear all pending interrupts */
729 addis r4,r0,0x8000
730 mtexier r4 /* enable critical exceptions */
731 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
732 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
733 mtiocr r4 /* since bit not used) & DRC to latch */
734 /* data bus on rising edge of CAS */
735 /*----------------------------------------------------------------------- */
736 /* Clear XER. */
737 /*----------------------------------------------------------------------- */
738 mtxer r0
739 /*----------------------------------------------------------------------- */
740 /* Invalidate i-cache and d-cache TAG arrays. */
741 /*----------------------------------------------------------------------- */
742 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
743 addi r4,0,1024 /* 1/4 of I-cache */
744..cloop:
745 iccci 0,r3
746 iccci r4,r3
747 dccci 0,r3
748 addic. r3,r3,-16 /* move back one cache line */
749 bne ..cloop /* loop back to do rest until r3 = 0 */
750
751 /* */
752 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
753 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
754 /* */
755
756 /* first copy IOP480 register base address into r3 */
757 addis r3,0,0x5000 /* IOP480 register base address hi */
758/* ori r3,r3,0x0000 / IOP480 register base address lo */
759
760#ifdef CONFIG_ADCIOP
761 /* use r4 as the working variable */
762 /* turn on CS3 (LOCCTL.7) */
763 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
764 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
765 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
766#endif
767
768#ifdef CONFIG_DASA_SIM
769 /* use r4 as the working variable */
770 /* turn on MA17 (LOCCTL.7) */
771 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
772 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
773 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
774#endif
775
776 /* turn on MA16..13 (LCS0BRD.12 = 0) */
777 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
778 andi. r4,r4,0xefff /* make bit 12 = 0 */
779 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
780
781 /* make sure above stores all comlete before going on */
782 sync
783
784 /* last thing, set local init status done bit (DEVINIT.31) */
785 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
786 oris r4,r4,0x8000 /* make bit 31 = 1 */
787 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
788
789 /* clear all pending interrupts and disable all interrupts */
790 li r4,-1 /* set p1 to 0xffffffff */
791 stw r4,0x1b0(r3) /* clear all pending interrupts */
792 stw r4,0x1b8(r3) /* clear all pending interrupts */
793 li r4,0 /* set r4 to 0 */
794 stw r4,0x1b4(r3) /* disable all interrupts */
795 stw r4,0x1bc(r3) /* disable all interrupts */
796
797 /* make sure above stores all comlete before going on */
798 sync
799
800 /*----------------------------------------------------------------------- */
801 /* Enable two 128MB cachable regions. */
802 /*----------------------------------------------------------------------- */
Stefan Roese153b3e22007-10-05 17:10:59 +0200803 addis r1,r0,0xc000
wdenk0442ed82002-11-03 10:24:00 +0000804 addi r1,r1,0x0001
805 mticcr r1 /* instruction cache */
806
807 addis r1,r0,0x0000
808 addi r1,r1,0x0000
809 mtdccr r1 /* data cache */
810
811 addis r1,r0,CFG_INIT_RAM_ADDR@h
812 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack to SDRAM */
813 li r0, 0 /* Make room for stack frame header and */
814 stwu r0, -4(r1) /* clear final stack frame so that */
815 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
816
817 GET_GOT /* initialize GOT access */
818
819 bl board_init_f /* run first part of init code (from Flash) */
820
821#endif /* CONFIG_IOP480 */
822
823/*****************************************************************************/
Stefan Roese17ffbc82007-03-21 13:38:59 +0100824#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
825 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roese153b3e22007-10-05 17:10:59 +0200826 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000827 /*----------------------------------------------------------------------- */
828 /* Clear and set up some registers. */
829 /*----------------------------------------------------------------------- */
830 addi r4,r0,0x0000
Stefan Roese153b3e22007-10-05 17:10:59 +0200831#if !defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000832 mtspr sgr,r4
Stefan Roese153b3e22007-10-05 17:10:59 +0200833#else
834 /*
835 * On 405EX, completely clearing the SGR leads to PPC hangup
836 * upon PCIe configuration access. The PCIe memory regions
837 * need to be guarded!
838 */
839 lis r3,0x0000
840 ori r3,r3,0x7FFC
841 mtspr sgr,r3
842#endif
wdenk0442ed82002-11-03 10:24:00 +0000843 mtspr dcwr,r4
844 mtesr r4 /* clear Exception Syndrome Reg */
845 mttcr r4 /* clear Timer Control Reg */
846 mtxer r4 /* clear Fixed-Point Exception Reg */
847 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000848 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
849 /* dbsr is cleared by setting bits to 1) */
850 mtdbsr r4 /* clear/reset the dbsr */
851
852 /*----------------------------------------------------------------------- */
853 /* Invalidate I and D caches. Enable I cache for defined memory regions */
854 /* to speed things up. Leave the D cache disabled for now. It will be */
855 /* enabled/left disabled later based on user selected menu options. */
856 /* Be aware that the I cache may be disabled later based on the menu */
857 /* options as well. See miscLib/main.c. */
858 /*----------------------------------------------------------------------- */
859 bl invalidate_icache
860 bl invalidate_dcache
861
862 /*----------------------------------------------------------------------- */
863 /* Enable two 128MB cachable regions. */
864 /*----------------------------------------------------------------------- */
Stefan Roese153b3e22007-10-05 17:10:59 +0200865 lis r4,0xc000
Stefan Roese17ffbc82007-03-21 13:38:59 +0100866 ori r4,r4,0x0001
wdenk0442ed82002-11-03 10:24:00 +0000867 mticcr r4 /* instruction cache */
868 isync
869
Stefan Roese17ffbc82007-03-21 13:38:59 +0100870 lis r4,0x0000
871 ori r4,r4,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000872 mtdccr r4 /* data cache */
873
Stefan Roese153b3e22007-10-05 17:10:59 +0200874#if !(defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR)) || defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000875 /*----------------------------------------------------------------------- */
876 /* Tune the speed and size for flash CS0 */
877 /*----------------------------------------------------------------------- */
878 bl ext_bus_cntlr_init
879#endif
Stefan Roese153b3e22007-10-05 17:10:59 +0200880#if !(defined(CFG_INIT_DCACHE_CS) || defined(CFG_TEMP_STACK_OCM))
881 /*
882 * Boards like the Kilauea (405EX) don't have OCM and can't use
883 * DCache for init-ram. So setup stack here directly after the
884 * SDRAM is initialized.
885 */
886 lis r1, CFG_INIT_RAM_ADDR@h
887 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack in SDRAM */
888
889 li r0, 0 /* Make room for stack frame header and */
890 stwu r0, -4(r1) /* clear final stack frame so that */
891 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
892 /*
893 * Set up a dummy frame to store reset vector as return address.
894 * this causes stack underflow to reset board.
895 */
896 stwu r1, -8(r1) /* Save back chain and move SP */
897 lis r0, RESET_VECTOR@h /* Address of reset vector */
898 ori r0, r0, RESET_VECTOR@l
899 stwu r1, -8(r1) /* Save back chain and move SP */
900 stw r0, +12(r1) /* Save return addr (underflow vect) */
901#endif /* !(CFG_INIT_DCACHE_CS || !CFG_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000902
stroese434979e2003-05-23 11:18:02 +0000903#if defined(CONFIG_405EP)
904 /*----------------------------------------------------------------------- */
905 /* DMA Status, clear to come up clean */
906 /*----------------------------------------------------------------------- */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200907 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
908 ori r3,r3, 0xFFFF
909 mtdcr dmasr, r3
stroese434979e2003-05-23 11:18:02 +0000910
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200911 bl ppc405ep_init /* do ppc405ep specific init */
stroese434979e2003-05-23 11:18:02 +0000912#endif /* CONFIG_405EP */
913
wdenk0442ed82002-11-03 10:24:00 +0000914#if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)
Stefan Roese17ffbc82007-03-21 13:38:59 +0100915#if defined(CONFIG_405EZ)
916 /********************************************************************
917 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
918 *******************************************************************/
919 /*
920 * We can map the OCM on the PLB3, so map it at
921 * CFG_OCM_DATA_ADDR + 0x8000
922 */
923 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
924 ori r3,r3,CFG_OCM_DATA_ADDR@l
Stefan Roese80d99a42007-06-19 16:42:31 +0200925 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100926 mtdcr ocmplb3cr1,r3 /* Set PLB Access */
927 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
928 mtdcr ocmplb3cr2,r3 /* Set PLB Access */
929 isync
930
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200931 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100932 ori r3,r3,CFG_OCM_DATA_ADDR@l
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200933 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
934 mtdcr ocmdscr1, r3 /* Set Data Side */
935 mtdcr ocmiscr1, r3 /* Set Instruction Side */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100936 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200937 mtdcr ocmdscr2, r3 /* Set Data Side */
938 mtdcr ocmiscr2, r3 /* Set Instruction Side */
939 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed85f5d72007-05-24 09:49:00 +0200940 mtdcr ocmdsisdpc,r3
Stefan Roese17ffbc82007-03-21 13:38:59 +0100941
942 isync
Stefan Roesef6c7b762007-03-24 15:45:34 +0100943#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000944 /********************************************************************
945 * Setup OCM - On Chip Memory
946 *******************************************************************/
947 /* Setup OCM */
wdenk57b2d802003-06-27 21:31:46 +0000948 lis r0, 0x7FFF
949 ori r0, r0, 0xFFFF
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200950 mfdcr r3, ocmiscntl /* get instr-side IRAM config */
Stefan Roesef6c7b762007-03-24 15:45:34 +0100951 mfdcr r4, ocmdscntl /* get data-side IRAM config */
952 and r3, r3, r0 /* disable data-side IRAM */
953 and r4, r4, r0 /* disable data-side IRAM */
954 mtdcr ocmiscntl, r3 /* set instr-side IRAM config */
955 mtdcr ocmdscntl, r4 /* set data-side IRAM config */
wdenk57b2d802003-06-27 21:31:46 +0000956 isync
wdenk0442ed82002-11-03 10:24:00 +0000957
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200958 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roesef6c7b762007-03-24 15:45:34 +0100959 ori r3,r3,CFG_OCM_DATA_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +0000960 mtdcr ocmdsarc, r3
961 addis r4, 0, 0xC000 /* OCM data area enabled */
962 mtdcr ocmdscntl, r4
wdenk57b2d802003-06-27 21:31:46 +0000963 isync
Stefan Roese17ffbc82007-03-21 13:38:59 +0100964#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000965#endif
966
Stefan Roese23d8d342007-06-06 11:42:13 +0200967#ifdef CONFIG_NAND_SPL
968 /*
969 * Copy SPL from cache into internal SRAM
970 */
971 li r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
972 mtctr r4
973 lis r2,CFG_NAND_BOOT_SPL_SRC@h
974 ori r2,r2,CFG_NAND_BOOT_SPL_SRC@l
975 lis r3,CFG_NAND_BOOT_SPL_DST@h
976 ori r3,r3,CFG_NAND_BOOT_SPL_DST@l
977spl_loop:
978 lwzu r4,4(r2)
979 stwu r4,4(r3)
980 bdnz spl_loop
981
982 /*
983 * Jump to code in RAM
984 */
985 bl 00f
98600: mflr r10
987 lis r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
988 ori r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
989 sub r10,r10,r3
990 addi r10,r10,28
991 mtlr r10
992 blr
993
994start_ram:
995 sync
996 isync
997#endif /* CONFIG_NAND_SPL */
998
wdenk0442ed82002-11-03 10:24:00 +0000999 /*----------------------------------------------------------------------- */
1000 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1001 /*----------------------------------------------------------------------- */
1002#ifdef CFG_INIT_DCACHE_CS
1003 /*----------------------------------------------------------------------- */
1004 /* Memory Bank x (nothingness) initialization 1GB+64MEG */
1005 /* used as temporary stack pointer for stage0 */
1006 /*----------------------------------------------------------------------- */
1007 li r4,PBxAP
1008 mtdcr ebccfga,r4
1009 lis r4,0x0380
1010 ori r4,r4,0x0480
1011 mtdcr ebccfgd,r4
1012
1013 addi r4,0,PBxCR
1014 mtdcr ebccfga,r4
1015 lis r4,0x400D
1016 ori r4,r4,0xa000
1017 mtdcr ebccfgd,r4
1018
Stefan Roese153b3e22007-10-05 17:10:59 +02001019 /* turn on data cache for this region */
wdenk0442ed82002-11-03 10:24:00 +00001020 lis r4,0x0080
1021 mtdccr r4
1022
1023 /* set stack pointer and clear stack to known value */
1024
1025 lis r1,CFG_INIT_RAM_ADDR@h
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001026 ori r1,r1,CFG_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +00001027
1028 li r4,2048 /* we store 2048 words to stack */
1029 mtctr r4
1030
1031 lis r2,CFG_INIT_RAM_ADDR@h /* we also clear data area */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001032 ori r2,r2,CFG_INIT_RAM_END@l /* so cant copy value from r1 */
wdenk0442ed82002-11-03 10:24:00 +00001033
1034 lis r4,0xdead /* we store 0xdeaddead in the stack */
1035 ori r4,r4,0xdead
1036
1037..stackloop:
1038 stwu r4,-4(r2)
1039 bdnz ..stackloop
1040
1041 li r0, 0 /* Make room for stack frame header and */
1042 stwu r0, -4(r1) /* clear final stack frame so that */
1043 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
1044 /*
1045 * Set up a dummy frame to store reset vector as return address.
1046 * this causes stack underflow to reset board.
1047 */
1048 stwu r1, -8(r1) /* Save back chain and move SP */
1049 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1050 ori r0, r0, RESET_VECTOR@l
1051 stwu r1, -8(r1) /* Save back chain and move SP */
1052 stw r0, +12(r1) /* Save return addr (underflow vect) */
1053
1054#elif defined(CFG_TEMP_STACK_OCM) && \
1055 (defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE))
1056 /*
1057 * Stack in OCM.
1058 */
1059
1060 /* Set up Stack at top of OCM */
1061 lis r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@h
1062 ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@l
1063
1064 /* Set up a zeroized stack frame so that backtrace works right */
1065 li r0, 0
1066 stwu r0, -4(r1)
1067 stwu r0, -4(r1)
1068
1069 /*
1070 * Set up a dummy frame to store reset vector as return address.
1071 * this causes stack underflow to reset board.
1072 */
1073 stwu r1, -8(r1) /* Save back chain and move SP */
1074 lis r0, RESET_VECTOR@h /* Address of reset vector */
1075 ori r0, r0, RESET_VECTOR@l
1076 stwu r1, -8(r1) /* Save back chain and move SP */
1077 stw r0, +12(r1) /* Save return addr (underflow vect) */
1078#endif /* CFG_INIT_DCACHE_CS */
1079
1080 /*----------------------------------------------------------------------- */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001081 /* Initialize SDRAM Controller */
wdenk0442ed82002-11-03 10:24:00 +00001082 /*----------------------------------------------------------------------- */
1083 bl sdram_init
1084
Stefan Roese23d8d342007-06-06 11:42:13 +02001085#ifdef CONFIG_NAND_SPL
1086 bl nand_boot /* will not return */
1087#else
wdenk0442ed82002-11-03 10:24:00 +00001088 GET_GOT /* initialize GOT access */
1089
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001090 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001091
1092 /* NEVER RETURNS! */
1093 bl board_init_f /* run first part of init code (from Flash) */
Stefan Roese23d8d342007-06-06 11:42:13 +02001094#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001095
wdenk232fe0b2003-09-02 22:48:03 +00001096#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1097 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001098
1099
Stefan Roese42fbddd2006-09-07 11:51:23 +02001100#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001101/*
1102 * This code finishes saving the registers to the exception frame
1103 * and jumps to the appropriate handler for the exception.
1104 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1105 */
1106 .globl transfer_to_handler
1107transfer_to_handler:
1108 stw r22,_NIP(r21)
1109 lis r22,MSR_POW@h
1110 andc r23,r23,r22
1111 stw r23,_MSR(r21)
1112 SAVE_GPR(7, r21)
1113 SAVE_4GPRS(8, r21)
1114 SAVE_8GPRS(12, r21)
1115 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001116 mflr r23
1117 andi. r24,r23,0x3f00 /* get vector offset */
1118 stw r24,TRAP(r21)
1119 li r22,0
1120 stw r22,RESULT(r21)
1121 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001122 lwz r24,0(r23) /* virtual address of handler */
1123 lwz r23,4(r23) /* where to go when done */
1124 mtspr SRR0,r24
1125 mtspr SRR1,r20
1126 mtlr r23
1127 SYNC
1128 rfi /* jump to handler, enable MMU */
1129
1130int_return:
1131 mfmsr r28 /* Disable interrupts */
1132 li r4,0
1133 ori r4,r4,MSR_EE
1134 andc r28,r28,r4
1135 SYNC /* Some chip revs need this... */
1136 mtmsr r28
1137 SYNC
1138 lwz r2,_CTR(r1)
1139 lwz r0,_LINK(r1)
1140 mtctr r2
1141 mtlr r0
1142 lwz r2,_XER(r1)
1143 lwz r0,_CCR(r1)
1144 mtspr XER,r2
1145 mtcrf 0xFF,r0
1146 REST_10GPRS(3, r1)
1147 REST_10GPRS(13, r1)
1148 REST_8GPRS(23, r1)
1149 REST_GPR(31, r1)
1150 lwz r2,_NIP(r1) /* Restore environment */
1151 lwz r0,_MSR(r1)
1152 mtspr SRR0,r2
1153 mtspr SRR1,r0
1154 lwz r0,GPR0(r1)
1155 lwz r2,GPR2(r1)
1156 lwz r1,GPR1(r1)
1157 SYNC
1158 rfi
1159
1160crit_return:
1161 mfmsr r28 /* Disable interrupts */
1162 li r4,0
1163 ori r4,r4,MSR_EE
1164 andc r28,r28,r4
1165 SYNC /* Some chip revs need this... */
1166 mtmsr r28
1167 SYNC
1168 lwz r2,_CTR(r1)
1169 lwz r0,_LINK(r1)
1170 mtctr r2
1171 mtlr r0
1172 lwz r2,_XER(r1)
1173 lwz r0,_CCR(r1)
1174 mtspr XER,r2
1175 mtcrf 0xFF,r0
1176 REST_10GPRS(3, r1)
1177 REST_10GPRS(13, r1)
1178 REST_8GPRS(23, r1)
1179 REST_GPR(31, r1)
1180 lwz r2,_NIP(r1) /* Restore environment */
1181 lwz r0,_MSR(r1)
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001182 mtspr csrr0,r2
1183 mtspr csrr1,r0
wdenk0442ed82002-11-03 10:24:00 +00001184 lwz r0,GPR0(r1)
1185 lwz r2,GPR2(r1)
1186 lwz r1,GPR1(r1)
1187 SYNC
1188 rfci
1189
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001190#ifdef CONFIG_440
1191mck_return:
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001192 mfmsr r28 /* Disable interrupts */
1193 li r4,0
1194 ori r4,r4,MSR_EE
1195 andc r28,r28,r4
1196 SYNC /* Some chip revs need this... */
1197 mtmsr r28
1198 SYNC
1199 lwz r2,_CTR(r1)
1200 lwz r0,_LINK(r1)
1201 mtctr r2
1202 mtlr r0
1203 lwz r2,_XER(r1)
1204 lwz r0,_CCR(r1)
1205 mtspr XER,r2
1206 mtcrf 0xFF,r0
1207 REST_10GPRS(3, r1)
1208 REST_10GPRS(13, r1)
1209 REST_8GPRS(23, r1)
1210 REST_GPR(31, r1)
1211 lwz r2,_NIP(r1) /* Restore environment */
1212 lwz r0,_MSR(r1)
1213 mtspr mcsrr0,r2
1214 mtspr mcsrr1,r0
1215 lwz r0,GPR0(r1)
1216 lwz r2,GPR2(r1)
1217 lwz r1,GPR1(r1)
1218 SYNC
1219 rfmci
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001220#endif /* CONFIG_440 */
1221
1222
wdenk0442ed82002-11-03 10:24:00 +00001223 .globl get_pvr
1224get_pvr:
1225 mfspr r3, PVR
1226 blr
1227
wdenk0442ed82002-11-03 10:24:00 +00001228/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001229/* Function: out16 */
1230/* Description: Output 16 bits */
1231/*------------------------------------------------------------------------------- */
1232 .globl out16
1233out16:
1234 sth r4,0x0000(r3)
1235 blr
1236
1237/*------------------------------------------------------------------------------- */
1238/* Function: out16r */
1239/* Description: Byte reverse and output 16 bits */
1240/*------------------------------------------------------------------------------- */
1241 .globl out16r
1242out16r:
1243 sthbrx r4,r0,r3
1244 blr
1245
1246/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001247/* Function: out32r */
1248/* Description: Byte reverse and output 32 bits */
1249/*------------------------------------------------------------------------------- */
1250 .globl out32r
1251out32r:
1252 stwbrx r4,r0,r3
1253 blr
1254
1255/*------------------------------------------------------------------------------- */
1256/* Function: in16 */
1257/* Description: Input 16 bits */
1258/*------------------------------------------------------------------------------- */
1259 .globl in16
1260in16:
1261 lhz r3,0x0000(r3)
1262 blr
1263
1264/*------------------------------------------------------------------------------- */
1265/* Function: in16r */
1266/* Description: Input 16 bits and byte reverse */
1267/*------------------------------------------------------------------------------- */
1268 .globl in16r
1269in16r:
1270 lhbrx r3,r0,r3
1271 blr
1272
1273/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001274/* Function: in32r */
1275/* Description: Input 32 bits and byte reverse */
1276/*------------------------------------------------------------------------------- */
1277 .globl in32r
1278in32r:
1279 lwbrx r3,r0,r3
1280 blr
1281
1282/*------------------------------------------------------------------------------- */
1283/* Function: ppcDcbf */
1284/* Description: Data Cache block flush */
1285/* Input: r3 = effective address */
1286/* Output: none. */
1287/*------------------------------------------------------------------------------- */
1288 .globl ppcDcbf
1289ppcDcbf:
1290 dcbf r0,r3
1291 blr
1292
1293/*------------------------------------------------------------------------------- */
1294/* Function: ppcDcbi */
1295/* Description: Data Cache block Invalidate */
1296/* Input: r3 = effective address */
1297/* Output: none. */
1298/*------------------------------------------------------------------------------- */
1299 .globl ppcDcbi
1300ppcDcbi:
1301 dcbi r0,r3
1302 blr
1303
1304/*------------------------------------------------------------------------------- */
1305/* Function: ppcSync */
1306/* Description: Processor Synchronize */
1307/* Input: none. */
1308/* Output: none. */
1309/*------------------------------------------------------------------------------- */
1310 .globl ppcSync
1311ppcSync:
1312 sync
1313 blr
1314
wdenk0442ed82002-11-03 10:24:00 +00001315/*
1316 * void relocate_code (addr_sp, gd, addr_moni)
1317 *
1318 * This "function" does not return, instead it continues in RAM
1319 * after relocating the monitor code.
1320 *
1321 * r3 = dest
1322 * r4 = src
1323 * r5 = length in bytes
1324 * r6 = cachelinesize
1325 */
1326 .globl relocate_code
1327relocate_code:
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001328#ifdef CONFIG_4xx_DCACHE
1329 /*
1330 * We need to flush the Init Data before the dcache will be
1331 * invalidated
1332 */
1333
1334 /* save regs */
1335 mr r9,r3
1336 mr r10,r4
1337 mr r11,r5
1338
1339 mr r3,r4
1340 addi r4,r4,0x200 /* should be enough for init data */
1341 bl flush_dcache_range
1342
1343 /* restore regs */
1344 mr r3,r9
1345 mr r4,r10
1346 mr r5,r11
1347#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +02001348#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1349 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
Stefan Roese05ac3032007-03-08 10:13:16 +01001350 defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese9eba0c82006-06-02 16:18:04 +02001351 /*
1352 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1353 * to speed up the boot process. Now this cache needs to be disabled.
1354 */
1355 iccci 0,0 /* Invalidate inst cache */
1356 dccci 0,0 /* Invalidate data cache, now no longer our stack */
Stefan Roese326c9712005-08-01 16:41:48 +02001357 sync
Stefan Roese9eba0c82006-06-02 16:18:04 +02001358 isync
Stefan Roese99644742005-11-29 18:18:21 +01001359 addi r1,r0,0x0000 /* TLB entry #0 */
Stefan Roese326c9712005-08-01 16:41:48 +02001360 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese99644742005-11-29 18:18:21 +01001361 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001362 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roese9eba0c82006-06-02 16:18:04 +02001363 sync
Stefan Roese326c9712005-08-01 16:41:48 +02001364 isync
1365#endif
wdenk0442ed82002-11-03 10:24:00 +00001366 mr r1, r3 /* Set new stack pointer */
1367 mr r9, r4 /* Save copy of Init Data pointer */
1368 mr r10, r5 /* Save copy of Destination Address */
1369
1370 mr r3, r5 /* Destination Address */
1371 lis r4, CFG_MONITOR_BASE@h /* Source Address */
1372 ori r4, r4, CFG_MONITOR_BASE@l
wdenkb9a83a92003-05-30 12:48:29 +00001373 lwz r5, GOT(__init_end)
1374 sub r5, r5, r4
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001375 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001376
1377 /*
1378 * Fix GOT pointer:
1379 *
1380 * New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address
1381 *
1382 * Offset:
1383 */
1384 sub r15, r10, r4
1385
1386 /* First our own GOT */
1387 add r14, r14, r15
1388 /* the the one used by the C code */
1389 add r30, r30, r15
1390
1391 /*
1392 * Now relocate code
1393 */
1394
1395 cmplw cr1,r3,r4
1396 addi r0,r5,3
1397 srwi. r0,r0,2
1398 beq cr1,4f /* In place copy is not necessary */
1399 beq 7f /* Protect against 0 count */
1400 mtctr r0
1401 bge cr1,2f
1402
1403 la r8,-4(r4)
1404 la r7,-4(r3)
14051: lwzu r0,4(r8)
1406 stwu r0,4(r7)
1407 bdnz 1b
1408 b 4f
1409
14102: slwi r0,r0,2
1411 add r8,r4,r0
1412 add r7,r3,r0
14133: lwzu r0,-4(r8)
1414 stwu r0,-4(r7)
1415 bdnz 3b
1416
1417/*
1418 * Now flush the cache: note that we must start from a cache aligned
1419 * address. Otherwise we might miss one cache line.
1420 */
14214: cmpwi r6,0
1422 add r5,r3,r5
1423 beq 7f /* Always flush prefetch queue in any case */
1424 subi r0,r6,1
1425 andc r3,r3,r0
1426 mr r4,r3
14275: dcbst 0,r4
1428 add r4,r4,r6
1429 cmplw r4,r5
1430 blt 5b
1431 sync /* Wait for all dcbst to complete on bus */
1432 mr r4,r3
14336: icbi 0,r4
1434 add r4,r4,r6
1435 cmplw r4,r5
1436 blt 6b
14377: sync /* Wait for all icbi to complete on bus */
1438 isync
1439
1440/*
1441 * We are done. Do not return, instead branch to second part of board
1442 * initialization, now running from RAM.
1443 */
1444
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001445 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001446 mtlr r0
1447 blr /* NEVER RETURNS! */
1448
1449in_ram:
1450
1451 /*
1452 * Relocation Function, r14 point to got2+0x8000
1453 *
1454 * Adjust got2 pointers, no need to check for 0, this code
1455 * already puts a few entries in the table.
1456 */
1457 li r0,__got2_entries@sectoff@l
1458 la r3,GOT(_GOT2_TABLE_)
1459 lwz r11,GOT(_GOT2_TABLE_)
1460 mtctr r0
1461 sub r11,r3,r11
1462 addi r3,r3,-4
14631: lwzu r0,4(r3)
1464 add r0,r0,r11
1465 stw r0,0(r3)
1466 bdnz 1b
1467
1468 /*
1469 * Now adjust the fixups and the pointers to the fixups
1470 * in case we need to move ourselves again.
1471 */
14722: li r0,__fixup_entries@sectoff@l
1473 lwz r3,GOT(_FIXUP_TABLE_)
1474 cmpwi r0,0
1475 mtctr r0
1476 addi r3,r3,-4
1477 beq 4f
14783: lwzu r4,4(r3)
1479 lwzux r0,r4,r11
1480 add r0,r0,r11
1481 stw r10,0(r3)
1482 stw r0,0(r4)
1483 bdnz 3b
14844:
1485clear_bss:
1486 /*
1487 * Now clear BSS segment
1488 */
wdenkbf2f8c92003-05-22 22:52:13 +00001489 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001490 lwz r4,GOT(_end)
1491
1492 cmplw 0, r3, r4
1493 beq 6f
1494
1495 li r0, 0
14965:
1497 stw r0, 0(r3)
1498 addi r3, r3, 4
1499 cmplw 0, r3, r4
1500 bne 5b
15016:
1502
1503 mr r3, r9 /* Init Data pointer */
1504 mr r4, r10 /* Destination Address */
1505 bl board_init_r
1506
wdenk0442ed82002-11-03 10:24:00 +00001507 /*
1508 * Copy exception vector code to low memory
1509 *
1510 * r3: dest_addr
1511 * r7: source address, r8: end address, r9: target address
1512 */
1513 .globl trap_init
1514trap_init:
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001515 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001516 lwz r8, GOT(_end_of_vectors)
1517
wdenk4e112c12003-06-03 23:54:09 +00001518 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001519
1520 cmplw 0, r7, r8
1521 bgelr /* return if r7>=r8 - just in case */
1522
1523 mflr r4 /* save link register */
15241:
1525 lwz r0, 0(r7)
1526 stw r0, 0(r9)
1527 addi r7, r7, 4
1528 addi r9, r9, 4
1529 cmplw 0, r7, r8
1530 bne 1b
1531
1532 /*
1533 * relocate `hdlr' and `int_return' entries
1534 */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001535 li r7, .L_MachineCheck - _start + _START_OFFSET
1536 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000015372:
1538 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001539 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001540 cmplw 0, r7, r8
1541 blt 2b
1542
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001543 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001544 bl trap_reloc
1545
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001546 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001547 bl trap_reloc
1548
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001549#ifdef CONFIG_440
1550 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001551 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001552
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001553 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001554 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001555
1556 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001557 bl trap_reloc
Stefan Roese80d99a42007-06-19 16:42:31 +02001558
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001559 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1560 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001561
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001562 li r7, .L_DataTLBError - _start + _START_OFFSET
1563 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001564#else /* CONFIG_440 */
1565 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001566 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001567
1568 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001569 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001570
1571 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001572 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001573#endif /* CONFIG_440 */
1574
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001575 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1576 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001577
Stefan Roese42fbddd2006-09-07 11:51:23 +02001578#if !defined(CONFIG_440)
Stefan Roese7b12aa82006-03-13 09:42:28 +01001579 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1580 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1581 mtmsr r7 /* change MSR */
1582#else
Stefan Roese42fbddd2006-09-07 11:51:23 +02001583 bl __440_msr_set
1584 b __440_msr_continue
Stefan Roese7b12aa82006-03-13 09:42:28 +01001585
Stefan Roese42fbddd2006-09-07 11:51:23 +02001586__440_msr_set:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001587 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1588 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1589 mtspr srr1,r7
1590 mflr r7
1591 mtspr srr0,r7
1592 rfi
Stefan Roese42fbddd2006-09-07 11:51:23 +02001593__440_msr_continue:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001594#endif
1595
wdenk0442ed82002-11-03 10:24:00 +00001596 mtlr r4 /* restore link register */
1597 blr
1598
1599 /*
1600 * Function: relocate entries for one exception vector
1601 */
1602trap_reloc:
1603 lwz r0, 0(r7) /* hdlr ... */
1604 add r0, r0, r3 /* ... += dest_addr */
1605 stw r0, 0(r7)
1606
1607 lwz r0, 4(r7) /* int_return ... */
1608 add r0, r0, r3 /* ... += dest_addr */
1609 stw r0, 4(r7)
1610
1611 blr
Stefan Roese42743512007-06-01 15:27:11 +02001612
1613#if defined(CONFIG_440)
1614/*----------------------------------------------------------------------------+
1615| dcbz_area.
1616+----------------------------------------------------------------------------*/
1617 function_prolog(dcbz_area)
1618 rlwinm. r5,r4,0,27,31
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001619 rlwinm r5,r4,27,5,31
1620 beq ..d_ra2
1621 addi r5,r5,0x0001
1622..d_ra2:mtctr r5
1623..d_ag2:dcbz r0,r3
1624 addi r3,r3,32
1625 bdnz ..d_ag2
Stefan Roese42743512007-06-01 15:27:11 +02001626 sync
1627 blr
1628 function_epilog(dcbz_area)
1629
1630/*----------------------------------------------------------------------------+
1631| dflush. Assume 32K at vector address is cachable.
1632+----------------------------------------------------------------------------*/
1633 function_prolog(dflush)
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001634 mfmsr r9
1635 rlwinm r8,r9,0,15,13
1636 rlwinm r8,r8,0,17,15
1637 mtmsr r8
1638 addi r3,r0,0x0000
1639 mtspr dvlim,r3
1640 mfspr r3,ivpr
1641 addi r4,r0,1024
1642 mtctr r4
Stefan Roese42743512007-06-01 15:27:11 +02001643..dflush_loop:
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001644 lwz r6,0x0(r3)
1645 addi r3,r3,32
1646 bdnz ..dflush_loop
1647 addi r3,r3,-32
1648 mtctr r4
1649..ag: dcbf r0,r3
1650 addi r3,r3,-32
1651 bdnz ..ag
Stefan Roese42743512007-06-01 15:27:11 +02001652 sync
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001653 mtmsr r9
Stefan Roese42743512007-06-01 15:27:11 +02001654 blr
1655 function_epilog(dflush)
1656#endif /* CONFIG_440 */
Stefan Roese42fbddd2006-09-07 11:51:23 +02001657#endif /* CONFIG_NAND_SPL */
stroese434979e2003-05-23 11:18:02 +00001658
Stefan Roese42743512007-06-01 15:27:11 +02001659/*------------------------------------------------------------------------------- */
1660/* Function: in8 */
1661/* Description: Input 8 bits */
1662/*------------------------------------------------------------------------------- */
1663 .globl in8
1664in8:
1665 lbz r3,0x0000(r3)
1666 blr
1667
1668/*------------------------------------------------------------------------------- */
1669/* Function: out8 */
1670/* Description: Output 8 bits */
1671/*------------------------------------------------------------------------------- */
1672 .globl out8
1673out8:
1674 stb r4,0x0000(r3)
1675 blr
1676
1677/*------------------------------------------------------------------------------- */
1678/* Function: out32 */
1679/* Description: Output 32 bits */
1680/*------------------------------------------------------------------------------- */
1681 .globl out32
1682out32:
1683 stw r4,0x0000(r3)
1684 blr
1685
1686/*------------------------------------------------------------------------------- */
1687/* Function: in32 */
1688/* Description: Input 32 bits */
1689/*------------------------------------------------------------------------------- */
1690 .globl in32
1691in32:
1692 lwz 3,0x0000(3)
1693 blr
stroese434979e2003-05-23 11:18:02 +00001694
1695/**************************************************************************/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001696/* PPC405EP specific stuff */
stroese434979e2003-05-23 11:18:02 +00001697/**************************************************************************/
1698#ifdef CONFIG_405EP
1699ppc405ep_init:
stroese5ad6d4d2003-12-09 14:54:43 +00001700
Stefan Roese326c9712005-08-01 16:41:48 +02001701#ifdef CONFIG_BUBINGA
stroese5ad6d4d2003-12-09 14:54:43 +00001702 /*
1703 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1704 * function) to support FPGA and NVRAM accesses below.
1705 */
1706
1707 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1708 ori r3,r3,GPIO0_OSRH@l
1709 lis r4,CFG_GPIO0_OSRH@h
1710 ori r4,r4,CFG_GPIO0_OSRH@l
1711 stw r4,0(r3)
1712 lis r3,GPIO0_OSRL@h
1713 ori r3,r3,GPIO0_OSRL@l
1714 lis r4,CFG_GPIO0_OSRL@h
1715 ori r4,r4,CFG_GPIO0_OSRL@l
1716 stw r4,0(r3)
1717
1718 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1719 ori r3,r3,GPIO0_ISR1H@l
1720 lis r4,CFG_GPIO0_ISR1H@h
1721 ori r4,r4,CFG_GPIO0_ISR1H@l
1722 stw r4,0(r3)
1723 lis r3,GPIO0_ISR1L@h
1724 ori r3,r3,GPIO0_ISR1L@l
1725 lis r4,CFG_GPIO0_ISR1L@h
1726 ori r4,r4,CFG_GPIO0_ISR1L@l
1727 stw r4,0(r3)
1728
1729 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1730 ori r3,r3,GPIO0_TSRH@l
1731 lis r4,CFG_GPIO0_TSRH@h
1732 ori r4,r4,CFG_GPIO0_TSRH@l
1733 stw r4,0(r3)
1734 lis r3,GPIO0_TSRL@h
1735 ori r3,r3,GPIO0_TSRL@l
1736 lis r4,CFG_GPIO0_TSRL@h
1737 ori r4,r4,CFG_GPIO0_TSRL@l
1738 stw r4,0(r3)
1739
1740 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1741 ori r3,r3,GPIO0_TCR@l
1742 lis r4,CFG_GPIO0_TCR@h
1743 ori r4,r4,CFG_GPIO0_TCR@l
1744 stw r4,0(r3)
1745
1746 li r3,pb1ap /* program EBC bank 1 for RTC access */
1747 mtdcr ebccfga,r3
1748 lis r3,CFG_EBC_PB1AP@h
1749 ori r3,r3,CFG_EBC_PB1AP@l
1750 mtdcr ebccfgd,r3
1751 li r3,pb1cr
1752 mtdcr ebccfga,r3
1753 lis r3,CFG_EBC_PB1CR@h
1754 ori r3,r3,CFG_EBC_PB1CR@l
1755 mtdcr ebccfgd,r3
1756
1757 li r3,pb1ap /* program EBC bank 1 for RTC access */
1758 mtdcr ebccfga,r3
1759 lis r3,CFG_EBC_PB1AP@h
1760 ori r3,r3,CFG_EBC_PB1AP@l
1761 mtdcr ebccfgd,r3
1762 li r3,pb1cr
1763 mtdcr ebccfga,r3
1764 lis r3,CFG_EBC_PB1CR@h
1765 ori r3,r3,CFG_EBC_PB1CR@l
1766 mtdcr ebccfgd,r3
1767
1768 li r3,pb4ap /* program EBC bank 4 for FPGA access */
1769 mtdcr ebccfga,r3
1770 lis r3,CFG_EBC_PB4AP@h
1771 ori r3,r3,CFG_EBC_PB4AP@l
1772 mtdcr ebccfgd,r3
1773 li r3,pb4cr
1774 mtdcr ebccfga,r3
1775 lis r3,CFG_EBC_PB4CR@h
1776 ori r3,r3,CFG_EBC_PB4CR@l
1777 mtdcr ebccfgd,r3
1778#endif
stroese434979e2003-05-23 11:18:02 +00001779
wdenk57b2d802003-06-27 21:31:46 +00001780 /*
1781 !-----------------------------------------------------------------------
1782 ! Check to see if chip is in bypass mode.
1783 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1784 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001785 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1786 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk57b2d802003-06-27 21:31:46 +00001787 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001788 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001789 mfdcr r5, CPC0_PLLMR1
1790 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
1791 cmpi cr0,0,r4,0x1
stroese434979e2003-05-23 11:18:02 +00001792
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001793 beq pll_done /* if SSCS =b'1' then PLL has */
wdenk57b2d802003-06-27 21:31:46 +00001794 /* already been set */
1795 /* and CPU has been reset */
1796 /* so skip to next section */
stroese434979e2003-05-23 11:18:02 +00001797
Stefan Roese326c9712005-08-01 16:41:48 +02001798#ifdef CONFIG_BUBINGA
stroese434979e2003-05-23 11:18:02 +00001799 /*
wdenk57b2d802003-06-27 21:31:46 +00001800 !-----------------------------------------------------------------------
1801 ! Read NVRAM to get value to write in PLLMR.
1802 ! If value has not been correctly saved, write default value
1803 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1804 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1805 !
1806 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001807 ! structure in openbios.h. Changing the beginning of
1808 ! the structure will break this code.
wdenk57b2d802003-06-27 21:31:46 +00001809 !
1810 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001811 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001812 addis r3,0,NVRAM_BASE@h
1813 addi r3,r3,NVRAM_BASE@l
stroese434979e2003-05-23 11:18:02 +00001814
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001815 lwz r4, 0(r3)
1816 addis r5,0,NVRVFY1@h
1817 addi r5,r5,NVRVFY1@l
1818 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
1819 bne ..no_pllset
1820 addi r3,r3,4
1821 lwz r4, 0(r3)
1822 addis r5,0,NVRVFY2@h
1823 addi r5,r5,NVRVFY2@l
1824 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
1825 bne ..no_pllset
1826 addi r3,r3,8 /* Skip over conf_size */
1827 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1828 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1829 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1830 cmpi cr0,0,r5,1 /* See if PLL is locked */
1831 beq pll_write
stroese434979e2003-05-23 11:18:02 +00001832..no_pllset:
Stefan Roese326c9712005-08-01 16:41:48 +02001833#endif /* CONFIG_BUBINGA */
stroese434979e2003-05-23 11:18:02 +00001834
John Otken9aa36772007-07-26 17:49:11 +02001835#ifdef CONFIG_TAIHU
1836 mfdcr r4, CPC0_BOOT
1837 andi. r5, r4, CPC0_BOOT_SEP@l
1838 bne strap_1 /* serial eeprom present */
1839 addis r5,0,CPLD_REG0_ADDR@h
1840 ori r5,r5,CPLD_REG0_ADDR@l
1841 andi. r5, r5, 0x10
1842 bne _pci_66mhz
1843#endif /* CONFIG_TAIHU */
1844
Stefan Roesea5d182e2007-08-14 14:44:41 +02001845#if defined(CONFIG_ZEUS)
1846 mfdcr r4, CPC0_BOOT
1847 andi. r5, r4, CPC0_BOOT_SEP@l
1848 bne strap_1 /* serial eeprom present */
1849 lis r3,0x0000
1850 addi r3,r3,0x3030
1851 lis r4,0x8042
1852 addi r4,r4,0x223e
1853 b 1f
1854strap_1:
1855 mfdcr r3, CPC0_PLLMR0
1856 mfdcr r4, CPC0_PLLMR1
1857 b 1f
1858#endif
1859
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001860 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1861 ori r3,r3,PLLMR0_DEFAULT@l /* */
1862 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1863 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroese434979e2003-05-23 11:18:02 +00001864
John Otken9aa36772007-07-26 17:49:11 +02001865#ifdef CONFIG_TAIHU
1866 b 1f
1867_pci_66mhz:
1868 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1869 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1870 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1871 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1872 b 1f
1873strap_1:
1874 mfdcr r3, CPC0_PLLMR0
1875 mfdcr r4, CPC0_PLLMR1
John Otken9aa36772007-07-26 17:49:11 +02001876#endif /* CONFIG_TAIHU */
1877
Stefan Roesea5d182e2007-08-14 14:44:41 +020018781:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001879 b pll_write /* Write the CPC0_PLLMR with new value */
stroese434979e2003-05-23 11:18:02 +00001880
1881pll_done:
wdenk57b2d802003-06-27 21:31:46 +00001882 /*
1883 !-----------------------------------------------------------------------
1884 ! Clear Soft Reset Register
1885 ! This is needed to enable PCI if not booting from serial EPROM
1886 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001887 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001888 addi r3, 0, 0x0
1889 mtdcr CPC0_SRR, r3
stroese434979e2003-05-23 11:18:02 +00001890
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001891 addis r3,0,0x0010
1892 mtctr r3
stroese434979e2003-05-23 11:18:02 +00001893pci_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001894 bdnz pci_wait
stroese434979e2003-05-23 11:18:02 +00001895
1896 blr /* return to main code */
1897
1898/*
1899!-----------------------------------------------------------------------------
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001900! Function: pll_write
1901! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1902! That is:
1903! 1. Pll is first disabled (de-activated by putting in bypass mode)
1904! 2. PLL is reset
1905! 3. Clock dividers are set while PLL is held in reset and bypassed
1906! 4. PLL Reset is cleared
1907! 5. Wait 100us for PLL to lock
1908! 6. A core reset is performed
stroese434979e2003-05-23 11:18:02 +00001909! Input: r3 = Value to write to CPC0_PLLMR0
1910! Input: r4 = Value to write to CPC0_PLLMR1
1911! Output r3 = none
1912!-----------------------------------------------------------------------------
1913*/
1914pll_write:
wdenk57b2d802003-06-27 21:31:46 +00001915 mfdcr r5, CPC0_UCR
1916 andis. r5,r5,0xFFFF
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001917 ori r5,r5,0x0101 /* Stop the UART clocks */
1918 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroese434979e2003-05-23 11:18:02 +00001919
wdenk57b2d802003-06-27 21:31:46 +00001920 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001921 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
1922 mtdcr CPC0_PLLMR1,r5
1923 oris r5,r5,0x4000 /* Set PLL Reset */
1924 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00001925
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001926 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1927 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1928 oris r5,r5,0x4000 /* Set PLL Reset */
1929 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1930 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
1931 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00001932
1933 /*
wdenk57b2d802003-06-27 21:31:46 +00001934 ! Wait min of 100us for PLL to lock.
1935 ! See CMOS 27E databook for more info.
1936 ! At 200MHz, that means waiting 20,000 instructions
stroese434979e2003-05-23 11:18:02 +00001937 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001938 addi r3,0,20000 /* 2000 = 0x4e20 */
1939 mtctr r3
stroese434979e2003-05-23 11:18:02 +00001940pll_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001941 bdnz pll_wait
stroese434979e2003-05-23 11:18:02 +00001942
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001943 oris r5,r5,0x8000 /* Enable PLL */
1944 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroese434979e2003-05-23 11:18:02 +00001945
wdenk57b2d802003-06-27 21:31:46 +00001946 /*
1947 * Reset CPU to guarantee timings are OK
1948 * Not sure if this is needed...
1949 */
1950 addis r3,0,0x1000
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001951 mtspr dbcr0,r3 /* This will cause a CPU core reset, and */
wdenk57b2d802003-06-27 21:31:46 +00001952 /* execution will continue from the poweron */
1953 /* vector of 0xfffffffc */
stroese434979e2003-05-23 11:18:02 +00001954#endif /* CONFIG_405EP */
Stefan Roesea8856e32007-02-20 10:57:08 +01001955
1956#if defined(CONFIG_440)
Stefan Roesea8856e32007-02-20 10:57:08 +01001957/*----------------------------------------------------------------------------+
1958| mttlb3.
1959+----------------------------------------------------------------------------*/
1960 function_prolog(mttlb3)
1961 TLBWE(4,3,2)
1962 blr
1963 function_epilog(mttlb3)
1964
1965/*----------------------------------------------------------------------------+
1966| mftlb3.
1967+----------------------------------------------------------------------------*/
1968 function_prolog(mftlb3)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01001969 TLBRE(3,3,2)
Stefan Roesea8856e32007-02-20 10:57:08 +01001970 blr
1971 function_epilog(mftlb3)
1972
1973/*----------------------------------------------------------------------------+
1974| mttlb2.
1975+----------------------------------------------------------------------------*/
1976 function_prolog(mttlb2)
1977 TLBWE(4,3,1)
1978 blr
1979 function_epilog(mttlb2)
1980
1981/*----------------------------------------------------------------------------+
1982| mftlb2.
1983+----------------------------------------------------------------------------*/
1984 function_prolog(mftlb2)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01001985 TLBRE(3,3,1)
Stefan Roesea8856e32007-02-20 10:57:08 +01001986 blr
1987 function_epilog(mftlb2)
1988
1989/*----------------------------------------------------------------------------+
1990| mttlb1.
1991+----------------------------------------------------------------------------*/
1992 function_prolog(mttlb1)
1993 TLBWE(4,3,0)
1994 blr
1995 function_epilog(mttlb1)
1996
1997/*----------------------------------------------------------------------------+
1998| mftlb1.
1999+----------------------------------------------------------------------------*/
2000 function_prolog(mftlb1)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002001 TLBRE(3,3,0)
Stefan Roesea8856e32007-02-20 10:57:08 +01002002 blr
2003 function_epilog(mftlb1)
2004#endif /* CONFIG_440 */