]> git.ipfire.org Git - people/ms/u-boot.git/blame - cpu/ppc4xx/start.S
ppc4xx: Big cleanup of PPC4xx defines
[people/ms/u-boot.git] / cpu / ppc4xx / start.S
CommitLineData
0442ed86
WD
1/*
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>
3cb86f3e 5 * Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
c821b5f1
GE
6 * Copyright (c) 2008 Nuovation System Designs, LLC
7 * Grant Erickson <gerickson@nuovations.com>
0442ed86
WD
8 *
9 * See file CREDITS for list of people who contributed to this
10 * project.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25 * MA 02111-1307 USA
26 */
83b4cfa3 27/*------------------------------------------------------------------------------+
31773496
JB
28 * This source code is dual-licensed. You may use it under the terms of the
29 * GNU General Public License version 2, or under the license below.
83b4cfa3
WD
30 *
31 * This source code has been made available to you by IBM on an AS-IS
32 * basis. Anyone receiving this source is licensed under IBM
33 * copyrights to use it in any way he or she deems fit, including
34 * copying it, modifying it, compiling it, and redistributing it either
35 * with or without modifications. No license under IBM patents or
36 * patent applications is to be implied by the copyright license.
37 *
38 * Any user of this software should understand that IBM cannot provide
39 * technical support for this software and will not be responsible for
40 * any consequences resulting from the use of this software.
41 *
42 * Any person who transfers this source code or any derivative work
43 * must include the IBM copyright notice, this paragraph, and the
44 * preceding two paragraphs in the transferred software.
45 *
46 * COPYRIGHT I B M CORPORATION 1995
47 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
48 *-------------------------------------------------------------------------------
49 */
0442ed86 50
0c8721a4 51/* U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
0442ed86
WD
52 *
53 *
54 * The processor starts at 0xfffffffc and the code is executed
55 * from flash/rom.
56 * in memory, but as long we don't jump around before relocating.
57 * board_init lies at a quite high address and when the cpu has
58 * jumped there, everything is ok.
59 * This works because the cpu gives the FLASH (CS0) the whole
60 * address space at startup, and board_init lies as a echo of
61 * the flash somewhere up there in the memorymap.
62 *
63 * board_init will change CS0 to be positioned at the correct
64 * address and (s)dram will be positioned at address 0
65 */
66#include <config.h>
0442ed86 67#include <ppc4xx.h>
561858ee 68#include <timestamp.h>
0442ed86
WD
69#include <version.h>
70
71#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
72
73#include <ppc_asm.tmpl>
74#include <ppc_defs.h>
75
76#include <asm/cache.h>
77#include <asm/mmu.h>
b14ca4b6 78#include <asm/ppc4xx-isram.h>
0442ed86
WD
79
80#ifndef CONFIG_IDENT_STRING
81#define CONFIG_IDENT_STRING ""
82#endif
83
6d0f6bcf
JCPV
84#ifdef CONFIG_SYS_INIT_DCACHE_CS
85# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
d1c3b275
SR
86# define PBxAP PB1AP
87# define PBxCR PB0CR
6d0f6bcf
JCPV
88# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
89# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
90# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
c821b5f1 91# endif
0442ed86 92# endif
6d0f6bcf 93# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
d1c3b275
SR
94# define PBxAP PB1AP
95# define PBxCR PB1CR
6d0f6bcf
JCPV
96# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
97# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
98# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
c821b5f1 99# endif
0442ed86 100# endif
6d0f6bcf 101# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
d1c3b275
SR
102# define PBxAP PB2AP
103# define PBxCR PB2CR
6d0f6bcf
JCPV
104# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
105# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
106# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
c821b5f1 107# endif
0442ed86 108# endif
6d0f6bcf 109# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
d1c3b275
SR
110# define PBxAP PB3AP
111# define PBxCR PB3CR
6d0f6bcf
JCPV
112# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
113# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
114# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
c821b5f1 115# endif
0442ed86 116# endif
6d0f6bcf 117# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
d1c3b275
SR
118# define PBxAP PB4AP
119# define PBxCR PB4CR
6d0f6bcf
JCPV
120# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
121# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
122# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
c821b5f1 123# endif
0442ed86 124# endif
6d0f6bcf 125# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
d1c3b275
SR
126# define PBxAP PB5AP
127# define PBxCR PB5CR
6d0f6bcf
JCPV
128# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
129# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
130# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
c821b5f1 131# endif
0442ed86 132# endif
6d0f6bcf 133# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
d1c3b275
SR
134# define PBxAP PB6AP
135# define PBxCR PB6CR
6d0f6bcf
JCPV
136# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
137# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
138# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
c821b5f1 139# endif
0442ed86 140# endif
6d0f6bcf 141# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
d1c3b275
SR
142# define PBxAP PB7AP
143# define PBxCR PB7CR
6d0f6bcf
JCPV
144# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
145# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
146# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
c821b5f1
GE
147# endif
148# endif
149# ifndef PBxAP_VAL
150# define PBxAP_VAL 0
151# endif
152# ifndef PBxCR_VAL
153# define PBxCR_VAL 0
154# endif
155/*
6d0f6bcf 156 * Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
c821b5f1
GE
157 * used as temporary stack pointer for the primordial stack
158 */
6d0f6bcf
JCPV
159# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
160# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
c821b5f1
GE
161 EBC_BXAP_TWT_ENCODE(7) | \
162 EBC_BXAP_BCE_DISABLE | \
163 EBC_BXAP_BCT_2TRANS | \
164 EBC_BXAP_CSN_ENCODE(0) | \
165 EBC_BXAP_OEN_ENCODE(0) | \
166 EBC_BXAP_WBN_ENCODE(0) | \
167 EBC_BXAP_WBF_ENCODE(0) | \
168 EBC_BXAP_TH_ENCODE(2) | \
169 EBC_BXAP_RE_DISABLED | \
170 EBC_BXAP_SOR_NONDELAYED | \
171 EBC_BXAP_BEM_WRITEONLY | \
172 EBC_BXAP_PEN_DISABLED)
6d0f6bcf
JCPV
173# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
174# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
175# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
c821b5f1
GE
176 EBC_BXCR_BS_64MB | \
177 EBC_BXCR_BU_RW | \
178 EBC_BXCR_BW_16BIT)
6d0f6bcf
JCPV
179# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
180# ifndef CONFIG_SYS_INIT_RAM_PATTERN
181# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
0442ed86 182# endif
6d0f6bcf 183#endif /* CONFIG_SYS_INIT_DCACHE_CS */
0442ed86 184
6d0f6bcf
JCPV
185#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_END > (4 << 10)))
186#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_END!
28d77d96
SR
187#endif
188
c821b5f1
GE
189/*
190 * Unless otherwise overriden, enable two 128MB cachable instruction regions
6d0f6bcf
JCPV
191 * at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
192 * NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
c821b5f1 193 */
6d0f6bcf 194#if !defined(CONFIG_SYS_FLASH_BASE)
64852d09 195/* If not already defined, set it to the "last" 128MByte region */
6d0f6bcf 196# define CONFIG_SYS_FLASH_BASE 0xf8000000
64852d09 197#endif
6d0f6bcf
JCPV
198#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
199# define CONFIG_SYS_ICACHE_SACR_VALUE \
200 (PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
201 PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
202 PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
203#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
204
205#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
206# define CONFIG_SYS_DCACHE_SACR_VALUE \
c821b5f1 207 (0x00000000)
6d0f6bcf 208#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
c821b5f1 209
83b4cfa3 210#define function_prolog(func_name) .text; \
cf959c7d
SR
211 .align 2; \
212 .globl func_name; \
213 func_name:
83b4cfa3 214#define function_epilog(func_name) .type func_name,@function; \
cf959c7d
SR
215 .size func_name,.-func_name
216
0442ed86
WD
217/* We don't want the MMU yet.
218*/
219#undef MSR_KERNEL
220#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
221
222
223 .extern ext_bus_cntlr_init
887e2ec9
SR
224#ifdef CONFIG_NAND_U_BOOT
225 .extern reconfig_tlb0
226#endif
0442ed86
WD
227
228/*
229 * Set up GOT: Global Offset Table
230 *
231 * Use r14 to access the GOT
232 */
887e2ec9 233#if !defined(CONFIG_NAND_SPL)
0442ed86
WD
234 START_GOT
235 GOT_ENTRY(_GOT2_TABLE_)
236 GOT_ENTRY(_FIXUP_TABLE_)
237
238 GOT_ENTRY(_start)
239 GOT_ENTRY(_start_of_vectors)
240 GOT_ENTRY(_end_of_vectors)
241 GOT_ENTRY(transfer_to_handler)
242
3b57fe0a 243 GOT_ENTRY(__init_end)
0442ed86 244 GOT_ENTRY(_end)
5d232d0e 245 GOT_ENTRY(__bss_start)
0442ed86 246 END_GOT
887e2ec9
SR
247#endif /* CONFIG_NAND_SPL */
248
249#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
250 /*
251 * NAND U-Boot image is started from offset 0
252 */
253 .text
c440bfe6 254#if defined(CONFIG_440)
887e2ec9 255 bl reconfig_tlb0
c440bfe6 256#endif
887e2ec9
SR
257 GET_GOT
258 bl cpu_init_f /* run low-level CPU init code (from Flash) */
259 bl board_init_f
260#endif
0442ed86 261
d873133f
SR
262#if defined(CONFIG_SYS_RAMBOOT)
263 /*
264 * 4xx RAM-booting U-Boot image is started from offset 0
265 */
266 .text
267 bl _start_440
268#endif
269
0442ed86
WD
270/*
271 * 440 Startup -- on reset only the top 4k of the effective
272 * address space is mapped in by an entry in the instruction
273 * and data shadow TLB. The .bootpg section is located in the
274 * top 4k & does only what's necessary to map in the the rest
275 * of the boot rom. Once the boot rom is mapped in we can
276 * proceed with normal startup.
277 *
278 * NOTE: CS0 only covers the top 2MB of the effective address
279 * space after reset.
280 */
281
282#if defined(CONFIG_440)
887e2ec9 283#if !defined(CONFIG_NAND_SPL)
0442ed86 284 .section .bootpg,"ax"
887e2ec9 285#endif
0442ed86
WD
286 .globl _start_440
287
288/**************************************************************************/
289_start_440:
511d0c72
WD
290 /*--------------------------------------------------------------------+
291 | 440EPX BUP Change - Hardware team request
292 +--------------------------------------------------------------------*/
887e2ec9
SR
293#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
294 sync
295 nop
296 nop
297#endif
6c5879f3
MB
298 /*----------------------------------------------------------------+
299 | Core bug fix. Clear the esr
300 +-----------------------------------------------------------------*/
edd6cf20 301 li r0,0
58ea142f 302 mtspr SPRN_ESR,r0
0442ed86
WD
303 /*----------------------------------------------------------------*/
304 /* Clear and set up some registers. */
305 /*----------------------------------------------------------------*/
f901a83b
WD
306 iccci r0,r0 /* NOTE: operands not used for 440 */
307 dccci r0,r0 /* NOTE: operands not used for 440 */
0442ed86
WD
308 sync
309 li r0,0
58ea142f
MF
310 mtspr SPRN_SRR0,r0
311 mtspr SPRN_SRR1,r0
312 mtspr SPRN_CSRR0,r0
313 mtspr SPRN_CSRR1,r0
887e2ec9
SR
314 /* NOTE: 440GX adds machine check status regs */
315#if defined(CONFIG_440) && !defined(CONFIG_440GP)
58ea142f
MF
316 mtspr SPRN_MCSRR0,r0
317 mtspr SPRN_MCSRR1,r0
318 mfspr r1,SPRN_MCSR
319 mtspr SPRN_MCSR,r1
ba56f625 320#endif
20532833
SR
321
322 /*----------------------------------------------------------------*/
323 /* CCR0 init */
324 /*----------------------------------------------------------------*/
325 /* Disable store gathering & broadcast, guarantee inst/data
326 * cache block touch, force load/store alignment
327 * (see errata 1.12: 440_33)
328 */
329 lis r1,0x0030 /* store gathering & broadcast disable */
330 ori r1,r1,0x6000 /* cache touch */
58ea142f 331 mtspr SPRN_CCR0,r1
20532833 332
0442ed86
WD
333 /*----------------------------------------------------------------*/
334 /* Initialize debug */
335 /*----------------------------------------------------------------*/
58ea142f 336 mfspr r1,SPRN_DBCR0
887e2ec9
SR
337 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
338 bne skip_debug_init /* if set, don't clear debug register */
58ea142f
MF
339 mtspr SPRN_DBCR0,r0
340 mtspr SPRN_DBCR1,r0
341 mtspr SPRN_DBCR2,r0
342 mtspr SPRN_IAC1,r0
343 mtspr SPRN_IAC2,r0
344 mtspr SPRN_IAC3,r0
345 mtspr SPRN_DAC1,r0
346 mtspr SPRN_DAC2,r0
347 mtspr SPRN_DVC1,r0
348 mtspr SPRN_DVC2,r0
349
350 mfspr r1,SPRN_DBSR
351 mtspr SPRN_DBSR,r1 /* Clear all valid bits */
887e2ec9 352skip_debug_init:
0442ed86 353
6c5879f3
MB
354#if defined (CONFIG_440SPE)
355 /*----------------------------------------------------------------+
356 | Initialize Core Configuration Reg1.
357 | a. ICDPEI: Record even parity. Normal operation.
358 | b. ICTPEI: Record even parity. Normal operation.
359 | c. DCTPEI: Record even parity. Normal operation.
360 | d. DCDPEI: Record even parity. Normal operation.
361 | e. DCUPEI: Record even parity. Normal operation.
362 | f. DCMPEI: Record even parity. Normal operation.
363 | g. FCOM: Normal operation
364 | h. MMUPEI: Record even parity. Normal operation.
365 | i. FFF: Flush only as much data as necessary.
edd6cf20 366 | j. TCS: Timebase increments from CPU clock.
6c5879f3 367 +-----------------------------------------------------------------*/
edd6cf20 368 li r0,0
58ea142f 369 mtspr SPRN_CCR1, r0
6c5879f3
MB
370
371 /*----------------------------------------------------------------+
372 | Reset the timebase.
373 | The previous write to CCR1 sets the timebase source.
374 +-----------------------------------------------------------------*/
58ea142f
MF
375 mtspr SPRN_TBWL, r0
376 mtspr SPRN_TBWU, r0
6c5879f3
MB
377#endif
378
0442ed86
WD
379 /*----------------------------------------------------------------*/
380 /* Setup interrupt vectors */
381 /*----------------------------------------------------------------*/
58ea142f 382 mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
f901a83b 383 li r1,0x0100
58ea142f 384 mtspr SPRN_IVOR0,r1 /* Critical input */
f901a83b 385 li r1,0x0200
58ea142f 386 mtspr SPRN_IVOR1,r1 /* Machine check */
f901a83b 387 li r1,0x0300
58ea142f 388 mtspr SPRN_IVOR2,r1 /* Data storage */
f901a83b 389 li r1,0x0400
58ea142f 390 mtspr SPRN_IVOR3,r1 /* Instruction storage */
0442ed86 391 li r1,0x0500
58ea142f 392 mtspr SPRN_IVOR4,r1 /* External interrupt */
0442ed86 393 li r1,0x0600
58ea142f 394 mtspr SPRN_IVOR5,r1 /* Alignment */
0442ed86 395 li r1,0x0700
58ea142f 396 mtspr SPRN_IVOR6,r1 /* Program check */
0442ed86 397 li r1,0x0800
58ea142f 398 mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
0442ed86 399 li r1,0x0c00
58ea142f 400 mtspr SPRN_IVOR8,r1 /* System call */
efa35cf1 401 li r1,0x0a00
58ea142f 402 mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
efa35cf1 403 li r1,0x0900
58ea142f 404 mtspr SPRN_IVOR10,r1 /* Decrementer */
0442ed86 405 li r1,0x1300
58ea142f 406 mtspr SPRN_IVOR13,r1 /* Data TLB error */
efa35cf1 407 li r1,0x1400
58ea142f 408 mtspr SPRN_IVOR14,r1 /* Instr TLB error */
0442ed86 409 li r1,0x2000
58ea142f 410 mtspr SPRN_IVOR15,r1 /* Debug */
0442ed86
WD
411
412 /*----------------------------------------------------------------*/
413 /* Configure cache regions */
414 /*----------------------------------------------------------------*/
58ea142f
MF
415 mtspr SPRN_INV0,r0
416 mtspr SPRN_INV1,r0
417 mtspr SPRN_INV2,r0
418 mtspr SPRN_INV3,r0
419 mtspr SPRN_DNV0,r0
420 mtspr SPRN_DNV1,r0
421 mtspr SPRN_DNV2,r0
422 mtspr SPRN_DNV3,r0
423 mtspr SPRN_ITV0,r0
424 mtspr SPRN_ITV1,r0
425 mtspr SPRN_ITV2,r0
426 mtspr SPRN_ITV3,r0
427 mtspr SPRN_DTV0,r0
428 mtspr SPRN_DTV1,r0
429 mtspr SPRN_DTV2,r0
430 mtspr SPRN_DTV3,r0
0442ed86
WD
431
432 /*----------------------------------------------------------------*/
433 /* Cache victim limits */
434 /*----------------------------------------------------------------*/
435 /* floors 0, ceiling max to use the entire cache -- nothing locked
436 */
437 lis r1,0x0001
438 ori r1,r1,0xf800
58ea142f
MF
439 mtspr SPRN_IVLIM,r1
440 mtspr SPRN_DVLIM,r1
0442ed86 441
6c5879f3
MB
442 /*----------------------------------------------------------------+
443 |Initialize MMUCR[STID] = 0.
444 +-----------------------------------------------------------------*/
58ea142f 445 mfspr r0,SPRN_MMUCR
6c5879f3
MB
446 addis r1,0,0xFFFF
447 ori r1,r1,0xFF00
448 and r0,r0,r1
58ea142f 449 mtspr SPRN_MMUCR,r0
6c5879f3 450
0442ed86
WD
451 /*----------------------------------------------------------------*/
452 /* Clear all TLB entries -- TID = 0, TS = 0 */
453 /*----------------------------------------------------------------*/
6c5879f3 454 addis r0,0,0x0000
0a371ca0 455#ifdef CONFIG_SYS_RAMBOOT
d873133f 456 li r4,0 /* Start with TLB #0 */
0a371ca0
SR
457#else
458 li r4,1 /* Start with TLB #1 */
459#endif
460 li r1,64 /* 64 TLB entries */
461 sub r1,r1,r4 /* calculate last TLB # */
462 mtctr r1
d873133f
SR
463rsttlb:
464#ifdef CONFIG_SYS_RAMBOOT
465 tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
466 rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
467 beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
468#endif
469 tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
470 tlbwe r0,r4,1
471 tlbwe r0,r4,2
472tlbnxt: addi r4,r4,1 /* Next TLB */
6c5879f3 473 bdnz rsttlb
0442ed86
WD
474
475 /*----------------------------------------------------------------*/
476 /* TLB entry setup -- step thru tlbtab */
477 /*----------------------------------------------------------------*/
692519b1
RJ
478#if defined(CONFIG_440SPE)
479 /*----------------------------------------------------------------*/
480 /* We have different TLB tables for revA and rev B of 440SPe */
481 /*----------------------------------------------------------------*/
482 mfspr r1, PVR
483 lis r0,0x5342
484 ori r0,r0,0x1891
485 cmpw r7,r1,r0
486 bne r7,..revA
487 bl tlbtabB
488 b ..goon
489..revA:
490 bl tlbtabA
491..goon:
492#else
0442ed86 493 bl tlbtab /* Get tlbtab pointer */
692519b1 494#endif
0442ed86
WD
495 mr r5,r0
496 li r1,0x003f /* 64 TLB entries max */
497 mtctr r1
498 li r4,0 /* TLB # */
499
500 addi r5,r5,-4
d873133f
SR
5011:
502#ifdef CONFIG_SYS_RAMBOOT
503 tlbre r3,r4,0 /* Read contents from TLB word #0 */
504 rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
505 bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
506#endif
507 lwzu r0,4(r5)
0442ed86
WD
508 cmpwi r0,0
509 beq 2f /* 0 marks end */
510 lwzu r1,4(r5)
511 lwzu r2,4(r5)
512 tlbwe r0,r4,0 /* TLB Word 0 */
513 tlbwe r1,r4,1 /* TLB Word 1 */
514 tlbwe r2,r4,2 /* TLB Word 2 */
d873133f 515tlbnx2: addi r4,r4,1 /* Next TLB */
0442ed86
WD
516 bdnz 1b
517
518 /*----------------------------------------------------------------*/
519 /* Continue from 'normal' start */
520 /*----------------------------------------------------------------*/
887e2ec9 5212:
887e2ec9 522 bl 3f
0442ed86
WD
523 b _start
524
5253: li r0,0
58ea142f 526 mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
0442ed86 527 mflr r1
58ea142f 528 mtspr SPRN_SRR0,r1
0442ed86 529 rfi
b867d705 530#endif /* CONFIG_440 */
0442ed86
WD
531
532/*
533 * r3 - 1st arg to board_init(): IMMP pointer
534 * r4 - 2nd arg to board_init(): boot flag
535 */
887e2ec9 536#ifndef CONFIG_NAND_SPL
0442ed86
WD
537 .text
538 .long 0x27051956 /* U-Boot Magic Number */
539 .globl version_string
540version_string:
541 .ascii U_BOOT_VERSION
561858ee 542 .ascii " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
0442ed86
WD
543 .ascii CONFIG_IDENT_STRING, "\0"
544
0442ed86 545 . = EXC_OFF_SYS_RESET
efa35cf1
GB
546 .globl _start_of_vectors
547_start_of_vectors:
548
549/* Critical input. */
550 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
551
552#ifdef CONFIG_440
553/* Machine check */
83b4cfa3 554 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
efa35cf1 555#else
83b4cfa3 556 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
efa35cf1
GB
557#endif /* CONFIG_440 */
558
559/* Data Storage exception. */
560 STD_EXCEPTION(0x300, DataStorage, UnknownException)
561
562/* Instruction Storage exception. */
563 STD_EXCEPTION(0x400, InstStorage, UnknownException)
564
565/* External Interrupt exception. */
566 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
567
568/* Alignment exception. */
569 . = 0x600
570Alignment:
571 EXCEPTION_PROLOG(SRR0, SRR1)
572 mfspr r4,DAR
573 stw r4,_DAR(r21)
574 mfspr r5,DSISR
575 stw r5,_DSISR(r21)
576 addi r3,r1,STACK_FRAME_OVERHEAD
577 li r20,MSR_KERNEL
578 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
579 lwz r6,GOT(transfer_to_handler)
580 mtlr r6
581 blrl
582.L_Alignment:
583 .long AlignmentException - _start + _START_OFFSET
584 .long int_return - _start + _START_OFFSET
585
586/* Program check exception */
587 . = 0x700
588ProgramCheck:
589 EXCEPTION_PROLOG(SRR0, SRR1)
590 addi r3,r1,STACK_FRAME_OVERHEAD
591 li r20,MSR_KERNEL
592 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
593 lwz r6,GOT(transfer_to_handler)
594 mtlr r6
595 blrl
596.L_ProgramCheck:
597 .long ProgramCheckException - _start + _START_OFFSET
598 .long int_return - _start + _START_OFFSET
599
600#ifdef CONFIG_440
601 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
602 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
603 STD_EXCEPTION(0xa00, APU, UnknownException)
df8a24cd 604#endif
efa35cf1
GB
605 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
606
607#ifdef CONFIG_440
608 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
609 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
610#else
611 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
612 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
613 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
614#endif
615 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
616
617 .globl _end_of_vectors
618_end_of_vectors:
619 . = _START_OFFSET
887e2ec9 620#endif
0442ed86
WD
621 .globl _start
622_start:
623
624/*****************************************************************************/
625#if defined(CONFIG_440)
626
627 /*----------------------------------------------------------------*/
628 /* Clear and set up some registers. */
629 /*----------------------------------------------------------------*/
630 li r0,0x0000
631 lis r1,0xffff
58ea142f
MF
632 mtspr SPRN_DEC,r0 /* prevent dec exceptions */
633 mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
634 mtspr SPRN_TBWU,r0
635 mtspr SPRN_TSR,r1 /* clear all timer exception status */
636 mtspr SPRN_TCR,r0 /* disable all */
637 mtspr SPRN_ESR,r0 /* clear exception syndrome register */
0442ed86 638 mtxer r0 /* clear integer exception register */
0442ed86
WD
639
640 /*----------------------------------------------------------------*/
641 /* Debug setup -- some (not very good) ice's need an event*/
6d0f6bcf 642 /* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
0442ed86
WD
643 /* value you need in this case 0x8cff 0000 should do the trick */
644 /*----------------------------------------------------------------*/
6d0f6bcf 645#if defined(CONFIG_SYS_INIT_DBCR)
0442ed86
WD
646 lis r1,0xffff
647 ori r1,r1,0xffff
58ea142f 648 mtspr SPRN_DBSR,r1 /* Clear all status bits */
6d0f6bcf
JCPV
649 lis r0,CONFIG_SYS_INIT_DBCR@h
650 ori r0,r0,CONFIG_SYS_INIT_DBCR@l
58ea142f 651 mtspr SPRN_DBCR0,r0
0442ed86
WD
652 isync
653#endif
654
655 /*----------------------------------------------------------------*/
656 /* Setup the internal SRAM */
657 /*----------------------------------------------------------------*/
658 li r0,0
887e2ec9 659
6d0f6bcf 660#ifdef CONFIG_SYS_INIT_RAM_DCACHE
c157d8e2 661 /* Clear Dcache to use as RAM */
6d0f6bcf
JCPV
662 addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
663 ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
664 addis r4,r0,CONFIG_SYS_INIT_RAM_END@h
665 ori r4,r4,CONFIG_SYS_INIT_RAM_END@l
c157d8e2 666 rlwinm. r5,r4,0,27,31
f901a83b
WD
667 rlwinm r5,r4,27,5,31
668 beq ..d_ran
669 addi r5,r5,0x0001
c157d8e2 670..d_ran:
f901a83b 671 mtctr r5
c157d8e2 672..d_ag:
f901a83b
WD
673 dcbz r0,r3
674 addi r3,r3,32
675 bdnz ..d_ag
e02c521d
SR
676
677 /*
678 * Lock the init-ram/stack in d-cache, so that other regions
679 * may use d-cache as well
680 * Note, that this current implementation locks exactly 4k
681 * of d-cache, so please make sure that you don't define a
682 * bigger init-ram area. Take a look at the lwmon5 440EPx
683 * implementation as a reference.
684 */
685 msync
686 isync
687 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
688 lis r1,0x0201
689 ori r1,r1,0xf808
58ea142f 690 mtspr SPRN_DVLIM,r1
e02c521d
SR
691 lis r1,0x0808
692 ori r1,r1,0x0808
58ea142f
MF
693 mtspr SPRN_DNV0,r1
694 mtspr SPRN_DNV1,r1
695 mtspr SPRN_DNV2,r1
696 mtspr SPRN_DNV3,r1
697 mtspr SPRN_DTV0,r1
698 mtspr SPRN_DTV1,r1
699 mtspr SPRN_DTV2,r1
700 mtspr SPRN_DTV3,r1
e02c521d
SR
701 msync
702 isync
6d0f6bcf 703#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
887e2ec9
SR
704
705 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
706#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
707 /* not all PPC's have internal SRAM usable as L2-cache */
2801b2d2
SR
708#if defined(CONFIG_440GX) || \
709 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
7d307936 710 defined(CONFIG_460SX)
b14ca4b6 711 mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
ddf45cc7
DM
712#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
713 lis r1, 0x0000
714 ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
715 mtdcr L2_CACHE_CFG,r1
ba56f625 716#endif
0442ed86 717
887e2ec9 718 lis r2,0x7fff
0442ed86 719 ori r2,r2,0xffff
b14ca4b6 720 mfdcr r1,ISRAM0_DPC
0442ed86 721 and r1,r1,r2 /* Disable parity check */
b14ca4b6
DM
722 mtdcr ISRAM0_DPC,r1
723 mfdcr r1,ISRAM0_PMEG
887e2ec9 724 and r1,r1,r2 /* Disable pwr mgmt */
b14ca4b6 725 mtdcr ISRAM0_PMEG,r1
0442ed86
WD
726
727 lis r1,0x8000 /* BAS = 8000_0000 */
6e7fb6ea 728#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
ba56f625 729 ori r1,r1,0x0980 /* first 64k */
b14ca4b6 730 mtdcr ISRAM0_SB0CR,r1
ba56f625
WD
731 lis r1,0x8001
732 ori r1,r1,0x0980 /* second 64k */
b14ca4b6 733 mtdcr ISRAM0_SB1CR,r1
ba56f625
WD
734 lis r1, 0x8002
735 ori r1,r1, 0x0980 /* third 64k */
b14ca4b6 736 mtdcr ISRAM0_SB2CR,r1
ba56f625
WD
737 lis r1, 0x8003
738 ori r1,r1, 0x0980 /* fourth 64k */
b14ca4b6 739 mtdcr ISRAM0_SB3CR,r1
ddf45cc7
DM
740#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || defined(CONFIG_460GT)
741 lis r1,0x0000 /* BAS = X_0000_0000 */
6c5879f3 742 ori r1,r1,0x0984 /* first 64k */
b14ca4b6 743 mtdcr ISRAM0_SB0CR,r1
6c5879f3
MB
744 lis r1,0x0001
745 ori r1,r1,0x0984 /* second 64k */
b14ca4b6 746 mtdcr ISRAM0_SB1CR,r1
6c5879f3
MB
747 lis r1, 0x0002
748 ori r1,r1, 0x0984 /* third 64k */
b14ca4b6 749 mtdcr ISRAM0_SB2CR,r1
6c5879f3
MB
750 lis r1, 0x0003
751 ori r1,r1, 0x0984 /* fourth 64k */
b14ca4b6 752 mtdcr ISRAM0_SB3CR,r1
ddf45cc7
DM
753#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
754 lis r2,0x7fff
755 ori r2,r2,0xffff
756 mfdcr r1,ISRAM1_DPC
757 and r1,r1,r2 /* Disable parity check */
455ae7e8 758 mtdcr ISRAM1_DPC,r1
ddf45cc7
DM
759 mfdcr r1,ISRAM1_PMEG
760 and r1,r1,r2 /* Disable pwr mgmt */
761 mtdcr ISRAM1_PMEG,r1
762
763 lis r1,0x0004 /* BAS = 4_0004_0000 */
764 ori r1,r1,0x0984 /* 64k */
765 mtdcr ISRAM1_SB0CR,r1
766#endif
7d307936
FK
767#elif defined(CONFIG_460SX)
768 lis r1,0x0000 /* BAS = 0000_0000 */
769 ori r1,r1,0x0B84 /* first 128k */
b14ca4b6 770 mtdcr ISRAM0_SB0CR,r1
7d307936
FK
771 lis r1,0x0001
772 ori r1,r1,0x0B84 /* second 128k */
b14ca4b6 773 mtdcr ISRAM0_SB1CR,r1
7d307936
FK
774 lis r1, 0x0002
775 ori r1,r1, 0x0B84 /* third 128k */
b14ca4b6 776 mtdcr ISRAM0_SB2CR,r1
7d307936
FK
777 lis r1, 0x0003
778 ori r1,r1, 0x0B84 /* fourth 128k */
b14ca4b6 779 mtdcr ISRAM0_SB3CR,r1
887e2ec9 780#elif defined(CONFIG_440GP)
0442ed86 781 ori r1,r1,0x0380 /* 8k rw */
b14ca4b6
DM
782 mtdcr ISRAM0_SB0CR,r1
783 mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
c157d8e2 784#endif
887e2ec9 785#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
0442ed86
WD
786
787 /*----------------------------------------------------------------*/
788 /* Setup the stack in internal SRAM */
789 /*----------------------------------------------------------------*/
6d0f6bcf
JCPV
790 lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
791 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
0442ed86
WD
792 li r0,0
793 stwu r0,-4(r1)
794 stwu r0,-4(r1) /* Terminate call chain */
795
796 stwu r1,-8(r1) /* Save back chain and move SP */
797 lis r0,RESET_VECTOR@h /* Address of reset vector */
798 ori r0,r0, RESET_VECTOR@l
799 stwu r1,-8(r1) /* Save back chain and move SP */
800 stw r0,+12(r1) /* Save return addr (underflow vect) */
801
887e2ec9 802#ifdef CONFIG_NAND_SPL
64852d09 803 bl nand_boot_common /* will not return */
887e2ec9 804#else
0442ed86 805 GET_GOT
5568e613
SR
806
807 bl cpu_init_f /* run low-level CPU init code (from Flash) */
0442ed86 808 bl board_init_f
887e2ec9 809#endif
0442ed86
WD
810
811#endif /* CONFIG_440 */
812
813/*****************************************************************************/
814#ifdef CONFIG_IOP480
815 /*----------------------------------------------------------------------- */
816 /* Set up some machine state registers. */
817 /*----------------------------------------------------------------------- */
818 addi r0,r0,0x0000 /* initialize r0 to zero */
58ea142f 819 mtspr SPRN_ESR,r0 /* clear Exception Syndrome Reg */
0442ed86
WD
820 mttcr r0 /* timer control register */
821 mtexier r0 /* disable all interrupts */
0442ed86
WD
822 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
823 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
824 mtdbsr r4 /* clear/reset the dbsr */
825 mtexisr r4 /* clear all pending interrupts */
826 addis r4,r0,0x8000
827 mtexier r4 /* enable critical exceptions */
828 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
829 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
830 mtiocr r4 /* since bit not used) & DRC to latch */
831 /* data bus on rising edge of CAS */
832 /*----------------------------------------------------------------------- */
833 /* Clear XER. */
834 /*----------------------------------------------------------------------- */
835 mtxer r0
836 /*----------------------------------------------------------------------- */
837 /* Invalidate i-cache and d-cache TAG arrays. */
838 /*----------------------------------------------------------------------- */
839 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
840 addi r4,0,1024 /* 1/4 of I-cache */
841..cloop:
842 iccci 0,r3
843 iccci r4,r3
844 dccci 0,r3
845 addic. r3,r3,-16 /* move back one cache line */
846 bne ..cloop /* loop back to do rest until r3 = 0 */
847
848 /* */
849 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
850 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
851 /* */
852
853 /* first copy IOP480 register base address into r3 */
854 addis r3,0,0x5000 /* IOP480 register base address hi */
855/* ori r3,r3,0x0000 / IOP480 register base address lo */
856
857#ifdef CONFIG_ADCIOP
858 /* use r4 as the working variable */
859 /* turn on CS3 (LOCCTL.7) */
860 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
861 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
862 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
863#endif
864
865#ifdef CONFIG_DASA_SIM
866 /* use r4 as the working variable */
867 /* turn on MA17 (LOCCTL.7) */
868 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
869 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
870 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
871#endif
872
873 /* turn on MA16..13 (LCS0BRD.12 = 0) */
874 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
875 andi. r4,r4,0xefff /* make bit 12 = 0 */
876 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
877
878 /* make sure above stores all comlete before going on */
879 sync
880
881 /* last thing, set local init status done bit (DEVINIT.31) */
882 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
883 oris r4,r4,0x8000 /* make bit 31 = 1 */
884 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
885
886 /* clear all pending interrupts and disable all interrupts */
887 li r4,-1 /* set p1 to 0xffffffff */
888 stw r4,0x1b0(r3) /* clear all pending interrupts */
889 stw r4,0x1b8(r3) /* clear all pending interrupts */
890 li r4,0 /* set r4 to 0 */
891 stw r4,0x1b4(r3) /* disable all interrupts */
892 stw r4,0x1bc(r3) /* disable all interrupts */
893
894 /* make sure above stores all comlete before going on */
895 sync
896
c821b5f1 897 /* Set-up icache cacheability. */
6d0f6bcf
JCPV
898 lis r1, CONFIG_SYS_ICACHE_SACR_VALUE@h
899 ori r1, r1, CONFIG_SYS_ICACHE_SACR_VALUE@l
c821b5f1
GE
900 mticcr r1
901 isync
0442ed86 902
c821b5f1 903 /* Set-up dcache cacheability. */
6d0f6bcf
JCPV
904 lis r1, CONFIG_SYS_DCACHE_SACR_VALUE@h
905 ori r1, r1, CONFIG_SYS_DCACHE_SACR_VALUE@l
c821b5f1 906 mtdccr r1
0442ed86 907
6d0f6bcf
JCPV
908 addis r1,r0,CONFIG_SYS_INIT_RAM_ADDR@h
909 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack to SDRAM */
0442ed86
WD
910 li r0, 0 /* Make room for stack frame header and */
911 stwu r0, -4(r1) /* clear final stack frame so that */
912 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
913
914 GET_GOT /* initialize GOT access */
915
916 bl board_init_f /* run first part of init code (from Flash) */
917
918#endif /* CONFIG_IOP480 */
919
920/*****************************************************************************/
e01bd218
SR
921#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
922 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
dbbd1257 923 defined(CONFIG_405EX) || defined(CONFIG_405)
0442ed86
WD
924 /*----------------------------------------------------------------------- */
925 /* Clear and set up some registers. */
926 /*----------------------------------------------------------------------- */
927 addi r4,r0,0x0000
dbbd1257 928#if !defined(CONFIG_405EX)
58ea142f 929 mtspr SPRN_SGR,r4
dbbd1257
SR
930#else
931 /*
932 * On 405EX, completely clearing the SGR leads to PPC hangup
933 * upon PCIe configuration access. The PCIe memory regions
934 * need to be guarded!
935 */
936 lis r3,0x0000
937 ori r3,r3,0x7FFC
58ea142f 938 mtspr SPRN_SGR,r3
dbbd1257 939#endif
58ea142f 940 mtspr SPRN_DCWR,r4
0442ed86
WD
941 mtesr r4 /* clear Exception Syndrome Reg */
942 mttcr r4 /* clear Timer Control Reg */
943 mtxer r4 /* clear Fixed-Point Exception Reg */
944 mtevpr r4 /* clear Exception Vector Prefix Reg */
0442ed86
WD
945 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
946 /* dbsr is cleared by setting bits to 1) */
947 mtdbsr r4 /* clear/reset the dbsr */
948
c821b5f1 949 /* Invalidate the i- and d-caches. */
0442ed86
WD
950 bl invalidate_icache
951 bl invalidate_dcache
952
c821b5f1 953 /* Set-up icache cacheability. */
6d0f6bcf
JCPV
954 lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
955 ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
c821b5f1 956 mticcr r4
0442ed86
WD
957 isync
958
c821b5f1 959 /* Set-up dcache cacheability. */
6d0f6bcf
JCPV
960 lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
961 ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
c821b5f1 962 mtdccr r4
0442ed86 963
1f4d5326
RR
964#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
965 && !defined (CONFIG_XILINX_405)
0442ed86
WD
966 /*----------------------------------------------------------------------- */
967 /* Tune the speed and size for flash CS0 */
968 /*----------------------------------------------------------------------- */
969 bl ext_bus_cntlr_init
970#endif
64852d09 971
6d0f6bcf 972#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
dbbd1257 973 /*
c821b5f1
GE
974 * For boards that don't have OCM and can't use the data cache
975 * for their primordial stack, setup stack here directly after the
976 * SDRAM is initialized in ext_bus_cntlr_init.
dbbd1257 977 */
6d0f6bcf
JCPV
978 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
979 ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
dbbd1257
SR
980
981 li r0, 0 /* Make room for stack frame header and */
982 stwu r0, -4(r1) /* clear final stack frame so that */
983 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
984 /*
985 * Set up a dummy frame to store reset vector as return address.
986 * this causes stack underflow to reset board.
987 */
988 stwu r1, -8(r1) /* Save back chain and move SP */
989 lis r0, RESET_VECTOR@h /* Address of reset vector */
990 ori r0, r0, RESET_VECTOR@l
991 stwu r1, -8(r1) /* Save back chain and move SP */
992 stw r0, +12(r1) /* Save return addr (underflow vect) */
6d0f6bcf 993#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
0442ed86 994
b867d705
SR
995#if defined(CONFIG_405EP)
996 /*----------------------------------------------------------------------- */
997 /* DMA Status, clear to come up clean */
998 /*----------------------------------------------------------------------- */
53677ef1 999 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
f901a83b 1000 ori r3,r3, 0xFFFF
d1c3b275 1001 mtdcr DMASR, r3
b867d705 1002
53677ef1 1003 bl ppc405ep_init /* do ppc405ep specific init */
b867d705
SR
1004#endif /* CONFIG_405EP */
1005
6d0f6bcf 1006#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
e01bd218
SR
1007#if defined(CONFIG_405EZ)
1008 /********************************************************************
1009 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
1010 *******************************************************************/
1011 /*
1012 * We can map the OCM on the PLB3, so map it at
6d0f6bcf 1013 * CONFIG_SYS_OCM_DATA_ADDR + 0x8000
e01bd218 1014 */
6d0f6bcf
JCPV
1015 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1016 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
df8a24cd 1017 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
d1c3b275 1018 mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
e01bd218 1019 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
d1c3b275 1020 mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
e01bd218
SR
1021 isync
1022
6d0f6bcf
JCPV
1023 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1024 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
83b4cfa3 1025 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
d1c3b275
SR
1026 mtdcr OCM0_DSRC1, r3 /* Set Data Side */
1027 mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
e01bd218 1028 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
d1c3b275
SR
1029 mtdcr OCM0_DSRC2, r3 /* Set Data Side */
1030 mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
83b4cfa3 1031 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
d1c3b275 1032 mtdcr OCM0_DISDPC,r3
e01bd218
SR
1033
1034 isync
3cb86f3e 1035#else /* CONFIG_405EZ */
0442ed86
WD
1036 /********************************************************************
1037 * Setup OCM - On Chip Memory
1038 *******************************************************************/
1039 /* Setup OCM */
8bde7f77
WD
1040 lis r0, 0x7FFF
1041 ori r0, r0, 0xFFFF
d1c3b275
SR
1042 mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
1043 mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
3cb86f3e
SR
1044 and r3, r3, r0 /* disable data-side IRAM */
1045 and r4, r4, r0 /* disable data-side IRAM */
d1c3b275
SR
1046 mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
1047 mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
8bde7f77 1048 isync
0442ed86 1049
6d0f6bcf
JCPV
1050 lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
1051 ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
d1c3b275 1052 mtdcr OCM0_DSARC, r3
0442ed86 1053 addis r4, 0, 0xC000 /* OCM data area enabled */
d1c3b275 1054 mtdcr OCM0_DSCNTL, r4
8bde7f77 1055 isync
e01bd218 1056#endif /* CONFIG_405EZ */
0442ed86
WD
1057#endif
1058
1059 /*----------------------------------------------------------------------- */
1060 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1061 /*----------------------------------------------------------------------- */
6d0f6bcf 1062#ifdef CONFIG_SYS_INIT_DCACHE_CS
c821b5f1 1063 li r4, PBxAP
d1c3b275 1064 mtdcr EBC0_CFGADDR, r4
6d0f6bcf
JCPV
1065 lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
1066 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
d1c3b275 1067 mtdcr EBC0_CFGDATA, r4
c821b5f1
GE
1068
1069 addi r4, 0, PBxCR
d1c3b275 1070 mtdcr EBC0_CFGADDR, r4
6d0f6bcf
JCPV
1071 lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
1072 ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
d1c3b275 1073 mtdcr EBC0_CFGDATA, r4
c821b5f1
GE
1074
1075 /*
1076 * Enable the data cache for the 128MB storage access control region
6d0f6bcf 1077 * at CONFIG_SYS_INIT_RAM_ADDR.
c821b5f1
GE
1078 */
1079 mfdccr r4
6d0f6bcf
JCPV
1080 oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1081 ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
0442ed86
WD
1082 mtdccr r4
1083
c821b5f1
GE
1084 /*
1085 * Preallocate data cache lines to be used to avoid a subsequent
1086 * cache miss and an ensuing machine check exception when exceptions
1087 * are enabled.
1088 */
1089 li r0, 0
0442ed86 1090
6d0f6bcf
JCPV
1091 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1092 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
0442ed86 1093
6d0f6bcf
JCPV
1094 lis r4, CONFIG_SYS_INIT_RAM_END@h
1095 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
c821b5f1
GE
1096
1097 /*
1098 * Convert the size, in bytes, to the number of cache lines/blocks
1099 * to preallocate.
1100 */
1101 clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
1102 srwi r5, r4, L1_CACHE_SHIFT
1103 beq ..load_counter
1104 addi r5, r5, 0x0001
1105..load_counter:
1106 mtctr r5
1107
1108 /* Preallocate the computed number of cache blocks. */
1109..alloc_dcache_block:
1110 dcba r0, r3
1111 addi r3, r3, L1_CACHE_BYTES
1112 bdnz ..alloc_dcache_block
1113 sync
1114
1115 /*
1116 * Load the initial stack pointer and data area and convert the size,
1117 * in bytes, to the number of words to initialize to a known value.
1118 */
6d0f6bcf
JCPV
1119 lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
1120 ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
c821b5f1 1121
6d0f6bcf
JCPV
1122 lis r4, (CONFIG_SYS_INIT_RAM_END >> 2)@h
1123 ori r4, r4, (CONFIG_SYS_INIT_RAM_END >> 2)@l
0442ed86
WD
1124 mtctr r4
1125
6d0f6bcf
JCPV
1126 lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
1127 ori r2, r2, CONFIG_SYS_INIT_RAM_END@l
0442ed86 1128
6d0f6bcf
JCPV
1129 lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
1130 ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
0442ed86
WD
1131
1132..stackloop:
c821b5f1 1133 stwu r4, -4(r2)
0442ed86
WD
1134 bdnz ..stackloop
1135
c821b5f1
GE
1136 /*
1137 * Make room for stack frame header and clear final stack frame so
1138 * that stack backtraces terminate cleanly.
1139 */
1140 stwu r0, -4(r1)
1141 stwu r0, -4(r1)
1142
0442ed86
WD
1143 /*
1144 * Set up a dummy frame to store reset vector as return address.
1145 * this causes stack underflow to reset board.
1146 */
1147 stwu r1, -8(r1) /* Save back chain and move SP */
1148 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1149 ori r0, r0, RESET_VECTOR@l
1150 stwu r1, -8(r1) /* Save back chain and move SP */
1151 stw r0, +12(r1) /* Save return addr (underflow vect) */
1152
6d0f6bcf
JCPV
1153#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1154 (defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
0442ed86
WD
1155 /*
1156 * Stack in OCM.
1157 */
1158
1159 /* Set up Stack at top of OCM */
6d0f6bcf
JCPV
1160 lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1161 ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
0442ed86
WD
1162
1163 /* Set up a zeroized stack frame so that backtrace works right */
1164 li r0, 0
1165 stwu r0, -4(r1)
1166 stwu r0, -4(r1)
1167
1168 /*
1169 * Set up a dummy frame to store reset vector as return address.
1170 * this causes stack underflow to reset board.
1171 */
1172 stwu r1, -8(r1) /* Save back chain and move SP */
1173 lis r0, RESET_VECTOR@h /* Address of reset vector */
1174 ori r0, r0, RESET_VECTOR@l
1175 stwu r1, -8(r1) /* Save back chain and move SP */
1176 stw r0, +12(r1) /* Save return addr (underflow vect) */
6d0f6bcf 1177#endif /* CONFIG_SYS_INIT_DCACHE_CS */
0442ed86 1178
c440bfe6 1179#ifdef CONFIG_NAND_SPL
64852d09 1180 bl nand_boot_common /* will not return */
c440bfe6 1181#else
0442ed86
WD
1182 GET_GOT /* initialize GOT access */
1183
f901a83b 1184 bl cpu_init_f /* run low-level CPU init code (from Flash) */
0442ed86
WD
1185
1186 /* NEVER RETURNS! */
1187 bl board_init_f /* run first part of init code (from Flash) */
c440bfe6 1188#endif /* CONFIG_NAND_SPL */
0442ed86 1189
12f34241
WD
1190#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1191 /*----------------------------------------------------------------------- */
0442ed86
WD
1192
1193
887e2ec9 1194#ifndef CONFIG_NAND_SPL
0442ed86
WD
1195/*
1196 * This code finishes saving the registers to the exception frame
1197 * and jumps to the appropriate handler for the exception.
1198 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1199 */
1200 .globl transfer_to_handler
1201transfer_to_handler:
1202 stw r22,_NIP(r21)
1203 lis r22,MSR_POW@h
1204 andc r23,r23,r22
1205 stw r23,_MSR(r21)
1206 SAVE_GPR(7, r21)
1207 SAVE_4GPRS(8, r21)
1208 SAVE_8GPRS(12, r21)
1209 SAVE_8GPRS(24, r21)
0442ed86
WD
1210 mflr r23
1211 andi. r24,r23,0x3f00 /* get vector offset */
1212 stw r24,TRAP(r21)
1213 li r22,0
1214 stw r22,RESULT(r21)
1215 mtspr SPRG2,r22 /* r1 is now kernel sp */
0442ed86
WD
1216 lwz r24,0(r23) /* virtual address of handler */
1217 lwz r23,4(r23) /* where to go when done */
1218 mtspr SRR0,r24
1219 mtspr SRR1,r20
1220 mtlr r23
1221 SYNC
1222 rfi /* jump to handler, enable MMU */
1223
1224int_return:
1225 mfmsr r28 /* Disable interrupts */
1226 li r4,0
1227 ori r4,r4,MSR_EE
1228 andc r28,r28,r4
1229 SYNC /* Some chip revs need this... */
1230 mtmsr r28
1231 SYNC
1232 lwz r2,_CTR(r1)
1233 lwz r0,_LINK(r1)
1234 mtctr r2
1235 mtlr r0
1236 lwz r2,_XER(r1)
1237 lwz r0,_CCR(r1)
1238 mtspr XER,r2
1239 mtcrf 0xFF,r0
1240 REST_10GPRS(3, r1)
1241 REST_10GPRS(13, r1)
1242 REST_8GPRS(23, r1)
1243 REST_GPR(31, r1)
1244 lwz r2,_NIP(r1) /* Restore environment */
1245 lwz r0,_MSR(r1)
1246 mtspr SRR0,r2
1247 mtspr SRR1,r0
1248 lwz r0,GPR0(r1)
1249 lwz r2,GPR2(r1)
1250 lwz r1,GPR1(r1)
1251 SYNC
1252 rfi
1253
1254crit_return:
1255 mfmsr r28 /* Disable interrupts */
1256 li r4,0
1257 ori r4,r4,MSR_EE
1258 andc r28,r28,r4
1259 SYNC /* Some chip revs need this... */
1260 mtmsr r28
1261 SYNC
1262 lwz r2,_CTR(r1)
1263 lwz r0,_LINK(r1)
1264 mtctr r2
1265 mtlr r0
1266 lwz r2,_XER(r1)
1267 lwz r0,_CCR(r1)
1268 mtspr XER,r2
1269 mtcrf 0xFF,r0
1270 REST_10GPRS(3, r1)
1271 REST_10GPRS(13, r1)
1272 REST_8GPRS(23, r1)
1273 REST_GPR(31, r1)
1274 lwz r2,_NIP(r1) /* Restore environment */
1275 lwz r0,_MSR(r1)
58ea142f
MF
1276 mtspr SPRN_CSRR0,r2
1277 mtspr SPRN_CSRR1,r0
0442ed86
WD
1278 lwz r0,GPR0(r1)
1279 lwz r2,GPR2(r1)
1280 lwz r1,GPR1(r1)
1281 SYNC
1282 rfci
1283
efa35cf1
GB
1284#ifdef CONFIG_440
1285mck_return:
83b4cfa3
WD
1286 mfmsr r28 /* Disable interrupts */
1287 li r4,0
1288 ori r4,r4,MSR_EE
1289 andc r28,r28,r4
1290 SYNC /* Some chip revs need this... */
1291 mtmsr r28
1292 SYNC
1293 lwz r2,_CTR(r1)
1294 lwz r0,_LINK(r1)
1295 mtctr r2
1296 mtlr r0
1297 lwz r2,_XER(r1)
1298 lwz r0,_CCR(r1)
1299 mtspr XER,r2
1300 mtcrf 0xFF,r0
1301 REST_10GPRS(3, r1)
1302 REST_10GPRS(13, r1)
1303 REST_8GPRS(23, r1)
1304 REST_GPR(31, r1)
1305 lwz r2,_NIP(r1) /* Restore environment */
1306 lwz r0,_MSR(r1)
58ea142f
MF
1307 mtspr SPRN_MCSRR0,r2
1308 mtspr SPRN_MCSRR1,r0
83b4cfa3
WD
1309 lwz r0,GPR0(r1)
1310 lwz r2,GPR2(r1)
1311 lwz r1,GPR1(r1)
1312 SYNC
1313 rfmci
efa35cf1
GB
1314#endif /* CONFIG_440 */
1315
1316
0442ed86
WD
1317 .globl get_pvr
1318get_pvr:
1319 mfspr r3, PVR
1320 blr
1321
0442ed86
WD
1322/*------------------------------------------------------------------------------- */
1323/* Function: out16 */
1324/* Description: Output 16 bits */
1325/*------------------------------------------------------------------------------- */
1326 .globl out16
1327out16:
1328 sth r4,0x0000(r3)
1329 blr
1330
1331/*------------------------------------------------------------------------------- */
1332/* Function: out16r */
1333/* Description: Byte reverse and output 16 bits */
1334/*------------------------------------------------------------------------------- */
1335 .globl out16r
1336out16r:
1337 sthbrx r4,r0,r3
1338 blr
1339
0442ed86
WD
1340/*------------------------------------------------------------------------------- */
1341/* Function: out32r */
1342/* Description: Byte reverse and output 32 bits */
1343/*------------------------------------------------------------------------------- */
1344 .globl out32r
1345out32r:
1346 stwbrx r4,r0,r3
1347 blr
1348
1349/*------------------------------------------------------------------------------- */
1350/* Function: in16 */
1351/* Description: Input 16 bits */
1352/*------------------------------------------------------------------------------- */
1353 .globl in16
1354in16:
1355 lhz r3,0x0000(r3)
1356 blr
1357
1358/*------------------------------------------------------------------------------- */
1359/* Function: in16r */
1360/* Description: Input 16 bits and byte reverse */
1361/*------------------------------------------------------------------------------- */
1362 .globl in16r
1363in16r:
1364 lhbrx r3,r0,r3
1365 blr
1366
0442ed86
WD
1367/*------------------------------------------------------------------------------- */
1368/* Function: in32r */
1369/* Description: Input 32 bits and byte reverse */
1370/*------------------------------------------------------------------------------- */
1371 .globl in32r
1372in32r:
1373 lwbrx r3,r0,r3
1374 blr
1375
0442ed86
WD
1376/*
1377 * void relocate_code (addr_sp, gd, addr_moni)
1378 *
1379 * This "function" does not return, instead it continues in RAM
1380 * after relocating the monitor code.
1381 *
c821b5f1
GE
1382 * r3 = Relocated stack pointer
1383 * r4 = Relocated global data pointer
1384 * r5 = Relocated text pointer
0442ed86
WD
1385 */
1386 .globl relocate_code
1387relocate_code:
6d0f6bcf 1388#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
9b94ac61 1389 /*
c821b5f1
GE
1390 * We need to flush the initial global data (gd_t) before the dcache
1391 * will be invalidated.
9b94ac61
SR
1392 */
1393
c821b5f1
GE
1394 /* Save registers */
1395 mr r9, r3
1396 mr r10, r4
1397 mr r11, r5
9b94ac61 1398
c821b5f1
GE
1399 /* Flush initial global data range */
1400 mr r3, r4
6d0f6bcf 1401 addi r4, r4, CONFIG_SYS_GBL_DATA_SIZE@l
9b94ac61
SR
1402 bl flush_dcache_range
1403
6d0f6bcf 1404#if defined(CONFIG_SYS_INIT_DCACHE_CS)
c821b5f1
GE
1405 /*
1406 * Undo the earlier data cache set-up for the primordial stack and
1407 * data area. First, invalidate the data cache and then disable data
1408 * cacheability for that area. Finally, restore the EBC values, if
1409 * any.
1410 */
1411
1412 /* Invalidate the primordial stack and data area in cache */
6d0f6bcf
JCPV
1413 lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1414 ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
c821b5f1 1415
6d0f6bcf
JCPV
1416 lis r4, CONFIG_SYS_INIT_RAM_END@h
1417 ori r4, r4, CONFIG_SYS_INIT_RAM_END@l
c821b5f1
GE
1418 add r4, r4, r3
1419
1420 bl invalidate_dcache_range
1421
1422 /* Disable cacheability for the region */
1423 mfdccr r3
6d0f6bcf
JCPV
1424 lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1425 ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
c821b5f1
GE
1426 and r3, r3, r4
1427 mtdccr r3
1428
1429 /* Restore the EBC parameters */
1430 li r3, PBxAP
d1c3b275 1431 mtdcr EBC0_CFGADDR, r3
c821b5f1
GE
1432 lis r3, PBxAP_VAL@h
1433 ori r3, r3, PBxAP_VAL@l
d1c3b275 1434 mtdcr EBC0_CFGDATA, r3
c821b5f1
GE
1435
1436 li r3, PBxCR
d1c3b275 1437 mtdcr EBC0_CFGADDR, r3
c821b5f1
GE
1438 lis r3, PBxCR_VAL@h
1439 ori r3, r3, PBxCR_VAL@l
d1c3b275 1440 mtdcr EBC0_CFGDATA, r3
6d0f6bcf 1441#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
c821b5f1
GE
1442
1443 /* Restore registers */
1444 mr r3, r9
1445 mr r4, r10
1446 mr r5, r11
6d0f6bcf 1447#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
e02c521d 1448
6d0f6bcf 1449#ifdef CONFIG_SYS_INIT_RAM_DCACHE
e02c521d
SR
1450 /*
1451 * Unlock the previously locked d-cache
1452 */
1453 msync
1454 isync
1455 /* set TFLOOR/NFLOOR to 0 again */
1456 lis r6,0x0001
1457 ori r6,r6,0xf800
58ea142f 1458 mtspr SPRN_DVLIM,r6
e02c521d
SR
1459 lis r6,0x0000
1460 ori r6,r6,0x0000
58ea142f
MF
1461 mtspr SPRN_DNV0,r6
1462 mtspr SPRN_DNV1,r6
1463 mtspr SPRN_DNV2,r6
1464 mtspr SPRN_DNV3,r6
1465 mtspr SPRN_DTV0,r6
1466 mtspr SPRN_DTV1,r6
1467 mtspr SPRN_DTV2,r6
1468 mtspr SPRN_DTV3,r6
e02c521d
SR
1469 msync
1470 isync
6d0f6bcf 1471#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
e02c521d 1472
887e2ec9
SR
1473#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1474 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
2801b2d2 1475 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
7d307936
FK
1476 defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
1477 defined(CONFIG_460SX)
a4c8d138
SR
1478 /*
1479 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1480 * to speed up the boot process. Now this cache needs to be disabled.
1481 */
1482 iccci 0,0 /* Invalidate inst cache */
1483 dccci 0,0 /* Invalidate data cache, now no longer our stack */
c157d8e2 1484 sync
a4c8d138 1485 isync
25fb4eaa
SR
1486
1487 /* Clear all potential pending exceptions */
58ea142f
MF
1488 mfspr r1,SPRN_MCSR
1489 mtspr SPRN_MCSR,r1
6d0f6bcf
JCPV
1490#ifdef CONFIG_SYS_TLB_FOR_BOOT_FLASH
1491 addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
85dc2a7f
NG
1492#else
1493 addi r1,r0,0x0000 /* Default TLB entry is #0 */
6d0f6bcf 1494#endif /* CONFIG_SYS_TLB_FOR_BOOT_FLASH */
c157d8e2 1495 tlbre r0,r1,0x0002 /* Read contents */
6e7fb6ea 1496 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
f901a83b 1497 tlbwe r0,r1,0x0002 /* Save it out */
a4c8d138 1498 sync
c157d8e2 1499 isync
c821b5f1 1500#endif /* defined(CONFIG_440EP) || ... || defined(CONFIG_460GT) */
0442ed86
WD
1501 mr r1, r3 /* Set new stack pointer */
1502 mr r9, r4 /* Save copy of Init Data pointer */
1503 mr r10, r5 /* Save copy of Destination Address */
1504
1505 mr r3, r5 /* Destination Address */
6d0f6bcf
JCPV
1506 lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1507 ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
3b57fe0a
WD
1508 lwz r5, GOT(__init_end)
1509 sub r5, r5, r4
9b94ac61 1510 li r6, L1_CACHE_BYTES /* Cache Line Size */
0442ed86
WD
1511
1512 /*
1513 * Fix GOT pointer:
1514 *
6d0f6bcf 1515 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
0442ed86
WD
1516 *
1517 * Offset:
1518 */
1519 sub r15, r10, r4
1520
1521 /* First our own GOT */
1522 add r14, r14, r15
c821b5f1 1523 /* then the one used by the C code */
0442ed86
WD
1524 add r30, r30, r15
1525
1526 /*
1527 * Now relocate code
1528 */
1529
1530 cmplw cr1,r3,r4
1531 addi r0,r5,3
1532 srwi. r0,r0,2
1533 beq cr1,4f /* In place copy is not necessary */
1534 beq 7f /* Protect against 0 count */
1535 mtctr r0
1536 bge cr1,2f
1537
1538 la r8,-4(r4)
1539 la r7,-4(r3)
15401: lwzu r0,4(r8)
1541 stwu r0,4(r7)
1542 bdnz 1b
1543 b 4f
1544
15452: slwi r0,r0,2
1546 add r8,r4,r0
1547 add r7,r3,r0
15483: lwzu r0,-4(r8)
1549 stwu r0,-4(r7)
1550 bdnz 3b
1551
1552/*
1553 * Now flush the cache: note that we must start from a cache aligned
1554 * address. Otherwise we might miss one cache line.
1555 */
15564: cmpwi r6,0
1557 add r5,r3,r5
1558 beq 7f /* Always flush prefetch queue in any case */
1559 subi r0,r6,1
1560 andc r3,r3,r0
1561 mr r4,r3
15625: dcbst 0,r4
1563 add r4,r4,r6
1564 cmplw r4,r5
1565 blt 5b
1566 sync /* Wait for all dcbst to complete on bus */
1567 mr r4,r3
15686: icbi 0,r4
1569 add r4,r4,r6
1570 cmplw r4,r5
1571 blt 6b
15727: sync /* Wait for all icbi to complete on bus */
1573 isync
1574
1575/*
1576 * We are done. Do not return, instead branch to second part of board
1577 * initialization, now running from RAM.
1578 */
1579
efa35cf1 1580 addi r0, r10, in_ram - _start + _START_OFFSET
0442ed86
WD
1581 mtlr r0
1582 blr /* NEVER RETURNS! */
1583
1584in_ram:
1585
1586 /*
1587 * Relocation Function, r14 point to got2+0x8000
1588 *
1589 * Adjust got2 pointers, no need to check for 0, this code
1590 * already puts a few entries in the table.
1591 */
1592 li r0,__got2_entries@sectoff@l
1593 la r3,GOT(_GOT2_TABLE_)
1594 lwz r11,GOT(_GOT2_TABLE_)
1595 mtctr r0
1596 sub r11,r3,r11
1597 addi r3,r3,-4
15981: lwzu r0,4(r3)
1599 add r0,r0,r11
1600 stw r0,0(r3)
1601 bdnz 1b
1602
1603 /*
1604 * Now adjust the fixups and the pointers to the fixups
1605 * in case we need to move ourselves again.
1606 */
16072: li r0,__fixup_entries@sectoff@l
1608 lwz r3,GOT(_FIXUP_TABLE_)
1609 cmpwi r0,0
1610 mtctr r0
1611 addi r3,r3,-4
1612 beq 4f
16133: lwzu r4,4(r3)
1614 lwzux r0,r4,r11
1615 add r0,r0,r11
1616 stw r10,0(r3)
1617 stw r0,0(r4)
1618 bdnz 3b
16194:
1620clear_bss:
1621 /*
1622 * Now clear BSS segment
1623 */
5d232d0e 1624 lwz r3,GOT(__bss_start)
0442ed86
WD
1625 lwz r4,GOT(_end)
1626
1627 cmplw 0, r3, r4
42ed33ff 1628 beq 7f
0442ed86
WD
1629
1630 li r0, 0
42ed33ff
AG
1631
1632 andi. r5, r4, 3
1633 beq 6f
1634 sub r4, r4, r5
1635 mtctr r5
1636 mr r5, r4
16375: stb r0, 0(r5)
1638 addi r5, r5, 1
1639 bdnz 5b
16406:
0442ed86
WD
1641 stw r0, 0(r3)
1642 addi r3, r3, 4
1643 cmplw 0, r3, r4
42ed33ff 1644 bne 6b
0442ed86 1645
42ed33ff 16467:
0442ed86
WD
1647 mr r3, r9 /* Init Data pointer */
1648 mr r4, r10 /* Destination Address */
1649 bl board_init_r
1650
0442ed86
WD
1651 /*
1652 * Copy exception vector code to low memory
1653 *
1654 * r3: dest_addr
1655 * r7: source address, r8: end address, r9: target address
1656 */
1657 .globl trap_init
1658trap_init:
efa35cf1 1659 lwz r7, GOT(_start_of_vectors)
0442ed86
WD
1660 lwz r8, GOT(_end_of_vectors)
1661
682011ff 1662 li r9, 0x100 /* reset vector always at 0x100 */
0442ed86
WD
1663
1664 cmplw 0, r7, r8
1665 bgelr /* return if r7>=r8 - just in case */
1666
1667 mflr r4 /* save link register */
16681:
1669 lwz r0, 0(r7)
1670 stw r0, 0(r9)
1671 addi r7, r7, 4
1672 addi r9, r9, 4
1673 cmplw 0, r7, r8
1674 bne 1b
1675
1676 /*
1677 * relocate `hdlr' and `int_return' entries
1678 */
efa35cf1
GB
1679 li r7, .L_MachineCheck - _start + _START_OFFSET
1680 li r8, Alignment - _start + _START_OFFSET
0442ed86
WD
16812:
1682 bl trap_reloc
efa35cf1 1683 addi r7, r7, 0x100 /* next exception vector */
0442ed86
WD
1684 cmplw 0, r7, r8
1685 blt 2b
1686
efa35cf1 1687 li r7, .L_Alignment - _start + _START_OFFSET
0442ed86
WD
1688 bl trap_reloc
1689
efa35cf1 1690 li r7, .L_ProgramCheck - _start + _START_OFFSET
0442ed86
WD
1691 bl trap_reloc
1692
efa35cf1
GB
1693#ifdef CONFIG_440
1694 li r7, .L_FPUnavailable - _start + _START_OFFSET
83b4cfa3 1695 bl trap_reloc
0442ed86 1696
efa35cf1 1697 li r7, .L_Decrementer - _start + _START_OFFSET
83b4cfa3 1698 bl trap_reloc
efa35cf1
GB
1699
1700 li r7, .L_APU - _start + _START_OFFSET
83b4cfa3 1701 bl trap_reloc
df8a24cd 1702
83b4cfa3
WD
1703 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1704 bl trap_reloc
efa35cf1 1705
83b4cfa3
WD
1706 li r7, .L_DataTLBError - _start + _START_OFFSET
1707 bl trap_reloc
efa35cf1
GB
1708#else /* CONFIG_440 */
1709 li r7, .L_PIT - _start + _START_OFFSET
83b4cfa3 1710 bl trap_reloc
efa35cf1
GB
1711
1712 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
83b4cfa3 1713 bl trap_reloc
efa35cf1
GB
1714
1715 li r7, .L_DataTLBMiss - _start + _START_OFFSET
83b4cfa3 1716 bl trap_reloc
efa35cf1
GB
1717#endif /* CONFIG_440 */
1718
83b4cfa3
WD
1719 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1720 bl trap_reloc
0442ed86 1721
887e2ec9 1722#if !defined(CONFIG_440)
9a7b408c
SR
1723 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1724 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1725 mtmsr r7 /* change MSR */
1726#else
887e2ec9
SR
1727 bl __440_msr_set
1728 b __440_msr_continue
9a7b408c 1729
887e2ec9 1730__440_msr_set:
9a7b408c
SR
1731 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1732 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
58ea142f 1733 mtspr SPRN_SRR1,r7
9a7b408c 1734 mflr r7
58ea142f 1735 mtspr SPRN_SRR0,r7
9a7b408c 1736 rfi
887e2ec9 1737__440_msr_continue:
9a7b408c
SR
1738#endif
1739
0442ed86
WD
1740 mtlr r4 /* restore link register */
1741 blr
1742
1743 /*
1744 * Function: relocate entries for one exception vector
1745 */
1746trap_reloc:
1747 lwz r0, 0(r7) /* hdlr ... */
1748 add r0, r0, r3 /* ... += dest_addr */
1749 stw r0, 0(r7)
1750
1751 lwz r0, 4(r7) /* int_return ... */
1752 add r0, r0, r3 /* ... += dest_addr */
1753 stw r0, 4(r7)
1754
1755 blr
cf959c7d
SR
1756
1757#if defined(CONFIG_440)
1758/*----------------------------------------------------------------------------+
1759| dcbz_area.
1760+----------------------------------------------------------------------------*/
1761 function_prolog(dcbz_area)
1762 rlwinm. r5,r4,0,27,31
83b4cfa3
WD
1763 rlwinm r5,r4,27,5,31
1764 beq ..d_ra2
1765 addi r5,r5,0x0001
1766..d_ra2:mtctr r5
1767..d_ag2:dcbz r0,r3
1768 addi r3,r3,32
1769 bdnz ..d_ag2
cf959c7d
SR
1770 sync
1771 blr
1772 function_epilog(dcbz_area)
cf959c7d 1773#endif /* CONFIG_440 */
887e2ec9 1774#endif /* CONFIG_NAND_SPL */
b867d705 1775
cf959c7d
SR
1776/*------------------------------------------------------------------------------- */
1777/* Function: in8 */
1778/* Description: Input 8 bits */
1779/*------------------------------------------------------------------------------- */
1780 .globl in8
1781in8:
1782 lbz r3,0x0000(r3)
1783 blr
1784
1785/*------------------------------------------------------------------------------- */
1786/* Function: out8 */
1787/* Description: Output 8 bits */
1788/*------------------------------------------------------------------------------- */
1789 .globl out8
1790out8:
1791 stb r4,0x0000(r3)
1792 blr
1793
1794/*------------------------------------------------------------------------------- */
1795/* Function: out32 */
1796/* Description: Output 32 bits */
1797/*------------------------------------------------------------------------------- */
1798 .globl out32
1799out32:
1800 stw r4,0x0000(r3)
1801 blr
1802
1803/*------------------------------------------------------------------------------- */
1804/* Function: in32 */
1805/* Description: Input 32 bits */
1806/*------------------------------------------------------------------------------- */
1807 .globl in32
1808in32:
1809 lwz 3,0x0000(3)
1810 blr
b867d705
SR
1811
1812/**************************************************************************/
f901a83b 1813/* PPC405EP specific stuff */
b867d705
SR
1814/**************************************************************************/
1815#ifdef CONFIG_405EP
1816ppc405ep_init:
b828dda6 1817
c157d8e2 1818#ifdef CONFIG_BUBINGA
b828dda6
SR
1819 /*
1820 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1821 * function) to support FPGA and NVRAM accesses below.
1822 */
1823
1824 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1825 ori r3,r3,GPIO0_OSRH@l
6d0f6bcf
JCPV
1826 lis r4,CONFIG_SYS_GPIO0_OSRH@h
1827 ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
b828dda6
SR
1828 stw r4,0(r3)
1829 lis r3,GPIO0_OSRL@h
1830 ori r3,r3,GPIO0_OSRL@l
6d0f6bcf
JCPV
1831 lis r4,CONFIG_SYS_GPIO0_OSRL@h
1832 ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
b828dda6
SR
1833 stw r4,0(r3)
1834
1835 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1836 ori r3,r3,GPIO0_ISR1H@l
6d0f6bcf
JCPV
1837 lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1838 ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
b828dda6
SR
1839 stw r4,0(r3)
1840 lis r3,GPIO0_ISR1L@h
1841 ori r3,r3,GPIO0_ISR1L@l
6d0f6bcf
JCPV
1842 lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1843 ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
b828dda6
SR
1844 stw r4,0(r3)
1845
1846 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1847 ori r3,r3,GPIO0_TSRH@l
6d0f6bcf
JCPV
1848 lis r4,CONFIG_SYS_GPIO0_TSRH@h
1849 ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
b828dda6
SR
1850 stw r4,0(r3)
1851 lis r3,GPIO0_TSRL@h
1852 ori r3,r3,GPIO0_TSRL@l
6d0f6bcf
JCPV
1853 lis r4,CONFIG_SYS_GPIO0_TSRL@h
1854 ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
b828dda6
SR
1855 stw r4,0(r3)
1856
1857 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1858 ori r3,r3,GPIO0_TCR@l
6d0f6bcf
JCPV
1859 lis r4,CONFIG_SYS_GPIO0_TCR@h
1860 ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
b828dda6
SR
1861 stw r4,0(r3)
1862
d1c3b275
SR
1863 li r3,PB1AP /* program EBC bank 1 for RTC access */
1864 mtdcr EBC0_CFGADDR,r3
6d0f6bcf
JCPV
1865 lis r3,CONFIG_SYS_EBC_PB1AP@h
1866 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
d1c3b275
SR
1867 mtdcr EBC0_CFGDATA,r3
1868 li r3,PB1CR
1869 mtdcr EBC0_CFGADDR,r3
6d0f6bcf
JCPV
1870 lis r3,CONFIG_SYS_EBC_PB1CR@h
1871 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
d1c3b275 1872 mtdcr EBC0_CFGDATA,r3
b828dda6 1873
d1c3b275
SR
1874 li r3,PB1AP /* program EBC bank 1 for RTC access */
1875 mtdcr EBC0_CFGADDR,r3
6d0f6bcf
JCPV
1876 lis r3,CONFIG_SYS_EBC_PB1AP@h
1877 ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
d1c3b275
SR
1878 mtdcr EBC0_CFGDATA,r3
1879 li r3,PB1CR
1880 mtdcr EBC0_CFGADDR,r3
6d0f6bcf
JCPV
1881 lis r3,CONFIG_SYS_EBC_PB1CR@h
1882 ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
d1c3b275 1883 mtdcr EBC0_CFGDATA,r3
b828dda6 1884
d1c3b275
SR
1885 li r3,PB4AP /* program EBC bank 4 for FPGA access */
1886 mtdcr EBC0_CFGADDR,r3
6d0f6bcf
JCPV
1887 lis r3,CONFIG_SYS_EBC_PB4AP@h
1888 ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
d1c3b275
SR
1889 mtdcr EBC0_CFGDATA,r3
1890 li r3,PB4CR
1891 mtdcr EBC0_CFGADDR,r3
6d0f6bcf
JCPV
1892 lis r3,CONFIG_SYS_EBC_PB4CR@h
1893 ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
d1c3b275 1894 mtdcr EBC0_CFGDATA,r3
b828dda6 1895#endif
8bde7f77
WD
1896
1897 /*
1898 !-----------------------------------------------------------------------
1899 ! Check to see if chip is in bypass mode.
1900 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1901 ! CPU reset Otherwise, skip this step and keep going.
f901a83b
WD
1902 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1903 ! will not be fast enough for the SDRAM (min 66MHz)
8bde7f77 1904 !-----------------------------------------------------------------------
b867d705 1905 */
f901a83b 1906 mfdcr r5, CPC0_PLLMR1
53677ef1 1907 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
f901a83b 1908 cmpi cr0,0,r4,0x1
b867d705 1909
53677ef1
WD
1910 beq pll_done /* if SSCS =b'1' then PLL has */
1911 /* already been set */
1912 /* and CPU has been reset */
1913 /* so skip to next section */
b867d705 1914
c157d8e2 1915#ifdef CONFIG_BUBINGA
b867d705 1916 /*
8bde7f77
WD
1917 !-----------------------------------------------------------------------
1918 ! Read NVRAM to get value to write in PLLMR.
1919 ! If value has not been correctly saved, write default value
1920 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1921 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1922 !
1923 ! WARNING: This code assumes the first three words in the nvram_t
f901a83b
WD
1924 ! structure in openbios.h. Changing the beginning of
1925 ! the structure will break this code.
8bde7f77
WD
1926 !
1927 !-----------------------------------------------------------------------
b867d705 1928 */
f901a83b
WD
1929 addis r3,0,NVRAM_BASE@h
1930 addi r3,r3,NVRAM_BASE@l
1931
1932 lwz r4, 0(r3)
1933 addis r5,0,NVRVFY1@h
1934 addi r5,r5,NVRVFY1@l
53677ef1 1935 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
f901a83b
WD
1936 bne ..no_pllset
1937 addi r3,r3,4
1938 lwz r4, 0(r3)
1939 addis r5,0,NVRVFY2@h
1940 addi r5,r5,NVRVFY2@l
53677ef1 1941 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
f901a83b
WD
1942 bne ..no_pllset
1943 addi r3,r3,8 /* Skip over conf_size */
1944 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1945 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1946 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1947 cmpi cr0,0,r5,1 /* See if PLL is locked */
1948 beq pll_write
b867d705 1949..no_pllset:
c157d8e2 1950#endif /* CONFIG_BUBINGA */
b867d705 1951
d4024bb7
JO
1952#ifdef CONFIG_TAIHU
1953 mfdcr r4, CPC0_BOOT
1954 andi. r5, r4, CPC0_BOOT_SEP@l
1955 bne strap_1 /* serial eeprom present */
1956 addis r5,0,CPLD_REG0_ADDR@h
1957 ori r5,r5,CPLD_REG0_ADDR@l
1958 andi. r5, r5, 0x10
1959 bne _pci_66mhz
1960#endif /* CONFIG_TAIHU */
1961
779e9751
SR
1962#if defined(CONFIG_ZEUS)
1963 mfdcr r4, CPC0_BOOT
1964 andi. r5, r4, CPC0_BOOT_SEP@l
53677ef1 1965 bne strap_1 /* serial eeprom present */
779e9751
SR
1966 lis r3,0x0000
1967 addi r3,r3,0x3030
1968 lis r4,0x8042
1969 addi r4,r4,0x223e
1970 b 1f
1971strap_1:
1972 mfdcr r3, CPC0_PLLMR0
1973 mfdcr r4, CPC0_PLLMR1
1974 b 1f
1975#endif
1976
53677ef1
WD
1977 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1978 ori r3,r3,PLLMR0_DEFAULT@l /* */
1979 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1980 ori r4,r4,PLLMR1_DEFAULT@l /* */
b867d705 1981
d4024bb7
JO
1982#ifdef CONFIG_TAIHU
1983 b 1f
1984_pci_66mhz:
1985 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1986 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1987 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1988 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1989 b 1f
1990strap_1:
1991 mfdcr r3, CPC0_PLLMR0
1992 mfdcr r4, CPC0_PLLMR1
d4024bb7
JO
1993#endif /* CONFIG_TAIHU */
1994
779e9751 19951:
53677ef1 1996 b pll_write /* Write the CPC0_PLLMR with new value */
b867d705
SR
1997
1998pll_done:
8bde7f77
WD
1999 /*
2000 !-----------------------------------------------------------------------
2001 ! Clear Soft Reset Register
2002 ! This is needed to enable PCI if not booting from serial EPROM
2003 !-----------------------------------------------------------------------
b867d705 2004 */
f901a83b
WD
2005 addi r3, 0, 0x0
2006 mtdcr CPC0_SRR, r3
b867d705 2007
f901a83b
WD
2008 addis r3,0,0x0010
2009 mtctr r3
b867d705 2010pci_wait:
f901a83b 2011 bdnz pci_wait
b867d705 2012
53677ef1 2013 blr /* return to main code */
b867d705
SR
2014
2015/*
2016!-----------------------------------------------------------------------------
f901a83b
WD
2017! Function: pll_write
2018! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
2019! That is:
2020! 1. Pll is first disabled (de-activated by putting in bypass mode)
2021! 2. PLL is reset
2022! 3. Clock dividers are set while PLL is held in reset and bypassed
2023! 4. PLL Reset is cleared
2024! 5. Wait 100us for PLL to lock
2025! 6. A core reset is performed
b867d705
SR
2026! Input: r3 = Value to write to CPC0_PLLMR0
2027! Input: r4 = Value to write to CPC0_PLLMR1
2028! Output r3 = none
2029!-----------------------------------------------------------------------------
2030*/
0580e48f 2031 .globl pll_write
b867d705 2032pll_write:
8bde7f77
WD
2033 mfdcr r5, CPC0_UCR
2034 andis. r5,r5,0xFFFF
53677ef1
WD
2035 ori r5,r5,0x0101 /* Stop the UART clocks */
2036 mtdcr CPC0_UCR,r5 /* Before changing PLL */
8bde7f77
WD
2037
2038 mfdcr r5, CPC0_PLLMR1
53677ef1 2039 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
f901a83b 2040 mtdcr CPC0_PLLMR1,r5
53677ef1 2041 oris r5,r5,0x4000 /* Set PLL Reset */
f901a83b
WD
2042 mtdcr CPC0_PLLMR1,r5
2043
53677ef1
WD
2044 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
2045 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
2046 oris r5,r5,0x4000 /* Set PLL Reset */
2047 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
2048 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
f901a83b 2049 mtdcr CPC0_PLLMR1,r5
b867d705
SR
2050
2051 /*
8bde7f77
WD
2052 ! Wait min of 100us for PLL to lock.
2053 ! See CMOS 27E databook for more info.
2054 ! At 200MHz, that means waiting 20,000 instructions
b867d705 2055 */
f901a83b
WD
2056 addi r3,0,20000 /* 2000 = 0x4e20 */
2057 mtctr r3
b867d705 2058pll_wait:
f901a83b 2059 bdnz pll_wait
8bde7f77 2060
f901a83b
WD
2061 oris r5,r5,0x8000 /* Enable PLL */
2062 mtdcr CPC0_PLLMR1,r5 /* Engage */
8bde7f77
WD
2063
2064 /*
2065 * Reset CPU to guarantee timings are OK
2066 * Not sure if this is needed...
2067 */
2068 addis r3,0,0x1000
58ea142f 2069 mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
53677ef1
WD
2070 /* execution will continue from the poweron */
2071 /* vector of 0xfffffffc */
b867d705 2072#endif /* CONFIG_405EP */
4745acaa
SR
2073
2074#if defined(CONFIG_440)
4745acaa
SR
2075/*----------------------------------------------------------------------------+
2076| mttlb3.
2077+----------------------------------------------------------------------------*/
2078 function_prolog(mttlb3)
2079 TLBWE(4,3,2)
2080 blr
2081 function_epilog(mttlb3)
2082
2083/*----------------------------------------------------------------------------+
2084| mftlb3.
2085+----------------------------------------------------------------------------*/
2086 function_prolog(mftlb3)
74357114 2087 TLBRE(3,3,2)
4745acaa
SR
2088 blr
2089 function_epilog(mftlb3)
2090
2091/*----------------------------------------------------------------------------+
2092| mttlb2.
2093+----------------------------------------------------------------------------*/
2094 function_prolog(mttlb2)
2095 TLBWE(4,3,1)
2096 blr
2097 function_epilog(mttlb2)
2098
2099/*----------------------------------------------------------------------------+
2100| mftlb2.
2101+----------------------------------------------------------------------------*/
2102 function_prolog(mftlb2)
74357114 2103 TLBRE(3,3,1)
4745acaa
SR
2104 blr
2105 function_epilog(mftlb2)
2106
2107/*----------------------------------------------------------------------------+
2108| mttlb1.
2109+----------------------------------------------------------------------------*/
2110 function_prolog(mttlb1)
2111 TLBWE(4,3,0)
2112 blr
2113 function_epilog(mttlb1)
2114
2115/*----------------------------------------------------------------------------+
2116| mftlb1.
2117+----------------------------------------------------------------------------*/
2118 function_prolog(mftlb1)
74357114 2119 TLBRE(3,3,0)
4745acaa
SR
2120 blr
2121 function_epilog(mftlb1)
2122#endif /* CONFIG_440 */
64852d09
SR
2123
2124#if defined(CONFIG_NAND_SPL)
2125/*
2126 * void nand_boot_relocate(dst, src, bytes)
2127 *
2128 * r3 = Destination address to copy code to (in SDRAM)
2129 * r4 = Source address to copy code from
2130 * r5 = size to copy in bytes
2131 */
2132nand_boot_relocate:
2133 mr r6,r3
2134 mr r7,r4
2135 mflr r8
2136
2137 /*
2138 * Copy SPL from icache into SDRAM
2139 */
2140 subi r3,r3,4
2141 subi r4,r4,4
2142 srwi r5,r5,2
2143 mtctr r5
2144..spl_loop:
2145 lwzu r0,4(r4)
2146 stwu r0,4(r3)
2147 bdnz ..spl_loop
2148
2149 /*
2150 * Calculate "corrected" link register, so that we "continue"
2151 * in execution in destination range
2152 */
2153 sub r3,r7,r6 /* r3 = src - dst */
2154 sub r8,r8,r3 /* r8 = link-reg - (src - dst) */
2155 mtlr r8
2156 blr
2157
2158nand_boot_common:
2159 /*
2160 * First initialize SDRAM. It has to be available *before* calling
2161 * nand_boot().
2162 */
6d0f6bcf
JCPV
2163 lis r3,CONFIG_SYS_SDRAM_BASE@h
2164 ori r3,r3,CONFIG_SYS_SDRAM_BASE@l
64852d09
SR
2165 bl initdram
2166
2167 /*
2168 * Now copy the 4k SPL code into SDRAM and continue execution
2169 * from there.
2170 */
6d0f6bcf
JCPV
2171 lis r3,CONFIG_SYS_NAND_BOOT_SPL_DST@h
2172 ori r3,r3,CONFIG_SYS_NAND_BOOT_SPL_DST@l
2173 lis r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@h
2174 ori r4,r4,CONFIG_SYS_NAND_BOOT_SPL_SRC@l
2175 lis r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@h
2176 ori r5,r5,CONFIG_SYS_NAND_BOOT_SPL_SIZE@l
64852d09
SR
2177 bl nand_boot_relocate
2178
2179 /*
2180 * We're running from SDRAM now!!!
2181 *
2182 * It is necessary for 4xx systems to relocate from running at
2183 * the original location (0xfffffxxx) to somewhere else (SDRAM
2184 * preferably). This is because CS0 needs to be reconfigured for
2185 * NAND access. And we can't reconfigure this CS when currently
2186 * "running" from it.
2187 */
2188
2189 /*
2190 * Finally call nand_boot() to load main NAND U-Boot image from
2191 * NAND and jump to it.
2192 */
2193 bl nand_boot /* will not return */
2194#endif /* CONFIG_NAND_SPL */