blob: 46f65aa779b1fb0711bdd14b8cc38186d8fcc98e [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 Roesef6c7b762007-03-24 15:45:34 +01005 * Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
Grant Ericksonb6933412008-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 Denk09675ef2007-06-20 18:14:24 +020027/*------------------------------------------------------------------------------+
Josh Boyer471573b2009-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 Denk09675ef2007-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 Denk0ee70772005-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>
wdenk0442ed82002-11-03 10:24:00 +000067#include <ppc4xx.h>
Peter Tyser62948502008-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 Mitchell3c3734172008-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-VILLARD03836942008-10-16 15:01:15 +020084#ifdef CONFIG_SYS_INIT_DCACHE_CS
85# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
Stefan Roese918010a2009-09-09 16:25:29 +020086# define PBxAP PB1AP
87# define PBxCR PB0CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070091# endif
wdenk0442ed82002-11-03 10:24:00 +000092# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020093# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
Stefan Roese918010a2009-09-09 16:25:29 +020094# define PBxAP PB1AP
95# define PBxCR PB1CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070099# endif
wdenk0442ed82002-11-03 10:24:00 +0000100# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200101# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
Stefan Roese918010a2009-09-09 16:25:29 +0200102# define PBxAP PB2AP
103# define PBxCR PB2CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700107# endif
wdenk0442ed82002-11-03 10:24:00 +0000108# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200109# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
Stefan Roese918010a2009-09-09 16:25:29 +0200110# define PBxAP PB3AP
111# define PBxCR PB3CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700115# endif
wdenk0442ed82002-11-03 10:24:00 +0000116# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200117# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
Stefan Roese918010a2009-09-09 16:25:29 +0200118# define PBxAP PB4AP
119# define PBxCR PB4CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700123# endif
wdenk0442ed82002-11-03 10:24:00 +0000124# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200125# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
Stefan Roese918010a2009-09-09 16:25:29 +0200126# define PBxAP PB5AP
127# define PBxCR PB5CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700131# endif
wdenk0442ed82002-11-03 10:24:00 +0000132# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200133# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
Stefan Roese918010a2009-09-09 16:25:29 +0200134# define PBxAP PB6AP
135# define PBxCR PB6CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700139# endif
wdenk0442ed82002-11-03 10:24:00 +0000140# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200141# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
Stefan Roese918010a2009-09-09 16:25:29 +0200142# define PBxAP PB7AP
143# define PBxCR PB7CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-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-VILLARD03836942008-10-16 15:01:15 +0200156 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonb6933412008-05-22 14:44:14 -0700157 * used as temporary stack pointer for the primordial stack
158 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200159# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
160# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonb6933412008-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-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700176 EBC_BXCR_BS_64MB | \
177 EBC_BXCR_BU_RW | \
178 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD03836942008-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-VILLARD03836942008-10-16 15:01:15 +0200183#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000184
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Roese0fb8ab92008-01-30 14:48:28 +0100187#endif
188
Grant Ericksonb6933412008-05-22 14:44:14 -0700189/*
190 * Unless otherwise overriden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700193 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200194#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese7d72e022008-06-02 14:35:44 +0200195/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200196# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese7d72e022008-06-02 14:35:44 +0200197#endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700204
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200205#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
206# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonb6933412008-05-22 14:44:14 -0700207 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200208#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonb6933412008-05-22 14:44:14 -0700209
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200210#define function_prolog(func_name) .text; \
Stefan Roese42743512007-06-01 15:27:11 +0200211 .align 2; \
212 .globl func_name; \
213 func_name:
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200214#define function_epilog(func_name) .type func_name,@function; \
Stefan Roese42743512007-06-01 15:27:11 +0200215 .size func_name,.-func_name
216
wdenk0442ed82002-11-03 10:24:00 +0000217/* We don't want the MMU yet.
218*/
219#undef MSR_KERNEL
220#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
221
222
223 .extern ext_bus_cntlr_init
Stefan Roese42fbddd2006-09-07 11:51:23 +0200224#ifdef CONFIG_NAND_U_BOOT
225 .extern reconfig_tlb0
226#endif
wdenk0442ed82002-11-03 10:24:00 +0000227
228/*
229 * Set up GOT: Global Offset Table
230 *
231 * Use r14 to access the GOT
232 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200233#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000234 START_GOT
235 GOT_ENTRY(_GOT2_TABLE_)
236 GOT_ENTRY(_FIXUP_TABLE_)
237
238 GOT_ENTRY(_start)
239 GOT_ENTRY(_start_of_vectors)
240 GOT_ENTRY(_end_of_vectors)
241 GOT_ENTRY(transfer_to_handler)
242
wdenkb9a83a92003-05-30 12:48:29 +0000243 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000244 GOT_ENTRY(_end)
wdenkbf2f8c92003-05-22 22:52:13 +0000245 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000246 END_GOT
Stefan Roese42fbddd2006-09-07 11:51:23 +0200247#endif /* CONFIG_NAND_SPL */
248
249#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
250 /*
251 * NAND U-Boot image is started from offset 0
252 */
253 .text
Stefan Roese23d8d342007-06-06 11:42:13 +0200254#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200255 bl reconfig_tlb0
Stefan Roese23d8d342007-06-06 11:42:13 +0200256#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200257 GET_GOT
258 bl cpu_init_f /* run low-level CPU init code (from Flash) */
259 bl board_init_f
260#endif
wdenk0442ed82002-11-03 10:24:00 +0000261
Stefan Roesec20ef322009-05-11 13:46:14 +0200262#if defined(CONFIG_SYS_RAMBOOT)
263 /*
264 * 4xx RAM-booting U-Boot image is started from offset 0
265 */
266 .text
267 bl _start_440
268#endif
269
wdenk0442ed82002-11-03 10:24:00 +0000270/*
271 * 440 Startup -- on reset only the top 4k of the effective
272 * address space is mapped in by an entry in the instruction
273 * and data shadow TLB. The .bootpg section is located in the
274 * top 4k & does only what's necessary to map in the the rest
275 * of the boot rom. Once the boot rom is mapped in we can
276 * proceed with normal startup.
277 *
278 * NOTE: CS0 only covers the top 2MB of the effective address
279 * space after reset.
280 */
281
282#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200283#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000284 .section .bootpg,"ax"
Stefan Roese42fbddd2006-09-07 11:51:23 +0200285#endif
wdenk0442ed82002-11-03 10:24:00 +0000286 .globl _start_440
287
288/**************************************************************************/
289_start_440:
Wolfgang Denk4df0da52006-10-09 00:42:01 +0200290 /*--------------------------------------------------------------------+
291 | 440EPX BUP Change - Hardware team request
292 +--------------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200293#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
294 sync
295 nop
296 nop
297#endif
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200298 /*----------------------------------------------------------------+
299 | Core bug fix. Clear the esr
300 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200301 li r0,0
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200302 mtspr SPRN_ESR,r0
wdenk0442ed82002-11-03 10:24:00 +0000303 /*----------------------------------------------------------------*/
304 /* Clear and set up some registers. */
305 /*----------------------------------------------------------------*/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200306 iccci r0,r0 /* NOTE: operands not used for 440 */
307 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000308 sync
309 li r0,0
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200310 mtspr SPRN_SRR0,r0
311 mtspr SPRN_SRR1,r0
312 mtspr SPRN_CSRR0,r0
313 mtspr SPRN_CSRR1,r0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200314 /* NOTE: 440GX adds machine check status regs */
315#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200316 mtspr SPRN_MCSRR0,r0
317 mtspr SPRN_MCSRR1,r0
318 mfspr r1,SPRN_MCSR
319 mtspr SPRN_MCSR,r1
wdenk544e9732004-02-06 23:19:44 +0000320#endif
Stefan Roese0100cc12006-11-22 13:20:50 +0100321
322 /*----------------------------------------------------------------*/
323 /* CCR0 init */
324 /*----------------------------------------------------------------*/
325 /* Disable store gathering & broadcast, guarantee inst/data
326 * cache block touch, force load/store alignment
327 * (see errata 1.12: 440_33)
328 */
329 lis r1,0x0030 /* store gathering & broadcast disable */
330 ori r1,r1,0x6000 /* cache touch */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200331 mtspr SPRN_CCR0,r1
Stefan Roese0100cc12006-11-22 13:20:50 +0100332
wdenk0442ed82002-11-03 10:24:00 +0000333 /*----------------------------------------------------------------*/
334 /* Initialize debug */
335 /*----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200336 mfspr r1,SPRN_DBCR0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200337 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
338 bne skip_debug_init /* if set, don't clear debug register */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200339 mtspr SPRN_DBCR0,r0
340 mtspr SPRN_DBCR1,r0
341 mtspr SPRN_DBCR2,r0
342 mtspr SPRN_IAC1,r0
343 mtspr SPRN_IAC2,r0
344 mtspr SPRN_IAC3,r0
345 mtspr SPRN_DAC1,r0
346 mtspr SPRN_DAC2,r0
347 mtspr SPRN_DVC1,r0
348 mtspr SPRN_DVC2,r0
wdenk0442ed82002-11-03 10:24:00 +0000349
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200350 mfspr r1,SPRN_DBSR
351 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200352skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000353
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200354#if defined (CONFIG_440SPE)
355 /*----------------------------------------------------------------+
356 | Initialize Core Configuration Reg1.
357 | a. ICDPEI: Record even parity. Normal operation.
358 | b. ICTPEI: Record even parity. Normal operation.
359 | c. DCTPEI: Record even parity. Normal operation.
360 | d. DCDPEI: Record even parity. Normal operation.
361 | e. DCUPEI: Record even parity. Normal operation.
362 | f. DCMPEI: Record even parity. Normal operation.
363 | g. FCOM: Normal operation
364 | h. MMUPEI: Record even parity. Normal operation.
365 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200366 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200367 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200368 li r0,0
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200369 mtspr SPRN_CCR1, r0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200370
371 /*----------------------------------------------------------------+
372 | Reset the timebase.
373 | The previous write to CCR1 sets the timebase source.
374 +-----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200375 mtspr SPRN_TBWL, r0
376 mtspr SPRN_TBWU, r0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200377#endif
378
wdenk0442ed82002-11-03 10:24:00 +0000379 /*----------------------------------------------------------------*/
380 /* Setup interrupt vectors */
381 /*----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200382 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200383 li r1,0x0100
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200384 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200385 li r1,0x0200
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200386 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200387 li r1,0x0300
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200388 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200389 li r1,0x0400
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200390 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000391 li r1,0x0500
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200392 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000393 li r1,0x0600
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200394 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000395 li r1,0x0700
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200396 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000397 li r1,0x0800
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200398 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000399 li r1,0x0c00
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200400 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200401 li r1,0x0a00
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200402 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200403 li r1,0x0900
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200404 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000405 li r1,0x1300
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200406 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200407 li r1,0x1400
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200408 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000409 li r1,0x2000
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200410 mtspr SPRN_IVOR15,r1 /* Debug */
wdenk0442ed82002-11-03 10:24:00 +0000411
412 /*----------------------------------------------------------------*/
413 /* Configure cache regions */
414 /*----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200415 mtspr SPRN_INV0,r0
416 mtspr SPRN_INV1,r0
417 mtspr SPRN_INV2,r0
418 mtspr SPRN_INV3,r0
419 mtspr SPRN_DNV0,r0
420 mtspr SPRN_DNV1,r0
421 mtspr SPRN_DNV2,r0
422 mtspr SPRN_DNV3,r0
423 mtspr SPRN_ITV0,r0
424 mtspr SPRN_ITV1,r0
425 mtspr SPRN_ITV2,r0
426 mtspr SPRN_ITV3,r0
427 mtspr SPRN_DTV0,r0
428 mtspr SPRN_DTV1,r0
429 mtspr SPRN_DTV2,r0
430 mtspr SPRN_DTV3,r0
wdenk0442ed82002-11-03 10:24:00 +0000431
432 /*----------------------------------------------------------------*/
433 /* Cache victim limits */
434 /*----------------------------------------------------------------*/
435 /* floors 0, ceiling max to use the entire cache -- nothing locked
436 */
437 lis r1,0x0001
438 ori r1,r1,0xf800
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200439 mtspr SPRN_IVLIM,r1
440 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000441
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200442 /*----------------------------------------------------------------+
443 |Initialize MMUCR[STID] = 0.
444 +-----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200445 mfspr r0,SPRN_MMUCR
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200446 addis r1,0,0xFFFF
447 ori r1,r1,0xFF00
448 and r0,r0,r1
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200449 mtspr SPRN_MMUCR,r0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200450
wdenk0442ed82002-11-03 10:24:00 +0000451 /*----------------------------------------------------------------*/
452 /* Clear all TLB entries -- TID = 0, TS = 0 */
453 /*----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200454 addis r0,0,0x0000
Stefan Roesed0c43952009-07-14 15:53:08 +0200455#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesec20ef322009-05-11 13:46:14 +0200456 li r4,0 /* Start with TLB #0 */
Stefan Roesed0c43952009-07-14 15:53:08 +0200457#else
458 li r4,1 /* Start with TLB #1 */
459#endif
460 li r1,64 /* 64 TLB entries */
461 sub r1,r1,r4 /* calculate last TLB # */
462 mtctr r1
Stefan Roesec20ef322009-05-11 13:46:14 +0200463rsttlb:
464#ifdef CONFIG_SYS_RAMBOOT
465 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
466 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
467 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
468#endif
469 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
470 tlbwe r0,r4,1
471 tlbwe r0,r4,2
472tlbnxt: addi r4,r4,1 /* Next TLB */
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200473 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000474
475 /*----------------------------------------------------------------*/
476 /* TLB entry setup -- step thru tlbtab */
477 /*----------------------------------------------------------------*/
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200478#if defined(CONFIG_440SPE)
479 /*----------------------------------------------------------------*/
480 /* We have different TLB tables for revA and rev B of 440SPe */
481 /*----------------------------------------------------------------*/
482 mfspr r1, PVR
483 lis r0,0x5342
484 ori r0,r0,0x1891
485 cmpw r7,r1,r0
486 bne r7,..revA
487 bl tlbtabB
488 b ..goon
489..revA:
490 bl tlbtabA
491..goon:
492#else
wdenk0442ed82002-11-03 10:24:00 +0000493 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200494#endif
wdenk0442ed82002-11-03 10:24:00 +0000495 mr r5,r0
496 li r1,0x003f /* 64 TLB entries max */
497 mtctr r1
498 li r4,0 /* TLB # */
499
500 addi r5,r5,-4
Stefan Roesec20ef322009-05-11 13:46:14 +02005011:
502#ifdef CONFIG_SYS_RAMBOOT
503 tlbre r3,r4,0 /* Read contents from TLB word #0 */
504 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
505 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
506#endif
507 lwzu r0,4(r5)
wdenk0442ed82002-11-03 10:24:00 +0000508 cmpwi r0,0
509 beq 2f /* 0 marks end */
510 lwzu r1,4(r5)
511 lwzu r2,4(r5)
512 tlbwe r0,r4,0 /* TLB Word 0 */
513 tlbwe r1,r4,1 /* TLB Word 1 */
514 tlbwe r2,r4,2 /* TLB Word 2 */
Stefan Roesec20ef322009-05-11 13:46:14 +0200515tlbnx2: addi r4,r4,1 /* Next TLB */
wdenk0442ed82002-11-03 10:24:00 +0000516 bdnz 1b
517
518 /*----------------------------------------------------------------*/
519 /* Continue from 'normal' start */
520 /*----------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +02005212:
Stefan Roese42fbddd2006-09-07 11:51:23 +0200522 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000523 b _start
524
5253: li r0,0
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200526 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
wdenk0442ed82002-11-03 10:24:00 +0000527 mflr r1
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200528 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000529 rfi
stroese434979e2003-05-23 11:18:02 +0000530#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000531
532/*
533 * r3 - 1st arg to board_init(): IMMP pointer
534 * r4 - 2nd arg to board_init(): boot flag
535 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200536#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000537 .text
538 .long 0x27051956 /* U-Boot Magic Number */
539 .globl version_string
540version_string:
541 .ascii U_BOOT_VERSION
Peter Tyser62948502008-11-03 09:30:59 -0600542 .ascii " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
wdenk0442ed82002-11-03 10:24:00 +0000543 .ascii CONFIG_IDENT_STRING, "\0"
544
wdenk0442ed82002-11-03 10:24:00 +0000545 . = EXC_OFF_SYS_RESET
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200546 .globl _start_of_vectors
547_start_of_vectors:
548
549/* Critical input. */
550 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
551
552#ifdef CONFIG_440
553/* Machine check */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200554 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200555#else
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200556 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200557#endif /* CONFIG_440 */
558
559/* Data Storage exception. */
560 STD_EXCEPTION(0x300, DataStorage, UnknownException)
561
562/* Instruction Storage exception. */
563 STD_EXCEPTION(0x400, InstStorage, UnknownException)
564
565/* External Interrupt exception. */
566 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
567
568/* Alignment exception. */
569 . = 0x600
570Alignment:
571 EXCEPTION_PROLOG(SRR0, SRR1)
572 mfspr r4,DAR
573 stw r4,_DAR(r21)
574 mfspr r5,DSISR
575 stw r5,_DSISR(r21)
576 addi r3,r1,STACK_FRAME_OVERHEAD
577 li r20,MSR_KERNEL
578 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
579 lwz r6,GOT(transfer_to_handler)
580 mtlr r6
581 blrl
582.L_Alignment:
583 .long AlignmentException - _start + _START_OFFSET
584 .long int_return - _start + _START_OFFSET
585
586/* Program check exception */
587 . = 0x700
588ProgramCheck:
589 EXCEPTION_PROLOG(SRR0, SRR1)
590 addi r3,r1,STACK_FRAME_OVERHEAD
591 li r20,MSR_KERNEL
592 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
593 lwz r6,GOT(transfer_to_handler)
594 mtlr r6
595 blrl
596.L_ProgramCheck:
597 .long ProgramCheckException - _start + _START_OFFSET
598 .long int_return - _start + _START_OFFSET
599
600#ifdef CONFIG_440
601 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
602 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
603 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roese80d99a42007-06-19 16:42:31 +0200604#endif
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200605 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
606
607#ifdef CONFIG_440
608 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
609 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
610#else
611 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
612 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
613 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
614#endif
615 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
616
617 .globl _end_of_vectors
618_end_of_vectors:
619 . = _START_OFFSET
Stefan Roese42fbddd2006-09-07 11:51:23 +0200620#endif
wdenk0442ed82002-11-03 10:24:00 +0000621 .globl _start
622_start:
623
624/*****************************************************************************/
625#if defined(CONFIG_440)
626
627 /*----------------------------------------------------------------*/
628 /* Clear and set up some registers. */
629 /*----------------------------------------------------------------*/
630 li r0,0x0000
631 lis r1,0xffff
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200632 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
633 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
634 mtspr SPRN_TBWU,r0
635 mtspr SPRN_TSR,r1 /* clear all timer exception status */
636 mtspr SPRN_TCR,r0 /* disable all */
637 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
wdenk0442ed82002-11-03 10:24:00 +0000638 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000639
640 /*----------------------------------------------------------------*/
641 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200642 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000643 /* value you need in this case 0x8cff 0000 should do the trick */
644 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200645#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000646 lis r1,0xffff
647 ori r1,r1,0xffff
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200648 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200649 lis r0,CONFIG_SYS_INIT_DBCR@h
650 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200651 mtspr SPRN_DBCR0,r0
wdenk0442ed82002-11-03 10:24:00 +0000652 isync
653#endif
654
655 /*----------------------------------------------------------------*/
656 /* Setup the internal SRAM */
657 /*----------------------------------------------------------------*/
658 li r0,0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200659
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200660#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roese326c9712005-08-01 16:41:48 +0200661 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200662 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
663 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
664 addis r4,r0,CONFIG_SYS_INIT_RAM_END@h
665 ori r4,r4,CONFIG_SYS_INIT_RAM_END@l
Stefan Roese326c9712005-08-01 16:41:48 +0200666 rlwinm. r5,r4,0,27,31
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200667 rlwinm r5,r4,27,5,31
668 beq ..d_ran
669 addi r5,r5,0x0001
Stefan Roese326c9712005-08-01 16:41:48 +0200670..d_ran:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200671 mtctr r5
Stefan Roese326c9712005-08-01 16:41:48 +0200672..d_ag:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200673 dcbz r0,r3
674 addi r3,r3,32
675 bdnz ..d_ag
Stefan Roesea86bde32008-01-09 10:23:16 +0100676
677 /*
678 * Lock the init-ram/stack in d-cache, so that other regions
679 * may use d-cache as well
680 * Note, that this current implementation locks exactly 4k
681 * of d-cache, so please make sure that you don't define a
682 * bigger init-ram area. Take a look at the lwmon5 440EPx
683 * implementation as a reference.
684 */
685 msync
686 isync
687 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
688 lis r1,0x0201
689 ori r1,r1,0xf808
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200690 mtspr SPRN_DVLIM,r1
Stefan Roesea86bde32008-01-09 10:23:16 +0100691 lis r1,0x0808
692 ori r1,r1,0x0808
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200693 mtspr SPRN_DNV0,r1
694 mtspr SPRN_DNV1,r1
695 mtspr SPRN_DNV2,r1
696 mtspr SPRN_DNV3,r1
697 mtspr SPRN_DTV0,r1
698 mtspr SPRN_DTV1,r1
699 mtspr SPRN_DTV2,r1
700 mtspr SPRN_DTV3,r1
Stefan Roesea86bde32008-01-09 10:23:16 +0100701 msync
702 isync
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200703#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200704
705 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
706#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
707 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roesecc019d12008-03-11 15:05:50 +0100708#if defined(CONFIG_440GX) || \
709 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan224bc962008-07-08 22:47:31 -0700710 defined(CONFIG_460SX)
Dave Mitchell3c3734172008-11-20 14:00:49 -0600711 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Dave Mitchell5c057592008-11-20 14:09:50 -0600712#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
713 lis r1, 0x0000
714 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
715 mtdcr L2_CACHE_CFG,r1
wdenk544e9732004-02-06 23:19:44 +0000716#endif
wdenk0442ed82002-11-03 10:24:00 +0000717
Stefan Roese42fbddd2006-09-07 11:51:23 +0200718 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000719 ori r2,r2,0xffff
Dave Mitchell3c3734172008-11-20 14:00:49 -0600720 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000721 and r1,r1,r2 /* Disable parity check */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600722 mtdcr ISRAM0_DPC,r1
723 mfdcr r1,ISRAM0_PMEG
Stefan Roese42fbddd2006-09-07 11:51:23 +0200724 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600725 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000726
727 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese99644742005-11-29 18:18:21 +0100728#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenk544e9732004-02-06 23:19:44 +0000729 ori r1,r1,0x0980 /* first 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600730 mtdcr ISRAM0_SB0CR,r1
wdenk544e9732004-02-06 23:19:44 +0000731 lis r1,0x8001
732 ori r1,r1,0x0980 /* second 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600733 mtdcr ISRAM0_SB1CR,r1
wdenk544e9732004-02-06 23:19:44 +0000734 lis r1, 0x8002
735 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600736 mtdcr ISRAM0_SB2CR,r1
wdenk544e9732004-02-06 23:19:44 +0000737 lis r1, 0x8003
738 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600739 mtdcr ISRAM0_SB3CR,r1
Dave Mitchell5c057592008-11-20 14:09:50 -0600740#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || defined(CONFIG_460GT)
741 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200742 ori r1,r1,0x0984 /* first 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600743 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200744 lis r1,0x0001
745 ori r1,r1,0x0984 /* second 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600746 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200747 lis r1, 0x0002
748 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600749 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200750 lis r1, 0x0003
751 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600752 mtdcr ISRAM0_SB3CR,r1
Dave Mitchell5c057592008-11-20 14:09:50 -0600753#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
754 lis r2,0x7fff
755 ori r2,r2,0xffff
756 mfdcr r1,ISRAM1_DPC
757 and r1,r1,r2 /* Disable parity check */
Wolfgang Denk55334c72008-12-16 01:02:17 +0100758 mtdcr ISRAM1_DPC,r1
Dave Mitchell5c057592008-11-20 14:09:50 -0600759 mfdcr r1,ISRAM1_PMEG
760 and r1,r1,r2 /* Disable pwr mgmt */
761 mtdcr ISRAM1_PMEG,r1
762
763 lis r1,0x0004 /* BAS = 4_0004_0000 */
764 ori r1,r1,0x0984 /* 64k */
765 mtdcr ISRAM1_SB0CR,r1
766#endif
Feng Kan224bc962008-07-08 22:47:31 -0700767#elif defined(CONFIG_460SX)
768 lis r1,0x0000 /* BAS = 0000_0000 */
769 ori r1,r1,0x0B84 /* first 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600770 mtdcr ISRAM0_SB0CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700771 lis r1,0x0001
772 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600773 mtdcr ISRAM0_SB1CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700774 lis r1, 0x0002
775 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600776 mtdcr ISRAM0_SB2CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700777 lis r1, 0x0003
778 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600779 mtdcr ISRAM0_SB3CR,r1
Stefan Roese42fbddd2006-09-07 11:51:23 +0200780#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000781 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600782 mtdcr ISRAM0_SB0CR,r1
783 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
Stefan Roese326c9712005-08-01 16:41:48 +0200784#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200785#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000786
787 /*----------------------------------------------------------------*/
788 /* Setup the stack in internal SRAM */
789 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200790 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
791 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000792 li r0,0
793 stwu r0,-4(r1)
794 stwu r0,-4(r1) /* Terminate call chain */
795
796 stwu r1,-8(r1) /* Save back chain and move SP */
797 lis r0,RESET_VECTOR@h /* Address of reset vector */
798 ori r0,r0, RESET_VECTOR@l
799 stwu r1,-8(r1) /* Save back chain and move SP */
800 stw r0,+12(r1) /* Save return addr (underflow vect) */
801
Stefan Roese42fbddd2006-09-07 11:51:23 +0200802#ifdef CONFIG_NAND_SPL
Stefan Roese7d72e022008-06-02 14:35:44 +0200803 bl nand_boot_common /* will not return */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200804#else
wdenk0442ed82002-11-03 10:24:00 +0000805 GET_GOT
Stefan Roesec443fe92005-11-22 13:20:42 +0100806
807 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000808 bl board_init_f
Stefan Roese42fbddd2006-09-07 11:51:23 +0200809#endif
wdenk0442ed82002-11-03 10:24:00 +0000810
811#endif /* CONFIG_440 */
812
813/*****************************************************************************/
814#ifdef CONFIG_IOP480
815 /*----------------------------------------------------------------------- */
816 /* Set up some machine state registers. */
817 /*----------------------------------------------------------------------- */
818 addi r0,r0,0x0000 /* initialize r0 to zero */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200819 mtspr SPRN_ESR,r0 /* clear Exception Syndrome Reg */
wdenk0442ed82002-11-03 10:24:00 +0000820 mttcr r0 /* timer control register */
821 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000822 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
823 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
824 mtdbsr r4 /* clear/reset the dbsr */
825 mtexisr r4 /* clear all pending interrupts */
826 addis r4,r0,0x8000
827 mtexier r4 /* enable critical exceptions */
828 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
829 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
830 mtiocr r4 /* since bit not used) & DRC to latch */
831 /* data bus on rising edge of CAS */
832 /*----------------------------------------------------------------------- */
833 /* Clear XER. */
834 /*----------------------------------------------------------------------- */
835 mtxer r0
836 /*----------------------------------------------------------------------- */
837 /* Invalidate i-cache and d-cache TAG arrays. */
838 /*----------------------------------------------------------------------- */
839 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
840 addi r4,0,1024 /* 1/4 of I-cache */
841..cloop:
842 iccci 0,r3
843 iccci r4,r3
844 dccci 0,r3
845 addic. r3,r3,-16 /* move back one cache line */
846 bne ..cloop /* loop back to do rest until r3 = 0 */
847
848 /* */
849 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
850 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
851 /* */
852
853 /* first copy IOP480 register base address into r3 */
854 addis r3,0,0x5000 /* IOP480 register base address hi */
855/* ori r3,r3,0x0000 / IOP480 register base address lo */
856
857#ifdef CONFIG_ADCIOP
858 /* use r4 as the working variable */
859 /* turn on CS3 (LOCCTL.7) */
860 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
861 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
862 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
863#endif
864
865#ifdef CONFIG_DASA_SIM
866 /* use r4 as the working variable */
867 /* turn on MA17 (LOCCTL.7) */
868 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
869 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
870 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
871#endif
872
873 /* turn on MA16..13 (LCS0BRD.12 = 0) */
874 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
875 andi. r4,r4,0xefff /* make bit 12 = 0 */
876 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
877
878 /* make sure above stores all comlete before going on */
879 sync
880
881 /* last thing, set local init status done bit (DEVINIT.31) */
882 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
883 oris r4,r4,0x8000 /* make bit 31 = 1 */
884 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
885
886 /* clear all pending interrupts and disable all interrupts */
887 li r4,-1 /* set p1 to 0xffffffff */
888 stw r4,0x1b0(r3) /* clear all pending interrupts */
889 stw r4,0x1b8(r3) /* clear all pending interrupts */
890 li r4,0 /* set r4 to 0 */
891 stw r4,0x1b4(r3) /* disable all interrupts */
892 stw r4,0x1bc(r3) /* disable all interrupts */
893
894 /* make sure above stores all comlete before going on */
895 sync
896
Grant Ericksonb6933412008-05-22 14:44:14 -0700897 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200898 lis r1, CONFIG_SYS_ICACHE_SACR_VALUE@h
899 ori r1, r1, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700900 mticcr r1
901 isync
wdenk0442ed82002-11-03 10:24:00 +0000902
Grant Ericksonb6933412008-05-22 14:44:14 -0700903 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200904 lis r1, CONFIG_SYS_DCACHE_SACR_VALUE@h
905 ori r1, r1, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700906 mtdccr r1
wdenk0442ed82002-11-03 10:24:00 +0000907
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200908 addis r1,r0,CONFIG_SYS_INIT_RAM_ADDR@h
909 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack to SDRAM */
wdenk0442ed82002-11-03 10:24:00 +0000910 li r0, 0 /* Make room for stack frame header and */
911 stwu r0, -4(r1) /* clear final stack frame so that */
912 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
913
914 GET_GOT /* initialize GOT access */
915
916 bl board_init_f /* run first part of init code (from Flash) */
917
918#endif /* CONFIG_IOP480 */
919
920/*****************************************************************************/
Stefan Roese17ffbc82007-03-21 13:38:59 +0100921#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
922 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roese153b3e22007-10-05 17:10:59 +0200923 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000924 /*----------------------------------------------------------------------- */
925 /* Clear and set up some registers. */
926 /*----------------------------------------------------------------------- */
927 addi r4,r0,0x0000
Stefan Roese153b3e22007-10-05 17:10:59 +0200928#if !defined(CONFIG_405EX)
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200929 mtspr SPRN_SGR,r4
Stefan Roese153b3e22007-10-05 17:10:59 +0200930#else
931 /*
932 * On 405EX, completely clearing the SGR leads to PPC hangup
933 * upon PCIe configuration access. The PCIe memory regions
934 * need to be guarded!
935 */
936 lis r3,0x0000
937 ori r3,r3,0x7FFC
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200938 mtspr SPRN_SGR,r3
Stefan Roese153b3e22007-10-05 17:10:59 +0200939#endif
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200940 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000941 mtesr r4 /* clear Exception Syndrome Reg */
942 mttcr r4 /* clear Timer Control Reg */
943 mtxer r4 /* clear Fixed-Point Exception Reg */
944 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000945 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
946 /* dbsr is cleared by setting bits to 1) */
947 mtdbsr r4 /* clear/reset the dbsr */
948
Grant Ericksonb6933412008-05-22 14:44:14 -0700949 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000950 bl invalidate_icache
951 bl invalidate_dcache
952
Grant Ericksonb6933412008-05-22 14:44:14 -0700953 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200954 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
955 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700956 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000957 isync
958
Grant Ericksonb6933412008-05-22 14:44:14 -0700959 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200960 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
961 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700962 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000963
Ricardo Ribalda Delgado78ea77e2008-10-21 18:29:46 +0200964#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
965 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000966 /*----------------------------------------------------------------------- */
967 /* Tune the speed and size for flash CS0 */
968 /*----------------------------------------------------------------------- */
969 bl ext_bus_cntlr_init
970#endif
Stefan Roese7d72e022008-06-02 14:35:44 +0200971
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200972#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roese153b3e22007-10-05 17:10:59 +0200973 /*
Grant Ericksonb6933412008-05-22 14:44:14 -0700974 * For boards that don't have OCM and can't use the data cache
975 * for their primordial stack, setup stack here directly after the
976 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roese153b3e22007-10-05 17:10:59 +0200977 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200978 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
979 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roese153b3e22007-10-05 17:10:59 +0200980
981 li r0, 0 /* Make room for stack frame header and */
982 stwu r0, -4(r1) /* clear final stack frame so that */
983 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
984 /*
985 * Set up a dummy frame to store reset vector as return address.
986 * this causes stack underflow to reset board.
987 */
988 stwu r1, -8(r1) /* Save back chain and move SP */
989 lis r0, RESET_VECTOR@h /* Address of reset vector */
990 ori r0, r0, RESET_VECTOR@l
991 stwu r1, -8(r1) /* Save back chain and move SP */
992 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200993#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000994
stroese434979e2003-05-23 11:18:02 +0000995#if defined(CONFIG_405EP)
996 /*----------------------------------------------------------------------- */
997 /* DMA Status, clear to come up clean */
998 /*----------------------------------------------------------------------- */
Wolfgang Denka1be4762008-05-20 16:00:29 +0200999 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001000 ori r3,r3, 0xFFFF
Stefan Roese918010a2009-09-09 16:25:29 +02001001 mtdcr DMASR, r3
stroese434979e2003-05-23 11:18:02 +00001002
Wolfgang Denka1be4762008-05-20 16:00:29 +02001003 bl ppc405ep_init /* do ppc405ep specific init */
stroese434979e2003-05-23 11:18:02 +00001004#endif /* CONFIG_405EP */
1005
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001006#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roese17ffbc82007-03-21 13:38:59 +01001007#if defined(CONFIG_405EZ)
1008 /********************************************************************
1009 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
1010 *******************************************************************/
1011 /*
1012 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001013 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roese17ffbc82007-03-21 13:38:59 +01001014 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001015 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1016 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roese80d99a42007-06-19 16:42:31 +02001017 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roese918010a2009-09-09 16:25:29 +02001018 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roese17ffbc82007-03-21 13:38:59 +01001019 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roese918010a2009-09-09 16:25:29 +02001020 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roese17ffbc82007-03-21 13:38:59 +01001021 isync
1022
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001023 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1024 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001025 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roese918010a2009-09-09 16:25:29 +02001026 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
1027 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roese17ffbc82007-03-21 13:38:59 +01001028 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roese918010a2009-09-09 16:25:29 +02001029 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
1030 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001031 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roese918010a2009-09-09 16:25:29 +02001032 mtdcr OCM0_DISDPC,r3
Stefan Roese17ffbc82007-03-21 13:38:59 +01001033
1034 isync
Stefan Roesef6c7b762007-03-24 15:45:34 +01001035#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001036 /********************************************************************
1037 * Setup OCM - On Chip Memory
1038 *******************************************************************/
1039 /* Setup OCM */
wdenk57b2d802003-06-27 21:31:46 +00001040 lis r0, 0x7FFF
1041 ori r0, r0, 0xFFFF
Stefan Roese918010a2009-09-09 16:25:29 +02001042 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
1043 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roesef6c7b762007-03-24 15:45:34 +01001044 and r3, r3, r0 /* disable data-side IRAM */
1045 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roese918010a2009-09-09 16:25:29 +02001046 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
1047 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk57b2d802003-06-27 21:31:46 +00001048 isync
wdenk0442ed82002-11-03 10:24:00 +00001049
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001050 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1051 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001052 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +00001053 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roese918010a2009-09-09 16:25:29 +02001054 mtdcr OCM0_DSCNTL, r4
wdenk57b2d802003-06-27 21:31:46 +00001055 isync
Stefan Roese17ffbc82007-03-21 13:38:59 +01001056#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001057#endif
1058
1059 /*----------------------------------------------------------------------- */
1060 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1061 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001062#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonb6933412008-05-22 14:44:14 -07001063 li r4, PBxAP
Stefan Roese918010a2009-09-09 16:25:29 +02001064 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001065 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
1066 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001067 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001068
Grant Ericksonb6933412008-05-22 14:44:14 -07001069 addi r4, 0, PBxCR
Stefan Roese918010a2009-09-09 16:25:29 +02001070 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001071 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
1072 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001073 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +00001074
Grant Ericksonb6933412008-05-22 14:44:14 -07001075 /*
1076 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001077 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonb6933412008-05-22 14:44:14 -07001078 */
1079 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001080 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1081 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +00001082 mtdccr r4
1083
Grant Ericksonb6933412008-05-22 14:44:14 -07001084 /*
1085 * Preallocate data cache lines to be used to avoid a subsequent
1086 * cache miss and an ensuing machine check exception when exceptions
1087 * are enabled.
1088 */
1089 li r0, 0
1090
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001091 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1092 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001093
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001094 lis r4, CONFIG_SYS_INIT_RAM_END@h
1095 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
wdenk0442ed82002-11-03 10:24:00 +00001096
Grant Ericksonb6933412008-05-22 14:44:14 -07001097 /*
1098 * Convert the size, in bytes, to the number of cache lines/blocks
1099 * to preallocate.
1100 */
1101 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1102 srwi r5, r4, L1_CACHE_SHIFT
1103 beq ..load_counter
1104 addi r5, r5, 0x0001
1105..load_counter:
1106 mtctr r5
1107
1108 /* Preallocate the computed number of cache blocks. */
1109..alloc_dcache_block:
1110 dcba r0, r3
1111 addi r3, r3, L1_CACHE_BYTES
1112 bdnz ..alloc_dcache_block
1113 sync
1114
1115 /*
1116 * Load the initial stack pointer and data area and convert the size,
1117 * in bytes, to the number of words to initialize to a known value.
1118 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001119 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1120 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001121
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001122 lis r4, (CONFIG_SYS_INIT_RAM_END >> 2)@h
1123 ori r4, r4, (CONFIG_SYS_INIT_RAM_END >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001124 mtctr r4
1125
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001126 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
1127 ori r2, r2, CONFIG_SYS_INIT_RAM_END@l
wdenk0442ed82002-11-03 10:24:00 +00001128
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001129 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1130 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001131
1132..stackloop:
Grant Ericksonb6933412008-05-22 14:44:14 -07001133 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001134 bdnz ..stackloop
1135
Grant Ericksonb6933412008-05-22 14:44:14 -07001136 /*
1137 * Make room for stack frame header and clear final stack frame so
1138 * that stack backtraces terminate cleanly.
1139 */
1140 stwu r0, -4(r1)
1141 stwu r0, -4(r1)
1142
wdenk0442ed82002-11-03 10:24:00 +00001143 /*
1144 * Set up a dummy frame to store reset vector as return address.
1145 * this causes stack underflow to reset board.
1146 */
1147 stwu r1, -8(r1) /* Save back chain and move SP */
1148 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1149 ori r0, r0, RESET_VECTOR@l
1150 stwu r1, -8(r1) /* Save back chain and move SP */
1151 stw r0, +12(r1) /* Save return addr (underflow vect) */
1152
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001153#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1154 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001155 /*
1156 * Stack in OCM.
1157 */
1158
1159 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001160 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1161 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001162
1163 /* Set up a zeroized stack frame so that backtrace works right */
1164 li r0, 0
1165 stwu r0, -4(r1)
1166 stwu r0, -4(r1)
1167
1168 /*
1169 * Set up a dummy frame to store reset vector as return address.
1170 * this causes stack underflow to reset board.
1171 */
1172 stwu r1, -8(r1) /* Save back chain and move SP */
1173 lis r0, RESET_VECTOR@h /* Address of reset vector */
1174 ori r0, r0, RESET_VECTOR@l
1175 stwu r1, -8(r1) /* Save back chain and move SP */
1176 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001177#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001178
Stefan Roese23d8d342007-06-06 11:42:13 +02001179#ifdef CONFIG_NAND_SPL
Stefan Roese7d72e022008-06-02 14:35:44 +02001180 bl nand_boot_common /* will not return */
Stefan Roese23d8d342007-06-06 11:42:13 +02001181#else
wdenk0442ed82002-11-03 10:24:00 +00001182 GET_GOT /* initialize GOT access */
1183
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001184 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001185
1186 /* NEVER RETURNS! */
1187 bl board_init_f /* run first part of init code (from Flash) */
Stefan Roese23d8d342007-06-06 11:42:13 +02001188#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001189
wdenk232fe0b2003-09-02 22:48:03 +00001190#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1191 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001192
1193
Stefan Roese42fbddd2006-09-07 11:51:23 +02001194#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001195/*
1196 * This code finishes saving the registers to the exception frame
1197 * and jumps to the appropriate handler for the exception.
1198 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1199 */
1200 .globl transfer_to_handler
1201transfer_to_handler:
1202 stw r22,_NIP(r21)
1203 lis r22,MSR_POW@h
1204 andc r23,r23,r22
1205 stw r23,_MSR(r21)
1206 SAVE_GPR(7, r21)
1207 SAVE_4GPRS(8, r21)
1208 SAVE_8GPRS(12, r21)
1209 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001210 mflr r23
1211 andi. r24,r23,0x3f00 /* get vector offset */
1212 stw r24,TRAP(r21)
1213 li r22,0
1214 stw r22,RESULT(r21)
1215 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001216 lwz r24,0(r23) /* virtual address of handler */
1217 lwz r23,4(r23) /* where to go when done */
1218 mtspr SRR0,r24
1219 mtspr SRR1,r20
1220 mtlr r23
1221 SYNC
1222 rfi /* jump to handler, enable MMU */
1223
1224int_return:
1225 mfmsr r28 /* Disable interrupts */
1226 li r4,0
1227 ori r4,r4,MSR_EE
1228 andc r28,r28,r4
1229 SYNC /* Some chip revs need this... */
1230 mtmsr r28
1231 SYNC
1232 lwz r2,_CTR(r1)
1233 lwz r0,_LINK(r1)
1234 mtctr r2
1235 mtlr r0
1236 lwz r2,_XER(r1)
1237 lwz r0,_CCR(r1)
1238 mtspr XER,r2
1239 mtcrf 0xFF,r0
1240 REST_10GPRS(3, r1)
1241 REST_10GPRS(13, r1)
1242 REST_8GPRS(23, r1)
1243 REST_GPR(31, r1)
1244 lwz r2,_NIP(r1) /* Restore environment */
1245 lwz r0,_MSR(r1)
1246 mtspr SRR0,r2
1247 mtspr SRR1,r0
1248 lwz r0,GPR0(r1)
1249 lwz r2,GPR2(r1)
1250 lwz r1,GPR1(r1)
1251 SYNC
1252 rfi
1253
1254crit_return:
1255 mfmsr r28 /* Disable interrupts */
1256 li r4,0
1257 ori r4,r4,MSR_EE
1258 andc r28,r28,r4
1259 SYNC /* Some chip revs need this... */
1260 mtmsr r28
1261 SYNC
1262 lwz r2,_CTR(r1)
1263 lwz r0,_LINK(r1)
1264 mtctr r2
1265 mtlr r0
1266 lwz r2,_XER(r1)
1267 lwz r0,_CCR(r1)
1268 mtspr XER,r2
1269 mtcrf 0xFF,r0
1270 REST_10GPRS(3, r1)
1271 REST_10GPRS(13, r1)
1272 REST_8GPRS(23, r1)
1273 REST_GPR(31, r1)
1274 lwz r2,_NIP(r1) /* Restore environment */
1275 lwz r0,_MSR(r1)
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001276 mtspr SPRN_CSRR0,r2
1277 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001278 lwz r0,GPR0(r1)
1279 lwz r2,GPR2(r1)
1280 lwz r1,GPR1(r1)
1281 SYNC
1282 rfci
1283
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001284#ifdef CONFIG_440
1285mck_return:
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001286 mfmsr r28 /* Disable interrupts */
1287 li r4,0
1288 ori r4,r4,MSR_EE
1289 andc r28,r28,r4
1290 SYNC /* Some chip revs need this... */
1291 mtmsr r28
1292 SYNC
1293 lwz r2,_CTR(r1)
1294 lwz r0,_LINK(r1)
1295 mtctr r2
1296 mtlr r0
1297 lwz r2,_XER(r1)
1298 lwz r0,_CCR(r1)
1299 mtspr XER,r2
1300 mtcrf 0xFF,r0
1301 REST_10GPRS(3, r1)
1302 REST_10GPRS(13, r1)
1303 REST_8GPRS(23, r1)
1304 REST_GPR(31, r1)
1305 lwz r2,_NIP(r1) /* Restore environment */
1306 lwz r0,_MSR(r1)
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001307 mtspr SPRN_MCSRR0,r2
1308 mtspr SPRN_MCSRR1,r0
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001309 lwz r0,GPR0(r1)
1310 lwz r2,GPR2(r1)
1311 lwz r1,GPR1(r1)
1312 SYNC
1313 rfmci
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001314#endif /* CONFIG_440 */
1315
1316
wdenk0442ed82002-11-03 10:24:00 +00001317 .globl get_pvr
1318get_pvr:
1319 mfspr r3, PVR
1320 blr
1321
wdenk0442ed82002-11-03 10:24:00 +00001322/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001323/* Function: out16 */
1324/* Description: Output 16 bits */
1325/*------------------------------------------------------------------------------- */
1326 .globl out16
1327out16:
1328 sth r4,0x0000(r3)
1329 blr
1330
1331/*------------------------------------------------------------------------------- */
1332/* Function: out16r */
1333/* Description: Byte reverse and output 16 bits */
1334/*------------------------------------------------------------------------------- */
1335 .globl out16r
1336out16r:
1337 sthbrx r4,r0,r3
1338 blr
1339
1340/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001341/* Function: out32r */
1342/* Description: Byte reverse and output 32 bits */
1343/*------------------------------------------------------------------------------- */
1344 .globl out32r
1345out32r:
1346 stwbrx r4,r0,r3
1347 blr
1348
1349/*------------------------------------------------------------------------------- */
1350/* Function: in16 */
1351/* Description: Input 16 bits */
1352/*------------------------------------------------------------------------------- */
1353 .globl in16
1354in16:
1355 lhz r3,0x0000(r3)
1356 blr
1357
1358/*------------------------------------------------------------------------------- */
1359/* Function: in16r */
1360/* Description: Input 16 bits and byte reverse */
1361/*------------------------------------------------------------------------------- */
1362 .globl in16r
1363in16r:
1364 lhbrx r3,r0,r3
1365 blr
1366
1367/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001368/* Function: in32r */
1369/* Description: Input 32 bits and byte reverse */
1370/*------------------------------------------------------------------------------- */
1371 .globl in32r
1372in32r:
1373 lwbrx r3,r0,r3
1374 blr
1375
wdenk0442ed82002-11-03 10:24:00 +00001376/*
1377 * void relocate_code (addr_sp, gd, addr_moni)
1378 *
1379 * This "function" does not return, instead it continues in RAM
1380 * after relocating the monitor code.
1381 *
Grant Ericksonb6933412008-05-22 14:44:14 -07001382 * r3 = Relocated stack pointer
1383 * r4 = Relocated global data pointer
1384 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001385 */
1386 .globl relocate_code
1387relocate_code:
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001388#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001389 /*
Grant Ericksonb6933412008-05-22 14:44:14 -07001390 * We need to flush the initial global data (gd_t) before the dcache
1391 * will be invalidated.
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001392 */
1393
Grant Ericksonb6933412008-05-22 14:44:14 -07001394 /* Save registers */
1395 mr r9, r3
1396 mr r10, r4
1397 mr r11, r5
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001398
Grant Ericksonb6933412008-05-22 14:44:14 -07001399 /* Flush initial global data range */
1400 mr r3, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001401 addi r4, r4, CONFIG_SYS_GBL_DATA_SIZE@l
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001402 bl flush_dcache_range
1403
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001404#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonb6933412008-05-22 14:44:14 -07001405 /*
1406 * Undo the earlier data cache set-up for the primordial stack and
1407 * data area. First, invalidate the data cache and then disable data
1408 * cacheability for that area. Finally, restore the EBC values, if
1409 * any.
1410 */
1411
1412 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001413 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1414 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001415
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001416 lis r4, CONFIG_SYS_INIT_RAM_END@h
1417 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001418 add r4, r4, r3
1419
1420 bl invalidate_dcache_range
1421
1422 /* Disable cacheability for the region */
1423 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001424 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1425 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001426 and r3, r3, r4
1427 mtdccr r3
1428
1429 /* Restore the EBC parameters */
1430 li r3, PBxAP
Stefan Roese918010a2009-09-09 16:25:29 +02001431 mtdcr EBC0_CFGADDR, r3
Grant Ericksonb6933412008-05-22 14:44:14 -07001432 lis r3, PBxAP_VAL@h
1433 ori r3, r3, PBxAP_VAL@l
Stefan Roese918010a2009-09-09 16:25:29 +02001434 mtdcr EBC0_CFGDATA, r3
Grant Ericksonb6933412008-05-22 14:44:14 -07001435
1436 li r3, PBxCR
Stefan Roese918010a2009-09-09 16:25:29 +02001437 mtdcr EBC0_CFGADDR, r3
Grant Ericksonb6933412008-05-22 14:44:14 -07001438 lis r3, PBxCR_VAL@h
1439 ori r3, r3, PBxCR_VAL@l
Stefan Roese918010a2009-09-09 16:25:29 +02001440 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001441#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonb6933412008-05-22 14:44:14 -07001442
1443 /* Restore registers */
1444 mr r3, r9
1445 mr r4, r10
1446 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001447#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesea86bde32008-01-09 10:23:16 +01001448
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001449#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesea86bde32008-01-09 10:23:16 +01001450 /*
1451 * Unlock the previously locked d-cache
1452 */
1453 msync
1454 isync
1455 /* set TFLOOR/NFLOOR to 0 again */
1456 lis r6,0x0001
1457 ori r6,r6,0xf800
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001458 mtspr SPRN_DVLIM,r6
Stefan Roesea86bde32008-01-09 10:23:16 +01001459 lis r6,0x0000
1460 ori r6,r6,0x0000
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001461 mtspr SPRN_DNV0,r6
1462 mtspr SPRN_DNV1,r6
1463 mtspr SPRN_DNV2,r6
1464 mtspr SPRN_DNV3,r6
1465 mtspr SPRN_DTV0,r6
1466 mtspr SPRN_DTV1,r6
1467 mtspr SPRN_DTV2,r6
1468 mtspr SPRN_DTV3,r6
Stefan Roesea86bde32008-01-09 10:23:16 +01001469 msync
1470 isync
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001471#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesea86bde32008-01-09 10:23:16 +01001472
Stefan Roese42fbddd2006-09-07 11:51:23 +02001473#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1474 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
Stefan Roesecc019d12008-03-11 15:05:50 +01001475 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan224bc962008-07-08 22:47:31 -07001476 defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
1477 defined(CONFIG_460SX)
Stefan Roese9eba0c82006-06-02 16:18:04 +02001478 /*
1479 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1480 * to speed up the boot process. Now this cache needs to be disabled.
1481 */
1482 iccci 0,0 /* Invalidate inst cache */
1483 dccci 0,0 /* Invalidate data cache, now no longer our stack */
Stefan Roese326c9712005-08-01 16:41:48 +02001484 sync
Stefan Roese9eba0c82006-06-02 16:18:04 +02001485 isync
Stefan Roesefe05a022008-11-20 11:46:20 +01001486
1487 /* Clear all potential pending exceptions */
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001488 mfspr r1,SPRN_MCSR
1489 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001490#ifdef CONFIG_SYS_TLB_FOR_BOOT_FLASH
1491 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Niklaus Giger86cb27b2007-11-30 18:35:11 +01001492#else
1493 addi r1,r0,0x0000 /* Default TLB entry is #0 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001494#endif /* CONFIG_SYS_TLB_FOR_BOOT_FLASH */
Stefan Roese326c9712005-08-01 16:41:48 +02001495 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese99644742005-11-29 18:18:21 +01001496 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001497 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roese9eba0c82006-06-02 16:18:04 +02001498 sync
Stefan Roese326c9712005-08-01 16:41:48 +02001499 isync
Grant Ericksonb6933412008-05-22 14:44:14 -07001500#endif /* defined(CONFIG_440EP) || ... || defined(CONFIG_460GT) */
wdenk0442ed82002-11-03 10:24:00 +00001501 mr r1, r3 /* Set new stack pointer */
1502 mr r9, r4 /* Save copy of Init Data pointer */
1503 mr r10, r5 /* Save copy of Destination Address */
1504
1505 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001506 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1507 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenkb9a83a92003-05-30 12:48:29 +00001508 lwz r5, GOT(__init_end)
1509 sub r5, r5, r4
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001510 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001511
1512 /*
1513 * Fix GOT pointer:
1514 *
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001515 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001516 *
1517 * Offset:
1518 */
1519 sub r15, r10, r4
1520
1521 /* First our own GOT */
1522 add r14, r14, r15
Grant Ericksonb6933412008-05-22 14:44:14 -07001523 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001524 add r30, r30, r15
1525
1526 /*
1527 * Now relocate code
1528 */
1529
1530 cmplw cr1,r3,r4
1531 addi r0,r5,3
1532 srwi. r0,r0,2
1533 beq cr1,4f /* In place copy is not necessary */
1534 beq 7f /* Protect against 0 count */
1535 mtctr r0
1536 bge cr1,2f
1537
1538 la r8,-4(r4)
1539 la r7,-4(r3)
15401: lwzu r0,4(r8)
1541 stwu r0,4(r7)
1542 bdnz 1b
1543 b 4f
1544
15452: slwi r0,r0,2
1546 add r8,r4,r0
1547 add r7,r3,r0
15483: lwzu r0,-4(r8)
1549 stwu r0,-4(r7)
1550 bdnz 3b
1551
1552/*
1553 * Now flush the cache: note that we must start from a cache aligned
1554 * address. Otherwise we might miss one cache line.
1555 */
15564: cmpwi r6,0
1557 add r5,r3,r5
1558 beq 7f /* Always flush prefetch queue in any case */
1559 subi r0,r6,1
1560 andc r3,r3,r0
1561 mr r4,r3
15625: dcbst 0,r4
1563 add r4,r4,r6
1564 cmplw r4,r5
1565 blt 5b
1566 sync /* Wait for all dcbst to complete on bus */
1567 mr r4,r3
15686: icbi 0,r4
1569 add r4,r4,r6
1570 cmplw r4,r5
1571 blt 6b
15727: sync /* Wait for all icbi to complete on bus */
1573 isync
1574
1575/*
1576 * We are done. Do not return, instead branch to second part of board
1577 * initialization, now running from RAM.
1578 */
1579
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001580 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001581 mtlr r0
1582 blr /* NEVER RETURNS! */
1583
1584in_ram:
1585
1586 /*
1587 * Relocation Function, r14 point to got2+0x8000
1588 *
1589 * Adjust got2 pointers, no need to check for 0, this code
1590 * already puts a few entries in the table.
1591 */
1592 li r0,__got2_entries@sectoff@l
1593 la r3,GOT(_GOT2_TABLE_)
1594 lwz r11,GOT(_GOT2_TABLE_)
1595 mtctr r0
1596 sub r11,r3,r11
1597 addi r3,r3,-4
15981: lwzu r0,4(r3)
Joakim Tjernlund4f2fdac2009-10-08 02:03:51 +02001599 cmpwi r0,0
1600 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001601 add r0,r0,r11
1602 stw r0,0(r3)
Joakim Tjernlund4f2fdac2009-10-08 02:03:51 +020016032: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001604
1605 /*
1606 * Now adjust the fixups and the pointers to the fixups
1607 * in case we need to move ourselves again.
1608 */
Joakim Tjernlund4f2fdac2009-10-08 02:03:51 +02001609 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001610 lwz r3,GOT(_FIXUP_TABLE_)
1611 cmpwi r0,0
1612 mtctr r0
1613 addi r3,r3,-4
1614 beq 4f
16153: lwzu r4,4(r3)
1616 lwzux r0,r4,r11
1617 add r0,r0,r11
1618 stw r10,0(r3)
1619 stw r0,0(r4)
1620 bdnz 3b
16214:
1622clear_bss:
1623 /*
1624 * Now clear BSS segment
1625 */
wdenkbf2f8c92003-05-22 22:52:13 +00001626 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001627 lwz r4,GOT(_end)
1628
1629 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001630 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001631
1632 li r0, 0
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001633
1634 andi. r5, r4, 3
1635 beq 6f
1636 sub r4, r4, r5
1637 mtctr r5
1638 mr r5, r4
16395: stb r0, 0(r5)
1640 addi r5, r5, 1
1641 bdnz 5b
16426:
wdenk0442ed82002-11-03 10:24:00 +00001643 stw r0, 0(r3)
1644 addi r3, r3, 4
1645 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001646 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001647
Anatolij Gustschin720025b2007-12-05 17:43:20 +010016487:
wdenk0442ed82002-11-03 10:24:00 +00001649 mr r3, r9 /* Init Data pointer */
1650 mr r4, r10 /* Destination Address */
1651 bl board_init_r
1652
wdenk0442ed82002-11-03 10:24:00 +00001653 /*
1654 * Copy exception vector code to low memory
1655 *
1656 * r3: dest_addr
1657 * r7: source address, r8: end address, r9: target address
1658 */
1659 .globl trap_init
1660trap_init:
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001661 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001662 lwz r8, GOT(_end_of_vectors)
1663
wdenk4e112c12003-06-03 23:54:09 +00001664 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001665
1666 cmplw 0, r7, r8
1667 bgelr /* return if r7>=r8 - just in case */
1668
1669 mflr r4 /* save link register */
16701:
1671 lwz r0, 0(r7)
1672 stw r0, 0(r9)
1673 addi r7, r7, 4
1674 addi r9, r9, 4
1675 cmplw 0, r7, r8
1676 bne 1b
1677
1678 /*
1679 * relocate `hdlr' and `int_return' entries
1680 */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001681 li r7, .L_MachineCheck - _start + _START_OFFSET
1682 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000016832:
1684 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001685 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001686 cmplw 0, r7, r8
1687 blt 2b
1688
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001689 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001690 bl trap_reloc
1691
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001692 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001693 bl trap_reloc
1694
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001695#ifdef CONFIG_440
1696 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001697 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001698
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001699 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001700 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001701
1702 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001703 bl trap_reloc
Stefan Roese80d99a42007-06-19 16:42:31 +02001704
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001705 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1706 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001707
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001708 li r7, .L_DataTLBError - _start + _START_OFFSET
1709 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001710#else /* CONFIG_440 */
1711 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001712 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001713
1714 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001715 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001716
1717 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001718 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001719#endif /* CONFIG_440 */
1720
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001721 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1722 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001723
Stefan Roese42fbddd2006-09-07 11:51:23 +02001724#if !defined(CONFIG_440)
Stefan Roese7b12aa82006-03-13 09:42:28 +01001725 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1726 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1727 mtmsr r7 /* change MSR */
1728#else
Stefan Roese42fbddd2006-09-07 11:51:23 +02001729 bl __440_msr_set
1730 b __440_msr_continue
Stefan Roese7b12aa82006-03-13 09:42:28 +01001731
Stefan Roese42fbddd2006-09-07 11:51:23 +02001732__440_msr_set:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001733 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1734 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001735 mtspr SPRN_SRR1,r7
Stefan Roese7b12aa82006-03-13 09:42:28 +01001736 mflr r7
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001737 mtspr SPRN_SRR0,r7
Stefan Roese7b12aa82006-03-13 09:42:28 +01001738 rfi
Stefan Roese42fbddd2006-09-07 11:51:23 +02001739__440_msr_continue:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001740#endif
1741
wdenk0442ed82002-11-03 10:24:00 +00001742 mtlr r4 /* restore link register */
1743 blr
1744
1745 /*
1746 * Function: relocate entries for one exception vector
1747 */
1748trap_reloc:
1749 lwz r0, 0(r7) /* hdlr ... */
1750 add r0, r0, r3 /* ... += dest_addr */
1751 stw r0, 0(r7)
1752
1753 lwz r0, 4(r7) /* int_return ... */
1754 add r0, r0, r3 /* ... += dest_addr */
1755 stw r0, 4(r7)
1756
1757 blr
Stefan Roese42743512007-06-01 15:27:11 +02001758
1759#if defined(CONFIG_440)
1760/*----------------------------------------------------------------------------+
1761| dcbz_area.
1762+----------------------------------------------------------------------------*/
1763 function_prolog(dcbz_area)
1764 rlwinm. r5,r4,0,27,31
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001765 rlwinm r5,r4,27,5,31
1766 beq ..d_ra2
1767 addi r5,r5,0x0001
1768..d_ra2:mtctr r5
1769..d_ag2:dcbz r0,r3
1770 addi r3,r3,32
1771 bdnz ..d_ag2
Stefan Roese42743512007-06-01 15:27:11 +02001772 sync
1773 blr
1774 function_epilog(dcbz_area)
Stefan Roese42743512007-06-01 15:27:11 +02001775#endif /* CONFIG_440 */
Stefan Roese42fbddd2006-09-07 11:51:23 +02001776#endif /* CONFIG_NAND_SPL */
stroese434979e2003-05-23 11:18:02 +00001777
Stefan Roese42743512007-06-01 15:27:11 +02001778/*------------------------------------------------------------------------------- */
1779/* Function: in8 */
1780/* Description: Input 8 bits */
1781/*------------------------------------------------------------------------------- */
1782 .globl in8
1783in8:
1784 lbz r3,0x0000(r3)
1785 blr
1786
1787/*------------------------------------------------------------------------------- */
1788/* Function: out8 */
1789/* Description: Output 8 bits */
1790/*------------------------------------------------------------------------------- */
1791 .globl out8
1792out8:
1793 stb r4,0x0000(r3)
1794 blr
1795
1796/*------------------------------------------------------------------------------- */
1797/* Function: out32 */
1798/* Description: Output 32 bits */
1799/*------------------------------------------------------------------------------- */
1800 .globl out32
1801out32:
1802 stw r4,0x0000(r3)
1803 blr
1804
1805/*------------------------------------------------------------------------------- */
1806/* Function: in32 */
1807/* Description: Input 32 bits */
1808/*------------------------------------------------------------------------------- */
1809 .globl in32
1810in32:
1811 lwz 3,0x0000(3)
1812 blr
stroese434979e2003-05-23 11:18:02 +00001813
1814/**************************************************************************/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001815/* PPC405EP specific stuff */
stroese434979e2003-05-23 11:18:02 +00001816/**************************************************************************/
1817#ifdef CONFIG_405EP
1818ppc405ep_init:
stroese5ad6d4d2003-12-09 14:54:43 +00001819
Stefan Roese326c9712005-08-01 16:41:48 +02001820#ifdef CONFIG_BUBINGA
stroese5ad6d4d2003-12-09 14:54:43 +00001821 /*
1822 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1823 * function) to support FPGA and NVRAM accesses below.
1824 */
1825
1826 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1827 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001828 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1829 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroese5ad6d4d2003-12-09 14:54:43 +00001830 stw r4,0(r3)
1831 lis r3,GPIO0_OSRL@h
1832 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001833 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1834 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroese5ad6d4d2003-12-09 14:54:43 +00001835 stw r4,0(r3)
1836
1837 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1838 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001839 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1840 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroese5ad6d4d2003-12-09 14:54:43 +00001841 stw r4,0(r3)
1842 lis r3,GPIO0_ISR1L@h
1843 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001844 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1845 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroese5ad6d4d2003-12-09 14:54:43 +00001846 stw r4,0(r3)
1847
1848 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1849 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001850 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1851 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroese5ad6d4d2003-12-09 14:54:43 +00001852 stw r4,0(r3)
1853 lis r3,GPIO0_TSRL@h
1854 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001855 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1856 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroese5ad6d4d2003-12-09 14:54:43 +00001857 stw r4,0(r3)
1858
1859 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1860 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001861 lis r4,CONFIG_SYS_GPIO0_TCR@h
1862 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroese5ad6d4d2003-12-09 14:54:43 +00001863 stw r4,0(r3)
1864
Stefan Roese918010a2009-09-09 16:25:29 +02001865 li r3,PB1AP /* program EBC bank 1 for RTC access */
1866 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001867 lis r3,CONFIG_SYS_EBC_PB1AP@h
1868 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roese918010a2009-09-09 16:25:29 +02001869 mtdcr EBC0_CFGDATA,r3
1870 li r3,PB1CR
1871 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001872 lis r3,CONFIG_SYS_EBC_PB1CR@h
1873 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001874 mtdcr EBC0_CFGDATA,r3
stroese5ad6d4d2003-12-09 14:54:43 +00001875
Stefan Roese918010a2009-09-09 16:25:29 +02001876 li r3,PB1AP /* program EBC bank 1 for RTC access */
1877 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001878 lis r3,CONFIG_SYS_EBC_PB1AP@h
1879 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roese918010a2009-09-09 16:25:29 +02001880 mtdcr EBC0_CFGDATA,r3
1881 li r3,PB1CR
1882 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001883 lis r3,CONFIG_SYS_EBC_PB1CR@h
1884 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001885 mtdcr EBC0_CFGDATA,r3
stroese5ad6d4d2003-12-09 14:54:43 +00001886
Stefan Roese918010a2009-09-09 16:25:29 +02001887 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1888 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001889 lis r3,CONFIG_SYS_EBC_PB4AP@h
1890 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roese918010a2009-09-09 16:25:29 +02001891 mtdcr EBC0_CFGDATA,r3
1892 li r3,PB4CR
1893 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001894 lis r3,CONFIG_SYS_EBC_PB4CR@h
1895 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001896 mtdcr EBC0_CFGDATA,r3
stroese5ad6d4d2003-12-09 14:54:43 +00001897#endif
stroese434979e2003-05-23 11:18:02 +00001898
wdenk57b2d802003-06-27 21:31:46 +00001899 /*
1900 !-----------------------------------------------------------------------
1901 ! Check to see if chip is in bypass mode.
1902 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1903 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001904 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1905 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk57b2d802003-06-27 21:31:46 +00001906 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001907 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001908 mfdcr r5, CPC0_PLLMR1
Wolfgang Denka1be4762008-05-20 16:00:29 +02001909 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001910 cmpi cr0,0,r4,0x1
stroese434979e2003-05-23 11:18:02 +00001911
Wolfgang Denka1be4762008-05-20 16:00:29 +02001912 beq pll_done /* if SSCS =b'1' then PLL has */
1913 /* already been set */
1914 /* and CPU has been reset */
1915 /* so skip to next section */
stroese434979e2003-05-23 11:18:02 +00001916
Stefan Roese326c9712005-08-01 16:41:48 +02001917#ifdef CONFIG_BUBINGA
stroese434979e2003-05-23 11:18:02 +00001918 /*
wdenk57b2d802003-06-27 21:31:46 +00001919 !-----------------------------------------------------------------------
1920 ! Read NVRAM to get value to write in PLLMR.
1921 ! If value has not been correctly saved, write default value
1922 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1923 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1924 !
1925 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001926 ! structure in openbios.h. Changing the beginning of
1927 ! the structure will break this code.
wdenk57b2d802003-06-27 21:31:46 +00001928 !
1929 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001930 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001931 addis r3,0,NVRAM_BASE@h
1932 addi r3,r3,NVRAM_BASE@l
stroese434979e2003-05-23 11:18:02 +00001933
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001934 lwz r4, 0(r3)
1935 addis r5,0,NVRVFY1@h
1936 addi r5,r5,NVRVFY1@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001937 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001938 bne ..no_pllset
1939 addi r3,r3,4
1940 lwz r4, 0(r3)
1941 addis r5,0,NVRVFY2@h
1942 addi r5,r5,NVRVFY2@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001943 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001944 bne ..no_pllset
1945 addi r3,r3,8 /* Skip over conf_size */
1946 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1947 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1948 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1949 cmpi cr0,0,r5,1 /* See if PLL is locked */
1950 beq pll_write
stroese434979e2003-05-23 11:18:02 +00001951..no_pllset:
Stefan Roese326c9712005-08-01 16:41:48 +02001952#endif /* CONFIG_BUBINGA */
stroese434979e2003-05-23 11:18:02 +00001953
John Otken9aa36772007-07-26 17:49:11 +02001954#ifdef CONFIG_TAIHU
1955 mfdcr r4, CPC0_BOOT
1956 andi. r5, r4, CPC0_BOOT_SEP@l
1957 bne strap_1 /* serial eeprom present */
1958 addis r5,0,CPLD_REG0_ADDR@h
1959 ori r5,r5,CPLD_REG0_ADDR@l
1960 andi. r5, r5, 0x10
1961 bne _pci_66mhz
1962#endif /* CONFIG_TAIHU */
1963
Stefan Roesea5d182e2007-08-14 14:44:41 +02001964#if defined(CONFIG_ZEUS)
1965 mfdcr r4, CPC0_BOOT
1966 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001967 bne strap_1 /* serial eeprom present */
Stefan Roesea5d182e2007-08-14 14:44:41 +02001968 lis r3,0x0000
1969 addi r3,r3,0x3030
1970 lis r4,0x8042
1971 addi r4,r4,0x223e
1972 b 1f
1973strap_1:
1974 mfdcr r3, CPC0_PLLMR0
1975 mfdcr r4, CPC0_PLLMR1
1976 b 1f
1977#endif
1978
Wolfgang Denka1be4762008-05-20 16:00:29 +02001979 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1980 ori r3,r3,PLLMR0_DEFAULT@l /* */
1981 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1982 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroese434979e2003-05-23 11:18:02 +00001983
John Otken9aa36772007-07-26 17:49:11 +02001984#ifdef CONFIG_TAIHU
1985 b 1f
1986_pci_66mhz:
1987 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1988 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1989 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1990 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1991 b 1f
1992strap_1:
1993 mfdcr r3, CPC0_PLLMR0
1994 mfdcr r4, CPC0_PLLMR1
John Otken9aa36772007-07-26 17:49:11 +02001995#endif /* CONFIG_TAIHU */
1996
Stefan Roesea5d182e2007-08-14 14:44:41 +020019971:
Wolfgang Denka1be4762008-05-20 16:00:29 +02001998 b pll_write /* Write the CPC0_PLLMR with new value */
stroese434979e2003-05-23 11:18:02 +00001999
2000pll_done:
wdenk57b2d802003-06-27 21:31:46 +00002001 /*
2002 !-----------------------------------------------------------------------
2003 ! Clear Soft Reset Register
2004 ! This is needed to enable PCI if not booting from serial EPROM
2005 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00002006 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002007 addi r3, 0, 0x0
2008 mtdcr CPC0_SRR, r3
stroese434979e2003-05-23 11:18:02 +00002009
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002010 addis r3,0,0x0010
2011 mtctr r3
stroese434979e2003-05-23 11:18:02 +00002012pci_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002013 bdnz pci_wait
stroese434979e2003-05-23 11:18:02 +00002014
Wolfgang Denka1be4762008-05-20 16:00:29 +02002015 blr /* return to main code */
stroese434979e2003-05-23 11:18:02 +00002016
2017/*
2018!-----------------------------------------------------------------------------
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002019! Function: pll_write
2020! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
2021! That is:
2022! 1. Pll is first disabled (de-activated by putting in bypass mode)
2023! 2. PLL is reset
2024! 3. Clock dividers are set while PLL is held in reset and bypassed
2025! 4. PLL Reset is cleared
2026! 5. Wait 100us for PLL to lock
2027! 6. A core reset is performed
stroese434979e2003-05-23 11:18:02 +00002028! Input: r3 = Value to write to CPC0_PLLMR0
2029! Input: r4 = Value to write to CPC0_PLLMR1
2030! Output r3 = none
2031!-----------------------------------------------------------------------------
2032*/
Matthias Fuchsd8079162009-07-06 16:27:33 +02002033 .globl pll_write
stroese434979e2003-05-23 11:18:02 +00002034pll_write:
wdenk57b2d802003-06-27 21:31:46 +00002035 mfdcr r5, CPC0_UCR
2036 andis. r5,r5,0xFFFF
Wolfgang Denka1be4762008-05-20 16:00:29 +02002037 ori r5,r5,0x0101 /* Stop the UART clocks */
2038 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroese434979e2003-05-23 11:18:02 +00002039
wdenk57b2d802003-06-27 21:31:46 +00002040 mfdcr r5, CPC0_PLLMR1
Wolfgang Denka1be4762008-05-20 16:00:29 +02002041 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002042 mtdcr CPC0_PLLMR1,r5
Wolfgang Denka1be4762008-05-20 16:00:29 +02002043 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002044 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00002045
Wolfgang Denka1be4762008-05-20 16:00:29 +02002046 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
2047 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
2048 oris r5,r5,0x4000 /* Set PLL Reset */
2049 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
2050 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002051 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00002052
2053 /*
wdenk57b2d802003-06-27 21:31:46 +00002054 ! Wait min of 100us for PLL to lock.
2055 ! See CMOS 27E databook for more info.
2056 ! At 200MHz, that means waiting 20,000 instructions
stroese434979e2003-05-23 11:18:02 +00002057 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002058 addi r3,0,20000 /* 2000 = 0x4e20 */
2059 mtctr r3
stroese434979e2003-05-23 11:18:02 +00002060pll_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002061 bdnz pll_wait
stroese434979e2003-05-23 11:18:02 +00002062
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002063 oris r5,r5,0x8000 /* Enable PLL */
2064 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroese434979e2003-05-23 11:18:02 +00002065
wdenk57b2d802003-06-27 21:31:46 +00002066 /*
2067 * Reset CPU to guarantee timings are OK
2068 * Not sure if this is needed...
2069 */
2070 addis r3,0,0x1000
Matthias Fuchs730b2d22009-07-22 17:27:56 +02002071 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denka1be4762008-05-20 16:00:29 +02002072 /* execution will continue from the poweron */
2073 /* vector of 0xfffffffc */
stroese434979e2003-05-23 11:18:02 +00002074#endif /* CONFIG_405EP */
Stefan Roesea8856e32007-02-20 10:57:08 +01002075
2076#if defined(CONFIG_440)
Stefan Roesea8856e32007-02-20 10:57:08 +01002077/*----------------------------------------------------------------------------+
2078| mttlb3.
2079+----------------------------------------------------------------------------*/
2080 function_prolog(mttlb3)
2081 TLBWE(4,3,2)
2082 blr
2083 function_epilog(mttlb3)
2084
2085/*----------------------------------------------------------------------------+
2086| mftlb3.
2087+----------------------------------------------------------------------------*/
2088 function_prolog(mftlb3)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002089 TLBRE(3,3,2)
Stefan Roesea8856e32007-02-20 10:57:08 +01002090 blr
2091 function_epilog(mftlb3)
2092
2093/*----------------------------------------------------------------------------+
2094| mttlb2.
2095+----------------------------------------------------------------------------*/
2096 function_prolog(mttlb2)
2097 TLBWE(4,3,1)
2098 blr
2099 function_epilog(mttlb2)
2100
2101/*----------------------------------------------------------------------------+
2102| mftlb2.
2103+----------------------------------------------------------------------------*/
2104 function_prolog(mftlb2)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002105 TLBRE(3,3,1)
Stefan Roesea8856e32007-02-20 10:57:08 +01002106 blr
2107 function_epilog(mftlb2)
2108
2109/*----------------------------------------------------------------------------+
2110| mttlb1.
2111+----------------------------------------------------------------------------*/
2112 function_prolog(mttlb1)
2113 TLBWE(4,3,0)
2114 blr
2115 function_epilog(mttlb1)
2116
2117/*----------------------------------------------------------------------------+
2118| mftlb1.
2119+----------------------------------------------------------------------------*/
2120 function_prolog(mftlb1)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002121 TLBRE(3,3,0)
Stefan Roesea8856e32007-02-20 10:57:08 +01002122 blr
2123 function_epilog(mftlb1)
2124#endif /* CONFIG_440 */
Stefan Roese7d72e022008-06-02 14:35:44 +02002125
2126#if defined(CONFIG_NAND_SPL)
2127/*
2128 * void nand_boot_relocate(dst, src, bytes)
2129 *
2130 * r3 = Destination address to copy code to (in SDRAM)
2131 * r4 = Source address to copy code from
2132 * r5 = size to copy in bytes
2133 */
2134nand_boot_relocate:
2135 mr r6,r3
2136 mr r7,r4
2137 mflr r8
2138
2139 /*
2140 * Copy SPL from icache into SDRAM
2141 */
2142 subi r3,r3,4
2143 subi r4,r4,4
2144 srwi r5,r5,2
2145 mtctr r5
2146..spl_loop:
2147 lwzu r0,4(r4)
2148 stwu r0,4(r3)
2149 bdnz ..spl_loop
2150
2151 /*
2152 * Calculate "corrected" link register, so that we "continue"
2153 * in execution in destination range
2154 */
2155 sub r3,r7,r6 /* r3 = src - dst */
2156 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2157 mtlr r8
2158 blr
2159
2160nand_boot_common:
2161 /*
2162 * First initialize SDRAM. It has to be available *before* calling
2163 * nand_boot().
2164 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02002165 lis r3,CONFIG_SYS_SDRAM_BASE@h
2166 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
Stefan Roese7d72e022008-06-02 14:35:44 +02002167 bl initdram
2168
2169 /*
2170 * Now copy the 4k SPL code into SDRAM and continue execution
2171 * from there.
2172 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02002173 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2174 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2175 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2176 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2177 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2178 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
Stefan Roese7d72e022008-06-02 14:35:44 +02002179 bl nand_boot_relocate
2180
2181 /*
2182 * We're running from SDRAM now!!!
2183 *
2184 * It is necessary for 4xx systems to relocate from running at
2185 * the original location (0xfffffxxx) to somewhere else (SDRAM
2186 * preferably). This is because CS0 needs to be reconfigured for
2187 * NAND access. And we can't reconfigure this CS when currently
2188 * "running" from it.
2189 */
2190
2191 /*
2192 * Finally call nand_boot() to load main NAND U-Boot image from
2193 * NAND and jump to it.
2194 */
2195 bl nand_boot /* will not return */
2196#endif /* CONFIG_NAND_SPL */