blob: 52f2623373ec7df4753c9642b4efafee8ebcf1df [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
Stefan Roesef7b548a2010-11-26 15:43:17 +010051/*
52 * Startup code for IBM/AMCC PowerPC 4xx (PPC4xx) based boards
wdenk0442ed82002-11-03 10:24:00 +000053 *
Stefan Roesef7b548a2010-11-26 15:43:17 +010054 * The following description only applies to the NOR flash style booting.
55 * NAND booting is different. For more details about NAND booting on 4xx
56 * take a look at doc/README.nand-boot-ppc440.
wdenk0442ed82002-11-03 10:24:00 +000057 *
Stefan Roesef7b548a2010-11-26 15:43:17 +010058 * The CPU starts at address 0xfffffffc (last word in the address space).
59 * The U-Boot image therefore has to be located in the "upper" area of the
60 * flash (e.g. 512MiB - 0xfff80000 ... 0xffffffff). The default value for
61 * the boot chip-select (CS0) is quite big and covers this area. On the
62 * 405EX this is for example 0xffe00000 ... 0xffffffff. U-Boot will
63 * reconfigure this CS0 (and other chip-selects as well when configured
64 * this way) in the boot process to the "correct" values matching the
65 * board layout.
wdenk0442ed82002-11-03 10:24:00 +000066 */
Stefan Roesef7b548a2010-11-26 15:43:17 +010067
Wolfgang Denk25ddd1f2010-10-26 14:34:52 +020068#include <asm-offsets.h>
wdenk0442ed82002-11-03 10:24:00 +000069#include <config.h>
Stefan Roeseb36df562010-09-09 19:18:00 +020070#include <asm/ppc4xx.h>
wdenk0442ed82002-11-03 10:24:00 +000071#include <version.h>
72
73#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
74
75#include <ppc_asm.tmpl>
76#include <ppc_defs.h>
77
78#include <asm/cache.h>
79#include <asm/mmu.h>
Dave Mitchellb14ca4b2008-11-20 14:00:49 -060080#include <asm/ppc4xx-isram.h>
wdenk0442ed82002-11-03 10:24:00 +000081
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020082#ifdef CONFIG_SYS_INIT_DCACHE_CS
83# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
Stefan Roesed1c3b272009-09-09 16:25:29 +020084# define PBxAP PB1AP
85# define PBxCR PB0CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020086# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
87# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
88# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070089# endif
wdenk0442ed82002-11-03 10:24:00 +000090# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020091# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
Stefan Roesed1c3b272009-09-09 16:25:29 +020092# define PBxAP PB1AP
93# define PBxCR PB1CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020094# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
95# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
96# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070097# endif
wdenk0442ed82002-11-03 10:24:00 +000098# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020099# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200100# define PBxAP PB2AP
101# define PBxCR PB2CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200102# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
103# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
104# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700105# endif
wdenk0442ed82002-11-03 10:24:00 +0000106# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200107# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200108# define PBxAP PB3AP
109# define PBxCR PB3CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200110# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
111# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
112# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700113# endif
wdenk0442ed82002-11-03 10:24:00 +0000114# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200115# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200116# define PBxAP PB4AP
117# define PBxCR PB4CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200118# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
119# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
120# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700121# endif
wdenk0442ed82002-11-03 10:24:00 +0000122# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200123# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200124# define PBxAP PB5AP
125# define PBxCR PB5CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200126# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
127# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
128# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700129# endif
wdenk0442ed82002-11-03 10:24:00 +0000130# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200131# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200132# define PBxAP PB6AP
133# define PBxCR PB6CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200134# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
135# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
136# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700137# endif
wdenk0442ed82002-11-03 10:24:00 +0000138# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200139# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200140# define PBxAP PB7AP
141# define PBxCR PB7CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200142# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
143# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
144# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700145# endif
146# endif
147# ifndef PBxAP_VAL
148# define PBxAP_VAL 0
149# endif
150# ifndef PBxCR_VAL
151# define PBxCR_VAL 0
152# endif
153/*
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200154 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700155 * used as temporary stack pointer for the primordial stack
156 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200157# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
158# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700159 EBC_BXAP_TWT_ENCODE(7) | \
160 EBC_BXAP_BCE_DISABLE | \
161 EBC_BXAP_BCT_2TRANS | \
162 EBC_BXAP_CSN_ENCODE(0) | \
163 EBC_BXAP_OEN_ENCODE(0) | \
164 EBC_BXAP_WBN_ENCODE(0) | \
165 EBC_BXAP_WBF_ENCODE(0) | \
166 EBC_BXAP_TH_ENCODE(2) | \
167 EBC_BXAP_RE_DISABLED | \
168 EBC_BXAP_SOR_NONDELAYED | \
169 EBC_BXAP_BEM_WRITEONLY | \
170 EBC_BXAP_PEN_DISABLED)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200171# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
172# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
173# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700174 EBC_BXCR_BS_64MB | \
175 EBC_BXCR_BU_RW | \
176 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200177# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
178# ifndef CONFIG_SYS_INIT_RAM_PATTERN
179# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
wdenk0442ed82002-11-03 10:24:00 +0000180# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200181#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000182
Wolfgang Denk553f0982010-10-26 13:32:32 +0200183#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_SIZE > (4 << 10)))
184#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_SIZE!
Stefan Roese28d77d92008-01-30 14:48:28 +0100185#endif
186
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700187/*
188 * Unless otherwise overriden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200189 * at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
190 * NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700191 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200192#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese64852d02008-06-02 14:35:44 +0200193/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200194# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese64852d02008-06-02 14:35:44 +0200195#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200196#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
197# define CONFIG_SYS_ICACHE_SACR_VALUE \
198 (PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
199 PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
200 PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
201#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700202
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200203#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
204# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700205 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200206#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700207
Stefan Roese4978e602010-05-27 16:45:20 +0200208#if !defined(CONFIG_SYS_TLB_FOR_BOOT_FLASH)
209#define CONFIG_SYS_TLB_FOR_BOOT_FLASH 0 /* use TLB 0 as default */
210#endif
211
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200212#define function_prolog(func_name) .text; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200213 .align 2; \
214 .globl func_name; \
215 func_name:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200216#define function_epilog(func_name) .type func_name,@function; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200217 .size func_name,.-func_name
218
wdenk0442ed82002-11-03 10:24:00 +0000219/* We don't want the MMU yet.
220*/
221#undef MSR_KERNEL
222#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
223
224
225 .extern ext_bus_cntlr_init
Stefan Roese887e2ec2006-09-07 11:51:23 +0200226#ifdef CONFIG_NAND_U_BOOT
227 .extern reconfig_tlb0
228#endif
wdenk0442ed82002-11-03 10:24:00 +0000229
230/*
231 * Set up GOT: Global Offset Table
232 *
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +0100233 * Use r12 to access the GOT
wdenk0442ed82002-11-03 10:24:00 +0000234 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200235#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000236 START_GOT
237 GOT_ENTRY(_GOT2_TABLE_)
238 GOT_ENTRY(_FIXUP_TABLE_)
239
240 GOT_ENTRY(_start)
241 GOT_ENTRY(_start_of_vectors)
242 GOT_ENTRY(_end_of_vectors)
243 GOT_ENTRY(transfer_to_handler)
244
wdenk3b57fe02003-05-30 12:48:29 +0000245 GOT_ENTRY(__init_end)
Simon Glass3929fb02013-03-14 06:54:53 +0000246 GOT_ENTRY(__bss_end)
wdenk5d232d02003-05-22 22:52:13 +0000247 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000248 END_GOT
Stefan Roese887e2ec2006-09-07 11:51:23 +0200249#endif /* CONFIG_NAND_SPL */
250
251#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
252 /*
253 * NAND U-Boot image is started from offset 0
254 */
255 .text
Stefan Roesec440bfe2007-06-06 11:42:13 +0200256#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200257 bl reconfig_tlb0
Stefan Roesec440bfe2007-06-06 11:42:13 +0200258#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200259 GET_GOT
260 bl cpu_init_f /* run low-level CPU init code (from Flash) */
261 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500262 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200263#endif
wdenk0442ed82002-11-03 10:24:00 +0000264
Ricardo Ribalda Delgadod20b9992010-12-07 14:27:56 +0100265#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_BOOT_FROM_XMD)
Stefan Roesed8731332009-05-11 13:46:14 +0200266 /*
267 * 4xx RAM-booting U-Boot image is started from offset 0
268 */
269 .text
270 bl _start_440
271#endif
272
wdenk0442ed82002-11-03 10:24:00 +0000273/*
274 * 440 Startup -- on reset only the top 4k of the effective
275 * address space is mapped in by an entry in the instruction
276 * and data shadow TLB. The .bootpg section is located in the
277 * top 4k & does only what's necessary to map in the the rest
278 * of the boot rom. Once the boot rom is mapped in we can
279 * proceed with normal startup.
280 *
281 * NOTE: CS0 only covers the top 2MB of the effective address
282 * space after reset.
283 */
284
285#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200286#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000287 .section .bootpg,"ax"
Stefan Roese887e2ec2006-09-07 11:51:23 +0200288#endif
wdenk0442ed82002-11-03 10:24:00 +0000289 .globl _start_440
290
291/**************************************************************************/
292_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200293 /*--------------------------------------------------------------------+
294 | 440EPX BUP Change - Hardware team request
295 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200296#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
297 sync
298 nop
299 nop
300#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200301 /*----------------------------------------------------------------+
302 | Core bug fix. Clear the esr
303 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200304 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200305 mtspr SPRN_ESR,r0
wdenk0442ed82002-11-03 10:24:00 +0000306 /*----------------------------------------------------------------*/
307 /* Clear and set up some registers. */
308 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200309 iccci r0,r0 /* NOTE: operands not used for 440 */
310 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000311 sync
312 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200313 mtspr SPRN_SRR0,r0
314 mtspr SPRN_SRR1,r0
315 mtspr SPRN_CSRR0,r0
316 mtspr SPRN_CSRR1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200317 /* NOTE: 440GX adds machine check status regs */
318#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200319 mtspr SPRN_MCSRR0,r0
320 mtspr SPRN_MCSRR1,r0
321 mfspr r1,SPRN_MCSR
322 mtspr SPRN_MCSR,r1
wdenkba56f622004-02-06 23:19:44 +0000323#endif
Stefan Roese20532832006-11-22 13:20:50 +0100324
325 /*----------------------------------------------------------------*/
326 /* CCR0 init */
327 /*----------------------------------------------------------------*/
328 /* Disable store gathering & broadcast, guarantee inst/data
329 * cache block touch, force load/store alignment
330 * (see errata 1.12: 440_33)
331 */
332 lis r1,0x0030 /* store gathering & broadcast disable */
333 ori r1,r1,0x6000 /* cache touch */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200334 mtspr SPRN_CCR0,r1
Stefan Roese20532832006-11-22 13:20:50 +0100335
wdenk0442ed82002-11-03 10:24:00 +0000336 /*----------------------------------------------------------------*/
337 /* Initialize debug */
338 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200339 mfspr r1,SPRN_DBCR0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200340 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
341 bne skip_debug_init /* if set, don't clear debug register */
Victor Gallardoad876ff2010-09-16 11:32:04 -0700342 mfspr r1,SPRN_CCR0
343 ori r1,r1,CCR0_DTB@l /* Disable Trace Broadcast */
344 mtspr SPRN_CCR0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200345 mtspr SPRN_DBCR0,r0
346 mtspr SPRN_DBCR1,r0
347 mtspr SPRN_DBCR2,r0
348 mtspr SPRN_IAC1,r0
349 mtspr SPRN_IAC2,r0
350 mtspr SPRN_IAC3,r0
351 mtspr SPRN_DAC1,r0
352 mtspr SPRN_DAC2,r0
353 mtspr SPRN_DVC1,r0
354 mtspr SPRN_DVC2,r0
wdenk0442ed82002-11-03 10:24:00 +0000355
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200356 mfspr r1,SPRN_DBSR
357 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200358skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000359
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200360#if defined (CONFIG_440SPE)
361 /*----------------------------------------------------------------+
362 | Initialize Core Configuration Reg1.
363 | a. ICDPEI: Record even parity. Normal operation.
364 | b. ICTPEI: Record even parity. Normal operation.
365 | c. DCTPEI: Record even parity. Normal operation.
366 | d. DCDPEI: Record even parity. Normal operation.
367 | e. DCUPEI: Record even parity. Normal operation.
368 | f. DCMPEI: Record even parity. Normal operation.
369 | g. FCOM: Normal operation
370 | h. MMUPEI: Record even parity. Normal operation.
371 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200372 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200373 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200374 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200375 mtspr SPRN_CCR1, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200376
377 /*----------------------------------------------------------------+
378 | Reset the timebase.
379 | The previous write to CCR1 sets the timebase source.
380 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200381 mtspr SPRN_TBWL, r0
382 mtspr SPRN_TBWU, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200383#endif
384
wdenk0442ed82002-11-03 10:24:00 +0000385 /*----------------------------------------------------------------*/
386 /* Setup interrupt vectors */
387 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200388 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200389 li r1,0x0100
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200390 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200391 li r1,0x0200
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200392 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200393 li r1,0x0300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200394 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200395 li r1,0x0400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200396 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000397 li r1,0x0500
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200398 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000399 li r1,0x0600
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200400 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000401 li r1,0x0700
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200402 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000403 li r1,0x0800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200404 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000405 li r1,0x0c00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200406 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200407 li r1,0x0a00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200408 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200409 li r1,0x0900
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200410 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000411 li r1,0x1300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200412 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200413 li r1,0x1400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200414 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000415 li r1,0x2000
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200416 mtspr SPRN_IVOR15,r1 /* Debug */
wdenk0442ed82002-11-03 10:24:00 +0000417
418 /*----------------------------------------------------------------*/
419 /* Configure cache regions */
420 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200421 mtspr SPRN_INV0,r0
422 mtspr SPRN_INV1,r0
423 mtspr SPRN_INV2,r0
424 mtspr SPRN_INV3,r0
425 mtspr SPRN_DNV0,r0
426 mtspr SPRN_DNV1,r0
427 mtspr SPRN_DNV2,r0
428 mtspr SPRN_DNV3,r0
429 mtspr SPRN_ITV0,r0
430 mtspr SPRN_ITV1,r0
431 mtspr SPRN_ITV2,r0
432 mtspr SPRN_ITV3,r0
433 mtspr SPRN_DTV0,r0
434 mtspr SPRN_DTV1,r0
435 mtspr SPRN_DTV2,r0
436 mtspr SPRN_DTV3,r0
wdenk0442ed82002-11-03 10:24:00 +0000437
438 /*----------------------------------------------------------------*/
439 /* Cache victim limits */
440 /*----------------------------------------------------------------*/
441 /* floors 0, ceiling max to use the entire cache -- nothing locked
442 */
443 lis r1,0x0001
444 ori r1,r1,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200445 mtspr SPRN_IVLIM,r1
446 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000447
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200448 /*----------------------------------------------------------------+
449 |Initialize MMUCR[STID] = 0.
450 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200451 mfspr r0,SPRN_MMUCR
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200452 addis r1,0,0xFFFF
453 ori r1,r1,0xFF00
454 and r0,r0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200455 mtspr SPRN_MMUCR,r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200456
wdenk0442ed82002-11-03 10:24:00 +0000457 /*----------------------------------------------------------------*/
458 /* Clear all TLB entries -- TID = 0, TS = 0 */
459 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200460 addis r0,0,0x0000
Stefan Roese0a371ca2009-07-14 15:53:08 +0200461#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesed8731332009-05-11 13:46:14 +0200462 li r4,0 /* Start with TLB #0 */
Stefan Roese0a371ca2009-07-14 15:53:08 +0200463#else
464 li r4,1 /* Start with TLB #1 */
465#endif
466 li r1,64 /* 64 TLB entries */
467 sub r1,r1,r4 /* calculate last TLB # */
468 mtctr r1
Stefan Roesed8731332009-05-11 13:46:14 +0200469rsttlb:
470#ifdef CONFIG_SYS_RAMBOOT
471 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
472 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
473 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
474#endif
475 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
476 tlbwe r0,r4,1
477 tlbwe r0,r4,2
478tlbnxt: addi r4,r4,1 /* Next TLB */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200479 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000480
481 /*----------------------------------------------------------------*/
482 /* TLB entry setup -- step thru tlbtab */
483 /*----------------------------------------------------------------*/
Stefan Roese2a72e9e2010-04-09 14:03:59 +0200484#if defined(CONFIG_440SPE_REVA)
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200485 /*----------------------------------------------------------------*/
486 /* We have different TLB tables for revA and rev B of 440SPe */
487 /*----------------------------------------------------------------*/
488 mfspr r1, PVR
489 lis r0,0x5342
490 ori r0,r0,0x1891
491 cmpw r7,r1,r0
492 bne r7,..revA
493 bl tlbtabB
494 b ..goon
495..revA:
496 bl tlbtabA
497..goon:
498#else
wdenk0442ed82002-11-03 10:24:00 +0000499 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200500#endif
wdenk0442ed82002-11-03 10:24:00 +0000501 mr r5,r0
502 li r1,0x003f /* 64 TLB entries max */
503 mtctr r1
504 li r4,0 /* TLB # */
505
506 addi r5,r5,-4
Stefan Roesed8731332009-05-11 13:46:14 +02005071:
508#ifdef CONFIG_SYS_RAMBOOT
509 tlbre r3,r4,0 /* Read contents from TLB word #0 */
510 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
511 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
512#endif
513 lwzu r0,4(r5)
wdenk0442ed82002-11-03 10:24:00 +0000514 cmpwi r0,0
515 beq 2f /* 0 marks end */
516 lwzu r1,4(r5)
517 lwzu r2,4(r5)
518 tlbwe r0,r4,0 /* TLB Word 0 */
519 tlbwe r1,r4,1 /* TLB Word 1 */
520 tlbwe r2,r4,2 /* TLB Word 2 */
Stefan Roesed8731332009-05-11 13:46:14 +0200521tlbnx2: addi r4,r4,1 /* Next TLB */
wdenk0442ed82002-11-03 10:24:00 +0000522 bdnz 1b
523
524 /*----------------------------------------------------------------*/
525 /* Continue from 'normal' start */
526 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02005272:
Stefan Roese887e2ec2006-09-07 11:51:23 +0200528 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000529 b _start
530
5313: li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200532 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
wdenk0442ed82002-11-03 10:24:00 +0000533 mflr r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200534 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000535 rfi
stroeseb867d702003-05-23 11:18:02 +0000536#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000537
538/*
539 * r3 - 1st arg to board_init(): IMMP pointer
540 * r4 - 2nd arg to board_init(): boot flag
541 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200542#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000543 .text
544 .long 0x27051956 /* U-Boot Magic Number */
545 .globl version_string
546version_string:
Andreas Bießmann09c2e902011-07-18 20:24:04 +0200547 .ascii U_BOOT_VERSION_STRING, "\0"
wdenk0442ed82002-11-03 10:24:00 +0000548
wdenk0442ed82002-11-03 10:24:00 +0000549 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200550 .globl _start_of_vectors
551_start_of_vectors:
552
553/* Critical input. */
554 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
555
556#ifdef CONFIG_440
557/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200558 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200559#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200560 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200561#endif /* CONFIG_440 */
562
563/* Data Storage exception. */
564 STD_EXCEPTION(0x300, DataStorage, UnknownException)
565
566/* Instruction Storage exception. */
567 STD_EXCEPTION(0x400, InstStorage, UnknownException)
568
569/* External Interrupt exception. */
570 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
571
572/* Alignment exception. */
573 . = 0x600
574Alignment:
575 EXCEPTION_PROLOG(SRR0, SRR1)
576 mfspr r4,DAR
577 stw r4,_DAR(r21)
578 mfspr r5,DSISR
579 stw r5,_DSISR(r21)
580 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100581 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200582
583/* Program check exception */
584 . = 0x700
585ProgramCheck:
586 EXCEPTION_PROLOG(SRR0, SRR1)
587 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100588 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
589 MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200590
591#ifdef CONFIG_440
592 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
593 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
594 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200595#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200596 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
597
598#ifdef CONFIG_440
599 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
600 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
601#else
602 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
603 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
604 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
605#endif
606 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
607
608 .globl _end_of_vectors
609_end_of_vectors:
610 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200611#endif
wdenk0442ed82002-11-03 10:24:00 +0000612 .globl _start
613_start:
614
615/*****************************************************************************/
616#if defined(CONFIG_440)
617
618 /*----------------------------------------------------------------*/
619 /* Clear and set up some registers. */
620 /*----------------------------------------------------------------*/
621 li r0,0x0000
622 lis r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200623 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
624 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
625 mtspr SPRN_TBWU,r0
626 mtspr SPRN_TSR,r1 /* clear all timer exception status */
627 mtspr SPRN_TCR,r0 /* disable all */
628 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
wdenk0442ed82002-11-03 10:24:00 +0000629 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000630
631 /*----------------------------------------------------------------*/
632 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200633 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000634 /* value you need in this case 0x8cff 0000 should do the trick */
635 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200636#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000637 lis r1,0xffff
638 ori r1,r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200639 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200640 lis r0,CONFIG_SYS_INIT_DBCR@h
641 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200642 mtspr SPRN_DBCR0,r0
wdenk0442ed82002-11-03 10:24:00 +0000643 isync
644#endif
645
646 /*----------------------------------------------------------------*/
647 /* Setup the internal SRAM */
648 /*----------------------------------------------------------------*/
649 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200650
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200651#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200652 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200653 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
654 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
Wolfgang Denk553f0982010-10-26 13:32:32 +0200655 addis r4,r0,CONFIG_SYS_INIT_RAM_SIZE@h
656 ori r4,r4,CONFIG_SYS_INIT_RAM_SIZE@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200657 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200658 rlwinm r5,r4,27,5,31
659 beq ..d_ran
660 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200661..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200662 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200663..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200664 dcbz r0,r3
665 addi r3,r3,32
666 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100667
668 /*
669 * Lock the init-ram/stack in d-cache, so that other regions
670 * may use d-cache as well
671 * Note, that this current implementation locks exactly 4k
672 * of d-cache, so please make sure that you don't define a
673 * bigger init-ram area. Take a look at the lwmon5 440EPx
674 * implementation as a reference.
675 */
676 msync
677 isync
678 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
679 lis r1,0x0201
680 ori r1,r1,0xf808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200681 mtspr SPRN_DVLIM,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100682 lis r1,0x0808
683 ori r1,r1,0x0808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200684 mtspr SPRN_DNV0,r1
685 mtspr SPRN_DNV1,r1
686 mtspr SPRN_DNV2,r1
687 mtspr SPRN_DNV3,r1
688 mtspr SPRN_DTV0,r1
689 mtspr SPRN_DTV1,r1
690 mtspr SPRN_DTV2,r1
691 mtspr SPRN_DTV3,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100692 msync
693 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200694#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200695
696 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
697#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
698 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100699#if defined(CONFIG_440GX) || \
700 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan7d307932008-07-08 22:47:31 -0700701 defined(CONFIG_460SX)
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600702 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700703#elif defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
704 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600705 lis r1, 0x0000
706 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
707 mtdcr L2_CACHE_CFG,r1
wdenkba56f622004-02-06 23:19:44 +0000708#endif
wdenk0442ed82002-11-03 10:24:00 +0000709
Stefan Roese887e2ec2006-09-07 11:51:23 +0200710 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000711 ori r2,r2,0xffff
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600712 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000713 and r1,r1,r2 /* Disable parity check */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600714 mtdcr ISRAM0_DPC,r1
715 mfdcr r1,ISRAM0_PMEG
Stefan Roese887e2ec2006-09-07 11:51:23 +0200716 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600717 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000718
719 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100720#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000721 ori r1,r1,0x0980 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600722 mtdcr ISRAM0_SB0CR,r1
wdenkba56f622004-02-06 23:19:44 +0000723 lis r1,0x8001
724 ori r1,r1,0x0980 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600725 mtdcr ISRAM0_SB1CR,r1
wdenkba56f622004-02-06 23:19:44 +0000726 lis r1, 0x8002
727 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600728 mtdcr ISRAM0_SB2CR,r1
wdenkba56f622004-02-06 23:19:44 +0000729 lis r1, 0x8003
730 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600731 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700732#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || \
733 defined(CONFIG_460GT) || defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600734 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200735 ori r1,r1,0x0984 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600736 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200737 lis r1,0x0001
738 ori r1,r1,0x0984 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600739 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200740 lis r1, 0x0002
741 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600742 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200743 lis r1, 0x0003
744 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600745 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700746#if defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
747 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600748 lis r2,0x7fff
749 ori r2,r2,0xffff
750 mfdcr r1,ISRAM1_DPC
751 and r1,r1,r2 /* Disable parity check */
Wolfgang Denk455ae7e2008-12-16 01:02:17 +0100752 mtdcr ISRAM1_DPC,r1
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600753 mfdcr r1,ISRAM1_PMEG
754 and r1,r1,r2 /* Disable pwr mgmt */
755 mtdcr ISRAM1_PMEG,r1
756
757 lis r1,0x0004 /* BAS = 4_0004_0000 */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700758 ori r1,r1,ISRAM1_SIZE /* ocm size */
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600759 mtdcr ISRAM1_SB0CR,r1
760#endif
Feng Kan7d307932008-07-08 22:47:31 -0700761#elif defined(CONFIG_460SX)
762 lis r1,0x0000 /* BAS = 0000_0000 */
763 ori r1,r1,0x0B84 /* first 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600764 mtdcr ISRAM0_SB0CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700765 lis r1,0x0001
766 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600767 mtdcr ISRAM0_SB1CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700768 lis r1, 0x0002
769 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600770 mtdcr ISRAM0_SB2CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700771 lis r1, 0x0003
772 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600773 mtdcr ISRAM0_SB3CR,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200774#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000775 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600776 mtdcr ISRAM0_SB0CR,r1
777 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
wdenkba56f622004-02-06 23:19:44 +0000778#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200779#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000780
781 /*----------------------------------------------------------------*/
782 /* Setup the stack in internal SRAM */
783 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200784 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
785 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000786 li r0,0
787 stwu r0,-4(r1)
788 stwu r0,-4(r1) /* Terminate call chain */
789
790 stwu r1,-8(r1) /* Save back chain and move SP */
791 lis r0,RESET_VECTOR@h /* Address of reset vector */
792 ori r0,r0, RESET_VECTOR@l
793 stwu r1,-8(r1) /* Save back chain and move SP */
794 stw r0,+12(r1) /* Save return addr (underflow vect) */
Wolfgang Denk8c4734e2011-04-20 22:11:21 +0200795
Stefan Roese887e2ec2006-09-07 11:51:23 +0200796#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +0200797 bl nand_boot_common /* will not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200798#else
wdenk0442ed82002-11-03 10:24:00 +0000799 GET_GOT
Stefan Roese5568e612005-11-22 13:20:42 +0100800
801 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000802 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500803 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200804#endif
wdenk0442ed82002-11-03 10:24:00 +0000805
806#endif /* CONFIG_440 */
807
808/*****************************************************************************/
Stefan Roesee01bd212007-03-21 13:38:59 +0100809#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
810 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200811 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000812 /*----------------------------------------------------------------------- */
813 /* Clear and set up some registers. */
814 /*----------------------------------------------------------------------- */
815 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200816#if !defined(CONFIG_405EX)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200817 mtspr SPRN_SGR,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200818#else
819 /*
820 * On 405EX, completely clearing the SGR leads to PPC hangup
821 * upon PCIe configuration access. The PCIe memory regions
822 * need to be guarded!
823 */
824 lis r3,0x0000
825 ori r3,r3,0x7FFC
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200826 mtspr SPRN_SGR,r3
Stefan Roesedbbd1252007-10-05 17:10:59 +0200827#endif
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200828 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000829 mtesr r4 /* clear Exception Syndrome Reg */
830 mttcr r4 /* clear Timer Control Reg */
831 mtxer r4 /* clear Fixed-Point Exception Reg */
832 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000833 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
834 /* dbsr is cleared by setting bits to 1) */
835 mtdbsr r4 /* clear/reset the dbsr */
836
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700837 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000838 bl invalidate_icache
839 bl invalidate_dcache
840
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700841 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200842 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
843 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700844 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000845 isync
846
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700847 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200848 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
849 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700850 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000851
Ricardo Ribalda Delgado1f4d5322008-10-21 18:29:46 +0200852#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
853 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000854 /*----------------------------------------------------------------------- */
855 /* Tune the speed and size for flash CS0 */
856 /*----------------------------------------------------------------------- */
857 bl ext_bus_cntlr_init
858#endif
Stefan Roese64852d02008-06-02 14:35:44 +0200859
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200860#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roesedbbd1252007-10-05 17:10:59 +0200861 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700862 * For boards that don't have OCM and can't use the data cache
863 * for their primordial stack, setup stack here directly after the
864 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roesedbbd1252007-10-05 17:10:59 +0200865 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200866 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
867 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200868
869 li r0, 0 /* Make room for stack frame header and */
870 stwu r0, -4(r1) /* clear final stack frame so that */
871 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
872 /*
873 * Set up a dummy frame to store reset vector as return address.
874 * this causes stack underflow to reset board.
875 */
876 stwu r1, -8(r1) /* Save back chain and move SP */
877 lis r0, RESET_VECTOR@h /* Address of reset vector */
878 ori r0, r0, RESET_VECTOR@l
879 stwu r1, -8(r1) /* Save back chain and move SP */
880 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200881#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000882
stroeseb867d702003-05-23 11:18:02 +0000883#if defined(CONFIG_405EP)
884 /*----------------------------------------------------------------------- */
885 /* DMA Status, clear to come up clean */
886 /*----------------------------------------------------------------------- */
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200887 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200888 ori r3,r3, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200889 mtdcr DMASR, r3
stroeseb867d702003-05-23 11:18:02 +0000890
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200891 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +0000892#endif /* CONFIG_405EP */
893
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200894#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +0100895#if defined(CONFIG_405EZ)
896 /********************************************************************
897 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
898 *******************************************************************/
899 /*
900 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200901 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roesee01bd212007-03-21 13:38:59 +0100902 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200903 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
904 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200905 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200906 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +0100907 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200908 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +0100909 isync
910
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200911 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
912 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200913 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200914 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
915 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +0100916 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200917 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
918 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200919 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200920 mtdcr OCM0_DISDPC,r3
Stefan Roesee01bd212007-03-21 13:38:59 +0100921
922 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +0100923#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000924 /********************************************************************
925 * Setup OCM - On Chip Memory
926 *******************************************************************/
927 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +0000928 lis r0, 0x7FFF
929 ori r0, r0, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200930 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
931 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +0100932 and r3, r3, r0 /* disable data-side IRAM */
933 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200934 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
935 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +0000936 isync
wdenk0442ed82002-11-03 10:24:00 +0000937
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200938 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
939 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200940 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +0000941 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200942 mtdcr OCM0_DSCNTL, r4
wdenk8bde7f72003-06-27 21:31:46 +0000943 isync
Stefan Roesee01bd212007-03-21 13:38:59 +0100944#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000945#endif
946
947 /*----------------------------------------------------------------------- */
948 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
949 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200950#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700951 li r4, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +0200952 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200953 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
954 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200955 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000956
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700957 addi r4, 0, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +0200958 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200959 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
960 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200961 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000962
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700963 /*
964 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200965 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700966 */
967 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200968 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
969 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +0000970 mtdccr r4
971
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700972 /*
973 * Preallocate data cache lines to be used to avoid a subsequent
974 * cache miss and an ensuing machine check exception when exceptions
975 * are enabled.
976 */
977 li r0, 0
wdenk0442ed82002-11-03 10:24:00 +0000978
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200979 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
980 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +0000981
Wolfgang Denk553f0982010-10-26 13:32:32 +0200982 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
983 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700984
985 /*
986 * Convert the size, in bytes, to the number of cache lines/blocks
987 * to preallocate.
988 */
989 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
990 srwi r5, r4, L1_CACHE_SHIFT
991 beq ..load_counter
992 addi r5, r5, 0x0001
993..load_counter:
994 mtctr r5
995
996 /* Preallocate the computed number of cache blocks. */
997..alloc_dcache_block:
998 dcba r0, r3
999 addi r3, r3, L1_CACHE_BYTES
1000 bdnz ..alloc_dcache_block
1001 sync
1002
1003 /*
1004 * Load the initial stack pointer and data area and convert the size,
1005 * in bytes, to the number of words to initialize to a known value.
1006 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001007 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1008 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001009
Wolfgang Denk553f0982010-10-26 13:32:32 +02001010 lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h
1011 ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001012 mtctr r4
1013
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001014 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
Wolfgang Denk553f0982010-10-26 13:32:32 +02001015 ori r2, r2, CONFIG_SYS_INIT_RAM_SIZE@l
wdenk0442ed82002-11-03 10:24:00 +00001016
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001017 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1018 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001019
1020..stackloop:
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001021 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001022 bdnz ..stackloop
1023
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001024 /*
1025 * Make room for stack frame header and clear final stack frame so
1026 * that stack backtraces terminate cleanly.
1027 */
1028 stwu r0, -4(r1)
1029 stwu r0, -4(r1)
1030
wdenk0442ed82002-11-03 10:24:00 +00001031 /*
1032 * Set up a dummy frame to store reset vector as return address.
1033 * this causes stack underflow to reset board.
1034 */
1035 stwu r1, -8(r1) /* Save back chain and move SP */
1036 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1037 ori r0, r0, RESET_VECTOR@l
1038 stwu r1, -8(r1) /* Save back chain and move SP */
1039 stw r0, +12(r1) /* Save return addr (underflow vect) */
1040
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001041#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1042 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001043 /*
1044 * Stack in OCM.
1045 */
1046
1047 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001048 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1049 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001050
1051 /* Set up a zeroized stack frame so that backtrace works right */
1052 li r0, 0
1053 stwu r0, -4(r1)
1054 stwu r0, -4(r1)
1055
1056 /*
1057 * Set up a dummy frame to store reset vector as return address.
1058 * this causes stack underflow to reset board.
1059 */
1060 stwu r1, -8(r1) /* Save back chain and move SP */
1061 lis r0, RESET_VECTOR@h /* Address of reset vector */
1062 ori r0, r0, RESET_VECTOR@l
1063 stwu r1, -8(r1) /* Save back chain and move SP */
1064 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001065#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001066
Stefan Roesec440bfe2007-06-06 11:42:13 +02001067#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +02001068 bl nand_boot_common /* will not return */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001069#else
wdenk0442ed82002-11-03 10:24:00 +00001070 GET_GOT /* initialize GOT access */
1071
Wolfgang Denkf901a832005-08-06 01:42:58 +02001072 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001073
wdenk0442ed82002-11-03 10:24:00 +00001074 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser52ebd9c2010-09-14 19:13:53 -05001075 /* NOTREACHED - board_init_f() does not return */
1076
Stefan Roesec440bfe2007-06-06 11:42:13 +02001077#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001078
wdenk12f34242003-09-02 22:48:03 +00001079#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1080 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001081
1082
Stefan Roese887e2ec2006-09-07 11:51:23 +02001083#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001084/*
1085 * This code finishes saving the registers to the exception frame
1086 * and jumps to the appropriate handler for the exception.
1087 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1088 */
1089 .globl transfer_to_handler
1090transfer_to_handler:
1091 stw r22,_NIP(r21)
1092 lis r22,MSR_POW@h
1093 andc r23,r23,r22
1094 stw r23,_MSR(r21)
1095 SAVE_GPR(7, r21)
1096 SAVE_4GPRS(8, r21)
1097 SAVE_8GPRS(12, r21)
1098 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001099 mflr r23
1100 andi. r24,r23,0x3f00 /* get vector offset */
1101 stw r24,TRAP(r21)
1102 li r22,0
1103 stw r22,RESULT(r21)
1104 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001105 lwz r24,0(r23) /* virtual address of handler */
1106 lwz r23,4(r23) /* where to go when done */
1107 mtspr SRR0,r24
1108 mtspr SRR1,r20
1109 mtlr r23
1110 SYNC
1111 rfi /* jump to handler, enable MMU */
1112
1113int_return:
1114 mfmsr r28 /* Disable interrupts */
1115 li r4,0
1116 ori r4,r4,MSR_EE
1117 andc r28,r28,r4
1118 SYNC /* Some chip revs need this... */
1119 mtmsr r28
1120 SYNC
1121 lwz r2,_CTR(r1)
1122 lwz r0,_LINK(r1)
1123 mtctr r2
1124 mtlr r0
1125 lwz r2,_XER(r1)
1126 lwz r0,_CCR(r1)
1127 mtspr XER,r2
1128 mtcrf 0xFF,r0
1129 REST_10GPRS(3, r1)
1130 REST_10GPRS(13, r1)
1131 REST_8GPRS(23, r1)
1132 REST_GPR(31, r1)
1133 lwz r2,_NIP(r1) /* Restore environment */
1134 lwz r0,_MSR(r1)
1135 mtspr SRR0,r2
1136 mtspr SRR1,r0
1137 lwz r0,GPR0(r1)
1138 lwz r2,GPR2(r1)
1139 lwz r1,GPR1(r1)
1140 SYNC
1141 rfi
1142
1143crit_return:
1144 mfmsr r28 /* Disable interrupts */
1145 li r4,0
1146 ori r4,r4,MSR_EE
1147 andc r28,r28,r4
1148 SYNC /* Some chip revs need this... */
1149 mtmsr r28
1150 SYNC
1151 lwz r2,_CTR(r1)
1152 lwz r0,_LINK(r1)
1153 mtctr r2
1154 mtlr r0
1155 lwz r2,_XER(r1)
1156 lwz r0,_CCR(r1)
1157 mtspr XER,r2
1158 mtcrf 0xFF,r0
1159 REST_10GPRS(3, r1)
1160 REST_10GPRS(13, r1)
1161 REST_8GPRS(23, r1)
1162 REST_GPR(31, r1)
1163 lwz r2,_NIP(r1) /* Restore environment */
1164 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001165 mtspr SPRN_CSRR0,r2
1166 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001167 lwz r0,GPR0(r1)
1168 lwz r2,GPR2(r1)
1169 lwz r1,GPR1(r1)
1170 SYNC
1171 rfci
1172
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001173#ifdef CONFIG_440
1174mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001175 mfmsr r28 /* Disable interrupts */
1176 li r4,0
1177 ori r4,r4,MSR_EE
1178 andc r28,r28,r4
1179 SYNC /* Some chip revs need this... */
1180 mtmsr r28
1181 SYNC
1182 lwz r2,_CTR(r1)
1183 lwz r0,_LINK(r1)
1184 mtctr r2
1185 mtlr r0
1186 lwz r2,_XER(r1)
1187 lwz r0,_CCR(r1)
1188 mtspr XER,r2
1189 mtcrf 0xFF,r0
1190 REST_10GPRS(3, r1)
1191 REST_10GPRS(13, r1)
1192 REST_8GPRS(23, r1)
1193 REST_GPR(31, r1)
1194 lwz r2,_NIP(r1) /* Restore environment */
1195 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001196 mtspr SPRN_MCSRR0,r2
1197 mtspr SPRN_MCSRR1,r0
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001198 lwz r0,GPR0(r1)
1199 lwz r2,GPR2(r1)
1200 lwz r1,GPR1(r1)
1201 SYNC
1202 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001203#endif /* CONFIG_440 */
1204
1205
wdenk0442ed82002-11-03 10:24:00 +00001206 .globl get_pvr
1207get_pvr:
1208 mfspr r3, PVR
1209 blr
1210
wdenk0442ed82002-11-03 10:24:00 +00001211/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001212/* Function: out16 */
1213/* Description: Output 16 bits */
1214/*------------------------------------------------------------------------------- */
1215 .globl out16
1216out16:
1217 sth r4,0x0000(r3)
1218 blr
1219
1220/*------------------------------------------------------------------------------- */
1221/* Function: out16r */
1222/* Description: Byte reverse and output 16 bits */
1223/*------------------------------------------------------------------------------- */
1224 .globl out16r
1225out16r:
1226 sthbrx r4,r0,r3
1227 blr
1228
1229/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001230/* Function: out32r */
1231/* Description: Byte reverse and output 32 bits */
1232/*------------------------------------------------------------------------------- */
1233 .globl out32r
1234out32r:
1235 stwbrx r4,r0,r3
1236 blr
1237
1238/*------------------------------------------------------------------------------- */
1239/* Function: in16 */
1240/* Description: Input 16 bits */
1241/*------------------------------------------------------------------------------- */
1242 .globl in16
1243in16:
1244 lhz r3,0x0000(r3)
1245 blr
1246
1247/*------------------------------------------------------------------------------- */
1248/* Function: in16r */
1249/* Description: Input 16 bits and byte reverse */
1250/*------------------------------------------------------------------------------- */
1251 .globl in16r
1252in16r:
1253 lhbrx r3,r0,r3
1254 blr
1255
1256/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001257/* Function: in32r */
1258/* Description: Input 32 bits and byte reverse */
1259/*------------------------------------------------------------------------------- */
1260 .globl in32r
1261in32r:
1262 lwbrx r3,r0,r3
1263 blr
1264
wdenk0442ed82002-11-03 10:24:00 +00001265/*
1266 * void relocate_code (addr_sp, gd, addr_moni)
1267 *
1268 * This "function" does not return, instead it continues in RAM
1269 * after relocating the monitor code.
1270 *
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001271 * r3 = Relocated stack pointer
1272 * r4 = Relocated global data pointer
1273 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001274 */
1275 .globl relocate_code
1276relocate_code:
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001277#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roese9b94ac62007-10-31 17:55:58 +01001278 /*
Stefan Roese79209542010-11-26 15:45:34 +01001279 * We need to flush the initial global data (gd_t) and bd_info
1280 * before the dcache will be invalidated.
Stefan Roese9b94ac62007-10-31 17:55:58 +01001281 */
1282
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001283 /* Save registers */
1284 mr r9, r3
1285 mr r10, r4
1286 mr r11, r5
Stefan Roese9b94ac62007-10-31 17:55:58 +01001287
Stefan Roese79209542010-11-26 15:45:34 +01001288 /*
1289 * Flush complete dcache, this is faster than flushing the
1290 * ranges for global_data and bd_info instead.
1291 */
1292 bl flush_dcache
Stefan Roese9b94ac62007-10-31 17:55:58 +01001293
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001294#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001295 /*
1296 * Undo the earlier data cache set-up for the primordial stack and
1297 * data area. First, invalidate the data cache and then disable data
1298 * cacheability for that area. Finally, restore the EBC values, if
1299 * any.
1300 */
1301
1302 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001303 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1304 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001305
Wolfgang Denk553f0982010-10-26 13:32:32 +02001306 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1307 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001308 add r4, r4, r3
1309
1310 bl invalidate_dcache_range
1311
1312 /* Disable cacheability for the region */
1313 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001314 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1315 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001316 and r3, r3, r4
1317 mtdccr r3
1318
1319 /* Restore the EBC parameters */
1320 li r3, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001321 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001322 lis r3, PBxAP_VAL@h
1323 ori r3, r3, PBxAP_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001324 mtdcr EBC0_CFGDATA, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001325
1326 li r3, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001327 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001328 lis r3, PBxCR_VAL@h
1329 ori r3, r3, PBxCR_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001330 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001331#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001332
1333 /* Restore registers */
1334 mr r3, r9
1335 mr r4, r10
1336 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001337#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesee02c5212008-01-09 10:23:16 +01001338
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001339#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesee02c5212008-01-09 10:23:16 +01001340 /*
1341 * Unlock the previously locked d-cache
1342 */
1343 msync
1344 isync
1345 /* set TFLOOR/NFLOOR to 0 again */
1346 lis r6,0x0001
1347 ori r6,r6,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001348 mtspr SPRN_DVLIM,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001349 lis r6,0x0000
1350 ori r6,r6,0x0000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001351 mtspr SPRN_DNV0,r6
1352 mtspr SPRN_DNV1,r6
1353 mtspr SPRN_DNV2,r6
1354 mtspr SPRN_DNV3,r6
1355 mtspr SPRN_DTV0,r6
1356 mtspr SPRN_DTV1,r6
1357 mtspr SPRN_DTV2,r6
1358 mtspr SPRN_DTV3,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001359 msync
1360 isync
Stefan Roesef3cac532010-08-31 11:27:14 +02001361
1362 /* Invalidate data cache, now no longer our stack */
1363 dccci 0,0
1364 sync
1365 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001366#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesee02c5212008-01-09 10:23:16 +01001367
Stefan Roesea4c8d132006-06-02 16:18:04 +02001368 /*
1369 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1370 * to speed up the boot process. Now this cache needs to be disabled.
1371 */
Stefan Roese4978e602010-05-27 16:45:20 +02001372#if defined(CONFIG_440)
Stefan Roese25fb4ea2008-11-20 11:46:20 +01001373 /* Clear all potential pending exceptions */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001374 mfspr r1,SPRN_MCSR
1375 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001376 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001377 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001378 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001379 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001380 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001381 isync
Stefan Roese4978e602010-05-27 16:45:20 +02001382#endif /* defined(CONFIG_440) */
wdenk0442ed82002-11-03 10:24:00 +00001383 mr r1, r3 /* Set new stack pointer */
1384 mr r9, r4 /* Save copy of Init Data pointer */
1385 mr r10, r5 /* Save copy of Destination Address */
1386
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001387 GET_GOT
wdenk0442ed82002-11-03 10:24:00 +00001388 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001389 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1390 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001391 lwz r5, GOT(__init_end)
1392 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001393 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001394
1395 /*
1396 * Fix GOT pointer:
1397 *
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001398 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001399 *
1400 * Offset:
1401 */
1402 sub r15, r10, r4
1403
1404 /* First our own GOT */
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001405 add r12, r12, r15
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001406 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001407 add r30, r30, r15
1408
1409 /*
1410 * Now relocate code
1411 */
1412
1413 cmplw cr1,r3,r4
1414 addi r0,r5,3
1415 srwi. r0,r0,2
1416 beq cr1,4f /* In place copy is not necessary */
1417 beq 7f /* Protect against 0 count */
1418 mtctr r0
1419 bge cr1,2f
1420
1421 la r8,-4(r4)
1422 la r7,-4(r3)
14231: lwzu r0,4(r8)
1424 stwu r0,4(r7)
1425 bdnz 1b
1426 b 4f
1427
14282: slwi r0,r0,2
1429 add r8,r4,r0
1430 add r7,r3,r0
14313: lwzu r0,-4(r8)
1432 stwu r0,-4(r7)
1433 bdnz 3b
1434
1435/*
1436 * Now flush the cache: note that we must start from a cache aligned
1437 * address. Otherwise we might miss one cache line.
1438 */
14394: cmpwi r6,0
1440 add r5,r3,r5
1441 beq 7f /* Always flush prefetch queue in any case */
1442 subi r0,r6,1
1443 andc r3,r3,r0
1444 mr r4,r3
14455: dcbst 0,r4
1446 add r4,r4,r6
1447 cmplw r4,r5
1448 blt 5b
1449 sync /* Wait for all dcbst to complete on bus */
1450 mr r4,r3
14516: icbi 0,r4
1452 add r4,r4,r6
1453 cmplw r4,r5
1454 blt 6b
14557: sync /* Wait for all icbi to complete on bus */
1456 isync
1457
1458/*
1459 * We are done. Do not return, instead branch to second part of board
1460 * initialization, now running from RAM.
1461 */
1462
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001463 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001464 mtlr r0
1465 blr /* NEVER RETURNS! */
1466
1467in_ram:
1468
1469 /*
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001470 * Relocation Function, r12 point to got2+0x8000
wdenk0442ed82002-11-03 10:24:00 +00001471 *
1472 * Adjust got2 pointers, no need to check for 0, this code
1473 * already puts a few entries in the table.
1474 */
1475 li r0,__got2_entries@sectoff@l
1476 la r3,GOT(_GOT2_TABLE_)
1477 lwz r11,GOT(_GOT2_TABLE_)
1478 mtctr r0
1479 sub r11,r3,r11
1480 addi r3,r3,-4
14811: lwzu r0,4(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001482 cmpwi r0,0
1483 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001484 add r0,r0,r11
1485 stw r0,0(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +020014862: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001487
1488 /*
1489 * Now adjust the fixups and the pointers to the fixups
1490 * in case we need to move ourselves again.
1491 */
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001492 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001493 lwz r3,GOT(_FIXUP_TABLE_)
1494 cmpwi r0,0
1495 mtctr r0
1496 addi r3,r3,-4
1497 beq 4f
14983: lwzu r4,4(r3)
1499 lwzux r0,r4,r11
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001500 cmpwi r0,0
wdenk0442ed82002-11-03 10:24:00 +00001501 add r0,r0,r11
Joakim Tjernlund34bbf612010-11-04 19:02:00 +01001502 stw r4,0(r3)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001503 beq- 5f
wdenk0442ed82002-11-03 10:24:00 +00001504 stw r0,0(r4)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +020015055: bdnz 3b
wdenk0442ed82002-11-03 10:24:00 +000015064:
1507clear_bss:
1508 /*
1509 * Now clear BSS segment
1510 */
wdenk5d232d02003-05-22 22:52:13 +00001511 lwz r3,GOT(__bss_start)
Simon Glass3929fb02013-03-14 06:54:53 +00001512 lwz r4,GOT(__bss_end)
wdenk0442ed82002-11-03 10:24:00 +00001513
1514 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001515 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001516
1517 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001518
1519 andi. r5, r4, 3
1520 beq 6f
1521 sub r4, r4, r5
1522 mtctr r5
1523 mr r5, r4
15245: stb r0, 0(r5)
1525 addi r5, r5, 1
1526 bdnz 5b
15276:
wdenk0442ed82002-11-03 10:24:00 +00001528 stw r0, 0(r3)
1529 addi r3, r3, 4
1530 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001531 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001532
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010015337:
wdenk0442ed82002-11-03 10:24:00 +00001534 mr r3, r9 /* Init Data pointer */
1535 mr r4, r10 /* Destination Address */
1536 bl board_init_r
1537
wdenk0442ed82002-11-03 10:24:00 +00001538 /*
1539 * Copy exception vector code to low memory
1540 *
1541 * r3: dest_addr
1542 * r7: source address, r8: end address, r9: target address
1543 */
1544 .globl trap_init
1545trap_init:
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001546 mflr r4 /* save link register */
1547 GET_GOT
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001548 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001549 lwz r8, GOT(_end_of_vectors)
1550
wdenk682011f2003-06-03 23:54:09 +00001551 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001552
1553 cmplw 0, r7, r8
1554 bgelr /* return if r7>=r8 - just in case */
wdenk0442ed82002-11-03 10:24:00 +000015551:
1556 lwz r0, 0(r7)
1557 stw r0, 0(r9)
1558 addi r7, r7, 4
1559 addi r9, r9, 4
1560 cmplw 0, r7, r8
1561 bne 1b
1562
1563 /*
1564 * relocate `hdlr' and `int_return' entries
1565 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001566 li r7, .L_MachineCheck - _start + _START_OFFSET
1567 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000015682:
1569 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001570 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001571 cmplw 0, r7, r8
1572 blt 2b
1573
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001574 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001575 bl trap_reloc
1576
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001577 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001578 bl trap_reloc
1579
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001580#ifdef CONFIG_440
1581 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001582 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001583
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001584 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001585 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001586
1587 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001588 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001589
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001590 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1591 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001592
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001593 li r7, .L_DataTLBError - _start + _START_OFFSET
1594 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001595#else /* CONFIG_440 */
1596 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001597 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001598
1599 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001600 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001601
1602 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001603 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001604#endif /* CONFIG_440 */
1605
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001606 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1607 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001608
Stefan Roese887e2ec2006-09-07 11:51:23 +02001609#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001610 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1611 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1612 mtmsr r7 /* change MSR */
1613#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001614 bl __440_msr_set
1615 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001616
Stefan Roese887e2ec2006-09-07 11:51:23 +02001617__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001618 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1619 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001620 mtspr SPRN_SRR1,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001621 mflr r7
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001622 mtspr SPRN_SRR0,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001623 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001624__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001625#endif
1626
wdenk0442ed82002-11-03 10:24:00 +00001627 mtlr r4 /* restore link register */
1628 blr
1629
Stefan Roesecf959c72007-06-01 15:27:11 +02001630#if defined(CONFIG_440)
1631/*----------------------------------------------------------------------------+
1632| dcbz_area.
1633+----------------------------------------------------------------------------*/
1634 function_prolog(dcbz_area)
1635 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001636 rlwinm r5,r4,27,5,31
1637 beq ..d_ra2
1638 addi r5,r5,0x0001
1639..d_ra2:mtctr r5
1640..d_ag2:dcbz r0,r3
1641 addi r3,r3,32
1642 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001643 sync
1644 blr
1645 function_epilog(dcbz_area)
Stefan Roesecf959c72007-06-01 15:27:11 +02001646#endif /* CONFIG_440 */
Stefan Roese887e2ec2006-09-07 11:51:23 +02001647#endif /* CONFIG_NAND_SPL */
stroeseb867d702003-05-23 11:18:02 +00001648
Stefan Roesecf959c72007-06-01 15:27:11 +02001649/*------------------------------------------------------------------------------- */
1650/* Function: in8 */
1651/* Description: Input 8 bits */
1652/*------------------------------------------------------------------------------- */
1653 .globl in8
1654in8:
1655 lbz r3,0x0000(r3)
1656 blr
1657
1658/*------------------------------------------------------------------------------- */
1659/* Function: out8 */
1660/* Description: Output 8 bits */
1661/*------------------------------------------------------------------------------- */
1662 .globl out8
1663out8:
1664 stb r4,0x0000(r3)
1665 blr
1666
1667/*------------------------------------------------------------------------------- */
1668/* Function: out32 */
1669/* Description: Output 32 bits */
1670/*------------------------------------------------------------------------------- */
1671 .globl out32
1672out32:
1673 stw r4,0x0000(r3)
1674 blr
1675
1676/*------------------------------------------------------------------------------- */
1677/* Function: in32 */
1678/* Description: Input 32 bits */
1679/*------------------------------------------------------------------------------- */
1680 .globl in32
1681in32:
1682 lwz 3,0x0000(3)
1683 blr
stroeseb867d702003-05-23 11:18:02 +00001684
1685/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001686/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001687/**************************************************************************/
1688#ifdef CONFIG_405EP
1689ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001690
Stefan Roesec157d8e2005-08-01 16:41:48 +02001691#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001692 /*
1693 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1694 * function) to support FPGA and NVRAM accesses below.
1695 */
1696
1697 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1698 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001699 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1700 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001701 stw r4,0(r3)
1702 lis r3,GPIO0_OSRL@h
1703 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001704 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1705 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001706 stw r4,0(r3)
1707
1708 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1709 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001710 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1711 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroeseb828dda2003-12-09 14:54:43 +00001712 stw r4,0(r3)
1713 lis r3,GPIO0_ISR1L@h
1714 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001715 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1716 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroeseb828dda2003-12-09 14:54:43 +00001717 stw r4,0(r3)
1718
1719 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1720 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001721 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1722 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001723 stw r4,0(r3)
1724 lis r3,GPIO0_TSRL@h
1725 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001726 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1727 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001728 stw r4,0(r3)
1729
1730 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1731 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001732 lis r4,CONFIG_SYS_GPIO0_TCR@h
1733 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroeseb828dda2003-12-09 14:54:43 +00001734 stw r4,0(r3)
1735
Stefan Roesed1c3b272009-09-09 16:25:29 +02001736 li r3,PB1AP /* program EBC bank 1 for RTC access */
1737 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001738 lis r3,CONFIG_SYS_EBC_PB1AP@h
1739 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001740 mtdcr EBC0_CFGDATA,r3
1741 li r3,PB1CR
1742 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001743 lis r3,CONFIG_SYS_EBC_PB1CR@h
1744 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001745 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001746
Stefan Roesed1c3b272009-09-09 16:25:29 +02001747 li r3,PB1AP /* program EBC bank 1 for RTC access */
1748 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001749 lis r3,CONFIG_SYS_EBC_PB1AP@h
1750 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001751 mtdcr EBC0_CFGDATA,r3
1752 li r3,PB1CR
1753 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001754 lis r3,CONFIG_SYS_EBC_PB1CR@h
1755 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001756 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001757
Stefan Roesed1c3b272009-09-09 16:25:29 +02001758 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1759 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001760 lis r3,CONFIG_SYS_EBC_PB4AP@h
1761 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001762 mtdcr EBC0_CFGDATA,r3
1763 li r3,PB4CR
1764 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001765 lis r3,CONFIG_SYS_EBC_PB4CR@h
1766 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001767 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001768#endif
1769
wdenk8bde7f72003-06-27 21:31:46 +00001770 /*
1771 !-----------------------------------------------------------------------
1772 ! Check to see if chip is in bypass mode.
1773 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1774 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001775 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1776 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001777 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001778 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001779 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001780 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001781 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001782
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001783 beq pll_done /* if SSCS =b'1' then PLL has */
1784 /* already been set */
1785 /* and CPU has been reset */
1786 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001787
Stefan Roesec157d8e2005-08-01 16:41:48 +02001788#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001789 /*
wdenk8bde7f72003-06-27 21:31:46 +00001790 !-----------------------------------------------------------------------
1791 ! Read NVRAM to get value to write in PLLMR.
1792 ! If value has not been correctly saved, write default value
1793 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1794 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1795 !
1796 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001797 ! structure in openbios.h. Changing the beginning of
1798 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001799 !
1800 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001801 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001802 addis r3,0,NVRAM_BASE@h
1803 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001804
Wolfgang Denkf901a832005-08-06 01:42:58 +02001805 lwz r4, 0(r3)
1806 addis r5,0,NVRVFY1@h
1807 addi r5,r5,NVRVFY1@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001808 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001809 bne ..no_pllset
1810 addi r3,r3,4
1811 lwz r4, 0(r3)
1812 addis r5,0,NVRVFY2@h
1813 addi r5,r5,NVRVFY2@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001814 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001815 bne ..no_pllset
1816 addi r3,r3,8 /* Skip over conf_size */
1817 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1818 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1819 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1820 cmpi cr0,0,r5,1 /* See if PLL is locked */
1821 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001822..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001823#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001824
John Otkend4024bb2007-07-26 17:49:11 +02001825#ifdef CONFIG_TAIHU
1826 mfdcr r4, CPC0_BOOT
1827 andi. r5, r4, CPC0_BOOT_SEP@l
1828 bne strap_1 /* serial eeprom present */
1829 addis r5,0,CPLD_REG0_ADDR@h
1830 ori r5,r5,CPLD_REG0_ADDR@l
1831 andi. r5, r5, 0x10
1832 bne _pci_66mhz
1833#endif /* CONFIG_TAIHU */
1834
Stefan Roese779e9752007-08-14 14:44:41 +02001835#if defined(CONFIG_ZEUS)
1836 mfdcr r4, CPC0_BOOT
1837 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001838 bne strap_1 /* serial eeprom present */
Stefan Roese779e9752007-08-14 14:44:41 +02001839 lis r3,0x0000
1840 addi r3,r3,0x3030
1841 lis r4,0x8042
1842 addi r4,r4,0x223e
1843 b 1f
1844strap_1:
1845 mfdcr r3, CPC0_PLLMR0
1846 mfdcr r4, CPC0_PLLMR1
1847 b 1f
1848#endif
1849
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001850 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1851 ori r3,r3,PLLMR0_DEFAULT@l /* */
1852 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1853 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001854
John Otkend4024bb2007-07-26 17:49:11 +02001855#ifdef CONFIG_TAIHU
1856 b 1f
1857_pci_66mhz:
1858 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1859 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1860 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1861 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1862 b 1f
1863strap_1:
1864 mfdcr r3, CPC0_PLLMR0
1865 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001866#endif /* CONFIG_TAIHU */
1867
Stefan Roese779e9752007-08-14 14:44:41 +020018681:
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001869 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001870
1871pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001872 /*
1873 !-----------------------------------------------------------------------
1874 ! Clear Soft Reset Register
1875 ! This is needed to enable PCI if not booting from serial EPROM
1876 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001877 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001878 addi r3, 0, 0x0
1879 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001880
Wolfgang Denkf901a832005-08-06 01:42:58 +02001881 addis r3,0,0x0010
1882 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001883pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001884 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001885
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001886 blr /* return to main code */
stroeseb867d702003-05-23 11:18:02 +00001887
1888/*
1889!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02001890! Function: pll_write
1891! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1892! That is:
1893! 1. Pll is first disabled (de-activated by putting in bypass mode)
1894! 2. PLL is reset
1895! 3. Clock dividers are set while PLL is held in reset and bypassed
1896! 4. PLL Reset is cleared
1897! 5. Wait 100us for PLL to lock
1898! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00001899! Input: r3 = Value to write to CPC0_PLLMR0
1900! Input: r4 = Value to write to CPC0_PLLMR1
1901! Output r3 = none
1902!-----------------------------------------------------------------------------
1903*/
Matthias Fuchs0580e482009-07-06 16:27:33 +02001904 .globl pll_write
stroeseb867d702003-05-23 11:18:02 +00001905pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00001906 mfdcr r5, CPC0_UCR
1907 andis. r5,r5,0xFFFF
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001908 ori r5,r5,0x0101 /* Stop the UART clocks */
1909 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00001910
wdenk8bde7f72003-06-27 21:31:46 +00001911 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001912 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001913 mtdcr CPC0_PLLMR1,r5
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001914 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001915 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001916
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001917 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1918 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1919 oris r5,r5,0x4000 /* Set PLL Reset */
1920 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1921 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001922 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001923
1924 /*
wdenk8bde7f72003-06-27 21:31:46 +00001925 ! Wait min of 100us for PLL to lock.
1926 ! See CMOS 27E databook for more info.
1927 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00001928 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001929 addi r3,0,20000 /* 2000 = 0x4e20 */
1930 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001931pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001932 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00001933
Wolfgang Denkf901a832005-08-06 01:42:58 +02001934 oris r5,r5,0x8000 /* Enable PLL */
1935 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00001936
wdenk8bde7f72003-06-27 21:31:46 +00001937 /*
1938 * Reset CPU to guarantee timings are OK
1939 * Not sure if this is needed...
1940 */
1941 addis r3,0,0x1000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001942 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001943 /* execution will continue from the poweron */
1944 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00001945#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01001946
1947#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01001948/*----------------------------------------------------------------------------+
1949| mttlb3.
1950+----------------------------------------------------------------------------*/
1951 function_prolog(mttlb3)
1952 TLBWE(4,3,2)
1953 blr
1954 function_epilog(mttlb3)
1955
1956/*----------------------------------------------------------------------------+
1957| mftlb3.
1958+----------------------------------------------------------------------------*/
1959 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01001960 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01001961 blr
1962 function_epilog(mftlb3)
1963
1964/*----------------------------------------------------------------------------+
1965| mttlb2.
1966+----------------------------------------------------------------------------*/
1967 function_prolog(mttlb2)
1968 TLBWE(4,3,1)
1969 blr
1970 function_epilog(mttlb2)
1971
1972/*----------------------------------------------------------------------------+
1973| mftlb2.
1974+----------------------------------------------------------------------------*/
1975 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01001976 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01001977 blr
1978 function_epilog(mftlb2)
1979
1980/*----------------------------------------------------------------------------+
1981| mttlb1.
1982+----------------------------------------------------------------------------*/
1983 function_prolog(mttlb1)
1984 TLBWE(4,3,0)
1985 blr
1986 function_epilog(mttlb1)
1987
1988/*----------------------------------------------------------------------------+
1989| mftlb1.
1990+----------------------------------------------------------------------------*/
1991 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01001992 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01001993 blr
1994 function_epilog(mftlb1)
1995#endif /* CONFIG_440 */
Stefan Roese64852d02008-06-02 14:35:44 +02001996
1997#if defined(CONFIG_NAND_SPL)
1998/*
1999 * void nand_boot_relocate(dst, src, bytes)
2000 *
2001 * r3 = Destination address to copy code to (in SDRAM)
2002 * r4 = Source address to copy code from
2003 * r5 = size to copy in bytes
2004 */
2005nand_boot_relocate:
2006 mr r6,r3
2007 mr r7,r4
2008 mflr r8
2009
2010 /*
2011 * Copy SPL from icache into SDRAM
2012 */
2013 subi r3,r3,4
2014 subi r4,r4,4
2015 srwi r5,r5,2
2016 mtctr r5
2017..spl_loop:
2018 lwzu r0,4(r4)
2019 stwu r0,4(r3)
2020 bdnz ..spl_loop
2021
2022 /*
2023 * Calculate "corrected" link register, so that we "continue"
2024 * in execution in destination range
2025 */
2026 sub r3,r7,r6 /* r3 = src - dst */
2027 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2028 mtlr r8
2029 blr
2030
2031nand_boot_common:
2032 /*
2033 * First initialize SDRAM. It has to be available *before* calling
2034 * nand_boot().
2035 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002036 lis r3,CONFIG_SYS_SDRAM_BASE@h
2037 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002038 bl initdram
2039
2040 /*
2041 * Now copy the 4k SPL code into SDRAM and continue execution
2042 * from there.
2043 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002044 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2045 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2046 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2047 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2048 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2049 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002050 bl nand_boot_relocate
2051
2052 /*
2053 * We're running from SDRAM now!!!
2054 *
2055 * It is necessary for 4xx systems to relocate from running at
2056 * the original location (0xfffffxxx) to somewhere else (SDRAM
2057 * preferably). This is because CS0 needs to be reconfigured for
2058 * NAND access. And we can't reconfigure this CS when currently
2059 * "running" from it.
2060 */
2061
2062 /*
2063 * Finally call nand_boot() to load main NAND U-Boot image from
2064 * NAND and jump to it.
2065 */
2066 bl nand_boot /* will not return */
2067#endif /* CONFIG_NAND_SPL */