blob: cdfc9436b0a3482764398112474a398d3b70aabe [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 Roese3cb86f32007-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 Denk83b4cfa2007-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 Denk0c8721a2005-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
Stefan Roese28d77d92008-01-30 14:48:28 +0100113#if (defined(CFG_INIT_RAM_DCACHE) && (CFG_INIT_RAM_END > (4 << 10)))
114#error Only 4k of init-ram is supported - please adjust CFG_INIT_RAM_END!
115#endif
116
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200117#define function_prolog(func_name) .text; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200118 .align 2; \
119 .globl func_name; \
120 func_name:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200121#define function_epilog(func_name) .type func_name,@function; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200122 .size func_name,.-func_name
123
wdenk0442ed82002-11-03 10:24:00 +0000124/* We don't want the MMU yet.
125*/
126#undef MSR_KERNEL
127#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
128
129
130 .extern ext_bus_cntlr_init
131 .extern sdram_init
Stefan Roese887e2ec2006-09-07 11:51:23 +0200132#ifdef CONFIG_NAND_U_BOOT
133 .extern reconfig_tlb0
134#endif
wdenk0442ed82002-11-03 10:24:00 +0000135
136/*
137 * Set up GOT: Global Offset Table
138 *
139 * Use r14 to access the GOT
140 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200141#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000142 START_GOT
143 GOT_ENTRY(_GOT2_TABLE_)
144 GOT_ENTRY(_FIXUP_TABLE_)
145
146 GOT_ENTRY(_start)
147 GOT_ENTRY(_start_of_vectors)
148 GOT_ENTRY(_end_of_vectors)
149 GOT_ENTRY(transfer_to_handler)
150
wdenk3b57fe02003-05-30 12:48:29 +0000151 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000152 GOT_ENTRY(_end)
wdenk5d232d02003-05-22 22:52:13 +0000153 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000154 END_GOT
Stefan Roese887e2ec2006-09-07 11:51:23 +0200155#endif /* CONFIG_NAND_SPL */
156
157#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
158 /*
159 * NAND U-Boot image is started from offset 0
160 */
161 .text
Stefan Roesec440bfe2007-06-06 11:42:13 +0200162#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200163 bl reconfig_tlb0
Stefan Roesec440bfe2007-06-06 11:42:13 +0200164#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200165 GET_GOT
166 bl cpu_init_f /* run low-level CPU init code (from Flash) */
167 bl board_init_f
168#endif
wdenk0442ed82002-11-03 10:24:00 +0000169
170/*
171 * 440 Startup -- on reset only the top 4k of the effective
172 * address space is mapped in by an entry in the instruction
173 * and data shadow TLB. The .bootpg section is located in the
174 * top 4k & does only what's necessary to map in the the rest
175 * of the boot rom. Once the boot rom is mapped in we can
176 * proceed with normal startup.
177 *
178 * NOTE: CS0 only covers the top 2MB of the effective address
179 * space after reset.
180 */
181
182#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200183#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000184 .section .bootpg,"ax"
Stefan Roese887e2ec2006-09-07 11:51:23 +0200185#endif
wdenk0442ed82002-11-03 10:24:00 +0000186 .globl _start_440
187
188/**************************************************************************/
189_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200190 /*--------------------------------------------------------------------+
191 | 440EPX BUP Change - Hardware team request
192 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200193#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
194 sync
195 nop
196 nop
197#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200198 /*----------------------------------------------------------------+
199 | Core bug fix. Clear the esr
200 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200201 li r0,0
Wolfgang Denkb87dfd22006-07-19 13:50:38 +0200202 mtspr esr,r0
wdenk0442ed82002-11-03 10:24:00 +0000203 /*----------------------------------------------------------------*/
204 /* Clear and set up some registers. */
205 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200206 iccci r0,r0 /* NOTE: operands not used for 440 */
207 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000208 sync
209 li r0,0
210 mtspr srr0,r0
211 mtspr srr1,r0
212 mtspr csrr0,r0
213 mtspr csrr1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200214 /* NOTE: 440GX adds machine check status regs */
215#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Wolfgang Denkf901a832005-08-06 01:42:58 +0200216 mtspr mcsrr0,r0
217 mtspr mcsrr1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200218 mfspr r1,mcsr
Wolfgang Denkf901a832005-08-06 01:42:58 +0200219 mtspr mcsr,r1
wdenkba56f622004-02-06 23:19:44 +0000220#endif
Stefan Roese20532832006-11-22 13:20:50 +0100221
222 /*----------------------------------------------------------------*/
223 /* CCR0 init */
224 /*----------------------------------------------------------------*/
225 /* Disable store gathering & broadcast, guarantee inst/data
226 * cache block touch, force load/store alignment
227 * (see errata 1.12: 440_33)
228 */
229 lis r1,0x0030 /* store gathering & broadcast disable */
230 ori r1,r1,0x6000 /* cache touch */
231 mtspr ccr0,r1
232
wdenk0442ed82002-11-03 10:24:00 +0000233 /*----------------------------------------------------------------*/
234 /* Initialize debug */
235 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200236 mfspr r1,dbcr0
237 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
238 bne skip_debug_init /* if set, don't clear debug register */
wdenk0442ed82002-11-03 10:24:00 +0000239 mtspr dbcr0,r0
240 mtspr dbcr1,r0
241 mtspr dbcr2,r0
242 mtspr iac1,r0
243 mtspr iac2,r0
244 mtspr iac3,r0
245 mtspr dac1,r0
246 mtspr dac2,r0
247 mtspr dvc1,r0
248 mtspr dvc2,r0
249
250 mfspr r1,dbsr
251 mtspr dbsr,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200252skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000253
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200254#if defined (CONFIG_440SPE)
255 /*----------------------------------------------------------------+
256 | Initialize Core Configuration Reg1.
257 | a. ICDPEI: Record even parity. Normal operation.
258 | b. ICTPEI: Record even parity. Normal operation.
259 | c. DCTPEI: Record even parity. Normal operation.
260 | d. DCDPEI: Record even parity. Normal operation.
261 | e. DCUPEI: Record even parity. Normal operation.
262 | f. DCMPEI: Record even parity. Normal operation.
263 | g. FCOM: Normal operation
264 | h. MMUPEI: Record even parity. Normal operation.
265 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200266 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200267 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200268 li r0,0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200269 mtspr ccr1, r0
270
271 /*----------------------------------------------------------------+
272 | Reset the timebase.
273 | The previous write to CCR1 sets the timebase source.
274 +-----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200275 mtspr tbl, r0
276 mtspr tbu, r0
277#endif
278
wdenk0442ed82002-11-03 10:24:00 +0000279 /*----------------------------------------------------------------*/
280 /* Setup interrupt vectors */
281 /*----------------------------------------------------------------*/
282 mtspr ivpr,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200283 li r1,0x0100
wdenk0442ed82002-11-03 10:24:00 +0000284 mtspr ivor0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200285 li r1,0x0200
wdenk0442ed82002-11-03 10:24:00 +0000286 mtspr ivor1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200287 li r1,0x0300
wdenk0442ed82002-11-03 10:24:00 +0000288 mtspr ivor2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200289 li r1,0x0400
wdenk0442ed82002-11-03 10:24:00 +0000290 mtspr ivor3,r1 /* Instruction storage */
291 li r1,0x0500
292 mtspr ivor4,r1 /* External interrupt */
293 li r1,0x0600
294 mtspr ivor5,r1 /* Alignment */
295 li r1,0x0700
296 mtspr ivor6,r1 /* Program check */
297 li r1,0x0800
298 mtspr ivor7,r1 /* Floating point unavailable */
299 li r1,0x0c00
300 mtspr ivor8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200301 li r1,0x0a00
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200302 mtspr ivor9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200303 li r1,0x0900
304 mtspr ivor10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000305 li r1,0x1300
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200306 mtspr ivor13,r1 /* Data TLB error */
307 li r1,0x1400
wdenk0442ed82002-11-03 10:24:00 +0000308 mtspr ivor14,r1 /* Instr TLB error */
309 li r1,0x2000
310 mtspr ivor15,r1 /* Debug */
311
312 /*----------------------------------------------------------------*/
313 /* Configure cache regions */
314 /*----------------------------------------------------------------*/
315 mtspr inv0,r0
316 mtspr inv1,r0
317 mtspr inv2,r0
318 mtspr inv3,r0
319 mtspr dnv0,r0
320 mtspr dnv1,r0
321 mtspr dnv2,r0
322 mtspr dnv3,r0
323 mtspr itv0,r0
324 mtspr itv1,r0
325 mtspr itv2,r0
326 mtspr itv3,r0
327 mtspr dtv0,r0
328 mtspr dtv1,r0
329 mtspr dtv2,r0
330 mtspr dtv3,r0
331
332 /*----------------------------------------------------------------*/
333 /* Cache victim limits */
334 /*----------------------------------------------------------------*/
335 /* floors 0, ceiling max to use the entire cache -- nothing locked
336 */
337 lis r1,0x0001
338 ori r1,r1,0xf800
339 mtspr ivlim,r1
340 mtspr dvlim,r1
341
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200342 /*----------------------------------------------------------------+
343 |Initialize MMUCR[STID] = 0.
344 +-----------------------------------------------------------------*/
345 mfspr r0,mmucr
346 addis r1,0,0xFFFF
347 ori r1,r1,0xFF00
348 and r0,r0,r1
349 mtspr mmucr,r0
350
wdenk0442ed82002-11-03 10:24:00 +0000351 /*----------------------------------------------------------------*/
352 /* Clear all TLB entries -- TID = 0, TS = 0 */
353 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200354 addis r0,0,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000355 li r1,0x003f /* 64 TLB entries */
356 mtctr r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200357rsttlb: tlbwe r0,r1,0x0000 /* Invalidate all entries (V=0)*/
358 tlbwe r0,r1,0x0001
359 tlbwe r0,r1,0x0002
wdenk0442ed82002-11-03 10:24:00 +0000360 subi r1,r1,0x0001
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200361 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000362
363 /*----------------------------------------------------------------*/
364 /* TLB entry setup -- step thru tlbtab */
365 /*----------------------------------------------------------------*/
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200366#if defined(CONFIG_440SPE)
367 /*----------------------------------------------------------------*/
368 /* We have different TLB tables for revA and rev B of 440SPe */
369 /*----------------------------------------------------------------*/
370 mfspr r1, PVR
371 lis r0,0x5342
372 ori r0,r0,0x1891
373 cmpw r7,r1,r0
374 bne r7,..revA
375 bl tlbtabB
376 b ..goon
377..revA:
378 bl tlbtabA
379..goon:
380#else
wdenk0442ed82002-11-03 10:24:00 +0000381 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200382#endif
wdenk0442ed82002-11-03 10:24:00 +0000383 mr r5,r0
384 li r1,0x003f /* 64 TLB entries max */
385 mtctr r1
386 li r4,0 /* TLB # */
387
388 addi r5,r5,-4
3891: lwzu r0,4(r5)
390 cmpwi r0,0
391 beq 2f /* 0 marks end */
392 lwzu r1,4(r5)
393 lwzu r2,4(r5)
394 tlbwe r0,r4,0 /* TLB Word 0 */
395 tlbwe r1,r4,1 /* TLB Word 1 */
396 tlbwe r2,r4,2 /* TLB Word 2 */
397 addi r4,r4,1 /* Next TLB */
398 bdnz 1b
399
400 /*----------------------------------------------------------------*/
401 /* Continue from 'normal' start */
402 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02004032:
404
405#if defined(CONFIG_NAND_SPL)
Stefan Roesecf959c72007-06-01 15:27:11 +0200406#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200407 /*
Stefan Roesecf959c72007-06-01 15:27:11 +0200408 * Enable internal SRAM (only on 440EPx/GRx, 440EP/GR have no OCM)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200409 */
410 lis r2,0x7fff
411 ori r2,r2,0xffff
412 mfdcr r1,isram0_dpc
413 and r1,r1,r2 /* Disable parity check */
414 mtdcr isram0_dpc,r1
415 mfdcr r1,isram0_pmeg
416 and r1,r1,r2 /* Disable pwr mgmt */
417 mtdcr isram0_pmeg,r1
Stefan Roesecf959c72007-06-01 15:27:11 +0200418#endif
419#if defined(CONFIG_440EP)
420 /*
421 * On 440EP with no internal SRAM, we setup SDRAM very early
422 * and copy the NAND_SPL to SDRAM and jump to it
423 */
424 /* Clear Dcache to use as RAM */
425 addis r3,r0,CFG_INIT_RAM_ADDR@h
426 ori r3,r3,CFG_INIT_RAM_ADDR@l
427 addis r4,r0,CFG_INIT_RAM_END@h
428 ori r4,r4,CFG_INIT_RAM_END@l
429 rlwinm. r5,r4,0,27,31
430 rlwinm r5,r4,27,5,31
431 beq ..d_ran3
432 addi r5,r5,0x0001
433..d_ran3:
434 mtctr r5
435..d_ag3:
436 dcbz r0,r3
437 addi r3,r3,32
438 bdnz ..d_ag3
439 /*----------------------------------------------------------------*/
440 /* Setup the stack in internal SRAM */
441 /*----------------------------------------------------------------*/
442 lis r1,CFG_INIT_RAM_ADDR@h
443 ori r1,r1,CFG_INIT_SP_OFFSET@l
444 li r0,0
445 stwu r0,-4(r1)
446 stwu r0,-4(r1) /* Terminate call chain */
447
448 stwu r1,-8(r1) /* Save back chain and move SP */
449 lis r0,RESET_VECTOR@h /* Address of reset vector */
450 ori r0,r0, RESET_VECTOR@l
451 stwu r1,-8(r1) /* Save back chain and move SP */
452 stw r0,+12(r1) /* Save return addr (underflow vect) */
453 sync
454 bl early_sdram_init
455 sync
456#endif /* CONFIG_440EP */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200457
458 /*
459 * Copy SPL from cache into internal SRAM
460 */
461 li r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
462 mtctr r4
463 lis r2,CFG_NAND_BOOT_SPL_SRC@h
464 ori r2,r2,CFG_NAND_BOOT_SPL_SRC@l
465 lis r3,CFG_NAND_BOOT_SPL_DST@h
466 ori r3,r3,CFG_NAND_BOOT_SPL_DST@l
467spl_loop:
468 lwzu r4,4(r2)
469 stwu r4,4(r3)
470 bdnz spl_loop
471
472 /*
473 * Jump to code in RAM
474 */
475 bl 00f
47600: mflr r10
477 lis r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
478 ori r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
479 sub r10,r10,r3
480 addi r10,r10,28
481 mtlr r10
482 blr
483
484start_ram:
485 sync
486 isync
Stefan Roesecf959c72007-06-01 15:27:11 +0200487#endif /* CONFIG_NAND_SPL */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200488
489 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000490 b _start
491
4923: li r0,0
493 mtspr srr1,r0 /* Keep things disabled for now */
494 mflr r1
495 mtspr srr0,r1
496 rfi
stroeseb867d702003-05-23 11:18:02 +0000497#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000498
499/*
500 * r3 - 1st arg to board_init(): IMMP pointer
501 * r4 - 2nd arg to board_init(): boot flag
502 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200503#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000504 .text
505 .long 0x27051956 /* U-Boot Magic Number */
506 .globl version_string
507version_string:
508 .ascii U_BOOT_VERSION
509 .ascii " (", __DATE__, " - ", __TIME__, ")"
510 .ascii CONFIG_IDENT_STRING, "\0"
511
wdenk0442ed82002-11-03 10:24:00 +0000512 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200513 .globl _start_of_vectors
514_start_of_vectors:
515
516/* Critical input. */
517 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
518
519#ifdef CONFIG_440
520/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200521 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200522#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200523 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200524#endif /* CONFIG_440 */
525
526/* Data Storage exception. */
527 STD_EXCEPTION(0x300, DataStorage, UnknownException)
528
529/* Instruction Storage exception. */
530 STD_EXCEPTION(0x400, InstStorage, UnknownException)
531
532/* External Interrupt exception. */
533 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
534
535/* Alignment exception. */
536 . = 0x600
537Alignment:
538 EXCEPTION_PROLOG(SRR0, SRR1)
539 mfspr r4,DAR
540 stw r4,_DAR(r21)
541 mfspr r5,DSISR
542 stw r5,_DSISR(r21)
543 addi r3,r1,STACK_FRAME_OVERHEAD
544 li r20,MSR_KERNEL
545 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
546 lwz r6,GOT(transfer_to_handler)
547 mtlr r6
548 blrl
549.L_Alignment:
550 .long AlignmentException - _start + _START_OFFSET
551 .long int_return - _start + _START_OFFSET
552
553/* Program check exception */
554 . = 0x700
555ProgramCheck:
556 EXCEPTION_PROLOG(SRR0, SRR1)
557 addi r3,r1,STACK_FRAME_OVERHEAD
558 li r20,MSR_KERNEL
559 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
560 lwz r6,GOT(transfer_to_handler)
561 mtlr r6
562 blrl
563.L_ProgramCheck:
564 .long ProgramCheckException - _start + _START_OFFSET
565 .long int_return - _start + _START_OFFSET
566
567#ifdef CONFIG_440
568 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
569 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
570 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200571#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200572 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
573
574#ifdef CONFIG_440
575 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
576 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
577#else
578 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
579 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
580 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
581#endif
582 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
583
584 .globl _end_of_vectors
585_end_of_vectors:
586 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200587#endif
wdenk0442ed82002-11-03 10:24:00 +0000588 .globl _start
589_start:
590
591/*****************************************************************************/
592#if defined(CONFIG_440)
593
594 /*----------------------------------------------------------------*/
595 /* Clear and set up some registers. */
596 /*----------------------------------------------------------------*/
597 li r0,0x0000
598 lis r1,0xffff
599 mtspr dec,r0 /* prevent dec exceptions */
600 mtspr tbl,r0 /* prevent fit & wdt exceptions */
601 mtspr tbu,r0
602 mtspr tsr,r1 /* clear all timer exception status */
603 mtspr tcr,r0 /* disable all */
604 mtspr esr,r0 /* clear exception syndrome register */
605 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000606
607 /*----------------------------------------------------------------*/
608 /* Debug setup -- some (not very good) ice's need an event*/
609 /* to establish control :-( Define CFG_INIT_DBCR to the dbsr */
610 /* value you need in this case 0x8cff 0000 should do the trick */
611 /*----------------------------------------------------------------*/
612#if defined(CFG_INIT_DBCR)
613 lis r1,0xffff
614 ori r1,r1,0xffff
615 mtspr dbsr,r1 /* Clear all status bits */
616 lis r0,CFG_INIT_DBCR@h
617 ori r0,r0,CFG_INIT_DBCR@l
618 mtspr dbcr0,r0
619 isync
620#endif
621
622 /*----------------------------------------------------------------*/
623 /* Setup the internal SRAM */
624 /*----------------------------------------------------------------*/
625 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200626
627#ifdef CFG_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200628 /* Clear Dcache to use as RAM */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200629 addis r3,r0,CFG_INIT_RAM_ADDR@h
630 ori r3,r3,CFG_INIT_RAM_ADDR@l
631 addis r4,r0,CFG_INIT_RAM_END@h
632 ori r4,r4,CFG_INIT_RAM_END@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200633 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200634 rlwinm r5,r4,27,5,31
635 beq ..d_ran
636 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200637..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200638 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200639..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200640 dcbz r0,r3
641 addi r3,r3,32
642 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100643
644 /*
645 * Lock the init-ram/stack in d-cache, so that other regions
646 * may use d-cache as well
647 * Note, that this current implementation locks exactly 4k
648 * of d-cache, so please make sure that you don't define a
649 * bigger init-ram area. Take a look at the lwmon5 440EPx
650 * implementation as a reference.
651 */
652 msync
653 isync
654 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
655 lis r1,0x0201
656 ori r1,r1,0xf808
657 mtspr dvlim,r1
658 lis r1,0x0808
659 ori r1,r1,0x0808
660 mtspr dnv0,r1
661 mtspr dnv1,r1
662 mtspr dnv2,r1
663 mtspr dnv3,r1
664 mtspr dtv0,r1
665 mtspr dtv1,r1
666 mtspr dtv2,r1
667 mtspr dtv3,r1
668 msync
669 isync
Stefan Roese887e2ec2006-09-07 11:51:23 +0200670#endif /* CFG_INIT_RAM_DCACHE */
671
672 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
673#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
674 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100675#if defined(CONFIG_440GX) || \
676 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
677 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Wolfgang Denkf901a832005-08-06 01:42:58 +0200678 mtdcr l2_cache_cfg,r0 /* Ensure L2 Cache is off */
wdenkba56f622004-02-06 23:19:44 +0000679#endif
wdenk0442ed82002-11-03 10:24:00 +0000680
Stefan Roese887e2ec2006-09-07 11:51:23 +0200681 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000682 ori r2,r2,0xffff
683 mfdcr r1,isram0_dpc
684 and r1,r1,r2 /* Disable parity check */
685 mtdcr isram0_dpc,r1
686 mfdcr r1,isram0_pmeg
Stefan Roese887e2ec2006-09-07 11:51:23 +0200687 and r1,r1,r2 /* Disable pwr mgmt */
wdenk0442ed82002-11-03 10:24:00 +0000688 mtdcr isram0_pmeg,r1
689
690 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100691#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000692 ori r1,r1,0x0980 /* first 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200693 mtdcr isram0_sb0cr,r1
wdenkba56f622004-02-06 23:19:44 +0000694 lis r1,0x8001
695 ori r1,r1,0x0980 /* second 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200696 mtdcr isram0_sb1cr,r1
wdenkba56f622004-02-06 23:19:44 +0000697 lis r1, 0x8002
698 ori r1,r1, 0x0980 /* third 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200699 mtdcr isram0_sb2cr,r1
wdenkba56f622004-02-06 23:19:44 +0000700 lis r1, 0x8003
701 ori r1,r1, 0x0980 /* fourth 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200702 mtdcr isram0_sb3cr,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200703#elif defined(CONFIG_440SPE)
704 lis r1,0x0000 /* BAS = 0000_0000 */
705 ori r1,r1,0x0984 /* first 64k */
706 mtdcr isram0_sb0cr,r1
707 lis r1,0x0001
708 ori r1,r1,0x0984 /* second 64k */
709 mtdcr isram0_sb1cr,r1
710 lis r1, 0x0002
711 ori r1,r1, 0x0984 /* third 64k */
712 mtdcr isram0_sb2cr,r1
713 lis r1, 0x0003
714 ori r1,r1, 0x0984 /* fourth 64k */
715 mtdcr isram0_sb3cr,r1
Stefan Roese2801b2d2008-03-11 15:05:50 +0100716#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
717 lis r1,0x4000 /* BAS = 8000_0000 */
718 ori r1,r1,0x4580 /* 16k */
719 mtdcr isram0_sb0cr,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200720#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000721 ori r1,r1,0x0380 /* 8k rw */
722 mtdcr isram0_sb0cr,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200723 mtdcr isram0_sb1cr,r0 /* Disable bank 1 */
wdenkba56f622004-02-06 23:19:44 +0000724#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200725#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000726
727 /*----------------------------------------------------------------*/
728 /* Setup the stack in internal SRAM */
729 /*----------------------------------------------------------------*/
730 lis r1,CFG_INIT_RAM_ADDR@h
731 ori r1,r1,CFG_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000732 li r0,0
733 stwu r0,-4(r1)
734 stwu r0,-4(r1) /* Terminate call chain */
735
736 stwu r1,-8(r1) /* Save back chain and move SP */
737 lis r0,RESET_VECTOR@h /* Address of reset vector */
738 ori r0,r0, RESET_VECTOR@l
739 stwu r1,-8(r1) /* Save back chain and move SP */
740 stw r0,+12(r1) /* Save return addr (underflow vect) */
741
Stefan Roese887e2ec2006-09-07 11:51:23 +0200742#ifdef CONFIG_NAND_SPL
743 bl nand_boot /* will not return */
744#else
wdenk0442ed82002-11-03 10:24:00 +0000745 GET_GOT
Stefan Roese5568e612005-11-22 13:20:42 +0100746
747 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000748 bl board_init_f
Stefan Roese887e2ec2006-09-07 11:51:23 +0200749#endif
wdenk0442ed82002-11-03 10:24:00 +0000750
751#endif /* CONFIG_440 */
752
753/*****************************************************************************/
754#ifdef CONFIG_IOP480
755 /*----------------------------------------------------------------------- */
756 /* Set up some machine state registers. */
757 /*----------------------------------------------------------------------- */
758 addi r0,r0,0x0000 /* initialize r0 to zero */
759 mtspr esr,r0 /* clear Exception Syndrome Reg */
760 mttcr r0 /* timer control register */
761 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000762 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
763 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
764 mtdbsr r4 /* clear/reset the dbsr */
765 mtexisr r4 /* clear all pending interrupts */
766 addis r4,r0,0x8000
767 mtexier r4 /* enable critical exceptions */
768 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
769 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
770 mtiocr r4 /* since bit not used) & DRC to latch */
771 /* data bus on rising edge of CAS */
772 /*----------------------------------------------------------------------- */
773 /* Clear XER. */
774 /*----------------------------------------------------------------------- */
775 mtxer r0
776 /*----------------------------------------------------------------------- */
777 /* Invalidate i-cache and d-cache TAG arrays. */
778 /*----------------------------------------------------------------------- */
779 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
780 addi r4,0,1024 /* 1/4 of I-cache */
781..cloop:
782 iccci 0,r3
783 iccci r4,r3
784 dccci 0,r3
785 addic. r3,r3,-16 /* move back one cache line */
786 bne ..cloop /* loop back to do rest until r3 = 0 */
787
788 /* */
789 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
790 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
791 /* */
792
793 /* first copy IOP480 register base address into r3 */
794 addis r3,0,0x5000 /* IOP480 register base address hi */
795/* ori r3,r3,0x0000 / IOP480 register base address lo */
796
797#ifdef CONFIG_ADCIOP
798 /* use r4 as the working variable */
799 /* turn on CS3 (LOCCTL.7) */
800 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
801 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
802 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
803#endif
804
805#ifdef CONFIG_DASA_SIM
806 /* use r4 as the working variable */
807 /* turn on MA17 (LOCCTL.7) */
808 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
809 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
810 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
811#endif
812
813 /* turn on MA16..13 (LCS0BRD.12 = 0) */
814 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
815 andi. r4,r4,0xefff /* make bit 12 = 0 */
816 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
817
818 /* make sure above stores all comlete before going on */
819 sync
820
821 /* last thing, set local init status done bit (DEVINIT.31) */
822 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
823 oris r4,r4,0x8000 /* make bit 31 = 1 */
824 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
825
826 /* clear all pending interrupts and disable all interrupts */
827 li r4,-1 /* set p1 to 0xffffffff */
828 stw r4,0x1b0(r3) /* clear all pending interrupts */
829 stw r4,0x1b8(r3) /* clear all pending interrupts */
830 li r4,0 /* set r4 to 0 */
831 stw r4,0x1b4(r3) /* disable all interrupts */
832 stw r4,0x1bc(r3) /* disable all interrupts */
833
834 /* make sure above stores all comlete before going on */
835 sync
836
837 /*----------------------------------------------------------------------- */
838 /* Enable two 128MB cachable regions. */
839 /*----------------------------------------------------------------------- */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200840 addis r1,r0,0xc000
wdenk0442ed82002-11-03 10:24:00 +0000841 addi r1,r1,0x0001
842 mticcr r1 /* instruction cache */
843
844 addis r1,r0,0x0000
845 addi r1,r1,0x0000
846 mtdccr r1 /* data cache */
847
848 addis r1,r0,CFG_INIT_RAM_ADDR@h
849 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack to SDRAM */
850 li r0, 0 /* Make room for stack frame header and */
851 stwu r0, -4(r1) /* clear final stack frame so that */
852 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
853
854 GET_GOT /* initialize GOT access */
855
856 bl board_init_f /* run first part of init code (from Flash) */
857
858#endif /* CONFIG_IOP480 */
859
860/*****************************************************************************/
Stefan Roesee01bd212007-03-21 13:38:59 +0100861#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
862 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200863 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000864 /*----------------------------------------------------------------------- */
865 /* Clear and set up some registers. */
866 /*----------------------------------------------------------------------- */
867 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200868#if !defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000869 mtspr sgr,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200870#else
871 /*
872 * On 405EX, completely clearing the SGR leads to PPC hangup
873 * upon PCIe configuration access. The PCIe memory regions
874 * need to be guarded!
875 */
876 lis r3,0x0000
877 ori r3,r3,0x7FFC
878 mtspr sgr,r3
879#endif
wdenk0442ed82002-11-03 10:24:00 +0000880 mtspr dcwr,r4
881 mtesr r4 /* clear Exception Syndrome Reg */
882 mttcr r4 /* clear Timer Control Reg */
883 mtxer r4 /* clear Fixed-Point Exception Reg */
884 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000885 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
886 /* dbsr is cleared by setting bits to 1) */
887 mtdbsr r4 /* clear/reset the dbsr */
888
889 /*----------------------------------------------------------------------- */
890 /* Invalidate I and D caches. Enable I cache for defined memory regions */
891 /* to speed things up. Leave the D cache disabled for now. It will be */
892 /* enabled/left disabled later based on user selected menu options. */
893 /* Be aware that the I cache may be disabled later based on the menu */
894 /* options as well. See miscLib/main.c. */
895 /*----------------------------------------------------------------------- */
896 bl invalidate_icache
897 bl invalidate_dcache
898
899 /*----------------------------------------------------------------------- */
900 /* Enable two 128MB cachable regions. */
901 /*----------------------------------------------------------------------- */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200902 lis r4,0xc000
Stefan Roesee01bd212007-03-21 13:38:59 +0100903 ori r4,r4,0x0001
wdenk0442ed82002-11-03 10:24:00 +0000904 mticcr r4 /* instruction cache */
905 isync
906
Stefan Roesee01bd212007-03-21 13:38:59 +0100907 lis r4,0x0000
908 ori r4,r4,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000909 mtdccr r4 /* data cache */
910
Stefan Roesedbbd1252007-10-05 17:10:59 +0200911#if !(defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR)) || defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000912 /*----------------------------------------------------------------------- */
913 /* Tune the speed and size for flash CS0 */
914 /*----------------------------------------------------------------------- */
915 bl ext_bus_cntlr_init
916#endif
Stefan Roesedbbd1252007-10-05 17:10:59 +0200917#if !(defined(CFG_INIT_DCACHE_CS) || defined(CFG_TEMP_STACK_OCM))
918 /*
919 * Boards like the Kilauea (405EX) don't have OCM and can't use
920 * DCache for init-ram. So setup stack here directly after the
921 * SDRAM is initialized.
922 */
923 lis r1, CFG_INIT_RAM_ADDR@h
924 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack in SDRAM */
925
926 li r0, 0 /* Make room for stack frame header and */
927 stwu r0, -4(r1) /* clear final stack frame so that */
928 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
929 /*
930 * Set up a dummy frame to store reset vector as return address.
931 * this causes stack underflow to reset board.
932 */
933 stwu r1, -8(r1) /* Save back chain and move SP */
934 lis r0, RESET_VECTOR@h /* Address of reset vector */
935 ori r0, r0, RESET_VECTOR@l
936 stwu r1, -8(r1) /* Save back chain and move SP */
937 stw r0, +12(r1) /* Save return addr (underflow vect) */
938#endif /* !(CFG_INIT_DCACHE_CS || !CFG_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000939
stroeseb867d702003-05-23 11:18:02 +0000940#if defined(CONFIG_405EP)
941 /*----------------------------------------------------------------------- */
942 /* DMA Status, clear to come up clean */
943 /*----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200944 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
945 ori r3,r3, 0xFFFF
946 mtdcr dmasr, r3
stroeseb867d702003-05-23 11:18:02 +0000947
Wolfgang Denkf901a832005-08-06 01:42:58 +0200948 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +0000949#endif /* CONFIG_405EP */
950
wdenk0442ed82002-11-03 10:24:00 +0000951#if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +0100952#if defined(CONFIG_405EZ)
953 /********************************************************************
954 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
955 *******************************************************************/
956 /*
957 * We can map the OCM on the PLB3, so map it at
958 * CFG_OCM_DATA_ADDR + 0x8000
959 */
960 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
961 ori r3,r3,CFG_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200962 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesee01bd212007-03-21 13:38:59 +0100963 mtdcr ocmplb3cr1,r3 /* Set PLB Access */
964 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
965 mtdcr ocmplb3cr2,r3 /* Set PLB Access */
966 isync
967
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200968 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roesee01bd212007-03-21 13:38:59 +0100969 ori r3,r3,CFG_OCM_DATA_ADDR@l
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200970 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
971 mtdcr ocmdscr1, r3 /* Set Data Side */
972 mtdcr ocmiscr1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +0100973 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200974 mtdcr ocmdscr2, r3 /* Set Data Side */
975 mtdcr ocmiscr2, r3 /* Set Instruction Side */
976 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed7568942007-05-24 09:49:00 +0200977 mtdcr ocmdsisdpc,r3
Stefan Roesee01bd212007-03-21 13:38:59 +0100978
979 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +0100980#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000981 /********************************************************************
982 * Setup OCM - On Chip Memory
983 *******************************************************************/
984 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +0000985 lis r0, 0x7FFF
986 ori r0, r0, 0xFFFF
Wolfgang Denkf901a832005-08-06 01:42:58 +0200987 mfdcr r3, ocmiscntl /* get instr-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +0100988 mfdcr r4, ocmdscntl /* get data-side IRAM config */
989 and r3, r3, r0 /* disable data-side IRAM */
990 and r4, r4, r0 /* disable data-side IRAM */
991 mtdcr ocmiscntl, r3 /* set instr-side IRAM config */
992 mtdcr ocmdscntl, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +0000993 isync
wdenk0442ed82002-11-03 10:24:00 +0000994
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200995 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roese3cb86f32007-03-24 15:45:34 +0100996 ori r3,r3,CFG_OCM_DATA_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +0000997 mtdcr ocmdsarc, r3
998 addis r4, 0, 0xC000 /* OCM data area enabled */
999 mtdcr ocmdscntl, r4
wdenk8bde7f72003-06-27 21:31:46 +00001000 isync
Stefan Roesee01bd212007-03-21 13:38:59 +01001001#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001002#endif
1003
Stefan Roesec440bfe2007-06-06 11:42:13 +02001004#ifdef CONFIG_NAND_SPL
1005 /*
1006 * Copy SPL from cache into internal SRAM
1007 */
1008 li r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
1009 mtctr r4
1010 lis r2,CFG_NAND_BOOT_SPL_SRC@h
1011 ori r2,r2,CFG_NAND_BOOT_SPL_SRC@l
1012 lis r3,CFG_NAND_BOOT_SPL_DST@h
1013 ori r3,r3,CFG_NAND_BOOT_SPL_DST@l
1014spl_loop:
1015 lwzu r4,4(r2)
1016 stwu r4,4(r3)
1017 bdnz spl_loop
1018
1019 /*
1020 * Jump to code in RAM
1021 */
1022 bl 00f
102300: mflr r10
1024 lis r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
1025 ori r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
1026 sub r10,r10,r3
1027 addi r10,r10,28
1028 mtlr r10
1029 blr
1030
1031start_ram:
1032 sync
1033 isync
1034#endif /* CONFIG_NAND_SPL */
1035
wdenk0442ed82002-11-03 10:24:00 +00001036 /*----------------------------------------------------------------------- */
1037 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1038 /*----------------------------------------------------------------------- */
1039#ifdef CFG_INIT_DCACHE_CS
1040 /*----------------------------------------------------------------------- */
1041 /* Memory Bank x (nothingness) initialization 1GB+64MEG */
1042 /* used as temporary stack pointer for stage0 */
1043 /*----------------------------------------------------------------------- */
1044 li r4,PBxAP
1045 mtdcr ebccfga,r4
1046 lis r4,0x0380
1047 ori r4,r4,0x0480
1048 mtdcr ebccfgd,r4
1049
1050 addi r4,0,PBxCR
1051 mtdcr ebccfga,r4
1052 lis r4,0x400D
1053 ori r4,r4,0xa000
1054 mtdcr ebccfgd,r4
1055
Stefan Roesedbbd1252007-10-05 17:10:59 +02001056 /* turn on data cache for this region */
wdenk0442ed82002-11-03 10:24:00 +00001057 lis r4,0x0080
1058 mtdccr r4
1059
1060 /* set stack pointer and clear stack to known value */
1061
1062 lis r1,CFG_INIT_RAM_ADDR@h
Wolfgang Denkf901a832005-08-06 01:42:58 +02001063 ori r1,r1,CFG_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +00001064
1065 li r4,2048 /* we store 2048 words to stack */
1066 mtctr r4
1067
1068 lis r2,CFG_INIT_RAM_ADDR@h /* we also clear data area */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001069 ori r2,r2,CFG_INIT_RAM_END@l /* so cant copy value from r1 */
wdenk0442ed82002-11-03 10:24:00 +00001070
1071 lis r4,0xdead /* we store 0xdeaddead in the stack */
1072 ori r4,r4,0xdead
1073
1074..stackloop:
1075 stwu r4,-4(r2)
1076 bdnz ..stackloop
1077
1078 li r0, 0 /* Make room for stack frame header and */
1079 stwu r0, -4(r1) /* clear final stack frame so that */
1080 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
1081 /*
1082 * Set up a dummy frame to store reset vector as return address.
1083 * this causes stack underflow to reset board.
1084 */
1085 stwu r1, -8(r1) /* Save back chain and move SP */
1086 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1087 ori r0, r0, RESET_VECTOR@l
1088 stwu r1, -8(r1) /* Save back chain and move SP */
1089 stw r0, +12(r1) /* Save return addr (underflow vect) */
1090
1091#elif defined(CFG_TEMP_STACK_OCM) && \
1092 (defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE))
1093 /*
1094 * Stack in OCM.
1095 */
1096
1097 /* Set up Stack at top of OCM */
1098 lis r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@h
1099 ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@l
1100
1101 /* Set up a zeroized stack frame so that backtrace works right */
1102 li r0, 0
1103 stwu r0, -4(r1)
1104 stwu r0, -4(r1)
1105
1106 /*
1107 * Set up a dummy frame to store reset vector as return address.
1108 * this causes stack underflow to reset board.
1109 */
1110 stwu r1, -8(r1) /* Save back chain and move SP */
1111 lis r0, RESET_VECTOR@h /* Address of reset vector */
1112 ori r0, r0, RESET_VECTOR@l
1113 stwu r1, -8(r1) /* Save back chain and move SP */
1114 stw r0, +12(r1) /* Save return addr (underflow vect) */
1115#endif /* CFG_INIT_DCACHE_CS */
1116
1117 /*----------------------------------------------------------------------- */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001118 /* Initialize SDRAM Controller */
wdenk0442ed82002-11-03 10:24:00 +00001119 /*----------------------------------------------------------------------- */
1120 bl sdram_init
1121
Stefan Roesec440bfe2007-06-06 11:42:13 +02001122#ifdef CONFIG_NAND_SPL
1123 bl nand_boot /* will not return */
1124#else
wdenk0442ed82002-11-03 10:24:00 +00001125 GET_GOT /* initialize GOT access */
1126
Wolfgang Denkf901a832005-08-06 01:42:58 +02001127 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001128
1129 /* NEVER RETURNS! */
1130 bl board_init_f /* run first part of init code (from Flash) */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001131#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001132
wdenk12f34242003-09-02 22:48:03 +00001133#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1134 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001135
1136
Stefan Roese887e2ec2006-09-07 11:51:23 +02001137#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001138/*
1139 * This code finishes saving the registers to the exception frame
1140 * and jumps to the appropriate handler for the exception.
1141 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1142 */
1143 .globl transfer_to_handler
1144transfer_to_handler:
1145 stw r22,_NIP(r21)
1146 lis r22,MSR_POW@h
1147 andc r23,r23,r22
1148 stw r23,_MSR(r21)
1149 SAVE_GPR(7, r21)
1150 SAVE_4GPRS(8, r21)
1151 SAVE_8GPRS(12, r21)
1152 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001153 mflr r23
1154 andi. r24,r23,0x3f00 /* get vector offset */
1155 stw r24,TRAP(r21)
1156 li r22,0
1157 stw r22,RESULT(r21)
1158 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001159 lwz r24,0(r23) /* virtual address of handler */
1160 lwz r23,4(r23) /* where to go when done */
1161 mtspr SRR0,r24
1162 mtspr SRR1,r20
1163 mtlr r23
1164 SYNC
1165 rfi /* jump to handler, enable MMU */
1166
1167int_return:
1168 mfmsr r28 /* Disable interrupts */
1169 li r4,0
1170 ori r4,r4,MSR_EE
1171 andc r28,r28,r4
1172 SYNC /* Some chip revs need this... */
1173 mtmsr r28
1174 SYNC
1175 lwz r2,_CTR(r1)
1176 lwz r0,_LINK(r1)
1177 mtctr r2
1178 mtlr r0
1179 lwz r2,_XER(r1)
1180 lwz r0,_CCR(r1)
1181 mtspr XER,r2
1182 mtcrf 0xFF,r0
1183 REST_10GPRS(3, r1)
1184 REST_10GPRS(13, r1)
1185 REST_8GPRS(23, r1)
1186 REST_GPR(31, r1)
1187 lwz r2,_NIP(r1) /* Restore environment */
1188 lwz r0,_MSR(r1)
1189 mtspr SRR0,r2
1190 mtspr SRR1,r0
1191 lwz r0,GPR0(r1)
1192 lwz r2,GPR2(r1)
1193 lwz r1,GPR1(r1)
1194 SYNC
1195 rfi
1196
1197crit_return:
1198 mfmsr r28 /* Disable interrupts */
1199 li r4,0
1200 ori r4,r4,MSR_EE
1201 andc r28,r28,r4
1202 SYNC /* Some chip revs need this... */
1203 mtmsr r28
1204 SYNC
1205 lwz r2,_CTR(r1)
1206 lwz r0,_LINK(r1)
1207 mtctr r2
1208 mtlr r0
1209 lwz r2,_XER(r1)
1210 lwz r0,_CCR(r1)
1211 mtspr XER,r2
1212 mtcrf 0xFF,r0
1213 REST_10GPRS(3, r1)
1214 REST_10GPRS(13, r1)
1215 REST_8GPRS(23, r1)
1216 REST_GPR(31, r1)
1217 lwz r2,_NIP(r1) /* Restore environment */
1218 lwz r0,_MSR(r1)
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001219 mtspr csrr0,r2
1220 mtspr csrr1,r0
wdenk0442ed82002-11-03 10:24:00 +00001221 lwz r0,GPR0(r1)
1222 lwz r2,GPR2(r1)
1223 lwz r1,GPR1(r1)
1224 SYNC
1225 rfci
1226
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001227#ifdef CONFIG_440
1228mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001229 mfmsr r28 /* Disable interrupts */
1230 li r4,0
1231 ori r4,r4,MSR_EE
1232 andc r28,r28,r4
1233 SYNC /* Some chip revs need this... */
1234 mtmsr r28
1235 SYNC
1236 lwz r2,_CTR(r1)
1237 lwz r0,_LINK(r1)
1238 mtctr r2
1239 mtlr r0
1240 lwz r2,_XER(r1)
1241 lwz r0,_CCR(r1)
1242 mtspr XER,r2
1243 mtcrf 0xFF,r0
1244 REST_10GPRS(3, r1)
1245 REST_10GPRS(13, r1)
1246 REST_8GPRS(23, r1)
1247 REST_GPR(31, r1)
1248 lwz r2,_NIP(r1) /* Restore environment */
1249 lwz r0,_MSR(r1)
1250 mtspr mcsrr0,r2
1251 mtspr mcsrr1,r0
1252 lwz r0,GPR0(r1)
1253 lwz r2,GPR2(r1)
1254 lwz r1,GPR1(r1)
1255 SYNC
1256 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001257#endif /* CONFIG_440 */
1258
1259
wdenk0442ed82002-11-03 10:24:00 +00001260 .globl get_pvr
1261get_pvr:
1262 mfspr r3, PVR
1263 blr
1264
wdenk0442ed82002-11-03 10:24:00 +00001265/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001266/* Function: out16 */
1267/* Description: Output 16 bits */
1268/*------------------------------------------------------------------------------- */
1269 .globl out16
1270out16:
1271 sth r4,0x0000(r3)
1272 blr
1273
1274/*------------------------------------------------------------------------------- */
1275/* Function: out16r */
1276/* Description: Byte reverse and output 16 bits */
1277/*------------------------------------------------------------------------------- */
1278 .globl out16r
1279out16r:
1280 sthbrx r4,r0,r3
1281 blr
1282
1283/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001284/* Function: out32r */
1285/* Description: Byte reverse and output 32 bits */
1286/*------------------------------------------------------------------------------- */
1287 .globl out32r
1288out32r:
1289 stwbrx r4,r0,r3
1290 blr
1291
1292/*------------------------------------------------------------------------------- */
1293/* Function: in16 */
1294/* Description: Input 16 bits */
1295/*------------------------------------------------------------------------------- */
1296 .globl in16
1297in16:
1298 lhz r3,0x0000(r3)
1299 blr
1300
1301/*------------------------------------------------------------------------------- */
1302/* Function: in16r */
1303/* Description: Input 16 bits and byte reverse */
1304/*------------------------------------------------------------------------------- */
1305 .globl in16r
1306in16r:
1307 lhbrx r3,r0,r3
1308 blr
1309
1310/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001311/* Function: in32r */
1312/* Description: Input 32 bits and byte reverse */
1313/*------------------------------------------------------------------------------- */
1314 .globl in32r
1315in32r:
1316 lwbrx r3,r0,r3
1317 blr
1318
wdenk0442ed82002-11-03 10:24:00 +00001319/*
1320 * void relocate_code (addr_sp, gd, addr_moni)
1321 *
1322 * This "function" does not return, instead it continues in RAM
1323 * after relocating the monitor code.
1324 *
1325 * r3 = dest
1326 * r4 = src
1327 * r5 = length in bytes
1328 * r6 = cachelinesize
1329 */
1330 .globl relocate_code
1331relocate_code:
Stefan Roese9b94ac62007-10-31 17:55:58 +01001332#ifdef CONFIG_4xx_DCACHE
1333 /*
1334 * We need to flush the Init Data before the dcache will be
1335 * invalidated
1336 */
1337
1338 /* save regs */
1339 mr r9,r3
1340 mr r10,r4
1341 mr r11,r5
1342
1343 mr r3,r4
1344 addi r4,r4,0x200 /* should be enough for init data */
1345 bl flush_dcache_range
1346
1347 /* restore regs */
1348 mr r3,r9
1349 mr r4,r10
1350 mr r5,r11
1351#endif
Stefan Roesee02c5212008-01-09 10:23:16 +01001352
1353#ifdef CFG_INIT_RAM_DCACHE
1354 /*
1355 * Unlock the previously locked d-cache
1356 */
1357 msync
1358 isync
1359 /* set TFLOOR/NFLOOR to 0 again */
1360 lis r6,0x0001
1361 ori r6,r6,0xf800
1362 mtspr dvlim,r6
1363 lis r6,0x0000
1364 ori r6,r6,0x0000
1365 mtspr dnv0,r6
1366 mtspr dnv1,r6
1367 mtspr dnv2,r6
1368 mtspr dnv3,r6
1369 mtspr dtv0,r6
1370 mtspr dtv1,r6
1371 mtspr dtv2,r6
1372 mtspr dtv3,r6
1373 msync
1374 isync
1375#endif /* CFG_INIT_RAM_DCACHE */
1376
Stefan Roese887e2ec2006-09-07 11:51:23 +02001377#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1378 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +01001379 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
1380 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roesea4c8d132006-06-02 16:18:04 +02001381 /*
1382 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1383 * to speed up the boot process. Now this cache needs to be disabled.
1384 */
1385 iccci 0,0 /* Invalidate inst cache */
1386 dccci 0,0 /* Invalidate data cache, now no longer our stack */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001387 sync
Stefan Roesea4c8d132006-06-02 16:18:04 +02001388 isync
Niklaus Giger85dc2a72007-11-30 18:35:11 +01001389#ifdef CFG_TLB_FOR_BOOT_FLASH
1390 addi r1,r0,CFG_TLB_FOR_BOOT_FLASH /* Use defined TLB */
1391#else
1392 addi r1,r0,0x0000 /* Default TLB entry is #0 */
1393#endif
Stefan Roesec157d8e2005-08-01 16:41:48 +02001394 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001395 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001396 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001397 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001398 isync
1399#endif
wdenk0442ed82002-11-03 10:24:00 +00001400 mr r1, r3 /* Set new stack pointer */
1401 mr r9, r4 /* Save copy of Init Data pointer */
1402 mr r10, r5 /* Save copy of Destination Address */
1403
1404 mr r3, r5 /* Destination Address */
1405 lis r4, CFG_MONITOR_BASE@h /* Source Address */
1406 ori r4, r4, CFG_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001407 lwz r5, GOT(__init_end)
1408 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001409 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001410
1411 /*
1412 * Fix GOT pointer:
1413 *
1414 * New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address
1415 *
1416 * Offset:
1417 */
1418 sub r15, r10, r4
1419
1420 /* First our own GOT */
1421 add r14, r14, r15
1422 /* the the one used by the C code */
1423 add r30, r30, r15
1424
1425 /*
1426 * Now relocate code
1427 */
1428
1429 cmplw cr1,r3,r4
1430 addi r0,r5,3
1431 srwi. r0,r0,2
1432 beq cr1,4f /* In place copy is not necessary */
1433 beq 7f /* Protect against 0 count */
1434 mtctr r0
1435 bge cr1,2f
1436
1437 la r8,-4(r4)
1438 la r7,-4(r3)
14391: lwzu r0,4(r8)
1440 stwu r0,4(r7)
1441 bdnz 1b
1442 b 4f
1443
14442: slwi r0,r0,2
1445 add r8,r4,r0
1446 add r7,r3,r0
14473: lwzu r0,-4(r8)
1448 stwu r0,-4(r7)
1449 bdnz 3b
1450
1451/*
1452 * Now flush the cache: note that we must start from a cache aligned
1453 * address. Otherwise we might miss one cache line.
1454 */
14554: cmpwi r6,0
1456 add r5,r3,r5
1457 beq 7f /* Always flush prefetch queue in any case */
1458 subi r0,r6,1
1459 andc r3,r3,r0
1460 mr r4,r3
14615: dcbst 0,r4
1462 add r4,r4,r6
1463 cmplw r4,r5
1464 blt 5b
1465 sync /* Wait for all dcbst to complete on bus */
1466 mr r4,r3
14676: icbi 0,r4
1468 add r4,r4,r6
1469 cmplw r4,r5
1470 blt 6b
14717: sync /* Wait for all icbi to complete on bus */
1472 isync
1473
1474/*
1475 * We are done. Do not return, instead branch to second part of board
1476 * initialization, now running from RAM.
1477 */
1478
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001479 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001480 mtlr r0
1481 blr /* NEVER RETURNS! */
1482
1483in_ram:
1484
1485 /*
1486 * Relocation Function, r14 point to got2+0x8000
1487 *
1488 * Adjust got2 pointers, no need to check for 0, this code
1489 * already puts a few entries in the table.
1490 */
1491 li r0,__got2_entries@sectoff@l
1492 la r3,GOT(_GOT2_TABLE_)
1493 lwz r11,GOT(_GOT2_TABLE_)
1494 mtctr r0
1495 sub r11,r3,r11
1496 addi r3,r3,-4
14971: lwzu r0,4(r3)
1498 add r0,r0,r11
1499 stw r0,0(r3)
1500 bdnz 1b
1501
1502 /*
1503 * Now adjust the fixups and the pointers to the fixups
1504 * in case we need to move ourselves again.
1505 */
15062: li r0,__fixup_entries@sectoff@l
1507 lwz r3,GOT(_FIXUP_TABLE_)
1508 cmpwi r0,0
1509 mtctr r0
1510 addi r3,r3,-4
1511 beq 4f
15123: lwzu r4,4(r3)
1513 lwzux r0,r4,r11
1514 add r0,r0,r11
1515 stw r10,0(r3)
1516 stw r0,0(r4)
1517 bdnz 3b
15184:
1519clear_bss:
1520 /*
1521 * Now clear BSS segment
1522 */
wdenk5d232d02003-05-22 22:52:13 +00001523 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001524 lwz r4,GOT(_end)
1525
1526 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001527 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001528
1529 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001530
1531 andi. r5, r4, 3
1532 beq 6f
1533 sub r4, r4, r5
1534 mtctr r5
1535 mr r5, r4
15365: stb r0, 0(r5)
1537 addi r5, r5, 1
1538 bdnz 5b
15396:
wdenk0442ed82002-11-03 10:24:00 +00001540 stw r0, 0(r3)
1541 addi r3, r3, 4
1542 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001543 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001544
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010015457:
wdenk0442ed82002-11-03 10:24:00 +00001546 mr r3, r9 /* Init Data pointer */
1547 mr r4, r10 /* Destination Address */
1548 bl board_init_r
1549
wdenk0442ed82002-11-03 10:24:00 +00001550 /*
1551 * Copy exception vector code to low memory
1552 *
1553 * r3: dest_addr
1554 * r7: source address, r8: end address, r9: target address
1555 */
1556 .globl trap_init
1557trap_init:
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001558 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001559 lwz r8, GOT(_end_of_vectors)
1560
wdenk682011f2003-06-03 23:54:09 +00001561 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001562
1563 cmplw 0, r7, r8
1564 bgelr /* return if r7>=r8 - just in case */
1565
1566 mflr r4 /* save link register */
15671:
1568 lwz r0, 0(r7)
1569 stw r0, 0(r9)
1570 addi r7, r7, 4
1571 addi r9, r9, 4
1572 cmplw 0, r7, r8
1573 bne 1b
1574
1575 /*
1576 * relocate `hdlr' and `int_return' entries
1577 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001578 li r7, .L_MachineCheck - _start + _START_OFFSET
1579 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000015802:
1581 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001582 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001583 cmplw 0, r7, r8
1584 blt 2b
1585
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001586 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001587 bl trap_reloc
1588
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001589 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001590 bl trap_reloc
1591
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001592#ifdef CONFIG_440
1593 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001594 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001595
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001596 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001597 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001598
1599 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001600 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001601
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001602 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1603 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001604
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001605 li r7, .L_DataTLBError - _start + _START_OFFSET
1606 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001607#else /* CONFIG_440 */
1608 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001609 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001610
1611 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001612 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001613
1614 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001615 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001616#endif /* CONFIG_440 */
1617
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001618 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1619 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001620
Stefan Roese887e2ec2006-09-07 11:51:23 +02001621#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001622 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1623 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1624 mtmsr r7 /* change MSR */
1625#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001626 bl __440_msr_set
1627 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001628
Stefan Roese887e2ec2006-09-07 11:51:23 +02001629__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001630 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1631 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1632 mtspr srr1,r7
1633 mflr r7
1634 mtspr srr0,r7
1635 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001636__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001637#endif
1638
wdenk0442ed82002-11-03 10:24:00 +00001639 mtlr r4 /* restore link register */
1640 blr
1641
1642 /*
1643 * Function: relocate entries for one exception vector
1644 */
1645trap_reloc:
1646 lwz r0, 0(r7) /* hdlr ... */
1647 add r0, r0, r3 /* ... += dest_addr */
1648 stw r0, 0(r7)
1649
1650 lwz r0, 4(r7) /* int_return ... */
1651 add r0, r0, r3 /* ... += dest_addr */
1652 stw r0, 4(r7)
1653
1654 blr
Stefan Roesecf959c72007-06-01 15:27:11 +02001655
1656#if defined(CONFIG_440)
1657/*----------------------------------------------------------------------------+
1658| dcbz_area.
1659+----------------------------------------------------------------------------*/
1660 function_prolog(dcbz_area)
1661 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001662 rlwinm r5,r4,27,5,31
1663 beq ..d_ra2
1664 addi r5,r5,0x0001
1665..d_ra2:mtctr r5
1666..d_ag2:dcbz r0,r3
1667 addi r3,r3,32
1668 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001669 sync
1670 blr
1671 function_epilog(dcbz_area)
1672
1673/*----------------------------------------------------------------------------+
1674| dflush. Assume 32K at vector address is cachable.
1675+----------------------------------------------------------------------------*/
1676 function_prolog(dflush)
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001677 mfmsr r9
1678 rlwinm r8,r9,0,15,13
1679 rlwinm r8,r8,0,17,15
1680 mtmsr r8
Larry Johnson6d8184b2008-01-09 23:10:27 -05001681 mfspr r8,dvlim
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001682 addi r3,r0,0x0000
1683 mtspr dvlim,r3
1684 mfspr r3,ivpr
1685 addi r4,r0,1024
1686 mtctr r4
Stefan Roesecf959c72007-06-01 15:27:11 +02001687..dflush_loop:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001688 lwz r6,0x0(r3)
1689 addi r3,r3,32
1690 bdnz ..dflush_loop
1691 addi r3,r3,-32
1692 mtctr r4
1693..ag: dcbf r0,r3
1694 addi r3,r3,-32
1695 bdnz ..ag
Larry Johnson6d8184b2008-01-09 23:10:27 -05001696 mtspr dvlim,r8
Stefan Roesecf959c72007-06-01 15:27:11 +02001697 sync
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001698 mtmsr r9
Stefan Roesecf959c72007-06-01 15:27:11 +02001699 blr
1700 function_epilog(dflush)
1701#endif /* CONFIG_440 */
Stefan Roese887e2ec2006-09-07 11:51:23 +02001702#endif /* CONFIG_NAND_SPL */
stroeseb867d702003-05-23 11:18:02 +00001703
Stefan Roesecf959c72007-06-01 15:27:11 +02001704/*------------------------------------------------------------------------------- */
1705/* Function: in8 */
1706/* Description: Input 8 bits */
1707/*------------------------------------------------------------------------------- */
1708 .globl in8
1709in8:
1710 lbz r3,0x0000(r3)
1711 blr
1712
1713/*------------------------------------------------------------------------------- */
1714/* Function: out8 */
1715/* Description: Output 8 bits */
1716/*------------------------------------------------------------------------------- */
1717 .globl out8
1718out8:
1719 stb r4,0x0000(r3)
1720 blr
1721
1722/*------------------------------------------------------------------------------- */
1723/* Function: out32 */
1724/* Description: Output 32 bits */
1725/*------------------------------------------------------------------------------- */
1726 .globl out32
1727out32:
1728 stw r4,0x0000(r3)
1729 blr
1730
1731/*------------------------------------------------------------------------------- */
1732/* Function: in32 */
1733/* Description: Input 32 bits */
1734/*------------------------------------------------------------------------------- */
1735 .globl in32
1736in32:
1737 lwz 3,0x0000(3)
1738 blr
stroeseb867d702003-05-23 11:18:02 +00001739
1740/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001741/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001742/**************************************************************************/
1743#ifdef CONFIG_405EP
1744ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001745
Stefan Roesec157d8e2005-08-01 16:41:48 +02001746#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001747 /*
1748 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1749 * function) to support FPGA and NVRAM accesses below.
1750 */
1751
1752 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1753 ori r3,r3,GPIO0_OSRH@l
1754 lis r4,CFG_GPIO0_OSRH@h
1755 ori r4,r4,CFG_GPIO0_OSRH@l
1756 stw r4,0(r3)
1757 lis r3,GPIO0_OSRL@h
1758 ori r3,r3,GPIO0_OSRL@l
1759 lis r4,CFG_GPIO0_OSRL@h
1760 ori r4,r4,CFG_GPIO0_OSRL@l
1761 stw r4,0(r3)
1762
1763 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1764 ori r3,r3,GPIO0_ISR1H@l
1765 lis r4,CFG_GPIO0_ISR1H@h
1766 ori r4,r4,CFG_GPIO0_ISR1H@l
1767 stw r4,0(r3)
1768 lis r3,GPIO0_ISR1L@h
1769 ori r3,r3,GPIO0_ISR1L@l
1770 lis r4,CFG_GPIO0_ISR1L@h
1771 ori r4,r4,CFG_GPIO0_ISR1L@l
1772 stw r4,0(r3)
1773
1774 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1775 ori r3,r3,GPIO0_TSRH@l
1776 lis r4,CFG_GPIO0_TSRH@h
1777 ori r4,r4,CFG_GPIO0_TSRH@l
1778 stw r4,0(r3)
1779 lis r3,GPIO0_TSRL@h
1780 ori r3,r3,GPIO0_TSRL@l
1781 lis r4,CFG_GPIO0_TSRL@h
1782 ori r4,r4,CFG_GPIO0_TSRL@l
1783 stw r4,0(r3)
1784
1785 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1786 ori r3,r3,GPIO0_TCR@l
1787 lis r4,CFG_GPIO0_TCR@h
1788 ori r4,r4,CFG_GPIO0_TCR@l
1789 stw r4,0(r3)
1790
1791 li r3,pb1ap /* program EBC bank 1 for RTC access */
1792 mtdcr ebccfga,r3
1793 lis r3,CFG_EBC_PB1AP@h
1794 ori r3,r3,CFG_EBC_PB1AP@l
1795 mtdcr ebccfgd,r3
1796 li r3,pb1cr
1797 mtdcr ebccfga,r3
1798 lis r3,CFG_EBC_PB1CR@h
1799 ori r3,r3,CFG_EBC_PB1CR@l
1800 mtdcr ebccfgd,r3
1801
1802 li r3,pb1ap /* program EBC bank 1 for RTC access */
1803 mtdcr ebccfga,r3
1804 lis r3,CFG_EBC_PB1AP@h
1805 ori r3,r3,CFG_EBC_PB1AP@l
1806 mtdcr ebccfgd,r3
1807 li r3,pb1cr
1808 mtdcr ebccfga,r3
1809 lis r3,CFG_EBC_PB1CR@h
1810 ori r3,r3,CFG_EBC_PB1CR@l
1811 mtdcr ebccfgd,r3
1812
1813 li r3,pb4ap /* program EBC bank 4 for FPGA access */
1814 mtdcr ebccfga,r3
1815 lis r3,CFG_EBC_PB4AP@h
1816 ori r3,r3,CFG_EBC_PB4AP@l
1817 mtdcr ebccfgd,r3
1818 li r3,pb4cr
1819 mtdcr ebccfga,r3
1820 lis r3,CFG_EBC_PB4CR@h
1821 ori r3,r3,CFG_EBC_PB4CR@l
1822 mtdcr ebccfgd,r3
1823#endif
1824
wdenk8bde7f72003-06-27 21:31:46 +00001825 /*
1826 !-----------------------------------------------------------------------
1827 ! Check to see if chip is in bypass mode.
1828 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1829 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001830 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1831 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001832 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001833 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001834 mfdcr r5, CPC0_PLLMR1
1835 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
1836 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001837
Wolfgang Denkf901a832005-08-06 01:42:58 +02001838 beq pll_done /* if SSCS =b'1' then PLL has */
wdenk8bde7f72003-06-27 21:31:46 +00001839 /* already been set */
1840 /* and CPU has been reset */
1841 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001842
Stefan Roesec157d8e2005-08-01 16:41:48 +02001843#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001844 /*
wdenk8bde7f72003-06-27 21:31:46 +00001845 !-----------------------------------------------------------------------
1846 ! Read NVRAM to get value to write in PLLMR.
1847 ! If value has not been correctly saved, write default value
1848 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1849 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1850 !
1851 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001852 ! structure in openbios.h. Changing the beginning of
1853 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001854 !
1855 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001856 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001857 addis r3,0,NVRAM_BASE@h
1858 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001859
Wolfgang Denkf901a832005-08-06 01:42:58 +02001860 lwz r4, 0(r3)
1861 addis r5,0,NVRVFY1@h
1862 addi r5,r5,NVRVFY1@l
1863 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
1864 bne ..no_pllset
1865 addi r3,r3,4
1866 lwz r4, 0(r3)
1867 addis r5,0,NVRVFY2@h
1868 addi r5,r5,NVRVFY2@l
1869 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
1870 bne ..no_pllset
1871 addi r3,r3,8 /* Skip over conf_size */
1872 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1873 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1874 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1875 cmpi cr0,0,r5,1 /* See if PLL is locked */
1876 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001877..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001878#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001879
John Otkend4024bb2007-07-26 17:49:11 +02001880#ifdef CONFIG_TAIHU
1881 mfdcr r4, CPC0_BOOT
1882 andi. r5, r4, CPC0_BOOT_SEP@l
1883 bne strap_1 /* serial eeprom present */
1884 addis r5,0,CPLD_REG0_ADDR@h
1885 ori r5,r5,CPLD_REG0_ADDR@l
1886 andi. r5, r5, 0x10
1887 bne _pci_66mhz
1888#endif /* CONFIG_TAIHU */
1889
Stefan Roese779e9752007-08-14 14:44:41 +02001890#if defined(CONFIG_ZEUS)
1891 mfdcr r4, CPC0_BOOT
1892 andi. r5, r4, CPC0_BOOT_SEP@l
1893 bne strap_1 /* serial eeprom present */
1894 lis r3,0x0000
1895 addi r3,r3,0x3030
1896 lis r4,0x8042
1897 addi r4,r4,0x223e
1898 b 1f
1899strap_1:
1900 mfdcr r3, CPC0_PLLMR0
1901 mfdcr r4, CPC0_PLLMR1
1902 b 1f
1903#endif
1904
Wolfgang Denkf901a832005-08-06 01:42:58 +02001905 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1906 ori r3,r3,PLLMR0_DEFAULT@l /* */
1907 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1908 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001909
John Otkend4024bb2007-07-26 17:49:11 +02001910#ifdef CONFIG_TAIHU
1911 b 1f
1912_pci_66mhz:
1913 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1914 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1915 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1916 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1917 b 1f
1918strap_1:
1919 mfdcr r3, CPC0_PLLMR0
1920 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001921#endif /* CONFIG_TAIHU */
1922
Stefan Roese779e9752007-08-14 14:44:41 +020019231:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001924 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001925
1926pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001927 /*
1928 !-----------------------------------------------------------------------
1929 ! Clear Soft Reset Register
1930 ! This is needed to enable PCI if not booting from serial EPROM
1931 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001932 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001933 addi r3, 0, 0x0
1934 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001935
Wolfgang Denkf901a832005-08-06 01:42:58 +02001936 addis r3,0,0x0010
1937 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001938pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001939 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001940
1941 blr /* return to main code */
1942
1943/*
1944!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02001945! Function: pll_write
1946! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1947! That is:
1948! 1. Pll is first disabled (de-activated by putting in bypass mode)
1949! 2. PLL is reset
1950! 3. Clock dividers are set while PLL is held in reset and bypassed
1951! 4. PLL Reset is cleared
1952! 5. Wait 100us for PLL to lock
1953! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00001954! Input: r3 = Value to write to CPC0_PLLMR0
1955! Input: r4 = Value to write to CPC0_PLLMR1
1956! Output r3 = none
1957!-----------------------------------------------------------------------------
1958*/
1959pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00001960 mfdcr r5, CPC0_UCR
1961 andis. r5,r5,0xFFFF
Wolfgang Denkf901a832005-08-06 01:42:58 +02001962 ori r5,r5,0x0101 /* Stop the UART clocks */
1963 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00001964
wdenk8bde7f72003-06-27 21:31:46 +00001965 mfdcr r5, CPC0_PLLMR1
Wolfgang Denkf901a832005-08-06 01:42:58 +02001966 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
1967 mtdcr CPC0_PLLMR1,r5
1968 oris r5,r5,0x4000 /* Set PLL Reset */
1969 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001970
Wolfgang Denkf901a832005-08-06 01:42:58 +02001971 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1972 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1973 oris r5,r5,0x4000 /* Set PLL Reset */
1974 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1975 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
1976 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001977
1978 /*
wdenk8bde7f72003-06-27 21:31:46 +00001979 ! Wait min of 100us for PLL to lock.
1980 ! See CMOS 27E databook for more info.
1981 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00001982 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001983 addi r3,0,20000 /* 2000 = 0x4e20 */
1984 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001985pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001986 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00001987
Wolfgang Denkf901a832005-08-06 01:42:58 +02001988 oris r5,r5,0x8000 /* Enable PLL */
1989 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00001990
wdenk8bde7f72003-06-27 21:31:46 +00001991 /*
1992 * Reset CPU to guarantee timings are OK
1993 * Not sure if this is needed...
1994 */
1995 addis r3,0,0x1000
Wolfgang Denkf901a832005-08-06 01:42:58 +02001996 mtspr dbcr0,r3 /* This will cause a CPU core reset, and */
wdenk8bde7f72003-06-27 21:31:46 +00001997 /* execution will continue from the poweron */
1998 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00001999#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01002000
2001#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01002002/*----------------------------------------------------------------------------+
2003| mttlb3.
2004+----------------------------------------------------------------------------*/
2005 function_prolog(mttlb3)
2006 TLBWE(4,3,2)
2007 blr
2008 function_epilog(mttlb3)
2009
2010/*----------------------------------------------------------------------------+
2011| mftlb3.
2012+----------------------------------------------------------------------------*/
2013 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01002014 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01002015 blr
2016 function_epilog(mftlb3)
2017
2018/*----------------------------------------------------------------------------+
2019| mttlb2.
2020+----------------------------------------------------------------------------*/
2021 function_prolog(mttlb2)
2022 TLBWE(4,3,1)
2023 blr
2024 function_epilog(mttlb2)
2025
2026/*----------------------------------------------------------------------------+
2027| mftlb2.
2028+----------------------------------------------------------------------------*/
2029 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01002030 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01002031 blr
2032 function_epilog(mftlb2)
2033
2034/*----------------------------------------------------------------------------+
2035| mttlb1.
2036+----------------------------------------------------------------------------*/
2037 function_prolog(mttlb1)
2038 TLBWE(4,3,0)
2039 blr
2040 function_epilog(mttlb1)
2041
2042/*----------------------------------------------------------------------------+
2043| mftlb1.
2044+----------------------------------------------------------------------------*/
2045 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01002046 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01002047 blr
2048 function_epilog(mftlb1)
2049#endif /* CONFIG_440 */