blob: 140bfc92087db2b0af23bf7cb0c6087021326b4d [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/*------------------------------------------------------------------------------+
Josh Boyer31773492009-08-07 13:53:20 -040028 * This source code is dual-licensed. You may use it under the terms of the
29 * GNU General Public License version 2, or under the license below.
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +020030 *
31 * This source code has been made available to you by IBM on an AS-IS
32 * basis. Anyone receiving this source is licensed under IBM
33 * copyrights to use it in any way he or she deems fit, including
34 * copying it, modifying it, compiling it, and redistributing it either
35 * with or without modifications. No license under IBM patents or
36 * patent applications is to be implied by the copyright license.
37 *
38 * Any user of this software should understand that IBM cannot provide
39 * technical support for this software and will not be responsible for
40 * any consequences resulting from the use of this software.
41 *
42 * Any person who transfers this source code or any derivative work
43 * must include the IBM copyright notice, this paragraph, and the
44 * preceding two paragraphs in the transferred software.
45 *
46 * COPYRIGHT I B M CORPORATION 1995
47 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
48 *-------------------------------------------------------------------------------
49 */
wdenk0442ed82002-11-03 10:24:00 +000050
Wolfgang Denk0c8721a2005-09-23 11:05:55 +020051/* U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
wdenk0442ed82002-11-03 10:24:00 +000052 *
53 *
54 * The processor starts at 0xfffffffc and the code is executed
55 * from flash/rom.
56 * in memory, but as long we don't jump around before relocating.
57 * board_init lies at a quite high address and when the cpu has
58 * jumped there, everything is ok.
59 * This works because the cpu gives the FLASH (CS0) the whole
60 * address space at startup, and board_init lies as a echo of
61 * the flash somewhere up there in the memorymap.
62 *
63 * board_init will change CS0 to be positioned at the correct
64 * address and (s)dram will be positioned at address 0
65 */
66#include <config.h>
Stefan Roeseb36df562010-09-09 19:18:00 +020067#include <asm/ppc4xx.h>
Peter Tyser561858e2008-11-03 09:30:59 -060068#include <timestamp.h>
wdenk0442ed82002-11-03 10:24:00 +000069#include <version.h>
70
71#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
72
73#include <ppc_asm.tmpl>
74#include <ppc_defs.h>
75
76#include <asm/cache.h>
77#include <asm/mmu.h>
Dave Mitchellb14ca4b2008-11-20 14:00:49 -060078#include <asm/ppc4xx-isram.h>
wdenk0442ed82002-11-03 10:24:00 +000079
80#ifndef CONFIG_IDENT_STRING
81#define CONFIG_IDENT_STRING ""
82#endif
83
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020084#ifdef CONFIG_SYS_INIT_DCACHE_CS
85# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
Stefan Roesed1c3b272009-09-09 16:25:29 +020086# define PBxAP PB1AP
87# define PBxCR PB0CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020088# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
89# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
90# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070091# endif
wdenk0442ed82002-11-03 10:24:00 +000092# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020093# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
Stefan Roesed1c3b272009-09-09 16:25:29 +020094# define PBxAP PB1AP
95# define PBxCR PB1CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020096# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
97# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
98# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070099# endif
wdenk0442ed82002-11-03 10:24:00 +0000100# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200101# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200102# define PBxAP PB2AP
103# define PBxCR PB2CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200104# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
105# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
106# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700107# endif
wdenk0442ed82002-11-03 10:24:00 +0000108# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200109# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200110# define PBxAP PB3AP
111# define PBxCR PB3CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200112# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
113# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
114# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700115# endif
wdenk0442ed82002-11-03 10:24:00 +0000116# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200117# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200118# define PBxAP PB4AP
119# define PBxCR PB4CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200120# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
121# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
122# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700123# endif
wdenk0442ed82002-11-03 10:24:00 +0000124# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200125# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200126# define PBxAP PB5AP
127# define PBxCR PB5CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200128# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
129# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
130# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700131# endif
wdenk0442ed82002-11-03 10:24:00 +0000132# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200133# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200134# define PBxAP PB6AP
135# define PBxCR PB6CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200136# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
137# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
138# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700139# endif
wdenk0442ed82002-11-03 10:24:00 +0000140# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200141# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200142# define PBxAP PB7AP
143# define PBxCR PB7CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200144# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
145# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
146# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700147# endif
148# endif
149# ifndef PBxAP_VAL
150# define PBxAP_VAL 0
151# endif
152# ifndef PBxCR_VAL
153# define PBxCR_VAL 0
154# endif
155/*
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200156 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700157 * used as temporary stack pointer for the primordial stack
158 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200159# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
160# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700161 EBC_BXAP_TWT_ENCODE(7) | \
162 EBC_BXAP_BCE_DISABLE | \
163 EBC_BXAP_BCT_2TRANS | \
164 EBC_BXAP_CSN_ENCODE(0) | \
165 EBC_BXAP_OEN_ENCODE(0) | \
166 EBC_BXAP_WBN_ENCODE(0) | \
167 EBC_BXAP_WBF_ENCODE(0) | \
168 EBC_BXAP_TH_ENCODE(2) | \
169 EBC_BXAP_RE_DISABLED | \
170 EBC_BXAP_SOR_NONDELAYED | \
171 EBC_BXAP_BEM_WRITEONLY | \
172 EBC_BXAP_PEN_DISABLED)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200173# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
174# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
175# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700176 EBC_BXCR_BS_64MB | \
177 EBC_BXCR_BU_RW | \
178 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200179# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
180# ifndef CONFIG_SYS_INIT_RAM_PATTERN
181# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
wdenk0442ed82002-11-03 10:24:00 +0000182# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200183#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000184
Wolfgang Denk553f0982010-10-26 13:32:32 +0200185#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_SIZE > (4 << 10)))
186#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_SIZE!
Stefan Roese28d77d92008-01-30 14:48:28 +0100187#endif
188
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700189/*
190 * Unless otherwise overriden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200191 * at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
192 * NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700193 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200194#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese64852d02008-06-02 14:35:44 +0200195/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200196# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese64852d02008-06-02 14:35:44 +0200197#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200198#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
199# define CONFIG_SYS_ICACHE_SACR_VALUE \
200 (PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
201 PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
202 PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
203#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700204
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200205#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
206# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700207 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200208#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700209
Stefan Roese4978e602010-05-27 16:45:20 +0200210#if !defined(CONFIG_SYS_TLB_FOR_BOOT_FLASH)
211#define CONFIG_SYS_TLB_FOR_BOOT_FLASH 0 /* use TLB 0 as default */
212#endif
213
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200214#define function_prolog(func_name) .text; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200215 .align 2; \
216 .globl func_name; \
217 func_name:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200218#define function_epilog(func_name) .type func_name,@function; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200219 .size func_name,.-func_name
220
wdenk0442ed82002-11-03 10:24:00 +0000221/* We don't want the MMU yet.
222*/
223#undef MSR_KERNEL
224#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
225
226
227 .extern ext_bus_cntlr_init
Stefan Roese887e2ec2006-09-07 11:51:23 +0200228#ifdef CONFIG_NAND_U_BOOT
229 .extern reconfig_tlb0
230#endif
wdenk0442ed82002-11-03 10:24:00 +0000231
232/*
233 * Set up GOT: Global Offset Table
234 *
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +0100235 * Use r12 to access the GOT
wdenk0442ed82002-11-03 10:24:00 +0000236 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200237#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000238 START_GOT
239 GOT_ENTRY(_GOT2_TABLE_)
240 GOT_ENTRY(_FIXUP_TABLE_)
241
242 GOT_ENTRY(_start)
243 GOT_ENTRY(_start_of_vectors)
244 GOT_ENTRY(_end_of_vectors)
245 GOT_ENTRY(transfer_to_handler)
246
wdenk3b57fe02003-05-30 12:48:29 +0000247 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000248 GOT_ENTRY(_end)
wdenk5d232d02003-05-22 22:52:13 +0000249 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000250 END_GOT
Stefan Roese887e2ec2006-09-07 11:51:23 +0200251#endif /* CONFIG_NAND_SPL */
252
253#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
254 /*
255 * NAND U-Boot image is started from offset 0
256 */
257 .text
Stefan Roesec440bfe2007-06-06 11:42:13 +0200258#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200259 bl reconfig_tlb0
Stefan Roesec440bfe2007-06-06 11:42:13 +0200260#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200261 GET_GOT
262 bl cpu_init_f /* run low-level CPU init code (from Flash) */
263 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500264 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200265#endif
wdenk0442ed82002-11-03 10:24:00 +0000266
Stefan Roesed8731332009-05-11 13:46:14 +0200267#if defined(CONFIG_SYS_RAMBOOT)
268 /*
269 * 4xx RAM-booting U-Boot image is started from offset 0
270 */
271 .text
272 bl _start_440
273#endif
274
wdenk0442ed82002-11-03 10:24:00 +0000275/*
276 * 440 Startup -- on reset only the top 4k of the effective
277 * address space is mapped in by an entry in the instruction
278 * and data shadow TLB. The .bootpg section is located in the
279 * top 4k & does only what's necessary to map in the the rest
280 * of the boot rom. Once the boot rom is mapped in we can
281 * proceed with normal startup.
282 *
283 * NOTE: CS0 only covers the top 2MB of the effective address
284 * space after reset.
285 */
286
287#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200288#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000289 .section .bootpg,"ax"
Stefan Roese887e2ec2006-09-07 11:51:23 +0200290#endif
wdenk0442ed82002-11-03 10:24:00 +0000291 .globl _start_440
292
293/**************************************************************************/
294_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200295 /*--------------------------------------------------------------------+
296 | 440EPX BUP Change - Hardware team request
297 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200298#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
299 sync
300 nop
301 nop
302#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200303 /*----------------------------------------------------------------+
304 | Core bug fix. Clear the esr
305 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200306 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200307 mtspr SPRN_ESR,r0
wdenk0442ed82002-11-03 10:24:00 +0000308 /*----------------------------------------------------------------*/
309 /* Clear and set up some registers. */
310 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200311 iccci r0,r0 /* NOTE: operands not used for 440 */
312 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000313 sync
314 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200315 mtspr SPRN_SRR0,r0
316 mtspr SPRN_SRR1,r0
317 mtspr SPRN_CSRR0,r0
318 mtspr SPRN_CSRR1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200319 /* NOTE: 440GX adds machine check status regs */
320#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200321 mtspr SPRN_MCSRR0,r0
322 mtspr SPRN_MCSRR1,r0
323 mfspr r1,SPRN_MCSR
324 mtspr SPRN_MCSR,r1
wdenkba56f622004-02-06 23:19:44 +0000325#endif
Stefan Roese20532832006-11-22 13:20:50 +0100326
327 /*----------------------------------------------------------------*/
328 /* CCR0 init */
329 /*----------------------------------------------------------------*/
330 /* Disable store gathering & broadcast, guarantee inst/data
331 * cache block touch, force load/store alignment
332 * (see errata 1.12: 440_33)
333 */
334 lis r1,0x0030 /* store gathering & broadcast disable */
335 ori r1,r1,0x6000 /* cache touch */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200336 mtspr SPRN_CCR0,r1
Stefan Roese20532832006-11-22 13:20:50 +0100337
wdenk0442ed82002-11-03 10:24:00 +0000338 /*----------------------------------------------------------------*/
339 /* Initialize debug */
340 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200341 mfspr r1,SPRN_DBCR0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200342 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
343 bne skip_debug_init /* if set, don't clear debug register */
Victor Gallardoad876ff2010-09-16 11:32:04 -0700344 mfspr r1,SPRN_CCR0
345 ori r1,r1,CCR0_DTB@l /* Disable Trace Broadcast */
346 mtspr SPRN_CCR0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200347 mtspr SPRN_DBCR0,r0
348 mtspr SPRN_DBCR1,r0
349 mtspr SPRN_DBCR2,r0
350 mtspr SPRN_IAC1,r0
351 mtspr SPRN_IAC2,r0
352 mtspr SPRN_IAC3,r0
353 mtspr SPRN_DAC1,r0
354 mtspr SPRN_DAC2,r0
355 mtspr SPRN_DVC1,r0
356 mtspr SPRN_DVC2,r0
wdenk0442ed82002-11-03 10:24:00 +0000357
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200358 mfspr r1,SPRN_DBSR
359 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200360skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000361
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200362#if defined (CONFIG_440SPE)
363 /*----------------------------------------------------------------+
364 | Initialize Core Configuration Reg1.
365 | a. ICDPEI: Record even parity. Normal operation.
366 | b. ICTPEI: Record even parity. Normal operation.
367 | c. DCTPEI: Record even parity. Normal operation.
368 | d. DCDPEI: Record even parity. Normal operation.
369 | e. DCUPEI: Record even parity. Normal operation.
370 | f. DCMPEI: Record even parity. Normal operation.
371 | g. FCOM: Normal operation
372 | h. MMUPEI: Record even parity. Normal operation.
373 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200374 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200375 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200376 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200377 mtspr SPRN_CCR1, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200378
379 /*----------------------------------------------------------------+
380 | Reset the timebase.
381 | The previous write to CCR1 sets the timebase source.
382 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200383 mtspr SPRN_TBWL, r0
384 mtspr SPRN_TBWU, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200385#endif
386
wdenk0442ed82002-11-03 10:24:00 +0000387 /*----------------------------------------------------------------*/
388 /* Setup interrupt vectors */
389 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200390 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200391 li r1,0x0100
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200392 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200393 li r1,0x0200
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200394 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200395 li r1,0x0300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200396 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200397 li r1,0x0400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200398 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000399 li r1,0x0500
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200400 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000401 li r1,0x0600
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200402 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000403 li r1,0x0700
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200404 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000405 li r1,0x0800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200406 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000407 li r1,0x0c00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200408 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200409 li r1,0x0a00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200410 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200411 li r1,0x0900
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200412 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000413 li r1,0x1300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200414 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200415 li r1,0x1400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200416 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000417 li r1,0x2000
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200418 mtspr SPRN_IVOR15,r1 /* Debug */
wdenk0442ed82002-11-03 10:24:00 +0000419
420 /*----------------------------------------------------------------*/
421 /* Configure cache regions */
422 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200423 mtspr SPRN_INV0,r0
424 mtspr SPRN_INV1,r0
425 mtspr SPRN_INV2,r0
426 mtspr SPRN_INV3,r0
427 mtspr SPRN_DNV0,r0
428 mtspr SPRN_DNV1,r0
429 mtspr SPRN_DNV2,r0
430 mtspr SPRN_DNV3,r0
431 mtspr SPRN_ITV0,r0
432 mtspr SPRN_ITV1,r0
433 mtspr SPRN_ITV2,r0
434 mtspr SPRN_ITV3,r0
435 mtspr SPRN_DTV0,r0
436 mtspr SPRN_DTV1,r0
437 mtspr SPRN_DTV2,r0
438 mtspr SPRN_DTV3,r0
wdenk0442ed82002-11-03 10:24:00 +0000439
440 /*----------------------------------------------------------------*/
441 /* Cache victim limits */
442 /*----------------------------------------------------------------*/
443 /* floors 0, ceiling max to use the entire cache -- nothing locked
444 */
445 lis r1,0x0001
446 ori r1,r1,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200447 mtspr SPRN_IVLIM,r1
448 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000449
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200450 /*----------------------------------------------------------------+
451 |Initialize MMUCR[STID] = 0.
452 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200453 mfspr r0,SPRN_MMUCR
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200454 addis r1,0,0xFFFF
455 ori r1,r1,0xFF00
456 and r0,r0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200457 mtspr SPRN_MMUCR,r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200458
wdenk0442ed82002-11-03 10:24:00 +0000459 /*----------------------------------------------------------------*/
460 /* Clear all TLB entries -- TID = 0, TS = 0 */
461 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200462 addis r0,0,0x0000
Stefan Roese0a371ca2009-07-14 15:53:08 +0200463#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesed8731332009-05-11 13:46:14 +0200464 li r4,0 /* Start with TLB #0 */
Stefan Roese0a371ca2009-07-14 15:53:08 +0200465#else
466 li r4,1 /* Start with TLB #1 */
467#endif
468 li r1,64 /* 64 TLB entries */
469 sub r1,r1,r4 /* calculate last TLB # */
470 mtctr r1
Stefan Roesed8731332009-05-11 13:46:14 +0200471rsttlb:
472#ifdef CONFIG_SYS_RAMBOOT
473 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
474 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
475 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
476#endif
477 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
478 tlbwe r0,r4,1
479 tlbwe r0,r4,2
480tlbnxt: addi r4,r4,1 /* Next TLB */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200481 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000482
483 /*----------------------------------------------------------------*/
484 /* TLB entry setup -- step thru tlbtab */
485 /*----------------------------------------------------------------*/
Stefan Roese2a72e9e2010-04-09 14:03:59 +0200486#if defined(CONFIG_440SPE_REVA)
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200487 /*----------------------------------------------------------------*/
488 /* We have different TLB tables for revA and rev B of 440SPe */
489 /*----------------------------------------------------------------*/
490 mfspr r1, PVR
491 lis r0,0x5342
492 ori r0,r0,0x1891
493 cmpw r7,r1,r0
494 bne r7,..revA
495 bl tlbtabB
496 b ..goon
497..revA:
498 bl tlbtabA
499..goon:
500#else
wdenk0442ed82002-11-03 10:24:00 +0000501 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200502#endif
wdenk0442ed82002-11-03 10:24:00 +0000503 mr r5,r0
504 li r1,0x003f /* 64 TLB entries max */
505 mtctr r1
506 li r4,0 /* TLB # */
507
508 addi r5,r5,-4
Stefan Roesed8731332009-05-11 13:46:14 +02005091:
510#ifdef CONFIG_SYS_RAMBOOT
511 tlbre r3,r4,0 /* Read contents from TLB word #0 */
512 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
513 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
514#endif
515 lwzu r0,4(r5)
wdenk0442ed82002-11-03 10:24:00 +0000516 cmpwi r0,0
517 beq 2f /* 0 marks end */
518 lwzu r1,4(r5)
519 lwzu r2,4(r5)
520 tlbwe r0,r4,0 /* TLB Word 0 */
521 tlbwe r1,r4,1 /* TLB Word 1 */
522 tlbwe r2,r4,2 /* TLB Word 2 */
Stefan Roesed8731332009-05-11 13:46:14 +0200523tlbnx2: addi r4,r4,1 /* Next TLB */
wdenk0442ed82002-11-03 10:24:00 +0000524 bdnz 1b
525
526 /*----------------------------------------------------------------*/
527 /* Continue from 'normal' start */
528 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02005292:
Stefan Roese887e2ec2006-09-07 11:51:23 +0200530 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000531 b _start
532
5333: li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200534 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
wdenk0442ed82002-11-03 10:24:00 +0000535 mflr r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200536 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000537 rfi
stroeseb867d702003-05-23 11:18:02 +0000538#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000539
540/*
541 * r3 - 1st arg to board_init(): IMMP pointer
542 * r4 - 2nd arg to board_init(): boot flag
543 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200544#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000545 .text
546 .long 0x27051956 /* U-Boot Magic Number */
547 .globl version_string
548version_string:
549 .ascii U_BOOT_VERSION
Peter Tyser561858e2008-11-03 09:30:59 -0600550 .ascii " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
wdenk0442ed82002-11-03 10:24:00 +0000551 .ascii CONFIG_IDENT_STRING, "\0"
552
wdenk0442ed82002-11-03 10:24:00 +0000553 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200554 .globl _start_of_vectors
555_start_of_vectors:
556
557/* Critical input. */
558 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
559
560#ifdef CONFIG_440
561/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200562 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200563#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200564 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200565#endif /* CONFIG_440 */
566
567/* Data Storage exception. */
568 STD_EXCEPTION(0x300, DataStorage, UnknownException)
569
570/* Instruction Storage exception. */
571 STD_EXCEPTION(0x400, InstStorage, UnknownException)
572
573/* External Interrupt exception. */
574 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
575
576/* Alignment exception. */
577 . = 0x600
578Alignment:
579 EXCEPTION_PROLOG(SRR0, SRR1)
580 mfspr r4,DAR
581 stw r4,_DAR(r21)
582 mfspr r5,DSISR
583 stw r5,_DSISR(r21)
584 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100585 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200586
587/* Program check exception */
588 . = 0x700
589ProgramCheck:
590 EXCEPTION_PROLOG(SRR0, SRR1)
591 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100592 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
593 MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200594
595#ifdef CONFIG_440
596 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
597 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
598 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200599#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200600 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
601
602#ifdef CONFIG_440
603 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
604 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
605#else
606 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
607 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
608 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
609#endif
610 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
611
612 .globl _end_of_vectors
613_end_of_vectors:
614 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200615#endif
wdenk0442ed82002-11-03 10:24:00 +0000616 .globl _start
617_start:
618
619/*****************************************************************************/
620#if defined(CONFIG_440)
621
622 /*----------------------------------------------------------------*/
623 /* Clear and set up some registers. */
624 /*----------------------------------------------------------------*/
625 li r0,0x0000
626 lis r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200627 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
628 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
629 mtspr SPRN_TBWU,r0
630 mtspr SPRN_TSR,r1 /* clear all timer exception status */
631 mtspr SPRN_TCR,r0 /* disable all */
632 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
wdenk0442ed82002-11-03 10:24:00 +0000633 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000634
635 /*----------------------------------------------------------------*/
636 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200637 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000638 /* value you need in this case 0x8cff 0000 should do the trick */
639 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200640#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000641 lis r1,0xffff
642 ori r1,r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200643 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200644 lis r0,CONFIG_SYS_INIT_DBCR@h
645 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200646 mtspr SPRN_DBCR0,r0
wdenk0442ed82002-11-03 10:24:00 +0000647 isync
648#endif
649
650 /*----------------------------------------------------------------*/
651 /* Setup the internal SRAM */
652 /*----------------------------------------------------------------*/
653 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200654
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200655#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200656 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200657 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
658 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
Wolfgang Denk553f0982010-10-26 13:32:32 +0200659 addis r4,r0,CONFIG_SYS_INIT_RAM_SIZE@h
660 ori r4,r4,CONFIG_SYS_INIT_RAM_SIZE@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200661 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200662 rlwinm r5,r4,27,5,31
663 beq ..d_ran
664 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200665..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200666 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200667..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200668 dcbz r0,r3
669 addi r3,r3,32
670 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100671
672 /*
673 * Lock the init-ram/stack in d-cache, so that other regions
674 * may use d-cache as well
675 * Note, that this current implementation locks exactly 4k
676 * of d-cache, so please make sure that you don't define a
677 * bigger init-ram area. Take a look at the lwmon5 440EPx
678 * implementation as a reference.
679 */
680 msync
681 isync
682 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
683 lis r1,0x0201
684 ori r1,r1,0xf808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200685 mtspr SPRN_DVLIM,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100686 lis r1,0x0808
687 ori r1,r1,0x0808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200688 mtspr SPRN_DNV0,r1
689 mtspr SPRN_DNV1,r1
690 mtspr SPRN_DNV2,r1
691 mtspr SPRN_DNV3,r1
692 mtspr SPRN_DTV0,r1
693 mtspr SPRN_DTV1,r1
694 mtspr SPRN_DTV2,r1
695 mtspr SPRN_DTV3,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100696 msync
697 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200698#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200699
700 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
701#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
702 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100703#if defined(CONFIG_440GX) || \
704 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan7d307932008-07-08 22:47:31 -0700705 defined(CONFIG_460SX)
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600706 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700707#elif defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
708 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600709 lis r1, 0x0000
710 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
711 mtdcr L2_CACHE_CFG,r1
wdenkba56f622004-02-06 23:19:44 +0000712#endif
wdenk0442ed82002-11-03 10:24:00 +0000713
Stefan Roese887e2ec2006-09-07 11:51:23 +0200714 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000715 ori r2,r2,0xffff
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600716 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000717 and r1,r1,r2 /* Disable parity check */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600718 mtdcr ISRAM0_DPC,r1
719 mfdcr r1,ISRAM0_PMEG
Stefan Roese887e2ec2006-09-07 11:51:23 +0200720 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600721 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000722
723 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100724#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000725 ori r1,r1,0x0980 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600726 mtdcr ISRAM0_SB0CR,r1
wdenkba56f622004-02-06 23:19:44 +0000727 lis r1,0x8001
728 ori r1,r1,0x0980 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600729 mtdcr ISRAM0_SB1CR,r1
wdenkba56f622004-02-06 23:19:44 +0000730 lis r1, 0x8002
731 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600732 mtdcr ISRAM0_SB2CR,r1
wdenkba56f622004-02-06 23:19:44 +0000733 lis r1, 0x8003
734 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600735 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700736#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || \
737 defined(CONFIG_460GT) || defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600738 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200739 ori r1,r1,0x0984 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600740 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200741 lis r1,0x0001
742 ori r1,r1,0x0984 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600743 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200744 lis r1, 0x0002
745 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600746 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200747 lis r1, 0x0003
748 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600749 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700750#if defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
751 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600752 lis r2,0x7fff
753 ori r2,r2,0xffff
754 mfdcr r1,ISRAM1_DPC
755 and r1,r1,r2 /* Disable parity check */
Wolfgang Denk455ae7e2008-12-16 01:02:17 +0100756 mtdcr ISRAM1_DPC,r1
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600757 mfdcr r1,ISRAM1_PMEG
758 and r1,r1,r2 /* Disable pwr mgmt */
759 mtdcr ISRAM1_PMEG,r1
760
761 lis r1,0x0004 /* BAS = 4_0004_0000 */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700762 ori r1,r1,ISRAM1_SIZE /* ocm size */
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600763 mtdcr ISRAM1_SB0CR,r1
764#endif
Feng Kan7d307932008-07-08 22:47:31 -0700765#elif defined(CONFIG_460SX)
766 lis r1,0x0000 /* BAS = 0000_0000 */
767 ori r1,r1,0x0B84 /* first 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600768 mtdcr ISRAM0_SB0CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700769 lis r1,0x0001
770 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600771 mtdcr ISRAM0_SB1CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700772 lis r1, 0x0002
773 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600774 mtdcr ISRAM0_SB2CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700775 lis r1, 0x0003
776 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600777 mtdcr ISRAM0_SB3CR,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200778#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000779 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600780 mtdcr ISRAM0_SB0CR,r1
781 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
wdenkba56f622004-02-06 23:19:44 +0000782#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200783#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000784
785 /*----------------------------------------------------------------*/
786 /* Setup the stack in internal SRAM */
787 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200788 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
789 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000790 li r0,0
791 stwu r0,-4(r1)
792 stwu r0,-4(r1) /* Terminate call chain */
793
794 stwu r1,-8(r1) /* Save back chain and move SP */
795 lis r0,RESET_VECTOR@h /* Address of reset vector */
796 ori r0,r0, RESET_VECTOR@l
797 stwu r1,-8(r1) /* Save back chain and move SP */
798 stw r0,+12(r1) /* Save return addr (underflow vect) */
799
Stefan Roese887e2ec2006-09-07 11:51:23 +0200800#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +0200801 bl nand_boot_common /* will not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200802#else
wdenk0442ed82002-11-03 10:24:00 +0000803 GET_GOT
Stefan Roese5568e612005-11-22 13:20:42 +0100804
805 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000806 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500807 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200808#endif
wdenk0442ed82002-11-03 10:24:00 +0000809
810#endif /* CONFIG_440 */
811
812/*****************************************************************************/
813#ifdef CONFIG_IOP480
814 /*----------------------------------------------------------------------- */
815 /* Set up some machine state registers. */
816 /*----------------------------------------------------------------------- */
817 addi r0,r0,0x0000 /* initialize r0 to zero */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200818 mtspr SPRN_ESR,r0 /* clear Exception Syndrome Reg */
wdenk0442ed82002-11-03 10:24:00 +0000819 mttcr r0 /* timer control register */
820 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000821 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
822 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
823 mtdbsr r4 /* clear/reset the dbsr */
824 mtexisr r4 /* clear all pending interrupts */
825 addis r4,r0,0x8000
826 mtexier r4 /* enable critical exceptions */
827 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
828 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
829 mtiocr r4 /* since bit not used) & DRC to latch */
830 /* data bus on rising edge of CAS */
831 /*----------------------------------------------------------------------- */
832 /* Clear XER. */
833 /*----------------------------------------------------------------------- */
834 mtxer r0
835 /*----------------------------------------------------------------------- */
836 /* Invalidate i-cache and d-cache TAG arrays. */
837 /*----------------------------------------------------------------------- */
838 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
839 addi r4,0,1024 /* 1/4 of I-cache */
840..cloop:
841 iccci 0,r3
842 iccci r4,r3
843 dccci 0,r3
844 addic. r3,r3,-16 /* move back one cache line */
845 bne ..cloop /* loop back to do rest until r3 = 0 */
846
847 /* */
848 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
849 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
850 /* */
851
852 /* first copy IOP480 register base address into r3 */
853 addis r3,0,0x5000 /* IOP480 register base address hi */
854/* ori r3,r3,0x0000 / IOP480 register base address lo */
855
856#ifdef CONFIG_ADCIOP
857 /* use r4 as the working variable */
858 /* turn on CS3 (LOCCTL.7) */
859 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
860 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
861 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
862#endif
863
864#ifdef CONFIG_DASA_SIM
865 /* use r4 as the working variable */
866 /* turn on MA17 (LOCCTL.7) */
867 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
868 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
869 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
870#endif
871
872 /* turn on MA16..13 (LCS0BRD.12 = 0) */
873 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
874 andi. r4,r4,0xefff /* make bit 12 = 0 */
875 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
876
877 /* make sure above stores all comlete before going on */
878 sync
879
880 /* last thing, set local init status done bit (DEVINIT.31) */
881 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
882 oris r4,r4,0x8000 /* make bit 31 = 1 */
883 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
884
885 /* clear all pending interrupts and disable all interrupts */
886 li r4,-1 /* set p1 to 0xffffffff */
887 stw r4,0x1b0(r3) /* clear all pending interrupts */
888 stw r4,0x1b8(r3) /* clear all pending interrupts */
889 li r4,0 /* set r4 to 0 */
890 stw r4,0x1b4(r3) /* disable all interrupts */
891 stw r4,0x1bc(r3) /* disable all interrupts */
892
893 /* make sure above stores all comlete before going on */
894 sync
895
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700896 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200897 lis r1, CONFIG_SYS_ICACHE_SACR_VALUE@h
898 ori r1, r1, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700899 mticcr r1
900 isync
wdenk0442ed82002-11-03 10:24:00 +0000901
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700902 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200903 lis r1, CONFIG_SYS_DCACHE_SACR_VALUE@h
904 ori r1, r1, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700905 mtdccr r1
wdenk0442ed82002-11-03 10:24:00 +0000906
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200907 addis r1,r0,CONFIG_SYS_INIT_RAM_ADDR@h
908 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack to SDRAM */
wdenk0442ed82002-11-03 10:24:00 +0000909 li r0, 0 /* Make room for stack frame header and */
910 stwu r0, -4(r1) /* clear final stack frame so that */
911 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
912
913 GET_GOT /* initialize GOT access */
914
915 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500916 /* NOTREACHED - board_init_f() does not return */
wdenk0442ed82002-11-03 10:24:00 +0000917
918#endif /* CONFIG_IOP480 */
919
920/*****************************************************************************/
Stefan Roesee01bd212007-03-21 13:38:59 +0100921#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
922 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200923 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000924 /*----------------------------------------------------------------------- */
925 /* Clear and set up some registers. */
926 /*----------------------------------------------------------------------- */
927 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200928#if !defined(CONFIG_405EX)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200929 mtspr SPRN_SGR,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200930#else
931 /*
932 * On 405EX, completely clearing the SGR leads to PPC hangup
933 * upon PCIe configuration access. The PCIe memory regions
934 * need to be guarded!
935 */
936 lis r3,0x0000
937 ori r3,r3,0x7FFC
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200938 mtspr SPRN_SGR,r3
Stefan Roesedbbd1252007-10-05 17:10:59 +0200939#endif
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200940 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000941 mtesr r4 /* clear Exception Syndrome Reg */
942 mttcr r4 /* clear Timer Control Reg */
943 mtxer r4 /* clear Fixed-Point Exception Reg */
944 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000945 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
946 /* dbsr is cleared by setting bits to 1) */
947 mtdbsr r4 /* clear/reset the dbsr */
948
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700949 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000950 bl invalidate_icache
951 bl invalidate_dcache
952
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700953 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200954 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
955 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700956 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000957 isync
958
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700959 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200960 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
961 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700962 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000963
Ricardo Ribalda Delgado1f4d5322008-10-21 18:29:46 +0200964#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
965 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000966 /*----------------------------------------------------------------------- */
967 /* Tune the speed and size for flash CS0 */
968 /*----------------------------------------------------------------------- */
969 bl ext_bus_cntlr_init
970#endif
Stefan Roese64852d02008-06-02 14:35:44 +0200971
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200972#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roesedbbd1252007-10-05 17:10:59 +0200973 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700974 * For boards that don't have OCM and can't use the data cache
975 * for their primordial stack, setup stack here directly after the
976 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roesedbbd1252007-10-05 17:10:59 +0200977 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200978 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
979 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200980
981 li r0, 0 /* Make room for stack frame header and */
982 stwu r0, -4(r1) /* clear final stack frame so that */
983 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
984 /*
985 * Set up a dummy frame to store reset vector as return address.
986 * this causes stack underflow to reset board.
987 */
988 stwu r1, -8(r1) /* Save back chain and move SP */
989 lis r0, RESET_VECTOR@h /* Address of reset vector */
990 ori r0, r0, RESET_VECTOR@l
991 stwu r1, -8(r1) /* Save back chain and move SP */
992 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200993#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000994
stroeseb867d702003-05-23 11:18:02 +0000995#if defined(CONFIG_405EP)
996 /*----------------------------------------------------------------------- */
997 /* DMA Status, clear to come up clean */
998 /*----------------------------------------------------------------------- */
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200999 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001000 ori r3,r3, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +02001001 mtdcr DMASR, r3
stroeseb867d702003-05-23 11:18:02 +00001002
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001003 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +00001004#endif /* CONFIG_405EP */
1005
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001006#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +01001007#if defined(CONFIG_405EZ)
1008 /********************************************************************
1009 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
1010 *******************************************************************/
1011 /*
1012 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001013 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roesee01bd212007-03-21 13:38:59 +01001014 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001015 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1016 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001017 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001018 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +01001019 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001020 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +01001021 isync
1022
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001023 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1024 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001025 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001026 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
1027 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +01001028 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001029 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
1030 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001031 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001032 mtdcr OCM0_DISDPC,r3
Stefan Roesee01bd212007-03-21 13:38:59 +01001033
1034 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +01001035#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001036 /********************************************************************
1037 * Setup OCM - On Chip Memory
1038 *******************************************************************/
1039 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +00001040 lis r0, 0x7FFF
1041 ori r0, r0, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +02001042 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
1043 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +01001044 and r3, r3, r0 /* disable data-side IRAM */
1045 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001046 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
1047 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +00001048 isync
wdenk0442ed82002-11-03 10:24:00 +00001049
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001050 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1051 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001052 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +00001053 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001054 mtdcr OCM0_DSCNTL, r4
wdenk8bde7f72003-06-27 21:31:46 +00001055 isync
Stefan Roesee01bd212007-03-21 13:38:59 +01001056#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001057#endif
1058
1059 /*----------------------------------------------------------------------- */
1060 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1061 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001062#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001063 li r4, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001064 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001065 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
1066 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001067 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001068
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001069 addi r4, 0, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001070 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001071 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
1072 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001073 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001074
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001075 /*
1076 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001077 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001078 */
1079 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001080 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1081 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +00001082 mtdccr r4
1083
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001084 /*
1085 * Preallocate data cache lines to be used to avoid a subsequent
1086 * cache miss and an ensuing machine check exception when exceptions
1087 * are enabled.
1088 */
1089 li r0, 0
wdenk0442ed82002-11-03 10:24:00 +00001090
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001091 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1092 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001093
Wolfgang Denk553f0982010-10-26 13:32:32 +02001094 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1095 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001096
1097 /*
1098 * Convert the size, in bytes, to the number of cache lines/blocks
1099 * to preallocate.
1100 */
1101 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1102 srwi r5, r4, L1_CACHE_SHIFT
1103 beq ..load_counter
1104 addi r5, r5, 0x0001
1105..load_counter:
1106 mtctr r5
1107
1108 /* Preallocate the computed number of cache blocks. */
1109..alloc_dcache_block:
1110 dcba r0, r3
1111 addi r3, r3, L1_CACHE_BYTES
1112 bdnz ..alloc_dcache_block
1113 sync
1114
1115 /*
1116 * Load the initial stack pointer and data area and convert the size,
1117 * in bytes, to the number of words to initialize to a known value.
1118 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001119 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1120 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001121
Wolfgang Denk553f0982010-10-26 13:32:32 +02001122 lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h
1123 ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001124 mtctr r4
1125
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001126 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
Wolfgang Denk553f0982010-10-26 13:32:32 +02001127 ori r2, r2, CONFIG_SYS_INIT_RAM_SIZE@l
wdenk0442ed82002-11-03 10:24:00 +00001128
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001129 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1130 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001131
1132..stackloop:
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001133 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001134 bdnz ..stackloop
1135
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001136 /*
1137 * Make room for stack frame header and clear final stack frame so
1138 * that stack backtraces terminate cleanly.
1139 */
1140 stwu r0, -4(r1)
1141 stwu r0, -4(r1)
1142
wdenk0442ed82002-11-03 10:24:00 +00001143 /*
1144 * Set up a dummy frame to store reset vector as return address.
1145 * this causes stack underflow to reset board.
1146 */
1147 stwu r1, -8(r1) /* Save back chain and move SP */
1148 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1149 ori r0, r0, RESET_VECTOR@l
1150 stwu r1, -8(r1) /* Save back chain and move SP */
1151 stw r0, +12(r1) /* Save return addr (underflow vect) */
1152
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001153#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1154 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001155 /*
1156 * Stack in OCM.
1157 */
1158
1159 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001160 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1161 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001162
1163 /* Set up a zeroized stack frame so that backtrace works right */
1164 li r0, 0
1165 stwu r0, -4(r1)
1166 stwu r0, -4(r1)
1167
1168 /*
1169 * Set up a dummy frame to store reset vector as return address.
1170 * this causes stack underflow to reset board.
1171 */
1172 stwu r1, -8(r1) /* Save back chain and move SP */
1173 lis r0, RESET_VECTOR@h /* Address of reset vector */
1174 ori r0, r0, RESET_VECTOR@l
1175 stwu r1, -8(r1) /* Save back chain and move SP */
1176 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001177#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001178
Stefan Roesec440bfe2007-06-06 11:42:13 +02001179#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +02001180 bl nand_boot_common /* will not return */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001181#else
wdenk0442ed82002-11-03 10:24:00 +00001182 GET_GOT /* initialize GOT access */
1183
Wolfgang Denkf901a832005-08-06 01:42:58 +02001184 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001185
wdenk0442ed82002-11-03 10:24:00 +00001186 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser52ebd9c2010-09-14 19:13:53 -05001187 /* NOTREACHED - board_init_f() does not return */
1188
Stefan Roesec440bfe2007-06-06 11:42:13 +02001189#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001190
wdenk12f34242003-09-02 22:48:03 +00001191#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1192 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001193
1194
Stefan Roese887e2ec2006-09-07 11:51:23 +02001195#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001196/*
1197 * This code finishes saving the registers to the exception frame
1198 * and jumps to the appropriate handler for the exception.
1199 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1200 */
1201 .globl transfer_to_handler
1202transfer_to_handler:
1203 stw r22,_NIP(r21)
1204 lis r22,MSR_POW@h
1205 andc r23,r23,r22
1206 stw r23,_MSR(r21)
1207 SAVE_GPR(7, r21)
1208 SAVE_4GPRS(8, r21)
1209 SAVE_8GPRS(12, r21)
1210 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001211 mflr r23
1212 andi. r24,r23,0x3f00 /* get vector offset */
1213 stw r24,TRAP(r21)
1214 li r22,0
1215 stw r22,RESULT(r21)
1216 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001217 lwz r24,0(r23) /* virtual address of handler */
1218 lwz r23,4(r23) /* where to go when done */
1219 mtspr SRR0,r24
1220 mtspr SRR1,r20
1221 mtlr r23
1222 SYNC
1223 rfi /* jump to handler, enable MMU */
1224
1225int_return:
1226 mfmsr r28 /* Disable interrupts */
1227 li r4,0
1228 ori r4,r4,MSR_EE
1229 andc r28,r28,r4
1230 SYNC /* Some chip revs need this... */
1231 mtmsr r28
1232 SYNC
1233 lwz r2,_CTR(r1)
1234 lwz r0,_LINK(r1)
1235 mtctr r2
1236 mtlr r0
1237 lwz r2,_XER(r1)
1238 lwz r0,_CCR(r1)
1239 mtspr XER,r2
1240 mtcrf 0xFF,r0
1241 REST_10GPRS(3, r1)
1242 REST_10GPRS(13, r1)
1243 REST_8GPRS(23, r1)
1244 REST_GPR(31, r1)
1245 lwz r2,_NIP(r1) /* Restore environment */
1246 lwz r0,_MSR(r1)
1247 mtspr SRR0,r2
1248 mtspr SRR1,r0
1249 lwz r0,GPR0(r1)
1250 lwz r2,GPR2(r1)
1251 lwz r1,GPR1(r1)
1252 SYNC
1253 rfi
1254
1255crit_return:
1256 mfmsr r28 /* Disable interrupts */
1257 li r4,0
1258 ori r4,r4,MSR_EE
1259 andc r28,r28,r4
1260 SYNC /* Some chip revs need this... */
1261 mtmsr r28
1262 SYNC
1263 lwz r2,_CTR(r1)
1264 lwz r0,_LINK(r1)
1265 mtctr r2
1266 mtlr r0
1267 lwz r2,_XER(r1)
1268 lwz r0,_CCR(r1)
1269 mtspr XER,r2
1270 mtcrf 0xFF,r0
1271 REST_10GPRS(3, r1)
1272 REST_10GPRS(13, r1)
1273 REST_8GPRS(23, r1)
1274 REST_GPR(31, r1)
1275 lwz r2,_NIP(r1) /* Restore environment */
1276 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001277 mtspr SPRN_CSRR0,r2
1278 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001279 lwz r0,GPR0(r1)
1280 lwz r2,GPR2(r1)
1281 lwz r1,GPR1(r1)
1282 SYNC
1283 rfci
1284
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001285#ifdef CONFIG_440
1286mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001287 mfmsr r28 /* Disable interrupts */
1288 li r4,0
1289 ori r4,r4,MSR_EE
1290 andc r28,r28,r4
1291 SYNC /* Some chip revs need this... */
1292 mtmsr r28
1293 SYNC
1294 lwz r2,_CTR(r1)
1295 lwz r0,_LINK(r1)
1296 mtctr r2
1297 mtlr r0
1298 lwz r2,_XER(r1)
1299 lwz r0,_CCR(r1)
1300 mtspr XER,r2
1301 mtcrf 0xFF,r0
1302 REST_10GPRS(3, r1)
1303 REST_10GPRS(13, r1)
1304 REST_8GPRS(23, r1)
1305 REST_GPR(31, r1)
1306 lwz r2,_NIP(r1) /* Restore environment */
1307 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001308 mtspr SPRN_MCSRR0,r2
1309 mtspr SPRN_MCSRR1,r0
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001310 lwz r0,GPR0(r1)
1311 lwz r2,GPR2(r1)
1312 lwz r1,GPR1(r1)
1313 SYNC
1314 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001315#endif /* CONFIG_440 */
1316
1317
wdenk0442ed82002-11-03 10:24:00 +00001318 .globl get_pvr
1319get_pvr:
1320 mfspr r3, PVR
1321 blr
1322
wdenk0442ed82002-11-03 10:24:00 +00001323/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001324/* Function: out16 */
1325/* Description: Output 16 bits */
1326/*------------------------------------------------------------------------------- */
1327 .globl out16
1328out16:
1329 sth r4,0x0000(r3)
1330 blr
1331
1332/*------------------------------------------------------------------------------- */
1333/* Function: out16r */
1334/* Description: Byte reverse and output 16 bits */
1335/*------------------------------------------------------------------------------- */
1336 .globl out16r
1337out16r:
1338 sthbrx r4,r0,r3
1339 blr
1340
1341/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001342/* Function: out32r */
1343/* Description: Byte reverse and output 32 bits */
1344/*------------------------------------------------------------------------------- */
1345 .globl out32r
1346out32r:
1347 stwbrx r4,r0,r3
1348 blr
1349
1350/*------------------------------------------------------------------------------- */
1351/* Function: in16 */
1352/* Description: Input 16 bits */
1353/*------------------------------------------------------------------------------- */
1354 .globl in16
1355in16:
1356 lhz r3,0x0000(r3)
1357 blr
1358
1359/*------------------------------------------------------------------------------- */
1360/* Function: in16r */
1361/* Description: Input 16 bits and byte reverse */
1362/*------------------------------------------------------------------------------- */
1363 .globl in16r
1364in16r:
1365 lhbrx r3,r0,r3
1366 blr
1367
1368/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001369/* Function: in32r */
1370/* Description: Input 32 bits and byte reverse */
1371/*------------------------------------------------------------------------------- */
1372 .globl in32r
1373in32r:
1374 lwbrx r3,r0,r3
1375 blr
1376
wdenk0442ed82002-11-03 10:24:00 +00001377/*
1378 * void relocate_code (addr_sp, gd, addr_moni)
1379 *
1380 * This "function" does not return, instead it continues in RAM
1381 * after relocating the monitor code.
1382 *
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001383 * r3 = Relocated stack pointer
1384 * r4 = Relocated global data pointer
1385 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001386 */
1387 .globl relocate_code
1388relocate_code:
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001389#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roese9b94ac62007-10-31 17:55:58 +01001390 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001391 * We need to flush the initial global data (gd_t) before the dcache
1392 * will be invalidated.
Stefan Roese9b94ac62007-10-31 17:55:58 +01001393 */
1394
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001395 /* Save registers */
1396 mr r9, r3
1397 mr r10, r4
1398 mr r11, r5
Stefan Roese9b94ac62007-10-31 17:55:58 +01001399
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001400 /* Flush initial global data range */
1401 mr r3, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001402 addi r4, r4, CONFIG_SYS_GBL_DATA_SIZE@l
Stefan Roese9b94ac62007-10-31 17:55:58 +01001403 bl flush_dcache_range
1404
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001405#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001406 /*
1407 * Undo the earlier data cache set-up for the primordial stack and
1408 * data area. First, invalidate the data cache and then disable data
1409 * cacheability for that area. Finally, restore the EBC values, if
1410 * any.
1411 */
1412
1413 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001414 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1415 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001416
Wolfgang Denk553f0982010-10-26 13:32:32 +02001417 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1418 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001419 add r4, r4, r3
1420
1421 bl invalidate_dcache_range
1422
1423 /* Disable cacheability for the region */
1424 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001425 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1426 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001427 and r3, r3, r4
1428 mtdccr r3
1429
1430 /* Restore the EBC parameters */
1431 li r3, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001432 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001433 lis r3, PBxAP_VAL@h
1434 ori r3, r3, PBxAP_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001435 mtdcr EBC0_CFGDATA, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001436
1437 li r3, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001438 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001439 lis r3, PBxCR_VAL@h
1440 ori r3, r3, PBxCR_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001441 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001442#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001443
1444 /* Restore registers */
1445 mr r3, r9
1446 mr r4, r10
1447 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001448#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesee02c5212008-01-09 10:23:16 +01001449
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001450#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesee02c5212008-01-09 10:23:16 +01001451 /*
1452 * Unlock the previously locked d-cache
1453 */
1454 msync
1455 isync
1456 /* set TFLOOR/NFLOOR to 0 again */
1457 lis r6,0x0001
1458 ori r6,r6,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001459 mtspr SPRN_DVLIM,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001460 lis r6,0x0000
1461 ori r6,r6,0x0000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001462 mtspr SPRN_DNV0,r6
1463 mtspr SPRN_DNV1,r6
1464 mtspr SPRN_DNV2,r6
1465 mtspr SPRN_DNV3,r6
1466 mtspr SPRN_DTV0,r6
1467 mtspr SPRN_DTV1,r6
1468 mtspr SPRN_DTV2,r6
1469 mtspr SPRN_DTV3,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001470 msync
1471 isync
Stefan Roesef3cac532010-08-31 11:27:14 +02001472
1473 /* Invalidate data cache, now no longer our stack */
1474 dccci 0,0
1475 sync
1476 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001477#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesee02c5212008-01-09 10:23:16 +01001478
Stefan Roesea4c8d132006-06-02 16:18:04 +02001479 /*
1480 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1481 * to speed up the boot process. Now this cache needs to be disabled.
1482 */
Stefan Roese4978e602010-05-27 16:45:20 +02001483#if defined(CONFIG_440)
Stefan Roese25fb4ea2008-11-20 11:46:20 +01001484 /* Clear all potential pending exceptions */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001485 mfspr r1,SPRN_MCSR
1486 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001487 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001488 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001489 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001490 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001491 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001492 isync
Stefan Roese4978e602010-05-27 16:45:20 +02001493#endif /* defined(CONFIG_440) */
wdenk0442ed82002-11-03 10:24:00 +00001494 mr r1, r3 /* Set new stack pointer */
1495 mr r9, r4 /* Save copy of Init Data pointer */
1496 mr r10, r5 /* Save copy of Destination Address */
1497
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001498 GET_GOT
wdenk0442ed82002-11-03 10:24:00 +00001499 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001500 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1501 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001502 lwz r5, GOT(__init_end)
1503 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001504 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001505
1506 /*
1507 * Fix GOT pointer:
1508 *
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001509 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001510 *
1511 * Offset:
1512 */
1513 sub r15, r10, r4
1514
1515 /* First our own GOT */
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001516 add r12, r12, r15
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001517 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001518 add r30, r30, r15
1519
1520 /*
1521 * Now relocate code
1522 */
1523
1524 cmplw cr1,r3,r4
1525 addi r0,r5,3
1526 srwi. r0,r0,2
1527 beq cr1,4f /* In place copy is not necessary */
1528 beq 7f /* Protect against 0 count */
1529 mtctr r0
1530 bge cr1,2f
1531
1532 la r8,-4(r4)
1533 la r7,-4(r3)
15341: lwzu r0,4(r8)
1535 stwu r0,4(r7)
1536 bdnz 1b
1537 b 4f
1538
15392: slwi r0,r0,2
1540 add r8,r4,r0
1541 add r7,r3,r0
15423: lwzu r0,-4(r8)
1543 stwu r0,-4(r7)
1544 bdnz 3b
1545
1546/*
1547 * Now flush the cache: note that we must start from a cache aligned
1548 * address. Otherwise we might miss one cache line.
1549 */
15504: cmpwi r6,0
1551 add r5,r3,r5
1552 beq 7f /* Always flush prefetch queue in any case */
1553 subi r0,r6,1
1554 andc r3,r3,r0
1555 mr r4,r3
15565: dcbst 0,r4
1557 add r4,r4,r6
1558 cmplw r4,r5
1559 blt 5b
1560 sync /* Wait for all dcbst to complete on bus */
1561 mr r4,r3
15626: icbi 0,r4
1563 add r4,r4,r6
1564 cmplw r4,r5
1565 blt 6b
15667: sync /* Wait for all icbi to complete on bus */
1567 isync
1568
1569/*
1570 * We are done. Do not return, instead branch to second part of board
1571 * initialization, now running from RAM.
1572 */
1573
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001574 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001575 mtlr r0
1576 blr /* NEVER RETURNS! */
1577
1578in_ram:
1579
1580 /*
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001581 * Relocation Function, r12 point to got2+0x8000
wdenk0442ed82002-11-03 10:24:00 +00001582 *
1583 * Adjust got2 pointers, no need to check for 0, this code
1584 * already puts a few entries in the table.
1585 */
1586 li r0,__got2_entries@sectoff@l
1587 la r3,GOT(_GOT2_TABLE_)
1588 lwz r11,GOT(_GOT2_TABLE_)
1589 mtctr r0
1590 sub r11,r3,r11
1591 addi r3,r3,-4
15921: lwzu r0,4(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001593 cmpwi r0,0
1594 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001595 add r0,r0,r11
1596 stw r0,0(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +020015972: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001598
1599 /*
1600 * Now adjust the fixups and the pointers to the fixups
1601 * in case we need to move ourselves again.
1602 */
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001603 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001604 lwz r3,GOT(_FIXUP_TABLE_)
1605 cmpwi r0,0
1606 mtctr r0
1607 addi r3,r3,-4
1608 beq 4f
16093: lwzu r4,4(r3)
1610 lwzux r0,r4,r11
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001611 cmpwi r0,0
wdenk0442ed82002-11-03 10:24:00 +00001612 add r0,r0,r11
1613 stw r10,0(r3)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001614 beq- 5f
wdenk0442ed82002-11-03 10:24:00 +00001615 stw r0,0(r4)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +020016165: bdnz 3b
wdenk0442ed82002-11-03 10:24:00 +000016174:
1618clear_bss:
1619 /*
1620 * Now clear BSS segment
1621 */
wdenk5d232d02003-05-22 22:52:13 +00001622 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001623 lwz r4,GOT(_end)
1624
1625 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001626 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001627
1628 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001629
1630 andi. r5, r4, 3
1631 beq 6f
1632 sub r4, r4, r5
1633 mtctr r5
1634 mr r5, r4
16355: stb r0, 0(r5)
1636 addi r5, r5, 1
1637 bdnz 5b
16386:
wdenk0442ed82002-11-03 10:24:00 +00001639 stw r0, 0(r3)
1640 addi r3, r3, 4
1641 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001642 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001643
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010016447:
wdenk0442ed82002-11-03 10:24:00 +00001645 mr r3, r9 /* Init Data pointer */
1646 mr r4, r10 /* Destination Address */
1647 bl board_init_r
1648
wdenk0442ed82002-11-03 10:24:00 +00001649 /*
1650 * Copy exception vector code to low memory
1651 *
1652 * r3: dest_addr
1653 * r7: source address, r8: end address, r9: target address
1654 */
1655 .globl trap_init
1656trap_init:
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001657 mflr r4 /* save link register */
1658 GET_GOT
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001659 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001660 lwz r8, GOT(_end_of_vectors)
1661
wdenk682011f2003-06-03 23:54:09 +00001662 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001663
1664 cmplw 0, r7, r8
1665 bgelr /* return if r7>=r8 - just in case */
wdenk0442ed82002-11-03 10:24:00 +000016661:
1667 lwz r0, 0(r7)
1668 stw r0, 0(r9)
1669 addi r7, r7, 4
1670 addi r9, r9, 4
1671 cmplw 0, r7, r8
1672 bne 1b
1673
1674 /*
1675 * relocate `hdlr' and `int_return' entries
1676 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001677 li r7, .L_MachineCheck - _start + _START_OFFSET
1678 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000016792:
1680 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001681 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001682 cmplw 0, r7, r8
1683 blt 2b
1684
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001685 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001686 bl trap_reloc
1687
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001688 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001689 bl trap_reloc
1690
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001691#ifdef CONFIG_440
1692 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001693 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001694
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001695 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001696 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001697
1698 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001699 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001700
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001701 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1702 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001703
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001704 li r7, .L_DataTLBError - _start + _START_OFFSET
1705 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001706#else /* CONFIG_440 */
1707 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001708 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001709
1710 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001711 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001712
1713 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001714 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001715#endif /* CONFIG_440 */
1716
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001717 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1718 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001719
Stefan Roese887e2ec2006-09-07 11:51:23 +02001720#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001721 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1722 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1723 mtmsr r7 /* change MSR */
1724#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001725 bl __440_msr_set
1726 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001727
Stefan Roese887e2ec2006-09-07 11:51:23 +02001728__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001729 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1730 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001731 mtspr SPRN_SRR1,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001732 mflr r7
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001733 mtspr SPRN_SRR0,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001734 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001735__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001736#endif
1737
wdenk0442ed82002-11-03 10:24:00 +00001738 mtlr r4 /* restore link register */
1739 blr
1740
Stefan Roesecf959c72007-06-01 15:27:11 +02001741#if defined(CONFIG_440)
1742/*----------------------------------------------------------------------------+
1743| dcbz_area.
1744+----------------------------------------------------------------------------*/
1745 function_prolog(dcbz_area)
1746 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001747 rlwinm r5,r4,27,5,31
1748 beq ..d_ra2
1749 addi r5,r5,0x0001
1750..d_ra2:mtctr r5
1751..d_ag2:dcbz r0,r3
1752 addi r3,r3,32
1753 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001754 sync
1755 blr
1756 function_epilog(dcbz_area)
Stefan Roesecf959c72007-06-01 15:27:11 +02001757#endif /* CONFIG_440 */
Stefan Roese887e2ec2006-09-07 11:51:23 +02001758#endif /* CONFIG_NAND_SPL */
stroeseb867d702003-05-23 11:18:02 +00001759
Stefan Roesecf959c72007-06-01 15:27:11 +02001760/*------------------------------------------------------------------------------- */
1761/* Function: in8 */
1762/* Description: Input 8 bits */
1763/*------------------------------------------------------------------------------- */
1764 .globl in8
1765in8:
1766 lbz r3,0x0000(r3)
1767 blr
1768
1769/*------------------------------------------------------------------------------- */
1770/* Function: out8 */
1771/* Description: Output 8 bits */
1772/*------------------------------------------------------------------------------- */
1773 .globl out8
1774out8:
1775 stb r4,0x0000(r3)
1776 blr
1777
1778/*------------------------------------------------------------------------------- */
1779/* Function: out32 */
1780/* Description: Output 32 bits */
1781/*------------------------------------------------------------------------------- */
1782 .globl out32
1783out32:
1784 stw r4,0x0000(r3)
1785 blr
1786
1787/*------------------------------------------------------------------------------- */
1788/* Function: in32 */
1789/* Description: Input 32 bits */
1790/*------------------------------------------------------------------------------- */
1791 .globl in32
1792in32:
1793 lwz 3,0x0000(3)
1794 blr
stroeseb867d702003-05-23 11:18:02 +00001795
1796/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001797/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001798/**************************************************************************/
1799#ifdef CONFIG_405EP
1800ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001801
Stefan Roesec157d8e2005-08-01 16:41:48 +02001802#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001803 /*
1804 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1805 * function) to support FPGA and NVRAM accesses below.
1806 */
1807
1808 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1809 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001810 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1811 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001812 stw r4,0(r3)
1813 lis r3,GPIO0_OSRL@h
1814 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001815 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1816 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001817 stw r4,0(r3)
1818
1819 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1820 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001821 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1822 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroeseb828dda2003-12-09 14:54:43 +00001823 stw r4,0(r3)
1824 lis r3,GPIO0_ISR1L@h
1825 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001826 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1827 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroeseb828dda2003-12-09 14:54:43 +00001828 stw r4,0(r3)
1829
1830 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1831 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001832 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1833 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001834 stw r4,0(r3)
1835 lis r3,GPIO0_TSRL@h
1836 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001837 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1838 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001839 stw r4,0(r3)
1840
1841 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1842 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001843 lis r4,CONFIG_SYS_GPIO0_TCR@h
1844 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroeseb828dda2003-12-09 14:54:43 +00001845 stw r4,0(r3)
1846
Stefan Roesed1c3b272009-09-09 16:25:29 +02001847 li r3,PB1AP /* program EBC bank 1 for RTC access */
1848 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001849 lis r3,CONFIG_SYS_EBC_PB1AP@h
1850 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001851 mtdcr EBC0_CFGDATA,r3
1852 li r3,PB1CR
1853 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001854 lis r3,CONFIG_SYS_EBC_PB1CR@h
1855 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001856 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001857
Stefan Roesed1c3b272009-09-09 16:25:29 +02001858 li r3,PB1AP /* program EBC bank 1 for RTC access */
1859 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001860 lis r3,CONFIG_SYS_EBC_PB1AP@h
1861 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001862 mtdcr EBC0_CFGDATA,r3
1863 li r3,PB1CR
1864 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001865 lis r3,CONFIG_SYS_EBC_PB1CR@h
1866 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001867 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001868
Stefan Roesed1c3b272009-09-09 16:25:29 +02001869 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1870 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001871 lis r3,CONFIG_SYS_EBC_PB4AP@h
1872 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001873 mtdcr EBC0_CFGDATA,r3
1874 li r3,PB4CR
1875 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001876 lis r3,CONFIG_SYS_EBC_PB4CR@h
1877 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001878 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001879#endif
1880
wdenk8bde7f72003-06-27 21:31:46 +00001881 /*
1882 !-----------------------------------------------------------------------
1883 ! Check to see if chip is in bypass mode.
1884 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1885 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001886 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1887 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001888 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001889 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001890 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001891 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001892 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001893
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001894 beq pll_done /* if SSCS =b'1' then PLL has */
1895 /* already been set */
1896 /* and CPU has been reset */
1897 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001898
Stefan Roesec157d8e2005-08-01 16:41:48 +02001899#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001900 /*
wdenk8bde7f72003-06-27 21:31:46 +00001901 !-----------------------------------------------------------------------
1902 ! Read NVRAM to get value to write in PLLMR.
1903 ! If value has not been correctly saved, write default value
1904 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1905 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1906 !
1907 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001908 ! structure in openbios.h. Changing the beginning of
1909 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001910 !
1911 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001912 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001913 addis r3,0,NVRAM_BASE@h
1914 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001915
Wolfgang Denkf901a832005-08-06 01:42:58 +02001916 lwz r4, 0(r3)
1917 addis r5,0,NVRVFY1@h
1918 addi r5,r5,NVRVFY1@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001919 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001920 bne ..no_pllset
1921 addi r3,r3,4
1922 lwz r4, 0(r3)
1923 addis r5,0,NVRVFY2@h
1924 addi r5,r5,NVRVFY2@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001925 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001926 bne ..no_pllset
1927 addi r3,r3,8 /* Skip over conf_size */
1928 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1929 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1930 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1931 cmpi cr0,0,r5,1 /* See if PLL is locked */
1932 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001933..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001934#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001935
John Otkend4024bb2007-07-26 17:49:11 +02001936#ifdef CONFIG_TAIHU
1937 mfdcr r4, CPC0_BOOT
1938 andi. r5, r4, CPC0_BOOT_SEP@l
1939 bne strap_1 /* serial eeprom present */
1940 addis r5,0,CPLD_REG0_ADDR@h
1941 ori r5,r5,CPLD_REG0_ADDR@l
1942 andi. r5, r5, 0x10
1943 bne _pci_66mhz
1944#endif /* CONFIG_TAIHU */
1945
Stefan Roese779e9752007-08-14 14:44:41 +02001946#if defined(CONFIG_ZEUS)
1947 mfdcr r4, CPC0_BOOT
1948 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001949 bne strap_1 /* serial eeprom present */
Stefan Roese779e9752007-08-14 14:44:41 +02001950 lis r3,0x0000
1951 addi r3,r3,0x3030
1952 lis r4,0x8042
1953 addi r4,r4,0x223e
1954 b 1f
1955strap_1:
1956 mfdcr r3, CPC0_PLLMR0
1957 mfdcr r4, CPC0_PLLMR1
1958 b 1f
1959#endif
1960
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001961 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1962 ori r3,r3,PLLMR0_DEFAULT@l /* */
1963 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1964 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001965
John Otkend4024bb2007-07-26 17:49:11 +02001966#ifdef CONFIG_TAIHU
1967 b 1f
1968_pci_66mhz:
1969 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1970 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1971 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1972 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1973 b 1f
1974strap_1:
1975 mfdcr r3, CPC0_PLLMR0
1976 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001977#endif /* CONFIG_TAIHU */
1978
Stefan Roese779e9752007-08-14 14:44:41 +020019791:
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001980 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001981
1982pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001983 /*
1984 !-----------------------------------------------------------------------
1985 ! Clear Soft Reset Register
1986 ! This is needed to enable PCI if not booting from serial EPROM
1987 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001988 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001989 addi r3, 0, 0x0
1990 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001991
Wolfgang Denkf901a832005-08-06 01:42:58 +02001992 addis r3,0,0x0010
1993 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001994pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001995 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001996
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001997 blr /* return to main code */
stroeseb867d702003-05-23 11:18:02 +00001998
1999/*
2000!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02002001! Function: pll_write
2002! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
2003! That is:
2004! 1. Pll is first disabled (de-activated by putting in bypass mode)
2005! 2. PLL is reset
2006! 3. Clock dividers are set while PLL is held in reset and bypassed
2007! 4. PLL Reset is cleared
2008! 5. Wait 100us for PLL to lock
2009! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00002010! Input: r3 = Value to write to CPC0_PLLMR0
2011! Input: r4 = Value to write to CPC0_PLLMR1
2012! Output r3 = none
2013!-----------------------------------------------------------------------------
2014*/
Matthias Fuchs0580e482009-07-06 16:27:33 +02002015 .globl pll_write
stroeseb867d702003-05-23 11:18:02 +00002016pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00002017 mfdcr r5, CPC0_UCR
2018 andis. r5,r5,0xFFFF
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002019 ori r5,r5,0x0101 /* Stop the UART clocks */
2020 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00002021
wdenk8bde7f72003-06-27 21:31:46 +00002022 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002023 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002024 mtdcr CPC0_PLLMR1,r5
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002025 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002026 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00002027
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002028 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
2029 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
2030 oris r5,r5,0x4000 /* Set PLL Reset */
2031 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
2032 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002033 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00002034
2035 /*
wdenk8bde7f72003-06-27 21:31:46 +00002036 ! Wait min of 100us for PLL to lock.
2037 ! See CMOS 27E databook for more info.
2038 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00002039 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002040 addi r3,0,20000 /* 2000 = 0x4e20 */
2041 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00002042pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02002043 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00002044
Wolfgang Denkf901a832005-08-06 01:42:58 +02002045 oris r5,r5,0x8000 /* Enable PLL */
2046 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00002047
wdenk8bde7f72003-06-27 21:31:46 +00002048 /*
2049 * Reset CPU to guarantee timings are OK
2050 * Not sure if this is needed...
2051 */
2052 addis r3,0,0x1000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02002053 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002054 /* execution will continue from the poweron */
2055 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00002056#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01002057
2058#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01002059/*----------------------------------------------------------------------------+
2060| mttlb3.
2061+----------------------------------------------------------------------------*/
2062 function_prolog(mttlb3)
2063 TLBWE(4,3,2)
2064 blr
2065 function_epilog(mttlb3)
2066
2067/*----------------------------------------------------------------------------+
2068| mftlb3.
2069+----------------------------------------------------------------------------*/
2070 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01002071 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01002072 blr
2073 function_epilog(mftlb3)
2074
2075/*----------------------------------------------------------------------------+
2076| mttlb2.
2077+----------------------------------------------------------------------------*/
2078 function_prolog(mttlb2)
2079 TLBWE(4,3,1)
2080 blr
2081 function_epilog(mttlb2)
2082
2083/*----------------------------------------------------------------------------+
2084| mftlb2.
2085+----------------------------------------------------------------------------*/
2086 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01002087 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01002088 blr
2089 function_epilog(mftlb2)
2090
2091/*----------------------------------------------------------------------------+
2092| mttlb1.
2093+----------------------------------------------------------------------------*/
2094 function_prolog(mttlb1)
2095 TLBWE(4,3,0)
2096 blr
2097 function_epilog(mttlb1)
2098
2099/*----------------------------------------------------------------------------+
2100| mftlb1.
2101+----------------------------------------------------------------------------*/
2102 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01002103 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01002104 blr
2105 function_epilog(mftlb1)
2106#endif /* CONFIG_440 */
Stefan Roese64852d02008-06-02 14:35:44 +02002107
2108#if defined(CONFIG_NAND_SPL)
2109/*
2110 * void nand_boot_relocate(dst, src, bytes)
2111 *
2112 * r3 = Destination address to copy code to (in SDRAM)
2113 * r4 = Source address to copy code from
2114 * r5 = size to copy in bytes
2115 */
2116nand_boot_relocate:
2117 mr r6,r3
2118 mr r7,r4
2119 mflr r8
2120
2121 /*
2122 * Copy SPL from icache into SDRAM
2123 */
2124 subi r3,r3,4
2125 subi r4,r4,4
2126 srwi r5,r5,2
2127 mtctr r5
2128..spl_loop:
2129 lwzu r0,4(r4)
2130 stwu r0,4(r3)
2131 bdnz ..spl_loop
2132
2133 /*
2134 * Calculate "corrected" link register, so that we "continue"
2135 * in execution in destination range
2136 */
2137 sub r3,r7,r6 /* r3 = src - dst */
2138 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2139 mtlr r8
2140 blr
2141
2142nand_boot_common:
2143 /*
2144 * First initialize SDRAM. It has to be available *before* calling
2145 * nand_boot().
2146 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002147 lis r3,CONFIG_SYS_SDRAM_BASE@h
2148 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002149 bl initdram
2150
2151 /*
2152 * Now copy the 4k SPL code into SDRAM and continue execution
2153 * from there.
2154 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002155 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2156 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2157 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2158 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2159 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2160 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002161 bl nand_boot_relocate
2162
2163 /*
2164 * We're running from SDRAM now!!!
2165 *
2166 * It is necessary for 4xx systems to relocate from running at
2167 * the original location (0xfffffxxx) to somewhere else (SDRAM
2168 * preferably). This is because CS0 needs to be reconfigured for
2169 * NAND access. And we can't reconfigure this CS when currently
2170 * "running" from it.
2171 */
2172
2173 /*
2174 * Finally call nand_boot() to load main NAND U-Boot image from
2175 * NAND and jump to it.
2176 */
2177 bl nand_boot /* will not return */
2178#endif /* CONFIG_NAND_SPL */