blob: db34e84d3efffa471503747e047f6b3cb2ebee80 [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/*------------------------------------------------------------------------------+
28 *
29 * This source code has been made available to you by IBM on an AS-IS
30 * basis. Anyone receiving this source is licensed under IBM
31 * copyrights to use it in any way he or she deems fit, including
32 * copying it, modifying it, compiling it, and redistributing it either
33 * with or without modifications. No license under IBM patents or
34 * patent applications is to be implied by the copyright license.
35 *
36 * Any user of this software should understand that IBM cannot provide
37 * technical support for this software and will not be responsible for
38 * any consequences resulting from the use of this software.
39 *
40 * Any person who transfers this source code or any derivative work
41 * must include the IBM copyright notice, this paragraph, and the
42 * preceding two paragraphs in the transferred software.
43 *
44 * COPYRIGHT I B M CORPORATION 1995
45 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
46 *-------------------------------------------------------------------------------
47 */
wdenk0442ed82002-11-03 10:24:00 +000048
Wolfgang Denk0ee70772005-09-23 11:05:55 +020049/* U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
wdenk0442ed82002-11-03 10:24:00 +000050 *
51 *
52 * The processor starts at 0xfffffffc and the code is executed
53 * from flash/rom.
54 * in memory, but as long we don't jump around before relocating.
55 * board_init lies at a quite high address and when the cpu has
56 * jumped there, everything is ok.
57 * This works because the cpu gives the FLASH (CS0) the whole
58 * address space at startup, and board_init lies as a echo of
59 * the flash somewhere up there in the memorymap.
60 *
61 * board_init will change CS0 to be positioned at the correct
62 * address and (s)dram will be positioned at address 0
63 */
64#include <config.h>
wdenk0442ed82002-11-03 10:24:00 +000065#include <ppc4xx.h>
66#include <version.h>
67
68#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
69
70#include <ppc_asm.tmpl>
71#include <ppc_defs.h>
72
73#include <asm/cache.h>
74#include <asm/mmu.h>
Dave Mitchell3c3734172008-11-20 14:00:49 -060075#include <asm/ppc4xx-isram.h>
wdenk0442ed82002-11-03 10:24:00 +000076
77#ifndef CONFIG_IDENT_STRING
78#define CONFIG_IDENT_STRING ""
79#endif
80
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020081#ifdef CONFIG_SYS_INIT_DCACHE_CS
82# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
wdenk0442ed82002-11-03 10:24:00 +000083# define PBxAP pb0ap
84# define PBxCR pb0cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020085# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
86# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
87# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
Grant Ericksonb6933412008-05-22 14:44:14 -070088# endif
wdenk0442ed82002-11-03 10:24:00 +000089# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020090# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
wdenk0442ed82002-11-03 10:24:00 +000091# define PBxAP pb1ap
92# define PBxCR pb1cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020093# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
94# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
95# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
Grant Ericksonb6933412008-05-22 14:44:14 -070096# endif
wdenk0442ed82002-11-03 10:24:00 +000097# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020098# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
wdenk0442ed82002-11-03 10:24:00 +000099# define PBxAP pb2ap
100# define PBxCR pb2cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200101# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
102# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
103# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
Grant Ericksonb6933412008-05-22 14:44:14 -0700104# endif
wdenk0442ed82002-11-03 10:24:00 +0000105# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200106# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
wdenk0442ed82002-11-03 10:24:00 +0000107# define PBxAP pb3ap
108# define PBxCR pb3cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200109# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
110# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
111# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
Grant Ericksonb6933412008-05-22 14:44:14 -0700112# endif
wdenk0442ed82002-11-03 10:24:00 +0000113# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200114# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
wdenk0442ed82002-11-03 10:24:00 +0000115# define PBxAP pb4ap
116# define PBxCR pb4cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200117# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
118# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
119# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
Grant Ericksonb6933412008-05-22 14:44:14 -0700120# endif
wdenk0442ed82002-11-03 10:24:00 +0000121# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200122# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
wdenk0442ed82002-11-03 10:24:00 +0000123# define PBxAP pb5ap
124# define PBxCR pb5cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200125# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
126# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
127# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
Grant Ericksonb6933412008-05-22 14:44:14 -0700128# endif
wdenk0442ed82002-11-03 10:24:00 +0000129# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200130# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
wdenk0442ed82002-11-03 10:24:00 +0000131# define PBxAP pb6ap
132# define PBxCR pb6cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200133# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
134# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
135# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
Grant Ericksonb6933412008-05-22 14:44:14 -0700136# endif
wdenk0442ed82002-11-03 10:24:00 +0000137# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200138# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
wdenk0442ed82002-11-03 10:24:00 +0000139# define PBxAP pb7ap
140# define PBxCR pb7cr
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200141# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
142# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
143# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
Grant Ericksonb6933412008-05-22 14:44:14 -0700144# endif
145# endif
146# ifndef PBxAP_VAL
147# define PBxAP_VAL 0
148# endif
149# ifndef PBxCR_VAL
150# define PBxCR_VAL 0
151# endif
152/*
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200153 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonb6933412008-05-22 14:44:14 -0700154 * used as temporary stack pointer for the primordial stack
155 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200156# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
157# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonb6933412008-05-22 14:44:14 -0700158 EBC_BXAP_TWT_ENCODE(7) | \
159 EBC_BXAP_BCE_DISABLE | \
160 EBC_BXAP_BCT_2TRANS | \
161 EBC_BXAP_CSN_ENCODE(0) | \
162 EBC_BXAP_OEN_ENCODE(0) | \
163 EBC_BXAP_WBN_ENCODE(0) | \
164 EBC_BXAP_WBF_ENCODE(0) | \
165 EBC_BXAP_TH_ENCODE(2) | \
166 EBC_BXAP_RE_DISABLED | \
167 EBC_BXAP_SOR_NONDELAYED | \
168 EBC_BXAP_BEM_WRITEONLY | \
169 EBC_BXAP_PEN_DISABLED)
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200170# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
171# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
172# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
Grant Ericksonb6933412008-05-22 14:44:14 -0700173 EBC_BXCR_BS_64MB | \
174 EBC_BXCR_BU_RW | \
175 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200176# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
177# ifndef CONFIG_SYS_INIT_RAM_PATTERN
178# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
wdenk0442ed82002-11-03 10:24:00 +0000179# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200180#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000181
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200182#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_END > (4 << 10)))
183#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_END!
Stefan Roese0fb8ab92008-01-30 14:48:28 +0100184#endif
185
Grant Ericksonb6933412008-05-22 14:44:14 -0700186/*
187 * Unless otherwise overriden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200188 * at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
189 * NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
Grant Ericksonb6933412008-05-22 14:44:14 -0700190 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200191#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese7d72e022008-06-02 14:35:44 +0200192/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200193# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese7d72e022008-06-02 14:35:44 +0200194#endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200195#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
196# define CONFIG_SYS_ICACHE_SACR_VALUE \
197 (PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
198 PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
199 PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
200#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
Grant Ericksonb6933412008-05-22 14:44:14 -0700201
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200202#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
203# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonb6933412008-05-22 14:44:14 -0700204 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200205#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonb6933412008-05-22 14:44:14 -0700206
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200207#define function_prolog(func_name) .text; \
Stefan Roese42743512007-06-01 15:27:11 +0200208 .align 2; \
209 .globl func_name; \
210 func_name:
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200211#define function_epilog(func_name) .type func_name,@function; \
Stefan Roese42743512007-06-01 15:27:11 +0200212 .size func_name,.-func_name
213
wdenk0442ed82002-11-03 10:24:00 +0000214/* We don't want the MMU yet.
215*/
216#undef MSR_KERNEL
217#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
218
219
220 .extern ext_bus_cntlr_init
Stefan Roese42fbddd2006-09-07 11:51:23 +0200221#ifdef CONFIG_NAND_U_BOOT
222 .extern reconfig_tlb0
223#endif
wdenk0442ed82002-11-03 10:24:00 +0000224
225/*
226 * Set up GOT: Global Offset Table
227 *
228 * Use r14 to access the GOT
229 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200230#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000231 START_GOT
232 GOT_ENTRY(_GOT2_TABLE_)
233 GOT_ENTRY(_FIXUP_TABLE_)
234
235 GOT_ENTRY(_start)
236 GOT_ENTRY(_start_of_vectors)
237 GOT_ENTRY(_end_of_vectors)
238 GOT_ENTRY(transfer_to_handler)
239
wdenkb9a83a92003-05-30 12:48:29 +0000240 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000241 GOT_ENTRY(_end)
wdenkbf2f8c92003-05-22 22:52:13 +0000242 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000243 END_GOT
Stefan Roese42fbddd2006-09-07 11:51:23 +0200244#endif /* CONFIG_NAND_SPL */
245
246#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
247 /*
248 * NAND U-Boot image is started from offset 0
249 */
250 .text
Stefan Roese23d8d342007-06-06 11:42:13 +0200251#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200252 bl reconfig_tlb0
Stefan Roese23d8d342007-06-06 11:42:13 +0200253#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200254 GET_GOT
255 bl cpu_init_f /* run low-level CPU init code (from Flash) */
256 bl board_init_f
257#endif
wdenk0442ed82002-11-03 10:24:00 +0000258
259/*
260 * 440 Startup -- on reset only the top 4k of the effective
261 * address space is mapped in by an entry in the instruction
262 * and data shadow TLB. The .bootpg section is located in the
263 * top 4k & does only what's necessary to map in the the rest
264 * of the boot rom. Once the boot rom is mapped in we can
265 * proceed with normal startup.
266 *
267 * NOTE: CS0 only covers the top 2MB of the effective address
268 * space after reset.
269 */
270
271#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200272#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000273 .section .bootpg,"ax"
Stefan Roese42fbddd2006-09-07 11:51:23 +0200274#endif
wdenk0442ed82002-11-03 10:24:00 +0000275 .globl _start_440
276
277/**************************************************************************/
278_start_440:
Wolfgang Denk4df0da52006-10-09 00:42:01 +0200279 /*--------------------------------------------------------------------+
280 | 440EPX BUP Change - Hardware team request
281 +--------------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200282#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
283 sync
284 nop
285 nop
286#endif
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200287 /*----------------------------------------------------------------+
288 | Core bug fix. Clear the esr
289 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200290 li r0,0
Wolfgang Denkba940932006-07-19 13:50:38 +0200291 mtspr esr,r0
wdenk0442ed82002-11-03 10:24:00 +0000292 /*----------------------------------------------------------------*/
293 /* Clear and set up some registers. */
294 /*----------------------------------------------------------------*/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200295 iccci r0,r0 /* NOTE: operands not used for 440 */
296 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000297 sync
298 li r0,0
299 mtspr srr0,r0
300 mtspr srr1,r0
301 mtspr csrr0,r0
302 mtspr csrr1,r0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200303 /* NOTE: 440GX adds machine check status regs */
304#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200305 mtspr mcsrr0,r0
306 mtspr mcsrr1,r0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200307 mfspr r1,mcsr
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200308 mtspr mcsr,r1
wdenk544e9732004-02-06 23:19:44 +0000309#endif
Stefan Roese0100cc12006-11-22 13:20:50 +0100310
311 /*----------------------------------------------------------------*/
312 /* CCR0 init */
313 /*----------------------------------------------------------------*/
314 /* Disable store gathering & broadcast, guarantee inst/data
315 * cache block touch, force load/store alignment
316 * (see errata 1.12: 440_33)
317 */
318 lis r1,0x0030 /* store gathering & broadcast disable */
319 ori r1,r1,0x6000 /* cache touch */
320 mtspr ccr0,r1
321
wdenk0442ed82002-11-03 10:24:00 +0000322 /*----------------------------------------------------------------*/
323 /* Initialize debug */
324 /*----------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200325 mfspr r1,dbcr0
326 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
327 bne skip_debug_init /* if set, don't clear debug register */
wdenk0442ed82002-11-03 10:24:00 +0000328 mtspr dbcr0,r0
329 mtspr dbcr1,r0
330 mtspr dbcr2,r0
331 mtspr iac1,r0
332 mtspr iac2,r0
333 mtspr iac3,r0
334 mtspr dac1,r0
335 mtspr dac2,r0
336 mtspr dvc1,r0
337 mtspr dvc2,r0
338
339 mfspr r1,dbsr
340 mtspr dbsr,r1 /* Clear all valid bits */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200341skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000342
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200343#if defined (CONFIG_440SPE)
344 /*----------------------------------------------------------------+
345 | Initialize Core Configuration Reg1.
346 | a. ICDPEI: Record even parity. Normal operation.
347 | b. ICTPEI: Record even parity. Normal operation.
348 | c. DCTPEI: Record even parity. Normal operation.
349 | d. DCDPEI: Record even parity. Normal operation.
350 | e. DCUPEI: Record even parity. Normal operation.
351 | f. DCMPEI: Record even parity. Normal operation.
352 | g. FCOM: Normal operation
353 | h. MMUPEI: Record even parity. Normal operation.
354 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200355 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200356 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200357 li r0,0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200358 mtspr ccr1, r0
359
360 /*----------------------------------------------------------------+
361 | Reset the timebase.
362 | The previous write to CCR1 sets the timebase source.
363 +-----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200364 mtspr tbl, r0
365 mtspr tbu, r0
366#endif
367
wdenk0442ed82002-11-03 10:24:00 +0000368 /*----------------------------------------------------------------*/
369 /* Setup interrupt vectors */
370 /*----------------------------------------------------------------*/
371 mtspr ivpr,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200372 li r1,0x0100
wdenk0442ed82002-11-03 10:24:00 +0000373 mtspr ivor0,r1 /* Critical input */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200374 li r1,0x0200
wdenk0442ed82002-11-03 10:24:00 +0000375 mtspr ivor1,r1 /* Machine check */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200376 li r1,0x0300
wdenk0442ed82002-11-03 10:24:00 +0000377 mtspr ivor2,r1 /* Data storage */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200378 li r1,0x0400
wdenk0442ed82002-11-03 10:24:00 +0000379 mtspr ivor3,r1 /* Instruction storage */
380 li r1,0x0500
381 mtspr ivor4,r1 /* External interrupt */
382 li r1,0x0600
383 mtspr ivor5,r1 /* Alignment */
384 li r1,0x0700
385 mtspr ivor6,r1 /* Program check */
386 li r1,0x0800
387 mtspr ivor7,r1 /* Floating point unavailable */
388 li r1,0x0c00
389 mtspr ivor8,r1 /* System call */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200390 li r1,0x0a00
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200391 mtspr ivor9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200392 li r1,0x0900
393 mtspr ivor10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000394 li r1,0x1300
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200395 mtspr ivor13,r1 /* Data TLB error */
396 li r1,0x1400
wdenk0442ed82002-11-03 10:24:00 +0000397 mtspr ivor14,r1 /* Instr TLB error */
398 li r1,0x2000
399 mtspr ivor15,r1 /* Debug */
400
401 /*----------------------------------------------------------------*/
402 /* Configure cache regions */
403 /*----------------------------------------------------------------*/
404 mtspr inv0,r0
405 mtspr inv1,r0
406 mtspr inv2,r0
407 mtspr inv3,r0
408 mtspr dnv0,r0
409 mtspr dnv1,r0
410 mtspr dnv2,r0
411 mtspr dnv3,r0
412 mtspr itv0,r0
413 mtspr itv1,r0
414 mtspr itv2,r0
415 mtspr itv3,r0
416 mtspr dtv0,r0
417 mtspr dtv1,r0
418 mtspr dtv2,r0
419 mtspr dtv3,r0
420
421 /*----------------------------------------------------------------*/
422 /* Cache victim limits */
423 /*----------------------------------------------------------------*/
424 /* floors 0, ceiling max to use the entire cache -- nothing locked
425 */
426 lis r1,0x0001
427 ori r1,r1,0xf800
428 mtspr ivlim,r1
429 mtspr dvlim,r1
430
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200431 /*----------------------------------------------------------------+
432 |Initialize MMUCR[STID] = 0.
433 +-----------------------------------------------------------------*/
434 mfspr r0,mmucr
435 addis r1,0,0xFFFF
436 ori r1,r1,0xFF00
437 and r0,r0,r1
438 mtspr mmucr,r0
439
wdenk0442ed82002-11-03 10:24:00 +0000440 /*----------------------------------------------------------------*/
441 /* Clear all TLB entries -- TID = 0, TS = 0 */
442 /*----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200443 addis r0,0,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000444 li r1,0x003f /* 64 TLB entries */
445 mtctr r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200446rsttlb: tlbwe r0,r1,0x0000 /* Invalidate all entries (V=0)*/
447 tlbwe r0,r1,0x0001
448 tlbwe r0,r1,0x0002
wdenk0442ed82002-11-03 10:24:00 +0000449 subi r1,r1,0x0001
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200450 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000451
452 /*----------------------------------------------------------------*/
453 /* TLB entry setup -- step thru tlbtab */
454 /*----------------------------------------------------------------*/
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200455#if defined(CONFIG_440SPE)
456 /*----------------------------------------------------------------*/
457 /* We have different TLB tables for revA and rev B of 440SPe */
458 /*----------------------------------------------------------------*/
459 mfspr r1, PVR
460 lis r0,0x5342
461 ori r0,r0,0x1891
462 cmpw r7,r1,r0
463 bne r7,..revA
464 bl tlbtabB
465 b ..goon
466..revA:
467 bl tlbtabA
468..goon:
469#else
wdenk0442ed82002-11-03 10:24:00 +0000470 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200471#endif
wdenk0442ed82002-11-03 10:24:00 +0000472 mr r5,r0
473 li r1,0x003f /* 64 TLB entries max */
474 mtctr r1
475 li r4,0 /* TLB # */
476
477 addi r5,r5,-4
4781: lwzu r0,4(r5)
479 cmpwi r0,0
480 beq 2f /* 0 marks end */
481 lwzu r1,4(r5)
482 lwzu r2,4(r5)
483 tlbwe r0,r4,0 /* TLB Word 0 */
484 tlbwe r1,r4,1 /* TLB Word 1 */
485 tlbwe r2,r4,2 /* TLB Word 2 */
486 addi r4,r4,1 /* Next TLB */
487 bdnz 1b
488
489 /*----------------------------------------------------------------*/
490 /* Continue from 'normal' start */
491 /*----------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +02004922:
Stefan Roese42fbddd2006-09-07 11:51:23 +0200493 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000494 b _start
495
4963: li r0,0
497 mtspr srr1,r0 /* Keep things disabled for now */
498 mflr r1
499 mtspr srr0,r1
500 rfi
stroese434979e2003-05-23 11:18:02 +0000501#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000502
503/*
504 * r3 - 1st arg to board_init(): IMMP pointer
505 * r4 - 2nd arg to board_init(): boot flag
506 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200507#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000508 .text
509 .long 0x27051956 /* U-Boot Magic Number */
510 .globl version_string
511version_string:
512 .ascii U_BOOT_VERSION
513 .ascii " (", __DATE__, " - ", __TIME__, ")"
514 .ascii CONFIG_IDENT_STRING, "\0"
515
wdenk0442ed82002-11-03 10:24:00 +0000516 . = EXC_OFF_SYS_RESET
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200517 .globl _start_of_vectors
518_start_of_vectors:
519
520/* Critical input. */
521 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
522
523#ifdef CONFIG_440
524/* Machine check */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200525 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200526#else
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200527 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200528#endif /* CONFIG_440 */
529
530/* Data Storage exception. */
531 STD_EXCEPTION(0x300, DataStorage, UnknownException)
532
533/* Instruction Storage exception. */
534 STD_EXCEPTION(0x400, InstStorage, UnknownException)
535
536/* External Interrupt exception. */
537 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
538
539/* Alignment exception. */
540 . = 0x600
541Alignment:
542 EXCEPTION_PROLOG(SRR0, SRR1)
543 mfspr r4,DAR
544 stw r4,_DAR(r21)
545 mfspr r5,DSISR
546 stw r5,_DSISR(r21)
547 addi r3,r1,STACK_FRAME_OVERHEAD
548 li r20,MSR_KERNEL
549 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
550 lwz r6,GOT(transfer_to_handler)
551 mtlr r6
552 blrl
553.L_Alignment:
554 .long AlignmentException - _start + _START_OFFSET
555 .long int_return - _start + _START_OFFSET
556
557/* Program check exception */
558 . = 0x700
559ProgramCheck:
560 EXCEPTION_PROLOG(SRR0, SRR1)
561 addi r3,r1,STACK_FRAME_OVERHEAD
562 li r20,MSR_KERNEL
563 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
564 lwz r6,GOT(transfer_to_handler)
565 mtlr r6
566 blrl
567.L_ProgramCheck:
568 .long ProgramCheckException - _start + _START_OFFSET
569 .long int_return - _start + _START_OFFSET
570
571#ifdef CONFIG_440
572 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
573 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
574 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roese80d99a42007-06-19 16:42:31 +0200575#endif
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200576 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
577
578#ifdef CONFIG_440
579 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
580 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
581#else
582 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
583 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
584 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
585#endif
586 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
587
588 .globl _end_of_vectors
589_end_of_vectors:
590 . = _START_OFFSET
Stefan Roese42fbddd2006-09-07 11:51:23 +0200591#endif
wdenk0442ed82002-11-03 10:24:00 +0000592 .globl _start
593_start:
594
595/*****************************************************************************/
596#if defined(CONFIG_440)
597
598 /*----------------------------------------------------------------*/
599 /* Clear and set up some registers. */
600 /*----------------------------------------------------------------*/
601 li r0,0x0000
602 lis r1,0xffff
603 mtspr dec,r0 /* prevent dec exceptions */
604 mtspr tbl,r0 /* prevent fit & wdt exceptions */
605 mtspr tbu,r0
606 mtspr tsr,r1 /* clear all timer exception status */
607 mtspr tcr,r0 /* disable all */
608 mtspr esr,r0 /* clear exception syndrome register */
609 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000610
611 /*----------------------------------------------------------------*/
612 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200613 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000614 /* value you need in this case 0x8cff 0000 should do the trick */
615 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200616#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000617 lis r1,0xffff
618 ori r1,r1,0xffff
619 mtspr dbsr,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200620 lis r0,CONFIG_SYS_INIT_DBCR@h
621 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
wdenk0442ed82002-11-03 10:24:00 +0000622 mtspr dbcr0,r0
623 isync
624#endif
625
626 /*----------------------------------------------------------------*/
627 /* Setup the internal SRAM */
628 /*----------------------------------------------------------------*/
629 li r0,0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200630
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200631#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roese326c9712005-08-01 16:41:48 +0200632 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200633 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
634 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
635 addis r4,r0,CONFIG_SYS_INIT_RAM_END@h
636 ori r4,r4,CONFIG_SYS_INIT_RAM_END@l
Stefan Roese326c9712005-08-01 16:41:48 +0200637 rlwinm. r5,r4,0,27,31
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200638 rlwinm r5,r4,27,5,31
639 beq ..d_ran
640 addi r5,r5,0x0001
Stefan Roese326c9712005-08-01 16:41:48 +0200641..d_ran:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200642 mtctr r5
Stefan Roese326c9712005-08-01 16:41:48 +0200643..d_ag:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200644 dcbz r0,r3
645 addi r3,r3,32
646 bdnz ..d_ag
Stefan Roesea86bde32008-01-09 10:23:16 +0100647
648 /*
649 * Lock the init-ram/stack in d-cache, so that other regions
650 * may use d-cache as well
651 * Note, that this current implementation locks exactly 4k
652 * of d-cache, so please make sure that you don't define a
653 * bigger init-ram area. Take a look at the lwmon5 440EPx
654 * implementation as a reference.
655 */
656 msync
657 isync
658 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
659 lis r1,0x0201
660 ori r1,r1,0xf808
661 mtspr dvlim,r1
662 lis r1,0x0808
663 ori r1,r1,0x0808
664 mtspr dnv0,r1
665 mtspr dnv1,r1
666 mtspr dnv2,r1
667 mtspr dnv3,r1
668 mtspr dtv0,r1
669 mtspr dtv1,r1
670 mtspr dtv2,r1
671 mtspr dtv3,r1
672 msync
673 isync
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200674#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200675
676 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
677#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
678 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roesecc019d12008-03-11 15:05:50 +0100679#if defined(CONFIG_440GX) || \
680 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan224bc962008-07-08 22:47:31 -0700681 defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
682 defined(CONFIG_460SX)
Dave Mitchell3c3734172008-11-20 14:00:49 -0600683 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
wdenk544e9732004-02-06 23:19:44 +0000684#endif
wdenk0442ed82002-11-03 10:24:00 +0000685
Stefan Roese42fbddd2006-09-07 11:51:23 +0200686 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000687 ori r2,r2,0xffff
Dave Mitchell3c3734172008-11-20 14:00:49 -0600688 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000689 and r1,r1,r2 /* Disable parity check */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600690 mtdcr ISRAM0_DPC,r1
691 mfdcr r1,ISRAM0_PMEG
Stefan Roese42fbddd2006-09-07 11:51:23 +0200692 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600693 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000694
695 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese99644742005-11-29 18:18:21 +0100696#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenk544e9732004-02-06 23:19:44 +0000697 ori r1,r1,0x0980 /* first 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600698 mtdcr ISRAM0_SB0CR,r1
wdenk544e9732004-02-06 23:19:44 +0000699 lis r1,0x8001
700 ori r1,r1,0x0980 /* second 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600701 mtdcr ISRAM0_SB1CR,r1
wdenk544e9732004-02-06 23:19:44 +0000702 lis r1, 0x8002
703 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600704 mtdcr ISRAM0_SB2CR,r1
wdenk544e9732004-02-06 23:19:44 +0000705 lis r1, 0x8003
706 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600707 mtdcr ISRAM0_SB3CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200708#elif defined(CONFIG_440SPE)
709 lis r1,0x0000 /* BAS = 0000_0000 */
710 ori r1,r1,0x0984 /* first 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600711 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200712 lis r1,0x0001
713 ori r1,r1,0x0984 /* second 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600714 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200715 lis r1, 0x0002
716 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600717 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200718 lis r1, 0x0003
719 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600720 mtdcr ISRAM0_SB3CR,r1
Stefan Roesecc019d12008-03-11 15:05:50 +0100721#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
722 lis r1,0x4000 /* BAS = 8000_0000 */
723 ori r1,r1,0x4580 /* 16k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600724 mtdcr ISRAM0_SB0CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700725#elif defined(CONFIG_460SX)
726 lis r1,0x0000 /* BAS = 0000_0000 */
727 ori r1,r1,0x0B84 /* first 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600728 mtdcr ISRAM0_SB0CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700729 lis r1,0x0001
730 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600731 mtdcr ISRAM0_SB1CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700732 lis r1, 0x0002
733 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600734 mtdcr ISRAM0_SB2CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700735 lis r1, 0x0003
736 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600737 mtdcr ISRAM0_SB3CR,r1
Stefan Roese42fbddd2006-09-07 11:51:23 +0200738#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000739 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600740 mtdcr ISRAM0_SB0CR,r1
741 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
Stefan Roese326c9712005-08-01 16:41:48 +0200742#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200743#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000744
745 /*----------------------------------------------------------------*/
746 /* Setup the stack in internal SRAM */
747 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200748 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
749 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000750 li r0,0
751 stwu r0,-4(r1)
752 stwu r0,-4(r1) /* Terminate call chain */
753
754 stwu r1,-8(r1) /* Save back chain and move SP */
755 lis r0,RESET_VECTOR@h /* Address of reset vector */
756 ori r0,r0, RESET_VECTOR@l
757 stwu r1,-8(r1) /* Save back chain and move SP */
758 stw r0,+12(r1) /* Save return addr (underflow vect) */
759
Stefan Roese42fbddd2006-09-07 11:51:23 +0200760#ifdef CONFIG_NAND_SPL
Stefan Roese7d72e022008-06-02 14:35:44 +0200761 bl nand_boot_common /* will not return */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200762#else
wdenk0442ed82002-11-03 10:24:00 +0000763 GET_GOT
Stefan Roesec443fe92005-11-22 13:20:42 +0100764
765 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000766 bl board_init_f
Stefan Roese42fbddd2006-09-07 11:51:23 +0200767#endif
wdenk0442ed82002-11-03 10:24:00 +0000768
769#endif /* CONFIG_440 */
770
771/*****************************************************************************/
772#ifdef CONFIG_IOP480
773 /*----------------------------------------------------------------------- */
774 /* Set up some machine state registers. */
775 /*----------------------------------------------------------------------- */
776 addi r0,r0,0x0000 /* initialize r0 to zero */
777 mtspr esr,r0 /* clear Exception Syndrome Reg */
778 mttcr r0 /* timer control register */
779 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000780 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
781 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
782 mtdbsr r4 /* clear/reset the dbsr */
783 mtexisr r4 /* clear all pending interrupts */
784 addis r4,r0,0x8000
785 mtexier r4 /* enable critical exceptions */
786 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
787 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
788 mtiocr r4 /* since bit not used) & DRC to latch */
789 /* data bus on rising edge of CAS */
790 /*----------------------------------------------------------------------- */
791 /* Clear XER. */
792 /*----------------------------------------------------------------------- */
793 mtxer r0
794 /*----------------------------------------------------------------------- */
795 /* Invalidate i-cache and d-cache TAG arrays. */
796 /*----------------------------------------------------------------------- */
797 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
798 addi r4,0,1024 /* 1/4 of I-cache */
799..cloop:
800 iccci 0,r3
801 iccci r4,r3
802 dccci 0,r3
803 addic. r3,r3,-16 /* move back one cache line */
804 bne ..cloop /* loop back to do rest until r3 = 0 */
805
806 /* */
807 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
808 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
809 /* */
810
811 /* first copy IOP480 register base address into r3 */
812 addis r3,0,0x5000 /* IOP480 register base address hi */
813/* ori r3,r3,0x0000 / IOP480 register base address lo */
814
815#ifdef CONFIG_ADCIOP
816 /* use r4 as the working variable */
817 /* turn on CS3 (LOCCTL.7) */
818 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
819 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
820 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
821#endif
822
823#ifdef CONFIG_DASA_SIM
824 /* use r4 as the working variable */
825 /* turn on MA17 (LOCCTL.7) */
826 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
827 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
828 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
829#endif
830
831 /* turn on MA16..13 (LCS0BRD.12 = 0) */
832 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
833 andi. r4,r4,0xefff /* make bit 12 = 0 */
834 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
835
836 /* make sure above stores all comlete before going on */
837 sync
838
839 /* last thing, set local init status done bit (DEVINIT.31) */
840 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
841 oris r4,r4,0x8000 /* make bit 31 = 1 */
842 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
843
844 /* clear all pending interrupts and disable all interrupts */
845 li r4,-1 /* set p1 to 0xffffffff */
846 stw r4,0x1b0(r3) /* clear all pending interrupts */
847 stw r4,0x1b8(r3) /* clear all pending interrupts */
848 li r4,0 /* set r4 to 0 */
849 stw r4,0x1b4(r3) /* disable all interrupts */
850 stw r4,0x1bc(r3) /* disable all interrupts */
851
852 /* make sure above stores all comlete before going on */
853 sync
854
Grant Ericksonb6933412008-05-22 14:44:14 -0700855 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200856 lis r1, CONFIG_SYS_ICACHE_SACR_VALUE@h
857 ori r1, r1, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700858 mticcr r1
859 isync
wdenk0442ed82002-11-03 10:24:00 +0000860
Grant Ericksonb6933412008-05-22 14:44:14 -0700861 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200862 lis r1, CONFIG_SYS_DCACHE_SACR_VALUE@h
863 ori r1, r1, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700864 mtdccr r1
wdenk0442ed82002-11-03 10:24:00 +0000865
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200866 addis r1,r0,CONFIG_SYS_INIT_RAM_ADDR@h
867 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack to SDRAM */
wdenk0442ed82002-11-03 10:24:00 +0000868 li r0, 0 /* Make room for stack frame header and */
869 stwu r0, -4(r1) /* clear final stack frame so that */
870 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
871
872 GET_GOT /* initialize GOT access */
873
874 bl board_init_f /* run first part of init code (from Flash) */
875
876#endif /* CONFIG_IOP480 */
877
878/*****************************************************************************/
Stefan Roese17ffbc82007-03-21 13:38:59 +0100879#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
880 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roese153b3e22007-10-05 17:10:59 +0200881 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000882 /*----------------------------------------------------------------------- */
883 /* Clear and set up some registers. */
884 /*----------------------------------------------------------------------- */
885 addi r4,r0,0x0000
Stefan Roese153b3e22007-10-05 17:10:59 +0200886#if !defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000887 mtspr sgr,r4
Stefan Roese153b3e22007-10-05 17:10:59 +0200888#else
889 /*
890 * On 405EX, completely clearing the SGR leads to PPC hangup
891 * upon PCIe configuration access. The PCIe memory regions
892 * need to be guarded!
893 */
894 lis r3,0x0000
895 ori r3,r3,0x7FFC
896 mtspr sgr,r3
897#endif
wdenk0442ed82002-11-03 10:24:00 +0000898 mtspr dcwr,r4
899 mtesr r4 /* clear Exception Syndrome Reg */
900 mttcr r4 /* clear Timer Control Reg */
901 mtxer r4 /* clear Fixed-Point Exception Reg */
902 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000903 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
904 /* dbsr is cleared by setting bits to 1) */
905 mtdbsr r4 /* clear/reset the dbsr */
906
Grant Ericksonb6933412008-05-22 14:44:14 -0700907 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000908 bl invalidate_icache
909 bl invalidate_dcache
910
Grant Ericksonb6933412008-05-22 14:44:14 -0700911 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200912 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
913 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700914 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000915 isync
916
Grant Ericksonb6933412008-05-22 14:44:14 -0700917 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200918 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
919 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700920 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000921
Ricardo Ribalda Delgado78ea77e2008-10-21 18:29:46 +0200922#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
923 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000924 /*----------------------------------------------------------------------- */
925 /* Tune the speed and size for flash CS0 */
926 /*----------------------------------------------------------------------- */
927 bl ext_bus_cntlr_init
928#endif
Stefan Roese7d72e022008-06-02 14:35:44 +0200929
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200930#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roese153b3e22007-10-05 17:10:59 +0200931 /*
Grant Ericksonb6933412008-05-22 14:44:14 -0700932 * For boards that don't have OCM and can't use the data cache
933 * for their primordial stack, setup stack here directly after the
934 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roese153b3e22007-10-05 17:10:59 +0200935 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200936 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
937 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roese153b3e22007-10-05 17:10:59 +0200938
939 li r0, 0 /* Make room for stack frame header and */
940 stwu r0, -4(r1) /* clear final stack frame so that */
941 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
942 /*
943 * Set up a dummy frame to store reset vector as return address.
944 * this causes stack underflow to reset board.
945 */
946 stwu r1, -8(r1) /* Save back chain and move SP */
947 lis r0, RESET_VECTOR@h /* Address of reset vector */
948 ori r0, r0, RESET_VECTOR@l
949 stwu r1, -8(r1) /* Save back chain and move SP */
950 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200951#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000952
stroese434979e2003-05-23 11:18:02 +0000953#if defined(CONFIG_405EP)
954 /*----------------------------------------------------------------------- */
955 /* DMA Status, clear to come up clean */
956 /*----------------------------------------------------------------------- */
Wolfgang Denka1be4762008-05-20 16:00:29 +0200957 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200958 ori r3,r3, 0xFFFF
959 mtdcr dmasr, r3
stroese434979e2003-05-23 11:18:02 +0000960
Wolfgang Denka1be4762008-05-20 16:00:29 +0200961 bl ppc405ep_init /* do ppc405ep specific init */
stroese434979e2003-05-23 11:18:02 +0000962#endif /* CONFIG_405EP */
963
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200964#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roese17ffbc82007-03-21 13:38:59 +0100965#if defined(CONFIG_405EZ)
966 /********************************************************************
967 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
968 *******************************************************************/
969 /*
970 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200971 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roese17ffbc82007-03-21 13:38:59 +0100972 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200973 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
974 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roese80d99a42007-06-19 16:42:31 +0200975 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100976 mtdcr ocmplb3cr1,r3 /* Set PLB Access */
977 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
978 mtdcr ocmplb3cr2,r3 /* Set PLB Access */
979 isync
980
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200981 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
982 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200983 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
984 mtdcr ocmdscr1, r3 /* Set Data Side */
985 mtdcr ocmiscr1, r3 /* Set Instruction Side */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100986 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200987 mtdcr ocmdscr2, r3 /* Set Data Side */
988 mtdcr ocmiscr2, r3 /* Set Instruction Side */
989 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed85f5d72007-05-24 09:49:00 +0200990 mtdcr ocmdsisdpc,r3
Stefan Roese17ffbc82007-03-21 13:38:59 +0100991
992 isync
Stefan Roesef6c7b762007-03-24 15:45:34 +0100993#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000994 /********************************************************************
995 * Setup OCM - On Chip Memory
996 *******************************************************************/
997 /* Setup OCM */
wdenk57b2d802003-06-27 21:31:46 +0000998 lis r0, 0x7FFF
999 ori r0, r0, 0xFFFF
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001000 mfdcr r3, ocmiscntl /* get instr-side IRAM config */
Stefan Roesef6c7b762007-03-24 15:45:34 +01001001 mfdcr r4, ocmdscntl /* get data-side IRAM config */
1002 and r3, r3, r0 /* disable data-side IRAM */
1003 and r4, r4, r0 /* disable data-side IRAM */
1004 mtdcr ocmiscntl, r3 /* set instr-side IRAM config */
1005 mtdcr ocmdscntl, r4 /* set data-side IRAM config */
wdenk57b2d802003-06-27 21:31:46 +00001006 isync
wdenk0442ed82002-11-03 10:24:00 +00001007
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001008 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1009 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001010 mtdcr ocmdsarc, r3
1011 addis r4, 0, 0xC000 /* OCM data area enabled */
1012 mtdcr ocmdscntl, r4
wdenk57b2d802003-06-27 21:31:46 +00001013 isync
Stefan Roese17ffbc82007-03-21 13:38:59 +01001014#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +00001015#endif
1016
1017 /*----------------------------------------------------------------------- */
1018 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1019 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001020#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonb6933412008-05-22 14:44:14 -07001021 li r4, PBxAP
1022 mtdcr ebccfga, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001023 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
1024 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001025 mtdcr ebccfgd, r4
wdenk0442ed82002-11-03 10:24:00 +00001026
Grant Ericksonb6933412008-05-22 14:44:14 -07001027 addi r4, 0, PBxCR
1028 mtdcr ebccfga, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001029 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
1030 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001031 mtdcr ebccfgd, r4
wdenk0442ed82002-11-03 10:24:00 +00001032
Grant Ericksonb6933412008-05-22 14:44:14 -07001033 /*
1034 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001035 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonb6933412008-05-22 14:44:14 -07001036 */
1037 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001038 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1039 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +00001040 mtdccr r4
1041
Grant Ericksonb6933412008-05-22 14:44:14 -07001042 /*
1043 * Preallocate data cache lines to be used to avoid a subsequent
1044 * cache miss and an ensuing machine check exception when exceptions
1045 * are enabled.
1046 */
1047 li r0, 0
1048
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001049 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1050 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +00001051
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001052 lis r4, CONFIG_SYS_INIT_RAM_END@h
1053 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
wdenk0442ed82002-11-03 10:24:00 +00001054
Grant Ericksonb6933412008-05-22 14:44:14 -07001055 /*
1056 * Convert the size, in bytes, to the number of cache lines/blocks
1057 * to preallocate.
1058 */
1059 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1060 srwi r5, r4, L1_CACHE_SHIFT
1061 beq ..load_counter
1062 addi r5, r5, 0x0001
1063..load_counter:
1064 mtctr r5
1065
1066 /* Preallocate the computed number of cache blocks. */
1067..alloc_dcache_block:
1068 dcba r0, r3
1069 addi r3, r3, L1_CACHE_BYTES
1070 bdnz ..alloc_dcache_block
1071 sync
1072
1073 /*
1074 * Load the initial stack pointer and data area and convert the size,
1075 * in bytes, to the number of words to initialize to a known value.
1076 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001077 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1078 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001079
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001080 lis r4, (CONFIG_SYS_INIT_RAM_END >> 2)@h
1081 ori r4, r4, (CONFIG_SYS_INIT_RAM_END >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +00001082 mtctr r4
1083
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001084 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
1085 ori r2, r2, CONFIG_SYS_INIT_RAM_END@l
wdenk0442ed82002-11-03 10:24:00 +00001086
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001087 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1088 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +00001089
1090..stackloop:
Grant Ericksonb6933412008-05-22 14:44:14 -07001091 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +00001092 bdnz ..stackloop
1093
Grant Ericksonb6933412008-05-22 14:44:14 -07001094 /*
1095 * Make room for stack frame header and clear final stack frame so
1096 * that stack backtraces terminate cleanly.
1097 */
1098 stwu r0, -4(r1)
1099 stwu r0, -4(r1)
1100
wdenk0442ed82002-11-03 10:24:00 +00001101 /*
1102 * Set up a dummy frame to store reset vector as return address.
1103 * this causes stack underflow to reset board.
1104 */
1105 stwu r1, -8(r1) /* Save back chain and move SP */
1106 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1107 ori r0, r0, RESET_VECTOR@l
1108 stwu r1, -8(r1) /* Save back chain and move SP */
1109 stw r0, +12(r1) /* Save return addr (underflow vect) */
1110
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001111#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1112 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001113 /*
1114 * Stack in OCM.
1115 */
1116
1117 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001118 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1119 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001120
1121 /* Set up a zeroized stack frame so that backtrace works right */
1122 li r0, 0
1123 stwu r0, -4(r1)
1124 stwu r0, -4(r1)
1125
1126 /*
1127 * Set up a dummy frame to store reset vector as return address.
1128 * this causes stack underflow to reset board.
1129 */
1130 stwu r1, -8(r1) /* Save back chain and move SP */
1131 lis r0, RESET_VECTOR@h /* Address of reset vector */
1132 ori r0, r0, RESET_VECTOR@l
1133 stwu r1, -8(r1) /* Save back chain and move SP */
1134 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001135#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001136
Stefan Roese23d8d342007-06-06 11:42:13 +02001137#ifdef CONFIG_NAND_SPL
Stefan Roese7d72e022008-06-02 14:35:44 +02001138 bl nand_boot_common /* will not return */
Stefan Roese23d8d342007-06-06 11:42:13 +02001139#else
wdenk0442ed82002-11-03 10:24:00 +00001140 GET_GOT /* initialize GOT access */
1141
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001142 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001143
1144 /* NEVER RETURNS! */
1145 bl board_init_f /* run first part of init code (from Flash) */
Stefan Roese23d8d342007-06-06 11:42:13 +02001146#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001147
wdenk232fe0b2003-09-02 22:48:03 +00001148#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1149 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001150
1151
Stefan Roese42fbddd2006-09-07 11:51:23 +02001152#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001153/*
1154 * This code finishes saving the registers to the exception frame
1155 * and jumps to the appropriate handler for the exception.
1156 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1157 */
1158 .globl transfer_to_handler
1159transfer_to_handler:
1160 stw r22,_NIP(r21)
1161 lis r22,MSR_POW@h
1162 andc r23,r23,r22
1163 stw r23,_MSR(r21)
1164 SAVE_GPR(7, r21)
1165 SAVE_4GPRS(8, r21)
1166 SAVE_8GPRS(12, r21)
1167 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001168 mflr r23
1169 andi. r24,r23,0x3f00 /* get vector offset */
1170 stw r24,TRAP(r21)
1171 li r22,0
1172 stw r22,RESULT(r21)
1173 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001174 lwz r24,0(r23) /* virtual address of handler */
1175 lwz r23,4(r23) /* where to go when done */
1176 mtspr SRR0,r24
1177 mtspr SRR1,r20
1178 mtlr r23
1179 SYNC
1180 rfi /* jump to handler, enable MMU */
1181
1182int_return:
1183 mfmsr r28 /* Disable interrupts */
1184 li r4,0
1185 ori r4,r4,MSR_EE
1186 andc r28,r28,r4
1187 SYNC /* Some chip revs need this... */
1188 mtmsr r28
1189 SYNC
1190 lwz r2,_CTR(r1)
1191 lwz r0,_LINK(r1)
1192 mtctr r2
1193 mtlr r0
1194 lwz r2,_XER(r1)
1195 lwz r0,_CCR(r1)
1196 mtspr XER,r2
1197 mtcrf 0xFF,r0
1198 REST_10GPRS(3, r1)
1199 REST_10GPRS(13, r1)
1200 REST_8GPRS(23, r1)
1201 REST_GPR(31, r1)
1202 lwz r2,_NIP(r1) /* Restore environment */
1203 lwz r0,_MSR(r1)
1204 mtspr SRR0,r2
1205 mtspr SRR1,r0
1206 lwz r0,GPR0(r1)
1207 lwz r2,GPR2(r1)
1208 lwz r1,GPR1(r1)
1209 SYNC
1210 rfi
1211
1212crit_return:
1213 mfmsr r28 /* Disable interrupts */
1214 li r4,0
1215 ori r4,r4,MSR_EE
1216 andc r28,r28,r4
1217 SYNC /* Some chip revs need this... */
1218 mtmsr r28
1219 SYNC
1220 lwz r2,_CTR(r1)
1221 lwz r0,_LINK(r1)
1222 mtctr r2
1223 mtlr r0
1224 lwz r2,_XER(r1)
1225 lwz r0,_CCR(r1)
1226 mtspr XER,r2
1227 mtcrf 0xFF,r0
1228 REST_10GPRS(3, r1)
1229 REST_10GPRS(13, r1)
1230 REST_8GPRS(23, r1)
1231 REST_GPR(31, r1)
1232 lwz r2,_NIP(r1) /* Restore environment */
1233 lwz r0,_MSR(r1)
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001234 mtspr csrr0,r2
1235 mtspr csrr1,r0
wdenk0442ed82002-11-03 10:24:00 +00001236 lwz r0,GPR0(r1)
1237 lwz r2,GPR2(r1)
1238 lwz r1,GPR1(r1)
1239 SYNC
1240 rfci
1241
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001242#ifdef CONFIG_440
1243mck_return:
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001244 mfmsr r28 /* Disable interrupts */
1245 li r4,0
1246 ori r4,r4,MSR_EE
1247 andc r28,r28,r4
1248 SYNC /* Some chip revs need this... */
1249 mtmsr r28
1250 SYNC
1251 lwz r2,_CTR(r1)
1252 lwz r0,_LINK(r1)
1253 mtctr r2
1254 mtlr r0
1255 lwz r2,_XER(r1)
1256 lwz r0,_CCR(r1)
1257 mtspr XER,r2
1258 mtcrf 0xFF,r0
1259 REST_10GPRS(3, r1)
1260 REST_10GPRS(13, r1)
1261 REST_8GPRS(23, r1)
1262 REST_GPR(31, r1)
1263 lwz r2,_NIP(r1) /* Restore environment */
1264 lwz r0,_MSR(r1)
1265 mtspr mcsrr0,r2
1266 mtspr mcsrr1,r0
1267 lwz r0,GPR0(r1)
1268 lwz r2,GPR2(r1)
1269 lwz r1,GPR1(r1)
1270 SYNC
1271 rfmci
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001272#endif /* CONFIG_440 */
1273
1274
wdenk0442ed82002-11-03 10:24:00 +00001275 .globl get_pvr
1276get_pvr:
1277 mfspr r3, PVR
1278 blr
1279
wdenk0442ed82002-11-03 10:24:00 +00001280/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001281/* Function: out16 */
1282/* Description: Output 16 bits */
1283/*------------------------------------------------------------------------------- */
1284 .globl out16
1285out16:
1286 sth r4,0x0000(r3)
1287 blr
1288
1289/*------------------------------------------------------------------------------- */
1290/* Function: out16r */
1291/* Description: Byte reverse and output 16 bits */
1292/*------------------------------------------------------------------------------- */
1293 .globl out16r
1294out16r:
1295 sthbrx r4,r0,r3
1296 blr
1297
1298/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001299/* Function: out32r */
1300/* Description: Byte reverse and output 32 bits */
1301/*------------------------------------------------------------------------------- */
1302 .globl out32r
1303out32r:
1304 stwbrx r4,r0,r3
1305 blr
1306
1307/*------------------------------------------------------------------------------- */
1308/* Function: in16 */
1309/* Description: Input 16 bits */
1310/*------------------------------------------------------------------------------- */
1311 .globl in16
1312in16:
1313 lhz r3,0x0000(r3)
1314 blr
1315
1316/*------------------------------------------------------------------------------- */
1317/* Function: in16r */
1318/* Description: Input 16 bits and byte reverse */
1319/*------------------------------------------------------------------------------- */
1320 .globl in16r
1321in16r:
1322 lhbrx r3,r0,r3
1323 blr
1324
1325/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001326/* Function: in32r */
1327/* Description: Input 32 bits and byte reverse */
1328/*------------------------------------------------------------------------------- */
1329 .globl in32r
1330in32r:
1331 lwbrx r3,r0,r3
1332 blr
1333
wdenk0442ed82002-11-03 10:24:00 +00001334/*
1335 * void relocate_code (addr_sp, gd, addr_moni)
1336 *
1337 * This "function" does not return, instead it continues in RAM
1338 * after relocating the monitor code.
1339 *
Grant Ericksonb6933412008-05-22 14:44:14 -07001340 * r3 = Relocated stack pointer
1341 * r4 = Relocated global data pointer
1342 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001343 */
1344 .globl relocate_code
1345relocate_code:
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001346#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001347 /*
Grant Ericksonb6933412008-05-22 14:44:14 -07001348 * We need to flush the initial global data (gd_t) before the dcache
1349 * will be invalidated.
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001350 */
1351
Grant Ericksonb6933412008-05-22 14:44:14 -07001352 /* Save registers */
1353 mr r9, r3
1354 mr r10, r4
1355 mr r11, r5
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001356
Grant Ericksonb6933412008-05-22 14:44:14 -07001357 /* Flush initial global data range */
1358 mr r3, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001359 addi r4, r4, CONFIG_SYS_GBL_DATA_SIZE@l
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001360 bl flush_dcache_range
1361
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001362#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonb6933412008-05-22 14:44:14 -07001363 /*
1364 * Undo the earlier data cache set-up for the primordial stack and
1365 * data area. First, invalidate the data cache and then disable data
1366 * cacheability for that area. Finally, restore the EBC values, if
1367 * any.
1368 */
1369
1370 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001371 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1372 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001373
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001374 lis r4, CONFIG_SYS_INIT_RAM_END@h
1375 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001376 add r4, r4, r3
1377
1378 bl invalidate_dcache_range
1379
1380 /* Disable cacheability for the region */
1381 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001382 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1383 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001384 and r3, r3, r4
1385 mtdccr r3
1386
1387 /* Restore the EBC parameters */
1388 li r3, PBxAP
1389 mtdcr ebccfga, r3
1390 lis r3, PBxAP_VAL@h
1391 ori r3, r3, PBxAP_VAL@l
1392 mtdcr ebccfgd, r3
1393
1394 li r3, PBxCR
1395 mtdcr ebccfga, r3
1396 lis r3, PBxCR_VAL@h
1397 ori r3, r3, PBxCR_VAL@l
1398 mtdcr ebccfgd, r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001399#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonb6933412008-05-22 14:44:14 -07001400
1401 /* Restore registers */
1402 mr r3, r9
1403 mr r4, r10
1404 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001405#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesea86bde32008-01-09 10:23:16 +01001406
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001407#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesea86bde32008-01-09 10:23:16 +01001408 /*
1409 * Unlock the previously locked d-cache
1410 */
1411 msync
1412 isync
1413 /* set TFLOOR/NFLOOR to 0 again */
1414 lis r6,0x0001
1415 ori r6,r6,0xf800
1416 mtspr dvlim,r6
1417 lis r6,0x0000
1418 ori r6,r6,0x0000
1419 mtspr dnv0,r6
1420 mtspr dnv1,r6
1421 mtspr dnv2,r6
1422 mtspr dnv3,r6
1423 mtspr dtv0,r6
1424 mtspr dtv1,r6
1425 mtspr dtv2,r6
1426 mtspr dtv3,r6
1427 msync
1428 isync
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001429#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesea86bde32008-01-09 10:23:16 +01001430
Stefan Roese42fbddd2006-09-07 11:51:23 +02001431#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1432 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
Stefan Roesecc019d12008-03-11 15:05:50 +01001433 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan224bc962008-07-08 22:47:31 -07001434 defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
1435 defined(CONFIG_460SX)
Stefan Roese9eba0c82006-06-02 16:18:04 +02001436 /*
1437 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1438 * to speed up the boot process. Now this cache needs to be disabled.
1439 */
1440 iccci 0,0 /* Invalidate inst cache */
1441 dccci 0,0 /* Invalidate data cache, now no longer our stack */
Stefan Roese326c9712005-08-01 16:41:48 +02001442 sync
Stefan Roese9eba0c82006-06-02 16:18:04 +02001443 isync
Stefan Roesefe05a022008-11-20 11:46:20 +01001444
1445 /* Clear all potential pending exceptions */
1446 mfspr r1,mcsr
1447 mtspr mcsr,r1
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001448#ifdef CONFIG_SYS_TLB_FOR_BOOT_FLASH
1449 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Niklaus Giger86cb27b2007-11-30 18:35:11 +01001450#else
1451 addi r1,r0,0x0000 /* Default TLB entry is #0 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001452#endif /* CONFIG_SYS_TLB_FOR_BOOT_FLASH */
Stefan Roese326c9712005-08-01 16:41:48 +02001453 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese99644742005-11-29 18:18:21 +01001454 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001455 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roese9eba0c82006-06-02 16:18:04 +02001456 sync
Stefan Roese326c9712005-08-01 16:41:48 +02001457 isync
Grant Ericksonb6933412008-05-22 14:44:14 -07001458#endif /* defined(CONFIG_440EP) || ... || defined(CONFIG_460GT) */
wdenk0442ed82002-11-03 10:24:00 +00001459 mr r1, r3 /* Set new stack pointer */
1460 mr r9, r4 /* Save copy of Init Data pointer */
1461 mr r10, r5 /* Save copy of Destination Address */
1462
1463 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001464 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1465 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenkb9a83a92003-05-30 12:48:29 +00001466 lwz r5, GOT(__init_end)
1467 sub r5, r5, r4
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001468 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001469
1470 /*
1471 * Fix GOT pointer:
1472 *
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001473 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001474 *
1475 * Offset:
1476 */
1477 sub r15, r10, r4
1478
1479 /* First our own GOT */
1480 add r14, r14, r15
Grant Ericksonb6933412008-05-22 14:44:14 -07001481 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001482 add r30, r30, r15
1483
1484 /*
1485 * Now relocate code
1486 */
1487
1488 cmplw cr1,r3,r4
1489 addi r0,r5,3
1490 srwi. r0,r0,2
1491 beq cr1,4f /* In place copy is not necessary */
1492 beq 7f /* Protect against 0 count */
1493 mtctr r0
1494 bge cr1,2f
1495
1496 la r8,-4(r4)
1497 la r7,-4(r3)
14981: lwzu r0,4(r8)
1499 stwu r0,4(r7)
1500 bdnz 1b
1501 b 4f
1502
15032: slwi r0,r0,2
1504 add r8,r4,r0
1505 add r7,r3,r0
15063: lwzu r0,-4(r8)
1507 stwu r0,-4(r7)
1508 bdnz 3b
1509
1510/*
1511 * Now flush the cache: note that we must start from a cache aligned
1512 * address. Otherwise we might miss one cache line.
1513 */
15144: cmpwi r6,0
1515 add r5,r3,r5
1516 beq 7f /* Always flush prefetch queue in any case */
1517 subi r0,r6,1
1518 andc r3,r3,r0
1519 mr r4,r3
15205: dcbst 0,r4
1521 add r4,r4,r6
1522 cmplw r4,r5
1523 blt 5b
1524 sync /* Wait for all dcbst to complete on bus */
1525 mr r4,r3
15266: icbi 0,r4
1527 add r4,r4,r6
1528 cmplw r4,r5
1529 blt 6b
15307: sync /* Wait for all icbi to complete on bus */
1531 isync
1532
1533/*
1534 * We are done. Do not return, instead branch to second part of board
1535 * initialization, now running from RAM.
1536 */
1537
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001538 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001539 mtlr r0
1540 blr /* NEVER RETURNS! */
1541
1542in_ram:
1543
1544 /*
1545 * Relocation Function, r14 point to got2+0x8000
1546 *
1547 * Adjust got2 pointers, no need to check for 0, this code
1548 * already puts a few entries in the table.
1549 */
1550 li r0,__got2_entries@sectoff@l
1551 la r3,GOT(_GOT2_TABLE_)
1552 lwz r11,GOT(_GOT2_TABLE_)
1553 mtctr r0
1554 sub r11,r3,r11
1555 addi r3,r3,-4
15561: lwzu r0,4(r3)
1557 add r0,r0,r11
1558 stw r0,0(r3)
1559 bdnz 1b
1560
1561 /*
1562 * Now adjust the fixups and the pointers to the fixups
1563 * in case we need to move ourselves again.
1564 */
15652: li r0,__fixup_entries@sectoff@l
1566 lwz r3,GOT(_FIXUP_TABLE_)
1567 cmpwi r0,0
1568 mtctr r0
1569 addi r3,r3,-4
1570 beq 4f
15713: lwzu r4,4(r3)
1572 lwzux r0,r4,r11
1573 add r0,r0,r11
1574 stw r10,0(r3)
1575 stw r0,0(r4)
1576 bdnz 3b
15774:
1578clear_bss:
1579 /*
1580 * Now clear BSS segment
1581 */
wdenkbf2f8c92003-05-22 22:52:13 +00001582 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001583 lwz r4,GOT(_end)
1584
1585 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001586 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001587
1588 li r0, 0
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001589
1590 andi. r5, r4, 3
1591 beq 6f
1592 sub r4, r4, r5
1593 mtctr r5
1594 mr r5, r4
15955: stb r0, 0(r5)
1596 addi r5, r5, 1
1597 bdnz 5b
15986:
wdenk0442ed82002-11-03 10:24:00 +00001599 stw r0, 0(r3)
1600 addi r3, r3, 4
1601 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001602 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001603
Anatolij Gustschin720025b2007-12-05 17:43:20 +010016047:
wdenk0442ed82002-11-03 10:24:00 +00001605 mr r3, r9 /* Init Data pointer */
1606 mr r4, r10 /* Destination Address */
1607 bl board_init_r
1608
wdenk0442ed82002-11-03 10:24:00 +00001609 /*
1610 * Copy exception vector code to low memory
1611 *
1612 * r3: dest_addr
1613 * r7: source address, r8: end address, r9: target address
1614 */
1615 .globl trap_init
1616trap_init:
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001617 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001618 lwz r8, GOT(_end_of_vectors)
1619
wdenk4e112c12003-06-03 23:54:09 +00001620 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001621
1622 cmplw 0, r7, r8
1623 bgelr /* return if r7>=r8 - just in case */
1624
1625 mflr r4 /* save link register */
16261:
1627 lwz r0, 0(r7)
1628 stw r0, 0(r9)
1629 addi r7, r7, 4
1630 addi r9, r9, 4
1631 cmplw 0, r7, r8
1632 bne 1b
1633
1634 /*
1635 * relocate `hdlr' and `int_return' entries
1636 */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001637 li r7, .L_MachineCheck - _start + _START_OFFSET
1638 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000016392:
1640 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001641 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001642 cmplw 0, r7, r8
1643 blt 2b
1644
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001645 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001646 bl trap_reloc
1647
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001648 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001649 bl trap_reloc
1650
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001651#ifdef CONFIG_440
1652 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001653 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001654
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001655 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001656 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001657
1658 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001659 bl trap_reloc
Stefan Roese80d99a42007-06-19 16:42:31 +02001660
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001661 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1662 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001663
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001664 li r7, .L_DataTLBError - _start + _START_OFFSET
1665 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001666#else /* CONFIG_440 */
1667 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001668 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001669
1670 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001671 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001672
1673 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001674 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001675#endif /* CONFIG_440 */
1676
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001677 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1678 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001679
Stefan Roese42fbddd2006-09-07 11:51:23 +02001680#if !defined(CONFIG_440)
Stefan Roese7b12aa82006-03-13 09:42:28 +01001681 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1682 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1683 mtmsr r7 /* change MSR */
1684#else
Stefan Roese42fbddd2006-09-07 11:51:23 +02001685 bl __440_msr_set
1686 b __440_msr_continue
Stefan Roese7b12aa82006-03-13 09:42:28 +01001687
Stefan Roese42fbddd2006-09-07 11:51:23 +02001688__440_msr_set:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001689 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1690 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1691 mtspr srr1,r7
1692 mflr r7
1693 mtspr srr0,r7
1694 rfi
Stefan Roese42fbddd2006-09-07 11:51:23 +02001695__440_msr_continue:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001696#endif
1697
wdenk0442ed82002-11-03 10:24:00 +00001698 mtlr r4 /* restore link register */
1699 blr
1700
1701 /*
1702 * Function: relocate entries for one exception vector
1703 */
1704trap_reloc:
1705 lwz r0, 0(r7) /* hdlr ... */
1706 add r0, r0, r3 /* ... += dest_addr */
1707 stw r0, 0(r7)
1708
1709 lwz r0, 4(r7) /* int_return ... */
1710 add r0, r0, r3 /* ... += dest_addr */
1711 stw r0, 4(r7)
1712
1713 blr
Stefan Roese42743512007-06-01 15:27:11 +02001714
1715#if defined(CONFIG_440)
1716/*----------------------------------------------------------------------------+
1717| dcbz_area.
1718+----------------------------------------------------------------------------*/
1719 function_prolog(dcbz_area)
1720 rlwinm. r5,r4,0,27,31
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001721 rlwinm r5,r4,27,5,31
1722 beq ..d_ra2
1723 addi r5,r5,0x0001
1724..d_ra2:mtctr r5
1725..d_ag2:dcbz r0,r3
1726 addi r3,r3,32
1727 bdnz ..d_ag2
Stefan Roese42743512007-06-01 15:27:11 +02001728 sync
1729 blr
1730 function_epilog(dcbz_area)
Stefan Roese42743512007-06-01 15:27:11 +02001731#endif /* CONFIG_440 */
Stefan Roese42fbddd2006-09-07 11:51:23 +02001732#endif /* CONFIG_NAND_SPL */
stroese434979e2003-05-23 11:18:02 +00001733
Stefan Roese42743512007-06-01 15:27:11 +02001734/*------------------------------------------------------------------------------- */
1735/* Function: in8 */
1736/* Description: Input 8 bits */
1737/*------------------------------------------------------------------------------- */
1738 .globl in8
1739in8:
1740 lbz r3,0x0000(r3)
1741 blr
1742
1743/*------------------------------------------------------------------------------- */
1744/* Function: out8 */
1745/* Description: Output 8 bits */
1746/*------------------------------------------------------------------------------- */
1747 .globl out8
1748out8:
1749 stb r4,0x0000(r3)
1750 blr
1751
1752/*------------------------------------------------------------------------------- */
1753/* Function: out32 */
1754/* Description: Output 32 bits */
1755/*------------------------------------------------------------------------------- */
1756 .globl out32
1757out32:
1758 stw r4,0x0000(r3)
1759 blr
1760
1761/*------------------------------------------------------------------------------- */
1762/* Function: in32 */
1763/* Description: Input 32 bits */
1764/*------------------------------------------------------------------------------- */
1765 .globl in32
1766in32:
1767 lwz 3,0x0000(3)
1768 blr
stroese434979e2003-05-23 11:18:02 +00001769
1770/**************************************************************************/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001771/* PPC405EP specific stuff */
stroese434979e2003-05-23 11:18:02 +00001772/**************************************************************************/
1773#ifdef CONFIG_405EP
1774ppc405ep_init:
stroese5ad6d4d2003-12-09 14:54:43 +00001775
Stefan Roese326c9712005-08-01 16:41:48 +02001776#ifdef CONFIG_BUBINGA
stroese5ad6d4d2003-12-09 14:54:43 +00001777 /*
1778 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1779 * function) to support FPGA and NVRAM accesses below.
1780 */
1781
1782 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1783 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001784 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1785 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroese5ad6d4d2003-12-09 14:54:43 +00001786 stw r4,0(r3)
1787 lis r3,GPIO0_OSRL@h
1788 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001789 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1790 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroese5ad6d4d2003-12-09 14:54:43 +00001791 stw r4,0(r3)
1792
1793 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1794 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001795 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1796 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroese5ad6d4d2003-12-09 14:54:43 +00001797 stw r4,0(r3)
1798 lis r3,GPIO0_ISR1L@h
1799 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001800 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1801 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroese5ad6d4d2003-12-09 14:54:43 +00001802 stw r4,0(r3)
1803
1804 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1805 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001806 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1807 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroese5ad6d4d2003-12-09 14:54:43 +00001808 stw r4,0(r3)
1809 lis r3,GPIO0_TSRL@h
1810 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001811 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1812 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroese5ad6d4d2003-12-09 14:54:43 +00001813 stw r4,0(r3)
1814
1815 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1816 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001817 lis r4,CONFIG_SYS_GPIO0_TCR@h
1818 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroese5ad6d4d2003-12-09 14:54:43 +00001819 stw r4,0(r3)
1820
1821 li r3,pb1ap /* program EBC bank 1 for RTC access */
1822 mtdcr ebccfga,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001823 lis r3,CONFIG_SYS_EBC_PB1AP@h
1824 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
stroese5ad6d4d2003-12-09 14:54:43 +00001825 mtdcr ebccfgd,r3
1826 li r3,pb1cr
1827 mtdcr ebccfga,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001828 lis r3,CONFIG_SYS_EBC_PB1CR@h
1829 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
stroese5ad6d4d2003-12-09 14:54:43 +00001830 mtdcr ebccfgd,r3
1831
1832 li r3,pb1ap /* program EBC bank 1 for RTC access */
1833 mtdcr ebccfga,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001834 lis r3,CONFIG_SYS_EBC_PB1AP@h
1835 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
stroese5ad6d4d2003-12-09 14:54:43 +00001836 mtdcr ebccfgd,r3
1837 li r3,pb1cr
1838 mtdcr ebccfga,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001839 lis r3,CONFIG_SYS_EBC_PB1CR@h
1840 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
stroese5ad6d4d2003-12-09 14:54:43 +00001841 mtdcr ebccfgd,r3
1842
1843 li r3,pb4ap /* program EBC bank 4 for FPGA access */
1844 mtdcr ebccfga,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001845 lis r3,CONFIG_SYS_EBC_PB4AP@h
1846 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
stroese5ad6d4d2003-12-09 14:54:43 +00001847 mtdcr ebccfgd,r3
1848 li r3,pb4cr
1849 mtdcr ebccfga,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001850 lis r3,CONFIG_SYS_EBC_PB4CR@h
1851 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
stroese5ad6d4d2003-12-09 14:54:43 +00001852 mtdcr ebccfgd,r3
1853#endif
stroese434979e2003-05-23 11:18:02 +00001854
wdenk57b2d802003-06-27 21:31:46 +00001855 /*
1856 !-----------------------------------------------------------------------
1857 ! Check to see if chip is in bypass mode.
1858 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1859 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001860 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1861 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk57b2d802003-06-27 21:31:46 +00001862 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001863 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001864 mfdcr r5, CPC0_PLLMR1
Wolfgang Denka1be4762008-05-20 16:00:29 +02001865 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001866 cmpi cr0,0,r4,0x1
stroese434979e2003-05-23 11:18:02 +00001867
Wolfgang Denka1be4762008-05-20 16:00:29 +02001868 beq pll_done /* if SSCS =b'1' then PLL has */
1869 /* already been set */
1870 /* and CPU has been reset */
1871 /* so skip to next section */
stroese434979e2003-05-23 11:18:02 +00001872
Stefan Roese326c9712005-08-01 16:41:48 +02001873#ifdef CONFIG_BUBINGA
stroese434979e2003-05-23 11:18:02 +00001874 /*
wdenk57b2d802003-06-27 21:31:46 +00001875 !-----------------------------------------------------------------------
1876 ! Read NVRAM to get value to write in PLLMR.
1877 ! If value has not been correctly saved, write default value
1878 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1879 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1880 !
1881 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001882 ! structure in openbios.h. Changing the beginning of
1883 ! the structure will break this code.
wdenk57b2d802003-06-27 21:31:46 +00001884 !
1885 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001886 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001887 addis r3,0,NVRAM_BASE@h
1888 addi r3,r3,NVRAM_BASE@l
stroese434979e2003-05-23 11:18:02 +00001889
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001890 lwz r4, 0(r3)
1891 addis r5,0,NVRVFY1@h
1892 addi r5,r5,NVRVFY1@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001893 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001894 bne ..no_pllset
1895 addi r3,r3,4
1896 lwz r4, 0(r3)
1897 addis r5,0,NVRVFY2@h
1898 addi r5,r5,NVRVFY2@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001899 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001900 bne ..no_pllset
1901 addi r3,r3,8 /* Skip over conf_size */
1902 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1903 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1904 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1905 cmpi cr0,0,r5,1 /* See if PLL is locked */
1906 beq pll_write
stroese434979e2003-05-23 11:18:02 +00001907..no_pllset:
Stefan Roese326c9712005-08-01 16:41:48 +02001908#endif /* CONFIG_BUBINGA */
stroese434979e2003-05-23 11:18:02 +00001909
John Otken9aa36772007-07-26 17:49:11 +02001910#ifdef CONFIG_TAIHU
1911 mfdcr r4, CPC0_BOOT
1912 andi. r5, r4, CPC0_BOOT_SEP@l
1913 bne strap_1 /* serial eeprom present */
1914 addis r5,0,CPLD_REG0_ADDR@h
1915 ori r5,r5,CPLD_REG0_ADDR@l
1916 andi. r5, r5, 0x10
1917 bne _pci_66mhz
1918#endif /* CONFIG_TAIHU */
1919
Stefan Roesea5d182e2007-08-14 14:44:41 +02001920#if defined(CONFIG_ZEUS)
1921 mfdcr r4, CPC0_BOOT
1922 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001923 bne strap_1 /* serial eeprom present */
Stefan Roesea5d182e2007-08-14 14:44:41 +02001924 lis r3,0x0000
1925 addi r3,r3,0x3030
1926 lis r4,0x8042
1927 addi r4,r4,0x223e
1928 b 1f
1929strap_1:
1930 mfdcr r3, CPC0_PLLMR0
1931 mfdcr r4, CPC0_PLLMR1
1932 b 1f
1933#endif
1934
Wolfgang Denka1be4762008-05-20 16:00:29 +02001935 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1936 ori r3,r3,PLLMR0_DEFAULT@l /* */
1937 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1938 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroese434979e2003-05-23 11:18:02 +00001939
John Otken9aa36772007-07-26 17:49:11 +02001940#ifdef CONFIG_TAIHU
1941 b 1f
1942_pci_66mhz:
1943 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1944 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1945 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1946 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1947 b 1f
1948strap_1:
1949 mfdcr r3, CPC0_PLLMR0
1950 mfdcr r4, CPC0_PLLMR1
John Otken9aa36772007-07-26 17:49:11 +02001951#endif /* CONFIG_TAIHU */
1952
Stefan Roesea5d182e2007-08-14 14:44:41 +020019531:
Wolfgang Denka1be4762008-05-20 16:00:29 +02001954 b pll_write /* Write the CPC0_PLLMR with new value */
stroese434979e2003-05-23 11:18:02 +00001955
1956pll_done:
wdenk57b2d802003-06-27 21:31:46 +00001957 /*
1958 !-----------------------------------------------------------------------
1959 ! Clear Soft Reset Register
1960 ! This is needed to enable PCI if not booting from serial EPROM
1961 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001962 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001963 addi r3, 0, 0x0
1964 mtdcr CPC0_SRR, r3
stroese434979e2003-05-23 11:18:02 +00001965
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001966 addis r3,0,0x0010
1967 mtctr r3
stroese434979e2003-05-23 11:18:02 +00001968pci_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001969 bdnz pci_wait
stroese434979e2003-05-23 11:18:02 +00001970
Wolfgang Denka1be4762008-05-20 16:00:29 +02001971 blr /* return to main code */
stroese434979e2003-05-23 11:18:02 +00001972
1973/*
1974!-----------------------------------------------------------------------------
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001975! Function: pll_write
1976! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1977! That is:
1978! 1. Pll is first disabled (de-activated by putting in bypass mode)
1979! 2. PLL is reset
1980! 3. Clock dividers are set while PLL is held in reset and bypassed
1981! 4. PLL Reset is cleared
1982! 5. Wait 100us for PLL to lock
1983! 6. A core reset is performed
stroese434979e2003-05-23 11:18:02 +00001984! Input: r3 = Value to write to CPC0_PLLMR0
1985! Input: r4 = Value to write to CPC0_PLLMR1
1986! Output r3 = none
1987!-----------------------------------------------------------------------------
1988*/
1989pll_write:
wdenk57b2d802003-06-27 21:31:46 +00001990 mfdcr r5, CPC0_UCR
1991 andis. r5,r5,0xFFFF
Wolfgang Denka1be4762008-05-20 16:00:29 +02001992 ori r5,r5,0x0101 /* Stop the UART clocks */
1993 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroese434979e2003-05-23 11:18:02 +00001994
wdenk57b2d802003-06-27 21:31:46 +00001995 mfdcr r5, CPC0_PLLMR1
Wolfgang Denka1be4762008-05-20 16:00:29 +02001996 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001997 mtdcr CPC0_PLLMR1,r5
Wolfgang Denka1be4762008-05-20 16:00:29 +02001998 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001999 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00002000
Wolfgang Denka1be4762008-05-20 16:00:29 +02002001 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
2002 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
2003 oris r5,r5,0x4000 /* Set PLL Reset */
2004 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
2005 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002006 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00002007
2008 /*
wdenk57b2d802003-06-27 21:31:46 +00002009 ! Wait min of 100us for PLL to lock.
2010 ! See CMOS 27E databook for more info.
2011 ! At 200MHz, that means waiting 20,000 instructions
stroese434979e2003-05-23 11:18:02 +00002012 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002013 addi r3,0,20000 /* 2000 = 0x4e20 */
2014 mtctr r3
stroese434979e2003-05-23 11:18:02 +00002015pll_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002016 bdnz pll_wait
stroese434979e2003-05-23 11:18:02 +00002017
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02002018 oris r5,r5,0x8000 /* Enable PLL */
2019 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroese434979e2003-05-23 11:18:02 +00002020
wdenk57b2d802003-06-27 21:31:46 +00002021 /*
2022 * Reset CPU to guarantee timings are OK
2023 * Not sure if this is needed...
2024 */
2025 addis r3,0,0x1000
Wolfgang Denka1be4762008-05-20 16:00:29 +02002026 mtspr dbcr0,r3 /* This will cause a CPU core reset, and */
2027 /* execution will continue from the poweron */
2028 /* vector of 0xfffffffc */
stroese434979e2003-05-23 11:18:02 +00002029#endif /* CONFIG_405EP */
Stefan Roesea8856e32007-02-20 10:57:08 +01002030
2031#if defined(CONFIG_440)
Stefan Roesea8856e32007-02-20 10:57:08 +01002032/*----------------------------------------------------------------------------+
2033| mttlb3.
2034+----------------------------------------------------------------------------*/
2035 function_prolog(mttlb3)
2036 TLBWE(4,3,2)
2037 blr
2038 function_epilog(mttlb3)
2039
2040/*----------------------------------------------------------------------------+
2041| mftlb3.
2042+----------------------------------------------------------------------------*/
2043 function_prolog(mftlb3)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002044 TLBRE(3,3,2)
Stefan Roesea8856e32007-02-20 10:57:08 +01002045 blr
2046 function_epilog(mftlb3)
2047
2048/*----------------------------------------------------------------------------+
2049| mttlb2.
2050+----------------------------------------------------------------------------*/
2051 function_prolog(mttlb2)
2052 TLBWE(4,3,1)
2053 blr
2054 function_epilog(mttlb2)
2055
2056/*----------------------------------------------------------------------------+
2057| mftlb2.
2058+----------------------------------------------------------------------------*/
2059 function_prolog(mftlb2)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002060 TLBRE(3,3,1)
Stefan Roesea8856e32007-02-20 10:57:08 +01002061 blr
2062 function_epilog(mftlb2)
2063
2064/*----------------------------------------------------------------------------+
2065| mttlb1.
2066+----------------------------------------------------------------------------*/
2067 function_prolog(mttlb1)
2068 TLBWE(4,3,0)
2069 blr
2070 function_epilog(mttlb1)
2071
2072/*----------------------------------------------------------------------------+
2073| mftlb1.
2074+----------------------------------------------------------------------------*/
2075 function_prolog(mftlb1)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002076 TLBRE(3,3,0)
Stefan Roesea8856e32007-02-20 10:57:08 +01002077 blr
2078 function_epilog(mftlb1)
2079#endif /* CONFIG_440 */
Stefan Roese7d72e022008-06-02 14:35:44 +02002080
2081#if defined(CONFIG_NAND_SPL)
2082/*
2083 * void nand_boot_relocate(dst, src, bytes)
2084 *
2085 * r3 = Destination address to copy code to (in SDRAM)
2086 * r4 = Source address to copy code from
2087 * r5 = size to copy in bytes
2088 */
2089nand_boot_relocate:
2090 mr r6,r3
2091 mr r7,r4
2092 mflr r8
2093
2094 /*
2095 * Copy SPL from icache into SDRAM
2096 */
2097 subi r3,r3,4
2098 subi r4,r4,4
2099 srwi r5,r5,2
2100 mtctr r5
2101..spl_loop:
2102 lwzu r0,4(r4)
2103 stwu r0,4(r3)
2104 bdnz ..spl_loop
2105
2106 /*
2107 * Calculate "corrected" link register, so that we "continue"
2108 * in execution in destination range
2109 */
2110 sub r3,r7,r6 /* r3 = src - dst */
2111 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2112 mtlr r8
2113 blr
2114
2115nand_boot_common:
2116 /*
2117 * First initialize SDRAM. It has to be available *before* calling
2118 * nand_boot().
2119 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02002120 lis r3,CONFIG_SYS_SDRAM_BASE@h
2121 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
Stefan Roese7d72e022008-06-02 14:35:44 +02002122 bl initdram
2123
2124 /*
2125 * Now copy the 4k SPL code into SDRAM and continue execution
2126 * from there.
2127 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02002128 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2129 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2130 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2131 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2132 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2133 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
Stefan Roese7d72e022008-06-02 14:35:44 +02002134 bl nand_boot_relocate
2135
2136 /*
2137 * We're running from SDRAM now!!!
2138 *
2139 * It is necessary for 4xx systems to relocate from running at
2140 * the original location (0xfffffxxx) to somewhere else (SDRAM
2141 * preferably). This is because CS0 needs to be reconfigured for
2142 * NAND access. And we can't reconfigure this CS when currently
2143 * "running" from it.
2144 */
2145
2146 /*
2147 * Finally call nand_boot() to load main NAND U-Boot image from
2148 * NAND and jump to it.
2149 */
2150 bl nand_boot /* will not return */
2151#endif /* CONFIG_NAND_SPL */