blob: 426bf3c6f9a966b21917e4d2348b56dfc5b3c9cf [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
Grant Ericksonc821b5f2008-05-22 14:44:14 -07006 * Copyright (c) 2008 Nuovation System Designs, LLC
7 * Grant Erickson <gerickson@nuovations.com>
wdenk0442ed82002-11-03 10:24:00 +00008 *
9 * See file CREDITS for list of people who contributed to this
10 * project.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25 * MA 02111-1307 USA
26 */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +020027/*------------------------------------------------------------------------------+
28 *
29 * This source code has been made available to you by IBM on an AS-IS
30 * basis. Anyone receiving this source is licensed under IBM
31 * copyrights to use it in any way he or she deems fit, including
32 * copying it, modifying it, compiling it, and redistributing it either
33 * with or without modifications. No license under IBM patents or
34 * patent applications is to be implied by the copyright license.
35 *
36 * Any user of this software should understand that IBM cannot provide
37 * technical support for this software and will not be responsible for
38 * any consequences resulting from the use of this software.
39 *
40 * Any person who transfers this source code or any derivative work
41 * must include the IBM copyright notice, this paragraph, and the
42 * preceding two paragraphs in the transferred software.
43 *
44 * COPYRIGHT I B M CORPORATION 1995
45 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
46 *-------------------------------------------------------------------------------
47 */
wdenk0442ed82002-11-03 10:24:00 +000048
Wolfgang Denk0c8721a2005-09-23 11:05:55 +020049/* U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
wdenk0442ed82002-11-03 10:24:00 +000050 *
51 *
52 * The processor starts at 0xfffffffc and the code is executed
53 * from flash/rom.
54 * in memory, but as long we don't jump around before relocating.
55 * board_init lies at a quite high address and when the cpu has
56 * jumped there, everything is ok.
57 * This works because the cpu gives the FLASH (CS0) the whole
58 * address space at startup, and board_init lies as a echo of
59 * the flash somewhere up there in the memorymap.
60 *
61 * board_init will change CS0 to be positioned at the correct
62 * address and (s)dram will be positioned at address 0
63 */
64#include <config.h>
wdenk0442ed82002-11-03 10:24:00 +000065#include <ppc4xx.h>
66#include <version.h>
67
68#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
69
70#include <ppc_asm.tmpl>
71#include <ppc_defs.h>
72
73#include <asm/cache.h>
74#include <asm/mmu.h>
75
76#ifndef CONFIG_IDENT_STRING
77#define CONFIG_IDENT_STRING ""
78#endif
79
80#ifdef CFG_INIT_DCACHE_CS
81# if (CFG_INIT_DCACHE_CS == 0)
82# define PBxAP pb0ap
83# define PBxCR pb0cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -070084# if (defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR))
85# define PBxAP_VAL CFG_EBC_PB0AP
86# define PBxCR_VAL CFG_EBC_PB0CR
87# endif
wdenk0442ed82002-11-03 10:24:00 +000088# endif
89# if (CFG_INIT_DCACHE_CS == 1)
90# define PBxAP pb1ap
91# define PBxCR pb1cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -070092# if (defined(CFG_EBC_PB1AP) && defined(CFG_EBC_PB1CR))
93# define PBxAP_VAL CFG_EBC_PB1AP
94# define PBxCR_VAL CFG_EBC_PB1CR
95# endif
wdenk0442ed82002-11-03 10:24:00 +000096# endif
97# if (CFG_INIT_DCACHE_CS == 2)
98# define PBxAP pb2ap
99# define PBxCR pb2cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700100# if (defined(CFG_EBC_PB2AP) && defined(CFG_EBC_PB2CR))
101# define PBxAP_VAL CFG_EBC_PB2AP
102# define PBxCR_VAL CFG_EBC_PB2CR
103# endif
wdenk0442ed82002-11-03 10:24:00 +0000104# endif
105# if (CFG_INIT_DCACHE_CS == 3)
106# define PBxAP pb3ap
107# define PBxCR pb3cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700108# if (defined(CFG_EBC_PB3AP) && defined(CFG_EBC_PB3CR))
109# define PBxAP_VAL CFG_EBC_PB3AP
110# define PBxCR_VAL CFG_EBC_PB3CR
111# endif
wdenk0442ed82002-11-03 10:24:00 +0000112# endif
113# if (CFG_INIT_DCACHE_CS == 4)
114# define PBxAP pb4ap
115# define PBxCR pb4cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700116# if (defined(CFG_EBC_PB4AP) && defined(CFG_EBC_PB4CR))
117# define PBxAP_VAL CFG_EBC_PB4AP
118# define PBxCR_VAL CFG_EBC_PB4CR
119# endif
wdenk0442ed82002-11-03 10:24:00 +0000120# endif
121# if (CFG_INIT_DCACHE_CS == 5)
122# define PBxAP pb5ap
123# define PBxCR pb5cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700124# if (defined(CFG_EBC_PB5AP) && defined(CFG_EBC_PB5CR))
125# define PBxAP_VAL CFG_EBC_PB5AP
126# define PBxCR_VAL CFG_EBC_PB5CR
127# endif
wdenk0442ed82002-11-03 10:24:00 +0000128# endif
129# if (CFG_INIT_DCACHE_CS == 6)
130# define PBxAP pb6ap
131# define PBxCR pb6cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700132# if (defined(CFG_EBC_PB6AP) && defined(CFG_EBC_PB6CR))
133# define PBxAP_VAL CFG_EBC_PB6AP
134# define PBxCR_VAL CFG_EBC_PB6CR
135# endif
wdenk0442ed82002-11-03 10:24:00 +0000136# endif
137# if (CFG_INIT_DCACHE_CS == 7)
138# define PBxAP pb7ap
139# define PBxCR pb7cr
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700140# if (defined(CFG_EBC_PB7AP) && defined(CFG_EBC_PB7CR))
141# define PBxAP_VAL CFG_EBC_PB7AP
142# define PBxCR_VAL CFG_EBC_PB7CR
143# endif
144# endif
145# ifndef PBxAP_VAL
146# define PBxAP_VAL 0
147# endif
148# ifndef PBxCR_VAL
149# define PBxCR_VAL 0
150# endif
151/*
152 * Memory Bank x (nothingness) initialization CFG_INIT_RAM_ADDR + 64 MiB
153 * used as temporary stack pointer for the primordial stack
154 */
155# ifndef CFG_INIT_DCACHE_PBxAR
156# define CFG_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
157 EBC_BXAP_TWT_ENCODE(7) | \
158 EBC_BXAP_BCE_DISABLE | \
159 EBC_BXAP_BCT_2TRANS | \
160 EBC_BXAP_CSN_ENCODE(0) | \
161 EBC_BXAP_OEN_ENCODE(0) | \
162 EBC_BXAP_WBN_ENCODE(0) | \
163 EBC_BXAP_WBF_ENCODE(0) | \
164 EBC_BXAP_TH_ENCODE(2) | \
165 EBC_BXAP_RE_DISABLED | \
166 EBC_BXAP_SOR_NONDELAYED | \
167 EBC_BXAP_BEM_WRITEONLY | \
168 EBC_BXAP_PEN_DISABLED)
169# endif /* CFG_INIT_DCACHE_PBxAR */
170# ifndef CFG_INIT_DCACHE_PBxCR
171# define CFG_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CFG_INIT_RAM_ADDR) | \
172 EBC_BXCR_BS_64MB | \
173 EBC_BXCR_BU_RW | \
174 EBC_BXCR_BW_16BIT)
175# endif /* CFG_INIT_DCACHE_PBxCR */
176# ifndef CFG_INIT_RAM_PATTERN
177# define CFG_INIT_RAM_PATTERN 0xDEADDEAD
wdenk0442ed82002-11-03 10:24:00 +0000178# endif
179#endif /* CFG_INIT_DCACHE_CS */
180
Stefan Roese28d77d92008-01-30 14:48:28 +0100181#if (defined(CFG_INIT_RAM_DCACHE) && (CFG_INIT_RAM_END > (4 << 10)))
182#error Only 4k of init-ram is supported - please adjust CFG_INIT_RAM_END!
183#endif
184
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700185/*
186 * Unless otherwise overriden, enable two 128MB cachable instruction regions
187 * at CFG_SDRAM_BASE and another 128MB cacheable instruction region covering
188 * NOR flash at CFG_FLASH_BASE. Disable all cacheable data regions.
189 */
Stefan Roese64852d02008-06-02 14:35:44 +0200190#if !defined(CFG_FLASH_BASE)
191/* If not already defined, set it to the "last" 128MByte region */
192# define CFG_FLASH_BASE 0xf8000000
193#endif
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700194#if !defined(CFG_ICACHE_SACR_VALUE)
195# define CFG_ICACHE_SACR_VALUE \
196 (PPC_128MB_SACR_VALUE(CFG_SDRAM_BASE + ( 0 << 20)) | \
197 PPC_128MB_SACR_VALUE(CFG_SDRAM_BASE + (128 << 20)) | \
198 PPC_128MB_SACR_VALUE(CFG_FLASH_BASE))
199#endif /* !defined(CFG_ICACHE_SACR_VALUE) */
200
201#if !defined(CFG_DCACHE_SACR_VALUE)
202# define CFG_DCACHE_SACR_VALUE \
203 (0x00000000)
204#endif /* !defined(CFG_DCACHE_SACR_VALUE) */
205
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200206#define function_prolog(func_name) .text; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200207 .align 2; \
208 .globl func_name; \
209 func_name:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200210#define function_epilog(func_name) .type func_name,@function; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200211 .size func_name,.-func_name
212
wdenk0442ed82002-11-03 10:24:00 +0000213/* We don't want the MMU yet.
214*/
215#undef MSR_KERNEL
216#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
217
218
219 .extern ext_bus_cntlr_init
Stefan Roese887e2ec2006-09-07 11:51:23 +0200220#ifdef CONFIG_NAND_U_BOOT
221 .extern reconfig_tlb0
222#endif
wdenk0442ed82002-11-03 10:24:00 +0000223
224/*
225 * Set up GOT: Global Offset Table
226 *
227 * Use r14 to access the GOT
228 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200229#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000230 START_GOT
231 GOT_ENTRY(_GOT2_TABLE_)
232 GOT_ENTRY(_FIXUP_TABLE_)
233
234 GOT_ENTRY(_start)
235 GOT_ENTRY(_start_of_vectors)
236 GOT_ENTRY(_end_of_vectors)
237 GOT_ENTRY(transfer_to_handler)
238
wdenk3b57fe02003-05-30 12:48:29 +0000239 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000240 GOT_ENTRY(_end)
wdenk5d232d02003-05-22 22:52:13 +0000241 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000242 END_GOT
Stefan Roese887e2ec2006-09-07 11:51:23 +0200243#endif /* CONFIG_NAND_SPL */
244
245#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
246 /*
247 * NAND U-Boot image is started from offset 0
248 */
249 .text
Stefan Roesec440bfe2007-06-06 11:42:13 +0200250#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200251 bl reconfig_tlb0
Stefan Roesec440bfe2007-06-06 11:42:13 +0200252#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200253 GET_GOT
254 bl cpu_init_f /* run low-level CPU init code (from Flash) */
255 bl board_init_f
256#endif
wdenk0442ed82002-11-03 10:24:00 +0000257
258/*
259 * 440 Startup -- on reset only the top 4k of the effective
260 * address space is mapped in by an entry in the instruction
261 * and data shadow TLB. The .bootpg section is located in the
262 * top 4k & does only what's necessary to map in the the rest
263 * of the boot rom. Once the boot rom is mapped in we can
264 * proceed with normal startup.
265 *
266 * NOTE: CS0 only covers the top 2MB of the effective address
267 * space after reset.
268 */
269
270#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200271#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000272 .section .bootpg,"ax"
Stefan Roese887e2ec2006-09-07 11:51:23 +0200273#endif
wdenk0442ed82002-11-03 10:24:00 +0000274 .globl _start_440
275
276/**************************************************************************/
277_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200278 /*--------------------------------------------------------------------+
279 | 440EPX BUP Change - Hardware team request
280 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200281#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
282 sync
283 nop
284 nop
285#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200286 /*----------------------------------------------------------------+
287 | Core bug fix. Clear the esr
288 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200289 li r0,0
Wolfgang Denkb87dfd22006-07-19 13:50:38 +0200290 mtspr esr,r0
wdenk0442ed82002-11-03 10:24:00 +0000291 /*----------------------------------------------------------------*/
292 /* Clear and set up some registers. */
293 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200294 iccci r0,r0 /* NOTE: operands not used for 440 */
295 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000296 sync
297 li r0,0
298 mtspr srr0,r0
299 mtspr srr1,r0
300 mtspr csrr0,r0
301 mtspr csrr1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200302 /* NOTE: 440GX adds machine check status regs */
303#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Wolfgang Denkf901a832005-08-06 01:42:58 +0200304 mtspr mcsrr0,r0
305 mtspr mcsrr1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200306 mfspr r1,mcsr
Wolfgang Denkf901a832005-08-06 01:42:58 +0200307 mtspr mcsr,r1
wdenkba56f622004-02-06 23:19:44 +0000308#endif
Stefan Roese20532832006-11-22 13:20:50 +0100309
310 /*----------------------------------------------------------------*/
311 /* CCR0 init */
312 /*----------------------------------------------------------------*/
313 /* Disable store gathering & broadcast, guarantee inst/data
314 * cache block touch, force load/store alignment
315 * (see errata 1.12: 440_33)
316 */
317 lis r1,0x0030 /* store gathering & broadcast disable */
318 ori r1,r1,0x6000 /* cache touch */
319 mtspr ccr0,r1
320
wdenk0442ed82002-11-03 10:24:00 +0000321 /*----------------------------------------------------------------*/
322 /* Initialize debug */
323 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200324 mfspr r1,dbcr0
325 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
326 bne skip_debug_init /* if set, don't clear debug register */
wdenk0442ed82002-11-03 10:24:00 +0000327 mtspr dbcr0,r0
328 mtspr dbcr1,r0
329 mtspr dbcr2,r0
330 mtspr iac1,r0
331 mtspr iac2,r0
332 mtspr iac3,r0
333 mtspr dac1,r0
334 mtspr dac2,r0
335 mtspr dvc1,r0
336 mtspr dvc2,r0
337
338 mfspr r1,dbsr
339 mtspr dbsr,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200340skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000341
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200342#if defined (CONFIG_440SPE)
343 /*----------------------------------------------------------------+
344 | Initialize Core Configuration Reg1.
345 | a. ICDPEI: Record even parity. Normal operation.
346 | b. ICTPEI: Record even parity. Normal operation.
347 | c. DCTPEI: Record even parity. Normal operation.
348 | d. DCDPEI: Record even parity. Normal operation.
349 | e. DCUPEI: Record even parity. Normal operation.
350 | f. DCMPEI: Record even parity. Normal operation.
351 | g. FCOM: Normal operation
352 | h. MMUPEI: Record even parity. Normal operation.
353 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200354 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200355 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200356 li r0,0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200357 mtspr ccr1, r0
358
359 /*----------------------------------------------------------------+
360 | Reset the timebase.
361 | The previous write to CCR1 sets the timebase source.
362 +-----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200363 mtspr tbl, r0
364 mtspr tbu, r0
365#endif
366
wdenk0442ed82002-11-03 10:24:00 +0000367 /*----------------------------------------------------------------*/
368 /* Setup interrupt vectors */
369 /*----------------------------------------------------------------*/
370 mtspr ivpr,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200371 li r1,0x0100
wdenk0442ed82002-11-03 10:24:00 +0000372 mtspr ivor0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200373 li r1,0x0200
wdenk0442ed82002-11-03 10:24:00 +0000374 mtspr ivor1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200375 li r1,0x0300
wdenk0442ed82002-11-03 10:24:00 +0000376 mtspr ivor2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200377 li r1,0x0400
wdenk0442ed82002-11-03 10:24:00 +0000378 mtspr ivor3,r1 /* Instruction storage */
379 li r1,0x0500
380 mtspr ivor4,r1 /* External interrupt */
381 li r1,0x0600
382 mtspr ivor5,r1 /* Alignment */
383 li r1,0x0700
384 mtspr ivor6,r1 /* Program check */
385 li r1,0x0800
386 mtspr ivor7,r1 /* Floating point unavailable */
387 li r1,0x0c00
388 mtspr ivor8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200389 li r1,0x0a00
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200390 mtspr ivor9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200391 li r1,0x0900
392 mtspr ivor10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000393 li r1,0x1300
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200394 mtspr ivor13,r1 /* Data TLB error */
395 li r1,0x1400
wdenk0442ed82002-11-03 10:24:00 +0000396 mtspr ivor14,r1 /* Instr TLB error */
397 li r1,0x2000
398 mtspr ivor15,r1 /* Debug */
399
400 /*----------------------------------------------------------------*/
401 /* Configure cache regions */
402 /*----------------------------------------------------------------*/
403 mtspr inv0,r0
404 mtspr inv1,r0
405 mtspr inv2,r0
406 mtspr inv3,r0
407 mtspr dnv0,r0
408 mtspr dnv1,r0
409 mtspr dnv2,r0
410 mtspr dnv3,r0
411 mtspr itv0,r0
412 mtspr itv1,r0
413 mtspr itv2,r0
414 mtspr itv3,r0
415 mtspr dtv0,r0
416 mtspr dtv1,r0
417 mtspr dtv2,r0
418 mtspr dtv3,r0
419
420 /*----------------------------------------------------------------*/
421 /* Cache victim limits */
422 /*----------------------------------------------------------------*/
423 /* floors 0, ceiling max to use the entire cache -- nothing locked
424 */
425 lis r1,0x0001
426 ori r1,r1,0xf800
427 mtspr ivlim,r1
428 mtspr dvlim,r1
429
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200430 /*----------------------------------------------------------------+
431 |Initialize MMUCR[STID] = 0.
432 +-----------------------------------------------------------------*/
433 mfspr r0,mmucr
434 addis r1,0,0xFFFF
435 ori r1,r1,0xFF00
436 and r0,r0,r1
437 mtspr mmucr,r0
438
wdenk0442ed82002-11-03 10:24:00 +0000439 /*----------------------------------------------------------------*/
440 /* Clear all TLB entries -- TID = 0, TS = 0 */
441 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200442 addis r0,0,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000443 li r1,0x003f /* 64 TLB entries */
444 mtctr r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200445rsttlb: tlbwe r0,r1,0x0000 /* Invalidate all entries (V=0)*/
446 tlbwe r0,r1,0x0001
447 tlbwe r0,r1,0x0002
wdenk0442ed82002-11-03 10:24:00 +0000448 subi r1,r1,0x0001
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200449 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000450
451 /*----------------------------------------------------------------*/
452 /* TLB entry setup -- step thru tlbtab */
453 /*----------------------------------------------------------------*/
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200454#if defined(CONFIG_440SPE)
455 /*----------------------------------------------------------------*/
456 /* We have different TLB tables for revA and rev B of 440SPe */
457 /*----------------------------------------------------------------*/
458 mfspr r1, PVR
459 lis r0,0x5342
460 ori r0,r0,0x1891
461 cmpw r7,r1,r0
462 bne r7,..revA
463 bl tlbtabB
464 b ..goon
465..revA:
466 bl tlbtabA
467..goon:
468#else
wdenk0442ed82002-11-03 10:24:00 +0000469 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200470#endif
wdenk0442ed82002-11-03 10:24:00 +0000471 mr r5,r0
472 li r1,0x003f /* 64 TLB entries max */
473 mtctr r1
474 li r4,0 /* TLB # */
475
476 addi r5,r5,-4
4771: lwzu r0,4(r5)
478 cmpwi r0,0
479 beq 2f /* 0 marks end */
480 lwzu r1,4(r5)
481 lwzu r2,4(r5)
482 tlbwe r0,r4,0 /* TLB Word 0 */
483 tlbwe r1,r4,1 /* TLB Word 1 */
484 tlbwe r2,r4,2 /* TLB Word 2 */
485 addi r4,r4,1 /* Next TLB */
486 bdnz 1b
487
488 /*----------------------------------------------------------------*/
489 /* Continue from 'normal' start */
490 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02004912:
Stefan Roese887e2ec2006-09-07 11:51:23 +0200492 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000493 b _start
494
4953: li r0,0
496 mtspr srr1,r0 /* Keep things disabled for now */
497 mflr r1
498 mtspr srr0,r1
499 rfi
stroeseb867d702003-05-23 11:18:02 +0000500#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000501
502/*
503 * r3 - 1st arg to board_init(): IMMP pointer
504 * r4 - 2nd arg to board_init(): boot flag
505 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200506#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000507 .text
508 .long 0x27051956 /* U-Boot Magic Number */
509 .globl version_string
510version_string:
511 .ascii U_BOOT_VERSION
512 .ascii " (", __DATE__, " - ", __TIME__, ")"
513 .ascii CONFIG_IDENT_STRING, "\0"
514
wdenk0442ed82002-11-03 10:24:00 +0000515 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200516 .globl _start_of_vectors
517_start_of_vectors:
518
519/* Critical input. */
520 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
521
522#ifdef CONFIG_440
523/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200524 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200525#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200526 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200527#endif /* CONFIG_440 */
528
529/* Data Storage exception. */
530 STD_EXCEPTION(0x300, DataStorage, UnknownException)
531
532/* Instruction Storage exception. */
533 STD_EXCEPTION(0x400, InstStorage, UnknownException)
534
535/* External Interrupt exception. */
536 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
537
538/* Alignment exception. */
539 . = 0x600
540Alignment:
541 EXCEPTION_PROLOG(SRR0, SRR1)
542 mfspr r4,DAR
543 stw r4,_DAR(r21)
544 mfspr r5,DSISR
545 stw r5,_DSISR(r21)
546 addi r3,r1,STACK_FRAME_OVERHEAD
547 li r20,MSR_KERNEL
548 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
549 lwz r6,GOT(transfer_to_handler)
550 mtlr r6
551 blrl
552.L_Alignment:
553 .long AlignmentException - _start + _START_OFFSET
554 .long int_return - _start + _START_OFFSET
555
556/* Program check exception */
557 . = 0x700
558ProgramCheck:
559 EXCEPTION_PROLOG(SRR0, SRR1)
560 addi r3,r1,STACK_FRAME_OVERHEAD
561 li r20,MSR_KERNEL
562 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
563 lwz r6,GOT(transfer_to_handler)
564 mtlr r6
565 blrl
566.L_ProgramCheck:
567 .long ProgramCheckException - _start + _START_OFFSET
568 .long int_return - _start + _START_OFFSET
569
570#ifdef CONFIG_440
571 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
572 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
573 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200574#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200575 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
576
577#ifdef CONFIG_440
578 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
579 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
580#else
581 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
582 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
583 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
584#endif
585 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
586
587 .globl _end_of_vectors
588_end_of_vectors:
589 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200590#endif
wdenk0442ed82002-11-03 10:24:00 +0000591 .globl _start
592_start:
593
594/*****************************************************************************/
595#if defined(CONFIG_440)
596
597 /*----------------------------------------------------------------*/
598 /* Clear and set up some registers. */
599 /*----------------------------------------------------------------*/
600 li r0,0x0000
601 lis r1,0xffff
602 mtspr dec,r0 /* prevent dec exceptions */
603 mtspr tbl,r0 /* prevent fit & wdt exceptions */
604 mtspr tbu,r0
605 mtspr tsr,r1 /* clear all timer exception status */
606 mtspr tcr,r0 /* disable all */
607 mtspr esr,r0 /* clear exception syndrome register */
608 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000609
610 /*----------------------------------------------------------------*/
611 /* Debug setup -- some (not very good) ice's need an event*/
612 /* to establish control :-( Define CFG_INIT_DBCR to the dbsr */
613 /* value you need in this case 0x8cff 0000 should do the trick */
614 /*----------------------------------------------------------------*/
615#if defined(CFG_INIT_DBCR)
616 lis r1,0xffff
617 ori r1,r1,0xffff
618 mtspr dbsr,r1 /* Clear all status bits */
619 lis r0,CFG_INIT_DBCR@h
620 ori r0,r0,CFG_INIT_DBCR@l
621 mtspr dbcr0,r0
622 isync
623#endif
624
625 /*----------------------------------------------------------------*/
626 /* Setup the internal SRAM */
627 /*----------------------------------------------------------------*/
628 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200629
630#ifdef CFG_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200631 /* Clear Dcache to use as RAM */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200632 addis r3,r0,CFG_INIT_RAM_ADDR@h
633 ori r3,r3,CFG_INIT_RAM_ADDR@l
634 addis r4,r0,CFG_INIT_RAM_END@h
635 ori r4,r4,CFG_INIT_RAM_END@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200636 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200637 rlwinm r5,r4,27,5,31
638 beq ..d_ran
639 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200640..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200641 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200642..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200643 dcbz r0,r3
644 addi r3,r3,32
645 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100646
647 /*
648 * Lock the init-ram/stack in d-cache, so that other regions
649 * may use d-cache as well
650 * Note, that this current implementation locks exactly 4k
651 * of d-cache, so please make sure that you don't define a
652 * bigger init-ram area. Take a look at the lwmon5 440EPx
653 * implementation as a reference.
654 */
655 msync
656 isync
657 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
658 lis r1,0x0201
659 ori r1,r1,0xf808
660 mtspr dvlim,r1
661 lis r1,0x0808
662 ori r1,r1,0x0808
663 mtspr dnv0,r1
664 mtspr dnv1,r1
665 mtspr dnv2,r1
666 mtspr dnv3,r1
667 mtspr dtv0,r1
668 mtspr dtv1,r1
669 mtspr dtv2,r1
670 mtspr dtv3,r1
671 msync
672 isync
Stefan Roese887e2ec2006-09-07 11:51:23 +0200673#endif /* CFG_INIT_RAM_DCACHE */
674
675 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
676#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
677 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100678#if defined(CONFIG_440GX) || \
679 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
680 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Wolfgang Denkf901a832005-08-06 01:42:58 +0200681 mtdcr l2_cache_cfg,r0 /* Ensure L2 Cache is off */
wdenkba56f622004-02-06 23:19:44 +0000682#endif
wdenk0442ed82002-11-03 10:24:00 +0000683
Stefan Roese887e2ec2006-09-07 11:51:23 +0200684 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000685 ori r2,r2,0xffff
686 mfdcr r1,isram0_dpc
687 and r1,r1,r2 /* Disable parity check */
688 mtdcr isram0_dpc,r1
689 mfdcr r1,isram0_pmeg
Stefan Roese887e2ec2006-09-07 11:51:23 +0200690 and r1,r1,r2 /* Disable pwr mgmt */
wdenk0442ed82002-11-03 10:24:00 +0000691 mtdcr isram0_pmeg,r1
692
693 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100694#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000695 ori r1,r1,0x0980 /* first 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200696 mtdcr isram0_sb0cr,r1
wdenkba56f622004-02-06 23:19:44 +0000697 lis r1,0x8001
698 ori r1,r1,0x0980 /* second 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200699 mtdcr isram0_sb1cr,r1
wdenkba56f622004-02-06 23:19:44 +0000700 lis r1, 0x8002
701 ori r1,r1, 0x0980 /* third 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200702 mtdcr isram0_sb2cr,r1
wdenkba56f622004-02-06 23:19:44 +0000703 lis r1, 0x8003
704 ori r1,r1, 0x0980 /* fourth 64k */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200705 mtdcr isram0_sb3cr,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200706#elif defined(CONFIG_440SPE)
707 lis r1,0x0000 /* BAS = 0000_0000 */
708 ori r1,r1,0x0984 /* first 64k */
709 mtdcr isram0_sb0cr,r1
710 lis r1,0x0001
711 ori r1,r1,0x0984 /* second 64k */
712 mtdcr isram0_sb1cr,r1
713 lis r1, 0x0002
714 ori r1,r1, 0x0984 /* third 64k */
715 mtdcr isram0_sb2cr,r1
716 lis r1, 0x0003
717 ori r1,r1, 0x0984 /* fourth 64k */
718 mtdcr isram0_sb3cr,r1
Stefan Roese2801b2d2008-03-11 15:05:50 +0100719#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
720 lis r1,0x4000 /* BAS = 8000_0000 */
721 ori r1,r1,0x4580 /* 16k */
722 mtdcr isram0_sb0cr,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200723#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000724 ori r1,r1,0x0380 /* 8k rw */
725 mtdcr isram0_sb0cr,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200726 mtdcr isram0_sb1cr,r0 /* Disable bank 1 */
wdenkba56f622004-02-06 23:19:44 +0000727#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200728#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000729
730 /*----------------------------------------------------------------*/
731 /* Setup the stack in internal SRAM */
732 /*----------------------------------------------------------------*/
733 lis r1,CFG_INIT_RAM_ADDR@h
734 ori r1,r1,CFG_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000735 li r0,0
736 stwu r0,-4(r1)
737 stwu r0,-4(r1) /* Terminate call chain */
738
739 stwu r1,-8(r1) /* Save back chain and move SP */
740 lis r0,RESET_VECTOR@h /* Address of reset vector */
741 ori r0,r0, RESET_VECTOR@l
742 stwu r1,-8(r1) /* Save back chain and move SP */
743 stw r0,+12(r1) /* Save return addr (underflow vect) */
744
Stefan Roese887e2ec2006-09-07 11:51:23 +0200745#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +0200746 bl nand_boot_common /* will not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200747#else
wdenk0442ed82002-11-03 10:24:00 +0000748 GET_GOT
Stefan Roese5568e612005-11-22 13:20:42 +0100749
750 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000751 bl board_init_f
Stefan Roese887e2ec2006-09-07 11:51:23 +0200752#endif
wdenk0442ed82002-11-03 10:24:00 +0000753
754#endif /* CONFIG_440 */
755
756/*****************************************************************************/
757#ifdef CONFIG_IOP480
758 /*----------------------------------------------------------------------- */
759 /* Set up some machine state registers. */
760 /*----------------------------------------------------------------------- */
761 addi r0,r0,0x0000 /* initialize r0 to zero */
762 mtspr esr,r0 /* clear Exception Syndrome Reg */
763 mttcr r0 /* timer control register */
764 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000765 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
766 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
767 mtdbsr r4 /* clear/reset the dbsr */
768 mtexisr r4 /* clear all pending interrupts */
769 addis r4,r0,0x8000
770 mtexier r4 /* enable critical exceptions */
771 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
772 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
773 mtiocr r4 /* since bit not used) & DRC to latch */
774 /* data bus on rising edge of CAS */
775 /*----------------------------------------------------------------------- */
776 /* Clear XER. */
777 /*----------------------------------------------------------------------- */
778 mtxer r0
779 /*----------------------------------------------------------------------- */
780 /* Invalidate i-cache and d-cache TAG arrays. */
781 /*----------------------------------------------------------------------- */
782 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
783 addi r4,0,1024 /* 1/4 of I-cache */
784..cloop:
785 iccci 0,r3
786 iccci r4,r3
787 dccci 0,r3
788 addic. r3,r3,-16 /* move back one cache line */
789 bne ..cloop /* loop back to do rest until r3 = 0 */
790
791 /* */
792 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
793 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
794 /* */
795
796 /* first copy IOP480 register base address into r3 */
797 addis r3,0,0x5000 /* IOP480 register base address hi */
798/* ori r3,r3,0x0000 / IOP480 register base address lo */
799
800#ifdef CONFIG_ADCIOP
801 /* use r4 as the working variable */
802 /* turn on CS3 (LOCCTL.7) */
803 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
804 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
805 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
806#endif
807
808#ifdef CONFIG_DASA_SIM
809 /* use r4 as the working variable */
810 /* turn on MA17 (LOCCTL.7) */
811 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
812 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
813 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
814#endif
815
816 /* turn on MA16..13 (LCS0BRD.12 = 0) */
817 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
818 andi. r4,r4,0xefff /* make bit 12 = 0 */
819 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
820
821 /* make sure above stores all comlete before going on */
822 sync
823
824 /* last thing, set local init status done bit (DEVINIT.31) */
825 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
826 oris r4,r4,0x8000 /* make bit 31 = 1 */
827 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
828
829 /* clear all pending interrupts and disable all interrupts */
830 li r4,-1 /* set p1 to 0xffffffff */
831 stw r4,0x1b0(r3) /* clear all pending interrupts */
832 stw r4,0x1b8(r3) /* clear all pending interrupts */
833 li r4,0 /* set r4 to 0 */
834 stw r4,0x1b4(r3) /* disable all interrupts */
835 stw r4,0x1bc(r3) /* disable all interrupts */
836
837 /* make sure above stores all comlete before going on */
838 sync
839
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700840 /* Set-up icache cacheability. */
841 lis r1, CFG_ICACHE_SACR_VALUE@h
842 ori r1, r1, CFG_ICACHE_SACR_VALUE@l
843 mticcr r1
844 isync
wdenk0442ed82002-11-03 10:24:00 +0000845
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700846 /* Set-up dcache cacheability. */
847 lis r1, CFG_DCACHE_SACR_VALUE@h
848 ori r1, r1, CFG_DCACHE_SACR_VALUE@l
849 mtdccr r1
wdenk0442ed82002-11-03 10:24:00 +0000850
851 addis r1,r0,CFG_INIT_RAM_ADDR@h
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200852 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack to SDRAM */
wdenk0442ed82002-11-03 10:24:00 +0000853 li r0, 0 /* Make room for stack frame header and */
854 stwu r0, -4(r1) /* clear final stack frame so that */
855 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
856
857 GET_GOT /* initialize GOT access */
858
859 bl board_init_f /* run first part of init code (from Flash) */
860
861#endif /* CONFIG_IOP480 */
862
863/*****************************************************************************/
Stefan Roesee01bd212007-03-21 13:38:59 +0100864#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
865 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200866 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000867 /*----------------------------------------------------------------------- */
868 /* Clear and set up some registers. */
869 /*----------------------------------------------------------------------- */
870 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200871#if !defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000872 mtspr sgr,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200873#else
874 /*
875 * On 405EX, completely clearing the SGR leads to PPC hangup
876 * upon PCIe configuration access. The PCIe memory regions
877 * need to be guarded!
878 */
879 lis r3,0x0000
880 ori r3,r3,0x7FFC
881 mtspr sgr,r3
882#endif
wdenk0442ed82002-11-03 10:24:00 +0000883 mtspr dcwr,r4
884 mtesr r4 /* clear Exception Syndrome Reg */
885 mttcr r4 /* clear Timer Control Reg */
886 mtxer r4 /* clear Fixed-Point Exception Reg */
887 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000888 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
889 /* dbsr is cleared by setting bits to 1) */
890 mtdbsr r4 /* clear/reset the dbsr */
891
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700892 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000893 bl invalidate_icache
894 bl invalidate_dcache
895
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700896 /* Set-up icache cacheability. */
897 lis r4, CFG_ICACHE_SACR_VALUE@h
898 ori r4, r4, CFG_ICACHE_SACR_VALUE@l
899 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000900 isync
901
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700902 /* Set-up dcache cacheability. */
903 lis r4, CFG_DCACHE_SACR_VALUE@h
904 ori r4, r4, CFG_DCACHE_SACR_VALUE@l
905 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000906
Stefan Roese64852d02008-06-02 14:35:44 +0200907#if !(defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR))
wdenk0442ed82002-11-03 10:24:00 +0000908 /*----------------------------------------------------------------------- */
909 /* Tune the speed and size for flash CS0 */
910 /*----------------------------------------------------------------------- */
911 bl ext_bus_cntlr_init
912#endif
Stefan Roese64852d02008-06-02 14:35:44 +0200913
Stefan Roesedbbd1252007-10-05 17:10:59 +0200914#if !(defined(CFG_INIT_DCACHE_CS) || defined(CFG_TEMP_STACK_OCM))
915 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700916 * For boards that don't have OCM and can't use the data cache
917 * for their primordial stack, setup stack here directly after the
918 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roesedbbd1252007-10-05 17:10:59 +0200919 */
920 lis r1, CFG_INIT_RAM_ADDR@h
921 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack in SDRAM */
922
923 li r0, 0 /* Make room for stack frame header and */
924 stwu r0, -4(r1) /* clear final stack frame so that */
925 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
926 /*
927 * Set up a dummy frame to store reset vector as return address.
928 * this causes stack underflow to reset board.
929 */
930 stwu r1, -8(r1) /* Save back chain and move SP */
931 lis r0, RESET_VECTOR@h /* Address of reset vector */
932 ori r0, r0, RESET_VECTOR@l
933 stwu r1, -8(r1) /* Save back chain and move SP */
934 stw r0, +12(r1) /* Save return addr (underflow vect) */
935#endif /* !(CFG_INIT_DCACHE_CS || !CFG_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000936
stroeseb867d702003-05-23 11:18:02 +0000937#if defined(CONFIG_405EP)
938 /*----------------------------------------------------------------------- */
939 /* DMA Status, clear to come up clean */
940 /*----------------------------------------------------------------------- */
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200941 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200942 ori r3,r3, 0xFFFF
943 mtdcr dmasr, r3
stroeseb867d702003-05-23 11:18:02 +0000944
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200945 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +0000946#endif /* CONFIG_405EP */
947
wdenk0442ed82002-11-03 10:24:00 +0000948#if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +0100949#if defined(CONFIG_405EZ)
950 /********************************************************************
951 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
952 *******************************************************************/
953 /*
954 * We can map the OCM on the PLB3, so map it at
955 * CFG_OCM_DATA_ADDR + 0x8000
956 */
957 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
958 ori r3,r3,CFG_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200959 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesee01bd212007-03-21 13:38:59 +0100960 mtdcr ocmplb3cr1,r3 /* Set PLB Access */
961 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
962 mtdcr ocmplb3cr2,r3 /* Set PLB Access */
963 isync
964
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200965 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roesee01bd212007-03-21 13:38:59 +0100966 ori r3,r3,CFG_OCM_DATA_ADDR@l
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200967 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
968 mtdcr ocmdscr1, r3 /* Set Data Side */
969 mtdcr ocmiscr1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +0100970 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200971 mtdcr ocmdscr2, r3 /* Set Data Side */
972 mtdcr ocmiscr2, r3 /* Set Instruction Side */
973 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed7568942007-05-24 09:49:00 +0200974 mtdcr ocmdsisdpc,r3
Stefan Roesee01bd212007-03-21 13:38:59 +0100975
976 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +0100977#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000978 /********************************************************************
979 * Setup OCM - On Chip Memory
980 *******************************************************************/
981 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +0000982 lis r0, 0x7FFF
983 ori r0, r0, 0xFFFF
Wolfgang Denkf901a832005-08-06 01:42:58 +0200984 mfdcr r3, ocmiscntl /* get instr-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +0100985 mfdcr r4, ocmdscntl /* get data-side IRAM config */
986 and r3, r3, r0 /* disable data-side IRAM */
987 and r4, r4, r0 /* disable data-side IRAM */
988 mtdcr ocmiscntl, r3 /* set instr-side IRAM config */
989 mtdcr ocmdscntl, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +0000990 isync
wdenk0442ed82002-11-03 10:24:00 +0000991
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200992 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roese3cb86f32007-03-24 15:45:34 +0100993 ori r3,r3,CFG_OCM_DATA_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +0000994 mtdcr ocmdsarc, r3
995 addis r4, 0, 0xC000 /* OCM data area enabled */
996 mtdcr ocmdscntl, r4
wdenk8bde7f72003-06-27 21:31:46 +0000997 isync
Stefan Roesee01bd212007-03-21 13:38:59 +0100998#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000999#endif
1000
1001 /*----------------------------------------------------------------------- */
1002 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1003 /*----------------------------------------------------------------------- */
1004#ifdef CFG_INIT_DCACHE_CS
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001005 li r4, PBxAP
1006 mtdcr ebccfga, r4
1007 lis r4, CFG_INIT_DCACHE_PBxAR@h
1008 ori r4, r4, CFG_INIT_DCACHE_PBxAR@l
1009 mtdcr ebccfgd, r4
wdenk0442ed82002-11-03 10:24:00 +00001010
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001011 addi r4, 0, PBxCR
1012 mtdcr ebccfga, r4
1013 lis r4, CFG_INIT_DCACHE_PBxCR@h
1014 ori r4, r4, CFG_INIT_DCACHE_PBxCR@l
1015 mtdcr ebccfgd, r4
wdenk0442ed82002-11-03 10:24:00 +00001016
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001017 /*
1018 * Enable the data cache for the 128MB storage access control region
1019 * at CFG_INIT_RAM_ADDR.
1020 */
1021 mfdccr r4
1022 oris r4, r4, PPC_128MB_SACR_VALUE(CFG_INIT_RAM_ADDR)@h
1023 ori r4, r4, PPC_128MB_SACR_VALUE(CFG_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +00001024 mtdccr r4
1025
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001026 /*
1027 * Preallocate data cache lines to be used to avoid a subsequent
1028 * cache miss and an ensuing machine check exception when exceptions
1029 * are enabled.
1030 */
1031 li r0, 0
wdenk0442ed82002-11-03 10:24:00 +00001032
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001033 lis r3, CFG_INIT_RAM_ADDR@h
1034 ori r3, r3, CFG_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001035
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001036 lis r4, CFG_INIT_RAM_END@h
1037 ori r4, r4, CFG_INIT_RAM_END@l
1038
1039 /*
1040 * Convert the size, in bytes, to the number of cache lines/blocks
1041 * to preallocate.
1042 */
1043 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1044 srwi r5, r4, L1_CACHE_SHIFT
1045 beq ..load_counter
1046 addi r5, r5, 0x0001
1047..load_counter:
1048 mtctr r5
1049
1050 /* Preallocate the computed number of cache blocks. */
1051..alloc_dcache_block:
1052 dcba r0, r3
1053 addi r3, r3, L1_CACHE_BYTES
1054 bdnz ..alloc_dcache_block
1055 sync
1056
1057 /*
1058 * Load the initial stack pointer and data area and convert the size,
1059 * in bytes, to the number of words to initialize to a known value.
1060 */
1061 lis r1, CFG_INIT_RAM_ADDR@h
1062 ori r1, r1, CFG_INIT_SP_OFFSET@l
1063
1064 lis r4, (CFG_INIT_RAM_END >> 2)@h
1065 ori r4, r4, (CFG_INIT_RAM_END >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001066 mtctr r4
1067
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001068 lis r2, CFG_INIT_RAM_ADDR@h
1069 ori r2, r2, CFG_INIT_RAM_END@l
wdenk0442ed82002-11-03 10:24:00 +00001070
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001071 lis r4, CFG_INIT_RAM_PATTERN@h
1072 ori r4, r4, CFG_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001073
1074..stackloop:
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001075 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001076 bdnz ..stackloop
1077
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001078 /*
1079 * Make room for stack frame header and clear final stack frame so
1080 * that stack backtraces terminate cleanly.
1081 */
1082 stwu r0, -4(r1)
1083 stwu r0, -4(r1)
1084
wdenk0442ed82002-11-03 10:24:00 +00001085 /*
1086 * Set up a dummy frame to store reset vector as return address.
1087 * this causes stack underflow to reset board.
1088 */
1089 stwu r1, -8(r1) /* Save back chain and move SP */
1090 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1091 ori r0, r0, RESET_VECTOR@l
1092 stwu r1, -8(r1) /* Save back chain and move SP */
1093 stw r0, +12(r1) /* Save return addr (underflow vect) */
1094
1095#elif defined(CFG_TEMP_STACK_OCM) && \
1096 (defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE))
1097 /*
1098 * Stack in OCM.
1099 */
1100
1101 /* Set up Stack at top of OCM */
1102 lis r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@h
1103 ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@l
1104
1105 /* Set up a zeroized stack frame so that backtrace works right */
1106 li r0, 0
1107 stwu r0, -4(r1)
1108 stwu r0, -4(r1)
1109
1110 /*
1111 * Set up a dummy frame to store reset vector as return address.
1112 * this causes stack underflow to reset board.
1113 */
1114 stwu r1, -8(r1) /* Save back chain and move SP */
1115 lis r0, RESET_VECTOR@h /* Address of reset vector */
1116 ori r0, r0, RESET_VECTOR@l
1117 stwu r1, -8(r1) /* Save back chain and move SP */
1118 stw r0, +12(r1) /* Save return addr (underflow vect) */
1119#endif /* CFG_INIT_DCACHE_CS */
1120
Stefan Roesec440bfe2007-06-06 11:42:13 +02001121#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +02001122 bl nand_boot_common /* will not return */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001123#else
wdenk0442ed82002-11-03 10:24:00 +00001124 GET_GOT /* initialize GOT access */
1125
Wolfgang Denkf901a832005-08-06 01:42:58 +02001126 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001127
1128 /* NEVER RETURNS! */
1129 bl board_init_f /* run first part of init code (from Flash) */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001130#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001131
wdenk12f34242003-09-02 22:48:03 +00001132#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1133 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001134
1135
Stefan Roese887e2ec2006-09-07 11:51:23 +02001136#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001137/*
1138 * This code finishes saving the registers to the exception frame
1139 * and jumps to the appropriate handler for the exception.
1140 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1141 */
1142 .globl transfer_to_handler
1143transfer_to_handler:
1144 stw r22,_NIP(r21)
1145 lis r22,MSR_POW@h
1146 andc r23,r23,r22
1147 stw r23,_MSR(r21)
1148 SAVE_GPR(7, r21)
1149 SAVE_4GPRS(8, r21)
1150 SAVE_8GPRS(12, r21)
1151 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001152 mflr r23
1153 andi. r24,r23,0x3f00 /* get vector offset */
1154 stw r24,TRAP(r21)
1155 li r22,0
1156 stw r22,RESULT(r21)
1157 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001158 lwz r24,0(r23) /* virtual address of handler */
1159 lwz r23,4(r23) /* where to go when done */
1160 mtspr SRR0,r24
1161 mtspr SRR1,r20
1162 mtlr r23
1163 SYNC
1164 rfi /* jump to handler, enable MMU */
1165
1166int_return:
1167 mfmsr r28 /* Disable interrupts */
1168 li r4,0
1169 ori r4,r4,MSR_EE
1170 andc r28,r28,r4
1171 SYNC /* Some chip revs need this... */
1172 mtmsr r28
1173 SYNC
1174 lwz r2,_CTR(r1)
1175 lwz r0,_LINK(r1)
1176 mtctr r2
1177 mtlr r0
1178 lwz r2,_XER(r1)
1179 lwz r0,_CCR(r1)
1180 mtspr XER,r2
1181 mtcrf 0xFF,r0
1182 REST_10GPRS(3, r1)
1183 REST_10GPRS(13, r1)
1184 REST_8GPRS(23, r1)
1185 REST_GPR(31, r1)
1186 lwz r2,_NIP(r1) /* Restore environment */
1187 lwz r0,_MSR(r1)
1188 mtspr SRR0,r2
1189 mtspr SRR1,r0
1190 lwz r0,GPR0(r1)
1191 lwz r2,GPR2(r1)
1192 lwz r1,GPR1(r1)
1193 SYNC
1194 rfi
1195
1196crit_return:
1197 mfmsr r28 /* Disable interrupts */
1198 li r4,0
1199 ori r4,r4,MSR_EE
1200 andc r28,r28,r4
1201 SYNC /* Some chip revs need this... */
1202 mtmsr r28
1203 SYNC
1204 lwz r2,_CTR(r1)
1205 lwz r0,_LINK(r1)
1206 mtctr r2
1207 mtlr r0
1208 lwz r2,_XER(r1)
1209 lwz r0,_CCR(r1)
1210 mtspr XER,r2
1211 mtcrf 0xFF,r0
1212 REST_10GPRS(3, r1)
1213 REST_10GPRS(13, r1)
1214 REST_8GPRS(23, r1)
1215 REST_GPR(31, r1)
1216 lwz r2,_NIP(r1) /* Restore environment */
1217 lwz r0,_MSR(r1)
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001218 mtspr csrr0,r2
1219 mtspr csrr1,r0
wdenk0442ed82002-11-03 10:24:00 +00001220 lwz r0,GPR0(r1)
1221 lwz r2,GPR2(r1)
1222 lwz r1,GPR1(r1)
1223 SYNC
1224 rfci
1225
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001226#ifdef CONFIG_440
1227mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001228 mfmsr r28 /* Disable interrupts */
1229 li r4,0
1230 ori r4,r4,MSR_EE
1231 andc r28,r28,r4
1232 SYNC /* Some chip revs need this... */
1233 mtmsr r28
1234 SYNC
1235 lwz r2,_CTR(r1)
1236 lwz r0,_LINK(r1)
1237 mtctr r2
1238 mtlr r0
1239 lwz r2,_XER(r1)
1240 lwz r0,_CCR(r1)
1241 mtspr XER,r2
1242 mtcrf 0xFF,r0
1243 REST_10GPRS(3, r1)
1244 REST_10GPRS(13, r1)
1245 REST_8GPRS(23, r1)
1246 REST_GPR(31, r1)
1247 lwz r2,_NIP(r1) /* Restore environment */
1248 lwz r0,_MSR(r1)
1249 mtspr mcsrr0,r2
1250 mtspr mcsrr1,r0
1251 lwz r0,GPR0(r1)
1252 lwz r2,GPR2(r1)
1253 lwz r1,GPR1(r1)
1254 SYNC
1255 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001256#endif /* CONFIG_440 */
1257
1258
wdenk0442ed82002-11-03 10:24:00 +00001259 .globl get_pvr
1260get_pvr:
1261 mfspr r3, PVR
1262 blr
1263
wdenk0442ed82002-11-03 10:24:00 +00001264/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001265/* Function: out16 */
1266/* Description: Output 16 bits */
1267/*------------------------------------------------------------------------------- */
1268 .globl out16
1269out16:
1270 sth r4,0x0000(r3)
1271 blr
1272
1273/*------------------------------------------------------------------------------- */
1274/* Function: out16r */
1275/* Description: Byte reverse and output 16 bits */
1276/*------------------------------------------------------------------------------- */
1277 .globl out16r
1278out16r:
1279 sthbrx r4,r0,r3
1280 blr
1281
1282/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001283/* Function: out32r */
1284/* Description: Byte reverse and output 32 bits */
1285/*------------------------------------------------------------------------------- */
1286 .globl out32r
1287out32r:
1288 stwbrx r4,r0,r3
1289 blr
1290
1291/*------------------------------------------------------------------------------- */
1292/* Function: in16 */
1293/* Description: Input 16 bits */
1294/*------------------------------------------------------------------------------- */
1295 .globl in16
1296in16:
1297 lhz r3,0x0000(r3)
1298 blr
1299
1300/*------------------------------------------------------------------------------- */
1301/* Function: in16r */
1302/* Description: Input 16 bits and byte reverse */
1303/*------------------------------------------------------------------------------- */
1304 .globl in16r
1305in16r:
1306 lhbrx r3,r0,r3
1307 blr
1308
1309/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001310/* Function: in32r */
1311/* Description: Input 32 bits and byte reverse */
1312/*------------------------------------------------------------------------------- */
1313 .globl in32r
1314in32r:
1315 lwbrx r3,r0,r3
1316 blr
1317
wdenk0442ed82002-11-03 10:24:00 +00001318/*
1319 * void relocate_code (addr_sp, gd, addr_moni)
1320 *
1321 * This "function" does not return, instead it continues in RAM
1322 * after relocating the monitor code.
1323 *
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001324 * r3 = Relocated stack pointer
1325 * r4 = Relocated global data pointer
1326 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001327 */
1328 .globl relocate_code
1329relocate_code:
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001330#if defined(CONFIG_4xx_DCACHE) || defined(CFG_INIT_DCACHE_CS)
Stefan Roese9b94ac62007-10-31 17:55:58 +01001331 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001332 * We need to flush the initial global data (gd_t) before the dcache
1333 * will be invalidated.
Stefan Roese9b94ac62007-10-31 17:55:58 +01001334 */
1335
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001336 /* Save registers */
1337 mr r9, r3
1338 mr r10, r4
1339 mr r11, r5
Stefan Roese9b94ac62007-10-31 17:55:58 +01001340
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001341 /* Flush initial global data range */
1342 mr r3, r4
1343 addi r4, r4, CFG_GBL_DATA_SIZE@l
Stefan Roese9b94ac62007-10-31 17:55:58 +01001344 bl flush_dcache_range
1345
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001346#if defined(CFG_INIT_DCACHE_CS)
1347 /*
1348 * Undo the earlier data cache set-up for the primordial stack and
1349 * data area. First, invalidate the data cache and then disable data
1350 * cacheability for that area. Finally, restore the EBC values, if
1351 * any.
1352 */
1353
1354 /* Invalidate the primordial stack and data area in cache */
1355 lis r3, CFG_INIT_RAM_ADDR@h
1356 ori r3, r3, CFG_INIT_RAM_ADDR@l
1357
1358 lis r4, CFG_INIT_RAM_END@h
1359 ori r4, r4, CFG_INIT_RAM_END@l
1360 add r4, r4, r3
1361
1362 bl invalidate_dcache_range
1363
1364 /* Disable cacheability for the region */
1365 mfdccr r3
1366 lis r4, ~PPC_128MB_SACR_VALUE(CFG_INIT_RAM_ADDR)@h
1367 ori r4, r4, ~PPC_128MB_SACR_VALUE(CFG_INIT_RAM_ADDR)@l
1368 and r3, r3, r4
1369 mtdccr r3
1370
1371 /* Restore the EBC parameters */
1372 li r3, PBxAP
1373 mtdcr ebccfga, r3
1374 lis r3, PBxAP_VAL@h
1375 ori r3, r3, PBxAP_VAL@l
1376 mtdcr ebccfgd, r3
1377
1378 li r3, PBxCR
1379 mtdcr ebccfga, r3
1380 lis r3, PBxCR_VAL@h
1381 ori r3, r3, PBxCR_VAL@l
1382 mtdcr ebccfgd, r3
1383#endif /* defined(CFG_INIT_DCACHE_CS) */
1384
1385 /* Restore registers */
1386 mr r3, r9
1387 mr r4, r10
1388 mr r5, r11
1389#endif /* defined(CONFIG_4xx_DCACHE) || defined(CFG_INIT_DCACHE_CS) */
Stefan Roesee02c5212008-01-09 10:23:16 +01001390
1391#ifdef CFG_INIT_RAM_DCACHE
1392 /*
1393 * Unlock the previously locked d-cache
1394 */
1395 msync
1396 isync
1397 /* set TFLOOR/NFLOOR to 0 again */
1398 lis r6,0x0001
1399 ori r6,r6,0xf800
1400 mtspr dvlim,r6
1401 lis r6,0x0000
1402 ori r6,r6,0x0000
1403 mtspr dnv0,r6
1404 mtspr dnv1,r6
1405 mtspr dnv2,r6
1406 mtspr dnv3,r6
1407 mtspr dtv0,r6
1408 mtspr dtv1,r6
1409 mtspr dtv2,r6
1410 mtspr dtv3,r6
1411 msync
1412 isync
1413#endif /* CFG_INIT_RAM_DCACHE */
1414
Stefan Roese887e2ec2006-09-07 11:51:23 +02001415#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1416 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +01001417 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
1418 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roesea4c8d132006-06-02 16:18:04 +02001419 /*
1420 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1421 * to speed up the boot process. Now this cache needs to be disabled.
1422 */
1423 iccci 0,0 /* Invalidate inst cache */
1424 dccci 0,0 /* Invalidate data cache, now no longer our stack */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001425 sync
Stefan Roesea4c8d132006-06-02 16:18:04 +02001426 isync
Niklaus Giger85dc2a72007-11-30 18:35:11 +01001427#ifdef CFG_TLB_FOR_BOOT_FLASH
1428 addi r1,r0,CFG_TLB_FOR_BOOT_FLASH /* Use defined TLB */
1429#else
1430 addi r1,r0,0x0000 /* Default TLB entry is #0 */
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001431#endif /* CFG_TLB_FOR_BOOT_FLASH */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001432 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001433 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001434 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001435 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001436 isync
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001437#endif /* defined(CONFIG_440EP) || ... || defined(CONFIG_460GT) */
wdenk0442ed82002-11-03 10:24:00 +00001438 mr r1, r3 /* Set new stack pointer */
1439 mr r9, r4 /* Save copy of Init Data pointer */
1440 mr r10, r5 /* Save copy of Destination Address */
1441
1442 mr r3, r5 /* Destination Address */
1443 lis r4, CFG_MONITOR_BASE@h /* Source Address */
1444 ori r4, r4, CFG_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001445 lwz r5, GOT(__init_end)
1446 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001447 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001448
1449 /*
1450 * Fix GOT pointer:
1451 *
1452 * New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address
1453 *
1454 * Offset:
1455 */
1456 sub r15, r10, r4
1457
1458 /* First our own GOT */
1459 add r14, r14, r15
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001460 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001461 add r30, r30, r15
1462
1463 /*
1464 * Now relocate code
1465 */
1466
1467 cmplw cr1,r3,r4
1468 addi r0,r5,3
1469 srwi. r0,r0,2
1470 beq cr1,4f /* In place copy is not necessary */
1471 beq 7f /* Protect against 0 count */
1472 mtctr r0
1473 bge cr1,2f
1474
1475 la r8,-4(r4)
1476 la r7,-4(r3)
14771: lwzu r0,4(r8)
1478 stwu r0,4(r7)
1479 bdnz 1b
1480 b 4f
1481
14822: slwi r0,r0,2
1483 add r8,r4,r0
1484 add r7,r3,r0
14853: lwzu r0,-4(r8)
1486 stwu r0,-4(r7)
1487 bdnz 3b
1488
1489/*
1490 * Now flush the cache: note that we must start from a cache aligned
1491 * address. Otherwise we might miss one cache line.
1492 */
14934: cmpwi r6,0
1494 add r5,r3,r5
1495 beq 7f /* Always flush prefetch queue in any case */
1496 subi r0,r6,1
1497 andc r3,r3,r0
1498 mr r4,r3
14995: dcbst 0,r4
1500 add r4,r4,r6
1501 cmplw r4,r5
1502 blt 5b
1503 sync /* Wait for all dcbst to complete on bus */
1504 mr r4,r3
15056: icbi 0,r4
1506 add r4,r4,r6
1507 cmplw r4,r5
1508 blt 6b
15097: sync /* Wait for all icbi to complete on bus */
1510 isync
1511
1512/*
1513 * We are done. Do not return, instead branch to second part of board
1514 * initialization, now running from RAM.
1515 */
1516
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001517 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001518 mtlr r0
1519 blr /* NEVER RETURNS! */
1520
1521in_ram:
1522
1523 /*
1524 * Relocation Function, r14 point to got2+0x8000
1525 *
1526 * Adjust got2 pointers, no need to check for 0, this code
1527 * already puts a few entries in the table.
1528 */
1529 li r0,__got2_entries@sectoff@l
1530 la r3,GOT(_GOT2_TABLE_)
1531 lwz r11,GOT(_GOT2_TABLE_)
1532 mtctr r0
1533 sub r11,r3,r11
1534 addi r3,r3,-4
15351: lwzu r0,4(r3)
1536 add r0,r0,r11
1537 stw r0,0(r3)
1538 bdnz 1b
1539
1540 /*
1541 * Now adjust the fixups and the pointers to the fixups
1542 * in case we need to move ourselves again.
1543 */
15442: li r0,__fixup_entries@sectoff@l
1545 lwz r3,GOT(_FIXUP_TABLE_)
1546 cmpwi r0,0
1547 mtctr r0
1548 addi r3,r3,-4
1549 beq 4f
15503: lwzu r4,4(r3)
1551 lwzux r0,r4,r11
1552 add r0,r0,r11
1553 stw r10,0(r3)
1554 stw r0,0(r4)
1555 bdnz 3b
15564:
1557clear_bss:
1558 /*
1559 * Now clear BSS segment
1560 */
wdenk5d232d02003-05-22 22:52:13 +00001561 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001562 lwz r4,GOT(_end)
1563
1564 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001565 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001566
1567 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001568
1569 andi. r5, r4, 3
1570 beq 6f
1571 sub r4, r4, r5
1572 mtctr r5
1573 mr r5, r4
15745: stb r0, 0(r5)
1575 addi r5, r5, 1
1576 bdnz 5b
15776:
wdenk0442ed82002-11-03 10:24:00 +00001578 stw r0, 0(r3)
1579 addi r3, r3, 4
1580 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001581 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001582
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010015837:
wdenk0442ed82002-11-03 10:24:00 +00001584 mr r3, r9 /* Init Data pointer */
1585 mr r4, r10 /* Destination Address */
1586 bl board_init_r
1587
wdenk0442ed82002-11-03 10:24:00 +00001588 /*
1589 * Copy exception vector code to low memory
1590 *
1591 * r3: dest_addr
1592 * r7: source address, r8: end address, r9: target address
1593 */
1594 .globl trap_init
1595trap_init:
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001596 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001597 lwz r8, GOT(_end_of_vectors)
1598
wdenk682011f2003-06-03 23:54:09 +00001599 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001600
1601 cmplw 0, r7, r8
1602 bgelr /* return if r7>=r8 - just in case */
1603
1604 mflr r4 /* save link register */
16051:
1606 lwz r0, 0(r7)
1607 stw r0, 0(r9)
1608 addi r7, r7, 4
1609 addi r9, r9, 4
1610 cmplw 0, r7, r8
1611 bne 1b
1612
1613 /*
1614 * relocate `hdlr' and `int_return' entries
1615 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001616 li r7, .L_MachineCheck - _start + _START_OFFSET
1617 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000016182:
1619 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001620 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001621 cmplw 0, r7, r8
1622 blt 2b
1623
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001624 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001625 bl trap_reloc
1626
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001627 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001628 bl trap_reloc
1629
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001630#ifdef CONFIG_440
1631 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001632 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001633
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001634 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001635 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001636
1637 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001638 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001639
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001640 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1641 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001642
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001643 li r7, .L_DataTLBError - _start + _START_OFFSET
1644 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001645#else /* CONFIG_440 */
1646 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001647 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001648
1649 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001650 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001651
1652 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001653 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001654#endif /* CONFIG_440 */
1655
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001656 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1657 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001658
Stefan Roese887e2ec2006-09-07 11:51:23 +02001659#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001660 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1661 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1662 mtmsr r7 /* change MSR */
1663#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001664 bl __440_msr_set
1665 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001666
Stefan Roese887e2ec2006-09-07 11:51:23 +02001667__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001668 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1669 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1670 mtspr srr1,r7
1671 mflr r7
1672 mtspr srr0,r7
1673 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001674__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001675#endif
1676
wdenk0442ed82002-11-03 10:24:00 +00001677 mtlr r4 /* restore link register */
1678 blr
1679
1680 /*
1681 * Function: relocate entries for one exception vector
1682 */
1683trap_reloc:
1684 lwz r0, 0(r7) /* hdlr ... */
1685 add r0, r0, r3 /* ... += dest_addr */
1686 stw r0, 0(r7)
1687
1688 lwz r0, 4(r7) /* int_return ... */
1689 add r0, r0, r3 /* ... += dest_addr */
1690 stw r0, 4(r7)
1691
1692 blr
Stefan Roesecf959c72007-06-01 15:27:11 +02001693
1694#if defined(CONFIG_440)
1695/*----------------------------------------------------------------------------+
1696| dcbz_area.
1697+----------------------------------------------------------------------------*/
1698 function_prolog(dcbz_area)
1699 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001700 rlwinm r5,r4,27,5,31
1701 beq ..d_ra2
1702 addi r5,r5,0x0001
1703..d_ra2:mtctr r5
1704..d_ag2:dcbz r0,r3
1705 addi r3,r3,32
1706 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001707 sync
1708 blr
1709 function_epilog(dcbz_area)
Stefan Roesecf959c72007-06-01 15:27:11 +02001710#endif /* CONFIG_440 */
Stefan Roese887e2ec2006-09-07 11:51:23 +02001711#endif /* CONFIG_NAND_SPL */
stroeseb867d702003-05-23 11:18:02 +00001712
Stefan Roesecf959c72007-06-01 15:27:11 +02001713/*------------------------------------------------------------------------------- */
1714/* Function: in8 */
1715/* Description: Input 8 bits */
1716/*------------------------------------------------------------------------------- */
1717 .globl in8
1718in8:
1719 lbz r3,0x0000(r3)
1720 blr
1721
1722/*------------------------------------------------------------------------------- */
1723/* Function: out8 */
1724/* Description: Output 8 bits */
1725/*------------------------------------------------------------------------------- */
1726 .globl out8
1727out8:
1728 stb r4,0x0000(r3)
1729 blr
1730
1731/*------------------------------------------------------------------------------- */
1732/* Function: out32 */
1733/* Description: Output 32 bits */
1734/*------------------------------------------------------------------------------- */
1735 .globl out32
1736out32:
1737 stw r4,0x0000(r3)
1738 blr
1739
1740/*------------------------------------------------------------------------------- */
1741/* Function: in32 */
1742/* Description: Input 32 bits */
1743/*------------------------------------------------------------------------------- */
1744 .globl in32
1745in32:
1746 lwz 3,0x0000(3)
1747 blr
stroeseb867d702003-05-23 11:18:02 +00001748
1749/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001750/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001751/**************************************************************************/
1752#ifdef CONFIG_405EP
1753ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001754
Stefan Roesec157d8e2005-08-01 16:41:48 +02001755#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001756 /*
1757 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1758 * function) to support FPGA and NVRAM accesses below.
1759 */
1760
1761 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1762 ori r3,r3,GPIO0_OSRH@l
1763 lis r4,CFG_GPIO0_OSRH@h
1764 ori r4,r4,CFG_GPIO0_OSRH@l
1765 stw r4,0(r3)
1766 lis r3,GPIO0_OSRL@h
1767 ori r3,r3,GPIO0_OSRL@l
1768 lis r4,CFG_GPIO0_OSRL@h
1769 ori r4,r4,CFG_GPIO0_OSRL@l
1770 stw r4,0(r3)
1771
1772 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1773 ori r3,r3,GPIO0_ISR1H@l
1774 lis r4,CFG_GPIO0_ISR1H@h
1775 ori r4,r4,CFG_GPIO0_ISR1H@l
1776 stw r4,0(r3)
1777 lis r3,GPIO0_ISR1L@h
1778 ori r3,r3,GPIO0_ISR1L@l
1779 lis r4,CFG_GPIO0_ISR1L@h
1780 ori r4,r4,CFG_GPIO0_ISR1L@l
1781 stw r4,0(r3)
1782
1783 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1784 ori r3,r3,GPIO0_TSRH@l
1785 lis r4,CFG_GPIO0_TSRH@h
1786 ori r4,r4,CFG_GPIO0_TSRH@l
1787 stw r4,0(r3)
1788 lis r3,GPIO0_TSRL@h
1789 ori r3,r3,GPIO0_TSRL@l
1790 lis r4,CFG_GPIO0_TSRL@h
1791 ori r4,r4,CFG_GPIO0_TSRL@l
1792 stw r4,0(r3)
1793
1794 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1795 ori r3,r3,GPIO0_TCR@l
1796 lis r4,CFG_GPIO0_TCR@h
1797 ori r4,r4,CFG_GPIO0_TCR@l
1798 stw r4,0(r3)
1799
1800 li r3,pb1ap /* program EBC bank 1 for RTC access */
1801 mtdcr ebccfga,r3
1802 lis r3,CFG_EBC_PB1AP@h
1803 ori r3,r3,CFG_EBC_PB1AP@l
1804 mtdcr ebccfgd,r3
1805 li r3,pb1cr
1806 mtdcr ebccfga,r3
1807 lis r3,CFG_EBC_PB1CR@h
1808 ori r3,r3,CFG_EBC_PB1CR@l
1809 mtdcr ebccfgd,r3
1810
1811 li r3,pb1ap /* program EBC bank 1 for RTC access */
1812 mtdcr ebccfga,r3
1813 lis r3,CFG_EBC_PB1AP@h
1814 ori r3,r3,CFG_EBC_PB1AP@l
1815 mtdcr ebccfgd,r3
1816 li r3,pb1cr
1817 mtdcr ebccfga,r3
1818 lis r3,CFG_EBC_PB1CR@h
1819 ori r3,r3,CFG_EBC_PB1CR@l
1820 mtdcr ebccfgd,r3
1821
1822 li r3,pb4ap /* program EBC bank 4 for FPGA access */
1823 mtdcr ebccfga,r3
1824 lis r3,CFG_EBC_PB4AP@h
1825 ori r3,r3,CFG_EBC_PB4AP@l
1826 mtdcr ebccfgd,r3
1827 li r3,pb4cr
1828 mtdcr ebccfga,r3
1829 lis r3,CFG_EBC_PB4CR@h
1830 ori r3,r3,CFG_EBC_PB4CR@l
1831 mtdcr ebccfgd,r3
1832#endif
1833
wdenk8bde7f72003-06-27 21:31:46 +00001834 /*
1835 !-----------------------------------------------------------------------
1836 ! Check to see if chip is in bypass mode.
1837 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1838 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001839 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1840 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001841 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001842 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001843 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001844 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001845 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001846
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001847 beq pll_done /* if SSCS =b'1' then PLL has */
1848 /* already been set */
1849 /* and CPU has been reset */
1850 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001851
Stefan Roesec157d8e2005-08-01 16:41:48 +02001852#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001853 /*
wdenk8bde7f72003-06-27 21:31:46 +00001854 !-----------------------------------------------------------------------
1855 ! Read NVRAM to get value to write in PLLMR.
1856 ! If value has not been correctly saved, write default value
1857 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1858 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1859 !
1860 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001861 ! structure in openbios.h. Changing the beginning of
1862 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001863 !
1864 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001865 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001866 addis r3,0,NVRAM_BASE@h
1867 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001868
Wolfgang Denkf901a832005-08-06 01:42:58 +02001869 lwz r4, 0(r3)
1870 addis r5,0,NVRVFY1@h
1871 addi r5,r5,NVRVFY1@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001872 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001873 bne ..no_pllset
1874 addi r3,r3,4
1875 lwz r4, 0(r3)
1876 addis r5,0,NVRVFY2@h
1877 addi r5,r5,NVRVFY2@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001878 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001879 bne ..no_pllset
1880 addi r3,r3,8 /* Skip over conf_size */
1881 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1882 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1883 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1884 cmpi cr0,0,r5,1 /* See if PLL is locked */
1885 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001886..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001887#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001888
John Otkend4024bb2007-07-26 17:49:11 +02001889#ifdef CONFIG_TAIHU
1890 mfdcr r4, CPC0_BOOT
1891 andi. r5, r4, CPC0_BOOT_SEP@l
1892 bne strap_1 /* serial eeprom present */
1893 addis r5,0,CPLD_REG0_ADDR@h
1894 ori r5,r5,CPLD_REG0_ADDR@l
1895 andi. r5, r5, 0x10
1896 bne _pci_66mhz
1897#endif /* CONFIG_TAIHU */
1898
Stefan Roese779e9752007-08-14 14:44:41 +02001899#if defined(CONFIG_ZEUS)
1900 mfdcr r4, CPC0_BOOT
1901 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001902 bne strap_1 /* serial eeprom present */
Stefan Roese779e9752007-08-14 14:44:41 +02001903 lis r3,0x0000
1904 addi r3,r3,0x3030
1905 lis r4,0x8042
1906 addi r4,r4,0x223e
1907 b 1f
1908strap_1:
1909 mfdcr r3, CPC0_PLLMR0
1910 mfdcr r4, CPC0_PLLMR1
1911 b 1f
1912#endif
1913
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001914 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1915 ori r3,r3,PLLMR0_DEFAULT@l /* */
1916 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1917 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001918
John Otkend4024bb2007-07-26 17:49:11 +02001919#ifdef CONFIG_TAIHU
1920 b 1f
1921_pci_66mhz:
1922 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1923 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1924 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1925 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1926 b 1f
1927strap_1:
1928 mfdcr r3, CPC0_PLLMR0
1929 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001930#endif /* CONFIG_TAIHU */
1931
Stefan Roese779e9752007-08-14 14:44:41 +020019321:
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001933 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001934
1935pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001936 /*
1937 !-----------------------------------------------------------------------
1938 ! Clear Soft Reset Register
1939 ! This is needed to enable PCI if not booting from serial EPROM
1940 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001941 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001942 addi r3, 0, 0x0
1943 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001944
Wolfgang Denkf901a832005-08-06 01:42:58 +02001945 addis r3,0,0x0010
1946 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001947pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001948 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001949
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001950 blr /* return to main code */
stroeseb867d702003-05-23 11:18:02 +00001951
1952/*
1953!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02001954! Function: pll_write
1955! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1956! That is:
1957! 1. Pll is first disabled (de-activated by putting in bypass mode)
1958! 2. PLL is reset
1959! 3. Clock dividers are set while PLL is held in reset and bypassed
1960! 4. PLL Reset is cleared
1961! 5. Wait 100us for PLL to lock
1962! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00001963! Input: r3 = Value to write to CPC0_PLLMR0
1964! Input: r4 = Value to write to CPC0_PLLMR1
1965! Output r3 = none
1966!-----------------------------------------------------------------------------
1967*/
1968pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00001969 mfdcr r5, CPC0_UCR
1970 andis. r5,r5,0xFFFF
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001971 ori r5,r5,0x0101 /* Stop the UART clocks */
1972 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00001973
wdenk8bde7f72003-06-27 21:31:46 +00001974 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001975 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001976 mtdcr CPC0_PLLMR1,r5
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001977 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001978 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001979
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001980 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1981 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1982 oris r5,r5,0x4000 /* Set PLL Reset */
1983 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1984 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001985 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001986
1987 /*
wdenk8bde7f72003-06-27 21:31:46 +00001988 ! Wait min of 100us for PLL to lock.
1989 ! See CMOS 27E databook for more info.
1990 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00001991 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001992 addi r3,0,20000 /* 2000 = 0x4e20 */
1993 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001994pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001995 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00001996
Wolfgang Denkf901a832005-08-06 01:42:58 +02001997 oris r5,r5,0x8000 /* Enable PLL */
1998 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00001999
wdenk8bde7f72003-06-27 21:31:46 +00002000 /*
2001 * Reset CPU to guarantee timings are OK
2002 * Not sure if this is needed...
2003 */
2004 addis r3,0,0x1000
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002005 mtspr dbcr0,r3 /* This will cause a CPU core reset, and */
2006 /* execution will continue from the poweron */
2007 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00002008#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01002009
2010#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01002011/*----------------------------------------------------------------------------+
2012| mttlb3.
2013+----------------------------------------------------------------------------*/
2014 function_prolog(mttlb3)
2015 TLBWE(4,3,2)
2016 blr
2017 function_epilog(mttlb3)
2018
2019/*----------------------------------------------------------------------------+
2020| mftlb3.
2021+----------------------------------------------------------------------------*/
2022 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01002023 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01002024 blr
2025 function_epilog(mftlb3)
2026
2027/*----------------------------------------------------------------------------+
2028| mttlb2.
2029+----------------------------------------------------------------------------*/
2030 function_prolog(mttlb2)
2031 TLBWE(4,3,1)
2032 blr
2033 function_epilog(mttlb2)
2034
2035/*----------------------------------------------------------------------------+
2036| mftlb2.
2037+----------------------------------------------------------------------------*/
2038 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01002039 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01002040 blr
2041 function_epilog(mftlb2)
2042
2043/*----------------------------------------------------------------------------+
2044| mttlb1.
2045+----------------------------------------------------------------------------*/
2046 function_prolog(mttlb1)
2047 TLBWE(4,3,0)
2048 blr
2049 function_epilog(mttlb1)
2050
2051/*----------------------------------------------------------------------------+
2052| mftlb1.
2053+----------------------------------------------------------------------------*/
2054 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01002055 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01002056 blr
2057 function_epilog(mftlb1)
2058#endif /* CONFIG_440 */
Stefan Roese64852d02008-06-02 14:35:44 +02002059
2060#if defined(CONFIG_NAND_SPL)
2061/*
2062 * void nand_boot_relocate(dst, src, bytes)
2063 *
2064 * r3 = Destination address to copy code to (in SDRAM)
2065 * r4 = Source address to copy code from
2066 * r5 = size to copy in bytes
2067 */
2068nand_boot_relocate:
2069 mr r6,r3
2070 mr r7,r4
2071 mflr r8
2072
2073 /*
2074 * Copy SPL from icache into SDRAM
2075 */
2076 subi r3,r3,4
2077 subi r4,r4,4
2078 srwi r5,r5,2
2079 mtctr r5
2080..spl_loop:
2081 lwzu r0,4(r4)
2082 stwu r0,4(r3)
2083 bdnz ..spl_loop
2084
2085 /*
2086 * Calculate "corrected" link register, so that we "continue"
2087 * in execution in destination range
2088 */
2089 sub r3,r7,r6 /* r3 = src - dst */
2090 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2091 mtlr r8
2092 blr
2093
2094nand_boot_common:
2095 /*
2096 * First initialize SDRAM. It has to be available *before* calling
2097 * nand_boot().
2098 */
2099 lis r3,CFG_SDRAM_BASE@h
2100 ori r3,r3,CFG_SDRAM_BASE@l
2101 bl initdram
2102
2103 /*
2104 * Now copy the 4k SPL code into SDRAM and continue execution
2105 * from there.
2106 */
2107 lis r3,CFG_NAND_BOOT_SPL_DST@h
2108 ori r3,r3,CFG_NAND_BOOT_SPL_DST@l
2109 lis r4,CFG_NAND_BOOT_SPL_SRC@h
2110 ori r4,r4,CFG_NAND_BOOT_SPL_SRC@l
2111 lis r5,CFG_NAND_BOOT_SPL_SIZE@h
2112 ori r5,r5,CFG_NAND_BOOT_SPL_SIZE@l
2113 bl nand_boot_relocate
2114
2115 /*
2116 * We're running from SDRAM now!!!
2117 *
2118 * It is necessary for 4xx systems to relocate from running at
2119 * the original location (0xfffffxxx) to somewhere else (SDRAM
2120 * preferably). This is because CS0 needs to be reconfigured for
2121 * NAND access. And we can't reconfigure this CS when currently
2122 * "running" from it.
2123 */
2124
2125 /*
2126 * Finally call nand_boot() to load main NAND U-Boot image from
2127 * NAND and jump to it.
2128 */
2129 bl nand_boot /* will not return */
2130#endif /* CONFIG_NAND_SPL */