blob: 57ae1d38206288697e3aedc92ab0d5fcb332bd83 [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 Roese98f99e92013-04-02 10:37:04 +0200235#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD)
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
Stefan Roese98f99e92013-04-02 10:37:04 +0200251#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL) && \
252 !defined(CONFIG_SPL_BUILD)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200253 /*
254 * NAND U-Boot image is started from offset 0
255 */
256 .text
Stefan Roesec440bfe2007-06-06 11:42:13 +0200257#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200258 bl reconfig_tlb0
Stefan Roesec440bfe2007-06-06 11:42:13 +0200259#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200260 GET_GOT
261 bl cpu_init_f /* run low-level CPU init code (from Flash) */
262 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500263 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200264#endif
wdenk0442ed82002-11-03 10:24:00 +0000265
Ricardo Ribalda Delgadod20b9992010-12-07 14:27:56 +0100266#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_BOOT_FROM_XMD)
Stefan Roesed8731332009-05-11 13:46:14 +0200267 /*
268 * 4xx RAM-booting U-Boot image is started from offset 0
269 */
270 .text
271 bl _start_440
272#endif
273
Stefan Roese98f99e92013-04-02 10:37:04 +0200274#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
275 /*
276 * This is the entry of the real U-Boot from a board port
277 * that supports SPL booting on the PPC4xx. We only need
278 * to call board_init_f() here. Everything else has already
279 * been done in the SPL u-boot version.
280 */
281 GET_GOT /* initialize GOT access */
282 bl board_init_f /* run 1st part of board init code (in Flash)*/
283 /* NOTREACHED - board_init_f() does not return */
284#endif
285
wdenk0442ed82002-11-03 10:24:00 +0000286/*
287 * 440 Startup -- on reset only the top 4k of the effective
288 * address space is mapped in by an entry in the instruction
289 * and data shadow TLB. The .bootpg section is located in the
290 * top 4k & does only what's necessary to map in the the rest
291 * of the boot rom. Once the boot rom is mapped in we can
292 * proceed with normal startup.
293 *
294 * NOTE: CS0 only covers the top 2MB of the effective address
295 * space after reset.
296 */
297
298#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200299#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000300 .section .bootpg,"ax"
Stefan Roese887e2ec2006-09-07 11:51:23 +0200301#endif
wdenk0442ed82002-11-03 10:24:00 +0000302 .globl _start_440
303
304/**************************************************************************/
305_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200306 /*--------------------------------------------------------------------+
307 | 440EPX BUP Change - Hardware team request
308 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200309#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
310 sync
311 nop
312 nop
313#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200314 /*----------------------------------------------------------------+
315 | Core bug fix. Clear the esr
316 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200317 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200318 mtspr SPRN_ESR,r0
wdenk0442ed82002-11-03 10:24:00 +0000319 /*----------------------------------------------------------------*/
320 /* Clear and set up some registers. */
321 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200322 iccci r0,r0 /* NOTE: operands not used for 440 */
323 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000324 sync
325 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200326 mtspr SPRN_SRR0,r0
327 mtspr SPRN_SRR1,r0
328 mtspr SPRN_CSRR0,r0
329 mtspr SPRN_CSRR1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200330 /* NOTE: 440GX adds machine check status regs */
331#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200332 mtspr SPRN_MCSRR0,r0
333 mtspr SPRN_MCSRR1,r0
334 mfspr r1,SPRN_MCSR
335 mtspr SPRN_MCSR,r1
wdenkba56f622004-02-06 23:19:44 +0000336#endif
Stefan Roese20532832006-11-22 13:20:50 +0100337
338 /*----------------------------------------------------------------*/
339 /* CCR0 init */
340 /*----------------------------------------------------------------*/
341 /* Disable store gathering & broadcast, guarantee inst/data
342 * cache block touch, force load/store alignment
343 * (see errata 1.12: 440_33)
344 */
345 lis r1,0x0030 /* store gathering & broadcast disable */
346 ori r1,r1,0x6000 /* cache touch */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200347 mtspr SPRN_CCR0,r1
Stefan Roese20532832006-11-22 13:20:50 +0100348
wdenk0442ed82002-11-03 10:24:00 +0000349 /*----------------------------------------------------------------*/
350 /* Initialize debug */
351 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200352 mfspr r1,SPRN_DBCR0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200353 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
354 bne skip_debug_init /* if set, don't clear debug register */
Victor Gallardoad876ff2010-09-16 11:32:04 -0700355 mfspr r1,SPRN_CCR0
356 ori r1,r1,CCR0_DTB@l /* Disable Trace Broadcast */
357 mtspr SPRN_CCR0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200358 mtspr SPRN_DBCR0,r0
359 mtspr SPRN_DBCR1,r0
360 mtspr SPRN_DBCR2,r0
361 mtspr SPRN_IAC1,r0
362 mtspr SPRN_IAC2,r0
363 mtspr SPRN_IAC3,r0
364 mtspr SPRN_DAC1,r0
365 mtspr SPRN_DAC2,r0
366 mtspr SPRN_DVC1,r0
367 mtspr SPRN_DVC2,r0
wdenk0442ed82002-11-03 10:24:00 +0000368
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200369 mfspr r1,SPRN_DBSR
370 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200371skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000372
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200373#if defined (CONFIG_440SPE)
374 /*----------------------------------------------------------------+
375 | Initialize Core Configuration Reg1.
376 | a. ICDPEI: Record even parity. Normal operation.
377 | b. ICTPEI: Record even parity. Normal operation.
378 | c. DCTPEI: Record even parity. Normal operation.
379 | d. DCDPEI: Record even parity. Normal operation.
380 | e. DCUPEI: Record even parity. Normal operation.
381 | f. DCMPEI: Record even parity. Normal operation.
382 | g. FCOM: Normal operation
383 | h. MMUPEI: Record even parity. Normal operation.
384 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200385 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200386 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200387 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200388 mtspr SPRN_CCR1, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200389
390 /*----------------------------------------------------------------+
391 | Reset the timebase.
392 | The previous write to CCR1 sets the timebase source.
393 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200394 mtspr SPRN_TBWL, r0
395 mtspr SPRN_TBWU, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200396#endif
397
wdenk0442ed82002-11-03 10:24:00 +0000398 /*----------------------------------------------------------------*/
399 /* Setup interrupt vectors */
400 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200401 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200402 li r1,0x0100
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200403 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200404 li r1,0x0200
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200405 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200406 li r1,0x0300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200407 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200408 li r1,0x0400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200409 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000410 li r1,0x0500
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200411 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000412 li r1,0x0600
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200413 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000414 li r1,0x0700
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200415 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000416 li r1,0x0800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200417 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000418 li r1,0x0c00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200419 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200420 li r1,0x0a00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200421 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200422 li r1,0x0900
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200423 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000424 li r1,0x1300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200425 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200426 li r1,0x1400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200427 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000428 li r1,0x2000
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200429 mtspr SPRN_IVOR15,r1 /* Debug */
wdenk0442ed82002-11-03 10:24:00 +0000430
431 /*----------------------------------------------------------------*/
432 /* Configure cache regions */
433 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200434 mtspr SPRN_INV0,r0
435 mtspr SPRN_INV1,r0
436 mtspr SPRN_INV2,r0
437 mtspr SPRN_INV3,r0
438 mtspr SPRN_DNV0,r0
439 mtspr SPRN_DNV1,r0
440 mtspr SPRN_DNV2,r0
441 mtspr SPRN_DNV3,r0
442 mtspr SPRN_ITV0,r0
443 mtspr SPRN_ITV1,r0
444 mtspr SPRN_ITV2,r0
445 mtspr SPRN_ITV3,r0
446 mtspr SPRN_DTV0,r0
447 mtspr SPRN_DTV1,r0
448 mtspr SPRN_DTV2,r0
449 mtspr SPRN_DTV3,r0
wdenk0442ed82002-11-03 10:24:00 +0000450
451 /*----------------------------------------------------------------*/
452 /* Cache victim limits */
453 /*----------------------------------------------------------------*/
454 /* floors 0, ceiling max to use the entire cache -- nothing locked
455 */
456 lis r1,0x0001
457 ori r1,r1,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200458 mtspr SPRN_IVLIM,r1
459 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000460
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200461 /*----------------------------------------------------------------+
462 |Initialize MMUCR[STID] = 0.
463 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200464 mfspr r0,SPRN_MMUCR
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200465 addis r1,0,0xFFFF
466 ori r1,r1,0xFF00
467 and r0,r0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200468 mtspr SPRN_MMUCR,r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200469
wdenk0442ed82002-11-03 10:24:00 +0000470 /*----------------------------------------------------------------*/
471 /* Clear all TLB entries -- TID = 0, TS = 0 */
472 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200473 addis r0,0,0x0000
Stefan Roese0a371ca2009-07-14 15:53:08 +0200474#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesed8731332009-05-11 13:46:14 +0200475 li r4,0 /* Start with TLB #0 */
Stefan Roese0a371ca2009-07-14 15:53:08 +0200476#else
477 li r4,1 /* Start with TLB #1 */
478#endif
479 li r1,64 /* 64 TLB entries */
480 sub r1,r1,r4 /* calculate last TLB # */
481 mtctr r1
Stefan Roesed8731332009-05-11 13:46:14 +0200482rsttlb:
483#ifdef CONFIG_SYS_RAMBOOT
484 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
485 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
486 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
487#endif
488 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
489 tlbwe r0,r4,1
490 tlbwe r0,r4,2
491tlbnxt: addi r4,r4,1 /* Next TLB */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200492 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000493
494 /*----------------------------------------------------------------*/
495 /* TLB entry setup -- step thru tlbtab */
496 /*----------------------------------------------------------------*/
Stefan Roese2a72e9e2010-04-09 14:03:59 +0200497#if defined(CONFIG_440SPE_REVA)
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200498 /*----------------------------------------------------------------*/
499 /* We have different TLB tables for revA and rev B of 440SPe */
500 /*----------------------------------------------------------------*/
501 mfspr r1, PVR
502 lis r0,0x5342
503 ori r0,r0,0x1891
504 cmpw r7,r1,r0
505 bne r7,..revA
506 bl tlbtabB
507 b ..goon
508..revA:
509 bl tlbtabA
510..goon:
511#else
wdenk0442ed82002-11-03 10:24:00 +0000512 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200513#endif
wdenk0442ed82002-11-03 10:24:00 +0000514 mr r5,r0
515 li r1,0x003f /* 64 TLB entries max */
516 mtctr r1
517 li r4,0 /* TLB # */
518
519 addi r5,r5,-4
Stefan Roesed8731332009-05-11 13:46:14 +02005201:
521#ifdef CONFIG_SYS_RAMBOOT
522 tlbre r3,r4,0 /* Read contents from TLB word #0 */
523 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
524 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
525#endif
526 lwzu r0,4(r5)
wdenk0442ed82002-11-03 10:24:00 +0000527 cmpwi r0,0
528 beq 2f /* 0 marks end */
529 lwzu r1,4(r5)
530 lwzu r2,4(r5)
531 tlbwe r0,r4,0 /* TLB Word 0 */
532 tlbwe r1,r4,1 /* TLB Word 1 */
533 tlbwe r2,r4,2 /* TLB Word 2 */
Stefan Roesed8731332009-05-11 13:46:14 +0200534tlbnx2: addi r4,r4,1 /* Next TLB */
wdenk0442ed82002-11-03 10:24:00 +0000535 bdnz 1b
536
537 /*----------------------------------------------------------------*/
538 /* Continue from 'normal' start */
539 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02005402:
Stefan Roese887e2ec2006-09-07 11:51:23 +0200541 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000542 b _start
543
5443: li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200545 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
wdenk0442ed82002-11-03 10:24:00 +0000546 mflr r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200547 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000548 rfi
stroeseb867d702003-05-23 11:18:02 +0000549#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000550
551/*
552 * r3 - 1st arg to board_init(): IMMP pointer
553 * r4 - 2nd arg to board_init(): boot flag
554 */
Stefan Roese98f99e92013-04-02 10:37:04 +0200555#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +0000556 .text
557 .long 0x27051956 /* U-Boot Magic Number */
558 .globl version_string
559version_string:
Andreas Bießmann09c2e902011-07-18 20:24:04 +0200560 .ascii U_BOOT_VERSION_STRING, "\0"
wdenk0442ed82002-11-03 10:24:00 +0000561
wdenk0442ed82002-11-03 10:24:00 +0000562 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200563 .globl _start_of_vectors
564_start_of_vectors:
565
566/* Critical input. */
567 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
568
569#ifdef CONFIG_440
570/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200571 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200572#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200573 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200574#endif /* CONFIG_440 */
575
576/* Data Storage exception. */
577 STD_EXCEPTION(0x300, DataStorage, UnknownException)
578
579/* Instruction Storage exception. */
580 STD_EXCEPTION(0x400, InstStorage, UnknownException)
581
582/* External Interrupt exception. */
583 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
584
585/* Alignment exception. */
586 . = 0x600
587Alignment:
588 EXCEPTION_PROLOG(SRR0, SRR1)
589 mfspr r4,DAR
590 stw r4,_DAR(r21)
591 mfspr r5,DSISR
592 stw r5,_DSISR(r21)
593 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100594 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200595
596/* Program check exception */
597 . = 0x700
598ProgramCheck:
599 EXCEPTION_PROLOG(SRR0, SRR1)
600 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100601 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
602 MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200603
604#ifdef CONFIG_440
605 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
606 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
607 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200608#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200609 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
610
611#ifdef CONFIG_440
612 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
613 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
614#else
615 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
616 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
617 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
618#endif
619 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
620
621 .globl _end_of_vectors
622_end_of_vectors:
623 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200624#endif
wdenk0442ed82002-11-03 10:24:00 +0000625 .globl _start
626_start:
627
Stefan Roese98f99e92013-04-02 10:37:04 +0200628#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
629 /*
630 * This is the entry of the real U-Boot from a board port
631 * that supports SPL booting on the PPC4xx. We only need
632 * to call board_init_f() here. Everything else has already
633 * been done in the SPL u-boot version.
634 */
635 GET_GOT /* initialize GOT access */
636 bl board_init_f /* run 1st part of board init code (in Flash)*/
637 /* NOTREACHED - board_init_f() does not return */
638#endif
639
wdenk0442ed82002-11-03 10:24:00 +0000640/*****************************************************************************/
641#if defined(CONFIG_440)
642
643 /*----------------------------------------------------------------*/
644 /* Clear and set up some registers. */
645 /*----------------------------------------------------------------*/
646 li r0,0x0000
647 lis r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200648 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
649 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
650 mtspr SPRN_TBWU,r0
651 mtspr SPRN_TSR,r1 /* clear all timer exception status */
652 mtspr SPRN_TCR,r0 /* disable all */
653 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
wdenk0442ed82002-11-03 10:24:00 +0000654 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000655
656 /*----------------------------------------------------------------*/
657 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200658 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000659 /* value you need in this case 0x8cff 0000 should do the trick */
660 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200661#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000662 lis r1,0xffff
663 ori r1,r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200664 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200665 lis r0,CONFIG_SYS_INIT_DBCR@h
666 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200667 mtspr SPRN_DBCR0,r0
wdenk0442ed82002-11-03 10:24:00 +0000668 isync
669#endif
670
671 /*----------------------------------------------------------------*/
672 /* Setup the internal SRAM */
673 /*----------------------------------------------------------------*/
674 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200675
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200676#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200677 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200678 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
679 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
Wolfgang Denk553f0982010-10-26 13:32:32 +0200680 addis r4,r0,CONFIG_SYS_INIT_RAM_SIZE@h
681 ori r4,r4,CONFIG_SYS_INIT_RAM_SIZE@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200682 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200683 rlwinm r5,r4,27,5,31
684 beq ..d_ran
685 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200686..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200687 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200688..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200689 dcbz r0,r3
690 addi r3,r3,32
691 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100692
693 /*
694 * Lock the init-ram/stack in d-cache, so that other regions
695 * may use d-cache as well
696 * Note, that this current implementation locks exactly 4k
697 * of d-cache, so please make sure that you don't define a
698 * bigger init-ram area. Take a look at the lwmon5 440EPx
699 * implementation as a reference.
700 */
701 msync
702 isync
703 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
704 lis r1,0x0201
705 ori r1,r1,0xf808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200706 mtspr SPRN_DVLIM,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100707 lis r1,0x0808
708 ori r1,r1,0x0808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200709 mtspr SPRN_DNV0,r1
710 mtspr SPRN_DNV1,r1
711 mtspr SPRN_DNV2,r1
712 mtspr SPRN_DNV3,r1
713 mtspr SPRN_DTV0,r1
714 mtspr SPRN_DTV1,r1
715 mtspr SPRN_DTV2,r1
716 mtspr SPRN_DTV3,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100717 msync
718 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200719#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200720
721 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
722#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
723 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100724#if defined(CONFIG_440GX) || \
725 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan7d307932008-07-08 22:47:31 -0700726 defined(CONFIG_460SX)
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600727 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700728#elif defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
729 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600730 lis r1, 0x0000
731 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
732 mtdcr L2_CACHE_CFG,r1
wdenkba56f622004-02-06 23:19:44 +0000733#endif
wdenk0442ed82002-11-03 10:24:00 +0000734
Stefan Roese887e2ec2006-09-07 11:51:23 +0200735 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000736 ori r2,r2,0xffff
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600737 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000738 and r1,r1,r2 /* Disable parity check */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600739 mtdcr ISRAM0_DPC,r1
740 mfdcr r1,ISRAM0_PMEG
Stefan Roese887e2ec2006-09-07 11:51:23 +0200741 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600742 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000743
744 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100745#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000746 ori r1,r1,0x0980 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600747 mtdcr ISRAM0_SB0CR,r1
wdenkba56f622004-02-06 23:19:44 +0000748 lis r1,0x8001
749 ori r1,r1,0x0980 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600750 mtdcr ISRAM0_SB1CR,r1
wdenkba56f622004-02-06 23:19:44 +0000751 lis r1, 0x8002
752 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600753 mtdcr ISRAM0_SB2CR,r1
wdenkba56f622004-02-06 23:19:44 +0000754 lis r1, 0x8003
755 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600756 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700757#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || \
758 defined(CONFIG_460GT) || defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600759 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200760 ori r1,r1,0x0984 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600761 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200762 lis r1,0x0001
763 ori r1,r1,0x0984 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600764 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200765 lis r1, 0x0002
766 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600767 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200768 lis r1, 0x0003
769 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600770 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700771#if defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
772 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600773 lis r2,0x7fff
774 ori r2,r2,0xffff
775 mfdcr r1,ISRAM1_DPC
776 and r1,r1,r2 /* Disable parity check */
Wolfgang Denk455ae7e2008-12-16 01:02:17 +0100777 mtdcr ISRAM1_DPC,r1
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600778 mfdcr r1,ISRAM1_PMEG
779 and r1,r1,r2 /* Disable pwr mgmt */
780 mtdcr ISRAM1_PMEG,r1
781
782 lis r1,0x0004 /* BAS = 4_0004_0000 */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700783 ori r1,r1,ISRAM1_SIZE /* ocm size */
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600784 mtdcr ISRAM1_SB0CR,r1
785#endif
Feng Kan7d307932008-07-08 22:47:31 -0700786#elif defined(CONFIG_460SX)
787 lis r1,0x0000 /* BAS = 0000_0000 */
788 ori r1,r1,0x0B84 /* first 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600789 mtdcr ISRAM0_SB0CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700790 lis r1,0x0001
791 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600792 mtdcr ISRAM0_SB1CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700793 lis r1, 0x0002
794 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600795 mtdcr ISRAM0_SB2CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700796 lis r1, 0x0003
797 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600798 mtdcr ISRAM0_SB3CR,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200799#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000800 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600801 mtdcr ISRAM0_SB0CR,r1
802 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
wdenkba56f622004-02-06 23:19:44 +0000803#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200804#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000805
806 /*----------------------------------------------------------------*/
807 /* Setup the stack in internal SRAM */
808 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200809 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
810 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000811 li r0,0
812 stwu r0,-4(r1)
813 stwu r0,-4(r1) /* Terminate call chain */
814
815 stwu r1,-8(r1) /* Save back chain and move SP */
816 lis r0,RESET_VECTOR@h /* Address of reset vector */
817 ori r0,r0, RESET_VECTOR@l
818 stwu r1,-8(r1) /* Save back chain and move SP */
819 stw r0,+12(r1) /* Save return addr (underflow vect) */
Wolfgang Denk8c4734e2011-04-20 22:11:21 +0200820
Stefan Roese887e2ec2006-09-07 11:51:23 +0200821#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +0200822 bl nand_boot_common /* will not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200823#else
Stefan Roese98f99e92013-04-02 10:37:04 +0200824#ifndef CONFIG_SPL_BUILD
wdenk0442ed82002-11-03 10:24:00 +0000825 GET_GOT
Stefan Roese98f99e92013-04-02 10:37:04 +0200826#endif
Stefan Roese5568e612005-11-22 13:20:42 +0100827
828 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000829 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500830 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200831#endif
wdenk0442ed82002-11-03 10:24:00 +0000832
833#endif /* CONFIG_440 */
834
835/*****************************************************************************/
Stefan Roesee01bd212007-03-21 13:38:59 +0100836#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
837 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200838 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000839 /*----------------------------------------------------------------------- */
840 /* Clear and set up some registers. */
841 /*----------------------------------------------------------------------- */
842 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200843#if !defined(CONFIG_405EX)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200844 mtspr SPRN_SGR,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200845#else
846 /*
847 * On 405EX, completely clearing the SGR leads to PPC hangup
848 * upon PCIe configuration access. The PCIe memory regions
849 * need to be guarded!
850 */
851 lis r3,0x0000
852 ori r3,r3,0x7FFC
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200853 mtspr SPRN_SGR,r3
Stefan Roesedbbd1252007-10-05 17:10:59 +0200854#endif
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200855 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000856 mtesr r4 /* clear Exception Syndrome Reg */
857 mttcr r4 /* clear Timer Control Reg */
858 mtxer r4 /* clear Fixed-Point Exception Reg */
859 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000860 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
861 /* dbsr is cleared by setting bits to 1) */
862 mtdbsr r4 /* clear/reset the dbsr */
863
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700864 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000865 bl invalidate_icache
866 bl invalidate_dcache
867
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700868 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200869 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
870 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700871 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000872 isync
873
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700874 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200875 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
876 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700877 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000878
Ricardo Ribalda Delgado1f4d5322008-10-21 18:29:46 +0200879#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
880 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000881 /*----------------------------------------------------------------------- */
882 /* Tune the speed and size for flash CS0 */
883 /*----------------------------------------------------------------------- */
884 bl ext_bus_cntlr_init
885#endif
Stefan Roese64852d02008-06-02 14:35:44 +0200886
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200887#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roesedbbd1252007-10-05 17:10:59 +0200888 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700889 * For boards that don't have OCM and can't use the data cache
890 * for their primordial stack, setup stack here directly after the
891 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roesedbbd1252007-10-05 17:10:59 +0200892 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200893 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
894 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200895
896 li r0, 0 /* Make room for stack frame header and */
897 stwu r0, -4(r1) /* clear final stack frame so that */
898 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
899 /*
900 * Set up a dummy frame to store reset vector as return address.
901 * this causes stack underflow to reset board.
902 */
903 stwu r1, -8(r1) /* Save back chain and move SP */
904 lis r0, RESET_VECTOR@h /* Address of reset vector */
905 ori r0, r0, RESET_VECTOR@l
906 stwu r1, -8(r1) /* Save back chain and move SP */
907 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200908#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000909
stroeseb867d702003-05-23 11:18:02 +0000910#if defined(CONFIG_405EP)
911 /*----------------------------------------------------------------------- */
912 /* DMA Status, clear to come up clean */
913 /*----------------------------------------------------------------------- */
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200914 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200915 ori r3,r3, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200916 mtdcr DMASR, r3
stroeseb867d702003-05-23 11:18:02 +0000917
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200918 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +0000919#endif /* CONFIG_405EP */
920
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200921#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +0100922#if defined(CONFIG_405EZ)
923 /********************************************************************
924 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
925 *******************************************************************/
926 /*
927 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200928 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roesee01bd212007-03-21 13:38:59 +0100929 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200930 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
931 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200932 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200933 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +0100934 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200935 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +0100936 isync
937
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
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200940 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200941 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
942 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +0100943 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200944 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
945 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200946 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200947 mtdcr OCM0_DISDPC,r3
Stefan Roesee01bd212007-03-21 13:38:59 +0100948
949 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +0100950#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000951 /********************************************************************
952 * Setup OCM - On Chip Memory
953 *******************************************************************/
954 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +0000955 lis r0, 0x7FFF
956 ori r0, r0, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200957 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
958 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +0100959 and r3, r3, r0 /* disable data-side IRAM */
960 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200961 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
962 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +0000963 isync
wdenk0442ed82002-11-03 10:24:00 +0000964
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200965 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
966 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200967 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +0000968 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200969 mtdcr OCM0_DSCNTL, r4
wdenk8bde7f72003-06-27 21:31:46 +0000970 isync
Stefan Roesee01bd212007-03-21 13:38:59 +0100971#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000972#endif
973
974 /*----------------------------------------------------------------------- */
975 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
976 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200977#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700978 li r4, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +0200979 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200980 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
981 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200982 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000983
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700984 addi r4, 0, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +0200985 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200986 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
987 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200988 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000989
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700990 /*
991 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200992 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700993 */
994 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200995 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
996 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +0000997 mtdccr r4
998
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700999 /*
1000 * Preallocate data cache lines to be used to avoid a subsequent
1001 * cache miss and an ensuing machine check exception when exceptions
1002 * are enabled.
1003 */
1004 li r0, 0
wdenk0442ed82002-11-03 10:24:00 +00001005
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001006 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1007 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001008
Wolfgang Denk553f0982010-10-26 13:32:32 +02001009 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1010 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001011
1012 /*
1013 * Convert the size, in bytes, to the number of cache lines/blocks
1014 * to preallocate.
1015 */
1016 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1017 srwi r5, r4, L1_CACHE_SHIFT
1018 beq ..load_counter
1019 addi r5, r5, 0x0001
1020..load_counter:
1021 mtctr r5
1022
1023 /* Preallocate the computed number of cache blocks. */
1024..alloc_dcache_block:
1025 dcba r0, r3
1026 addi r3, r3, L1_CACHE_BYTES
1027 bdnz ..alloc_dcache_block
1028 sync
1029
1030 /*
1031 * Load the initial stack pointer and data area and convert the size,
1032 * in bytes, to the number of words to initialize to a known value.
1033 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001034 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1035 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001036
Wolfgang Denk553f0982010-10-26 13:32:32 +02001037 lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h
1038 ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001039 mtctr r4
1040
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001041 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
Wolfgang Denk553f0982010-10-26 13:32:32 +02001042 ori r2, r2, CONFIG_SYS_INIT_RAM_SIZE@l
wdenk0442ed82002-11-03 10:24:00 +00001043
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001044 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1045 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001046
1047..stackloop:
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001048 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001049 bdnz ..stackloop
1050
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001051 /*
1052 * Make room for stack frame header and clear final stack frame so
1053 * that stack backtraces terminate cleanly.
1054 */
1055 stwu r0, -4(r1)
1056 stwu r0, -4(r1)
1057
wdenk0442ed82002-11-03 10:24:00 +00001058 /*
1059 * Set up a dummy frame to store reset vector as return address.
1060 * this causes stack underflow to reset board.
1061 */
1062 stwu r1, -8(r1) /* Save back chain and move SP */
1063 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1064 ori r0, r0, RESET_VECTOR@l
1065 stwu r1, -8(r1) /* Save back chain and move SP */
1066 stw r0, +12(r1) /* Save return addr (underflow vect) */
1067
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001068#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1069 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001070 /*
1071 * Stack in OCM.
1072 */
1073
1074 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001075 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1076 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001077
1078 /* Set up a zeroized stack frame so that backtrace works right */
1079 li r0, 0
1080 stwu r0, -4(r1)
1081 stwu r0, -4(r1)
1082
1083 /*
1084 * Set up a dummy frame to store reset vector as return address.
1085 * this causes stack underflow to reset board.
1086 */
1087 stwu r1, -8(r1) /* Save back chain and move SP */
1088 lis r0, RESET_VECTOR@h /* Address of reset vector */
1089 ori r0, r0, RESET_VECTOR@l
1090 stwu r1, -8(r1) /* Save back chain and move SP */
1091 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001092#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001093
Stefan Roesec440bfe2007-06-06 11:42:13 +02001094#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +02001095 bl nand_boot_common /* will not return */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001096#else
wdenk0442ed82002-11-03 10:24:00 +00001097 GET_GOT /* initialize GOT access */
1098
Wolfgang Denkf901a832005-08-06 01:42:58 +02001099 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001100
wdenk0442ed82002-11-03 10:24:00 +00001101 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser52ebd9c2010-09-14 19:13:53 -05001102 /* NOTREACHED - board_init_f() does not return */
1103
Stefan Roesec440bfe2007-06-06 11:42:13 +02001104#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001105
wdenk12f34242003-09-02 22:48:03 +00001106#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1107 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001108
1109
Stefan Roese98f99e92013-04-02 10:37:04 +02001110#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +00001111/*
1112 * This code finishes saving the registers to the exception frame
1113 * and jumps to the appropriate handler for the exception.
1114 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1115 */
1116 .globl transfer_to_handler
1117transfer_to_handler:
1118 stw r22,_NIP(r21)
1119 lis r22,MSR_POW@h
1120 andc r23,r23,r22
1121 stw r23,_MSR(r21)
1122 SAVE_GPR(7, r21)
1123 SAVE_4GPRS(8, r21)
1124 SAVE_8GPRS(12, r21)
1125 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001126 mflr r23
1127 andi. r24,r23,0x3f00 /* get vector offset */
1128 stw r24,TRAP(r21)
1129 li r22,0
1130 stw r22,RESULT(r21)
1131 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001132 lwz r24,0(r23) /* virtual address of handler */
1133 lwz r23,4(r23) /* where to go when done */
1134 mtspr SRR0,r24
1135 mtspr SRR1,r20
1136 mtlr r23
1137 SYNC
1138 rfi /* jump to handler, enable MMU */
1139
1140int_return:
1141 mfmsr r28 /* Disable interrupts */
1142 li r4,0
1143 ori r4,r4,MSR_EE
1144 andc r28,r28,r4
1145 SYNC /* Some chip revs need this... */
1146 mtmsr r28
1147 SYNC
1148 lwz r2,_CTR(r1)
1149 lwz r0,_LINK(r1)
1150 mtctr r2
1151 mtlr r0
1152 lwz r2,_XER(r1)
1153 lwz r0,_CCR(r1)
1154 mtspr XER,r2
1155 mtcrf 0xFF,r0
1156 REST_10GPRS(3, r1)
1157 REST_10GPRS(13, r1)
1158 REST_8GPRS(23, r1)
1159 REST_GPR(31, r1)
1160 lwz r2,_NIP(r1) /* Restore environment */
1161 lwz r0,_MSR(r1)
1162 mtspr SRR0,r2
1163 mtspr SRR1,r0
1164 lwz r0,GPR0(r1)
1165 lwz r2,GPR2(r1)
1166 lwz r1,GPR1(r1)
1167 SYNC
1168 rfi
1169
1170crit_return:
1171 mfmsr r28 /* Disable interrupts */
1172 li r4,0
1173 ori r4,r4,MSR_EE
1174 andc r28,r28,r4
1175 SYNC /* Some chip revs need this... */
1176 mtmsr r28
1177 SYNC
1178 lwz r2,_CTR(r1)
1179 lwz r0,_LINK(r1)
1180 mtctr r2
1181 mtlr r0
1182 lwz r2,_XER(r1)
1183 lwz r0,_CCR(r1)
1184 mtspr XER,r2
1185 mtcrf 0xFF,r0
1186 REST_10GPRS(3, r1)
1187 REST_10GPRS(13, r1)
1188 REST_8GPRS(23, r1)
1189 REST_GPR(31, r1)
1190 lwz r2,_NIP(r1) /* Restore environment */
1191 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001192 mtspr SPRN_CSRR0,r2
1193 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001194 lwz r0,GPR0(r1)
1195 lwz r2,GPR2(r1)
1196 lwz r1,GPR1(r1)
1197 SYNC
1198 rfci
1199
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001200#ifdef CONFIG_440
1201mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001202 mfmsr r28 /* Disable interrupts */
1203 li r4,0
1204 ori r4,r4,MSR_EE
1205 andc r28,r28,r4
1206 SYNC /* Some chip revs need this... */
1207 mtmsr r28
1208 SYNC
1209 lwz r2,_CTR(r1)
1210 lwz r0,_LINK(r1)
1211 mtctr r2
1212 mtlr r0
1213 lwz r2,_XER(r1)
1214 lwz r0,_CCR(r1)
1215 mtspr XER,r2
1216 mtcrf 0xFF,r0
1217 REST_10GPRS(3, r1)
1218 REST_10GPRS(13, r1)
1219 REST_8GPRS(23, r1)
1220 REST_GPR(31, r1)
1221 lwz r2,_NIP(r1) /* Restore environment */
1222 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001223 mtspr SPRN_MCSRR0,r2
1224 mtspr SPRN_MCSRR1,r0
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001225 lwz r0,GPR0(r1)
1226 lwz r2,GPR2(r1)
1227 lwz r1,GPR1(r1)
1228 SYNC
1229 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001230#endif /* CONFIG_440 */
1231
1232
wdenk0442ed82002-11-03 10:24:00 +00001233 .globl get_pvr
1234get_pvr:
1235 mfspr r3, PVR
1236 blr
1237
wdenk0442ed82002-11-03 10:24:00 +00001238/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001239/* Function: out16 */
1240/* Description: Output 16 bits */
1241/*------------------------------------------------------------------------------- */
1242 .globl out16
1243out16:
1244 sth r4,0x0000(r3)
1245 blr
1246
1247/*------------------------------------------------------------------------------- */
1248/* Function: out16r */
1249/* Description: Byte reverse and output 16 bits */
1250/*------------------------------------------------------------------------------- */
1251 .globl out16r
1252out16r:
1253 sthbrx r4,r0,r3
1254 blr
1255
1256/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001257/* Function: out32r */
1258/* Description: Byte reverse and output 32 bits */
1259/*------------------------------------------------------------------------------- */
1260 .globl out32r
1261out32r:
1262 stwbrx r4,r0,r3
1263 blr
1264
1265/*------------------------------------------------------------------------------- */
1266/* Function: in16 */
1267/* Description: Input 16 bits */
1268/*------------------------------------------------------------------------------- */
1269 .globl in16
1270in16:
1271 lhz r3,0x0000(r3)
1272 blr
1273
1274/*------------------------------------------------------------------------------- */
1275/* Function: in16r */
1276/* Description: Input 16 bits and byte reverse */
1277/*------------------------------------------------------------------------------- */
1278 .globl in16r
1279in16r:
1280 lhbrx r3,r0,r3
1281 blr
1282
1283/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001284/* Function: in32r */
1285/* Description: Input 32 bits and byte reverse */
1286/*------------------------------------------------------------------------------- */
1287 .globl in32r
1288in32r:
1289 lwbrx r3,r0,r3
1290 blr
1291
Stefan Roese98f99e92013-04-02 10:37:04 +02001292#if !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +00001293/*
1294 * void relocate_code (addr_sp, gd, addr_moni)
1295 *
1296 * This "function" does not return, instead it continues in RAM
1297 * after relocating the monitor code.
1298 *
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001299 * r3 = Relocated stack pointer
1300 * r4 = Relocated global data pointer
1301 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001302 */
1303 .globl relocate_code
1304relocate_code:
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001305#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roese9b94ac62007-10-31 17:55:58 +01001306 /*
Stefan Roese79209542010-11-26 15:45:34 +01001307 * We need to flush the initial global data (gd_t) and bd_info
1308 * before the dcache will be invalidated.
Stefan Roese9b94ac62007-10-31 17:55:58 +01001309 */
1310
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001311 /* Save registers */
1312 mr r9, r3
1313 mr r10, r4
1314 mr r11, r5
Stefan Roese9b94ac62007-10-31 17:55:58 +01001315
Stefan Roese79209542010-11-26 15:45:34 +01001316 /*
1317 * Flush complete dcache, this is faster than flushing the
1318 * ranges for global_data and bd_info instead.
1319 */
1320 bl flush_dcache
Stefan Roese9b94ac62007-10-31 17:55:58 +01001321
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001322#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001323 /*
1324 * Undo the earlier data cache set-up for the primordial stack and
1325 * data area. First, invalidate the data cache and then disable data
1326 * cacheability for that area. Finally, restore the EBC values, if
1327 * any.
1328 */
1329
1330 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001331 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1332 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001333
Wolfgang Denk553f0982010-10-26 13:32:32 +02001334 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1335 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001336 add r4, r4, r3
1337
1338 bl invalidate_dcache_range
1339
1340 /* Disable cacheability for the region */
1341 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001342 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1343 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001344 and r3, r3, r4
1345 mtdccr r3
1346
1347 /* Restore the EBC parameters */
1348 li r3, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001349 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001350 lis r3, PBxAP_VAL@h
1351 ori r3, r3, PBxAP_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001352 mtdcr EBC0_CFGDATA, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001353
1354 li r3, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001355 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001356 lis r3, PBxCR_VAL@h
1357 ori r3, r3, PBxCR_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001358 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001359#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001360
1361 /* Restore registers */
1362 mr r3, r9
1363 mr r4, r10
1364 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001365#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesee02c5212008-01-09 10:23:16 +01001366
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001367#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesee02c5212008-01-09 10:23:16 +01001368 /*
1369 * Unlock the previously locked d-cache
1370 */
1371 msync
1372 isync
1373 /* set TFLOOR/NFLOOR to 0 again */
1374 lis r6,0x0001
1375 ori r6,r6,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001376 mtspr SPRN_DVLIM,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001377 lis r6,0x0000
1378 ori r6,r6,0x0000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001379 mtspr SPRN_DNV0,r6
1380 mtspr SPRN_DNV1,r6
1381 mtspr SPRN_DNV2,r6
1382 mtspr SPRN_DNV3,r6
1383 mtspr SPRN_DTV0,r6
1384 mtspr SPRN_DTV1,r6
1385 mtspr SPRN_DTV2,r6
1386 mtspr SPRN_DTV3,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001387 msync
1388 isync
Stefan Roesef3cac532010-08-31 11:27:14 +02001389
1390 /* Invalidate data cache, now no longer our stack */
1391 dccci 0,0
1392 sync
1393 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001394#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesee02c5212008-01-09 10:23:16 +01001395
Stefan Roesea4c8d132006-06-02 16:18:04 +02001396 /*
1397 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1398 * to speed up the boot process. Now this cache needs to be disabled.
1399 */
Stefan Roese4978e602010-05-27 16:45:20 +02001400#if defined(CONFIG_440)
Stefan Roese25fb4ea2008-11-20 11:46:20 +01001401 /* Clear all potential pending exceptions */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001402 mfspr r1,SPRN_MCSR
1403 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001404 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001405 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001406 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001407 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001408 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001409 isync
Stefan Roese4978e602010-05-27 16:45:20 +02001410#endif /* defined(CONFIG_440) */
wdenk0442ed82002-11-03 10:24:00 +00001411 mr r1, r3 /* Set new stack pointer */
1412 mr r9, r4 /* Save copy of Init Data pointer */
1413 mr r10, r5 /* Save copy of Destination Address */
1414
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001415 GET_GOT
wdenk0442ed82002-11-03 10:24:00 +00001416 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001417 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1418 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001419 lwz r5, GOT(__init_end)
1420 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001421 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001422
1423 /*
1424 * Fix GOT pointer:
1425 *
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001426 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001427 *
1428 * Offset:
1429 */
1430 sub r15, r10, r4
1431
1432 /* First our own GOT */
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001433 add r12, r12, r15
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001434 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001435 add r30, r30, r15
1436
1437 /*
1438 * Now relocate code
1439 */
1440
1441 cmplw cr1,r3,r4
1442 addi r0,r5,3
1443 srwi. r0,r0,2
1444 beq cr1,4f /* In place copy is not necessary */
1445 beq 7f /* Protect against 0 count */
1446 mtctr r0
1447 bge cr1,2f
1448
1449 la r8,-4(r4)
1450 la r7,-4(r3)
14511: lwzu r0,4(r8)
1452 stwu r0,4(r7)
1453 bdnz 1b
1454 b 4f
1455
14562: slwi r0,r0,2
1457 add r8,r4,r0
1458 add r7,r3,r0
14593: lwzu r0,-4(r8)
1460 stwu r0,-4(r7)
1461 bdnz 3b
1462
1463/*
1464 * Now flush the cache: note that we must start from a cache aligned
1465 * address. Otherwise we might miss one cache line.
1466 */
14674: cmpwi r6,0
1468 add r5,r3,r5
1469 beq 7f /* Always flush prefetch queue in any case */
1470 subi r0,r6,1
1471 andc r3,r3,r0
1472 mr r4,r3
14735: dcbst 0,r4
1474 add r4,r4,r6
1475 cmplw r4,r5
1476 blt 5b
1477 sync /* Wait for all dcbst to complete on bus */
1478 mr r4,r3
14796: icbi 0,r4
1480 add r4,r4,r6
1481 cmplw r4,r5
1482 blt 6b
14837: sync /* Wait for all icbi to complete on bus */
1484 isync
1485
1486/*
1487 * We are done. Do not return, instead branch to second part of board
1488 * initialization, now running from RAM.
1489 */
1490
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001491 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001492 mtlr r0
1493 blr /* NEVER RETURNS! */
1494
1495in_ram:
1496
1497 /*
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001498 * Relocation Function, r12 point to got2+0x8000
wdenk0442ed82002-11-03 10:24:00 +00001499 *
1500 * Adjust got2 pointers, no need to check for 0, this code
1501 * already puts a few entries in the table.
1502 */
1503 li r0,__got2_entries@sectoff@l
1504 la r3,GOT(_GOT2_TABLE_)
1505 lwz r11,GOT(_GOT2_TABLE_)
1506 mtctr r0
1507 sub r11,r3,r11
1508 addi r3,r3,-4
15091: lwzu r0,4(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001510 cmpwi r0,0
1511 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001512 add r0,r0,r11
1513 stw r0,0(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +020015142: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001515
1516 /*
1517 * Now adjust the fixups and the pointers to the fixups
1518 * in case we need to move ourselves again.
1519 */
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001520 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001521 lwz r3,GOT(_FIXUP_TABLE_)
1522 cmpwi r0,0
1523 mtctr r0
1524 addi r3,r3,-4
1525 beq 4f
15263: lwzu r4,4(r3)
1527 lwzux r0,r4,r11
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001528 cmpwi r0,0
wdenk0442ed82002-11-03 10:24:00 +00001529 add r0,r0,r11
Joakim Tjernlund34bbf612010-11-04 19:02:00 +01001530 stw r4,0(r3)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001531 beq- 5f
wdenk0442ed82002-11-03 10:24:00 +00001532 stw r0,0(r4)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +020015335: bdnz 3b
wdenk0442ed82002-11-03 10:24:00 +000015344:
1535clear_bss:
1536 /*
1537 * Now clear BSS segment
1538 */
wdenk5d232d02003-05-22 22:52:13 +00001539 lwz r3,GOT(__bss_start)
Simon Glass3929fb02013-03-14 06:54:53 +00001540 lwz r4,GOT(__bss_end)
wdenk0442ed82002-11-03 10:24:00 +00001541
1542 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001543 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001544
1545 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001546
1547 andi. r5, r4, 3
1548 beq 6f
1549 sub r4, r4, r5
1550 mtctr r5
1551 mr r5, r4
15525: stb r0, 0(r5)
1553 addi r5, r5, 1
1554 bdnz 5b
15556:
wdenk0442ed82002-11-03 10:24:00 +00001556 stw r0, 0(r3)
1557 addi r3, r3, 4
1558 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001559 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001560
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010015617:
wdenk0442ed82002-11-03 10:24:00 +00001562 mr r3, r9 /* Init Data pointer */
1563 mr r4, r10 /* Destination Address */
1564 bl board_init_r
1565
wdenk0442ed82002-11-03 10:24:00 +00001566 /*
1567 * Copy exception vector code to low memory
1568 *
1569 * r3: dest_addr
1570 * r7: source address, r8: end address, r9: target address
1571 */
1572 .globl trap_init
1573trap_init:
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001574 mflr r4 /* save link register */
1575 GET_GOT
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001576 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001577 lwz r8, GOT(_end_of_vectors)
1578
wdenk682011f2003-06-03 23:54:09 +00001579 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001580
1581 cmplw 0, r7, r8
1582 bgelr /* return if r7>=r8 - just in case */
wdenk0442ed82002-11-03 10:24:00 +000015831:
1584 lwz r0, 0(r7)
1585 stw r0, 0(r9)
1586 addi r7, r7, 4
1587 addi r9, r9, 4
1588 cmplw 0, r7, r8
1589 bne 1b
1590
1591 /*
1592 * relocate `hdlr' and `int_return' entries
1593 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001594 li r7, .L_MachineCheck - _start + _START_OFFSET
1595 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000015962:
1597 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001598 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001599 cmplw 0, r7, r8
1600 blt 2b
1601
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001602 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001603 bl trap_reloc
1604
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001605 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001606 bl trap_reloc
1607
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001608#ifdef CONFIG_440
1609 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001610 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001611
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001612 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001613 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001614
1615 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001616 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001617
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001618 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1619 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001620
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001621 li r7, .L_DataTLBError - _start + _START_OFFSET
1622 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001623#else /* CONFIG_440 */
1624 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001625 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001626
1627 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001628 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001629
1630 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001631 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001632#endif /* CONFIG_440 */
1633
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001634 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1635 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001636
Stefan Roese887e2ec2006-09-07 11:51:23 +02001637#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001638 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1639 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1640 mtmsr r7 /* change MSR */
1641#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001642 bl __440_msr_set
1643 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001644
Stefan Roese887e2ec2006-09-07 11:51:23 +02001645__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001646 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1647 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001648 mtspr SPRN_SRR1,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001649 mflr r7
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001650 mtspr SPRN_SRR0,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001651 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001652__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001653#endif
1654
wdenk0442ed82002-11-03 10:24:00 +00001655 mtlr r4 /* restore link register */
1656 blr
Stefan Roese98f99e92013-04-02 10:37:04 +02001657#endif /* CONFIG_SPL_BUILD */
wdenk0442ed82002-11-03 10:24:00 +00001658
Stefan Roesecf959c72007-06-01 15:27:11 +02001659#if defined(CONFIG_440)
1660/*----------------------------------------------------------------------------+
1661| dcbz_area.
1662+----------------------------------------------------------------------------*/
1663 function_prolog(dcbz_area)
1664 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001665 rlwinm r5,r4,27,5,31
1666 beq ..d_ra2
1667 addi r5,r5,0x0001
1668..d_ra2:mtctr r5
1669..d_ag2:dcbz r0,r3
1670 addi r3,r3,32
1671 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001672 sync
1673 blr
1674 function_epilog(dcbz_area)
Stefan Roesecf959c72007-06-01 15:27:11 +02001675#endif /* CONFIG_440 */
Stefan Roese887e2ec2006-09-07 11:51:23 +02001676#endif /* CONFIG_NAND_SPL */
stroeseb867d702003-05-23 11:18:02 +00001677
Stefan Roesecf959c72007-06-01 15:27:11 +02001678/*------------------------------------------------------------------------------- */
1679/* Function: in8 */
1680/* Description: Input 8 bits */
1681/*------------------------------------------------------------------------------- */
1682 .globl in8
1683in8:
1684 lbz r3,0x0000(r3)
1685 blr
1686
1687/*------------------------------------------------------------------------------- */
1688/* Function: out8 */
1689/* Description: Output 8 bits */
1690/*------------------------------------------------------------------------------- */
1691 .globl out8
1692out8:
1693 stb r4,0x0000(r3)
1694 blr
1695
1696/*------------------------------------------------------------------------------- */
1697/* Function: out32 */
1698/* Description: Output 32 bits */
1699/*------------------------------------------------------------------------------- */
1700 .globl out32
1701out32:
1702 stw r4,0x0000(r3)
1703 blr
1704
1705/*------------------------------------------------------------------------------- */
1706/* Function: in32 */
1707/* Description: Input 32 bits */
1708/*------------------------------------------------------------------------------- */
1709 .globl in32
1710in32:
1711 lwz 3,0x0000(3)
1712 blr
stroeseb867d702003-05-23 11:18:02 +00001713
1714/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001715/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001716/**************************************************************************/
1717#ifdef CONFIG_405EP
1718ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001719
Stefan Roesec157d8e2005-08-01 16:41:48 +02001720#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001721 /*
1722 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1723 * function) to support FPGA and NVRAM accesses below.
1724 */
1725
1726 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1727 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001728 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1729 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001730 stw r4,0(r3)
1731 lis r3,GPIO0_OSRL@h
1732 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001733 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1734 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001735 stw r4,0(r3)
1736
1737 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1738 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001739 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1740 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroeseb828dda2003-12-09 14:54:43 +00001741 stw r4,0(r3)
1742 lis r3,GPIO0_ISR1L@h
1743 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001744 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1745 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroeseb828dda2003-12-09 14:54:43 +00001746 stw r4,0(r3)
1747
1748 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1749 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001750 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1751 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001752 stw r4,0(r3)
1753 lis r3,GPIO0_TSRL@h
1754 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001755 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1756 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001757 stw r4,0(r3)
1758
1759 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1760 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001761 lis r4,CONFIG_SYS_GPIO0_TCR@h
1762 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroeseb828dda2003-12-09 14:54:43 +00001763 stw r4,0(r3)
1764
Stefan Roesed1c3b272009-09-09 16:25:29 +02001765 li r3,PB1AP /* program EBC bank 1 for RTC access */
1766 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001767 lis r3,CONFIG_SYS_EBC_PB1AP@h
1768 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001769 mtdcr EBC0_CFGDATA,r3
1770 li r3,PB1CR
1771 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001772 lis r3,CONFIG_SYS_EBC_PB1CR@h
1773 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001774 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001775
Stefan Roesed1c3b272009-09-09 16:25:29 +02001776 li r3,PB1AP /* program EBC bank 1 for RTC access */
1777 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001778 lis r3,CONFIG_SYS_EBC_PB1AP@h
1779 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001780 mtdcr EBC0_CFGDATA,r3
1781 li r3,PB1CR
1782 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001783 lis r3,CONFIG_SYS_EBC_PB1CR@h
1784 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001785 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001786
Stefan Roesed1c3b272009-09-09 16:25:29 +02001787 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1788 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001789 lis r3,CONFIG_SYS_EBC_PB4AP@h
1790 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001791 mtdcr EBC0_CFGDATA,r3
1792 li r3,PB4CR
1793 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001794 lis r3,CONFIG_SYS_EBC_PB4CR@h
1795 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001796 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001797#endif
1798
wdenk8bde7f72003-06-27 21:31:46 +00001799 /*
1800 !-----------------------------------------------------------------------
1801 ! Check to see if chip is in bypass mode.
1802 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1803 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001804 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1805 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001806 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001807 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001808 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001809 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001810 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001811
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001812 beq pll_done /* if SSCS =b'1' then PLL has */
1813 /* already been set */
1814 /* and CPU has been reset */
1815 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001816
Stefan Roesec157d8e2005-08-01 16:41:48 +02001817#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001818 /*
wdenk8bde7f72003-06-27 21:31:46 +00001819 !-----------------------------------------------------------------------
1820 ! Read NVRAM to get value to write in PLLMR.
1821 ! If value has not been correctly saved, write default value
1822 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1823 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1824 !
1825 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001826 ! structure in openbios.h. Changing the beginning of
1827 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001828 !
1829 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001830 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001831 addis r3,0,NVRAM_BASE@h
1832 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001833
Wolfgang Denkf901a832005-08-06 01:42:58 +02001834 lwz r4, 0(r3)
1835 addis r5,0,NVRVFY1@h
1836 addi r5,r5,NVRVFY1@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001837 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001838 bne ..no_pllset
1839 addi r3,r3,4
1840 lwz r4, 0(r3)
1841 addis r5,0,NVRVFY2@h
1842 addi r5,r5,NVRVFY2@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001843 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001844 bne ..no_pllset
1845 addi r3,r3,8 /* Skip over conf_size */
1846 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1847 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1848 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1849 cmpi cr0,0,r5,1 /* See if PLL is locked */
1850 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001851..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001852#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001853
John Otkend4024bb2007-07-26 17:49:11 +02001854#ifdef CONFIG_TAIHU
1855 mfdcr r4, CPC0_BOOT
1856 andi. r5, r4, CPC0_BOOT_SEP@l
1857 bne strap_1 /* serial eeprom present */
1858 addis r5,0,CPLD_REG0_ADDR@h
1859 ori r5,r5,CPLD_REG0_ADDR@l
1860 andi. r5, r5, 0x10
1861 bne _pci_66mhz
1862#endif /* CONFIG_TAIHU */
1863
Stefan Roese779e9752007-08-14 14:44:41 +02001864#if defined(CONFIG_ZEUS)
1865 mfdcr r4, CPC0_BOOT
1866 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001867 bne strap_1 /* serial eeprom present */
Stefan Roese779e9752007-08-14 14:44:41 +02001868 lis r3,0x0000
1869 addi r3,r3,0x3030
1870 lis r4,0x8042
1871 addi r4,r4,0x223e
1872 b 1f
1873strap_1:
1874 mfdcr r3, CPC0_PLLMR0
1875 mfdcr r4, CPC0_PLLMR1
1876 b 1f
1877#endif
1878
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001879 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1880 ori r3,r3,PLLMR0_DEFAULT@l /* */
1881 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1882 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001883
John Otkend4024bb2007-07-26 17:49:11 +02001884#ifdef CONFIG_TAIHU
1885 b 1f
1886_pci_66mhz:
1887 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1888 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1889 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1890 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1891 b 1f
1892strap_1:
1893 mfdcr r3, CPC0_PLLMR0
1894 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001895#endif /* CONFIG_TAIHU */
1896
Stefan Roese779e9752007-08-14 14:44:41 +020018971:
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001898 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001899
1900pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001901 /*
1902 !-----------------------------------------------------------------------
1903 ! Clear Soft Reset Register
1904 ! This is needed to enable PCI if not booting from serial EPROM
1905 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001906 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001907 addi r3, 0, 0x0
1908 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001909
Wolfgang Denkf901a832005-08-06 01:42:58 +02001910 addis r3,0,0x0010
1911 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001912pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001913 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001914
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001915 blr /* return to main code */
stroeseb867d702003-05-23 11:18:02 +00001916
1917/*
1918!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02001919! Function: pll_write
1920! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1921! That is:
1922! 1. Pll is first disabled (de-activated by putting in bypass mode)
1923! 2. PLL is reset
1924! 3. Clock dividers are set while PLL is held in reset and bypassed
1925! 4. PLL Reset is cleared
1926! 5. Wait 100us for PLL to lock
1927! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00001928! Input: r3 = Value to write to CPC0_PLLMR0
1929! Input: r4 = Value to write to CPC0_PLLMR1
1930! Output r3 = none
1931!-----------------------------------------------------------------------------
1932*/
Matthias Fuchs0580e482009-07-06 16:27:33 +02001933 .globl pll_write
stroeseb867d702003-05-23 11:18:02 +00001934pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00001935 mfdcr r5, CPC0_UCR
1936 andis. r5,r5,0xFFFF
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001937 ori r5,r5,0x0101 /* Stop the UART clocks */
1938 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00001939
wdenk8bde7f72003-06-27 21:31:46 +00001940 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001941 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001942 mtdcr CPC0_PLLMR1,r5
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001943 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001944 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001945
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001946 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1947 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1948 oris r5,r5,0x4000 /* Set PLL Reset */
1949 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1950 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001951 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001952
1953 /*
wdenk8bde7f72003-06-27 21:31:46 +00001954 ! Wait min of 100us for PLL to lock.
1955 ! See CMOS 27E databook for more info.
1956 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00001957 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001958 addi r3,0,20000 /* 2000 = 0x4e20 */
1959 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001960pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001961 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00001962
Wolfgang Denkf901a832005-08-06 01:42:58 +02001963 oris r5,r5,0x8000 /* Enable PLL */
1964 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00001965
wdenk8bde7f72003-06-27 21:31:46 +00001966 /*
1967 * Reset CPU to guarantee timings are OK
1968 * Not sure if this is needed...
1969 */
1970 addis r3,0,0x1000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001971 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001972 /* execution will continue from the poweron */
1973 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00001974#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01001975
1976#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01001977/*----------------------------------------------------------------------------+
1978| mttlb3.
1979+----------------------------------------------------------------------------*/
1980 function_prolog(mttlb3)
1981 TLBWE(4,3,2)
1982 blr
1983 function_epilog(mttlb3)
1984
1985/*----------------------------------------------------------------------------+
1986| mftlb3.
1987+----------------------------------------------------------------------------*/
1988 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01001989 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01001990 blr
1991 function_epilog(mftlb3)
1992
1993/*----------------------------------------------------------------------------+
1994| mttlb2.
1995+----------------------------------------------------------------------------*/
1996 function_prolog(mttlb2)
1997 TLBWE(4,3,1)
1998 blr
1999 function_epilog(mttlb2)
2000
2001/*----------------------------------------------------------------------------+
2002| mftlb2.
2003+----------------------------------------------------------------------------*/
2004 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01002005 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01002006 blr
2007 function_epilog(mftlb2)
2008
2009/*----------------------------------------------------------------------------+
2010| mttlb1.
2011+----------------------------------------------------------------------------*/
2012 function_prolog(mttlb1)
2013 TLBWE(4,3,0)
2014 blr
2015 function_epilog(mttlb1)
2016
2017/*----------------------------------------------------------------------------+
2018| mftlb1.
2019+----------------------------------------------------------------------------*/
2020 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01002021 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01002022 blr
2023 function_epilog(mftlb1)
2024#endif /* CONFIG_440 */
Stefan Roese64852d02008-06-02 14:35:44 +02002025
2026#if defined(CONFIG_NAND_SPL)
2027/*
2028 * void nand_boot_relocate(dst, src, bytes)
2029 *
2030 * r3 = Destination address to copy code to (in SDRAM)
2031 * r4 = Source address to copy code from
2032 * r5 = size to copy in bytes
2033 */
2034nand_boot_relocate:
2035 mr r6,r3
2036 mr r7,r4
2037 mflr r8
2038
2039 /*
2040 * Copy SPL from icache into SDRAM
2041 */
2042 subi r3,r3,4
2043 subi r4,r4,4
2044 srwi r5,r5,2
2045 mtctr r5
2046..spl_loop:
2047 lwzu r0,4(r4)
2048 stwu r0,4(r3)
2049 bdnz ..spl_loop
2050
2051 /*
2052 * Calculate "corrected" link register, so that we "continue"
2053 * in execution in destination range
2054 */
2055 sub r3,r7,r6 /* r3 = src - dst */
2056 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2057 mtlr r8
2058 blr
2059
2060nand_boot_common:
2061 /*
2062 * First initialize SDRAM. It has to be available *before* calling
2063 * nand_boot().
2064 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002065 lis r3,CONFIG_SYS_SDRAM_BASE@h
2066 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002067 bl initdram
2068
2069 /*
2070 * Now copy the 4k SPL code into SDRAM and continue execution
2071 * from there.
2072 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002073 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2074 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2075 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2076 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2077 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2078 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002079 bl nand_boot_relocate
2080
2081 /*
2082 * We're running from SDRAM now!!!
2083 *
2084 * It is necessary for 4xx systems to relocate from running at
2085 * the original location (0xfffffxxx) to somewhere else (SDRAM
2086 * preferably). This is because CS0 needs to be reconfigured for
2087 * NAND access. And we can't reconfigure this CS when currently
2088 * "running" from it.
2089 */
2090
2091 /*
2092 * Finally call nand_boot() to load main NAND U-Boot image from
2093 * NAND and jump to it.
2094 */
2095 bl nand_boot /* will not return */
2096#endif /* CONFIG_NAND_SPL */