blob: 7a65d9fcc67f4164908f095f15547ccbd086612f [file] [log] [blame]
wdenk0442ed82002-11-03 10:24:00 +00001/*
2 * Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
3 * Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
4 * Copyright (C) 2000,2001,2002 Wolfgang Denk <wd@denx.de>
Stefan Roese3cb86f32007-03-24 15:45:34 +01005 * Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
Grant Ericksonc821b5f2008-05-22 14:44:14 -07006 * Copyright (c) 2008 Nuovation System Designs, LLC
7 * Grant Erickson <gerickson@nuovations.com>
wdenk0442ed82002-11-03 10:24:00 +00008 *
9 * See file CREDITS for list of people who contributed to this
10 * project.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25 * MA 02111-1307 USA
26 */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +020027/*------------------------------------------------------------------------------+
Josh Boyer31773492009-08-07 13:53:20 -040028 * This source code is dual-licensed. You may use it under the terms of the
29 * GNU General Public License version 2, or under the license below.
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +020030 *
31 * This source code has been made available to you by IBM on an AS-IS
32 * basis. Anyone receiving this source is licensed under IBM
33 * copyrights to use it in any way he or she deems fit, including
34 * copying it, modifying it, compiling it, and redistributing it either
35 * with or without modifications. No license under IBM patents or
36 * patent applications is to be implied by the copyright license.
37 *
38 * Any user of this software should understand that IBM cannot provide
39 * technical support for this software and will not be responsible for
40 * any consequences resulting from the use of this software.
41 *
42 * Any person who transfers this source code or any derivative work
43 * must include the IBM copyright notice, this paragraph, and the
44 * preceding two paragraphs in the transferred software.
45 *
46 * COPYRIGHT I B M CORPORATION 1995
47 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
48 *-------------------------------------------------------------------------------
49 */
wdenk0442ed82002-11-03 10:24:00 +000050
Wolfgang Denk0c8721a2005-09-23 11:05:55 +020051/* U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
wdenk0442ed82002-11-03 10:24:00 +000052 *
53 *
54 * The processor starts at 0xfffffffc and the code is executed
55 * from flash/rom.
56 * in memory, but as long we don't jump around before relocating.
57 * board_init lies at a quite high address and when the cpu has
58 * jumped there, everything is ok.
59 * This works because the cpu gives the FLASH (CS0) the whole
60 * address space at startup, and board_init lies as a echo of
61 * the flash somewhere up there in the memorymap.
62 *
63 * board_init will change CS0 to be positioned at the correct
64 * address and (s)dram will be positioned at address 0
65 */
66#include <config.h>
Stefan Roeseb36df562010-09-09 19:18:00 +020067#include <asm/ppc4xx.h>
Peter Tyser561858e2008-11-03 09:30:59 -060068#include <timestamp.h>
wdenk0442ed82002-11-03 10:24:00 +000069#include <version.h>
70
71#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
72
73#include <ppc_asm.tmpl>
74#include <ppc_defs.h>
75
76#include <asm/cache.h>
77#include <asm/mmu.h>
Dave Mitchellb14ca4b2008-11-20 14:00:49 -060078#include <asm/ppc4xx-isram.h>
wdenk0442ed82002-11-03 10:24:00 +000079
80#ifndef CONFIG_IDENT_STRING
81#define CONFIG_IDENT_STRING ""
82#endif
83
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020084#ifdef CONFIG_SYS_INIT_DCACHE_CS
85# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
Stefan Roesed1c3b272009-09-09 16:25:29 +020086# define PBxAP PB1AP
87# define PBxCR PB0CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020088# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
89# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
90# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070091# endif
wdenk0442ed82002-11-03 10:24:00 +000092# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020093# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
Stefan Roesed1c3b272009-09-09 16:25:29 +020094# define PBxAP PB1AP
95# define PBxCR PB1CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020096# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
97# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
98# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070099# endif
wdenk0442ed82002-11-03 10:24:00 +0000100# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200101# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200102# define PBxAP PB2AP
103# define PBxCR PB2CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200104# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
105# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
106# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700107# endif
wdenk0442ed82002-11-03 10:24:00 +0000108# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200109# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200110# define PBxAP PB3AP
111# define PBxCR PB3CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200112# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
113# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
114# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700115# endif
wdenk0442ed82002-11-03 10:24:00 +0000116# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200117# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200118# define PBxAP PB4AP
119# define PBxCR PB4CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200120# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
121# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
122# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700123# endif
wdenk0442ed82002-11-03 10:24:00 +0000124# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200125# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200126# define PBxAP PB5AP
127# define PBxCR PB5CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200128# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
129# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
130# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700131# endif
wdenk0442ed82002-11-03 10:24:00 +0000132# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200133# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200134# define PBxAP PB6AP
135# define PBxCR PB6CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200136# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
137# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
138# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700139# endif
wdenk0442ed82002-11-03 10:24:00 +0000140# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200141# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200142# define PBxAP PB7AP
143# define PBxCR PB7CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200144# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
145# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
146# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700147# endif
148# endif
149# ifndef PBxAP_VAL
150# define PBxAP_VAL 0
151# endif
152# ifndef PBxCR_VAL
153# define PBxCR_VAL 0
154# endif
155/*
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200156 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700157 * used as temporary stack pointer for the primordial stack
158 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200159# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
160# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700161 EBC_BXAP_TWT_ENCODE(7) | \
162 EBC_BXAP_BCE_DISABLE | \
163 EBC_BXAP_BCT_2TRANS | \
164 EBC_BXAP_CSN_ENCODE(0) | \
165 EBC_BXAP_OEN_ENCODE(0) | \
166 EBC_BXAP_WBN_ENCODE(0) | \
167 EBC_BXAP_WBF_ENCODE(0) | \
168 EBC_BXAP_TH_ENCODE(2) | \
169 EBC_BXAP_RE_DISABLED | \
170 EBC_BXAP_SOR_NONDELAYED | \
171 EBC_BXAP_BEM_WRITEONLY | \
172 EBC_BXAP_PEN_DISABLED)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200173# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
174# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
175# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700176 EBC_BXCR_BS_64MB | \
177 EBC_BXCR_BU_RW | \
178 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200179# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
180# ifndef CONFIG_SYS_INIT_RAM_PATTERN
181# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
wdenk0442ed82002-11-03 10:24:00 +0000182# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200183#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000184
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200185#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_END > (4 << 10)))
186#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_END!
Stefan Roese28d77d92008-01-30 14:48:28 +0100187#endif
188
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700189/*
190 * Unless otherwise overriden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200191 * at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
192 * NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700193 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200194#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese64852d02008-06-02 14:35:44 +0200195/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200196# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese64852d02008-06-02 14:35:44 +0200197#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200198#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
199# define CONFIG_SYS_ICACHE_SACR_VALUE \
200 (PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
201 PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
202 PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
203#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700204
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200205#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
206# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700207 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200208#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700209
Stefan Roese4978e602010-05-27 16:45:20 +0200210#if !defined(CONFIG_SYS_TLB_FOR_BOOT_FLASH)
211#define CONFIG_SYS_TLB_FOR_BOOT_FLASH 0 /* use TLB 0 as default */
212#endif
213
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200214#define function_prolog(func_name) .text; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200215 .align 2; \
216 .globl func_name; \
217 func_name:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200218#define function_epilog(func_name) .type func_name,@function; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200219 .size func_name,.-func_name
220
wdenk0442ed82002-11-03 10:24:00 +0000221/* We don't want the MMU yet.
222*/
223#undef MSR_KERNEL
224#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
225
226
227 .extern ext_bus_cntlr_init
Stefan Roese887e2ec2006-09-07 11:51:23 +0200228#ifdef CONFIG_NAND_U_BOOT
229 .extern reconfig_tlb0
230#endif
wdenk0442ed82002-11-03 10:24:00 +0000231
232/*
233 * Set up GOT: Global Offset Table
234 *
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +0100235 * Use r12 to access the GOT
wdenk0442ed82002-11-03 10:24:00 +0000236 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200237#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000238 START_GOT
239 GOT_ENTRY(_GOT2_TABLE_)
240 GOT_ENTRY(_FIXUP_TABLE_)
241
242 GOT_ENTRY(_start)
243 GOT_ENTRY(_start_of_vectors)
244 GOT_ENTRY(_end_of_vectors)
245 GOT_ENTRY(transfer_to_handler)
246
wdenk3b57fe02003-05-30 12:48:29 +0000247 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000248 GOT_ENTRY(_end)
wdenk5d232d02003-05-22 22:52:13 +0000249 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000250 END_GOT
Stefan Roese887e2ec2006-09-07 11:51:23 +0200251#endif /* CONFIG_NAND_SPL */
252
253#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
254 /*
255 * NAND U-Boot image is started from offset 0
256 */
257 .text
Stefan Roesec440bfe2007-06-06 11:42:13 +0200258#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200259 bl reconfig_tlb0
Stefan Roesec440bfe2007-06-06 11:42:13 +0200260#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200261 GET_GOT
262 bl cpu_init_f /* run low-level CPU init code (from Flash) */
263 bl board_init_f
264#endif
wdenk0442ed82002-11-03 10:24:00 +0000265
Stefan Roesed8731332009-05-11 13:46:14 +0200266#if defined(CONFIG_SYS_RAMBOOT)
267 /*
268 * 4xx RAM-booting U-Boot image is started from offset 0
269 */
270 .text
271 bl _start_440
272#endif
273
wdenk0442ed82002-11-03 10:24:00 +0000274/*
275 * 440 Startup -- on reset only the top 4k of the effective
276 * address space is mapped in by an entry in the instruction
277 * and data shadow TLB. The .bootpg section is located in the
278 * top 4k & does only what's necessary to map in the the rest
279 * of the boot rom. Once the boot rom is mapped in we can
280 * proceed with normal startup.
281 *
282 * NOTE: CS0 only covers the top 2MB of the effective address
283 * space after reset.
284 */
285
286#if defined(CONFIG_440)
Stefan Roese887e2ec2006-09-07 11:51:23 +0200287#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000288 .section .bootpg,"ax"
Stefan Roese887e2ec2006-09-07 11:51:23 +0200289#endif
wdenk0442ed82002-11-03 10:24:00 +0000290 .globl _start_440
291
292/**************************************************************************/
293_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200294 /*--------------------------------------------------------------------+
295 | 440EPX BUP Change - Hardware team request
296 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200297#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
298 sync
299 nop
300 nop
301#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200302 /*----------------------------------------------------------------+
303 | Core bug fix. Clear the esr
304 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200305 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200306 mtspr SPRN_ESR,r0
wdenk0442ed82002-11-03 10:24:00 +0000307 /*----------------------------------------------------------------*/
308 /* Clear and set up some registers. */
309 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200310 iccci r0,r0 /* NOTE: operands not used for 440 */
311 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000312 sync
313 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200314 mtspr SPRN_SRR0,r0
315 mtspr SPRN_SRR1,r0
316 mtspr SPRN_CSRR0,r0
317 mtspr SPRN_CSRR1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200318 /* NOTE: 440GX adds machine check status regs */
319#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200320 mtspr SPRN_MCSRR0,r0
321 mtspr SPRN_MCSRR1,r0
322 mfspr r1,SPRN_MCSR
323 mtspr SPRN_MCSR,r1
wdenkba56f622004-02-06 23:19:44 +0000324#endif
Stefan Roese20532832006-11-22 13:20:50 +0100325
326 /*----------------------------------------------------------------*/
327 /* CCR0 init */
328 /*----------------------------------------------------------------*/
329 /* Disable store gathering & broadcast, guarantee inst/data
330 * cache block touch, force load/store alignment
331 * (see errata 1.12: 440_33)
332 */
333 lis r1,0x0030 /* store gathering & broadcast disable */
334 ori r1,r1,0x6000 /* cache touch */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200335 mtspr SPRN_CCR0,r1
Stefan Roese20532832006-11-22 13:20:50 +0100336
wdenk0442ed82002-11-03 10:24:00 +0000337 /*----------------------------------------------------------------*/
338 /* Initialize debug */
339 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200340 mfspr r1,SPRN_DBCR0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200341 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
342 bne skip_debug_init /* if set, don't clear debug register */
Victor Gallardoad876ff2010-09-16 11:32:04 -0700343 mfspr r1,SPRN_CCR0
344 ori r1,r1,CCR0_DTB@l /* Disable Trace Broadcast */
345 mtspr SPRN_CCR0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200346 mtspr SPRN_DBCR0,r0
347 mtspr SPRN_DBCR1,r0
348 mtspr SPRN_DBCR2,r0
349 mtspr SPRN_IAC1,r0
350 mtspr SPRN_IAC2,r0
351 mtspr SPRN_IAC3,r0
352 mtspr SPRN_DAC1,r0
353 mtspr SPRN_DAC2,r0
354 mtspr SPRN_DVC1,r0
355 mtspr SPRN_DVC2,r0
wdenk0442ed82002-11-03 10:24:00 +0000356
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200357 mfspr r1,SPRN_DBSR
358 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200359skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000360
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200361#if defined (CONFIG_440SPE)
362 /*----------------------------------------------------------------+
363 | Initialize Core Configuration Reg1.
364 | a. ICDPEI: Record even parity. Normal operation.
365 | b. ICTPEI: Record even parity. Normal operation.
366 | c. DCTPEI: Record even parity. Normal operation.
367 | d. DCDPEI: Record even parity. Normal operation.
368 | e. DCUPEI: Record even parity. Normal operation.
369 | f. DCMPEI: Record even parity. Normal operation.
370 | g. FCOM: Normal operation
371 | h. MMUPEI: Record even parity. Normal operation.
372 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200373 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200374 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200375 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200376 mtspr SPRN_CCR1, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200377
378 /*----------------------------------------------------------------+
379 | Reset the timebase.
380 | The previous write to CCR1 sets the timebase source.
381 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200382 mtspr SPRN_TBWL, r0
383 mtspr SPRN_TBWU, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200384#endif
385
wdenk0442ed82002-11-03 10:24:00 +0000386 /*----------------------------------------------------------------*/
387 /* Setup interrupt vectors */
388 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200389 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200390 li r1,0x0100
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200391 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200392 li r1,0x0200
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200393 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200394 li r1,0x0300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200395 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200396 li r1,0x0400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200397 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000398 li r1,0x0500
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200399 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000400 li r1,0x0600
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200401 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000402 li r1,0x0700
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200403 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000404 li r1,0x0800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200405 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000406 li r1,0x0c00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200407 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200408 li r1,0x0a00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200409 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200410 li r1,0x0900
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200411 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000412 li r1,0x1300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200413 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200414 li r1,0x1400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200415 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000416 li r1,0x2000
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200417 mtspr SPRN_IVOR15,r1 /* Debug */
wdenk0442ed82002-11-03 10:24:00 +0000418
419 /*----------------------------------------------------------------*/
420 /* Configure cache regions */
421 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200422 mtspr SPRN_INV0,r0
423 mtspr SPRN_INV1,r0
424 mtspr SPRN_INV2,r0
425 mtspr SPRN_INV3,r0
426 mtspr SPRN_DNV0,r0
427 mtspr SPRN_DNV1,r0
428 mtspr SPRN_DNV2,r0
429 mtspr SPRN_DNV3,r0
430 mtspr SPRN_ITV0,r0
431 mtspr SPRN_ITV1,r0
432 mtspr SPRN_ITV2,r0
433 mtspr SPRN_ITV3,r0
434 mtspr SPRN_DTV0,r0
435 mtspr SPRN_DTV1,r0
436 mtspr SPRN_DTV2,r0
437 mtspr SPRN_DTV3,r0
wdenk0442ed82002-11-03 10:24:00 +0000438
439 /*----------------------------------------------------------------*/
440 /* Cache victim limits */
441 /*----------------------------------------------------------------*/
442 /* floors 0, ceiling max to use the entire cache -- nothing locked
443 */
444 lis r1,0x0001
445 ori r1,r1,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200446 mtspr SPRN_IVLIM,r1
447 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000448
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200449 /*----------------------------------------------------------------+
450 |Initialize MMUCR[STID] = 0.
451 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200452 mfspr r0,SPRN_MMUCR
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200453 addis r1,0,0xFFFF
454 ori r1,r1,0xFF00
455 and r0,r0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200456 mtspr SPRN_MMUCR,r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200457
wdenk0442ed82002-11-03 10:24:00 +0000458 /*----------------------------------------------------------------*/
459 /* Clear all TLB entries -- TID = 0, TS = 0 */
460 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200461 addis r0,0,0x0000
Stefan Roese0a371ca2009-07-14 15:53:08 +0200462#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesed8731332009-05-11 13:46:14 +0200463 li r4,0 /* Start with TLB #0 */
Stefan Roese0a371ca2009-07-14 15:53:08 +0200464#else
465 li r4,1 /* Start with TLB #1 */
466#endif
467 li r1,64 /* 64 TLB entries */
468 sub r1,r1,r4 /* calculate last TLB # */
469 mtctr r1
Stefan Roesed8731332009-05-11 13:46:14 +0200470rsttlb:
471#ifdef CONFIG_SYS_RAMBOOT
472 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
473 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
474 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
475#endif
476 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
477 tlbwe r0,r4,1
478 tlbwe r0,r4,2
479tlbnxt: addi r4,r4,1 /* Next TLB */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200480 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000481
482 /*----------------------------------------------------------------*/
483 /* TLB entry setup -- step thru tlbtab */
484 /*----------------------------------------------------------------*/
Stefan Roese2a72e9e2010-04-09 14:03:59 +0200485#if defined(CONFIG_440SPE_REVA)
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200486 /*----------------------------------------------------------------*/
487 /* We have different TLB tables for revA and rev B of 440SPe */
488 /*----------------------------------------------------------------*/
489 mfspr r1, PVR
490 lis r0,0x5342
491 ori r0,r0,0x1891
492 cmpw r7,r1,r0
493 bne r7,..revA
494 bl tlbtabB
495 b ..goon
496..revA:
497 bl tlbtabA
498..goon:
499#else
wdenk0442ed82002-11-03 10:24:00 +0000500 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200501#endif
wdenk0442ed82002-11-03 10:24:00 +0000502 mr r5,r0
503 li r1,0x003f /* 64 TLB entries max */
504 mtctr r1
505 li r4,0 /* TLB # */
506
507 addi r5,r5,-4
Stefan Roesed8731332009-05-11 13:46:14 +02005081:
509#ifdef CONFIG_SYS_RAMBOOT
510 tlbre r3,r4,0 /* Read contents from TLB word #0 */
511 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
512 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
513#endif
514 lwzu r0,4(r5)
wdenk0442ed82002-11-03 10:24:00 +0000515 cmpwi r0,0
516 beq 2f /* 0 marks end */
517 lwzu r1,4(r5)
518 lwzu r2,4(r5)
519 tlbwe r0,r4,0 /* TLB Word 0 */
520 tlbwe r1,r4,1 /* TLB Word 1 */
521 tlbwe r2,r4,2 /* TLB Word 2 */
Stefan Roesed8731332009-05-11 13:46:14 +0200522tlbnx2: addi r4,r4,1 /* Next TLB */
wdenk0442ed82002-11-03 10:24:00 +0000523 bdnz 1b
524
525 /*----------------------------------------------------------------*/
526 /* Continue from 'normal' start */
527 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02005282:
Stefan Roese887e2ec2006-09-07 11:51:23 +0200529 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000530 b _start
531
5323: li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200533 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
wdenk0442ed82002-11-03 10:24:00 +0000534 mflr r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200535 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000536 rfi
stroeseb867d702003-05-23 11:18:02 +0000537#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000538
539/*
540 * r3 - 1st arg to board_init(): IMMP pointer
541 * r4 - 2nd arg to board_init(): boot flag
542 */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200543#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000544 .text
545 .long 0x27051956 /* U-Boot Magic Number */
546 .globl version_string
547version_string:
548 .ascii U_BOOT_VERSION
Peter Tyser561858e2008-11-03 09:30:59 -0600549 .ascii " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
wdenk0442ed82002-11-03 10:24:00 +0000550 .ascii CONFIG_IDENT_STRING, "\0"
551
wdenk0442ed82002-11-03 10:24:00 +0000552 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200553 .globl _start_of_vectors
554_start_of_vectors:
555
556/* Critical input. */
557 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
558
559#ifdef CONFIG_440
560/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200561 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200562#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200563 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200564#endif /* CONFIG_440 */
565
566/* Data Storage exception. */
567 STD_EXCEPTION(0x300, DataStorage, UnknownException)
568
569/* Instruction Storage exception. */
570 STD_EXCEPTION(0x400, InstStorage, UnknownException)
571
572/* External Interrupt exception. */
573 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
574
575/* Alignment exception. */
576 . = 0x600
577Alignment:
578 EXCEPTION_PROLOG(SRR0, SRR1)
579 mfspr r4,DAR
580 stw r4,_DAR(r21)
581 mfspr r5,DSISR
582 stw r5,_DSISR(r21)
583 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100584 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200585
586/* Program check exception */
587 . = 0x700
588ProgramCheck:
589 EXCEPTION_PROLOG(SRR0, SRR1)
590 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100591 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
592 MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200593
594#ifdef CONFIG_440
595 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
596 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
597 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200598#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200599 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
600
601#ifdef CONFIG_440
602 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
603 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
604#else
605 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
606 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
607 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
608#endif
609 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
610
611 .globl _end_of_vectors
612_end_of_vectors:
613 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200614#endif
wdenk0442ed82002-11-03 10:24:00 +0000615 .globl _start
616_start:
617
618/*****************************************************************************/
619#if defined(CONFIG_440)
620
621 /*----------------------------------------------------------------*/
622 /* Clear and set up some registers. */
623 /*----------------------------------------------------------------*/
624 li r0,0x0000
625 lis r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200626 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
627 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
628 mtspr SPRN_TBWU,r0
629 mtspr SPRN_TSR,r1 /* clear all timer exception status */
630 mtspr SPRN_TCR,r0 /* disable all */
631 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
wdenk0442ed82002-11-03 10:24:00 +0000632 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000633
634 /*----------------------------------------------------------------*/
635 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200636 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000637 /* value you need in this case 0x8cff 0000 should do the trick */
638 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200639#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000640 lis r1,0xffff
641 ori r1,r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200642 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200643 lis r0,CONFIG_SYS_INIT_DBCR@h
644 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200645 mtspr SPRN_DBCR0,r0
wdenk0442ed82002-11-03 10:24:00 +0000646 isync
647#endif
648
649 /*----------------------------------------------------------------*/
650 /* Setup the internal SRAM */
651 /*----------------------------------------------------------------*/
652 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200653
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200654#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200655 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200656 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
657 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
658 addis r4,r0,CONFIG_SYS_INIT_RAM_END@h
659 ori r4,r4,CONFIG_SYS_INIT_RAM_END@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200660 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200661 rlwinm r5,r4,27,5,31
662 beq ..d_ran
663 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200664..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200665 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200666..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200667 dcbz r0,r3
668 addi r3,r3,32
669 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100670
671 /*
672 * Lock the init-ram/stack in d-cache, so that other regions
673 * may use d-cache as well
674 * Note, that this current implementation locks exactly 4k
675 * of d-cache, so please make sure that you don't define a
676 * bigger init-ram area. Take a look at the lwmon5 440EPx
677 * implementation as a reference.
678 */
679 msync
680 isync
681 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
682 lis r1,0x0201
683 ori r1,r1,0xf808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200684 mtspr SPRN_DVLIM,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100685 lis r1,0x0808
686 ori r1,r1,0x0808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200687 mtspr SPRN_DNV0,r1
688 mtspr SPRN_DNV1,r1
689 mtspr SPRN_DNV2,r1
690 mtspr SPRN_DNV3,r1
691 mtspr SPRN_DTV0,r1
692 mtspr SPRN_DTV1,r1
693 mtspr SPRN_DTV2,r1
694 mtspr SPRN_DTV3,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100695 msync
696 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200697#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200698
699 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
700#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
701 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100702#if defined(CONFIG_440GX) || \
703 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan7d307932008-07-08 22:47:31 -0700704 defined(CONFIG_460SX)
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600705 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600706#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
707 lis r1, 0x0000
708 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
709 mtdcr L2_CACHE_CFG,r1
wdenkba56f622004-02-06 23:19:44 +0000710#endif
wdenk0442ed82002-11-03 10:24:00 +0000711
Stefan Roese887e2ec2006-09-07 11:51:23 +0200712 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000713 ori r2,r2,0xffff
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600714 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000715 and r1,r1,r2 /* Disable parity check */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600716 mtdcr ISRAM0_DPC,r1
717 mfdcr r1,ISRAM0_PMEG
Stefan Roese887e2ec2006-09-07 11:51:23 +0200718 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600719 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000720
721 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100722#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000723 ori r1,r1,0x0980 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600724 mtdcr ISRAM0_SB0CR,r1
wdenkba56f622004-02-06 23:19:44 +0000725 lis r1,0x8001
726 ori r1,r1,0x0980 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600727 mtdcr ISRAM0_SB1CR,r1
wdenkba56f622004-02-06 23:19:44 +0000728 lis r1, 0x8002
729 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600730 mtdcr ISRAM0_SB2CR,r1
wdenkba56f622004-02-06 23:19:44 +0000731 lis r1, 0x8003
732 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600733 mtdcr ISRAM0_SB3CR,r1
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600734#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || defined(CONFIG_460GT)
735 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200736 ori r1,r1,0x0984 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600737 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200738 lis r1,0x0001
739 ori r1,r1,0x0984 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600740 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200741 lis r1, 0x0002
742 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600743 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200744 lis r1, 0x0003
745 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600746 mtdcr ISRAM0_SB3CR,r1
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600747#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
748 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 */
758 ori r1,r1,0x0984 /* 64k */
759 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) */
795
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
Stefan Roese887e2ec2006-09-07 11:51:23 +0200803#endif
wdenk0442ed82002-11-03 10:24:00 +0000804
805#endif /* CONFIG_440 */
806
807/*****************************************************************************/
808#ifdef CONFIG_IOP480
809 /*----------------------------------------------------------------------- */
810 /* Set up some machine state registers. */
811 /*----------------------------------------------------------------------- */
812 addi r0,r0,0x0000 /* initialize r0 to zero */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200813 mtspr SPRN_ESR,r0 /* clear Exception Syndrome Reg */
wdenk0442ed82002-11-03 10:24:00 +0000814 mttcr r0 /* timer control register */
815 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000816 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
817 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
818 mtdbsr r4 /* clear/reset the dbsr */
819 mtexisr r4 /* clear all pending interrupts */
820 addis r4,r0,0x8000
821 mtexier r4 /* enable critical exceptions */
822 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
823 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
824 mtiocr r4 /* since bit not used) & DRC to latch */
825 /* data bus on rising edge of CAS */
826 /*----------------------------------------------------------------------- */
827 /* Clear XER. */
828 /*----------------------------------------------------------------------- */
829 mtxer r0
830 /*----------------------------------------------------------------------- */
831 /* Invalidate i-cache and d-cache TAG arrays. */
832 /*----------------------------------------------------------------------- */
833 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
834 addi r4,0,1024 /* 1/4 of I-cache */
835..cloop:
836 iccci 0,r3
837 iccci r4,r3
838 dccci 0,r3
839 addic. r3,r3,-16 /* move back one cache line */
840 bne ..cloop /* loop back to do rest until r3 = 0 */
841
842 /* */
843 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
844 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
845 /* */
846
847 /* first copy IOP480 register base address into r3 */
848 addis r3,0,0x5000 /* IOP480 register base address hi */
849/* ori r3,r3,0x0000 / IOP480 register base address lo */
850
851#ifdef CONFIG_ADCIOP
852 /* use r4 as the working variable */
853 /* turn on CS3 (LOCCTL.7) */
854 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
855 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
856 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
857#endif
858
859#ifdef CONFIG_DASA_SIM
860 /* use r4 as the working variable */
861 /* turn on MA17 (LOCCTL.7) */
862 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
863 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
864 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
865#endif
866
867 /* turn on MA16..13 (LCS0BRD.12 = 0) */
868 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
869 andi. r4,r4,0xefff /* make bit 12 = 0 */
870 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
871
872 /* make sure above stores all comlete before going on */
873 sync
874
875 /* last thing, set local init status done bit (DEVINIT.31) */
876 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
877 oris r4,r4,0x8000 /* make bit 31 = 1 */
878 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
879
880 /* clear all pending interrupts and disable all interrupts */
881 li r4,-1 /* set p1 to 0xffffffff */
882 stw r4,0x1b0(r3) /* clear all pending interrupts */
883 stw r4,0x1b8(r3) /* clear all pending interrupts */
884 li r4,0 /* set r4 to 0 */
885 stw r4,0x1b4(r3) /* disable all interrupts */
886 stw r4,0x1bc(r3) /* disable all interrupts */
887
888 /* make sure above stores all comlete before going on */
889 sync
890
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700891 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200892 lis r1, CONFIG_SYS_ICACHE_SACR_VALUE@h
893 ori r1, r1, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700894 mticcr r1
895 isync
wdenk0442ed82002-11-03 10:24:00 +0000896
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700897 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200898 lis r1, CONFIG_SYS_DCACHE_SACR_VALUE@h
899 ori r1, r1, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700900 mtdccr r1
wdenk0442ed82002-11-03 10:24:00 +0000901
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200902 addis r1,r0,CONFIG_SYS_INIT_RAM_ADDR@h
903 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack to SDRAM */
wdenk0442ed82002-11-03 10:24:00 +0000904 li r0, 0 /* Make room for stack frame header and */
905 stwu r0, -4(r1) /* clear final stack frame so that */
906 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
907
908 GET_GOT /* initialize GOT access */
909
910 bl board_init_f /* run first part of init code (from Flash) */
911
912#endif /* CONFIG_IOP480 */
913
914/*****************************************************************************/
Stefan Roesee01bd212007-03-21 13:38:59 +0100915#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
916 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200917 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000918 /*----------------------------------------------------------------------- */
919 /* Clear and set up some registers. */
920 /*----------------------------------------------------------------------- */
921 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200922#if !defined(CONFIG_405EX)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200923 mtspr SPRN_SGR,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200924#else
925 /*
926 * On 405EX, completely clearing the SGR leads to PPC hangup
927 * upon PCIe configuration access. The PCIe memory regions
928 * need to be guarded!
929 */
930 lis r3,0x0000
931 ori r3,r3,0x7FFC
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200932 mtspr SPRN_SGR,r3
Stefan Roesedbbd1252007-10-05 17:10:59 +0200933#endif
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200934 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000935 mtesr r4 /* clear Exception Syndrome Reg */
936 mttcr r4 /* clear Timer Control Reg */
937 mtxer r4 /* clear Fixed-Point Exception Reg */
938 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000939 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
940 /* dbsr is cleared by setting bits to 1) */
941 mtdbsr r4 /* clear/reset the dbsr */
942
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700943 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000944 bl invalidate_icache
945 bl invalidate_dcache
946
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700947 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200948 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
949 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700950 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000951 isync
952
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700953 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200954 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
955 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700956 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000957
Ricardo Ribalda Delgado1f4d5322008-10-21 18:29:46 +0200958#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
959 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000960 /*----------------------------------------------------------------------- */
961 /* Tune the speed and size for flash CS0 */
962 /*----------------------------------------------------------------------- */
963 bl ext_bus_cntlr_init
964#endif
Stefan Roese64852d02008-06-02 14:35:44 +0200965
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200966#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roesedbbd1252007-10-05 17:10:59 +0200967 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700968 * For boards that don't have OCM and can't use the data cache
969 * for their primordial stack, setup stack here directly after the
970 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roesedbbd1252007-10-05 17:10:59 +0200971 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200972 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
973 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200974
975 li r0, 0 /* Make room for stack frame header and */
976 stwu r0, -4(r1) /* clear final stack frame so that */
977 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
978 /*
979 * Set up a dummy frame to store reset vector as return address.
980 * this causes stack underflow to reset board.
981 */
982 stwu r1, -8(r1) /* Save back chain and move SP */
983 lis r0, RESET_VECTOR@h /* Address of reset vector */
984 ori r0, r0, RESET_VECTOR@l
985 stwu r1, -8(r1) /* Save back chain and move SP */
986 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200987#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000988
stroeseb867d702003-05-23 11:18:02 +0000989#if defined(CONFIG_405EP)
990 /*----------------------------------------------------------------------- */
991 /* DMA Status, clear to come up clean */
992 /*----------------------------------------------------------------------- */
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200993 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200994 ori r3,r3, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200995 mtdcr DMASR, r3
stroeseb867d702003-05-23 11:18:02 +0000996
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200997 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +0000998#endif /* CONFIG_405EP */
999
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001000#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +01001001#if defined(CONFIG_405EZ)
1002 /********************************************************************
1003 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
1004 *******************************************************************/
1005 /*
1006 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001007 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roesee01bd212007-03-21 13:38:59 +01001008 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001009 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1010 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001011 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001012 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +01001013 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001014 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +01001015 isync
1016
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001017 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1018 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001019 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001020 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
1021 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +01001022 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001023 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
1024 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001025 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001026 mtdcr OCM0_DISDPC,r3
Stefan Roesee01bd212007-03-21 13:38:59 +01001027
1028 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +01001029#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001030 /********************************************************************
1031 * Setup OCM - On Chip Memory
1032 *******************************************************************/
1033 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +00001034 lis r0, 0x7FFF
1035 ori r0, r0, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +02001036 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
1037 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +01001038 and r3, r3, r0 /* disable data-side IRAM */
1039 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001040 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
1041 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +00001042 isync
wdenk0442ed82002-11-03 10:24:00 +00001043
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001044 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1045 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001046 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +00001047 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roesed1c3b272009-09-09 16:25:29 +02001048 mtdcr OCM0_DSCNTL, r4
wdenk8bde7f72003-06-27 21:31:46 +00001049 isync
Stefan Roesee01bd212007-03-21 13:38:59 +01001050#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001051#endif
1052
1053 /*----------------------------------------------------------------------- */
1054 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1055 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001056#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001057 li r4, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001058 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001059 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
1060 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001061 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001062
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001063 addi r4, 0, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001064 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001065 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
1066 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001067 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001068
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001069 /*
1070 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001071 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001072 */
1073 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001074 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1075 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +00001076 mtdccr r4
1077
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001078 /*
1079 * Preallocate data cache lines to be used to avoid a subsequent
1080 * cache miss and an ensuing machine check exception when exceptions
1081 * are enabled.
1082 */
1083 li r0, 0
wdenk0442ed82002-11-03 10:24:00 +00001084
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001085 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1086 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001087
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001088 lis r4, CONFIG_SYS_INIT_RAM_END@h
1089 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001090
1091 /*
1092 * Convert the size, in bytes, to the number of cache lines/blocks
1093 * to preallocate.
1094 */
1095 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1096 srwi r5, r4, L1_CACHE_SHIFT
1097 beq ..load_counter
1098 addi r5, r5, 0x0001
1099..load_counter:
1100 mtctr r5
1101
1102 /* Preallocate the computed number of cache blocks. */
1103..alloc_dcache_block:
1104 dcba r0, r3
1105 addi r3, r3, L1_CACHE_BYTES
1106 bdnz ..alloc_dcache_block
1107 sync
1108
1109 /*
1110 * Load the initial stack pointer and data area and convert the size,
1111 * in bytes, to the number of words to initialize to a known value.
1112 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001113 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1114 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001115
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001116 lis r4, (CONFIG_SYS_INIT_RAM_END >> 2)@h
1117 ori r4, r4, (CONFIG_SYS_INIT_RAM_END >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001118 mtctr r4
1119
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001120 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
1121 ori r2, r2, CONFIG_SYS_INIT_RAM_END@l
wdenk0442ed82002-11-03 10:24:00 +00001122
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001123 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1124 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001125
1126..stackloop:
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001127 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001128 bdnz ..stackloop
1129
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001130 /*
1131 * Make room for stack frame header and clear final stack frame so
1132 * that stack backtraces terminate cleanly.
1133 */
1134 stwu r0, -4(r1)
1135 stwu r0, -4(r1)
1136
wdenk0442ed82002-11-03 10:24:00 +00001137 /*
1138 * Set up a dummy frame to store reset vector as return address.
1139 * this causes stack underflow to reset board.
1140 */
1141 stwu r1, -8(r1) /* Save back chain and move SP */
1142 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1143 ori r0, r0, RESET_VECTOR@l
1144 stwu r1, -8(r1) /* Save back chain and move SP */
1145 stw r0, +12(r1) /* Save return addr (underflow vect) */
1146
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001147#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1148 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001149 /*
1150 * Stack in OCM.
1151 */
1152
1153 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001154 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1155 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001156
1157 /* Set up a zeroized stack frame so that backtrace works right */
1158 li r0, 0
1159 stwu r0, -4(r1)
1160 stwu r0, -4(r1)
1161
1162 /*
1163 * Set up a dummy frame to store reset vector as return address.
1164 * this causes stack underflow to reset board.
1165 */
1166 stwu r1, -8(r1) /* Save back chain and move SP */
1167 lis r0, RESET_VECTOR@h /* Address of reset vector */
1168 ori r0, r0, RESET_VECTOR@l
1169 stwu r1, -8(r1) /* Save back chain and move SP */
1170 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001171#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001172
Stefan Roesec440bfe2007-06-06 11:42:13 +02001173#ifdef CONFIG_NAND_SPL
Stefan Roese64852d02008-06-02 14:35:44 +02001174 bl nand_boot_common /* will not return */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001175#else
wdenk0442ed82002-11-03 10:24:00 +00001176 GET_GOT /* initialize GOT access */
1177
Wolfgang Denkf901a832005-08-06 01:42:58 +02001178 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001179
1180 /* NEVER RETURNS! */
1181 bl board_init_f /* run first part of init code (from Flash) */
Stefan Roesec440bfe2007-06-06 11:42:13 +02001182#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001183
wdenk12f34242003-09-02 22:48:03 +00001184#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1185 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001186
1187
Stefan Roese887e2ec2006-09-07 11:51:23 +02001188#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001189/*
1190 * This code finishes saving the registers to the exception frame
1191 * and jumps to the appropriate handler for the exception.
1192 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1193 */
1194 .globl transfer_to_handler
1195transfer_to_handler:
1196 stw r22,_NIP(r21)
1197 lis r22,MSR_POW@h
1198 andc r23,r23,r22
1199 stw r23,_MSR(r21)
1200 SAVE_GPR(7, r21)
1201 SAVE_4GPRS(8, r21)
1202 SAVE_8GPRS(12, r21)
1203 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001204 mflr r23
1205 andi. r24,r23,0x3f00 /* get vector offset */
1206 stw r24,TRAP(r21)
1207 li r22,0
1208 stw r22,RESULT(r21)
1209 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001210 lwz r24,0(r23) /* virtual address of handler */
1211 lwz r23,4(r23) /* where to go when done */
1212 mtspr SRR0,r24
1213 mtspr SRR1,r20
1214 mtlr r23
1215 SYNC
1216 rfi /* jump to handler, enable MMU */
1217
1218int_return:
1219 mfmsr r28 /* Disable interrupts */
1220 li r4,0
1221 ori r4,r4,MSR_EE
1222 andc r28,r28,r4
1223 SYNC /* Some chip revs need this... */
1224 mtmsr r28
1225 SYNC
1226 lwz r2,_CTR(r1)
1227 lwz r0,_LINK(r1)
1228 mtctr r2
1229 mtlr r0
1230 lwz r2,_XER(r1)
1231 lwz r0,_CCR(r1)
1232 mtspr XER,r2
1233 mtcrf 0xFF,r0
1234 REST_10GPRS(3, r1)
1235 REST_10GPRS(13, r1)
1236 REST_8GPRS(23, r1)
1237 REST_GPR(31, r1)
1238 lwz r2,_NIP(r1) /* Restore environment */
1239 lwz r0,_MSR(r1)
1240 mtspr SRR0,r2
1241 mtspr SRR1,r0
1242 lwz r0,GPR0(r1)
1243 lwz r2,GPR2(r1)
1244 lwz r1,GPR1(r1)
1245 SYNC
1246 rfi
1247
1248crit_return:
1249 mfmsr r28 /* Disable interrupts */
1250 li r4,0
1251 ori r4,r4,MSR_EE
1252 andc r28,r28,r4
1253 SYNC /* Some chip revs need this... */
1254 mtmsr r28
1255 SYNC
1256 lwz r2,_CTR(r1)
1257 lwz r0,_LINK(r1)
1258 mtctr r2
1259 mtlr r0
1260 lwz r2,_XER(r1)
1261 lwz r0,_CCR(r1)
1262 mtspr XER,r2
1263 mtcrf 0xFF,r0
1264 REST_10GPRS(3, r1)
1265 REST_10GPRS(13, r1)
1266 REST_8GPRS(23, r1)
1267 REST_GPR(31, r1)
1268 lwz r2,_NIP(r1) /* Restore environment */
1269 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001270 mtspr SPRN_CSRR0,r2
1271 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001272 lwz r0,GPR0(r1)
1273 lwz r2,GPR2(r1)
1274 lwz r1,GPR1(r1)
1275 SYNC
1276 rfci
1277
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001278#ifdef CONFIG_440
1279mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001280 mfmsr r28 /* Disable interrupts */
1281 li r4,0
1282 ori r4,r4,MSR_EE
1283 andc r28,r28,r4
1284 SYNC /* Some chip revs need this... */
1285 mtmsr r28
1286 SYNC
1287 lwz r2,_CTR(r1)
1288 lwz r0,_LINK(r1)
1289 mtctr r2
1290 mtlr r0
1291 lwz r2,_XER(r1)
1292 lwz r0,_CCR(r1)
1293 mtspr XER,r2
1294 mtcrf 0xFF,r0
1295 REST_10GPRS(3, r1)
1296 REST_10GPRS(13, r1)
1297 REST_8GPRS(23, r1)
1298 REST_GPR(31, r1)
1299 lwz r2,_NIP(r1) /* Restore environment */
1300 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001301 mtspr SPRN_MCSRR0,r2
1302 mtspr SPRN_MCSRR1,r0
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001303 lwz r0,GPR0(r1)
1304 lwz r2,GPR2(r1)
1305 lwz r1,GPR1(r1)
1306 SYNC
1307 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001308#endif /* CONFIG_440 */
1309
1310
wdenk0442ed82002-11-03 10:24:00 +00001311 .globl get_pvr
1312get_pvr:
1313 mfspr r3, PVR
1314 blr
1315
wdenk0442ed82002-11-03 10:24:00 +00001316/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001317/* Function: out16 */
1318/* Description: Output 16 bits */
1319/*------------------------------------------------------------------------------- */
1320 .globl out16
1321out16:
1322 sth r4,0x0000(r3)
1323 blr
1324
1325/*------------------------------------------------------------------------------- */
1326/* Function: out16r */
1327/* Description: Byte reverse and output 16 bits */
1328/*------------------------------------------------------------------------------- */
1329 .globl out16r
1330out16r:
1331 sthbrx r4,r0,r3
1332 blr
1333
1334/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001335/* Function: out32r */
1336/* Description: Byte reverse and output 32 bits */
1337/*------------------------------------------------------------------------------- */
1338 .globl out32r
1339out32r:
1340 stwbrx r4,r0,r3
1341 blr
1342
1343/*------------------------------------------------------------------------------- */
1344/* Function: in16 */
1345/* Description: Input 16 bits */
1346/*------------------------------------------------------------------------------- */
1347 .globl in16
1348in16:
1349 lhz r3,0x0000(r3)
1350 blr
1351
1352/*------------------------------------------------------------------------------- */
1353/* Function: in16r */
1354/* Description: Input 16 bits and byte reverse */
1355/*------------------------------------------------------------------------------- */
1356 .globl in16r
1357in16r:
1358 lhbrx r3,r0,r3
1359 blr
1360
1361/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001362/* Function: in32r */
1363/* Description: Input 32 bits and byte reverse */
1364/*------------------------------------------------------------------------------- */
1365 .globl in32r
1366in32r:
1367 lwbrx r3,r0,r3
1368 blr
1369
wdenk0442ed82002-11-03 10:24:00 +00001370/*
1371 * void relocate_code (addr_sp, gd, addr_moni)
1372 *
1373 * This "function" does not return, instead it continues in RAM
1374 * after relocating the monitor code.
1375 *
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001376 * r3 = Relocated stack pointer
1377 * r4 = Relocated global data pointer
1378 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001379 */
1380 .globl relocate_code
1381relocate_code:
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001382#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roese9b94ac62007-10-31 17:55:58 +01001383 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001384 * We need to flush the initial global data (gd_t) before the dcache
1385 * will be invalidated.
Stefan Roese9b94ac62007-10-31 17:55:58 +01001386 */
1387
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001388 /* Save registers */
1389 mr r9, r3
1390 mr r10, r4
1391 mr r11, r5
Stefan Roese9b94ac62007-10-31 17:55:58 +01001392
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001393 /* Flush initial global data range */
1394 mr r3, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001395 addi r4, r4, CONFIG_SYS_GBL_DATA_SIZE@l
Stefan Roese9b94ac62007-10-31 17:55:58 +01001396 bl flush_dcache_range
1397
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001398#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001399 /*
1400 * Undo the earlier data cache set-up for the primordial stack and
1401 * data area. First, invalidate the data cache and then disable data
1402 * cacheability for that area. Finally, restore the EBC values, if
1403 * any.
1404 */
1405
1406 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001407 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1408 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001409
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001410 lis r4, CONFIG_SYS_INIT_RAM_END@h
1411 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001412 add r4, r4, r3
1413
1414 bl invalidate_dcache_range
1415
1416 /* Disable cacheability for the region */
1417 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001418 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1419 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001420 and r3, r3, r4
1421 mtdccr r3
1422
1423 /* Restore the EBC parameters */
1424 li r3, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001425 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001426 lis r3, PBxAP_VAL@h
1427 ori r3, r3, PBxAP_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001428 mtdcr EBC0_CFGDATA, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001429
1430 li r3, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001431 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001432 lis r3, PBxCR_VAL@h
1433 ori r3, r3, PBxCR_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001434 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001435#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001436
1437 /* Restore registers */
1438 mr r3, r9
1439 mr r4, r10
1440 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001441#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesee02c5212008-01-09 10:23:16 +01001442
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001443#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesee02c5212008-01-09 10:23:16 +01001444 /*
1445 * Unlock the previously locked d-cache
1446 */
1447 msync
1448 isync
1449 /* set TFLOOR/NFLOOR to 0 again */
1450 lis r6,0x0001
1451 ori r6,r6,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001452 mtspr SPRN_DVLIM,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001453 lis r6,0x0000
1454 ori r6,r6,0x0000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001455 mtspr SPRN_DNV0,r6
1456 mtspr SPRN_DNV1,r6
1457 mtspr SPRN_DNV2,r6
1458 mtspr SPRN_DNV3,r6
1459 mtspr SPRN_DTV0,r6
1460 mtspr SPRN_DTV1,r6
1461 mtspr SPRN_DTV2,r6
1462 mtspr SPRN_DTV3,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001463 msync
1464 isync
Stefan Roesef3cac532010-08-31 11:27:14 +02001465
1466 /* Invalidate data cache, now no longer our stack */
1467 dccci 0,0
1468 sync
1469 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001470#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesee02c5212008-01-09 10:23:16 +01001471
Stefan Roesea4c8d132006-06-02 16:18:04 +02001472 /*
1473 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1474 * to speed up the boot process. Now this cache needs to be disabled.
1475 */
Stefan Roese4978e602010-05-27 16:45:20 +02001476#if defined(CONFIG_440)
Stefan Roese25fb4ea2008-11-20 11:46:20 +01001477 /* Clear all potential pending exceptions */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001478 mfspr r1,SPRN_MCSR
1479 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001480 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001481 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001482 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001483 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001484 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001485 isync
Stefan Roese4978e602010-05-27 16:45:20 +02001486#endif /* defined(CONFIG_440) */
wdenk0442ed82002-11-03 10:24:00 +00001487 mr r1, r3 /* Set new stack pointer */
1488 mr r9, r4 /* Save copy of Init Data pointer */
1489 mr r10, r5 /* Save copy of Destination Address */
1490
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001491 GET_GOT
wdenk0442ed82002-11-03 10:24:00 +00001492 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001493 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1494 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001495 lwz r5, GOT(__init_end)
1496 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001497 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001498
1499 /*
1500 * Fix GOT pointer:
1501 *
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001502 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001503 *
1504 * Offset:
1505 */
1506 sub r15, r10, r4
1507
1508 /* First our own GOT */
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001509 add r12, r12, r15
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001510 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001511 add r30, r30, r15
1512
1513 /*
1514 * Now relocate code
1515 */
1516
1517 cmplw cr1,r3,r4
1518 addi r0,r5,3
1519 srwi. r0,r0,2
1520 beq cr1,4f /* In place copy is not necessary */
1521 beq 7f /* Protect against 0 count */
1522 mtctr r0
1523 bge cr1,2f
1524
1525 la r8,-4(r4)
1526 la r7,-4(r3)
15271: lwzu r0,4(r8)
1528 stwu r0,4(r7)
1529 bdnz 1b
1530 b 4f
1531
15322: slwi r0,r0,2
1533 add r8,r4,r0
1534 add r7,r3,r0
15353: lwzu r0,-4(r8)
1536 stwu r0,-4(r7)
1537 bdnz 3b
1538
1539/*
1540 * Now flush the cache: note that we must start from a cache aligned
1541 * address. Otherwise we might miss one cache line.
1542 */
15434: cmpwi r6,0
1544 add r5,r3,r5
1545 beq 7f /* Always flush prefetch queue in any case */
1546 subi r0,r6,1
1547 andc r3,r3,r0
1548 mr r4,r3
15495: dcbst 0,r4
1550 add r4,r4,r6
1551 cmplw r4,r5
1552 blt 5b
1553 sync /* Wait for all dcbst to complete on bus */
1554 mr r4,r3
15556: icbi 0,r4
1556 add r4,r4,r6
1557 cmplw r4,r5
1558 blt 6b
15597: sync /* Wait for all icbi to complete on bus */
1560 isync
1561
1562/*
1563 * We are done. Do not return, instead branch to second part of board
1564 * initialization, now running from RAM.
1565 */
1566
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001567 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001568 mtlr r0
1569 blr /* NEVER RETURNS! */
1570
1571in_ram:
1572
1573 /*
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001574 * Relocation Function, r12 point to got2+0x8000
wdenk0442ed82002-11-03 10:24:00 +00001575 *
1576 * Adjust got2 pointers, no need to check for 0, this code
1577 * already puts a few entries in the table.
1578 */
1579 li r0,__got2_entries@sectoff@l
1580 la r3,GOT(_GOT2_TABLE_)
1581 lwz r11,GOT(_GOT2_TABLE_)
1582 mtctr r0
1583 sub r11,r3,r11
1584 addi r3,r3,-4
15851: lwzu r0,4(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001586 cmpwi r0,0
1587 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001588 add r0,r0,r11
1589 stw r0,0(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +020015902: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001591
1592 /*
1593 * Now adjust the fixups and the pointers to the fixups
1594 * in case we need to move ourselves again.
1595 */
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001596 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001597 lwz r3,GOT(_FIXUP_TABLE_)
1598 cmpwi r0,0
1599 mtctr r0
1600 addi r3,r3,-4
1601 beq 4f
16023: lwzu r4,4(r3)
1603 lwzux r0,r4,r11
1604 add r0,r0,r11
1605 stw r10,0(r3)
1606 stw r0,0(r4)
1607 bdnz 3b
16084:
1609clear_bss:
1610 /*
1611 * Now clear BSS segment
1612 */
wdenk5d232d02003-05-22 22:52:13 +00001613 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001614 lwz r4,GOT(_end)
1615
1616 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001617 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001618
1619 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001620
1621 andi. r5, r4, 3
1622 beq 6f
1623 sub r4, r4, r5
1624 mtctr r5
1625 mr r5, r4
16265: stb r0, 0(r5)
1627 addi r5, r5, 1
1628 bdnz 5b
16296:
wdenk0442ed82002-11-03 10:24:00 +00001630 stw r0, 0(r3)
1631 addi r3, r3, 4
1632 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001633 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001634
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010016357:
wdenk0442ed82002-11-03 10:24:00 +00001636 mr r3, r9 /* Init Data pointer */
1637 mr r4, r10 /* Destination Address */
1638 bl board_init_r
1639
wdenk0442ed82002-11-03 10:24:00 +00001640 /*
1641 * Copy exception vector code to low memory
1642 *
1643 * r3: dest_addr
1644 * r7: source address, r8: end address, r9: target address
1645 */
1646 .globl trap_init
1647trap_init:
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001648 mflr r4 /* save link register */
1649 GET_GOT
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001650 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001651 lwz r8, GOT(_end_of_vectors)
1652
wdenk682011f2003-06-03 23:54:09 +00001653 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001654
1655 cmplw 0, r7, r8
1656 bgelr /* return if r7>=r8 - just in case */
wdenk0442ed82002-11-03 10:24:00 +000016571:
1658 lwz r0, 0(r7)
1659 stw r0, 0(r9)
1660 addi r7, r7, 4
1661 addi r9, r9, 4
1662 cmplw 0, r7, r8
1663 bne 1b
1664
1665 /*
1666 * relocate `hdlr' and `int_return' entries
1667 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001668 li r7, .L_MachineCheck - _start + _START_OFFSET
1669 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000016702:
1671 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001672 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001673 cmplw 0, r7, r8
1674 blt 2b
1675
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001676 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001677 bl trap_reloc
1678
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001679 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001680 bl trap_reloc
1681
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001682#ifdef CONFIG_440
1683 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001684 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001685
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001686 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001687 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001688
1689 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001690 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001691
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001692 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1693 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001694
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001695 li r7, .L_DataTLBError - _start + _START_OFFSET
1696 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001697#else /* CONFIG_440 */
1698 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001699 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001700
1701 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001702 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001703
1704 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001705 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001706#endif /* CONFIG_440 */
1707
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001708 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1709 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001710
Stefan Roese887e2ec2006-09-07 11:51:23 +02001711#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001712 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1713 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1714 mtmsr r7 /* change MSR */
1715#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001716 bl __440_msr_set
1717 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001718
Stefan Roese887e2ec2006-09-07 11:51:23 +02001719__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001720 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1721 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001722 mtspr SPRN_SRR1,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001723 mflr r7
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001724 mtspr SPRN_SRR0,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001725 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001726__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001727#endif
1728
wdenk0442ed82002-11-03 10:24:00 +00001729 mtlr r4 /* restore link register */
1730 blr
1731
Stefan Roesecf959c72007-06-01 15:27:11 +02001732#if defined(CONFIG_440)
1733/*----------------------------------------------------------------------------+
1734| dcbz_area.
1735+----------------------------------------------------------------------------*/
1736 function_prolog(dcbz_area)
1737 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001738 rlwinm r5,r4,27,5,31
1739 beq ..d_ra2
1740 addi r5,r5,0x0001
1741..d_ra2:mtctr r5
1742..d_ag2:dcbz r0,r3
1743 addi r3,r3,32
1744 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001745 sync
1746 blr
1747 function_epilog(dcbz_area)
Stefan Roesecf959c72007-06-01 15:27:11 +02001748#endif /* CONFIG_440 */
Stefan Roese887e2ec2006-09-07 11:51:23 +02001749#endif /* CONFIG_NAND_SPL */
stroeseb867d702003-05-23 11:18:02 +00001750
Stefan Roesecf959c72007-06-01 15:27:11 +02001751/*------------------------------------------------------------------------------- */
1752/* Function: in8 */
1753/* Description: Input 8 bits */
1754/*------------------------------------------------------------------------------- */
1755 .globl in8
1756in8:
1757 lbz r3,0x0000(r3)
1758 blr
1759
1760/*------------------------------------------------------------------------------- */
1761/* Function: out8 */
1762/* Description: Output 8 bits */
1763/*------------------------------------------------------------------------------- */
1764 .globl out8
1765out8:
1766 stb r4,0x0000(r3)
1767 blr
1768
1769/*------------------------------------------------------------------------------- */
1770/* Function: out32 */
1771/* Description: Output 32 bits */
1772/*------------------------------------------------------------------------------- */
1773 .globl out32
1774out32:
1775 stw r4,0x0000(r3)
1776 blr
1777
1778/*------------------------------------------------------------------------------- */
1779/* Function: in32 */
1780/* Description: Input 32 bits */
1781/*------------------------------------------------------------------------------- */
1782 .globl in32
1783in32:
1784 lwz 3,0x0000(3)
1785 blr
stroeseb867d702003-05-23 11:18:02 +00001786
1787/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001788/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001789/**************************************************************************/
1790#ifdef CONFIG_405EP
1791ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001792
Stefan Roesec157d8e2005-08-01 16:41:48 +02001793#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001794 /*
1795 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1796 * function) to support FPGA and NVRAM accesses below.
1797 */
1798
1799 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1800 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001801 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1802 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001803 stw r4,0(r3)
1804 lis r3,GPIO0_OSRL@h
1805 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001806 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1807 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001808 stw r4,0(r3)
1809
1810 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1811 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001812 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1813 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroeseb828dda2003-12-09 14:54:43 +00001814 stw r4,0(r3)
1815 lis r3,GPIO0_ISR1L@h
1816 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001817 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1818 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroeseb828dda2003-12-09 14:54:43 +00001819 stw r4,0(r3)
1820
1821 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1822 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001823 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1824 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001825 stw r4,0(r3)
1826 lis r3,GPIO0_TSRL@h
1827 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001828 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1829 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001830 stw r4,0(r3)
1831
1832 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1833 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001834 lis r4,CONFIG_SYS_GPIO0_TCR@h
1835 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroeseb828dda2003-12-09 14:54:43 +00001836 stw r4,0(r3)
1837
Stefan Roesed1c3b272009-09-09 16:25:29 +02001838 li r3,PB1AP /* program EBC bank 1 for RTC access */
1839 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001840 lis r3,CONFIG_SYS_EBC_PB1AP@h
1841 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001842 mtdcr EBC0_CFGDATA,r3
1843 li r3,PB1CR
1844 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001845 lis r3,CONFIG_SYS_EBC_PB1CR@h
1846 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001847 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001848
Stefan Roesed1c3b272009-09-09 16:25:29 +02001849 li r3,PB1AP /* program EBC bank 1 for RTC access */
1850 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001851 lis r3,CONFIG_SYS_EBC_PB1AP@h
1852 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001853 mtdcr EBC0_CFGDATA,r3
1854 li r3,PB1CR
1855 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001856 lis r3,CONFIG_SYS_EBC_PB1CR@h
1857 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001858 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001859
Stefan Roesed1c3b272009-09-09 16:25:29 +02001860 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1861 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001862 lis r3,CONFIG_SYS_EBC_PB4AP@h
1863 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001864 mtdcr EBC0_CFGDATA,r3
1865 li r3,PB4CR
1866 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001867 lis r3,CONFIG_SYS_EBC_PB4CR@h
1868 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001869 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001870#endif
1871
wdenk8bde7f72003-06-27 21:31:46 +00001872 /*
1873 !-----------------------------------------------------------------------
1874 ! Check to see if chip is in bypass mode.
1875 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1876 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001877 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1878 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001879 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001880 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001881 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001882 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001883 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001884
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001885 beq pll_done /* if SSCS =b'1' then PLL has */
1886 /* already been set */
1887 /* and CPU has been reset */
1888 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001889
Stefan Roesec157d8e2005-08-01 16:41:48 +02001890#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001891 /*
wdenk8bde7f72003-06-27 21:31:46 +00001892 !-----------------------------------------------------------------------
1893 ! Read NVRAM to get value to write in PLLMR.
1894 ! If value has not been correctly saved, write default value
1895 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1896 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1897 !
1898 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001899 ! structure in openbios.h. Changing the beginning of
1900 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001901 !
1902 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001903 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001904 addis r3,0,NVRAM_BASE@h
1905 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001906
Wolfgang Denkf901a832005-08-06 01:42:58 +02001907 lwz r4, 0(r3)
1908 addis r5,0,NVRVFY1@h
1909 addi r5,r5,NVRVFY1@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001910 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001911 bne ..no_pllset
1912 addi r3,r3,4
1913 lwz r4, 0(r3)
1914 addis r5,0,NVRVFY2@h
1915 addi r5,r5,NVRVFY2@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001916 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001917 bne ..no_pllset
1918 addi r3,r3,8 /* Skip over conf_size */
1919 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1920 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1921 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1922 cmpi cr0,0,r5,1 /* See if PLL is locked */
1923 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001924..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001925#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001926
John Otkend4024bb2007-07-26 17:49:11 +02001927#ifdef CONFIG_TAIHU
1928 mfdcr r4, CPC0_BOOT
1929 andi. r5, r4, CPC0_BOOT_SEP@l
1930 bne strap_1 /* serial eeprom present */
1931 addis r5,0,CPLD_REG0_ADDR@h
1932 ori r5,r5,CPLD_REG0_ADDR@l
1933 andi. r5, r5, 0x10
1934 bne _pci_66mhz
1935#endif /* CONFIG_TAIHU */
1936
Stefan Roese779e9752007-08-14 14:44:41 +02001937#if defined(CONFIG_ZEUS)
1938 mfdcr r4, CPC0_BOOT
1939 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001940 bne strap_1 /* serial eeprom present */
Stefan Roese779e9752007-08-14 14:44:41 +02001941 lis r3,0x0000
1942 addi r3,r3,0x3030
1943 lis r4,0x8042
1944 addi r4,r4,0x223e
1945 b 1f
1946strap_1:
1947 mfdcr r3, CPC0_PLLMR0
1948 mfdcr r4, CPC0_PLLMR1
1949 b 1f
1950#endif
1951
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001952 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1953 ori r3,r3,PLLMR0_DEFAULT@l /* */
1954 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1955 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001956
John Otkend4024bb2007-07-26 17:49:11 +02001957#ifdef CONFIG_TAIHU
1958 b 1f
1959_pci_66mhz:
1960 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1961 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1962 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1963 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1964 b 1f
1965strap_1:
1966 mfdcr r3, CPC0_PLLMR0
1967 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001968#endif /* CONFIG_TAIHU */
1969
Stefan Roese779e9752007-08-14 14:44:41 +020019701:
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001971 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001972
1973pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001974 /*
1975 !-----------------------------------------------------------------------
1976 ! Clear Soft Reset Register
1977 ! This is needed to enable PCI if not booting from serial EPROM
1978 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001979 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001980 addi r3, 0, 0x0
1981 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001982
Wolfgang Denkf901a832005-08-06 01:42:58 +02001983 addis r3,0,0x0010
1984 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001985pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001986 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001987
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001988 blr /* return to main code */
stroeseb867d702003-05-23 11:18:02 +00001989
1990/*
1991!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02001992! Function: pll_write
1993! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1994! That is:
1995! 1. Pll is first disabled (de-activated by putting in bypass mode)
1996! 2. PLL is reset
1997! 3. Clock dividers are set while PLL is held in reset and bypassed
1998! 4. PLL Reset is cleared
1999! 5. Wait 100us for PLL to lock
2000! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00002001! Input: r3 = Value to write to CPC0_PLLMR0
2002! Input: r4 = Value to write to CPC0_PLLMR1
2003! Output r3 = none
2004!-----------------------------------------------------------------------------
2005*/
Matthias Fuchs0580e482009-07-06 16:27:33 +02002006 .globl pll_write
stroeseb867d702003-05-23 11:18:02 +00002007pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00002008 mfdcr r5, CPC0_UCR
2009 andis. r5,r5,0xFFFF
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002010 ori r5,r5,0x0101 /* Stop the UART clocks */
2011 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00002012
wdenk8bde7f72003-06-27 21:31:46 +00002013 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002014 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002015 mtdcr CPC0_PLLMR1,r5
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002016 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002017 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00002018
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002019 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
2020 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
2021 oris r5,r5,0x4000 /* Set PLL Reset */
2022 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
2023 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002024 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00002025
2026 /*
wdenk8bde7f72003-06-27 21:31:46 +00002027 ! Wait min of 100us for PLL to lock.
2028 ! See CMOS 27E databook for more info.
2029 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00002030 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02002031 addi r3,0,20000 /* 2000 = 0x4e20 */
2032 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00002033pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02002034 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00002035
Wolfgang Denkf901a832005-08-06 01:42:58 +02002036 oris r5,r5,0x8000 /* Enable PLL */
2037 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00002038
wdenk8bde7f72003-06-27 21:31:46 +00002039 /*
2040 * Reset CPU to guarantee timings are OK
2041 * Not sure if this is needed...
2042 */
2043 addis r3,0,0x1000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02002044 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denk53677ef2008-05-20 16:00:29 +02002045 /* execution will continue from the poweron */
2046 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00002047#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01002048
2049#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01002050/*----------------------------------------------------------------------------+
2051| mttlb3.
2052+----------------------------------------------------------------------------*/
2053 function_prolog(mttlb3)
2054 TLBWE(4,3,2)
2055 blr
2056 function_epilog(mttlb3)
2057
2058/*----------------------------------------------------------------------------+
2059| mftlb3.
2060+----------------------------------------------------------------------------*/
2061 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01002062 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01002063 blr
2064 function_epilog(mftlb3)
2065
2066/*----------------------------------------------------------------------------+
2067| mttlb2.
2068+----------------------------------------------------------------------------*/
2069 function_prolog(mttlb2)
2070 TLBWE(4,3,1)
2071 blr
2072 function_epilog(mttlb2)
2073
2074/*----------------------------------------------------------------------------+
2075| mftlb2.
2076+----------------------------------------------------------------------------*/
2077 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01002078 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01002079 blr
2080 function_epilog(mftlb2)
2081
2082/*----------------------------------------------------------------------------+
2083| mttlb1.
2084+----------------------------------------------------------------------------*/
2085 function_prolog(mttlb1)
2086 TLBWE(4,3,0)
2087 blr
2088 function_epilog(mttlb1)
2089
2090/*----------------------------------------------------------------------------+
2091| mftlb1.
2092+----------------------------------------------------------------------------*/
2093 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01002094 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01002095 blr
2096 function_epilog(mftlb1)
2097#endif /* CONFIG_440 */
Stefan Roese64852d02008-06-02 14:35:44 +02002098
2099#if defined(CONFIG_NAND_SPL)
2100/*
2101 * void nand_boot_relocate(dst, src, bytes)
2102 *
2103 * r3 = Destination address to copy code to (in SDRAM)
2104 * r4 = Source address to copy code from
2105 * r5 = size to copy in bytes
2106 */
2107nand_boot_relocate:
2108 mr r6,r3
2109 mr r7,r4
2110 mflr r8
2111
2112 /*
2113 * Copy SPL from icache into SDRAM
2114 */
2115 subi r3,r3,4
2116 subi r4,r4,4
2117 srwi r5,r5,2
2118 mtctr r5
2119..spl_loop:
2120 lwzu r0,4(r4)
2121 stwu r0,4(r3)
2122 bdnz ..spl_loop
2123
2124 /*
2125 * Calculate "corrected" link register, so that we "continue"
2126 * in execution in destination range
2127 */
2128 sub r3,r7,r6 /* r3 = src - dst */
2129 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2130 mtlr r8
2131 blr
2132
2133nand_boot_common:
2134 /*
2135 * First initialize SDRAM. It has to be available *before* calling
2136 * nand_boot().
2137 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002138 lis r3,CONFIG_SYS_SDRAM_BASE@h
2139 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002140 bl initdram
2141
2142 /*
2143 * Now copy the 4k SPL code into SDRAM and continue execution
2144 * from there.
2145 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02002146 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2147 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2148 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2149 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2150 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2151 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
Stefan Roese64852d02008-06-02 14:35:44 +02002152 bl nand_boot_relocate
2153
2154 /*
2155 * We're running from SDRAM now!!!
2156 *
2157 * It is necessary for 4xx systems to relocate from running at
2158 * the original location (0xfffffxxx) to somewhere else (SDRAM
2159 * preferably). This is because CS0 needs to be reconfigured for
2160 * NAND access. And we can't reconfigure this CS when currently
2161 * "running" from it.
2162 */
2163
2164 /*
2165 * Finally call nand_boot() to load main NAND U-Boot image from
2166 * NAND and jump to it.
2167 */
2168 bl nand_boot /* will not return */
2169#endif /* CONFIG_NAND_SPL */