blob: 5647d712d6d4e43025ca13e831a736548628e0ac [file] [log] [blame]
wdenk0442ed82002-11-03 10:24:00 +00001/*
2 * Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
3 * Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
4 * Copyright (C) 2000,2001,2002 Wolfgang Denk <wd@denx.de>
Stefan Roesef6c7b762007-03-24 15:45:34 +01005 * Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
Grant Ericksonb6933412008-05-22 14:44:14 -07006 * Copyright (c) 2008 Nuovation System Designs, LLC
7 * Grant Erickson <gerickson@nuovations.com>
wdenk0442ed82002-11-03 10:24:00 +00008 *
Wolfgang Denk815c9672013-09-17 11:24:06 +02009 * SPDX-License-Identifier: GPL-2.0 IBM-pibs
Wolfgang Denk09675ef2007-06-20 18:14:24 +020010 */
wdenk0442ed82002-11-03 10:24:00 +000011
Stefan Roesecd2c7122010-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 Roesecd2c7122010-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 Roesecd2c7122010-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 Roesecd2c7122010-11-26 15:43:17 +010028
Wolfgang Denk0191e472010-10-26 14:34:52 +020029#include <asm-offsets.h>
wdenk0442ed82002-11-03 10:24:00 +000030#include <config.h>
Stefan Roese247e9d72010-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 Mitchell3c3734172008-11-20 14:00:49 -060039#include <asm/ppc4xx-isram.h>
wdenk0442ed82002-11-03 10:24:00 +000040
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020041#ifdef CONFIG_SYS_INIT_DCACHE_CS
42# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
Stefan Roese918010a2009-09-09 16:25:29 +020043# define PBxAP PB1AP
44# define PBxCR PB0CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070048# endif
wdenk0442ed82002-11-03 10:24:00 +000049# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020050# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
Stefan Roese918010a2009-09-09 16:25:29 +020051# define PBxAP PB1AP
52# define PBxCR PB1CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070056# endif
wdenk0442ed82002-11-03 10:24:00 +000057# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020058# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
Stefan Roese918010a2009-09-09 16:25:29 +020059# define PBxAP PB2AP
60# define PBxCR PB2CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070064# endif
wdenk0442ed82002-11-03 10:24:00 +000065# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020066# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
Stefan Roese918010a2009-09-09 16:25:29 +020067# define PBxAP PB3AP
68# define PBxCR PB3CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070072# endif
wdenk0442ed82002-11-03 10:24:00 +000073# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020074# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
Stefan Roese918010a2009-09-09 16:25:29 +020075# define PBxAP PB4AP
76# define PBxCR PB4CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070080# endif
wdenk0442ed82002-11-03 10:24:00 +000081# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020082# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
Stefan Roese918010a2009-09-09 16:25:29 +020083# define PBxAP PB5AP
84# define PBxCR PB5CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070088# endif
wdenk0442ed82002-11-03 10:24:00 +000089# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020090# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
Stefan Roese918010a2009-09-09 16:25:29 +020091# define PBxAP PB6AP
92# define PBxCR PB6CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -070096# endif
wdenk0442ed82002-11-03 10:24:00 +000097# endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020098# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
Stefan Roese918010a2009-09-09 16:25:29 +020099# define PBxAP PB7AP
100# define PBxCR PB7CR
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-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-VILLARD03836942008-10-16 15:01:15 +0200113 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
Grant Ericksonb6933412008-05-22 14:44:14 -0700114 * used as temporary stack pointer for the primordial stack
115 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200116# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
117# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
Grant Ericksonb6933412008-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-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700133 EBC_BXCR_BS_64MB | \
134 EBC_BXCR_BU_RW | \
135 EBC_BXCR_BW_16BIT)
Jean-Christophe PLAGNIOL-VILLARD03836942008-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-VILLARD03836942008-10-16 15:01:15 +0200140#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +0000141
Wolfgang Denk1c2e98e2010-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 Roese0fb8ab92008-01-30 14:48:28 +0100144#endif
145
Grant Ericksonb6933412008-05-22 14:44:14 -0700146/*
Robert P. J. Day8d56db92016-07-15 13:44:45 -0400147 * Unless otherwise overridden, enable two 128MB cachable instruction regions
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700150 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200151#if !defined(CONFIG_SYS_FLASH_BASE)
Stefan Roese7d72e022008-06-02 14:35:44 +0200152/* If not already defined, set it to the "last" 128MByte region */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200153# define CONFIG_SYS_FLASH_BASE 0xf8000000
Stefan Roese7d72e022008-06-02 14:35:44 +0200154#endif
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Ericksonb6933412008-05-22 14:44:14 -0700161
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200162#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
163# define CONFIG_SYS_DCACHE_SACR_VALUE \
Grant Ericksonb6933412008-05-22 14:44:14 -0700164 (0x00000000)
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200165#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
Grant Ericksonb6933412008-05-22 14:44:14 -0700166
Stefan Roese1d568062010-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 Denk09675ef2007-06-20 18:14:24 +0200171#define function_prolog(func_name) .text; \
Stefan Roese42743512007-06-01 15:27:11 +0200172 .align 2; \
173 .globl func_name; \
174 func_name:
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200175#define function_epilog(func_name) .type func_name,@function; \
Stefan Roese42743512007-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 Tjernlund3fbaa4d2010-01-19 14:41:56 +0100189 * Use r12 to access the GOT
wdenk0442ed82002-11-03 10:24:00 +0000190 */
Stefan Roeseb3859f22014-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
wdenkb9a83a92003-05-30 12:48:29 +0000201 GOT_ENTRY(__init_end)
Simon Glassed70c8f2013-03-14 06:54:53 +0000202 GOT_ENTRY(__bss_end)
wdenkbf2f8c92003-05-22 22:52:13 +0000203 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000204 END_GOT
Stefan Roeseb3859f22014-03-04 15:34:35 +0100205#endif /* CONFIG_SPL_BUILD */
wdenk0442ed82002-11-03 10:24:00 +0000206
Ricardo Ribalda Delgadob3843812010-12-07 14:27:56 +0100207#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_BOOT_FROM_XMD)
Stefan Roesec20ef322009-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 Roese07038ad2013-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 Denk4df0da52006-10-09 00:42:01 +0200245 /*--------------------------------------------------------------------+
246 | 440EPX BUP Change - Hardware team request
247 +--------------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200248#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
249 sync
250 nop
251 nop
252#endif
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200253 /*----------------------------------------------------------------+
254 | Core bug fix. Clear the esr
255 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200256 li r0,0
Matthias Fuchs730b2d22009-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 Denk8dd4d332005-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 Fuchs730b2d22009-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 Roese42fbddd2006-09-07 11:51:23 +0200269 /* NOTE: 440GX adds machine check status regs */
270#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Matthias Fuchs730b2d22009-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
wdenk544e9732004-02-06 23:19:44 +0000275#endif
Stefan Roese0100cc12006-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 Fuchs730b2d22009-07-22 17:27:56 +0200286 mtspr SPRN_CCR0,r1
Stefan Roese0100cc12006-11-22 13:20:50 +0100287
wdenk0442ed82002-11-03 10:24:00 +0000288 /*----------------------------------------------------------------*/
289 /* Initialize debug */
290 /*----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200291 mfspr r1,SPRN_DBCR0
Stefan Roese42fbddd2006-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 Gallardob52cde92010-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 Fuchs730b2d22009-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 Fuchs730b2d22009-07-22 17:27:56 +0200308 mfspr r1,SPRN_DBSR
309 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200310skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000311
Marian Balakowicz49d0eee2006-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 Balakowiczbe9463b2006-07-06 21:17:24 +0200324 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200325 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200326 li r0,0
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200327 mtspr SPRN_CCR1, r0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200328
329 /*----------------------------------------------------------------+
330 | Reset the timebase.
331 | The previous write to CCR1 sets the timebase source.
332 +-----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200333 mtspr SPRN_TBWL, r0
334 mtspr SPRN_TBWU, r0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200335#endif
336
wdenk0442ed82002-11-03 10:24:00 +0000337 /*----------------------------------------------------------------*/
338 /* Setup interrupt vectors */
339 /*----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200340 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200341 li r1,0x0100
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200342 mtspr SPRN_IVOR0,r1 /* Critical input */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200343 li r1,0x0200
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200344 mtspr SPRN_IVOR1,r1 /* Machine check */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200345 li r1,0x0300
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200346 mtspr SPRN_IVOR2,r1 /* Data storage */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200347 li r1,0x0400
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200348 mtspr SPRN_IVOR3,r1 /* Instruction storage */
wdenk0442ed82002-11-03 10:24:00 +0000349 li r1,0x0500
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200350 mtspr SPRN_IVOR4,r1 /* External interrupt */
wdenk0442ed82002-11-03 10:24:00 +0000351 li r1,0x0600
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200352 mtspr SPRN_IVOR5,r1 /* Alignment */
wdenk0442ed82002-11-03 10:24:00 +0000353 li r1,0x0700
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200354 mtspr SPRN_IVOR6,r1 /* Program check */
wdenk0442ed82002-11-03 10:24:00 +0000355 li r1,0x0800
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200356 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
wdenk0442ed82002-11-03 10:24:00 +0000357 li r1,0x0c00
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200358 mtspr SPRN_IVOR8,r1 /* System call */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200359 li r1,0x0a00
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200360 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200361 li r1,0x0900
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200362 mtspr SPRN_IVOR10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000363 li r1,0x1300
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200364 mtspr SPRN_IVOR13,r1 /* Data TLB error */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200365 li r1,0x1400
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200366 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
wdenk0442ed82002-11-03 10:24:00 +0000367 li r1,0x2000
Matthias Fuchs730b2d22009-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 Fuchs730b2d22009-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 Fuchs730b2d22009-07-22 17:27:56 +0200397 mtspr SPRN_IVLIM,r1
398 mtspr SPRN_DVLIM,r1
wdenk0442ed82002-11-03 10:24:00 +0000399
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200400 /*----------------------------------------------------------------+
401 |Initialize MMUCR[STID] = 0.
402 +-----------------------------------------------------------------*/
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200403 mfspr r0,SPRN_MMUCR
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200404 addis r1,0,0xFFFF
405 ori r1,r1,0xFF00
406 and r0,r0,r1
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200407 mtspr SPRN_MMUCR,r0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200408
wdenk0442ed82002-11-03 10:24:00 +0000409 /*----------------------------------------------------------------*/
410 /* Clear all TLB entries -- TID = 0, TS = 0 */
411 /*----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200412 addis r0,0,0x0000
Stefan Roesed0c43952009-07-14 15:53:08 +0200413#ifdef CONFIG_SYS_RAMBOOT
Stefan Roesec20ef322009-05-11 13:46:14 +0200414 li r4,0 /* Start with TLB #0 */
Stefan Roesed0c43952009-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 Roesec20ef322009-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 Balakowicz49d0eee2006-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 Roese97251f92010-04-09 14:03:59 +0200436#if defined(CONFIG_440SPE_REVA)
Rafal Jaworowskia2e7ef02006-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 Jaworowskia2e7ef02006-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 Roesec20ef322009-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 Roesec20ef322009-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 Roese42fbddd2006-09-07 11:51:23 +02004792:
Stefan Roese42fbddd2006-09-07 11:51:23 +0200480 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000481 b _start
482
4833: li r0,0
Matthias Fuchs730b2d22009-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 Fuchs730b2d22009-07-22 17:27:56 +0200486 mtspr SPRN_SRR0,r1
wdenk0442ed82002-11-03 10:24:00 +0000487 rfi
stroese434979e2003-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 Roeseb3859f22014-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ßmann61d01952011-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 Bernacki837bc5b2007-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 Denk09675ef2007-06-20 18:14:24 +0200510 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200511#else
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200512 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-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 Tjernlund4ff6bc02010-01-19 14:41:55 +0100533 EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
Grzegorz Bernacki837bc5b2007-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 Tjernlund4ff6bc02010-01-19 14:41:55 +0100540 EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
541 MSR_KERNEL, COPY_EE)
Grzegorz Bernacki837bc5b2007-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 Roese80d99a42007-06-19 16:42:31 +0200547#endif
Grzegorz Bernacki837bc5b2007-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 Roese42fbddd2006-09-07 11:51:23 +0200563#endif
wdenk0442ed82002-11-03 10:24:00 +0000564 .globl _start
565_start:
566
Stefan Roese07038ad2013-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 Fuchs730b2d22009-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-VILLARD03836942008-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-VILLARD03836942008-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 Fuchs730b2d22009-07-22 17:27:56 +0200603 mtspr SPRN_DBSR,r1 /* Clear all status bits */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200604 lis r0,CONFIG_SYS_INIT_DBCR@h
605 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
Matthias Fuchs730b2d22009-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 Roese42fbddd2006-09-07 11:51:23 +0200614
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200615#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roese326c9712005-08-01 16:41:48 +0200616 /* Clear Dcache to use as RAM */
Jean-Christophe PLAGNIOL-VILLARD03836942008-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 Denk1c2e98e2010-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 Roese326c9712005-08-01 16:41:48 +0200621 rlwinm. r5,r4,0,27,31
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200622 rlwinm r5,r4,27,5,31
623 beq ..d_ran
624 addi r5,r5,0x0001
Stefan Roese326c9712005-08-01 16:41:48 +0200625..d_ran:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200626 mtctr r5
Stefan Roese326c9712005-08-01 16:41:48 +0200627..d_ag:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200628 dcbz r0,r3
629 addi r3,r3,32
630 bdnz ..d_ag
Stefan Roesea86bde32008-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 Fuchs730b2d22009-07-22 17:27:56 +0200645 mtspr SPRN_DVLIM,r1
Stefan Roesea86bde32008-01-09 10:23:16 +0100646 lis r1,0x0808
647 ori r1,r1,0x0808
Matthias Fuchs730b2d22009-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 Roesea86bde32008-01-09 10:23:16 +0100656 msync
657 isync
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200658#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roese42fbddd2006-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 Roesecc019d12008-03-11 15:05:50 +0100663#if defined(CONFIG_440GX) || \
664 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
Feng Kan224bc962008-07-08 22:47:31 -0700665 defined(CONFIG_460SX)
Dave Mitchell3c3734172008-11-20 14:00:49 -0600666 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
Masahiro Yamadae168aae2014-09-29 01:37:59 +0900667#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
Dave Mitchell5c057592008-11-20 14:09:50 -0600668 lis r1, 0x0000
669 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
670 mtdcr L2_CACHE_CFG,r1
wdenk544e9732004-02-06 23:19:44 +0000671#endif
wdenk0442ed82002-11-03 10:24:00 +0000672
Stefan Roese42fbddd2006-09-07 11:51:23 +0200673 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000674 ori r2,r2,0xffff
Dave Mitchell3c3734172008-11-20 14:00:49 -0600675 mfdcr r1,ISRAM0_DPC
wdenk0442ed82002-11-03 10:24:00 +0000676 and r1,r1,r2 /* Disable parity check */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600677 mtdcr ISRAM0_DPC,r1
678 mfdcr r1,ISRAM0_PMEG
Stefan Roese42fbddd2006-09-07 11:51:23 +0200679 and r1,r1,r2 /* Disable pwr mgmt */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600680 mtdcr ISRAM0_PMEG,r1
wdenk0442ed82002-11-03 10:24:00 +0000681
682 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese99644742005-11-29 18:18:21 +0100683#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenk544e9732004-02-06 23:19:44 +0000684 ori r1,r1,0x0980 /* first 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600685 mtdcr ISRAM0_SB0CR,r1
wdenk544e9732004-02-06 23:19:44 +0000686 lis r1,0x8001
687 ori r1,r1,0x0980 /* second 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600688 mtdcr ISRAM0_SB1CR,r1
wdenk544e9732004-02-06 23:19:44 +0000689 lis r1, 0x8002
690 ori r1,r1, 0x0980 /* third 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600691 mtdcr ISRAM0_SB2CR,r1
wdenk544e9732004-02-06 23:19:44 +0000692 lis r1, 0x8003
693 ori r1,r1, 0x0980 /* fourth 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600694 mtdcr ISRAM0_SB3CR,r1
Tirumala Marri95ac4282010-09-28 14:15:14 -0700695#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || \
Masahiro Yamadae168aae2014-09-29 01:37:59 +0900696 defined(CONFIG_460GT)
Dave Mitchell5c057592008-11-20 14:09:50 -0600697 lis r1,0x0000 /* BAS = X_0000_0000 */
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200698 ori r1,r1,0x0984 /* first 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600699 mtdcr ISRAM0_SB0CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200700 lis r1,0x0001
701 ori r1,r1,0x0984 /* second 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600702 mtdcr ISRAM0_SB1CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200703 lis r1, 0x0002
704 ori r1,r1, 0x0984 /* third 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600705 mtdcr ISRAM0_SB2CR,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200706 lis r1, 0x0003
707 ori r1,r1, 0x0984 /* fourth 64k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600708 mtdcr ISRAM0_SB3CR,r1
Masahiro Yamadae168aae2014-09-29 01:37:59 +0900709#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
Dave Mitchell5c057592008-11-20 14:09:50 -0600710 lis r2,0x7fff
711 ori r2,r2,0xffff
712 mfdcr r1,ISRAM1_DPC
713 and r1,r1,r2 /* Disable parity check */
Wolfgang Denk55334c72008-12-16 01:02:17 +0100714 mtdcr ISRAM1_DPC,r1
Dave Mitchell5c057592008-11-20 14:09:50 -0600715 mfdcr r1,ISRAM1_PMEG
716 and r1,r1,r2 /* Disable pwr mgmt */
717 mtdcr ISRAM1_PMEG,r1
718
719 lis r1,0x0004 /* BAS = 4_0004_0000 */
Tirumala Marri95ac4282010-09-28 14:15:14 -0700720 ori r1,r1,ISRAM1_SIZE /* ocm size */
Dave Mitchell5c057592008-11-20 14:09:50 -0600721 mtdcr ISRAM1_SB0CR,r1
722#endif
Feng Kan224bc962008-07-08 22:47:31 -0700723#elif defined(CONFIG_460SX)
724 lis r1,0x0000 /* BAS = 0000_0000 */
725 ori r1,r1,0x0B84 /* first 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600726 mtdcr ISRAM0_SB0CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700727 lis r1,0x0001
728 ori r1,r1,0x0B84 /* second 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600729 mtdcr ISRAM0_SB1CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700730 lis r1, 0x0002
731 ori r1,r1, 0x0B84 /* third 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600732 mtdcr ISRAM0_SB2CR,r1
Feng Kan224bc962008-07-08 22:47:31 -0700733 lis r1, 0x0003
734 ori r1,r1, 0x0B84 /* fourth 128k */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600735 mtdcr ISRAM0_SB3CR,r1
Stefan Roese42fbddd2006-09-07 11:51:23 +0200736#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000737 ori r1,r1,0x0380 /* 8k rw */
Dave Mitchell3c3734172008-11-20 14:00:49 -0600738 mtdcr ISRAM0_SB0CR,r1
739 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
Stefan Roese326c9712005-08-01 16:41:48 +0200740#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200741#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000742
743 /*----------------------------------------------------------------*/
744 /* Setup the stack in internal SRAM */
745 /*----------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200746 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
747 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000748 li r0,0
749 stwu r0,-4(r1)
750 stwu r0,-4(r1) /* Terminate call chain */
751
752 stwu r1,-8(r1) /* Save back chain and move SP */
753 lis r0,RESET_VECTOR@h /* Address of reset vector */
754 ori r0,r0, RESET_VECTOR@l
755 stwu r1,-8(r1) /* Save back chain and move SP */
756 stw r0,+12(r1) /* Save return addr (underflow vect) */
Wolfgang Denkb2d36ea2011-04-20 22:11:21 +0200757
Stefan Roese07038ad2013-04-02 10:37:04 +0200758#ifndef CONFIG_SPL_BUILD
wdenk0442ed82002-11-03 10:24:00 +0000759 GET_GOT
Stefan Roese07038ad2013-04-02 10:37:04 +0200760#endif
Stefan Roesec443fe92005-11-22 13:20:42 +0100761
762 bl cpu_init_f /* run low-level CPU init code (from Flash) */
Simon Glasse2966012015-02-07 11:51:42 -0700763 mr r3, r1
Albert ARIBAUD6cb4c462015-11-25 17:56:32 +0100764 bl board_init_f_alloc_reserve
Simon Glasse2966012015-02-07 11:51:42 -0700765 mr r1, r3
Albert ARIBAUD6cb4c462015-11-25 17:56:32 +0100766 bl board_init_f_init_reserve
Simon Glasse2966012015-02-07 11:51:42 -0700767 li r0,0
768 stwu r0, -4(r1)
769 stwu r0, -4(r1)
Simon Glasse2966012015-02-07 11:51:42 -0700770 li r3, 0
wdenk0442ed82002-11-03 10:24:00 +0000771 bl board_init_f
Peter Tyser0c44caf2010-09-14 19:13:53 -0500772 /* NOTREACHED - board_init_f() does not return */
wdenk0442ed82002-11-03 10:24:00 +0000773
774#endif /* CONFIG_440 */
775
776/*****************************************************************************/
Matthias Fuchse54a67f2013-08-07 12:10:38 +0200777#if defined(CONFIG_405GP) || \
Stefan Roese17ffbc82007-03-21 13:38:59 +0100778 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roese153b3e22007-10-05 17:10:59 +0200779 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000780 /*----------------------------------------------------------------------- */
781 /* Clear and set up some registers. */
782 /*----------------------------------------------------------------------- */
783 addi r4,r0,0x0000
Stefan Roese153b3e22007-10-05 17:10:59 +0200784#if !defined(CONFIG_405EX)
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200785 mtspr SPRN_SGR,r4
Stefan Roese153b3e22007-10-05 17:10:59 +0200786#else
787 /*
788 * On 405EX, completely clearing the SGR leads to PPC hangup
789 * upon PCIe configuration access. The PCIe memory regions
790 * need to be guarded!
791 */
792 lis r3,0x0000
793 ori r3,r3,0x7FFC
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200794 mtspr SPRN_SGR,r3
Stefan Roese153b3e22007-10-05 17:10:59 +0200795#endif
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200796 mtspr SPRN_DCWR,r4
wdenk0442ed82002-11-03 10:24:00 +0000797 mtesr r4 /* clear Exception Syndrome Reg */
798 mttcr r4 /* clear Timer Control Reg */
799 mtxer r4 /* clear Fixed-Point Exception Reg */
800 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000801 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
802 /* dbsr is cleared by setting bits to 1) */
803 mtdbsr r4 /* clear/reset the dbsr */
804
Grant Ericksonb6933412008-05-22 14:44:14 -0700805 /* Invalidate the i- and d-caches. */
wdenk0442ed82002-11-03 10:24:00 +0000806 bl invalidate_icache
807 bl invalidate_dcache
808
Grant Ericksonb6933412008-05-22 14:44:14 -0700809 /* Set-up icache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200810 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
811 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700812 mticcr r4
wdenk0442ed82002-11-03 10:24:00 +0000813 isync
814
Grant Ericksonb6933412008-05-22 14:44:14 -0700815 /* Set-up dcache cacheability. */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200816 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
817 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700818 mtdccr r4
wdenk0442ed82002-11-03 10:24:00 +0000819
Ricardo Ribalda Delgado78ea77e2008-10-21 18:29:46 +0200820#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
821 && !defined (CONFIG_XILINX_405)
wdenk0442ed82002-11-03 10:24:00 +0000822 /*----------------------------------------------------------------------- */
823 /* Tune the speed and size for flash CS0 */
824 /*----------------------------------------------------------------------- */
825 bl ext_bus_cntlr_init
826#endif
Stefan Roese7d72e022008-06-02 14:35:44 +0200827
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200828#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
Stefan Roese153b3e22007-10-05 17:10:59 +0200829 /*
Grant Ericksonb6933412008-05-22 14:44:14 -0700830 * For boards that don't have OCM and can't use the data cache
831 * for their primordial stack, setup stack here directly after the
832 * SDRAM is initialized in ext_bus_cntlr_init.
Stefan Roese153b3e22007-10-05 17:10:59 +0200833 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200834 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
835 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
Stefan Roese153b3e22007-10-05 17:10:59 +0200836
837 li r0, 0 /* Make room for stack frame header and */
838 stwu r0, -4(r1) /* clear final stack frame so that */
839 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
840 /*
841 * Set up a dummy frame to store reset vector as return address.
842 * this causes stack underflow to reset board.
843 */
844 stwu r1, -8(r1) /* Save back chain and move SP */
845 lis r0, RESET_VECTOR@h /* Address of reset vector */
846 ori r0, r0, RESET_VECTOR@l
847 stwu r1, -8(r1) /* Save back chain and move SP */
848 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200849#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000850
stroese434979e2003-05-23 11:18:02 +0000851#if defined(CONFIG_405EP)
852 /*----------------------------------------------------------------------- */
853 /* DMA Status, clear to come up clean */
854 /*----------------------------------------------------------------------- */
Wolfgang Denka1be4762008-05-20 16:00:29 +0200855 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200856 ori r3,r3, 0xFFFF
Stefan Roese918010a2009-09-09 16:25:29 +0200857 mtdcr DMASR, r3
stroese434979e2003-05-23 11:18:02 +0000858
Wolfgang Denka1be4762008-05-20 16:00:29 +0200859 bl ppc405ep_init /* do ppc405ep specific init */
stroese434979e2003-05-23 11:18:02 +0000860#endif /* CONFIG_405EP */
861
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200862#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
Stefan Roese17ffbc82007-03-21 13:38:59 +0100863#if defined(CONFIG_405EZ)
864 /********************************************************************
865 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
866 *******************************************************************/
867 /*
868 * We can map the OCM on the PLB3, so map it at
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200869 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
Stefan Roese17ffbc82007-03-21 13:38:59 +0100870 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200871 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
872 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roese80d99a42007-06-19 16:42:31 +0200873 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roese918010a2009-09-09 16:25:29 +0200874 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100875 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roese918010a2009-09-09 16:25:29 +0200876 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100877 isync
878
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200879 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
880 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200881 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roese918010a2009-09-09 16:25:29 +0200882 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
883 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100884 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Stefan Roese918010a2009-09-09 16:25:29 +0200885 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
886 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200887 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roese918010a2009-09-09 16:25:29 +0200888 mtdcr OCM0_DISDPC,r3
Stefan Roese17ffbc82007-03-21 13:38:59 +0100889
890 isync
Stefan Roesef6c7b762007-03-24 15:45:34 +0100891#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000892 /********************************************************************
893 * Setup OCM - On Chip Memory
894 *******************************************************************/
895 /* Setup OCM */
wdenk57b2d802003-06-27 21:31:46 +0000896 lis r0, 0x7FFF
897 ori r0, r0, 0xFFFF
Stefan Roese918010a2009-09-09 16:25:29 +0200898 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
899 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
Stefan Roesef6c7b762007-03-24 15:45:34 +0100900 and r3, r3, r0 /* disable data-side IRAM */
901 and r4, r4, r0 /* disable data-side IRAM */
Stefan Roese918010a2009-09-09 16:25:29 +0200902 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
903 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
wdenk57b2d802003-06-27 21:31:46 +0000904 isync
wdenk0442ed82002-11-03 10:24:00 +0000905
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200906 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
907 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
Stefan Roese918010a2009-09-09 16:25:29 +0200908 mtdcr OCM0_DSARC, r3
wdenk0442ed82002-11-03 10:24:00 +0000909 addis r4, 0, 0xC000 /* OCM data area enabled */
Stefan Roese918010a2009-09-09 16:25:29 +0200910 mtdcr OCM0_DSCNTL, r4
wdenk57b2d802003-06-27 21:31:46 +0000911 isync
Stefan Roese17ffbc82007-03-21 13:38:59 +0100912#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000913#endif
914
915 /*----------------------------------------------------------------------- */
916 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
917 /*----------------------------------------------------------------------- */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200918#ifdef CONFIG_SYS_INIT_DCACHE_CS
Grant Ericksonb6933412008-05-22 14:44:14 -0700919 li r4, PBxAP
Stefan Roese918010a2009-09-09 16:25:29 +0200920 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200921 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
922 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
Stefan Roese918010a2009-09-09 16:25:29 +0200923 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000924
Grant Ericksonb6933412008-05-22 14:44:14 -0700925 addi r4, 0, PBxCR
Stefan Roese918010a2009-09-09 16:25:29 +0200926 mtdcr EBC0_CFGADDR, r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200927 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
928 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
Stefan Roese918010a2009-09-09 16:25:29 +0200929 mtdcr EBC0_CFGDATA, r4
wdenk0442ed82002-11-03 10:24:00 +0000930
Grant Ericksonb6933412008-05-22 14:44:14 -0700931 /*
932 * Enable the data cache for the 128MB storage access control region
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200933 * at CONFIG_SYS_INIT_RAM_ADDR.
Grant Ericksonb6933412008-05-22 14:44:14 -0700934 */
935 mfdccr r4
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200936 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
937 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
wdenk0442ed82002-11-03 10:24:00 +0000938 mtdccr r4
939
Grant Ericksonb6933412008-05-22 14:44:14 -0700940 /*
941 * Preallocate data cache lines to be used to avoid a subsequent
942 * cache miss and an ensuing machine check exception when exceptions
943 * are enabled.
944 */
945 li r0, 0
946
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200947 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
948 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +0000949
Wolfgang Denk1c2e98e2010-10-26 13:32:32 +0200950 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
951 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
wdenk0442ed82002-11-03 10:24:00 +0000952
Grant Ericksonb6933412008-05-22 14:44:14 -0700953 /*
954 * Convert the size, in bytes, to the number of cache lines/blocks
955 * to preallocate.
956 */
957 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
958 srwi r5, r4, L1_CACHE_SHIFT
959 beq ..load_counter
960 addi r5, r5, 0x0001
961..load_counter:
962 mtctr r5
963
964 /* Preallocate the computed number of cache blocks. */
965..alloc_dcache_block:
966 dcba r0, r3
967 addi r3, r3, L1_CACHE_BYTES
968 bdnz ..alloc_dcache_block
969 sync
970
971 /*
972 * Load the initial stack pointer and data area and convert the size,
973 * in bytes, to the number of words to initialize to a known value.
974 */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200975 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
976 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
Grant Ericksonb6933412008-05-22 14:44:14 -0700977
Wolfgang Denk1c2e98e2010-10-26 13:32:32 +0200978 lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h
979 ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l
wdenk0442ed82002-11-03 10:24:00 +0000980 mtctr r4
981
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200982 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
Wolfgang Denk1c2e98e2010-10-26 13:32:32 +0200983 ori r2, r2, CONFIG_SYS_INIT_RAM_SIZE@l
wdenk0442ed82002-11-03 10:24:00 +0000984
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200985 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
986 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
wdenk0442ed82002-11-03 10:24:00 +0000987
988..stackloop:
Grant Ericksonb6933412008-05-22 14:44:14 -0700989 stwu r4, -4(r2)
wdenk0442ed82002-11-03 10:24:00 +0000990 bdnz ..stackloop
991
Grant Ericksonb6933412008-05-22 14:44:14 -0700992 /*
993 * Make room for stack frame header and clear final stack frame so
994 * that stack backtraces terminate cleanly.
995 */
996 stwu r0, -4(r1)
997 stwu r0, -4(r1)
998
wdenk0442ed82002-11-03 10:24:00 +0000999 /*
1000 * Set up a dummy frame to store reset vector as return address.
1001 * this causes stack underflow to reset board.
1002 */
1003 stwu r1, -8(r1) /* Save back chain and move SP */
1004 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1005 ori r0, r0, RESET_VECTOR@l
1006 stwu r1, -8(r1) /* Save back chain and move SP */
1007 stw r0, +12(r1) /* Save return addr (underflow vect) */
1008
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001009#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1010 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
wdenk0442ed82002-11-03 10:24:00 +00001011 /*
1012 * Stack in OCM.
1013 */
1014
1015 /* Set up Stack at top of OCM */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001016 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1017 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
wdenk0442ed82002-11-03 10:24:00 +00001018
1019 /* Set up a zeroized stack frame so that backtrace works right */
1020 li r0, 0
1021 stwu r0, -4(r1)
1022 stwu r0, -4(r1)
1023
1024 /*
1025 * Set up a dummy frame to store reset vector as return address.
1026 * this causes stack underflow to reset board.
1027 */
1028 stwu r1, -8(r1) /* Save back chain and move SP */
1029 lis r0, RESET_VECTOR@h /* Address of reset vector */
1030 ori r0, r0, RESET_VECTOR@l
1031 stwu r1, -8(r1) /* Save back chain and move SP */
1032 stw r0, +12(r1) /* Save return addr (underflow vect) */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001033#endif /* CONFIG_SYS_INIT_DCACHE_CS */
wdenk0442ed82002-11-03 10:24:00 +00001034
wdenk0442ed82002-11-03 10:24:00 +00001035 GET_GOT /* initialize GOT access */
1036
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001037 bl cpu_init_f /* run low-level CPU init code (from Flash) */
Simon Glasse2966012015-02-07 11:51:42 -07001038 mr r3, r1
Albert ARIBAUD6cb4c462015-11-25 17:56:32 +01001039 bl board_init_f_alloc_reserve
Simon Glasse2966012015-02-07 11:51:42 -07001040 mr r1, r3
Albert ARIBAUD6cb4c462015-11-25 17:56:32 +01001041 bl board_init_f_init_reserve
Simon Glasse2966012015-02-07 11:51:42 -07001042 stwu r0, -4(r1)
1043 stwu r0, -4(r1)
Simon Glasse2966012015-02-07 11:51:42 -07001044 li r3, 0
wdenk0442ed82002-11-03 10:24:00 +00001045 bl board_init_f /* run first part of init code (from Flash) */
Peter Tyser0c44caf2010-09-14 19:13:53 -05001046 /* NOTREACHED - board_init_f() does not return */
1047
Matthias Fuchse54a67f2013-08-07 12:10:38 +02001048#endif /* CONFIG_405GP || CONFIG_405 || CONFIG_405EP */
wdenk232fe0b2003-09-02 22:48:03 +00001049 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001050
1051
Stefan Roeseb3859f22014-03-04 15:34:35 +01001052#if !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +00001053/*
1054 * This code finishes saving the registers to the exception frame
1055 * and jumps to the appropriate handler for the exception.
1056 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1057 */
1058 .globl transfer_to_handler
1059transfer_to_handler:
1060 stw r22,_NIP(r21)
1061 lis r22,MSR_POW@h
1062 andc r23,r23,r22
1063 stw r23,_MSR(r21)
1064 SAVE_GPR(7, r21)
1065 SAVE_4GPRS(8, r21)
1066 SAVE_8GPRS(12, r21)
1067 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001068 mflr r23
1069 andi. r24,r23,0x3f00 /* get vector offset */
1070 stw r24,TRAP(r21)
1071 li r22,0
1072 stw r22,RESULT(r21)
1073 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001074 lwz r24,0(r23) /* virtual address of handler */
1075 lwz r23,4(r23) /* where to go when done */
1076 mtspr SRR0,r24
1077 mtspr SRR1,r20
1078 mtlr r23
1079 SYNC
1080 rfi /* jump to handler, enable MMU */
1081
1082int_return:
1083 mfmsr r28 /* Disable interrupts */
1084 li r4,0
1085 ori r4,r4,MSR_EE
1086 andc r28,r28,r4
1087 SYNC /* Some chip revs need this... */
1088 mtmsr r28
1089 SYNC
1090 lwz r2,_CTR(r1)
1091 lwz r0,_LINK(r1)
1092 mtctr r2
1093 mtlr r0
1094 lwz r2,_XER(r1)
1095 lwz r0,_CCR(r1)
1096 mtspr XER,r2
1097 mtcrf 0xFF,r0
1098 REST_10GPRS(3, r1)
1099 REST_10GPRS(13, r1)
1100 REST_8GPRS(23, r1)
1101 REST_GPR(31, r1)
1102 lwz r2,_NIP(r1) /* Restore environment */
1103 lwz r0,_MSR(r1)
1104 mtspr SRR0,r2
1105 mtspr SRR1,r0
1106 lwz r0,GPR0(r1)
1107 lwz r2,GPR2(r1)
1108 lwz r1,GPR1(r1)
1109 SYNC
1110 rfi
1111
1112crit_return:
1113 mfmsr r28 /* Disable interrupts */
1114 li r4,0
1115 ori r4,r4,MSR_EE
1116 andc r28,r28,r4
1117 SYNC /* Some chip revs need this... */
1118 mtmsr r28
1119 SYNC
1120 lwz r2,_CTR(r1)
1121 lwz r0,_LINK(r1)
1122 mtctr r2
1123 mtlr r0
1124 lwz r2,_XER(r1)
1125 lwz r0,_CCR(r1)
1126 mtspr XER,r2
1127 mtcrf 0xFF,r0
1128 REST_10GPRS(3, r1)
1129 REST_10GPRS(13, r1)
1130 REST_8GPRS(23, r1)
1131 REST_GPR(31, r1)
1132 lwz r2,_NIP(r1) /* Restore environment */
1133 lwz r0,_MSR(r1)
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001134 mtspr SPRN_CSRR0,r2
1135 mtspr SPRN_CSRR1,r0
wdenk0442ed82002-11-03 10:24:00 +00001136 lwz r0,GPR0(r1)
1137 lwz r2,GPR2(r1)
1138 lwz r1,GPR1(r1)
1139 SYNC
1140 rfci
1141
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001142#ifdef CONFIG_440
1143mck_return:
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001144 mfmsr r28 /* Disable interrupts */
1145 li r4,0
1146 ori r4,r4,MSR_EE
1147 andc r28,r28,r4
1148 SYNC /* Some chip revs need this... */
1149 mtmsr r28
1150 SYNC
1151 lwz r2,_CTR(r1)
1152 lwz r0,_LINK(r1)
1153 mtctr r2
1154 mtlr r0
1155 lwz r2,_XER(r1)
1156 lwz r0,_CCR(r1)
1157 mtspr XER,r2
1158 mtcrf 0xFF,r0
1159 REST_10GPRS(3, r1)
1160 REST_10GPRS(13, r1)
1161 REST_8GPRS(23, r1)
1162 REST_GPR(31, r1)
1163 lwz r2,_NIP(r1) /* Restore environment */
1164 lwz r0,_MSR(r1)
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001165 mtspr SPRN_MCSRR0,r2
1166 mtspr SPRN_MCSRR1,r0
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001167 lwz r0,GPR0(r1)
1168 lwz r2,GPR2(r1)
1169 lwz r1,GPR1(r1)
1170 SYNC
1171 rfmci
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001172#endif /* CONFIG_440 */
1173
1174
wdenk0442ed82002-11-03 10:24:00 +00001175 .globl get_pvr
1176get_pvr:
1177 mfspr r3, PVR
1178 blr
1179
wdenk0442ed82002-11-03 10:24:00 +00001180/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001181/* Function: out16 */
1182/* Description: Output 16 bits */
1183/*------------------------------------------------------------------------------- */
1184 .globl out16
1185out16:
1186 sth r4,0x0000(r3)
1187 blr
1188
1189/*------------------------------------------------------------------------------- */
1190/* Function: out16r */
1191/* Description: Byte reverse and output 16 bits */
1192/*------------------------------------------------------------------------------- */
1193 .globl out16r
1194out16r:
1195 sthbrx r4,r0,r3
1196 blr
1197
1198/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001199/* Function: out32r */
1200/* Description: Byte reverse and output 32 bits */
1201/*------------------------------------------------------------------------------- */
1202 .globl out32r
1203out32r:
1204 stwbrx r4,r0,r3
1205 blr
1206
1207/*------------------------------------------------------------------------------- */
1208/* Function: in16 */
1209/* Description: Input 16 bits */
1210/*------------------------------------------------------------------------------- */
1211 .globl in16
1212in16:
1213 lhz r3,0x0000(r3)
1214 blr
1215
1216/*------------------------------------------------------------------------------- */
1217/* Function: in16r */
1218/* Description: Input 16 bits and byte reverse */
1219/*------------------------------------------------------------------------------- */
1220 .globl in16r
1221in16r:
1222 lhbrx r3,r0,r3
1223 blr
1224
1225/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001226/* Function: in32r */
1227/* Description: Input 32 bits and byte reverse */
1228/*------------------------------------------------------------------------------- */
1229 .globl in32r
1230in32r:
1231 lwbrx r3,r0,r3
1232 blr
1233
Stefan Roese07038ad2013-04-02 10:37:04 +02001234#if !defined(CONFIG_SPL_BUILD)
wdenk0442ed82002-11-03 10:24:00 +00001235/*
1236 * void relocate_code (addr_sp, gd, addr_moni)
1237 *
1238 * This "function" does not return, instead it continues in RAM
1239 * after relocating the monitor code.
1240 *
Grant Ericksonb6933412008-05-22 14:44:14 -07001241 * r3 = Relocated stack pointer
1242 * r4 = Relocated global data pointer
1243 * r5 = Relocated text pointer
wdenk0442ed82002-11-03 10:24:00 +00001244 */
1245 .globl relocate_code
1246relocate_code:
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001247#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001248 /*
Stefan Roese593a0fb2010-11-26 15:45:34 +01001249 * We need to flush the initial global data (gd_t) and bd_info
1250 * before the dcache will be invalidated.
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001251 */
1252
Grant Ericksonb6933412008-05-22 14:44:14 -07001253 /* Save registers */
1254 mr r9, r3
1255 mr r10, r4
1256 mr r11, r5
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001257
Stefan Roese593a0fb2010-11-26 15:45:34 +01001258 /*
1259 * Flush complete dcache, this is faster than flushing the
1260 * ranges for global_data and bd_info instead.
1261 */
1262 bl flush_dcache
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001263
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001264#if defined(CONFIG_SYS_INIT_DCACHE_CS)
Grant Ericksonb6933412008-05-22 14:44:14 -07001265 /*
1266 * Undo the earlier data cache set-up for the primordial stack and
1267 * data area. First, invalidate the data cache and then disable data
1268 * cacheability for that area. Finally, restore the EBC values, if
1269 * any.
1270 */
1271
1272 /* Invalidate the primordial stack and data area in cache */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001273 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1274 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001275
Wolfgang Denk1c2e98e2010-10-26 13:32:32 +02001276 lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1277 ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001278 add r4, r4, r3
1279
1280 bl invalidate_dcache_range
1281
1282 /* Disable cacheability for the region */
1283 mfdccr r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001284 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1285 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
Grant Ericksonb6933412008-05-22 14:44:14 -07001286 and r3, r3, r4
1287 mtdccr r3
1288
1289 /* Restore the EBC parameters */
1290 li r3, PBxAP
Stefan Roese918010a2009-09-09 16:25:29 +02001291 mtdcr EBC0_CFGADDR, r3
Grant Ericksonb6933412008-05-22 14:44:14 -07001292 lis r3, PBxAP_VAL@h
1293 ori r3, r3, PBxAP_VAL@l
Stefan Roese918010a2009-09-09 16:25:29 +02001294 mtdcr EBC0_CFGDATA, r3
Grant Ericksonb6933412008-05-22 14:44:14 -07001295
1296 li r3, PBxCR
Stefan Roese918010a2009-09-09 16:25:29 +02001297 mtdcr EBC0_CFGADDR, r3
Grant Ericksonb6933412008-05-22 14:44:14 -07001298 lis r3, PBxCR_VAL@h
1299 ori r3, r3, PBxCR_VAL@l
Stefan Roese918010a2009-09-09 16:25:29 +02001300 mtdcr EBC0_CFGDATA, r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001301#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
Grant Ericksonb6933412008-05-22 14:44:14 -07001302
1303 /* Restore registers */
1304 mr r3, r9
1305 mr r4, r10
1306 mr r5, r11
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001307#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
Stefan Roesea86bde32008-01-09 10:23:16 +01001308
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001309#ifdef CONFIG_SYS_INIT_RAM_DCACHE
Stefan Roesea86bde32008-01-09 10:23:16 +01001310 /*
1311 * Unlock the previously locked d-cache
1312 */
1313 msync
1314 isync
1315 /* set TFLOOR/NFLOOR to 0 again */
1316 lis r6,0x0001
1317 ori r6,r6,0xf800
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001318 mtspr SPRN_DVLIM,r6
Stefan Roesea86bde32008-01-09 10:23:16 +01001319 lis r6,0x0000
1320 ori r6,r6,0x0000
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001321 mtspr SPRN_DNV0,r6
1322 mtspr SPRN_DNV1,r6
1323 mtspr SPRN_DNV2,r6
1324 mtspr SPRN_DNV3,r6
1325 mtspr SPRN_DTV0,r6
1326 mtspr SPRN_DTV1,r6
1327 mtspr SPRN_DTV2,r6
1328 mtspr SPRN_DTV3,r6
Stefan Roesea86bde32008-01-09 10:23:16 +01001329 msync
1330 isync
Stefan Roese04bb5fc2010-08-31 11:27:14 +02001331
1332 /* Invalidate data cache, now no longer our stack */
1333 dccci 0,0
1334 sync
1335 isync
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001336#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
Stefan Roesea86bde32008-01-09 10:23:16 +01001337
Stefan Roese9eba0c82006-06-02 16:18:04 +02001338 /*
1339 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1340 * to speed up the boot process. Now this cache needs to be disabled.
1341 */
Stefan Roese1d568062010-05-27 16:45:20 +02001342#if defined(CONFIG_440)
Stefan Roesefe05a022008-11-20 11:46:20 +01001343 /* Clear all potential pending exceptions */
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001344 mfspr r1,SPRN_MCSR
1345 mtspr SPRN_MCSR,r1
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001346 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
Stefan Roese326c9712005-08-01 16:41:48 +02001347 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese99644742005-11-29 18:18:21 +01001348 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001349 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roese9eba0c82006-06-02 16:18:04 +02001350 sync
Stefan Roese326c9712005-08-01 16:41:48 +02001351 isync
Stefan Roese1d568062010-05-27 16:45:20 +02001352#endif /* defined(CONFIG_440) */
wdenk0442ed82002-11-03 10:24:00 +00001353 mr r1, r3 /* Set new stack pointer */
1354 mr r9, r4 /* Save copy of Init Data pointer */
1355 mr r10, r5 /* Save copy of Destination Address */
1356
Joakim Tjernlund3fbaa4d2010-01-19 14:41:56 +01001357 GET_GOT
wdenk0442ed82002-11-03 10:24:00 +00001358 mr r3, r5 /* Destination Address */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001359 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1360 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
wdenkb9a83a92003-05-30 12:48:29 +00001361 lwz r5, GOT(__init_end)
1362 sub r5, r5, r4
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001363 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001364
1365 /*
1366 * Fix GOT pointer:
1367 *
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001368 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
wdenk0442ed82002-11-03 10:24:00 +00001369 *
1370 * Offset:
1371 */
1372 sub r15, r10, r4
1373
1374 /* First our own GOT */
Joakim Tjernlund3fbaa4d2010-01-19 14:41:56 +01001375 add r12, r12, r15
Grant Ericksonb6933412008-05-22 14:44:14 -07001376 /* then the one used by the C code */
wdenk0442ed82002-11-03 10:24:00 +00001377 add r30, r30, r15
1378
1379 /*
1380 * Now relocate code
1381 */
1382
1383 cmplw cr1,r3,r4
1384 addi r0,r5,3
1385 srwi. r0,r0,2
1386 beq cr1,4f /* In place copy is not necessary */
1387 beq 7f /* Protect against 0 count */
1388 mtctr r0
1389 bge cr1,2f
1390
1391 la r8,-4(r4)
1392 la r7,-4(r3)
13931: lwzu r0,4(r8)
1394 stwu r0,4(r7)
1395 bdnz 1b
1396 b 4f
1397
13982: slwi r0,r0,2
1399 add r8,r4,r0
1400 add r7,r3,r0
14013: lwzu r0,-4(r8)
1402 stwu r0,-4(r7)
1403 bdnz 3b
1404
1405/*
1406 * Now flush the cache: note that we must start from a cache aligned
1407 * address. Otherwise we might miss one cache line.
1408 */
14094: cmpwi r6,0
1410 add r5,r3,r5
1411 beq 7f /* Always flush prefetch queue in any case */
1412 subi r0,r6,1
1413 andc r3,r3,r0
1414 mr r4,r3
14155: dcbst 0,r4
1416 add r4,r4,r6
1417 cmplw r4,r5
1418 blt 5b
1419 sync /* Wait for all dcbst to complete on bus */
1420 mr r4,r3
14216: icbi 0,r4
1422 add r4,r4,r6
1423 cmplw r4,r5
1424 blt 6b
14257: sync /* Wait for all icbi to complete on bus */
1426 isync
1427
1428/*
1429 * We are done. Do not return, instead branch to second part of board
1430 * initialization, now running from RAM.
1431 */
1432
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001433 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001434 mtlr r0
1435 blr /* NEVER RETURNS! */
1436
1437in_ram:
1438
1439 /*
Joakim Tjernlund3fbaa4d2010-01-19 14:41:56 +01001440 * Relocation Function, r12 point to got2+0x8000
wdenk0442ed82002-11-03 10:24:00 +00001441 *
1442 * Adjust got2 pointers, no need to check for 0, this code
1443 * already puts a few entries in the table.
1444 */
1445 li r0,__got2_entries@sectoff@l
1446 la r3,GOT(_GOT2_TABLE_)
1447 lwz r11,GOT(_GOT2_TABLE_)
1448 mtctr r0
1449 sub r11,r3,r11
1450 addi r3,r3,-4
14511: lwzu r0,4(r3)
Joakim Tjernlund4f2fdac2009-10-08 02:03:51 +02001452 cmpwi r0,0
1453 beq- 2f
wdenk0442ed82002-11-03 10:24:00 +00001454 add r0,r0,r11
1455 stw r0,0(r3)
Joakim Tjernlund4f2fdac2009-10-08 02:03:51 +020014562: bdnz 1b
wdenk0442ed82002-11-03 10:24:00 +00001457
1458 /*
1459 * Now adjust the fixups and the pointers to the fixups
1460 * in case we need to move ourselves again.
1461 */
Joakim Tjernlund4f2fdac2009-10-08 02:03:51 +02001462 li r0,__fixup_entries@sectoff@l
wdenk0442ed82002-11-03 10:24:00 +00001463 lwz r3,GOT(_FIXUP_TABLE_)
1464 cmpwi r0,0
1465 mtctr r0
1466 addi r3,r3,-4
1467 beq 4f
14683: lwzu r4,4(r3)
1469 lwzux r0,r4,r11
Joakim Tjernlundc61b25a2010-10-14 11:51:44 +02001470 cmpwi r0,0
wdenk0442ed82002-11-03 10:24:00 +00001471 add r0,r0,r11
Joakim Tjernlund401b5922010-11-04 19:02:00 +01001472 stw r4,0(r3)
Joakim Tjernlundc61b25a2010-10-14 11:51:44 +02001473 beq- 5f
wdenk0442ed82002-11-03 10:24:00 +00001474 stw r0,0(r4)
Joakim Tjernlundc61b25a2010-10-14 11:51:44 +020014755: bdnz 3b
wdenk0442ed82002-11-03 10:24:00 +000014764:
1477clear_bss:
1478 /*
1479 * Now clear BSS segment
1480 */
wdenkbf2f8c92003-05-22 22:52:13 +00001481 lwz r3,GOT(__bss_start)
Simon Glassed70c8f2013-03-14 06:54:53 +00001482 lwz r4,GOT(__bss_end)
wdenk0442ed82002-11-03 10:24:00 +00001483
1484 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001485 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001486
1487 li r0, 0
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001488
1489 andi. r5, r4, 3
1490 beq 6f
1491 sub r4, r4, r5
1492 mtctr r5
1493 mr r5, r4
14945: stb r0, 0(r5)
1495 addi r5, r5, 1
1496 bdnz 5b
14976:
wdenk0442ed82002-11-03 10:24:00 +00001498 stw r0, 0(r3)
1499 addi r3, r3, 4
1500 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001501 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001502
Anatolij Gustschin720025b2007-12-05 17:43:20 +010015037:
wdenk0442ed82002-11-03 10:24:00 +00001504 mr r3, r9 /* Init Data pointer */
1505 mr r4, r10 /* Destination Address */
1506 bl board_init_r
1507
wdenk0442ed82002-11-03 10:24:00 +00001508 /*
1509 * Copy exception vector code to low memory
1510 *
1511 * r3: dest_addr
1512 * r7: source address, r8: end address, r9: target address
1513 */
1514 .globl trap_init
1515trap_init:
Joakim Tjernlund3fbaa4d2010-01-19 14:41:56 +01001516 mflr r4 /* save link register */
1517 GET_GOT
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001518 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001519 lwz r8, GOT(_end_of_vectors)
1520
wdenk4e112c12003-06-03 23:54:09 +00001521 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001522
1523 cmplw 0, r7, r8
1524 bgelr /* return if r7>=r8 - just in case */
wdenk0442ed82002-11-03 10:24:00 +000015251:
1526 lwz r0, 0(r7)
1527 stw r0, 0(r9)
1528 addi r7, r7, 4
1529 addi r9, r9, 4
1530 cmplw 0, r7, r8
1531 bne 1b
1532
1533 /*
1534 * relocate `hdlr' and `int_return' entries
1535 */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001536 li r7, .L_MachineCheck - _start + _START_OFFSET
1537 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000015382:
1539 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001540 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001541 cmplw 0, r7, r8
1542 blt 2b
1543
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001544 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001545 bl trap_reloc
1546
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001547 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001548 bl trap_reloc
1549
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001550#ifdef CONFIG_440
1551 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001552 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001553
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001554 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001555 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001556
1557 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001558 bl trap_reloc
Stefan Roese80d99a42007-06-19 16:42:31 +02001559
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001560 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1561 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001562
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001563 li r7, .L_DataTLBError - _start + _START_OFFSET
1564 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001565#else /* CONFIG_440 */
1566 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001567 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001568
1569 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001570 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001571
1572 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001573 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001574#endif /* CONFIG_440 */
1575
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001576 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1577 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001578
Stefan Roese42fbddd2006-09-07 11:51:23 +02001579#if !defined(CONFIG_440)
Stefan Roese7b12aa82006-03-13 09:42:28 +01001580 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1581 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1582 mtmsr r7 /* change MSR */
1583#else
Stefan Roese42fbddd2006-09-07 11:51:23 +02001584 bl __440_msr_set
1585 b __440_msr_continue
Stefan Roese7b12aa82006-03-13 09:42:28 +01001586
Stefan Roese42fbddd2006-09-07 11:51:23 +02001587__440_msr_set:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001588 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1589 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001590 mtspr SPRN_SRR1,r7
Stefan Roese7b12aa82006-03-13 09:42:28 +01001591 mflr r7
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001592 mtspr SPRN_SRR0,r7
Stefan Roese7b12aa82006-03-13 09:42:28 +01001593 rfi
Stefan Roese42fbddd2006-09-07 11:51:23 +02001594__440_msr_continue:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001595#endif
1596
wdenk0442ed82002-11-03 10:24:00 +00001597 mtlr r4 /* restore link register */
1598 blr
Stefan Roese07038ad2013-04-02 10:37:04 +02001599#endif /* CONFIG_SPL_BUILD */
wdenk0442ed82002-11-03 10:24:00 +00001600
Stefan Roese42743512007-06-01 15:27:11 +02001601#if defined(CONFIG_440)
1602/*----------------------------------------------------------------------------+
1603| dcbz_area.
1604+----------------------------------------------------------------------------*/
1605 function_prolog(dcbz_area)
1606 rlwinm. r5,r4,0,27,31
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001607 rlwinm r5,r4,27,5,31
1608 beq ..d_ra2
1609 addi r5,r5,0x0001
1610..d_ra2:mtctr r5
1611..d_ag2:dcbz r0,r3
1612 addi r3,r3,32
1613 bdnz ..d_ag2
Stefan Roese42743512007-06-01 15:27:11 +02001614 sync
1615 blr
1616 function_epilog(dcbz_area)
Stefan Roese42743512007-06-01 15:27:11 +02001617#endif /* CONFIG_440 */
Stefan Roeseb3859f22014-03-04 15:34:35 +01001618#endif /* CONFIG_SPL_BUILD */
stroese434979e2003-05-23 11:18:02 +00001619
Stefan Roese42743512007-06-01 15:27:11 +02001620/*------------------------------------------------------------------------------- */
1621/* Function: in8 */
1622/* Description: Input 8 bits */
1623/*------------------------------------------------------------------------------- */
1624 .globl in8
1625in8:
1626 lbz r3,0x0000(r3)
1627 blr
1628
1629/*------------------------------------------------------------------------------- */
1630/* Function: out8 */
1631/* Description: Output 8 bits */
1632/*------------------------------------------------------------------------------- */
1633 .globl out8
1634out8:
1635 stb r4,0x0000(r3)
1636 blr
1637
1638/*------------------------------------------------------------------------------- */
1639/* Function: out32 */
1640/* Description: Output 32 bits */
1641/*------------------------------------------------------------------------------- */
1642 .globl out32
1643out32:
1644 stw r4,0x0000(r3)
1645 blr
1646
1647/*------------------------------------------------------------------------------- */
1648/* Function: in32 */
1649/* Description: Input 32 bits */
1650/*------------------------------------------------------------------------------- */
1651 .globl in32
1652in32:
1653 lwz 3,0x0000(3)
1654 blr
stroese434979e2003-05-23 11:18:02 +00001655
1656/**************************************************************************/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001657/* PPC405EP specific stuff */
stroese434979e2003-05-23 11:18:02 +00001658/**************************************************************************/
1659#ifdef CONFIG_405EP
1660ppc405ep_init:
stroese5ad6d4d2003-12-09 14:54:43 +00001661
Stefan Roese326c9712005-08-01 16:41:48 +02001662#ifdef CONFIG_BUBINGA
stroese5ad6d4d2003-12-09 14:54:43 +00001663 /*
1664 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1665 * function) to support FPGA and NVRAM accesses below.
1666 */
1667
1668 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1669 ori r3,r3,GPIO0_OSRH@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001670 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1671 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
stroese5ad6d4d2003-12-09 14:54:43 +00001672 stw r4,0(r3)
1673 lis r3,GPIO0_OSRL@h
1674 ori r3,r3,GPIO0_OSRL@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001675 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1676 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
stroese5ad6d4d2003-12-09 14:54:43 +00001677 stw r4,0(r3)
1678
1679 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1680 ori r3,r3,GPIO0_ISR1H@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001681 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1682 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
stroese5ad6d4d2003-12-09 14:54:43 +00001683 stw r4,0(r3)
1684 lis r3,GPIO0_ISR1L@h
1685 ori r3,r3,GPIO0_ISR1L@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001686 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1687 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
stroese5ad6d4d2003-12-09 14:54:43 +00001688 stw r4,0(r3)
1689
1690 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1691 ori r3,r3,GPIO0_TSRH@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001692 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1693 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
stroese5ad6d4d2003-12-09 14:54:43 +00001694 stw r4,0(r3)
1695 lis r3,GPIO0_TSRL@h
1696 ori r3,r3,GPIO0_TSRL@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001697 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1698 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
stroese5ad6d4d2003-12-09 14:54:43 +00001699 stw r4,0(r3)
1700
1701 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1702 ori r3,r3,GPIO0_TCR@l
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001703 lis r4,CONFIG_SYS_GPIO0_TCR@h
1704 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
stroese5ad6d4d2003-12-09 14:54:43 +00001705 stw r4,0(r3)
1706
Stefan Roese918010a2009-09-09 16:25:29 +02001707 li r3,PB1AP /* program EBC bank 1 for RTC access */
1708 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001709 lis r3,CONFIG_SYS_EBC_PB1AP@h
1710 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roese918010a2009-09-09 16:25:29 +02001711 mtdcr EBC0_CFGDATA,r3
1712 li r3,PB1CR
1713 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001714 lis r3,CONFIG_SYS_EBC_PB1CR@h
1715 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001716 mtdcr EBC0_CFGDATA,r3
stroese5ad6d4d2003-12-09 14:54:43 +00001717
Stefan Roese918010a2009-09-09 16:25:29 +02001718 li r3,PB1AP /* program EBC bank 1 for RTC access */
1719 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001720 lis r3,CONFIG_SYS_EBC_PB1AP@h
1721 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
Stefan Roese918010a2009-09-09 16:25:29 +02001722 mtdcr EBC0_CFGDATA,r3
1723 li r3,PB1CR
1724 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001725 lis r3,CONFIG_SYS_EBC_PB1CR@h
1726 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001727 mtdcr EBC0_CFGDATA,r3
stroese5ad6d4d2003-12-09 14:54:43 +00001728
Stefan Roese918010a2009-09-09 16:25:29 +02001729 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1730 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001731 lis r3,CONFIG_SYS_EBC_PB4AP@h
1732 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
Stefan Roese918010a2009-09-09 16:25:29 +02001733 mtdcr EBC0_CFGDATA,r3
1734 li r3,PB4CR
1735 mtdcr EBC0_CFGADDR,r3
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +02001736 lis r3,CONFIG_SYS_EBC_PB4CR@h
1737 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
Stefan Roese918010a2009-09-09 16:25:29 +02001738 mtdcr EBC0_CFGDATA,r3
stroese5ad6d4d2003-12-09 14:54:43 +00001739#endif
stroese434979e2003-05-23 11:18:02 +00001740
wdenk57b2d802003-06-27 21:31:46 +00001741 /*
1742 !-----------------------------------------------------------------------
1743 ! Check to see if chip is in bypass mode.
1744 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1745 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001746 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1747 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk57b2d802003-06-27 21:31:46 +00001748 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001749 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001750 mfdcr r5, CPC0_PLLMR1
Wolfgang Denka1be4762008-05-20 16:00:29 +02001751 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001752 cmpi cr0,0,r4,0x1
stroese434979e2003-05-23 11:18:02 +00001753
Wolfgang Denka1be4762008-05-20 16:00:29 +02001754 beq pll_done /* if SSCS =b'1' then PLL has */
1755 /* already been set */
1756 /* and CPU has been reset */
1757 /* so skip to next section */
stroese434979e2003-05-23 11:18:02 +00001758
Stefan Roese326c9712005-08-01 16:41:48 +02001759#ifdef CONFIG_BUBINGA
stroese434979e2003-05-23 11:18:02 +00001760 /*
wdenk57b2d802003-06-27 21:31:46 +00001761 !-----------------------------------------------------------------------
1762 ! Read NVRAM to get value to write in PLLMR.
1763 ! If value has not been correctly saved, write default value
1764 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1765 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1766 !
1767 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001768 ! structure in openbios.h. Changing the beginning of
1769 ! the structure will break this code.
wdenk57b2d802003-06-27 21:31:46 +00001770 !
1771 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001772 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001773 addis r3,0,NVRAM_BASE@h
1774 addi r3,r3,NVRAM_BASE@l
stroese434979e2003-05-23 11:18:02 +00001775
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001776 lwz r4, 0(r3)
1777 addis r5,0,NVRVFY1@h
1778 addi r5,r5,NVRVFY1@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001779 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001780 bne ..no_pllset
1781 addi r3,r3,4
1782 lwz r4, 0(r3)
1783 addis r5,0,NVRVFY2@h
1784 addi r5,r5,NVRVFY2@l
Wolfgang Denka1be4762008-05-20 16:00:29 +02001785 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001786 bne ..no_pllset
1787 addi r3,r3,8 /* Skip over conf_size */
1788 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1789 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1790 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1791 cmpi cr0,0,r5,1 /* See if PLL is locked */
1792 beq pll_write
stroese434979e2003-05-23 11:18:02 +00001793..no_pllset:
Stefan Roese326c9712005-08-01 16:41:48 +02001794#endif /* CONFIG_BUBINGA */
stroese434979e2003-05-23 11:18:02 +00001795
Wolfgang Denka1be4762008-05-20 16:00:29 +02001796 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1797 ori r3,r3,PLLMR0_DEFAULT@l /* */
1798 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1799 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroese434979e2003-05-23 11:18:02 +00001800
Stefan Roesea5d182e2007-08-14 14:44:41 +020018011:
Wolfgang Denka1be4762008-05-20 16:00:29 +02001802 b pll_write /* Write the CPC0_PLLMR with new value */
stroese434979e2003-05-23 11:18:02 +00001803
1804pll_done:
wdenk57b2d802003-06-27 21:31:46 +00001805 /*
1806 !-----------------------------------------------------------------------
1807 ! Clear Soft Reset Register
1808 ! This is needed to enable PCI if not booting from serial EPROM
1809 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001810 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001811 addi r3, 0, 0x0
1812 mtdcr CPC0_SRR, r3
stroese434979e2003-05-23 11:18:02 +00001813
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001814 addis r3,0,0x0010
1815 mtctr r3
stroese434979e2003-05-23 11:18:02 +00001816pci_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001817 bdnz pci_wait
stroese434979e2003-05-23 11:18:02 +00001818
Wolfgang Denka1be4762008-05-20 16:00:29 +02001819 blr /* return to main code */
stroese434979e2003-05-23 11:18:02 +00001820
1821/*
1822!-----------------------------------------------------------------------------
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001823! Function: pll_write
1824! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1825! That is:
1826! 1. Pll is first disabled (de-activated by putting in bypass mode)
1827! 2. PLL is reset
1828! 3. Clock dividers are set while PLL is held in reset and bypassed
1829! 4. PLL Reset is cleared
1830! 5. Wait 100us for PLL to lock
1831! 6. A core reset is performed
stroese434979e2003-05-23 11:18:02 +00001832! Input: r3 = Value to write to CPC0_PLLMR0
1833! Input: r4 = Value to write to CPC0_PLLMR1
1834! Output r3 = none
1835!-----------------------------------------------------------------------------
1836*/
Matthias Fuchsd8079162009-07-06 16:27:33 +02001837 .globl pll_write
stroese434979e2003-05-23 11:18:02 +00001838pll_write:
wdenk57b2d802003-06-27 21:31:46 +00001839 mfdcr r5, CPC0_UCR
1840 andis. r5,r5,0xFFFF
Wolfgang Denka1be4762008-05-20 16:00:29 +02001841 ori r5,r5,0x0101 /* Stop the UART clocks */
1842 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroese434979e2003-05-23 11:18:02 +00001843
wdenk57b2d802003-06-27 21:31:46 +00001844 mfdcr r5, CPC0_PLLMR1
Wolfgang Denka1be4762008-05-20 16:00:29 +02001845 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001846 mtdcr CPC0_PLLMR1,r5
Wolfgang Denka1be4762008-05-20 16:00:29 +02001847 oris r5,r5,0x4000 /* Set PLL Reset */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001848 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00001849
Wolfgang Denka1be4762008-05-20 16:00:29 +02001850 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1851 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1852 oris r5,r5,0x4000 /* Set PLL Reset */
1853 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1854 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001855 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00001856
1857 /*
wdenk57b2d802003-06-27 21:31:46 +00001858 ! Wait min of 100us for PLL to lock.
1859 ! See CMOS 27E databook for more info.
1860 ! At 200MHz, that means waiting 20,000 instructions
stroese434979e2003-05-23 11:18:02 +00001861 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001862 addi r3,0,20000 /* 2000 = 0x4e20 */
1863 mtctr r3
stroese434979e2003-05-23 11:18:02 +00001864pll_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001865 bdnz pll_wait
stroese434979e2003-05-23 11:18:02 +00001866
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001867 oris r5,r5,0x8000 /* Enable PLL */
1868 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroese434979e2003-05-23 11:18:02 +00001869
wdenk57b2d802003-06-27 21:31:46 +00001870 /*
1871 * Reset CPU to guarantee timings are OK
1872 * Not sure if this is needed...
1873 */
1874 addis r3,0,0x1000
Matthias Fuchs730b2d22009-07-22 17:27:56 +02001875 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
Wolfgang Denka1be4762008-05-20 16:00:29 +02001876 /* execution will continue from the poweron */
1877 /* vector of 0xfffffffc */
stroese434979e2003-05-23 11:18:02 +00001878#endif /* CONFIG_405EP */
Stefan Roesea8856e32007-02-20 10:57:08 +01001879
1880#if defined(CONFIG_440)
Stefan Roesea8856e32007-02-20 10:57:08 +01001881/*----------------------------------------------------------------------------+
1882| mttlb3.
1883+----------------------------------------------------------------------------*/
1884 function_prolog(mttlb3)
1885 TLBWE(4,3,2)
1886 blr
1887 function_epilog(mttlb3)
1888
1889/*----------------------------------------------------------------------------+
1890| mftlb3.
1891+----------------------------------------------------------------------------*/
1892 function_prolog(mftlb3)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01001893 TLBRE(3,3,2)
Stefan Roesea8856e32007-02-20 10:57:08 +01001894 blr
1895 function_epilog(mftlb3)
1896
1897/*----------------------------------------------------------------------------+
1898| mttlb2.
1899+----------------------------------------------------------------------------*/
1900 function_prolog(mttlb2)
1901 TLBWE(4,3,1)
1902 blr
1903 function_epilog(mttlb2)
1904
1905/*----------------------------------------------------------------------------+
1906| mftlb2.
1907+----------------------------------------------------------------------------*/
1908 function_prolog(mftlb2)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01001909 TLBRE(3,3,1)
Stefan Roesea8856e32007-02-20 10:57:08 +01001910 blr
1911 function_epilog(mftlb2)
1912
1913/*----------------------------------------------------------------------------+
1914| mttlb1.
1915+----------------------------------------------------------------------------*/
1916 function_prolog(mttlb1)
1917 TLBWE(4,3,0)
1918 blr
1919 function_epilog(mttlb1)
1920
1921/*----------------------------------------------------------------------------+
1922| mftlb1.
1923+----------------------------------------------------------------------------*/
1924 function_prolog(mftlb1)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01001925 TLBRE(3,3,0)
Stefan Roesea8856e32007-02-20 10:57:08 +01001926 blr
1927 function_epilog(mftlb1)
1928#endif /* CONFIG_440 */