blob: 3b0e3644a4c5545a628d07859ea315c70f67b4ff [file] [log] [blame]
wdenk0442ed82002-11-03 10:24:00 +00001/*
2 * Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
3 * Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
4 * Copyright (C) 2000,2001,2002 Wolfgang Denk <wd@denx.de>
Stefan Roese3cb86f32007-03-24 15:45:34 +01005 * Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
Grant Ericksonc821b5f2008-05-22 14:44:14 -07006 * Copyright (c) 2008 Nuovation System Designs, LLC
7 * Grant Erickson <gerickson@nuovations.com>
wdenk0442ed82002-11-03 10:24:00 +00008 *
9 * See file CREDITS for list of people who contributed to this
10 * project.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25 * MA 02111-1307 USA
26 */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +020027/*------------------------------------------------------------------------------+
Josh Boyer31773492009-08-07 13:53:20 -040028 * This source code is dual-licensed. You may use it under the terms of the
29 * GNU General Public License version 2, or under the license below.
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +020030 *
31 * This source code has been made available to you by IBM on an AS-IS
32 * basis. Anyone receiving this source is licensed under IBM
33 * copyrights to use it in any way he or she deems fit, including
34 * copying it, modifying it, compiling it, and redistributing it either
35 * with or without modifications. No license under IBM patents or
36 * patent applications is to be implied by the copyright license.
37 *
38 * Any user of this software should understand that IBM cannot provide
39 * technical support for this software and will not be responsible for
40 * any consequences resulting from the use of this software.
41 *
42 * Any person who transfers this source code or any derivative work
43 * must include the IBM copyright notice, this paragraph, and the
44 * preceding two paragraphs in the transferred software.
45 *
46 * COPYRIGHT I B M CORPORATION 1995
47 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
48 *-------------------------------------------------------------------------------
49 */
wdenk0442ed82002-11-03 10:24:00 +000050
Stefan Roesef7b548a2010-11-26 15:43:17 +010051/*
52 * Startup code for IBM/AMCC PowerPC 4xx (PPC4xx) based boards
wdenk0442ed82002-11-03 10:24:00 +000053 *
Stefan Roesef7b548a2010-11-26 15:43:17 +010054 * The following description only applies to the NOR flash style booting.
55 * NAND booting is different. For more details about NAND booting on 4xx
56 * take a look at doc/README.nand-boot-ppc440.
wdenk0442ed82002-11-03 10:24:00 +000057 *
Stefan Roesef7b548a2010-11-26 15:43:17 +010058 * The CPU starts at address 0xfffffffc (last word in the address space).
59 * The U-Boot image therefore has to be located in the "upper" area of the
60 * flash (e.g. 512MiB - 0xfff80000 ... 0xffffffff). The default value for
61 * the boot chip-select (CS0) is quite big and covers this area. On the
62 * 405EX this is for example 0xffe00000 ... 0xffffffff. U-Boot will
63 * reconfigure this CS0 (and other chip-selects as well when configured
64 * this way) in the boot process to the "correct" values matching the
65 * board layout.
wdenk0442ed82002-11-03 10:24:00 +000066 */
Stefan Roesef7b548a2010-11-26 15:43:17 +010067
Wolfgang Denk25ddd1f2010-10-26 14:34:52 +020068#include <asm-offsets.h>
wdenk0442ed82002-11-03 10:24:00 +000069#include <config.h>
Stefan Roeseb36df562010-09-09 19:18:00 +020070#include <asm/ppc4xx.h>
wdenk0442ed82002-11-03 10:24:00 +000071#include <version.h>
72
73#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
74
75#include <ppc_asm.tmpl>
76#include <ppc_defs.h>
77
78#include <asm/cache.h>
79#include <asm/mmu.h>
Dave Mitchellb14ca4b2008-11-20 14:00:49 -060080#include <asm/ppc4xx-isram.h>
wdenk0442ed82002-11-03 10:24:00 +000081
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020082#ifdef CONFIG_SYS_INIT_DCACHE_CS
83# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
Stefan Roesed1c3b272009-09-09 16:25:29 +020084# define PBxAP PB1AP
85# define PBxCR PB0CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020086# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
87# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
88# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070089# endif
wdenk0442ed82002-11-03 10:24:00 +000090# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020091# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
Stefan Roesed1c3b272009-09-09 16:25:29 +020092# define PBxAP PB1AP
93# define PBxCR PB1CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020094# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
95# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
96# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070097# endif
wdenk0442ed82002-11-03 10:24:00 +000098# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020099# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200100# define PBxAP PB2AP
101# define PBxCR PB2CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200102# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
103# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
104# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700105# endif
wdenk0442ed82002-11-03 10:24:00 +0000106# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200107# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200108# define PBxAP PB3AP
109# define PBxCR PB3CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200110# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
111# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
112# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700113# endif
wdenk0442ed82002-11-03 10:24:00 +0000114# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200115# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200116# define PBxAP PB4AP
117# define PBxCR PB4CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200118# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
119# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
120# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700121# endif
wdenk0442ed82002-11-03 10:24:00 +0000122# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200123# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200124# define PBxAP PB5AP
125# define PBxCR PB5CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200126# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
127# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
128# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700129# endif
wdenk0442ed82002-11-03 10:24:00 +0000130# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200131# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200132# define PBxAP PB6AP
133# define PBxCR PB6CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200134# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
135# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
136# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700137# endif
wdenk0442ed82002-11-03 10:24:00 +0000138# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200139# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200140# define PBxAP PB7AP
141# define PBxCR PB7CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200142# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
143# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
144# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700145# endif
146# endif
147# ifndef PBxAP_VAL
148# define PBxAP_VAL 0
149# endif
150# ifndef PBxCR_VAL
151# define PBxCR_VAL 0
152# endif
153/*
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200154 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700155 * used as temporary stack pointer for the primordial stack
156 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200157# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
158# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700159 EBC_BXAP_TWT_ENCODE(7) | \
160 EBC_BXAP_BCE_DISABLE | \
161 EBC_BXAP_BCT_2TRANS | \
162 EBC_BXAP_CSN_ENCODE(0) | \
163 EBC_BXAP_OEN_ENCODE(0) | \
164 EBC_BXAP_WBN_ENCODE(0) | \
165 EBC_BXAP_WBF_ENCODE(0) | \
166 EBC_BXAP_TH_ENCODE(2) | \
167 EBC_BXAP_RE_DISABLED | \
168 EBC_BXAP_SOR_NONDELAYED | \
169 EBC_BXAP_BEM_WRITEONLY | \
170 EBC_BXAP_PEN_DISABLED)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200171# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
172# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
173# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700174 EBC_BXCR_BS_64MB | \
175 EBC_BXCR_BU_RW | \
176 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200177# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
178# ifndef CONFIG_SYS_INIT_RAM_PATTERN
179# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
wdenk0442ed82002-11-03 10:24:00 +0000180# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200181#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000182
Wolfgang Denk553f0982010-10-26 13:32:32 +0200183#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_SIZE > (4 << 10)))
184#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_SIZE!
Stefan Roese28d77d92008-01-30 14:48:28 +0100185#endif
186
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700187/*
188 * Unless otherwise overriden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200189 * at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
190 * NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700191 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200192#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese64852d02008-06-02 14:35:44 +0200193/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200194# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese64852d02008-06-02 14:35:44 +0200195#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200196#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
197# define CONFIG_SYS_ICACHE_SACR_VALUE \
198 (PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
199 PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
200 PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
201#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700202
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200203#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
204# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700205 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200206#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700207
Stefan Roese4978e602010-05-27 16:45:20 +0200208#if !defined(CONFIG_SYS_TLB_FOR_BOOT_FLASH)
209#define CONFIG_SYS_TLB_FOR_BOOT_FLASH 0 /* use TLB 0 as default */
210#endif
211
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200212#define function_prolog(func_name) .text; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200213 .align 2; \
214 .globl func_name; \
215 func_name:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200216#define function_epilog(func_name) .type func_name,@function; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200217 .size func_name,.-func_name
218
wdenk0442ed82002-11-03 10:24:00 +0000219/* We don't want the MMU yet.
220*/
221#undef MSR_KERNEL
222#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
223
224
225 .extern ext_bus_cntlr_init
Stefan Roese887e2ec2006-09-07 11:51:23 +0200226#ifdef CONFIG_NAND_U_BOOT
227 .extern reconfig_tlb0
228#endif
wdenk0442ed82002-11-03 10:24:00 +0000229
230/*
231 * Set up GOT: Global Offset Table
232 *
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +0100233 * Use r12 to access the GOT
wdenk0442ed82002-11-03 10:24:00 +0000234 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200235#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000236 START_GOT
237 GOT_ENTRY(_GOT2_TABLE_)
238 GOT_ENTRY(_FIXUP_TABLE_)
239
240 GOT_ENTRY(_start)
241 GOT_ENTRY(_start_of_vectors)
242 GOT_ENTRY(_end_of_vectors)
243 GOT_ENTRY(transfer_to_handler)
244
wdenk3b57fe02003-05-30 12:48:29 +0000245 GOT_ENTRY(__init_end)
Po-Yu Chuang44c6e652011-03-01 22:59:59 +0000246 GOT_ENTRY(__bss_end__)
wdenk5d232d02003-05-22 22:52:13 +0000247 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000248 END_GOT
Stefan Roese887e2ec2006-09-07 11:51:23 +0200249#endif /* CONFIG_NAND_SPL */
250
251#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
252 /*
253 * NAND U-Boot image is started from offset 0
254 */
255 .text
Stefan Roesec440bfe2007-06-06 11:42:13 +0200256#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200257 bl reconfig_tlb0
Stefan Roesec440bfe2007-06-06 11:42:13 +0200258#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200259 GET_GOT
260 bl cpu_init_f /* run low-level CPU init code (from Flash) */
261 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500262 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200263#endif
wdenk0442ed82002-11-03 10:24:00 +0000264
Ricardo Ribalda Delgadod20b9992010-12-07 14:27:56 +0100265#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_BOOT_FROM_XMD)
Stefan Roesed8731332009-05-11 13:46:14 +0200266 /*
267 * 4xx RAM-booting U-Boot image is started from offset 0
268 */
269 .text
270 bl _start_440
271#endif
272
wdenk0442ed82002-11-03 10:24:00 +0000273/*
274 * 440 Startup -- on reset only the top 4k of the effective
275 * address space is mapped in by an entry in the instruction
276 * and data shadow TLB. The .bootpg section is located in the
277 * top 4k & does only what's necessary to map in the the rest
278 * of the boot rom. Once the boot rom is mapped in we can
279 * proceed with normal startup.
280 *
281 * NOTE: CS0 only covers the top 2MB of the effective address
282 * space after reset.
283 */
284
285#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200286#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000287 .section .bootpg,"ax"
Stefan Roese887e2ec2006-09-07 11:51:23 +0200288#endif
wdenk0442ed82002-11-03 10:24:00 +0000289 .globl _start_440
290
291/**************************************************************************/
292_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200293 /*--------------------------------------------------------------------+
294 | 440EPX BUP Change - Hardware team request
295 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200296#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
297 sync
298 nop
299 nop
300#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200301 /*----------------------------------------------------------------+
302 | Core bug fix. Clear the esr
303 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200304 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200305 mtspr SPRN_ESR,r0
wdenk0442ed82002-11-03 10:24:00 +0000306 /*----------------------------------------------------------------*/
307 /* Clear and set up some registers. */
308 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200309 iccci r0,r0 /* NOTE: operands not used for 440 */
310 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000311 sync
312 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200313 mtspr SPRN_SRR0,r0
314 mtspr SPRN_SRR1,r0
315 mtspr SPRN_CSRR0,r0
316 mtspr SPRN_CSRR1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200317 /* NOTE: 440GX adds machine check status regs */
318#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200319 mtspr SPRN_MCSRR0,r0
320 mtspr SPRN_MCSRR1,r0
321 mfspr r1,SPRN_MCSR
322 mtspr SPRN_MCSR,r1
wdenkba56f622004-02-06 23:19:44 +0000323#endif
Stefan Roese20532832006-11-22 13:20:50 +0100324
325 /*----------------------------------------------------------------*/
326 /* CCR0 init */
327 /*----------------------------------------------------------------*/
328 /* Disable store gathering & broadcast, guarantee inst/data
329 * cache block touch, force load/store alignment
330 * (see errata 1.12: 440_33)
331 */
332 lis r1,0x0030 /* store gathering & broadcast disable */
333 ori r1,r1,0x6000 /* cache touch */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200334 mtspr SPRN_CCR0,r1
Stefan Roese20532832006-11-22 13:20:50 +0100335
wdenk0442ed82002-11-03 10:24:00 +0000336 /*----------------------------------------------------------------*/
337 /* Initialize debug */
338 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200339 mfspr r1,SPRN_DBCR0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200340 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
341 bne skip_debug_init /* if set, don't clear debug register */
Victor Gallardoad876ff2010-09-16 11:32:04 -0700342 mfspr r1,SPRN_CCR0
343 ori r1,r1,CCR0_DTB@l /* Disable Trace Broadcast */
344 mtspr SPRN_CCR0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200345 mtspr SPRN_DBCR0,r0
346 mtspr SPRN_DBCR1,r0
347 mtspr SPRN_DBCR2,r0
348 mtspr SPRN_IAC1,r0
349 mtspr SPRN_IAC2,r0
350 mtspr SPRN_IAC3,r0
351 mtspr SPRN_DAC1,r0
352 mtspr SPRN_DAC2,r0
353 mtspr SPRN_DVC1,r0
354 mtspr SPRN_DVC2,r0
wdenk0442ed82002-11-03 10:24:00 +0000355
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200356 mfspr r1,SPRN_DBSR
357 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200358skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000359
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200360#if defined (CONFIG_440SPE)
361 /*----------------------------------------------------------------+
362 | Initialize Core Configuration Reg1.
363 | a. ICDPEI: Record even parity. Normal operation.
364 | b. ICTPEI: Record even parity. Normal operation.
365 | c. DCTPEI: Record even parity. Normal operation.
366 | d. DCDPEI: Record even parity. Normal operation.
367 | e. DCUPEI: Record even parity. Normal operation.
368 | f. DCMPEI: Record even parity. Normal operation.
369 | g. FCOM: Normal operation
370 | h. MMUPEI: Record even parity. Normal operation.
371 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200372 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200373 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200374 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200375 mtspr SPRN_CCR1, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200376
377 /*----------------------------------------------------------------+
378 | Reset the timebase.
379 | The previous write to CCR1 sets the timebase source.
380 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200381 mtspr SPRN_TBWL, r0
382 mtspr SPRN_TBWU, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200383#endif
384
wdenk0442ed82002-11-03 10:24:00 +0000385 /*----------------------------------------------------------------*/
386 /* Setup interrupt vectors */
387 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200388 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200389 li r1,0x0100
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200390 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200391 li r1,0x0200
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200392 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200393 li r1,0x0300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200394 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200395 li r1,0x0400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200396 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000397 li r1,0x0500
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200398 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000399 li r1,0x0600
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200400 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000401 li r1,0x0700
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200402 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000403 li r1,0x0800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200404 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000405 li r1,0x0c00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200406 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200407 li r1,0x0a00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200408 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200409 li r1,0x0900
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200410 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000411 li r1,0x1300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200412 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200413 li r1,0x1400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200414 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000415 li r1,0x2000
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200416 mtspr SPRN_IVOR15,r1 /* Debug */
wdenk0442ed82002-11-03 10:24:00 +0000417
418 /*----------------------------------------------------------------*/
419 /* Configure cache regions */
420 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200421 mtspr SPRN_INV0,r0
422 mtspr SPRN_INV1,r0
423 mtspr SPRN_INV2,r0
424 mtspr SPRN_INV3,r0
425 mtspr SPRN_DNV0,r0
426 mtspr SPRN_DNV1,r0
427 mtspr SPRN_DNV2,r0
428 mtspr SPRN_DNV3,r0
429 mtspr SPRN_ITV0,r0
430 mtspr SPRN_ITV1,r0
431 mtspr SPRN_ITV2,r0
432 mtspr SPRN_ITV3,r0
433 mtspr SPRN_DTV0,r0
434 mtspr SPRN_DTV1,r0
435 mtspr SPRN_DTV2,r0
436 mtspr SPRN_DTV3,r0
wdenk0442ed82002-11-03 10:24:00 +0000437
438 /*----------------------------------------------------------------*/
439 /* Cache victim limits */
440 /*----------------------------------------------------------------*/
441 /* floors 0, ceiling max to use the entire cache -- nothing locked
442 */
443 lis r1,0x0001
444 ori r1,r1,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200445 mtspr SPRN_IVLIM,r1
446 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000447
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200448 /*----------------------------------------------------------------+
449 |Initialize MMUCR[STID] = 0.
450 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200451 mfspr r0,SPRN_MMUCR
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200452 addis r1,0,0xFFFF
453 ori r1,r1,0xFF00
454 and r0,r0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200455 mtspr SPRN_MMUCR,r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200456
wdenk0442ed82002-11-03 10:24:00 +0000457 /*----------------------------------------------------------------*/
458 /* Clear all TLB entries -- TID = 0, TS = 0 */
459 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200460 addis r0,0,0x0000
Stefan Roese0a371ca2009-07-14 15:53:08 +0200461#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesed8731332009-05-11 13:46:14 +0200462 li r4,0 /* Start with TLB #0 */
Stefan Roese0a371ca2009-07-14 15:53:08 +0200463#else
464 li r4,1 /* Start with TLB #1 */
465#endif
466 li r1,64 /* 64 TLB entries */
467 sub r1,r1,r4 /* calculate last TLB # */
468 mtctr r1
Stefan Roesed8731332009-05-11 13:46:14 +0200469rsttlb:
470#ifdef CONFIG_SYS_RAMBOOT
471 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
472 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
473 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
474#endif
475 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
476 tlbwe r0,r4,1
477 tlbwe r0,r4,2
478tlbnxt: addi r4,r4,1 /* Next TLB */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200479 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000480
481 /*----------------------------------------------------------------*/
482 /* TLB entry setup -- step thru tlbtab */
483 /*----------------------------------------------------------------*/
Stefan Roese2a72e9e2010-04-09 14:03:59 +0200484#if defined(CONFIG_440SPE_REVA)
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200485 /*----------------------------------------------------------------*/
486 /* We have different TLB tables for revA and rev B of 440SPe */
487 /*----------------------------------------------------------------*/
488 mfspr r1, PVR
489 lis r0,0x5342
490 ori r0,r0,0x1891
491 cmpw r7,r1,r0
492 bne r7,..revA
493 bl tlbtabB
494 b ..goon
495..revA:
496 bl tlbtabA
497..goon:
498#else
wdenk0442ed82002-11-03 10:24:00 +0000499 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200500#endif
wdenk0442ed82002-11-03 10:24:00 +0000501 mr r5,r0
502 li r1,0x003f /* 64 TLB entries max */
503 mtctr r1
504 li r4,0 /* TLB # */
505
506 addi r5,r5,-4
Stefan Roesed8731332009-05-11 13:46:14 +02005071:
508#ifdef CONFIG_SYS_RAMBOOT
509 tlbre r3,r4,0 /* Read contents from TLB word #0 */
510 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
511 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
512#endif
513 lwzu r0,4(r5)
wdenk0442ed82002-11-03 10:24:00 +0000514 cmpwi r0,0
515 beq 2f /* 0 marks end */
516 lwzu r1,4(r5)
517 lwzu r2,4(r5)
518 tlbwe r0,r4,0 /* TLB Word 0 */
519 tlbwe r1,r4,1 /* TLB Word 1 */
520 tlbwe r2,r4,2 /* TLB Word 2 */
Stefan Roesed8731332009-05-11 13:46:14 +0200521tlbnx2: addi r4,r4,1 /* Next TLB */
wdenk0442ed82002-11-03 10:24:00 +0000522 bdnz 1b
523
524 /*----------------------------------------------------------------*/
525 /* Continue from 'normal' start */
526 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02005272:
Stefan Roese887e2ec2006-09-07 11:51:23 +0200528 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000529 b _start
530
5313: li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200532 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
wdenk0442ed82002-11-03 10:24:00 +0000533 mflr r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200534 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000535 rfi
stroeseb867d702003-05-23 11:18:02 +0000536#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000537
538/*
539 * r3 - 1st arg to board_init(): IMMP pointer
540 * r4 - 2nd arg to board_init(): boot flag
541 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200542#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000543 .text
544 .long 0x27051956 /* U-Boot Magic Number */
545 .globl version_string
546version_string:
Andreas Bießmann09c2e902011-07-18 20:24:04 +0200547 .ascii U_BOOT_VERSION_STRING, "\0"
wdenk0442ed82002-11-03 10:24:00 +0000548
wdenk0442ed82002-11-03 10:24:00 +0000549 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200550 .globl _start_of_vectors
551_start_of_vectors:
552
553/* Critical input. */
554 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
555
556#ifdef CONFIG_440
557/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200558 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200559#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200560 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200561#endif /* CONFIG_440 */
562
563/* Data Storage exception. */
564 STD_EXCEPTION(0x300, DataStorage, UnknownException)
565
566/* Instruction Storage exception. */
567 STD_EXCEPTION(0x400, InstStorage, UnknownException)
568
569/* External Interrupt exception. */
570 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
571
572/* Alignment exception. */
573 . = 0x600
574Alignment:
575 EXCEPTION_PROLOG(SRR0, SRR1)
576 mfspr r4,DAR
577 stw r4,_DAR(r21)
578 mfspr r5,DSISR
579 stw r5,_DSISR(r21)
580 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100581 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200582
583/* Program check exception */
584 . = 0x700
585ProgramCheck:
586 EXCEPTION_PROLOG(SRR0, SRR1)
587 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100588 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
589 MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200590
591#ifdef CONFIG_440
592 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
593 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
594 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200595#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200596 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
597
598#ifdef CONFIG_440
599 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
600 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
601#else
602 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
603 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
604 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
605#endif
606 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
607
608 .globl _end_of_vectors
609_end_of_vectors:
610 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200611#endif
wdenk0442ed82002-11-03 10:24:00 +0000612 .globl _start
613_start:
614
615/*****************************************************************************/
616#if defined(CONFIG_440)
617
618 /*----------------------------------------------------------------*/
619 /* Clear and set up some registers. */
620 /*----------------------------------------------------------------*/
621 li r0,0x0000
622 lis r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200623 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
624 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
625 mtspr SPRN_TBWU,r0
626 mtspr SPRN_TSR,r1 /* clear all timer exception status */
627 mtspr SPRN_TCR,r0 /* disable all */
628 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
wdenk0442ed82002-11-03 10:24:00 +0000629 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000630
631 /*----------------------------------------------------------------*/
632 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200633 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000634 /* value you need in this case 0x8cff 0000 should do the trick */
635 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200636#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000637 lis r1,0xffff
638 ori r1,r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200639 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200640 lis r0,CONFIG_SYS_INIT_DBCR@h
641 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200642 mtspr SPRN_DBCR0,r0
wdenk0442ed82002-11-03 10:24:00 +0000643 isync
644#endif
645
646 /*----------------------------------------------------------------*/
647 /* Setup the internal SRAM */
648 /*----------------------------------------------------------------*/
649 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200650
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200651#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200652 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200653 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
654 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
Wolfgang Denk553f0982010-10-26 13:32:32 +0200655 addis r4,r0,CONFIG_SYS_INIT_RAM_SIZE@h
656 ori r4,r4,CONFIG_SYS_INIT_RAM_SIZE@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200657 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200658 rlwinm r5,r4,27,5,31
659 beq ..d_ran
660 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200661..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200662 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200663..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200664 dcbz r0,r3
665 addi r3,r3,32
666 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100667
668 /*
669 * Lock the init-ram/stack in d-cache, so that other regions
670 * may use d-cache as well
671 * Note, that this current implementation locks exactly 4k
672 * of d-cache, so please make sure that you don't define a
673 * bigger init-ram area. Take a look at the lwmon5 440EPx
674 * implementation as a reference.
675 */
676 msync
677 isync
678 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
679 lis r1,0x0201
680 ori r1,r1,0xf808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200681 mtspr SPRN_DVLIM,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100682 lis r1,0x0808
683 ori r1,r1,0x0808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200684 mtspr SPRN_DNV0,r1
685 mtspr SPRN_DNV1,r1
686 mtspr SPRN_DNV2,r1
687 mtspr SPRN_DNV3,r1
688 mtspr SPRN_DTV0,r1
689 mtspr SPRN_DTV1,r1
690 mtspr SPRN_DTV2,r1
691 mtspr SPRN_DTV3,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100692 msync
693 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200694#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200695
696 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
697#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
698 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100699#if defined(CONFIG_440GX) || \
700 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan7d307932008-07-08 22:47:31 -0700701 defined(CONFIG_460SX)
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600702 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700703#elif defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
704 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600705 lis r1, 0x0000
706 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
707 mtdcr L2_CACHE_CFG,r1
wdenkba56f622004-02-06 23:19:44 +0000708#endif
wdenk0442ed82002-11-03 10:24:00 +0000709
Stefan Roese887e2ec2006-09-07 11:51:23 +0200710 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000711 ori r2,r2,0xffff
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600712 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000713 and r1,r1,r2 /* Disable parity check */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600714 mtdcr ISRAM0_DPC,r1
715 mfdcr r1,ISRAM0_PMEG
Stefan Roese887e2ec2006-09-07 11:51:23 +0200716 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600717 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000718
719 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100720#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000721 ori r1,r1,0x0980 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600722 mtdcr ISRAM0_SB0CR,r1
wdenkba56f622004-02-06 23:19:44 +0000723 lis r1,0x8001
724 ori r1,r1,0x0980 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600725 mtdcr ISRAM0_SB1CR,r1
wdenkba56f622004-02-06 23:19:44 +0000726 lis r1, 0x8002
727 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600728 mtdcr ISRAM0_SB2CR,r1
wdenkba56f622004-02-06 23:19:44 +0000729 lis r1, 0x8003
730 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600731 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700732#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || \
733 defined(CONFIG_460GT) || defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600734 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200735 ori r1,r1,0x0984 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600736 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200737 lis r1,0x0001
738 ori r1,r1,0x0984 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600739 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200740 lis r1, 0x0002
741 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600742 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200743 lis r1, 0x0003
744 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600745 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700746#if defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
747 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600748 lis r2,0x7fff
749 ori r2,r2,0xffff
750 mfdcr r1,ISRAM1_DPC
751 and r1,r1,r2 /* Disable parity check */
Wolfgang Denk455ae7e2008-12-16 01:02:17 +0100752 mtdcr ISRAM1_DPC,r1
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600753 mfdcr r1,ISRAM1_PMEG
754 and r1,r1,r2 /* Disable pwr mgmt */
755 mtdcr ISRAM1_PMEG,r1
756
757 lis r1,0x0004 /* BAS = 4_0004_0000 */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700758 ori r1,r1,ISRAM1_SIZE /* ocm size */
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600759 mtdcr ISRAM1_SB0CR,r1
760#endif
Feng Kan7d307932008-07-08 22:47:31 -0700761#elif defined(CONFIG_460SX)
762 lis r1,0x0000 /* BAS = 0000_0000 */
763 ori r1,r1,0x0B84 /* first 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600764 mtdcr ISRAM0_SB0CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700765 lis r1,0x0001
766 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600767 mtdcr ISRAM0_SB1CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700768 lis r1, 0x0002
769 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600770 mtdcr ISRAM0_SB2CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700771 lis r1, 0x0003
772 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600773 mtdcr ISRAM0_SB3CR,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200774#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000775 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600776 mtdcr ISRAM0_SB0CR,r1
777 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
wdenkba56f622004-02-06 23:19:44 +0000778#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200779#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000780
781 /*----------------------------------------------------------------*/
782 /* Setup the stack in internal SRAM */
783 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200784 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
785 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000786 li r0,0
787 stwu r0,-4(r1)
788 stwu r0,-4(r1) /* Terminate call chain */
789
790 stwu r1,-8(r1) /* Save back chain and move SP */
791 lis r0,RESET_VECTOR@h /* Address of reset vector */
792 ori r0,r0, RESET_VECTOR@l
793 stwu r1,-8(r1) /* Save back chain and move SP */
794 stw r0,+12(r1) /* Save return addr (underflow vect) */
Wolfgang Denk8c4734e2011-04-20 22:11:21 +0200795
Stefan Roese887e2ec2006-09-07 11:51:23 +0200796#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +0200797 bl nand_boot_common /* will not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200798#else
wdenk0442ed82002-11-03 10:24:00 +0000799 GET_GOT
Stefan Roese5568e612005-11-22 13:20:42 +0100800
801 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000802 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500803 /* NOTREACHED - board_init_f() does not return */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200804#endif
wdenk0442ed82002-11-03 10:24:00 +0000805
806#endif /* CONFIG_440 */
807
808/*****************************************************************************/
809#ifdef CONFIG_IOP480
810 /*----------------------------------------------------------------------- */
811 /* Set up some machine state registers. */
812 /*----------------------------------------------------------------------- */
813 addi r0,r0,0x0000 /* initialize r0 to zero */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200814 mtspr SPRN_ESR,r0 /* clear Exception Syndrome Reg */
wdenk0442ed82002-11-03 10:24:00 +0000815 mttcr r0 /* timer control register */
816 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000817 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
818 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
819 mtdbsr r4 /* clear/reset the dbsr */
820 mtexisr r4 /* clear all pending interrupts */
821 addis r4,r0,0x8000
822 mtexier r4 /* enable critical exceptions */
823 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
824 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
825 mtiocr r4 /* since bit not used) & DRC to latch */
826 /* data bus on rising edge of CAS */
827 /*----------------------------------------------------------------------- */
828 /* Clear XER. */
829 /*----------------------------------------------------------------------- */
830 mtxer r0
831 /*----------------------------------------------------------------------- */
832 /* Invalidate i-cache and d-cache TAG arrays. */
833 /*----------------------------------------------------------------------- */
834 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
835 addi r4,0,1024 /* 1/4 of I-cache */
836..cloop:
837 iccci 0,r3
838 iccci r4,r3
839 dccci 0,r3
840 addic. r3,r3,-16 /* move back one cache line */
841 bne ..cloop /* loop back to do rest until r3 = 0 */
842
843 /* */
844 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
845 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
846 /* */
847
848 /* first copy IOP480 register base address into r3 */
849 addis r3,0,0x5000 /* IOP480 register base address hi */
850/* ori r3,r3,0x0000 / IOP480 register base address lo */
851
852#ifdef CONFIG_ADCIOP
853 /* use r4 as the working variable */
854 /* turn on CS3 (LOCCTL.7) */
855 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
856 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
857 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
858#endif
859
860#ifdef CONFIG_DASA_SIM
861 /* use r4 as the working variable */
862 /* turn on MA17 (LOCCTL.7) */
863 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
864 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
865 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
866#endif
867
868 /* turn on MA16..13 (LCS0BRD.12 = 0) */
869 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
870 andi. r4,r4,0xefff /* make bit 12 = 0 */
871 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
872
873 /* make sure above stores all comlete before going on */
874 sync
875
876 /* last thing, set local init status done bit (DEVINIT.31) */
877 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
878 oris r4,r4,0x8000 /* make bit 31 = 1 */
879 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
880
881 /* clear all pending interrupts and disable all interrupts */
882 li r4,-1 /* set p1 to 0xffffffff */
883 stw r4,0x1b0(r3) /* clear all pending interrupts */
884 stw r4,0x1b8(r3) /* clear all pending interrupts */
885 li r4,0 /* set r4 to 0 */
886 stw r4,0x1b4(r3) /* disable all interrupts */
887 stw r4,0x1bc(r3) /* disable all interrupts */
888
889 /* make sure above stores all comlete before going on */
890 sync
891
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700892 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200893 lis r1, CONFIG_SYS_ICACHE_SACR_VALUE@h
894 ori r1, r1, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700895 mticcr r1
896 isync
wdenk0442ed82002-11-03 10:24:00 +0000897
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700898 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200899 lis r1, CONFIG_SYS_DCACHE_SACR_VALUE@h
900 ori r1, r1, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700901 mtdccr r1
wdenk0442ed82002-11-03 10:24:00 +0000902
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200903 addis r1,r0,CONFIG_SYS_INIT_RAM_ADDR@h
904 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack to SDRAM */
wdenk0442ed82002-11-03 10:24:00 +0000905 li r0, 0 /* Make room for stack frame header and */
906 stwu r0, -4(r1) /* clear final stack frame so that */
907 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
908
909 GET_GOT /* initialize GOT access */
Wolfgang Denk8c4734e2011-04-20 22:11:21 +0200910
wdenk0442ed82002-11-03 10:24:00 +0000911 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500912 /* NOTREACHED - board_init_f() does not return */
wdenk0442ed82002-11-03 10:24:00 +0000913
914#endif /* CONFIG_IOP480 */
915
916/*****************************************************************************/
Stefan Roesee01bd212007-03-21 13:38:59 +0100917#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
918 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200919 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000920 /*----------------------------------------------------------------------- */
921 /* Clear and set up some registers. */
922 /*----------------------------------------------------------------------- */
923 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200924#if !defined(CONFIG_405EX)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200925 mtspr SPRN_SGR,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200926#else
927 /*
928 * On 405EX, completely clearing the SGR leads to PPC hangup
929 * upon PCIe configuration access. The PCIe memory regions
930 * need to be guarded!
931 */
932 lis r3,0x0000
933 ori r3,r3,0x7FFC
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200934 mtspr SPRN_SGR,r3
Stefan Roesedbbd1252007-10-05 17:10:59 +0200935#endif
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200936 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000937 mtesr r4 /* clear Exception Syndrome Reg */
938 mttcr r4 /* clear Timer Control Reg */
939 mtxer r4 /* clear Fixed-Point Exception Reg */
940 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000941 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
942 /* dbsr is cleared by setting bits to 1) */
943 mtdbsr r4 /* clear/reset the dbsr */
944
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700945 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000946 bl invalidate_icache
947 bl invalidate_dcache
948
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700949 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200950 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
951 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700952 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000953 isync
954
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700955 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200956 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
957 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700958 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000959
Ricardo Ribalda Delgado1f4d5322008-10-21 18:29:46 +0200960#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
961 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000962 /*----------------------------------------------------------------------- */
963 /* Tune the speed and size for flash CS0 */
964 /*----------------------------------------------------------------------- */
965 bl ext_bus_cntlr_init
966#endif
Stefan Roese64852d02008-06-02 14:35:44 +0200967
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200968#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roesedbbd1252007-10-05 17:10:59 +0200969 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700970 * For boards that don't have OCM and can't use the data cache
971 * for their primordial stack, setup stack here directly after the
972 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roesedbbd1252007-10-05 17:10:59 +0200973 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200974 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
975 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200976
977 li r0, 0 /* Make room for stack frame header and */
978 stwu r0, -4(r1) /* clear final stack frame so that */
979 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
980 /*
981 * Set up a dummy frame to store reset vector as return address.
982 * this causes stack underflow to reset board.
983 */
984 stwu r1, -8(r1) /* Save back chain and move SP */
985 lis r0, RESET_VECTOR@h /* Address of reset vector */
986 ori r0, r0, RESET_VECTOR@l
987 stwu r1, -8(r1) /* Save back chain and move SP */
988 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200989#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000990
stroeseb867d702003-05-23 11:18:02 +0000991#if defined(CONFIG_405EP)
992 /*----------------------------------------------------------------------- */
993 /* DMA Status, clear to come up clean */
994 /*----------------------------------------------------------------------- */
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200995 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200996 ori r3,r3, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200997 mtdcr DMASR, r3
stroeseb867d702003-05-23 11:18:02 +0000998
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200999 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +00001000#endif /* CONFIG_405EP */
1001
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001002#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +01001003#if defined(CONFIG_405EZ)
1004 /********************************************************************
1005 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
1006 *******************************************************************/
1007 /*
1008 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001009 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roesee01bd212007-03-21 13:38:59 +01001010 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001011 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1012 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001013 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001014 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +01001015 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001016 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +01001017 isync
1018
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001019 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1020 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001021 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001022 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
1023 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +01001024 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001025 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
1026 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001027 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001028 mtdcr OCM0_DISDPC,r3
Stefan Roesee01bd212007-03-21 13:38:59 +01001029
1030 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +01001031#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001032 /********************************************************************
1033 * Setup OCM - On Chip Memory
1034 *******************************************************************/
1035 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +00001036 lis r0, 0x7FFF
1037 ori r0, r0, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +02001038 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
1039 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +01001040 and r3, r3, r0 /* disable data-side IRAM */
1041 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001042 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
1043 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +00001044 isync
wdenk0442ed82002-11-03 10:24:00 +00001045
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001046 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1047 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001048 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +00001049 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001050 mtdcr OCM0_DSCNTL, r4
wdenk8bde7f72003-06-27 21:31:46 +00001051 isync
Stefan Roesee01bd212007-03-21 13:38:59 +01001052#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001053#endif
1054
1055 /*----------------------------------------------------------------------- */
1056 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1057 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001058#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001059 li r4, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001060 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001061 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
1062 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001063 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001064
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001065 addi r4, 0, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001066 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001067 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
1068 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001069 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001070
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001071 /*
1072 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001073 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001074 */
1075 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001076 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1077 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +00001078 mtdccr r4
1079
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001080 /*
1081 * Preallocate data cache lines to be used to avoid a subsequent
1082 * cache miss and an ensuing machine check exception when exceptions
1083 * are enabled.
1084 */
1085 li r0, 0
wdenk0442ed82002-11-03 10:24:00 +00001086
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001087 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1088 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001089
Wolfgang Denk553f0982010-10-26 13:32:32 +02001090 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1091 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001092
1093 /*
1094 * Convert the size, in bytes, to the number of cache lines/blocks
1095 * to preallocate.
1096 */
1097 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1098 srwi r5, r4, L1_CACHE_SHIFT
1099 beq ..load_counter
1100 addi r5, r5, 0x0001
1101..load_counter:
1102 mtctr r5
1103
1104 /* Preallocate the computed number of cache blocks. */
1105..alloc_dcache_block:
1106 dcba r0, r3
1107 addi r3, r3, L1_CACHE_BYTES
1108 bdnz ..alloc_dcache_block
1109 sync
1110
1111 /*
1112 * Load the initial stack pointer and data area and convert the size,
1113 * in bytes, to the number of words to initialize to a known value.
1114 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001115 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1116 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001117
Wolfgang Denk553f0982010-10-26 13:32:32 +02001118 lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h
1119 ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001120 mtctr r4
1121
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001122 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
Wolfgang Denk553f0982010-10-26 13:32:32 +02001123 ori r2, r2, CONFIG_SYS_INIT_RAM_SIZE@l
wdenk0442ed82002-11-03 10:24:00 +00001124
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001125 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1126 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001127
1128..stackloop:
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001129 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001130 bdnz ..stackloop
1131
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001132 /*
1133 * Make room for stack frame header and clear final stack frame so
1134 * that stack backtraces terminate cleanly.
1135 */
1136 stwu r0, -4(r1)
1137 stwu r0, -4(r1)
1138
wdenk0442ed82002-11-03 10:24:00 +00001139 /*
1140 * Set up a dummy frame to store reset vector as return address.
1141 * this causes stack underflow to reset board.
1142 */
1143 stwu r1, -8(r1) /* Save back chain and move SP */
1144 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1145 ori r0, r0, RESET_VECTOR@l
1146 stwu r1, -8(r1) /* Save back chain and move SP */
1147 stw r0, +12(r1) /* Save return addr (underflow vect) */
1148
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001149#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1150 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001151 /*
1152 * Stack in OCM.
1153 */
1154
1155 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001156 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1157 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001158
1159 /* Set up a zeroized stack frame so that backtrace works right */
1160 li r0, 0
1161 stwu r0, -4(r1)
1162 stwu r0, -4(r1)
1163
1164 /*
1165 * Set up a dummy frame to store reset vector as return address.
1166 * this causes stack underflow to reset board.
1167 */
1168 stwu r1, -8(r1) /* Save back chain and move SP */
1169 lis r0, RESET_VECTOR@h /* Address of reset vector */
1170 ori r0, r0, RESET_VECTOR@l
1171 stwu r1, -8(r1) /* Save back chain and move SP */
1172 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001173#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001174
Stefan Roesec440bfe2007-06-06 11:42:13 +02001175#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +02001176 bl nand_boot_common /* will not return */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001177#else
wdenk0442ed82002-11-03 10:24:00 +00001178 GET_GOT /* initialize GOT access */
1179
Wolfgang Denkf901a832005-08-06 01:42:58 +02001180 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001181
wdenk0442ed82002-11-03 10:24:00 +00001182 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser52ebd9c2010-09-14 19:13:53 -05001183 /* NOTREACHED - board_init_f() does not return */
1184
Stefan Roesec440bfe2007-06-06 11:42:13 +02001185#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001186
wdenk12f34242003-09-02 22:48:03 +00001187#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1188 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001189
1190
Stefan Roese887e2ec2006-09-07 11:51:23 +02001191#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001192/*
1193 * This code finishes saving the registers to the exception frame
1194 * and jumps to the appropriate handler for the exception.
1195 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1196 */
1197 .globl transfer_to_handler
1198transfer_to_handler:
1199 stw r22,_NIP(r21)
1200 lis r22,MSR_POW@h
1201 andc r23,r23,r22
1202 stw r23,_MSR(r21)
1203 SAVE_GPR(7, r21)
1204 SAVE_4GPRS(8, r21)
1205 SAVE_8GPRS(12, r21)
1206 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001207 mflr r23
1208 andi. r24,r23,0x3f00 /* get vector offset */
1209 stw r24,TRAP(r21)
1210 li r22,0
1211 stw r22,RESULT(r21)
1212 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001213 lwz r24,0(r23) /* virtual address of handler */
1214 lwz r23,4(r23) /* where to go when done */
1215 mtspr SRR0,r24
1216 mtspr SRR1,r20
1217 mtlr r23
1218 SYNC
1219 rfi /* jump to handler, enable MMU */
1220
1221int_return:
1222 mfmsr r28 /* Disable interrupts */
1223 li r4,0
1224 ori r4,r4,MSR_EE
1225 andc r28,r28,r4
1226 SYNC /* Some chip revs need this... */
1227 mtmsr r28
1228 SYNC
1229 lwz r2,_CTR(r1)
1230 lwz r0,_LINK(r1)
1231 mtctr r2
1232 mtlr r0
1233 lwz r2,_XER(r1)
1234 lwz r0,_CCR(r1)
1235 mtspr XER,r2
1236 mtcrf 0xFF,r0
1237 REST_10GPRS(3, r1)
1238 REST_10GPRS(13, r1)
1239 REST_8GPRS(23, r1)
1240 REST_GPR(31, r1)
1241 lwz r2,_NIP(r1) /* Restore environment */
1242 lwz r0,_MSR(r1)
1243 mtspr SRR0,r2
1244 mtspr SRR1,r0
1245 lwz r0,GPR0(r1)
1246 lwz r2,GPR2(r1)
1247 lwz r1,GPR1(r1)
1248 SYNC
1249 rfi
1250
1251crit_return:
1252 mfmsr r28 /* Disable interrupts */
1253 li r4,0
1254 ori r4,r4,MSR_EE
1255 andc r28,r28,r4
1256 SYNC /* Some chip revs need this... */
1257 mtmsr r28
1258 SYNC
1259 lwz r2,_CTR(r1)
1260 lwz r0,_LINK(r1)
1261 mtctr r2
1262 mtlr r0
1263 lwz r2,_XER(r1)
1264 lwz r0,_CCR(r1)
1265 mtspr XER,r2
1266 mtcrf 0xFF,r0
1267 REST_10GPRS(3, r1)
1268 REST_10GPRS(13, r1)
1269 REST_8GPRS(23, r1)
1270 REST_GPR(31, r1)
1271 lwz r2,_NIP(r1) /* Restore environment */
1272 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001273 mtspr SPRN_CSRR0,r2
1274 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001275 lwz r0,GPR0(r1)
1276 lwz r2,GPR2(r1)
1277 lwz r1,GPR1(r1)
1278 SYNC
1279 rfci
1280
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001281#ifdef CONFIG_440
1282mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001283 mfmsr r28 /* Disable interrupts */
1284 li r4,0
1285 ori r4,r4,MSR_EE
1286 andc r28,r28,r4
1287 SYNC /* Some chip revs need this... */
1288 mtmsr r28
1289 SYNC
1290 lwz r2,_CTR(r1)
1291 lwz r0,_LINK(r1)
1292 mtctr r2
1293 mtlr r0
1294 lwz r2,_XER(r1)
1295 lwz r0,_CCR(r1)
1296 mtspr XER,r2
1297 mtcrf 0xFF,r0
1298 REST_10GPRS(3, r1)
1299 REST_10GPRS(13, r1)
1300 REST_8GPRS(23, r1)
1301 REST_GPR(31, r1)
1302 lwz r2,_NIP(r1) /* Restore environment */
1303 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001304 mtspr SPRN_MCSRR0,r2
1305 mtspr SPRN_MCSRR1,r0
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001306 lwz r0,GPR0(r1)
1307 lwz r2,GPR2(r1)
1308 lwz r1,GPR1(r1)
1309 SYNC
1310 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001311#endif /* CONFIG_440 */
1312
1313
wdenk0442ed82002-11-03 10:24:00 +00001314 .globl get_pvr
1315get_pvr:
1316 mfspr r3, PVR
1317 blr
1318
wdenk0442ed82002-11-03 10:24:00 +00001319/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001320/* Function: out16 */
1321/* Description: Output 16 bits */
1322/*------------------------------------------------------------------------------- */
1323 .globl out16
1324out16:
1325 sth r4,0x0000(r3)
1326 blr
1327
1328/*------------------------------------------------------------------------------- */
1329/* Function: out16r */
1330/* Description: Byte reverse and output 16 bits */
1331/*------------------------------------------------------------------------------- */
1332 .globl out16r
1333out16r:
1334 sthbrx r4,r0,r3
1335 blr
1336
1337/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001338/* Function: out32r */
1339/* Description: Byte reverse and output 32 bits */
1340/*------------------------------------------------------------------------------- */
1341 .globl out32r
1342out32r:
1343 stwbrx r4,r0,r3
1344 blr
1345
1346/*------------------------------------------------------------------------------- */
1347/* Function: in16 */
1348/* Description: Input 16 bits */
1349/*------------------------------------------------------------------------------- */
1350 .globl in16
1351in16:
1352 lhz r3,0x0000(r3)
1353 blr
1354
1355/*------------------------------------------------------------------------------- */
1356/* Function: in16r */
1357/* Description: Input 16 bits and byte reverse */
1358/*------------------------------------------------------------------------------- */
1359 .globl in16r
1360in16r:
1361 lhbrx r3,r0,r3
1362 blr
1363
1364/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001365/* Function: in32r */
1366/* Description: Input 32 bits and byte reverse */
1367/*------------------------------------------------------------------------------- */
1368 .globl in32r
1369in32r:
1370 lwbrx r3,r0,r3
1371 blr
1372
wdenk0442ed82002-11-03 10:24:00 +00001373/*
1374 * void relocate_code (addr_sp, gd, addr_moni)
1375 *
1376 * This "function" does not return, instead it continues in RAM
1377 * after relocating the monitor code.
1378 *
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001379 * r3 = Relocated stack pointer
1380 * r4 = Relocated global data pointer
1381 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001382 */
1383 .globl relocate_code
1384relocate_code:
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001385#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roese9b94ac62007-10-31 17:55:58 +01001386 /*
Stefan Roese79209542010-11-26 15:45:34 +01001387 * We need to flush the initial global data (gd_t) and bd_info
1388 * before the dcache will be invalidated.
Stefan Roese9b94ac62007-10-31 17:55:58 +01001389 */
1390
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001391 /* Save registers */
1392 mr r9, r3
1393 mr r10, r4
1394 mr r11, r5
Stefan Roese9b94ac62007-10-31 17:55:58 +01001395
Stefan Roese79209542010-11-26 15:45:34 +01001396 /*
1397 * Flush complete dcache, this is faster than flushing the
1398 * ranges for global_data and bd_info instead.
1399 */
1400 bl flush_dcache
Stefan Roese9b94ac62007-10-31 17:55:58 +01001401
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001402#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001403 /*
1404 * Undo the earlier data cache set-up for the primordial stack and
1405 * data area. First, invalidate the data cache and then disable data
1406 * cacheability for that area. Finally, restore the EBC values, if
1407 * any.
1408 */
1409
1410 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001411 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1412 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001413
Wolfgang Denk553f0982010-10-26 13:32:32 +02001414 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1415 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001416 add r4, r4, r3
1417
1418 bl invalidate_dcache_range
1419
1420 /* Disable cacheability for the region */
1421 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001422 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1423 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001424 and r3, r3, r4
1425 mtdccr r3
1426
1427 /* Restore the EBC parameters */
1428 li r3, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001429 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001430 lis r3, PBxAP_VAL@h
1431 ori r3, r3, PBxAP_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001432 mtdcr EBC0_CFGDATA, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001433
1434 li r3, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001435 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001436 lis r3, PBxCR_VAL@h
1437 ori r3, r3, PBxCR_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001438 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001439#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001440
1441 /* Restore registers */
1442 mr r3, r9
1443 mr r4, r10
1444 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001445#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesee02c5212008-01-09 10:23:16 +01001446
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001447#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesee02c5212008-01-09 10:23:16 +01001448 /*
1449 * Unlock the previously locked d-cache
1450 */
1451 msync
1452 isync
1453 /* set TFLOOR/NFLOOR to 0 again */
1454 lis r6,0x0001
1455 ori r6,r6,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001456 mtspr SPRN_DVLIM,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001457 lis r6,0x0000
1458 ori r6,r6,0x0000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001459 mtspr SPRN_DNV0,r6
1460 mtspr SPRN_DNV1,r6
1461 mtspr SPRN_DNV2,r6
1462 mtspr SPRN_DNV3,r6
1463 mtspr SPRN_DTV0,r6
1464 mtspr SPRN_DTV1,r6
1465 mtspr SPRN_DTV2,r6
1466 mtspr SPRN_DTV3,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001467 msync
1468 isync
Stefan Roesef3cac532010-08-31 11:27:14 +02001469
1470 /* Invalidate data cache, now no longer our stack */
1471 dccci 0,0
1472 sync
1473 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001474#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesee02c5212008-01-09 10:23:16 +01001475
Stefan Roesea4c8d132006-06-02 16:18:04 +02001476 /*
1477 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1478 * to speed up the boot process. Now this cache needs to be disabled.
1479 */
Stefan Roese4978e602010-05-27 16:45:20 +02001480#if defined(CONFIG_440)
Stefan Roese25fb4ea2008-11-20 11:46:20 +01001481 /* Clear all potential pending exceptions */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001482 mfspr r1,SPRN_MCSR
1483 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001484 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001485 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001486 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001487 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001488 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001489 isync
Stefan Roese4978e602010-05-27 16:45:20 +02001490#endif /* defined(CONFIG_440) */
wdenk0442ed82002-11-03 10:24:00 +00001491 mr r1, r3 /* Set new stack pointer */
1492 mr r9, r4 /* Save copy of Init Data pointer */
1493 mr r10, r5 /* Save copy of Destination Address */
1494
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001495 GET_GOT
wdenk0442ed82002-11-03 10:24:00 +00001496 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001497 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1498 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001499 lwz r5, GOT(__init_end)
1500 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001501 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001502
1503 /*
1504 * Fix GOT pointer:
1505 *
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001506 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001507 *
1508 * Offset:
1509 */
1510 sub r15, r10, r4
1511
1512 /* First our own GOT */
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001513 add r12, r12, r15
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001514 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001515 add r30, r30, r15
1516
1517 /*
1518 * Now relocate code
1519 */
1520
1521 cmplw cr1,r3,r4
1522 addi r0,r5,3
1523 srwi. r0,r0,2
1524 beq cr1,4f /* In place copy is not necessary */
1525 beq 7f /* Protect against 0 count */
1526 mtctr r0
1527 bge cr1,2f
1528
1529 la r8,-4(r4)
1530 la r7,-4(r3)
15311: lwzu r0,4(r8)
1532 stwu r0,4(r7)
1533 bdnz 1b
1534 b 4f
1535
15362: slwi r0,r0,2
1537 add r8,r4,r0
1538 add r7,r3,r0
15393: lwzu r0,-4(r8)
1540 stwu r0,-4(r7)
1541 bdnz 3b
1542
1543/*
1544 * Now flush the cache: note that we must start from a cache aligned
1545 * address. Otherwise we might miss one cache line.
1546 */
15474: cmpwi r6,0
1548 add r5,r3,r5
1549 beq 7f /* Always flush prefetch queue in any case */
1550 subi r0,r6,1
1551 andc r3,r3,r0
1552 mr r4,r3
15535: dcbst 0,r4
1554 add r4,r4,r6
1555 cmplw r4,r5
1556 blt 5b
1557 sync /* Wait for all dcbst to complete on bus */
1558 mr r4,r3
15596: icbi 0,r4
1560 add r4,r4,r6
1561 cmplw r4,r5
1562 blt 6b
15637: sync /* Wait for all icbi to complete on bus */
1564 isync
1565
1566/*
1567 * We are done. Do not return, instead branch to second part of board
1568 * initialization, now running from RAM.
1569 */
1570
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001571 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001572 mtlr r0
1573 blr /* NEVER RETURNS! */
1574
1575in_ram:
1576
1577 /*
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001578 * Relocation Function, r12 point to got2+0x8000
wdenk0442ed82002-11-03 10:24:00 +00001579 *
1580 * Adjust got2 pointers, no need to check for 0, this code
1581 * already puts a few entries in the table.
1582 */
1583 li r0,__got2_entries@sectoff@l
1584 la r3,GOT(_GOT2_TABLE_)
1585 lwz r11,GOT(_GOT2_TABLE_)
1586 mtctr r0
1587 sub r11,r3,r11
1588 addi r3,r3,-4
15891: lwzu r0,4(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001590 cmpwi r0,0
1591 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001592 add r0,r0,r11
1593 stw r0,0(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +020015942: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001595
1596 /*
1597 * Now adjust the fixups and the pointers to the fixups
1598 * in case we need to move ourselves again.
1599 */
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001600 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001601 lwz r3,GOT(_FIXUP_TABLE_)
1602 cmpwi r0,0
1603 mtctr r0
1604 addi r3,r3,-4
1605 beq 4f
16063: lwzu r4,4(r3)
1607 lwzux r0,r4,r11
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001608 cmpwi r0,0
wdenk0442ed82002-11-03 10:24:00 +00001609 add r0,r0,r11
Joakim Tjernlund34bbf612010-11-04 19:02:00 +01001610 stw r4,0(r3)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001611 beq- 5f
wdenk0442ed82002-11-03 10:24:00 +00001612 stw r0,0(r4)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +020016135: bdnz 3b
wdenk0442ed82002-11-03 10:24:00 +000016144:
1615clear_bss:
1616 /*
1617 * Now clear BSS segment
1618 */
wdenk5d232d02003-05-22 22:52:13 +00001619 lwz r3,GOT(__bss_start)
Po-Yu Chuang44c6e652011-03-01 22:59:59 +00001620 lwz r4,GOT(__bss_end__)
wdenk0442ed82002-11-03 10:24:00 +00001621
1622 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001623 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001624
1625 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001626
1627 andi. r5, r4, 3
1628 beq 6f
1629 sub r4, r4, r5
1630 mtctr r5
1631 mr r5, r4
16325: stb r0, 0(r5)
1633 addi r5, r5, 1
1634 bdnz 5b
16356:
wdenk0442ed82002-11-03 10:24:00 +00001636 stw r0, 0(r3)
1637 addi r3, r3, 4
1638 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001639 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001640
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010016417:
wdenk0442ed82002-11-03 10:24:00 +00001642 mr r3, r9 /* Init Data pointer */
1643 mr r4, r10 /* Destination Address */
1644 bl board_init_r
1645
wdenk0442ed82002-11-03 10:24:00 +00001646 /*
1647 * Copy exception vector code to low memory
1648 *
1649 * r3: dest_addr
1650 * r7: source address, r8: end address, r9: target address
1651 */
1652 .globl trap_init
1653trap_init:
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001654 mflr r4 /* save link register */
1655 GET_GOT
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001656 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001657 lwz r8, GOT(_end_of_vectors)
1658
wdenk682011f2003-06-03 23:54:09 +00001659 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001660
1661 cmplw 0, r7, r8
1662 bgelr /* return if r7>=r8 - just in case */
wdenk0442ed82002-11-03 10:24:00 +000016631:
1664 lwz r0, 0(r7)
1665 stw r0, 0(r9)
1666 addi r7, r7, 4
1667 addi r9, r9, 4
1668 cmplw 0, r7, r8
1669 bne 1b
1670
1671 /*
1672 * relocate `hdlr' and `int_return' entries
1673 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001674 li r7, .L_MachineCheck - _start + _START_OFFSET
1675 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000016762:
1677 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001678 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001679 cmplw 0, r7, r8
1680 blt 2b
1681
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001682 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001683 bl trap_reloc
1684
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001685 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001686 bl trap_reloc
1687
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001688#ifdef CONFIG_440
1689 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001690 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001691
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001692 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001693 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001694
1695 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001696 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001697
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001698 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1699 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001700
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001701 li r7, .L_DataTLBError - _start + _START_OFFSET
1702 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001703#else /* CONFIG_440 */
1704 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001705 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001706
1707 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001708 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001709
1710 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001711 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001712#endif /* CONFIG_440 */
1713
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001714 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1715 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001716
Stefan Roese887e2ec2006-09-07 11:51:23 +02001717#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001718 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1719 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1720 mtmsr r7 /* change MSR */
1721#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001722 bl __440_msr_set
1723 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001724
Stefan Roese887e2ec2006-09-07 11:51:23 +02001725__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001726 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1727 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001728 mtspr SPRN_SRR1,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001729 mflr r7
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001730 mtspr SPRN_SRR0,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001731 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001732__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001733#endif
1734
wdenk0442ed82002-11-03 10:24:00 +00001735 mtlr r4 /* restore link register */
1736 blr
1737
Stefan Roesecf959c72007-06-01 15:27:11 +02001738#if defined(CONFIG_440)
1739/*----------------------------------------------------------------------------+
1740| dcbz_area.
1741+----------------------------------------------------------------------------*/
1742 function_prolog(dcbz_area)
1743 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001744 rlwinm r5,r4,27,5,31
1745 beq ..d_ra2
1746 addi r5,r5,0x0001
1747..d_ra2:mtctr r5
1748..d_ag2:dcbz r0,r3
1749 addi r3,r3,32
1750 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001751 sync
1752 blr
1753 function_epilog(dcbz_area)
Stefan Roesecf959c72007-06-01 15:27:11 +02001754#endif /* CONFIG_440 */
Stefan Roese887e2ec2006-09-07 11:51:23 +02001755#endif /* CONFIG_NAND_SPL */
stroeseb867d702003-05-23 11:18:02 +00001756
Stefan Roesecf959c72007-06-01 15:27:11 +02001757/*------------------------------------------------------------------------------- */
1758/* Function: in8 */
1759/* Description: Input 8 bits */
1760/*------------------------------------------------------------------------------- */
1761 .globl in8
1762in8:
1763 lbz r3,0x0000(r3)
1764 blr
1765
1766/*------------------------------------------------------------------------------- */
1767/* Function: out8 */
1768/* Description: Output 8 bits */
1769/*------------------------------------------------------------------------------- */
1770 .globl out8
1771out8:
1772 stb r4,0x0000(r3)
1773 blr
1774
1775/*------------------------------------------------------------------------------- */
1776/* Function: out32 */
1777/* Description: Output 32 bits */
1778/*------------------------------------------------------------------------------- */
1779 .globl out32
1780out32:
1781 stw r4,0x0000(r3)
1782 blr
1783
1784/*------------------------------------------------------------------------------- */
1785/* Function: in32 */
1786/* Description: Input 32 bits */
1787/*------------------------------------------------------------------------------- */
1788 .globl in32
1789in32:
1790 lwz 3,0x0000(3)
1791 blr
stroeseb867d702003-05-23 11:18:02 +00001792
1793/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001794/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001795/**************************************************************************/
1796#ifdef CONFIG_405EP
1797ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001798
Stefan Roesec157d8e2005-08-01 16:41:48 +02001799#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001800 /*
1801 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1802 * function) to support FPGA and NVRAM accesses below.
1803 */
1804
1805 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1806 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001807 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1808 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001809 stw r4,0(r3)
1810 lis r3,GPIO0_OSRL@h
1811 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001812 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1813 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001814 stw r4,0(r3)
1815
1816 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1817 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001818 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1819 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroeseb828dda2003-12-09 14:54:43 +00001820 stw r4,0(r3)
1821 lis r3,GPIO0_ISR1L@h
1822 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001823 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1824 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroeseb828dda2003-12-09 14:54:43 +00001825 stw r4,0(r3)
1826
1827 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1828 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001829 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1830 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001831 stw r4,0(r3)
1832 lis r3,GPIO0_TSRL@h
1833 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001834 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1835 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001836 stw r4,0(r3)
1837
1838 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1839 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001840 lis r4,CONFIG_SYS_GPIO0_TCR@h
1841 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroeseb828dda2003-12-09 14:54:43 +00001842 stw r4,0(r3)
1843
Stefan Roesed1c3b272009-09-09 16:25:29 +02001844 li r3,PB1AP /* program EBC bank 1 for RTC access */
1845 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001846 lis r3,CONFIG_SYS_EBC_PB1AP@h
1847 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001848 mtdcr EBC0_CFGDATA,r3
1849 li r3,PB1CR
1850 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001851 lis r3,CONFIG_SYS_EBC_PB1CR@h
1852 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001853 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001854
Stefan Roesed1c3b272009-09-09 16:25:29 +02001855 li r3,PB1AP /* program EBC bank 1 for RTC access */
1856 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001857 lis r3,CONFIG_SYS_EBC_PB1AP@h
1858 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001859 mtdcr EBC0_CFGDATA,r3
1860 li r3,PB1CR
1861 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001862 lis r3,CONFIG_SYS_EBC_PB1CR@h
1863 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001864 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001865
Stefan Roesed1c3b272009-09-09 16:25:29 +02001866 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1867 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001868 lis r3,CONFIG_SYS_EBC_PB4AP@h
1869 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001870 mtdcr EBC0_CFGDATA,r3
1871 li r3,PB4CR
1872 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001873 lis r3,CONFIG_SYS_EBC_PB4CR@h
1874 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001875 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001876#endif
1877
wdenk8bde7f72003-06-27 21:31:46 +00001878 /*
1879 !-----------------------------------------------------------------------
1880 ! Check to see if chip is in bypass mode.
1881 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1882 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001883 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1884 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001885 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001886 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001887 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001888 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001889 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001890
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001891 beq pll_done /* if SSCS =b'1' then PLL has */
1892 /* already been set */
1893 /* and CPU has been reset */
1894 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001895
Stefan Roesec157d8e2005-08-01 16:41:48 +02001896#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001897 /*
wdenk8bde7f72003-06-27 21:31:46 +00001898 !-----------------------------------------------------------------------
1899 ! Read NVRAM to get value to write in PLLMR.
1900 ! If value has not been correctly saved, write default value
1901 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1902 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1903 !
1904 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001905 ! structure in openbios.h. Changing the beginning of
1906 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001907 !
1908 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001909 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001910 addis r3,0,NVRAM_BASE@h
1911 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001912
Wolfgang Denkf901a832005-08-06 01:42:58 +02001913 lwz r4, 0(r3)
1914 addis r5,0,NVRVFY1@h
1915 addi r5,r5,NVRVFY1@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001916 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001917 bne ..no_pllset
1918 addi r3,r3,4
1919 lwz r4, 0(r3)
1920 addis r5,0,NVRVFY2@h
1921 addi r5,r5,NVRVFY2@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001922 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001923 bne ..no_pllset
1924 addi r3,r3,8 /* Skip over conf_size */
1925 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1926 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1927 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1928 cmpi cr0,0,r5,1 /* See if PLL is locked */
1929 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001930..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001931#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001932
John Otkend4024bb2007-07-26 17:49:11 +02001933#ifdef CONFIG_TAIHU
1934 mfdcr r4, CPC0_BOOT
1935 andi. r5, r4, CPC0_BOOT_SEP@l
1936 bne strap_1 /* serial eeprom present */
1937 addis r5,0,CPLD_REG0_ADDR@h
1938 ori r5,r5,CPLD_REG0_ADDR@l
1939 andi. r5, r5, 0x10
1940 bne _pci_66mhz
1941#endif /* CONFIG_TAIHU */
1942
Stefan Roese779e9752007-08-14 14:44:41 +02001943#if defined(CONFIG_ZEUS)
1944 mfdcr r4, CPC0_BOOT
1945 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001946 bne strap_1 /* serial eeprom present */
Stefan Roese779e9752007-08-14 14:44:41 +02001947 lis r3,0x0000
1948 addi r3,r3,0x3030
1949 lis r4,0x8042
1950 addi r4,r4,0x223e
1951 b 1f
1952strap_1:
1953 mfdcr r3, CPC0_PLLMR0
1954 mfdcr r4, CPC0_PLLMR1
1955 b 1f
1956#endif
1957
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001958 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1959 ori r3,r3,PLLMR0_DEFAULT@l /* */
1960 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1961 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001962
John Otkend4024bb2007-07-26 17:49:11 +02001963#ifdef CONFIG_TAIHU
1964 b 1f
1965_pci_66mhz:
1966 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1967 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1968 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1969 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1970 b 1f
1971strap_1:
1972 mfdcr r3, CPC0_PLLMR0
1973 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001974#endif /* CONFIG_TAIHU */
1975
Stefan Roese779e9752007-08-14 14:44:41 +020019761:
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001977 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001978
1979pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001980 /*
1981 !-----------------------------------------------------------------------
1982 ! Clear Soft Reset Register
1983 ! This is needed to enable PCI if not booting from serial EPROM
1984 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001985 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001986 addi r3, 0, 0x0
1987 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001988
Wolfgang Denkf901a832005-08-06 01:42:58 +02001989 addis r3,0,0x0010
1990 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001991pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001992 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001993
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001994 blr /* return to main code */
stroeseb867d702003-05-23 11:18:02 +00001995
1996/*
1997!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02001998! Function: pll_write
1999! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
2000! That is:
2001! 1. Pll is first disabled (de-activated by putting in bypass mode)
2002! 2. PLL is reset
2003! 3. Clock dividers are set while PLL is held in reset and bypassed
2004! 4. PLL Reset is cleared
2005! 5. Wait 100us for PLL to lock
2006! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00002007! Input: r3 = Value to write to CPC0_PLLMR0
2008! Input: r4 = Value to write to CPC0_PLLMR1
2009! Output r3 = none
2010!-----------------------------------------------------------------------------
2011*/
Matthias Fuchs0580e482009-07-06 16:27:33 +02002012 .globl pll_write
stroeseb867d702003-05-23 11:18:02 +00002013pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00002014 mfdcr r5, CPC0_UCR
2015 andis. r5,r5,0xFFFF
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002016 ori r5,r5,0x0101 /* Stop the UART clocks */
2017 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00002018
wdenk8bde7f72003-06-27 21:31:46 +00002019 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002020 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002021 mtdcr CPC0_PLLMR1,r5
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002022 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002023 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00002024
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002025 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
2026 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
2027 oris r5,r5,0x4000 /* Set PLL Reset */
2028 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
2029 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002030 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00002031
2032 /*
wdenk8bde7f72003-06-27 21:31:46 +00002033 ! Wait min of 100us for PLL to lock.
2034 ! See CMOS 27E databook for more info.
2035 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00002036 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002037 addi r3,0,20000 /* 2000 = 0x4e20 */
2038 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00002039pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02002040 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00002041
Wolfgang Denkf901a832005-08-06 01:42:58 +02002042 oris r5,r5,0x8000 /* Enable PLL */
2043 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00002044
wdenk8bde7f72003-06-27 21:31:46 +00002045 /*
2046 * Reset CPU to guarantee timings are OK
2047 * Not sure if this is needed...
2048 */
2049 addis r3,0,0x1000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02002050 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002051 /* execution will continue from the poweron */
2052 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00002053#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01002054
2055#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01002056/*----------------------------------------------------------------------------+
2057| mttlb3.
2058+----------------------------------------------------------------------------*/
2059 function_prolog(mttlb3)
2060 TLBWE(4,3,2)
2061 blr
2062 function_epilog(mttlb3)
2063
2064/*----------------------------------------------------------------------------+
2065| mftlb3.
2066+----------------------------------------------------------------------------*/
2067 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01002068 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01002069 blr
2070 function_epilog(mftlb3)
2071
2072/*----------------------------------------------------------------------------+
2073| mttlb2.
2074+----------------------------------------------------------------------------*/
2075 function_prolog(mttlb2)
2076 TLBWE(4,3,1)
2077 blr
2078 function_epilog(mttlb2)
2079
2080/*----------------------------------------------------------------------------+
2081| mftlb2.
2082+----------------------------------------------------------------------------*/
2083 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01002084 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01002085 blr
2086 function_epilog(mftlb2)
2087
2088/*----------------------------------------------------------------------------+
2089| mttlb1.
2090+----------------------------------------------------------------------------*/
2091 function_prolog(mttlb1)
2092 TLBWE(4,3,0)
2093 blr
2094 function_epilog(mttlb1)
2095
2096/*----------------------------------------------------------------------------+
2097| mftlb1.
2098+----------------------------------------------------------------------------*/
2099 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01002100 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01002101 blr
2102 function_epilog(mftlb1)
2103#endif /* CONFIG_440 */
Stefan Roese64852d02008-06-02 14:35:44 +02002104
2105#if defined(CONFIG_NAND_SPL)
2106/*
2107 * void nand_boot_relocate(dst, src, bytes)
2108 *
2109 * r3 = Destination address to copy code to (in SDRAM)
2110 * r4 = Source address to copy code from
2111 * r5 = size to copy in bytes
2112 */
2113nand_boot_relocate:
2114 mr r6,r3
2115 mr r7,r4
2116 mflr r8
2117
2118 /*
2119 * Copy SPL from icache into SDRAM
2120 */
2121 subi r3,r3,4
2122 subi r4,r4,4
2123 srwi r5,r5,2
2124 mtctr r5
2125..spl_loop:
2126 lwzu r0,4(r4)
2127 stwu r0,4(r3)
2128 bdnz ..spl_loop
2129
2130 /*
2131 * Calculate "corrected" link register, so that we "continue"
2132 * in execution in destination range
2133 */
2134 sub r3,r7,r6 /* r3 = src - dst */
2135 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2136 mtlr r8
2137 blr
2138
2139nand_boot_common:
2140 /*
2141 * First initialize SDRAM. It has to be available *before* calling
2142 * nand_boot().
2143 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002144 lis r3,CONFIG_SYS_SDRAM_BASE@h
2145 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002146 bl initdram
2147
2148 /*
2149 * Now copy the 4k SPL code into SDRAM and continue execution
2150 * from there.
2151 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002152 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2153 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2154 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2155 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2156 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2157 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002158 bl nand_boot_relocate
2159
2160 /*
2161 * We're running from SDRAM now!!!
2162 *
2163 * It is necessary for 4xx systems to relocate from running at
2164 * the original location (0xfffffxxx) to somewhere else (SDRAM
2165 * preferably). This is because CS0 needs to be reconfigured for
2166 * NAND access. And we can't reconfigure this CS when currently
2167 * "running" from it.
2168 */
2169
2170 /*
2171 * Finally call nand_boot() to load main NAND U-Boot image from
2172 * NAND and jump to it.
2173 */
2174 bl nand_boot /* will not return */
2175#endif /* CONFIG_NAND_SPL */