blob: 11b55d5a56e4ba44ebe527eacae162cbe5a818a5 [file] [log] [blame]
wdenk0442ed82002-11-03 10:24:00 +00001/*
2 * Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
3 * Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
4 * Copyright (C) 2000,2001,2002 Wolfgang Denk <wd@denx.de>
Stefan Roese3cb86f32007-03-24 15:45:34 +01005 * Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
Grant Ericksonc821b5f2008-05-22 14:44:14 -07006 * Copyright (c) 2008 Nuovation System Designs, LLC
7 * Grant Erickson <gerickson@nuovations.com>
wdenk0442ed82002-11-03 10:24:00 +00008 *
Wolfgang Denk1b387ef2013-09-17 11:24:06 +02009 * SPDX-License-Identifier: GPL-2.0 IBM-pibs
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +020010 */
wdenk0442ed82002-11-03 10:24:00 +000011
Stefan Roesef7b548a2010-11-26 15:43:17 +010012/*
13 * Startup code for IBM/AMCC PowerPC 4xx (PPC4xx) based boards
wdenk0442ed82002-11-03 10:24:00 +000014 *
Stefan Roesef7b548a2010-11-26 15:43:17 +010015 * The following description only applies to the NOR flash style booting.
16 * NAND booting is different. For more details about NAND booting on 4xx
17 * take a look at doc/README.nand-boot-ppc440.
wdenk0442ed82002-11-03 10:24:00 +000018 *
Stefan Roesef7b548a2010-11-26 15:43:17 +010019 * The CPU starts at address 0xfffffffc (last word in the address space).
20 * The U-Boot image therefore has to be located in the "upper" area of the
21 * flash (e.g. 512MiB - 0xfff80000 ... 0xffffffff). The default value for
22 * the boot chip-select (CS0) is quite big and covers this area. On the
23 * 405EX this is for example 0xffe00000 ... 0xffffffff. U-Boot will
24 * reconfigure this CS0 (and other chip-selects as well when configured
25 * this way) in the boot process to the "correct" values matching the
26 * board layout.
wdenk0442ed82002-11-03 10:24:00 +000027 */
Stefan Roesef7b548a2010-11-26 15:43:17 +010028
Wolfgang Denk25ddd1f2010-10-26 14:34:52 +020029#include <asm-offsets.h>
wdenk0442ed82002-11-03 10:24:00 +000030#include <config.h>
Stefan Roeseb36df562010-09-09 19:18:00 +020031#include <asm/ppc4xx.h>
wdenk0442ed82002-11-03 10:24:00 +000032#include <version.h>
33
wdenk0442ed82002-11-03 10:24:00 +000034#include <ppc_asm.tmpl>
35#include <ppc_defs.h>
36
37#include <asm/cache.h>
38#include <asm/mmu.h>
Dave Mitchellb14ca4b2008-11-20 14:00:49 -060039#include <asm/ppc4xx-isram.h>
wdenk0442ed82002-11-03 10:24:00 +000040
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020041#ifdef CONFIG_SYS_INIT_DCACHE_CS
42# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
Stefan Roesed1c3b272009-09-09 16:25:29 +020043# define PBxAP PB1AP
44# define PBxCR PB0CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020045# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
46# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
47# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070048# endif
wdenk0442ed82002-11-03 10:24:00 +000049# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020050# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
Stefan Roesed1c3b272009-09-09 16:25:29 +020051# define PBxAP PB1AP
52# define PBxCR PB1CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020053# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
54# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
55# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070056# endif
wdenk0442ed82002-11-03 10:24:00 +000057# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020058# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
Stefan Roesed1c3b272009-09-09 16:25:29 +020059# define PBxAP PB2AP
60# define PBxCR PB2CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020061# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
62# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
63# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070064# endif
wdenk0442ed82002-11-03 10:24:00 +000065# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020066# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
Stefan Roesed1c3b272009-09-09 16:25:29 +020067# define PBxAP PB3AP
68# define PBxCR PB3CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020069# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
70# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
71# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070072# endif
wdenk0442ed82002-11-03 10:24:00 +000073# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020074# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
Stefan Roesed1c3b272009-09-09 16:25:29 +020075# define PBxAP PB4AP
76# define PBxCR PB4CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020077# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
78# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
79# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070080# endif
wdenk0442ed82002-11-03 10:24:00 +000081# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020082# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
Stefan Roesed1c3b272009-09-09 16:25:29 +020083# define PBxAP PB5AP
84# define PBxCR PB5CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020085# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
86# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
87# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070088# endif
wdenk0442ed82002-11-03 10:24:00 +000089# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020090# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
Stefan Roesed1c3b272009-09-09 16:25:29 +020091# define PBxAP PB6AP
92# define PBxCR PB6CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020093# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
94# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
95# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -070096# endif
wdenk0442ed82002-11-03 10:24:00 +000097# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020098# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
Stefan Roesed1c3b272009-09-09 16:25:29 +020099# define PBxAP PB7AP
100# define PBxCR PB7CR
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200101# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
102# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
103# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700104# endif
105# endif
106# ifndef PBxAP_VAL
107# define PBxAP_VAL 0
108# endif
109# ifndef PBxCR_VAL
110# define PBxCR_VAL 0
111# endif
112/*
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200113 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700114 * used as temporary stack pointer for the primordial stack
115 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200116# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
117# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700118 EBC_BXAP_TWT_ENCODE(7) | \
119 EBC_BXAP_BCE_DISABLE | \
120 EBC_BXAP_BCT_2TRANS | \
121 EBC_BXAP_CSN_ENCODE(0) | \
122 EBC_BXAP_OEN_ENCODE(0) | \
123 EBC_BXAP_WBN_ENCODE(0) | \
124 EBC_BXAP_WBF_ENCODE(0) | \
125 EBC_BXAP_TH_ENCODE(2) | \
126 EBC_BXAP_RE_DISABLED | \
127 EBC_BXAP_SOR_NONDELAYED | \
128 EBC_BXAP_BEM_WRITEONLY | \
129 EBC_BXAP_PEN_DISABLED)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200130# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
131# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
132# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700133 EBC_BXCR_BS_64MB | \
134 EBC_BXCR_BU_RW | \
135 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200136# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
137# ifndef CONFIG_SYS_INIT_RAM_PATTERN
138# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
wdenk0442ed82002-11-03 10:24:00 +0000139# endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200140#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000141
Wolfgang Denk553f0982010-10-26 13:32:32 +0200142#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_SIZE > (4 << 10)))
143#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_SIZE!
Stefan Roese28d77d92008-01-30 14:48:28 +0100144#endif
145
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700146/*
147 * Unless otherwise overriden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200148 * at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
149 * NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700150 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200151#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese64852d02008-06-02 14:35:44 +0200152/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200153# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese64852d02008-06-02 14:35:44 +0200154#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200155#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
156# define CONFIG_SYS_ICACHE_SACR_VALUE \
157 (PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
158 PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
159 PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
160#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700161
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200162#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
163# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700164 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200165#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700166
Stefan Roese4978e602010-05-27 16:45:20 +0200167#if !defined(CONFIG_SYS_TLB_FOR_BOOT_FLASH)
168#define CONFIG_SYS_TLB_FOR_BOOT_FLASH 0 /* use TLB 0 as default */
169#endif
170
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200171#define function_prolog(func_name) .text; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200172 .align 2; \
173 .globl func_name; \
174 func_name:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200175#define function_epilog(func_name) .type func_name,@function; \
Stefan Roesecf959c72007-06-01 15:27:11 +0200176 .size func_name,.-func_name
177
wdenk0442ed82002-11-03 10:24:00 +0000178/* We don't want the MMU yet.
179*/
180#undef MSR_KERNEL
181#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
182
183
184 .extern ext_bus_cntlr_init
wdenk0442ed82002-11-03 10:24:00 +0000185
186/*
187 * Set up GOT: Global Offset Table
188 *
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +0100189 * Use r12 to access the GOT
wdenk0442ed82002-11-03 10:24:00 +0000190 */
Stefan Roese345b77b2014-03-04 15:34:35 +0100191#if !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +0000192 START_GOT
193 GOT_ENTRY(_GOT2_TABLE_)
194 GOT_ENTRY(_FIXUP_TABLE_)
195
196 GOT_ENTRY(_start)
197 GOT_ENTRY(_start_of_vectors)
198 GOT_ENTRY(_end_of_vectors)
199 GOT_ENTRY(transfer_to_handler)
200
wdenk3b57fe02003-05-30 12:48:29 +0000201 GOT_ENTRY(__init_end)
Simon Glass3929fb02013-03-14 06:54:53 +0000202 GOT_ENTRY(__bss_end)
wdenk5d232d02003-05-22 22:52:13 +0000203 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000204 END_GOT
Stefan Roese345b77b2014-03-04 15:34:35 +0100205#endif /* CONFIG_SPL_BUILD */
wdenk0442ed82002-11-03 10:24:00 +0000206
Ricardo Ribalda Delgadod20b9992010-12-07 14:27:56 +0100207#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_BOOT_FROM_XMD)
Stefan Roesed8731332009-05-11 13:46:14 +0200208 /*
209 * 4xx RAM-booting U-Boot image is started from offset 0
210 */
211 .text
212 bl _start_440
213#endif
214
Stefan Roese98f99e92013-04-02 10:37:04 +0200215#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
216 /*
217 * This is the entry of the real U-Boot from a board port
218 * that supports SPL booting on the PPC4xx. We only need
219 * to call board_init_f() here. Everything else has already
220 * been done in the SPL u-boot version.
221 */
222 GET_GOT /* initialize GOT access */
223 bl board_init_f /* run 1st part of board init code (in Flash)*/
224 /* NOTREACHED - board_init_f() does not return */
225#endif
226
wdenk0442ed82002-11-03 10:24:00 +0000227/*
228 * 440 Startup -- on reset only the top 4k of the effective
229 * address space is mapped in by an entry in the instruction
230 * and data shadow TLB. The .bootpg section is located in the
231 * top 4k & does only what's necessary to map in the the rest
232 * of the boot rom. Once the boot rom is mapped in we can
233 * proceed with normal startup.
234 *
235 * NOTE: CS0 only covers the top 2MB of the effective address
236 * space after reset.
237 */
238
239#if defined(CONFIG_440)
240 .section .bootpg,"ax"
241 .globl _start_440
242
243/**************************************************************************/
244_start_440:
Wolfgang Denk511d0c72006-10-09 00:42:01 +0200245 /*--------------------------------------------------------------------+
246 | 440EPX BUP Change - Hardware team request
247 +--------------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +0200248#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
249 sync
250 nop
251 nop
252#endif
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200253 /*----------------------------------------------------------------+
254 | Core bug fix. Clear the esr
255 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200256 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200257 mtspr SPRN_ESR,r0
wdenk0442ed82002-11-03 10:24:00 +0000258 /*----------------------------------------------------------------*/
259 /* Clear and set up some registers. */
260 /*----------------------------------------------------------------*/
Wolfgang Denkf901a832005-08-06 01:42:58 +0200261 iccci r0,r0 /* NOTE: operands not used for 440 */
262 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000263 sync
264 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200265 mtspr SPRN_SRR0,r0
266 mtspr SPRN_SRR1,r0
267 mtspr SPRN_CSRR0,r0
268 mtspr SPRN_CSRR1,r0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200269 /* NOTE: 440GX adds machine check status regs */
270#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200271 mtspr SPRN_MCSRR0,r0
272 mtspr SPRN_MCSRR1,r0
273 mfspr r1,SPRN_MCSR
274 mtspr SPRN_MCSR,r1
wdenkba56f622004-02-06 23:19:44 +0000275#endif
Stefan Roese20532832006-11-22 13:20:50 +0100276
277 /*----------------------------------------------------------------*/
278 /* CCR0 init */
279 /*----------------------------------------------------------------*/
280 /* Disable store gathering & broadcast, guarantee inst/data
281 * cache block touch, force load/store alignment
282 * (see errata 1.12: 440_33)
283 */
284 lis r1,0x0030 /* store gathering & broadcast disable */
285 ori r1,r1,0x6000 /* cache touch */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200286 mtspr SPRN_CCR0,r1
Stefan Roese20532832006-11-22 13:20:50 +0100287
wdenk0442ed82002-11-03 10:24:00 +0000288 /*----------------------------------------------------------------*/
289 /* Initialize debug */
290 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200291 mfspr r1,SPRN_DBCR0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200292 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
293 bne skip_debug_init /* if set, don't clear debug register */
Victor Gallardoad876ff2010-09-16 11:32:04 -0700294 mfspr r1,SPRN_CCR0
295 ori r1,r1,CCR0_DTB@l /* Disable Trace Broadcast */
296 mtspr SPRN_CCR0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200297 mtspr SPRN_DBCR0,r0
298 mtspr SPRN_DBCR1,r0
299 mtspr SPRN_DBCR2,r0
300 mtspr SPRN_IAC1,r0
301 mtspr SPRN_IAC2,r0
302 mtspr SPRN_IAC3,r0
303 mtspr SPRN_DAC1,r0
304 mtspr SPRN_DAC2,r0
305 mtspr SPRN_DVC1,r0
306 mtspr SPRN_DVC2,r0
wdenk0442ed82002-11-03 10:24:00 +0000307
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200308 mfspr r1,SPRN_DBSR
309 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200310skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000311
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200312#if defined (CONFIG_440SPE)
313 /*----------------------------------------------------------------+
314 | Initialize Core Configuration Reg1.
315 | a. ICDPEI: Record even parity. Normal operation.
316 | b. ICTPEI: Record even parity. Normal operation.
317 | c. DCTPEI: Record even parity. Normal operation.
318 | d. DCDPEI: Record even parity. Normal operation.
319 | e. DCUPEI: Record even parity. Normal operation.
320 | f. DCMPEI: Record even parity. Normal operation.
321 | g. FCOM: Normal operation
322 | h. MMUPEI: Record even parity. Normal operation.
323 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200324 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200325 +-----------------------------------------------------------------*/
Marian Balakowiczedd6cf22006-07-06 21:17:24 +0200326 li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200327 mtspr SPRN_CCR1, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200328
329 /*----------------------------------------------------------------+
330 | Reset the timebase.
331 | The previous write to CCR1 sets the timebase source.
332 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200333 mtspr SPRN_TBWL, r0
334 mtspr SPRN_TBWU, r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200335#endif
336
wdenk0442ed82002-11-03 10:24:00 +0000337 /*----------------------------------------------------------------*/
338 /* Setup interrupt vectors */
339 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200340 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200341 li r1,0x0100
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200342 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200343 li r1,0x0200
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200344 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200345 li r1,0x0300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200346 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200347 li r1,0x0400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200348 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000349 li r1,0x0500
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200350 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000351 li r1,0x0600
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200352 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000353 li r1,0x0700
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200354 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000355 li r1,0x0800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200356 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000357 li r1,0x0c00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200358 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200359 li r1,0x0a00
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200360 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200361 li r1,0x0900
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200362 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000363 li r1,0x1300
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200364 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200365 li r1,0x1400
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200366 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000367 li r1,0x2000
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200368 mtspr SPRN_IVOR15,r1 /* Debug */
wdenk0442ed82002-11-03 10:24:00 +0000369
370 /*----------------------------------------------------------------*/
371 /* Configure cache regions */
372 /*----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200373 mtspr SPRN_INV0,r0
374 mtspr SPRN_INV1,r0
375 mtspr SPRN_INV2,r0
376 mtspr SPRN_INV3,r0
377 mtspr SPRN_DNV0,r0
378 mtspr SPRN_DNV1,r0
379 mtspr SPRN_DNV2,r0
380 mtspr SPRN_DNV3,r0
381 mtspr SPRN_ITV0,r0
382 mtspr SPRN_ITV1,r0
383 mtspr SPRN_ITV2,r0
384 mtspr SPRN_ITV3,r0
385 mtspr SPRN_DTV0,r0
386 mtspr SPRN_DTV1,r0
387 mtspr SPRN_DTV2,r0
388 mtspr SPRN_DTV3,r0
wdenk0442ed82002-11-03 10:24:00 +0000389
390 /*----------------------------------------------------------------*/
391 /* Cache victim limits */
392 /*----------------------------------------------------------------*/
393 /* floors 0, ceiling max to use the entire cache -- nothing locked
394 */
395 lis r1,0x0001
396 ori r1,r1,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200397 mtspr SPRN_IVLIM,r1
398 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000399
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200400 /*----------------------------------------------------------------+
401 |Initialize MMUCR[STID] = 0.
402 +-----------------------------------------------------------------*/
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200403 mfspr r0,SPRN_MMUCR
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200404 addis r1,0,0xFFFF
405 ori r1,r1,0xFF00
406 and r0,r0,r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200407 mtspr SPRN_MMUCR,r0
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200408
wdenk0442ed82002-11-03 10:24:00 +0000409 /*----------------------------------------------------------------*/
410 /* Clear all TLB entries -- TID = 0, TS = 0 */
411 /*----------------------------------------------------------------*/
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200412 addis r0,0,0x0000
Stefan Roese0a371ca2009-07-14 15:53:08 +0200413#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesed8731332009-05-11 13:46:14 +0200414 li r4,0 /* Start with TLB #0 */
Stefan Roese0a371ca2009-07-14 15:53:08 +0200415#else
416 li r4,1 /* Start with TLB #1 */
417#endif
418 li r1,64 /* 64 TLB entries */
419 sub r1,r1,r4 /* calculate last TLB # */
420 mtctr r1
Stefan Roesed8731332009-05-11 13:46:14 +0200421rsttlb:
422#ifdef CONFIG_SYS_RAMBOOT
423 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
424 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
425 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
426#endif
427 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
428 tlbwe r0,r4,1
429 tlbwe r0,r4,2
430tlbnxt: addi r4,r4,1 /* Next TLB */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200431 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000432
433 /*----------------------------------------------------------------*/
434 /* TLB entry setup -- step thru tlbtab */
435 /*----------------------------------------------------------------*/
Stefan Roese2a72e9e2010-04-09 14:03:59 +0200436#if defined(CONFIG_440SPE_REVA)
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200437 /*----------------------------------------------------------------*/
438 /* We have different TLB tables for revA and rev B of 440SPe */
439 /*----------------------------------------------------------------*/
440 mfspr r1, PVR
441 lis r0,0x5342
442 ori r0,r0,0x1891
443 cmpw r7,r1,r0
444 bne r7,..revA
445 bl tlbtabB
446 b ..goon
447..revA:
448 bl tlbtabA
449..goon:
450#else
wdenk0442ed82002-11-03 10:24:00 +0000451 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200452#endif
wdenk0442ed82002-11-03 10:24:00 +0000453 mr r5,r0
454 li r1,0x003f /* 64 TLB entries max */
455 mtctr r1
456 li r4,0 /* TLB # */
457
458 addi r5,r5,-4
Stefan Roesed8731332009-05-11 13:46:14 +02004591:
460#ifdef CONFIG_SYS_RAMBOOT
461 tlbre r3,r4,0 /* Read contents from TLB word #0 */
462 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
463 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
464#endif
465 lwzu r0,4(r5)
wdenk0442ed82002-11-03 10:24:00 +0000466 cmpwi r0,0
467 beq 2f /* 0 marks end */
468 lwzu r1,4(r5)
469 lwzu r2,4(r5)
470 tlbwe r0,r4,0 /* TLB Word 0 */
471 tlbwe r1,r4,1 /* TLB Word 1 */
472 tlbwe r2,r4,2 /* TLB Word 2 */
Stefan Roesed8731332009-05-11 13:46:14 +0200473tlbnx2: addi r4,r4,1 /* Next TLB */
wdenk0442ed82002-11-03 10:24:00 +0000474 bdnz 1b
475
476 /*----------------------------------------------------------------*/
477 /* Continue from 'normal' start */
478 /*----------------------------------------------------------------*/
Stefan Roese887e2ec2006-09-07 11:51:23 +02004792:
Stefan Roese887e2ec2006-09-07 11:51:23 +0200480 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000481 b _start
482
4833: li r0,0
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200484 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
wdenk0442ed82002-11-03 10:24:00 +0000485 mflr r1
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200486 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000487 rfi
stroeseb867d702003-05-23 11:18:02 +0000488#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000489
490/*
491 * r3 - 1st arg to board_init(): IMMP pointer
492 * r4 - 2nd arg to board_init(): boot flag
493 */
Stefan Roese345b77b2014-03-04 15:34:35 +0100494#if !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +0000495 .text
496 .long 0x27051956 /* U-Boot Magic Number */
497 .globl version_string
498version_string:
Andreas Bießmann09c2e902011-07-18 20:24:04 +0200499 .ascii U_BOOT_VERSION_STRING, "\0"
wdenk0442ed82002-11-03 10:24:00 +0000500
wdenk0442ed82002-11-03 10:24:00 +0000501 . = EXC_OFF_SYS_RESET
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200502 .globl _start_of_vectors
503_start_of_vectors:
504
505/* Critical input. */
506 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
507
508#ifdef CONFIG_440
509/* Machine check */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200510 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200511#else
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200512 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200513#endif /* CONFIG_440 */
514
515/* Data Storage exception. */
516 STD_EXCEPTION(0x300, DataStorage, UnknownException)
517
518/* Instruction Storage exception. */
519 STD_EXCEPTION(0x400, InstStorage, UnknownException)
520
521/* External Interrupt exception. */
522 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
523
524/* Alignment exception. */
525 . = 0x600
526Alignment:
527 EXCEPTION_PROLOG(SRR0, SRR1)
528 mfspr r4,DAR
529 stw r4,_DAR(r21)
530 mfspr r5,DSISR
531 stw r5,_DSISR(r21)
532 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100533 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200534
535/* Program check exception */
536 . = 0x700
537ProgramCheck:
538 EXCEPTION_PROLOG(SRR0, SRR1)
539 addi r3,r1,STACK_FRAME_OVERHEAD
Joakim Tjernlundfc4e1882010-01-19 14:41:55 +0100540 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
541 MSR_KERNEL, COPY_EE)
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200542
543#ifdef CONFIG_440
544 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
545 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
546 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200547#endif
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +0200548 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
549
550#ifdef CONFIG_440
551 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
552 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
553#else
554 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
555 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
556 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
557#endif
558 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
559
560 .globl _end_of_vectors
561_end_of_vectors:
562 . = _START_OFFSET
Stefan Roese887e2ec2006-09-07 11:51:23 +0200563#endif
wdenk0442ed82002-11-03 10:24:00 +0000564 .globl _start
565_start:
566
Stefan Roese98f99e92013-04-02 10:37:04 +0200567#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
568 /*
569 * This is the entry of the real U-Boot from a board port
570 * that supports SPL booting on the PPC4xx. We only need
571 * to call board_init_f() here. Everything else has already
572 * been done in the SPL u-boot version.
573 */
574 GET_GOT /* initialize GOT access */
575 bl board_init_f /* run 1st part of board init code (in Flash)*/
576 /* NOTREACHED - board_init_f() does not return */
577#endif
578
wdenk0442ed82002-11-03 10:24:00 +0000579/*****************************************************************************/
580#if defined(CONFIG_440)
581
582 /*----------------------------------------------------------------*/
583 /* Clear and set up some registers. */
584 /*----------------------------------------------------------------*/
585 li r0,0x0000
586 lis r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200587 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
588 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
589 mtspr SPRN_TBWU,r0
590 mtspr SPRN_TSR,r1 /* clear all timer exception status */
591 mtspr SPRN_TCR,r0 /* disable all */
592 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
wdenk0442ed82002-11-03 10:24:00 +0000593 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000594
595 /*----------------------------------------------------------------*/
596 /* Debug setup -- some (not very good) ice's need an event*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200597 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
wdenk0442ed82002-11-03 10:24:00 +0000598 /* value you need in this case 0x8cff 0000 should do the trick */
599 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200600#if defined(CONFIG_SYS_INIT_DBCR)
wdenk0442ed82002-11-03 10:24:00 +0000601 lis r1,0xffff
602 ori r1,r1,0xffff
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200603 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200604 lis r0,CONFIG_SYS_INIT_DBCR@h
605 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200606 mtspr SPRN_DBCR0,r0
wdenk0442ed82002-11-03 10:24:00 +0000607 isync
608#endif
609
610 /*----------------------------------------------------------------*/
611 /* Setup the internal SRAM */
612 /*----------------------------------------------------------------*/
613 li r0,0
Stefan Roese887e2ec2006-09-07 11:51:23 +0200614
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200615#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesec157d8e2005-08-01 16:41:48 +0200616 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200617 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
618 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
Wolfgang Denk553f0982010-10-26 13:32:32 +0200619 addis r4,r0,CONFIG_SYS_INIT_RAM_SIZE@h
620 ori r4,r4,CONFIG_SYS_INIT_RAM_SIZE@l
Stefan Roesec157d8e2005-08-01 16:41:48 +0200621 rlwinm. r5,r4,0,27,31
Wolfgang Denkf901a832005-08-06 01:42:58 +0200622 rlwinm r5,r4,27,5,31
623 beq ..d_ran
624 addi r5,r5,0x0001
Stefan Roesec157d8e2005-08-01 16:41:48 +0200625..d_ran:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200626 mtctr r5
Stefan Roesec157d8e2005-08-01 16:41:48 +0200627..d_ag:
Wolfgang Denkf901a832005-08-06 01:42:58 +0200628 dcbz r0,r3
629 addi r3,r3,32
630 bdnz ..d_ag
Stefan Roesee02c5212008-01-09 10:23:16 +0100631
632 /*
633 * Lock the init-ram/stack in d-cache, so that other regions
634 * may use d-cache as well
635 * Note, that this current implementation locks exactly 4k
636 * of d-cache, so please make sure that you don't define a
637 * bigger init-ram area. Take a look at the lwmon5 440EPx
638 * implementation as a reference.
639 */
640 msync
641 isync
642 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
643 lis r1,0x0201
644 ori r1,r1,0xf808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200645 mtspr SPRN_DVLIM,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100646 lis r1,0x0808
647 ori r1,r1,0x0808
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200648 mtspr SPRN_DNV0,r1
649 mtspr SPRN_DNV1,r1
650 mtspr SPRN_DNV2,r1
651 mtspr SPRN_DNV3,r1
652 mtspr SPRN_DTV0,r1
653 mtspr SPRN_DTV1,r1
654 mtspr SPRN_DTV2,r1
655 mtspr SPRN_DTV3,r1
Stefan Roesee02c5212008-01-09 10:23:16 +0100656 msync
657 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200658#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200659
660 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
661#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
662 /* not all PPC's have internal SRAM usable as L2-cache */
Stefan Roese2801b2d2008-03-11 15:05:50 +0100663#if defined(CONFIG_440GX) || \
664 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan7d307932008-07-08 22:47:31 -0700665 defined(CONFIG_460SX)
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600666 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700667#elif defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
668 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600669 lis r1, 0x0000
670 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
671 mtdcr L2_CACHE_CFG,r1
wdenkba56f622004-02-06 23:19:44 +0000672#endif
wdenk0442ed82002-11-03 10:24:00 +0000673
Stefan Roese887e2ec2006-09-07 11:51:23 +0200674 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000675 ori r2,r2,0xffff
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600676 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000677 and r1,r1,r2 /* Disable parity check */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600678 mtdcr ISRAM0_DPC,r1
679 mfdcr r1,ISRAM0_PMEG
Stefan Roese887e2ec2006-09-07 11:51:23 +0200680 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600681 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000682
683 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100684#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenkba56f622004-02-06 23:19:44 +0000685 ori r1,r1,0x0980 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600686 mtdcr ISRAM0_SB0CR,r1
wdenkba56f622004-02-06 23:19:44 +0000687 lis r1,0x8001
688 ori r1,r1,0x0980 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600689 mtdcr ISRAM0_SB1CR,r1
wdenkba56f622004-02-06 23:19:44 +0000690 lis r1, 0x8002
691 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600692 mtdcr ISRAM0_SB2CR,r1
wdenkba56f622004-02-06 23:19:44 +0000693 lis r1, 0x8003
694 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600695 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700696#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || \
697 defined(CONFIG_460GT) || defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600698 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200699 ori r1,r1,0x0984 /* first 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600700 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200701 lis r1,0x0001
702 ori r1,r1,0x0984 /* second 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600703 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200704 lis r1, 0x0002
705 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600706 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200707 lis r1, 0x0003
708 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600709 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700710#if defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
711 defined(CONFIG_APM821XX)
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600712 lis r2,0x7fff
713 ori r2,r2,0xffff
714 mfdcr r1,ISRAM1_DPC
715 and r1,r1,r2 /* Disable parity check */
Wolfgang Denk455ae7e2008-12-16 01:02:17 +0100716 mtdcr ISRAM1_DPC,r1
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600717 mfdcr r1,ISRAM1_PMEG
718 and r1,r1,r2 /* Disable pwr mgmt */
719 mtdcr ISRAM1_PMEG,r1
720
721 lis r1,0x0004 /* BAS = 4_0004_0000 */
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700722 ori r1,r1,ISRAM1_SIZE /* ocm size */
Dave Mitchellddf45cc2008-11-20 14:09:50 -0600723 mtdcr ISRAM1_SB0CR,r1
724#endif
Feng Kan7d307932008-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 Mitchellb14ca4b2008-11-20 14:00:49 -0600728 mtdcr ISRAM0_SB0CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700729 lis r1,0x0001
730 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600731 mtdcr ISRAM0_SB1CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700732 lis r1, 0x0002
733 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600734 mtdcr ISRAM0_SB2CR,r1
Feng Kan7d307932008-07-08 22:47:31 -0700735 lis r1, 0x0003
736 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600737 mtdcr ISRAM0_SB3CR,r1
Stefan Roese887e2ec2006-09-07 11:51:23 +0200738#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000739 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchellb14ca4b2008-11-20 14:00:49 -0600740 mtdcr ISRAM0_SB0CR,r1
741 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
wdenkba56f622004-02-06 23:19:44 +0000742#endif
Stefan Roese887e2ec2006-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-VILLARD6d0f6bc2008-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) */
Wolfgang Denk8c4734e2011-04-20 22:11:21 +0200759
Stefan Roese98f99e92013-04-02 10:37:04 +0200760#ifndef CONFIG_SPL_BUILD
wdenk0442ed82002-11-03 10:24:00 +0000761 GET_GOT
Stefan Roese98f99e92013-04-02 10:37:04 +0200762#endif
Stefan Roese5568e612005-11-22 13:20:42 +0100763
764 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000765 bl board_init_f
Peter Tyser52ebd9c2010-09-14 19:13:53 -0500766 /* NOTREACHED - board_init_f() does not return */
wdenk0442ed82002-11-03 10:24:00 +0000767
768#endif /* CONFIG_440 */
769
770/*****************************************************************************/
Matthias Fuchs3fb85882013-08-07 12:10:38 +0200771#if defined(CONFIG_405GP) || \
Stefan Roesee01bd212007-03-21 13:38:59 +0100772 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200773 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000774 /*----------------------------------------------------------------------- */
775 /* Clear and set up some registers. */
776 /*----------------------------------------------------------------------- */
777 addi r4,r0,0x0000
Stefan Roesedbbd1252007-10-05 17:10:59 +0200778#if !defined(CONFIG_405EX)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200779 mtspr SPRN_SGR,r4
Stefan Roesedbbd1252007-10-05 17:10:59 +0200780#else
781 /*
782 * On 405EX, completely clearing the SGR leads to PPC hangup
783 * upon PCIe configuration access. The PCIe memory regions
784 * need to be guarded!
785 */
786 lis r3,0x0000
787 ori r3,r3,0x7FFC
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200788 mtspr SPRN_SGR,r3
Stefan Roesedbbd1252007-10-05 17:10:59 +0200789#endif
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200790 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000791 mtesr r4 /* clear Exception Syndrome Reg */
792 mttcr r4 /* clear Timer Control Reg */
793 mtxer r4 /* clear Fixed-Point Exception Reg */
794 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000795 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
796 /* dbsr is cleared by setting bits to 1) */
797 mtdbsr r4 /* clear/reset the dbsr */
798
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700799 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000800 bl invalidate_icache
801 bl invalidate_dcache
802
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700803 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200804 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
805 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700806 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000807 isync
808
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700809 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200810 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
811 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700812 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000813
Ricardo Ribalda Delgado1f4d5322008-10-21 18:29:46 +0200814#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
815 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000816 /*----------------------------------------------------------------------- */
817 /* Tune the speed and size for flash CS0 */
818 /*----------------------------------------------------------------------- */
819 bl ext_bus_cntlr_init
820#endif
Stefan Roese64852d02008-06-02 14:35:44 +0200821
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200822#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roesedbbd1252007-10-05 17:10:59 +0200823 /*
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700824 * For boards that don't have OCM and can't use the data cache
825 * for their primordial stack, setup stack here directly after the
826 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roesedbbd1252007-10-05 17:10:59 +0200827 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200828 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
829 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roesedbbd1252007-10-05 17:10:59 +0200830
831 li r0, 0 /* Make room for stack frame header and */
832 stwu r0, -4(r1) /* clear final stack frame so that */
833 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
834 /*
835 * Set up a dummy frame to store reset vector as return address.
836 * this causes stack underflow to reset board.
837 */
838 stwu r1, -8(r1) /* Save back chain and move SP */
839 lis r0, RESET_VECTOR@h /* Address of reset vector */
840 ori r0, r0, RESET_VECTOR@l
841 stwu r1, -8(r1) /* Save back chain and move SP */
842 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200843#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000844
stroeseb867d702003-05-23 11:18:02 +0000845#if defined(CONFIG_405EP)
846 /*----------------------------------------------------------------------- */
847 /* DMA Status, clear to come up clean */
848 /*----------------------------------------------------------------------- */
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200849 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denkf901a832005-08-06 01:42:58 +0200850 ori r3,r3, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200851 mtdcr DMASR, r3
stroeseb867d702003-05-23 11:18:02 +0000852
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200853 bl ppc405ep_init /* do ppc405ep specific init */
stroeseb867d702003-05-23 11:18:02 +0000854#endif /* CONFIG_405EP */
855
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200856#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roesee01bd212007-03-21 13:38:59 +0100857#if defined(CONFIG_405EZ)
858 /********************************************************************
859 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
860 *******************************************************************/
861 /*
862 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200863 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roesee01bd212007-03-21 13:38:59 +0100864 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200865 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
866 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesedf8a24c2007-06-19 16:42:31 +0200867 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200868 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +0100869 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200870 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roesee01bd212007-03-21 13:38:59 +0100871 isync
872
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200873 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
874 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200875 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200876 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
877 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roesee01bd212007-03-21 13:38:59 +0100878 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200879 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
880 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +0200881 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200882 mtdcr OCM0_DISDPC,r3
Stefan Roesee01bd212007-03-21 13:38:59 +0100883
884 isync
Stefan Roese3cb86f32007-03-24 15:45:34 +0100885#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000886 /********************************************************************
887 * Setup OCM - On Chip Memory
888 *******************************************************************/
889 /* Setup OCM */
wdenk8bde7f72003-06-27 21:31:46 +0000890 lis r0, 0x7FFF
891 ori r0, r0, 0xFFFF
Stefan Roesed1c3b272009-09-09 16:25:29 +0200892 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
893 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roese3cb86f32007-03-24 15:45:34 +0100894 and r3, r3, r0 /* disable data-side IRAM */
895 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200896 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
897 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk8bde7f72003-06-27 21:31:46 +0000898 isync
wdenk0442ed82002-11-03 10:24:00 +0000899
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200900 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
901 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200902 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +0000903 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200904 mtdcr OCM0_DSCNTL, r4
wdenk8bde7f72003-06-27 21:31:46 +0000905 isync
Stefan Roesee01bd212007-03-21 13:38:59 +0100906#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000907#endif
908
909 /*----------------------------------------------------------------------- */
910 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
911 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200912#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700913 li r4, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +0200914 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200915 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
916 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200917 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000918
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700919 addi r4, 0, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +0200920 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200921 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
922 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +0200923 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000924
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700925 /*
926 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200927 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700928 */
929 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200930 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
931 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +0000932 mtdccr r4
933
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700934 /*
935 * Preallocate data cache lines to be used to avoid a subsequent
936 * cache miss and an ensuing machine check exception when exceptions
937 * are enabled.
938 */
939 li r0, 0
wdenk0442ed82002-11-03 10:24:00 +0000940
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200941 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
942 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +0000943
Wolfgang Denk553f0982010-10-26 13:32:32 +0200944 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
945 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700946
947 /*
948 * Convert the size, in bytes, to the number of cache lines/blocks
949 * to preallocate.
950 */
951 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
952 srwi r5, r4, L1_CACHE_SHIFT
953 beq ..load_counter
954 addi r5, r5, 0x0001
955..load_counter:
956 mtctr r5
957
958 /* Preallocate the computed number of cache blocks. */
959..alloc_dcache_block:
960 dcba r0, r3
961 addi r3, r3, L1_CACHE_BYTES
962 bdnz ..alloc_dcache_block
963 sync
964
965 /*
966 * Load the initial stack pointer and data area and convert the size,
967 * in bytes, to the number of words to initialize to a known value.
968 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200969 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
970 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700971
Wolfgang Denk553f0982010-10-26 13:32:32 +0200972 lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h
973 ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +0000974 mtctr r4
975
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200976 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
Wolfgang Denk553f0982010-10-26 13:32:32 +0200977 ori r2, r2, CONFIG_SYS_INIT_RAM_SIZE@l
wdenk0442ed82002-11-03 10:24:00 +0000978
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200979 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
980 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +0000981
982..stackloop:
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700983 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +0000984 bdnz ..stackloop
985
Grant Ericksonc821b5f2008-05-22 14:44:14 -0700986 /*
987 * Make room for stack frame header and clear final stack frame so
988 * that stack backtraces terminate cleanly.
989 */
990 stwu r0, -4(r1)
991 stwu r0, -4(r1)
992
wdenk0442ed82002-11-03 10:24:00 +0000993 /*
994 * Set up a dummy frame to store reset vector as return address.
995 * this causes stack underflow to reset board.
996 */
997 stwu r1, -8(r1) /* Save back chain and move SP */
998 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
999 ori r0, r0, RESET_VECTOR@l
1000 stwu r1, -8(r1) /* Save back chain and move SP */
1001 stw r0, +12(r1) /* Save return addr (underflow vect) */
1002
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001003#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1004 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001005 /*
1006 * Stack in OCM.
1007 */
1008
1009 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001010 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1011 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001012
1013 /* Set up a zeroized stack frame so that backtrace works right */
1014 li r0, 0
1015 stwu r0, -4(r1)
1016 stwu r0, -4(r1)
1017
1018 /*
1019 * Set up a dummy frame to store reset vector as return address.
1020 * this causes stack underflow to reset board.
1021 */
1022 stwu r1, -8(r1) /* Save back chain and move SP */
1023 lis r0, RESET_VECTOR@h /* Address of reset vector */
1024 ori r0, r0, RESET_VECTOR@l
1025 stwu r1, -8(r1) /* Save back chain and move SP */
1026 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001027#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001028
wdenk0442ed82002-11-03 10:24:00 +00001029 GET_GOT /* initialize GOT access */
1030
Wolfgang Denkf901a832005-08-06 01:42:58 +02001031 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001032
wdenk0442ed82002-11-03 10:24:00 +00001033 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser52ebd9c2010-09-14 19:13:53 -05001034 /* NOTREACHED - board_init_f() does not return */
1035
Matthias Fuchs3fb85882013-08-07 12:10:38 +02001036#endif /* CONFIG_405GP || CONFIG_405 || CONFIG_405EP */
wdenk12f34242003-09-02 22:48:03 +00001037 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001038
1039
Stefan Roese345b77b2014-03-04 15:34:35 +01001040#if !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +00001041/*
1042 * This code finishes saving the registers to the exception frame
1043 * and jumps to the appropriate handler for the exception.
1044 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1045 */
1046 .globl transfer_to_handler
1047transfer_to_handler:
1048 stw r22,_NIP(r21)
1049 lis r22,MSR_POW@h
1050 andc r23,r23,r22
1051 stw r23,_MSR(r21)
1052 SAVE_GPR(7, r21)
1053 SAVE_4GPRS(8, r21)
1054 SAVE_8GPRS(12, r21)
1055 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001056 mflr r23
1057 andi. r24,r23,0x3f00 /* get vector offset */
1058 stw r24,TRAP(r21)
1059 li r22,0
1060 stw r22,RESULT(r21)
1061 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001062 lwz r24,0(r23) /* virtual address of handler */
1063 lwz r23,4(r23) /* where to go when done */
1064 mtspr SRR0,r24
1065 mtspr SRR1,r20
1066 mtlr r23
1067 SYNC
1068 rfi /* jump to handler, enable MMU */
1069
1070int_return:
1071 mfmsr r28 /* Disable interrupts */
1072 li r4,0
1073 ori r4,r4,MSR_EE
1074 andc r28,r28,r4
1075 SYNC /* Some chip revs need this... */
1076 mtmsr r28
1077 SYNC
1078 lwz r2,_CTR(r1)
1079 lwz r0,_LINK(r1)
1080 mtctr r2
1081 mtlr r0
1082 lwz r2,_XER(r1)
1083 lwz r0,_CCR(r1)
1084 mtspr XER,r2
1085 mtcrf 0xFF,r0
1086 REST_10GPRS(3, r1)
1087 REST_10GPRS(13, r1)
1088 REST_8GPRS(23, r1)
1089 REST_GPR(31, r1)
1090 lwz r2,_NIP(r1) /* Restore environment */
1091 lwz r0,_MSR(r1)
1092 mtspr SRR0,r2
1093 mtspr SRR1,r0
1094 lwz r0,GPR0(r1)
1095 lwz r2,GPR2(r1)
1096 lwz r1,GPR1(r1)
1097 SYNC
1098 rfi
1099
1100crit_return:
1101 mfmsr r28 /* Disable interrupts */
1102 li r4,0
1103 ori r4,r4,MSR_EE
1104 andc r28,r28,r4
1105 SYNC /* Some chip revs need this... */
1106 mtmsr r28
1107 SYNC
1108 lwz r2,_CTR(r1)
1109 lwz r0,_LINK(r1)
1110 mtctr r2
1111 mtlr r0
1112 lwz r2,_XER(r1)
1113 lwz r0,_CCR(r1)
1114 mtspr XER,r2
1115 mtcrf 0xFF,r0
1116 REST_10GPRS(3, r1)
1117 REST_10GPRS(13, r1)
1118 REST_8GPRS(23, r1)
1119 REST_GPR(31, r1)
1120 lwz r2,_NIP(r1) /* Restore environment */
1121 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001122 mtspr SPRN_CSRR0,r2
1123 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001124 lwz r0,GPR0(r1)
1125 lwz r2,GPR2(r1)
1126 lwz r1,GPR1(r1)
1127 SYNC
1128 rfci
1129
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001130#ifdef CONFIG_440
1131mck_return:
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001132 mfmsr r28 /* Disable interrupts */
1133 li r4,0
1134 ori r4,r4,MSR_EE
1135 andc r28,r28,r4
1136 SYNC /* Some chip revs need this... */
1137 mtmsr r28
1138 SYNC
1139 lwz r2,_CTR(r1)
1140 lwz r0,_LINK(r1)
1141 mtctr r2
1142 mtlr r0
1143 lwz r2,_XER(r1)
1144 lwz r0,_CCR(r1)
1145 mtspr XER,r2
1146 mtcrf 0xFF,r0
1147 REST_10GPRS(3, r1)
1148 REST_10GPRS(13, r1)
1149 REST_8GPRS(23, r1)
1150 REST_GPR(31, r1)
1151 lwz r2,_NIP(r1) /* Restore environment */
1152 lwz r0,_MSR(r1)
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001153 mtspr SPRN_MCSRR0,r2
1154 mtspr SPRN_MCSRR1,r0
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001155 lwz r0,GPR0(r1)
1156 lwz r2,GPR2(r1)
1157 lwz r1,GPR1(r1)
1158 SYNC
1159 rfmci
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001160#endif /* CONFIG_440 */
1161
1162
wdenk0442ed82002-11-03 10:24:00 +00001163 .globl get_pvr
1164get_pvr:
1165 mfspr r3, PVR
1166 blr
1167
wdenk0442ed82002-11-03 10:24:00 +00001168/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001169/* Function: out16 */
1170/* Description: Output 16 bits */
1171/*------------------------------------------------------------------------------- */
1172 .globl out16
1173out16:
1174 sth r4,0x0000(r3)
1175 blr
1176
1177/*------------------------------------------------------------------------------- */
1178/* Function: out16r */
1179/* Description: Byte reverse and output 16 bits */
1180/*------------------------------------------------------------------------------- */
1181 .globl out16r
1182out16r:
1183 sthbrx r4,r0,r3
1184 blr
1185
1186/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001187/* Function: out32r */
1188/* Description: Byte reverse and output 32 bits */
1189/*------------------------------------------------------------------------------- */
1190 .globl out32r
1191out32r:
1192 stwbrx r4,r0,r3
1193 blr
1194
1195/*------------------------------------------------------------------------------- */
1196/* Function: in16 */
1197/* Description: Input 16 bits */
1198/*------------------------------------------------------------------------------- */
1199 .globl in16
1200in16:
1201 lhz r3,0x0000(r3)
1202 blr
1203
1204/*------------------------------------------------------------------------------- */
1205/* Function: in16r */
1206/* Description: Input 16 bits and byte reverse */
1207/*------------------------------------------------------------------------------- */
1208 .globl in16r
1209in16r:
1210 lhbrx r3,r0,r3
1211 blr
1212
1213/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001214/* Function: in32r */
1215/* Description: Input 32 bits and byte reverse */
1216/*------------------------------------------------------------------------------- */
1217 .globl in32r
1218in32r:
1219 lwbrx r3,r0,r3
1220 blr
1221
Stefan Roese98f99e92013-04-02 10:37:04 +02001222#if !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +00001223/*
1224 * void relocate_code (addr_sp, gd, addr_moni)
1225 *
1226 * This "function" does not return, instead it continues in RAM
1227 * after relocating the monitor code.
1228 *
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001229 * r3 = Relocated stack pointer
1230 * r4 = Relocated global data pointer
1231 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001232 */
1233 .globl relocate_code
1234relocate_code:
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001235#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roese9b94ac62007-10-31 17:55:58 +01001236 /*
Stefan Roese79209542010-11-26 15:45:34 +01001237 * We need to flush the initial global data (gd_t) and bd_info
1238 * before the dcache will be invalidated.
Stefan Roese9b94ac62007-10-31 17:55:58 +01001239 */
1240
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001241 /* Save registers */
1242 mr r9, r3
1243 mr r10, r4
1244 mr r11, r5
Stefan Roese9b94ac62007-10-31 17:55:58 +01001245
Stefan Roese79209542010-11-26 15:45:34 +01001246 /*
1247 * Flush complete dcache, this is faster than flushing the
1248 * ranges for global_data and bd_info instead.
1249 */
1250 bl flush_dcache
Stefan Roese9b94ac62007-10-31 17:55:58 +01001251
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001252#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001253 /*
1254 * Undo the earlier data cache set-up for the primordial stack and
1255 * data area. First, invalidate the data cache and then disable data
1256 * cacheability for that area. Finally, restore the EBC values, if
1257 * any.
1258 */
1259
1260 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001261 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1262 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001263
Wolfgang Denk553f0982010-10-26 13:32:32 +02001264 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1265 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001266 add r4, r4, r3
1267
1268 bl invalidate_dcache_range
1269
1270 /* Disable cacheability for the region */
1271 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001272 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1273 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001274 and r3, r3, r4
1275 mtdccr r3
1276
1277 /* Restore the EBC parameters */
1278 li r3, PBxAP
Stefan Roesed1c3b272009-09-09 16:25:29 +02001279 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001280 lis r3, PBxAP_VAL@h
1281 ori r3, r3, PBxAP_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001282 mtdcr EBC0_CFGDATA, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001283
1284 li r3, PBxCR
Stefan Roesed1c3b272009-09-09 16:25:29 +02001285 mtdcr EBC0_CFGADDR, r3
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001286 lis r3, PBxCR_VAL@h
1287 ori r3, r3, PBxCR_VAL@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001288 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001289#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001290
1291 /* Restore registers */
1292 mr r3, r9
1293 mr r4, r10
1294 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001295#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesee02c5212008-01-09 10:23:16 +01001296
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001297#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesee02c5212008-01-09 10:23:16 +01001298 /*
1299 * Unlock the previously locked d-cache
1300 */
1301 msync
1302 isync
1303 /* set TFLOOR/NFLOOR to 0 again */
1304 lis r6,0x0001
1305 ori r6,r6,0xf800
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001306 mtspr SPRN_DVLIM,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001307 lis r6,0x0000
1308 ori r6,r6,0x0000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001309 mtspr SPRN_DNV0,r6
1310 mtspr SPRN_DNV1,r6
1311 mtspr SPRN_DNV2,r6
1312 mtspr SPRN_DNV3,r6
1313 mtspr SPRN_DTV0,r6
1314 mtspr SPRN_DTV1,r6
1315 mtspr SPRN_DTV2,r6
1316 mtspr SPRN_DTV3,r6
Stefan Roesee02c5212008-01-09 10:23:16 +01001317 msync
1318 isync
Stefan Roesef3cac532010-08-31 11:27:14 +02001319
1320 /* Invalidate data cache, now no longer our stack */
1321 dccci 0,0
1322 sync
1323 isync
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001324#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesee02c5212008-01-09 10:23:16 +01001325
Stefan Roesea4c8d132006-06-02 16:18:04 +02001326 /*
1327 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1328 * to speed up the boot process. Now this cache needs to be disabled.
1329 */
Stefan Roese4978e602010-05-27 16:45:20 +02001330#if defined(CONFIG_440)
Stefan Roese25fb4ea2008-11-20 11:46:20 +01001331 /* Clear all potential pending exceptions */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001332 mfspr r1,SPRN_MCSR
1333 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001334 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Stefan Roesec157d8e2005-08-01 16:41:48 +02001335 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +01001336 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001337 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roesea4c8d132006-06-02 16:18:04 +02001338 sync
Stefan Roesec157d8e2005-08-01 16:41:48 +02001339 isync
Stefan Roese4978e602010-05-27 16:45:20 +02001340#endif /* defined(CONFIG_440) */
wdenk0442ed82002-11-03 10:24:00 +00001341 mr r1, r3 /* Set new stack pointer */
1342 mr r9, r4 /* Save copy of Init Data pointer */
1343 mr r10, r5 /* Save copy of Destination Address */
1344
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001345 GET_GOT
wdenk0442ed82002-11-03 10:24:00 +00001346 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001347 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1348 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenk3b57fe02003-05-30 12:48:29 +00001349 lwz r5, GOT(__init_end)
1350 sub r5, r5, r4
Stefan Roese9b94ac62007-10-31 17:55:58 +01001351 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001352
1353 /*
1354 * Fix GOT pointer:
1355 *
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001356 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001357 *
1358 * Offset:
1359 */
1360 sub r15, r10, r4
1361
1362 /* First our own GOT */
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001363 add r12, r12, r15
Grant Ericksonc821b5f2008-05-22 14:44:14 -07001364 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001365 add r30, r30, r15
1366
1367 /*
1368 * Now relocate code
1369 */
1370
1371 cmplw cr1,r3,r4
1372 addi r0,r5,3
1373 srwi. r0,r0,2
1374 beq cr1,4f /* In place copy is not necessary */
1375 beq 7f /* Protect against 0 count */
1376 mtctr r0
1377 bge cr1,2f
1378
1379 la r8,-4(r4)
1380 la r7,-4(r3)
13811: lwzu r0,4(r8)
1382 stwu r0,4(r7)
1383 bdnz 1b
1384 b 4f
1385
13862: slwi r0,r0,2
1387 add r8,r4,r0
1388 add r7,r3,r0
13893: lwzu r0,-4(r8)
1390 stwu r0,-4(r7)
1391 bdnz 3b
1392
1393/*
1394 * Now flush the cache: note that we must start from a cache aligned
1395 * address. Otherwise we might miss one cache line.
1396 */
13974: cmpwi r6,0
1398 add r5,r3,r5
1399 beq 7f /* Always flush prefetch queue in any case */
1400 subi r0,r6,1
1401 andc r3,r3,r0
1402 mr r4,r3
14035: dcbst 0,r4
1404 add r4,r4,r6
1405 cmplw r4,r5
1406 blt 5b
1407 sync /* Wait for all dcbst to complete on bus */
1408 mr r4,r3
14096: icbi 0,r4
1410 add r4,r4,r6
1411 cmplw r4,r5
1412 blt 6b
14137: sync /* Wait for all icbi to complete on bus */
1414 isync
1415
1416/*
1417 * We are done. Do not return, instead branch to second part of board
1418 * initialization, now running from RAM.
1419 */
1420
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001421 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001422 mtlr r0
1423 blr /* NEVER RETURNS! */
1424
1425in_ram:
1426
1427 /*
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001428 * Relocation Function, r12 point to got2+0x8000
wdenk0442ed82002-11-03 10:24:00 +00001429 *
1430 * Adjust got2 pointers, no need to check for 0, this code
1431 * already puts a few entries in the table.
1432 */
1433 li r0,__got2_entries@sectoff@l
1434 la r3,GOT(_GOT2_TABLE_)
1435 lwz r11,GOT(_GOT2_TABLE_)
1436 mtctr r0
1437 sub r11,r3,r11
1438 addi r3,r3,-4
14391: lwzu r0,4(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001440 cmpwi r0,0
1441 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001442 add r0,r0,r11
1443 stw r0,0(r3)
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +020014442: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001445
1446 /*
1447 * Now adjust the fixups and the pointers to the fixups
1448 * in case we need to move ourselves again.
1449 */
Joakim Tjernlundafc3ba02009-10-08 02:03:51 +02001450 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001451 lwz r3,GOT(_FIXUP_TABLE_)
1452 cmpwi r0,0
1453 mtctr r0
1454 addi r3,r3,-4
1455 beq 4f
14563: lwzu r4,4(r3)
1457 lwzux r0,r4,r11
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001458 cmpwi r0,0
wdenk0442ed82002-11-03 10:24:00 +00001459 add r0,r0,r11
Joakim Tjernlund34bbf612010-11-04 19:02:00 +01001460 stw r4,0(r3)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +02001461 beq- 5f
wdenk0442ed82002-11-03 10:24:00 +00001462 stw r0,0(r4)
Joakim Tjernlundd1e0b102010-10-14 11:51:44 +020014635: bdnz 3b
wdenk0442ed82002-11-03 10:24:00 +000014644:
1465clear_bss:
1466 /*
1467 * Now clear BSS segment
1468 */
wdenk5d232d02003-05-22 22:52:13 +00001469 lwz r3,GOT(__bss_start)
Simon Glass3929fb02013-03-14 06:54:53 +00001470 lwz r4,GOT(__bss_end)
wdenk0442ed82002-11-03 10:24:00 +00001471
1472 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001473 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001474
1475 li r0, 0
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001476
1477 andi. r5, r4, 3
1478 beq 6f
1479 sub r4, r4, r5
1480 mtctr r5
1481 mr r5, r4
14825: stb r0, 0(r5)
1483 addi r5, r5, 1
1484 bdnz 5b
14856:
wdenk0442ed82002-11-03 10:24:00 +00001486 stw r0, 0(r3)
1487 addi r3, r3, 4
1488 cmplw 0, r3, r4
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +01001489 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001490
Anatolij Gustschin42ed33f2007-12-05 17:43:20 +010014917:
wdenk0442ed82002-11-03 10:24:00 +00001492 mr r3, r9 /* Init Data pointer */
1493 mr r4, r10 /* Destination Address */
1494 bl board_init_r
1495
wdenk0442ed82002-11-03 10:24:00 +00001496 /*
1497 * Copy exception vector code to low memory
1498 *
1499 * r3: dest_addr
1500 * r7: source address, r8: end address, r9: target address
1501 */
1502 .globl trap_init
1503trap_init:
Joakim Tjernlund0f8aa152010-01-19 14:41:56 +01001504 mflr r4 /* save link register */
1505 GET_GOT
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001506 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001507 lwz r8, GOT(_end_of_vectors)
1508
wdenk682011f2003-06-03 23:54:09 +00001509 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001510
1511 cmplw 0, r7, r8
1512 bgelr /* return if r7>=r8 - just in case */
wdenk0442ed82002-11-03 10:24:00 +000015131:
1514 lwz r0, 0(r7)
1515 stw r0, 0(r9)
1516 addi r7, r7, 4
1517 addi r9, r9, 4
1518 cmplw 0, r7, r8
1519 bne 1b
1520
1521 /*
1522 * relocate `hdlr' and `int_return' entries
1523 */
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001524 li r7, .L_MachineCheck - _start + _START_OFFSET
1525 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000015262:
1527 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001528 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001529 cmplw 0, r7, r8
1530 blt 2b
1531
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001532 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001533 bl trap_reloc
1534
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001535 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001536 bl trap_reloc
1537
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001538#ifdef CONFIG_440
1539 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001540 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001541
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001542 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001543 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001544
1545 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001546 bl trap_reloc
Stefan Roesedf8a24c2007-06-19 16:42:31 +02001547
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001548 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1549 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001550
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001551 li r7, .L_DataTLBError - _start + _START_OFFSET
1552 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001553#else /* CONFIG_440 */
1554 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001555 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001556
1557 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001558 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001559
1560 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001561 bl trap_reloc
Grzegorz Bernackiefa35cf2007-06-15 11:19:28 +02001562#endif /* CONFIG_440 */
1563
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001564 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1565 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001566
Stefan Roese887e2ec2006-09-07 11:51:23 +02001567#if !defined(CONFIG_440)
Stefan Roese9a7b4082006-03-13 09:42:28 +01001568 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1569 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1570 mtmsr r7 /* change MSR */
1571#else
Stefan Roese887e2ec2006-09-07 11:51:23 +02001572 bl __440_msr_set
1573 b __440_msr_continue
Stefan Roese9a7b4082006-03-13 09:42:28 +01001574
Stefan Roese887e2ec2006-09-07 11:51:23 +02001575__440_msr_set:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001576 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1577 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001578 mtspr SPRN_SRR1,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001579 mflr r7
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001580 mtspr SPRN_SRR0,r7
Stefan Roese9a7b4082006-03-13 09:42:28 +01001581 rfi
Stefan Roese887e2ec2006-09-07 11:51:23 +02001582__440_msr_continue:
Stefan Roese9a7b4082006-03-13 09:42:28 +01001583#endif
1584
wdenk0442ed82002-11-03 10:24:00 +00001585 mtlr r4 /* restore link register */
1586 blr
Stefan Roese98f99e92013-04-02 10:37:04 +02001587#endif /* CONFIG_SPL_BUILD */
wdenk0442ed82002-11-03 10:24:00 +00001588
Stefan Roesecf959c72007-06-01 15:27:11 +02001589#if defined(CONFIG_440)
1590/*----------------------------------------------------------------------------+
1591| dcbz_area.
1592+----------------------------------------------------------------------------*/
1593 function_prolog(dcbz_area)
1594 rlwinm. r5,r4,0,27,31
Wolfgang Denk83b4cfa2007-06-20 18:14:24 +02001595 rlwinm r5,r4,27,5,31
1596 beq ..d_ra2
1597 addi r5,r5,0x0001
1598..d_ra2:mtctr r5
1599..d_ag2:dcbz r0,r3
1600 addi r3,r3,32
1601 bdnz ..d_ag2
Stefan Roesecf959c72007-06-01 15:27:11 +02001602 sync
1603 blr
1604 function_epilog(dcbz_area)
Stefan Roesecf959c72007-06-01 15:27:11 +02001605#endif /* CONFIG_440 */
Stefan Roese345b77b2014-03-04 15:34:35 +01001606#endif /* CONFIG_SPL_BUILD */
stroeseb867d702003-05-23 11:18:02 +00001607
Stefan Roesecf959c72007-06-01 15:27:11 +02001608/*------------------------------------------------------------------------------- */
1609/* Function: in8 */
1610/* Description: Input 8 bits */
1611/*------------------------------------------------------------------------------- */
1612 .globl in8
1613in8:
1614 lbz r3,0x0000(r3)
1615 blr
1616
1617/*------------------------------------------------------------------------------- */
1618/* Function: out8 */
1619/* Description: Output 8 bits */
1620/*------------------------------------------------------------------------------- */
1621 .globl out8
1622out8:
1623 stb r4,0x0000(r3)
1624 blr
1625
1626/*------------------------------------------------------------------------------- */
1627/* Function: out32 */
1628/* Description: Output 32 bits */
1629/*------------------------------------------------------------------------------- */
1630 .globl out32
1631out32:
1632 stw r4,0x0000(r3)
1633 blr
1634
1635/*------------------------------------------------------------------------------- */
1636/* Function: in32 */
1637/* Description: Input 32 bits */
1638/*------------------------------------------------------------------------------- */
1639 .globl in32
1640in32:
1641 lwz 3,0x0000(3)
1642 blr
stroeseb867d702003-05-23 11:18:02 +00001643
1644/**************************************************************************/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001645/* PPC405EP specific stuff */
stroeseb867d702003-05-23 11:18:02 +00001646/**************************************************************************/
1647#ifdef CONFIG_405EP
1648ppc405ep_init:
stroeseb828dda2003-12-09 14:54:43 +00001649
Stefan Roesec157d8e2005-08-01 16:41:48 +02001650#ifdef CONFIG_BUBINGA
stroeseb828dda2003-12-09 14:54:43 +00001651 /*
1652 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1653 * function) to support FPGA and NVRAM accesses below.
1654 */
1655
1656 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1657 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001658 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1659 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001660 stw r4,0(r3)
1661 lis r3,GPIO0_OSRL@h
1662 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001663 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1664 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001665 stw r4,0(r3)
1666
1667 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1668 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001669 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1670 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroeseb828dda2003-12-09 14:54:43 +00001671 stw r4,0(r3)
1672 lis r3,GPIO0_ISR1L@h
1673 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001674 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1675 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroeseb828dda2003-12-09 14:54:43 +00001676 stw r4,0(r3)
1677
1678 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1679 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001680 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1681 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroeseb828dda2003-12-09 14:54:43 +00001682 stw r4,0(r3)
1683 lis r3,GPIO0_TSRL@h
1684 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001685 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1686 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroeseb828dda2003-12-09 14:54:43 +00001687 stw r4,0(r3)
1688
1689 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1690 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001691 lis r4,CONFIG_SYS_GPIO0_TCR@h
1692 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroeseb828dda2003-12-09 14:54:43 +00001693 stw r4,0(r3)
1694
Stefan Roesed1c3b272009-09-09 16:25:29 +02001695 li r3,PB1AP /* program EBC bank 1 for RTC access */
1696 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001697 lis r3,CONFIG_SYS_EBC_PB1AP@h
1698 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001699 mtdcr EBC0_CFGDATA,r3
1700 li r3,PB1CR
1701 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001702 lis r3,CONFIG_SYS_EBC_PB1CR@h
1703 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001704 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001705
Stefan Roesed1c3b272009-09-09 16:25:29 +02001706 li r3,PB1AP /* program EBC bank 1 for RTC access */
1707 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001708 lis r3,CONFIG_SYS_EBC_PB1AP@h
1709 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001710 mtdcr EBC0_CFGDATA,r3
1711 li r3,PB1CR
1712 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001713 lis r3,CONFIG_SYS_EBC_PB1CR@h
1714 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001715 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001716
Stefan Roesed1c3b272009-09-09 16:25:29 +02001717 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1718 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001719 lis r3,CONFIG_SYS_EBC_PB4AP@h
1720 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001721 mtdcr EBC0_CFGDATA,r3
1722 li r3,PB4CR
1723 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +02001724 lis r3,CONFIG_SYS_EBC_PB4CR@h
1725 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roesed1c3b272009-09-09 16:25:29 +02001726 mtdcr EBC0_CFGDATA,r3
stroeseb828dda2003-12-09 14:54:43 +00001727#endif
1728
wdenk8bde7f72003-06-27 21:31:46 +00001729 /*
1730 !-----------------------------------------------------------------------
1731 ! Check to see if chip is in bypass mode.
1732 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1733 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denkf901a832005-08-06 01:42:58 +02001734 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1735 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk8bde7f72003-06-27 21:31:46 +00001736 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001737 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001738 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001739 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001740 cmpi cr0,0,r4,0x1
stroeseb867d702003-05-23 11:18:02 +00001741
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001742 beq pll_done /* if SSCS =b'1' then PLL has */
1743 /* already been set */
1744 /* and CPU has been reset */
1745 /* so skip to next section */
stroeseb867d702003-05-23 11:18:02 +00001746
Stefan Roesec157d8e2005-08-01 16:41:48 +02001747#ifdef CONFIG_BUBINGA
stroeseb867d702003-05-23 11:18:02 +00001748 /*
wdenk8bde7f72003-06-27 21:31:46 +00001749 !-----------------------------------------------------------------------
1750 ! Read NVRAM to get value to write in PLLMR.
1751 ! If value has not been correctly saved, write default value
1752 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1753 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1754 !
1755 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denkf901a832005-08-06 01:42:58 +02001756 ! structure in openbios.h. Changing the beginning of
1757 ! the structure will break this code.
wdenk8bde7f72003-06-27 21:31:46 +00001758 !
1759 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001760 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001761 addis r3,0,NVRAM_BASE@h
1762 addi r3,r3,NVRAM_BASE@l
stroeseb867d702003-05-23 11:18:02 +00001763
Wolfgang Denkf901a832005-08-06 01:42:58 +02001764 lwz r4, 0(r3)
1765 addis r5,0,NVRVFY1@h
1766 addi r5,r5,NVRVFY1@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001767 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denkf901a832005-08-06 01:42:58 +02001768 bne ..no_pllset
1769 addi r3,r3,4
1770 lwz r4, 0(r3)
1771 addis r5,0,NVRVFY2@h
1772 addi r5,r5,NVRVFY2@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001773 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001774 bne ..no_pllset
1775 addi r3,r3,8 /* Skip over conf_size */
1776 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1777 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1778 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1779 cmpi cr0,0,r5,1 /* See if PLL is locked */
1780 beq pll_write
stroeseb867d702003-05-23 11:18:02 +00001781..no_pllset:
Stefan Roesec157d8e2005-08-01 16:41:48 +02001782#endif /* CONFIG_BUBINGA */
stroeseb867d702003-05-23 11:18:02 +00001783
John Otkend4024bb2007-07-26 17:49:11 +02001784#ifdef CONFIG_TAIHU
1785 mfdcr r4, CPC0_BOOT
1786 andi. r5, r4, CPC0_BOOT_SEP@l
1787 bne strap_1 /* serial eeprom present */
1788 addis r5,0,CPLD_REG0_ADDR@h
1789 ori r5,r5,CPLD_REG0_ADDR@l
1790 andi. r5, r5, 0x10
1791 bne _pci_66mhz
1792#endif /* CONFIG_TAIHU */
1793
Stefan Roese779e9752007-08-14 14:44:41 +02001794#if defined(CONFIG_ZEUS)
1795 mfdcr r4, CPC0_BOOT
1796 andi. r5, r4, CPC0_BOOT_SEP@l
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001797 bne strap_1 /* serial eeprom present */
Stefan Roese779e9752007-08-14 14:44:41 +02001798 lis r3,0x0000
1799 addi r3,r3,0x3030
1800 lis r4,0x8042
1801 addi r4,r4,0x223e
1802 b 1f
1803strap_1:
1804 mfdcr r3, CPC0_PLLMR0
1805 mfdcr r4, CPC0_PLLMR1
1806 b 1f
1807#endif
1808
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001809 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1810 ori r3,r3,PLLMR0_DEFAULT@l /* */
1811 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1812 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroeseb867d702003-05-23 11:18:02 +00001813
John Otkend4024bb2007-07-26 17:49:11 +02001814#ifdef CONFIG_TAIHU
1815 b 1f
1816_pci_66mhz:
1817 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1818 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1819 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1820 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1821 b 1f
1822strap_1:
1823 mfdcr r3, CPC0_PLLMR0
1824 mfdcr r4, CPC0_PLLMR1
John Otkend4024bb2007-07-26 17:49:11 +02001825#endif /* CONFIG_TAIHU */
1826
Stefan Roese779e9752007-08-14 14:44:41 +020018271:
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001828 b pll_write /* Write the CPC0_PLLMR with new value */
stroeseb867d702003-05-23 11:18:02 +00001829
1830pll_done:
wdenk8bde7f72003-06-27 21:31:46 +00001831 /*
1832 !-----------------------------------------------------------------------
1833 ! Clear Soft Reset Register
1834 ! This is needed to enable PCI if not booting from serial EPROM
1835 !-----------------------------------------------------------------------
stroeseb867d702003-05-23 11:18:02 +00001836 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001837 addi r3, 0, 0x0
1838 mtdcr CPC0_SRR, r3
stroeseb867d702003-05-23 11:18:02 +00001839
Wolfgang Denkf901a832005-08-06 01:42:58 +02001840 addis r3,0,0x0010
1841 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001842pci_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001843 bdnz pci_wait
stroeseb867d702003-05-23 11:18:02 +00001844
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001845 blr /* return to main code */
stroeseb867d702003-05-23 11:18:02 +00001846
1847/*
1848!-----------------------------------------------------------------------------
Wolfgang Denkf901a832005-08-06 01:42:58 +02001849! Function: pll_write
1850! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1851! That is:
1852! 1. Pll is first disabled (de-activated by putting in bypass mode)
1853! 2. PLL is reset
1854! 3. Clock dividers are set while PLL is held in reset and bypassed
1855! 4. PLL Reset is cleared
1856! 5. Wait 100us for PLL to lock
1857! 6. A core reset is performed
stroeseb867d702003-05-23 11:18:02 +00001858! Input: r3 = Value to write to CPC0_PLLMR0
1859! Input: r4 = Value to write to CPC0_PLLMR1
1860! Output r3 = none
1861!-----------------------------------------------------------------------------
1862*/
Matthias Fuchs0580e482009-07-06 16:27:33 +02001863 .globl pll_write
stroeseb867d702003-05-23 11:18:02 +00001864pll_write:
wdenk8bde7f72003-06-27 21:31:46 +00001865 mfdcr r5, CPC0_UCR
1866 andis. r5,r5,0xFFFF
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001867 ori r5,r5,0x0101 /* Stop the UART clocks */
1868 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroeseb867d702003-05-23 11:18:02 +00001869
wdenk8bde7f72003-06-27 21:31:46 +00001870 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001871 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001872 mtdcr CPC0_PLLMR1,r5
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001873 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001874 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001875
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001876 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1877 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1878 oris r5,r5,0x4000 /* Set PLL Reset */
1879 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1880 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001881 mtdcr CPC0_PLLMR1,r5
stroeseb867d702003-05-23 11:18:02 +00001882
1883 /*
wdenk8bde7f72003-06-27 21:31:46 +00001884 ! Wait min of 100us for PLL to lock.
1885 ! See CMOS 27E databook for more info.
1886 ! At 200MHz, that means waiting 20,000 instructions
stroeseb867d702003-05-23 11:18:02 +00001887 */
Wolfgang Denkf901a832005-08-06 01:42:58 +02001888 addi r3,0,20000 /* 2000 = 0x4e20 */
1889 mtctr r3
stroeseb867d702003-05-23 11:18:02 +00001890pll_wait:
Wolfgang Denkf901a832005-08-06 01:42:58 +02001891 bdnz pll_wait
stroeseb867d702003-05-23 11:18:02 +00001892
Wolfgang Denkf901a832005-08-06 01:42:58 +02001893 oris r5,r5,0x8000 /* Enable PLL */
1894 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroeseb867d702003-05-23 11:18:02 +00001895
wdenk8bde7f72003-06-27 21:31:46 +00001896 /*
1897 * Reset CPU to guarantee timings are OK
1898 * Not sure if this is needed...
1899 */
1900 addis r3,0,0x1000
Matthias Fuchs58ea1422009-07-22 17:27:56 +02001901 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001902 /* execution will continue from the poweron */
1903 /* vector of 0xfffffffc */
stroeseb867d702003-05-23 11:18:02 +00001904#endif /* CONFIG_405EP */
Stefan Roese4745aca2007-02-20 10:57:08 +01001905
1906#if defined(CONFIG_440)
Stefan Roese4745aca2007-02-20 10:57:08 +01001907/*----------------------------------------------------------------------------+
1908| mttlb3.
1909+----------------------------------------------------------------------------*/
1910 function_prolog(mttlb3)
1911 TLBWE(4,3,2)
1912 blr
1913 function_epilog(mttlb3)
1914
1915/*----------------------------------------------------------------------------+
1916| mftlb3.
1917+----------------------------------------------------------------------------*/
1918 function_prolog(mftlb3)
Wolfgang Denk74357112007-02-27 14:26:04 +01001919 TLBRE(3,3,2)
Stefan Roese4745aca2007-02-20 10:57:08 +01001920 blr
1921 function_epilog(mftlb3)
1922
1923/*----------------------------------------------------------------------------+
1924| mttlb2.
1925+----------------------------------------------------------------------------*/
1926 function_prolog(mttlb2)
1927 TLBWE(4,3,1)
1928 blr
1929 function_epilog(mttlb2)
1930
1931/*----------------------------------------------------------------------------+
1932| mftlb2.
1933+----------------------------------------------------------------------------*/
1934 function_prolog(mftlb2)
Wolfgang Denk74357112007-02-27 14:26:04 +01001935 TLBRE(3,3,1)
Stefan Roese4745aca2007-02-20 10:57:08 +01001936 blr
1937 function_epilog(mftlb2)
1938
1939/*----------------------------------------------------------------------------+
1940| mttlb1.
1941+----------------------------------------------------------------------------*/
1942 function_prolog(mttlb1)
1943 TLBWE(4,3,0)
1944 blr
1945 function_epilog(mttlb1)
1946
1947/*----------------------------------------------------------------------------+
1948| mftlb1.
1949+----------------------------------------------------------------------------*/
1950 function_prolog(mftlb1)
Wolfgang Denk74357112007-02-27 14:26:04 +01001951 TLBRE(3,3,0)
Stefan Roese4745aca2007-02-20 10:57:08 +01001952 blr
1953 function_epilog(mftlb1)
1954#endif /* CONFIG_440 */