blob: d8df67b0da2f1f69d48f0f84f3ef6b4ef36864e6 [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
wdenk0442ed82002-11-03 10:24:00 +00006 *
7 * See file CREDITS for list of people who contributed to this
8 * project.
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of
13 * the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23 * MA 02111-1307 USA
24 */
Wolfgang Denk09675ef2007-06-20 18:14:24 +020025/*------------------------------------------------------------------------------+
26 *
27 * This source code has been made available to you by IBM on an AS-IS
28 * basis. Anyone receiving this source is licensed under IBM
29 * copyrights to use it in any way he or she deems fit, including
30 * copying it, modifying it, compiling it, and redistributing it either
31 * with or without modifications. No license under IBM patents or
32 * patent applications is to be implied by the copyright license.
33 *
34 * Any user of this software should understand that IBM cannot provide
35 * technical support for this software and will not be responsible for
36 * any consequences resulting from the use of this software.
37 *
38 * Any person who transfers this source code or any derivative work
39 * must include the IBM copyright notice, this paragraph, and the
40 * preceding two paragraphs in the transferred software.
41 *
42 * COPYRIGHT I B M CORPORATION 1995
43 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
44 *-------------------------------------------------------------------------------
45 */
wdenk0442ed82002-11-03 10:24:00 +000046
Wolfgang Denk0ee70772005-09-23 11:05:55 +020047/* U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
wdenk0442ed82002-11-03 10:24:00 +000048 *
49 *
50 * The processor starts at 0xfffffffc and the code is executed
51 * from flash/rom.
52 * in memory, but as long we don't jump around before relocating.
53 * board_init lies at a quite high address and when the cpu has
54 * jumped there, everything is ok.
55 * This works because the cpu gives the FLASH (CS0) the whole
56 * address space at startup, and board_init lies as a echo of
57 * the flash somewhere up there in the memorymap.
58 *
59 * board_init will change CS0 to be positioned at the correct
60 * address and (s)dram will be positioned at address 0
61 */
62#include <config.h>
wdenk0442ed82002-11-03 10:24:00 +000063#include <ppc4xx.h>
64#include <version.h>
65
66#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
67
68#include <ppc_asm.tmpl>
69#include <ppc_defs.h>
70
71#include <asm/cache.h>
72#include <asm/mmu.h>
73
74#ifndef CONFIG_IDENT_STRING
75#define CONFIG_IDENT_STRING ""
76#endif
77
78#ifdef CFG_INIT_DCACHE_CS
79# if (CFG_INIT_DCACHE_CS == 0)
80# define PBxAP pb0ap
81# define PBxCR pb0cr
82# endif
83# if (CFG_INIT_DCACHE_CS == 1)
84# define PBxAP pb1ap
85# define PBxCR pb1cr
86# endif
87# if (CFG_INIT_DCACHE_CS == 2)
88# define PBxAP pb2ap
89# define PBxCR pb2cr
90# endif
91# if (CFG_INIT_DCACHE_CS == 3)
92# define PBxAP pb3ap
93# define PBxCR pb3cr
94# endif
95# if (CFG_INIT_DCACHE_CS == 4)
96# define PBxAP pb4ap
97# define PBxCR pb4cr
98# endif
99# if (CFG_INIT_DCACHE_CS == 5)
100# define PBxAP pb5ap
101# define PBxCR pb5cr
102# endif
103# if (CFG_INIT_DCACHE_CS == 6)
104# define PBxAP pb6ap
105# define PBxCR pb6cr
106# endif
107# if (CFG_INIT_DCACHE_CS == 7)
108# define PBxAP pb7ap
109# define PBxCR pb7cr
110# endif
111#endif /* CFG_INIT_DCACHE_CS */
112
Stefan Roese0fb8ab92008-01-30 14:48:28 +0100113#if (defined(CFG_INIT_RAM_DCACHE) && (CFG_INIT_RAM_END > (4 << 10)))
114#error Only 4k of init-ram is supported - please adjust CFG_INIT_RAM_END!
115#endif
116
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200117#define function_prolog(func_name) .text; \
Stefan Roese42743512007-06-01 15:27:11 +0200118 .align 2; \
119 .globl func_name; \
120 func_name:
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200121#define function_epilog(func_name) .type func_name,@function; \
Stefan Roese42743512007-06-01 15:27:11 +0200122 .size func_name,.-func_name
123
wdenk0442ed82002-11-03 10:24:00 +0000124/* We don't want the MMU yet.
125*/
126#undef MSR_KERNEL
127#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
128
129
130 .extern ext_bus_cntlr_init
131 .extern sdram_init
Stefan Roese42fbddd2006-09-07 11:51:23 +0200132#ifdef CONFIG_NAND_U_BOOT
133 .extern reconfig_tlb0
134#endif
wdenk0442ed82002-11-03 10:24:00 +0000135
136/*
137 * Set up GOT: Global Offset Table
138 *
139 * Use r14 to access the GOT
140 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200141#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000142 START_GOT
143 GOT_ENTRY(_GOT2_TABLE_)
144 GOT_ENTRY(_FIXUP_TABLE_)
145
146 GOT_ENTRY(_start)
147 GOT_ENTRY(_start_of_vectors)
148 GOT_ENTRY(_end_of_vectors)
149 GOT_ENTRY(transfer_to_handler)
150
wdenkb9a83a92003-05-30 12:48:29 +0000151 GOT_ENTRY(__init_end)
wdenk0442ed82002-11-03 10:24:00 +0000152 GOT_ENTRY(_end)
wdenkbf2f8c92003-05-22 22:52:13 +0000153 GOT_ENTRY(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +0000154 END_GOT
Stefan Roese42fbddd2006-09-07 11:51:23 +0200155#endif /* CONFIG_NAND_SPL */
156
157#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
158 /*
159 * NAND U-Boot image is started from offset 0
160 */
161 .text
Stefan Roese23d8d342007-06-06 11:42:13 +0200162#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200163 bl reconfig_tlb0
Stefan Roese23d8d342007-06-06 11:42:13 +0200164#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200165 GET_GOT
166 bl cpu_init_f /* run low-level CPU init code (from Flash) */
167 bl board_init_f
168#endif
wdenk0442ed82002-11-03 10:24:00 +0000169
170/*
171 * 440 Startup -- on reset only the top 4k of the effective
172 * address space is mapped in by an entry in the instruction
173 * and data shadow TLB. The .bootpg section is located in the
174 * top 4k & does only what's necessary to map in the the rest
175 * of the boot rom. Once the boot rom is mapped in we can
176 * proceed with normal startup.
177 *
178 * NOTE: CS0 only covers the top 2MB of the effective address
179 * space after reset.
180 */
181
182#if defined(CONFIG_440)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200183#if !defined(CONFIG_NAND_SPL)
wdenk0442ed82002-11-03 10:24:00 +0000184 .section .bootpg,"ax"
Stefan Roese42fbddd2006-09-07 11:51:23 +0200185#endif
wdenk0442ed82002-11-03 10:24:00 +0000186 .globl _start_440
187
188/**************************************************************************/
189_start_440:
Wolfgang Denk4df0da52006-10-09 00:42:01 +0200190 /*--------------------------------------------------------------------+
191 | 440EPX BUP Change - Hardware team request
192 +--------------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200193#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
194 sync
195 nop
196 nop
197#endif
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200198 /*----------------------------------------------------------------+
199 | Core bug fix. Clear the esr
200 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200201 li r0,0
Wolfgang Denkba940932006-07-19 13:50:38 +0200202 mtspr esr,r0
wdenk0442ed82002-11-03 10:24:00 +0000203 /*----------------------------------------------------------------*/
204 /* Clear and set up some registers. */
205 /*----------------------------------------------------------------*/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200206 iccci r0,r0 /* NOTE: operands not used for 440 */
207 dccci r0,r0 /* NOTE: operands not used for 440 */
wdenk0442ed82002-11-03 10:24:00 +0000208 sync
209 li r0,0
210 mtspr srr0,r0
211 mtspr srr1,r0
212 mtspr csrr0,r0
213 mtspr csrr1,r0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200214 /* NOTE: 440GX adds machine check status regs */
215#if defined(CONFIG_440) && !defined(CONFIG_440GP)
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200216 mtspr mcsrr0,r0
217 mtspr mcsrr1,r0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200218 mfspr r1,mcsr
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200219 mtspr mcsr,r1
wdenk544e9732004-02-06 23:19:44 +0000220#endif
Stefan Roese0100cc12006-11-22 13:20:50 +0100221
222 /*----------------------------------------------------------------*/
223 /* CCR0 init */
224 /*----------------------------------------------------------------*/
225 /* Disable store gathering & broadcast, guarantee inst/data
226 * cache block touch, force load/store alignment
227 * (see errata 1.12: 440_33)
228 */
229 lis r1,0x0030 /* store gathering & broadcast disable */
230 ori r1,r1,0x6000 /* cache touch */
231 mtspr ccr0,r1
232
wdenk0442ed82002-11-03 10:24:00 +0000233 /*----------------------------------------------------------------*/
234 /* Initialize debug */
235 /*----------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +0200236 mfspr r1,dbcr0
237 andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
238 bne skip_debug_init /* if set, don't clear debug register */
wdenk0442ed82002-11-03 10:24:00 +0000239 mtspr dbcr0,r0
240 mtspr dbcr1,r0
241 mtspr dbcr2,r0
242 mtspr iac1,r0
243 mtspr iac2,r0
244 mtspr iac3,r0
245 mtspr dac1,r0
246 mtspr dac2,r0
247 mtspr dvc1,r0
248 mtspr dvc2,r0
249
250 mfspr r1,dbsr
251 mtspr dbsr,r1 /* Clear all valid bits */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200252skip_debug_init:
wdenk0442ed82002-11-03 10:24:00 +0000253
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200254#if defined (CONFIG_440SPE)
255 /*----------------------------------------------------------------+
256 | Initialize Core Configuration Reg1.
257 | a. ICDPEI: Record even parity. Normal operation.
258 | b. ICTPEI: Record even parity. Normal operation.
259 | c. DCTPEI: Record even parity. Normal operation.
260 | d. DCDPEI: Record even parity. Normal operation.
261 | e. DCUPEI: Record even parity. Normal operation.
262 | f. DCMPEI: Record even parity. Normal operation.
263 | g. FCOM: Normal operation
264 | h. MMUPEI: Record even parity. Normal operation.
265 | i. FFF: Flush only as much data as necessary.
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200266 | j. TCS: Timebase increments from CPU clock.
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200267 +-----------------------------------------------------------------*/
Marian Balakowiczbe9463b2006-07-06 21:17:24 +0200268 li r0,0
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200269 mtspr ccr1, r0
270
271 /*----------------------------------------------------------------+
272 | Reset the timebase.
273 | The previous write to CCR1 sets the timebase source.
274 +-----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200275 mtspr tbl, r0
276 mtspr tbu, r0
277#endif
278
wdenk0442ed82002-11-03 10:24:00 +0000279 /*----------------------------------------------------------------*/
280 /* Setup interrupt vectors */
281 /*----------------------------------------------------------------*/
282 mtspr ivpr,r0 /* Vectors start at 0x0000_0000 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200283 li r1,0x0100
wdenk0442ed82002-11-03 10:24:00 +0000284 mtspr ivor0,r1 /* Critical input */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200285 li r1,0x0200
wdenk0442ed82002-11-03 10:24:00 +0000286 mtspr ivor1,r1 /* Machine check */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200287 li r1,0x0300
wdenk0442ed82002-11-03 10:24:00 +0000288 mtspr ivor2,r1 /* Data storage */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200289 li r1,0x0400
wdenk0442ed82002-11-03 10:24:00 +0000290 mtspr ivor3,r1 /* Instruction storage */
291 li r1,0x0500
292 mtspr ivor4,r1 /* External interrupt */
293 li r1,0x0600
294 mtspr ivor5,r1 /* Alignment */
295 li r1,0x0700
296 mtspr ivor6,r1 /* Program check */
297 li r1,0x0800
298 mtspr ivor7,r1 /* Floating point unavailable */
299 li r1,0x0c00
300 mtspr ivor8,r1 /* System call */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200301 li r1,0x0a00
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200302 mtspr ivor9,r1 /* Auxiliary Processor unavailable */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200303 li r1,0x0900
304 mtspr ivor10,r1 /* Decrementer */
wdenk0442ed82002-11-03 10:24:00 +0000305 li r1,0x1300
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200306 mtspr ivor13,r1 /* Data TLB error */
307 li r1,0x1400
wdenk0442ed82002-11-03 10:24:00 +0000308 mtspr ivor14,r1 /* Instr TLB error */
309 li r1,0x2000
310 mtspr ivor15,r1 /* Debug */
311
312 /*----------------------------------------------------------------*/
313 /* Configure cache regions */
314 /*----------------------------------------------------------------*/
315 mtspr inv0,r0
316 mtspr inv1,r0
317 mtspr inv2,r0
318 mtspr inv3,r0
319 mtspr dnv0,r0
320 mtspr dnv1,r0
321 mtspr dnv2,r0
322 mtspr dnv3,r0
323 mtspr itv0,r0
324 mtspr itv1,r0
325 mtspr itv2,r0
326 mtspr itv3,r0
327 mtspr dtv0,r0
328 mtspr dtv1,r0
329 mtspr dtv2,r0
330 mtspr dtv3,r0
331
332 /*----------------------------------------------------------------*/
333 /* Cache victim limits */
334 /*----------------------------------------------------------------*/
335 /* floors 0, ceiling max to use the entire cache -- nothing locked
336 */
337 lis r1,0x0001
338 ori r1,r1,0xf800
339 mtspr ivlim,r1
340 mtspr dvlim,r1
341
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200342 /*----------------------------------------------------------------+
343 |Initialize MMUCR[STID] = 0.
344 +-----------------------------------------------------------------*/
345 mfspr r0,mmucr
346 addis r1,0,0xFFFF
347 ori r1,r1,0xFF00
348 and r0,r0,r1
349 mtspr mmucr,r0
350
wdenk0442ed82002-11-03 10:24:00 +0000351 /*----------------------------------------------------------------*/
352 /* Clear all TLB entries -- TID = 0, TS = 0 */
353 /*----------------------------------------------------------------*/
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200354 addis r0,0,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000355 li r1,0x003f /* 64 TLB entries */
356 mtctr r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200357rsttlb: tlbwe r0,r1,0x0000 /* Invalidate all entries (V=0)*/
358 tlbwe r0,r1,0x0001
359 tlbwe r0,r1,0x0002
wdenk0442ed82002-11-03 10:24:00 +0000360 subi r1,r1,0x0001
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200361 bdnz rsttlb
wdenk0442ed82002-11-03 10:24:00 +0000362
363 /*----------------------------------------------------------------*/
364 /* TLB entry setup -- step thru tlbtab */
365 /*----------------------------------------------------------------*/
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200366#if defined(CONFIG_440SPE)
367 /*----------------------------------------------------------------*/
368 /* We have different TLB tables for revA and rev B of 440SPe */
369 /*----------------------------------------------------------------*/
370 mfspr r1, PVR
371 lis r0,0x5342
372 ori r0,r0,0x1891
373 cmpw r7,r1,r0
374 bne r7,..revA
375 bl tlbtabB
376 b ..goon
377..revA:
378 bl tlbtabA
379..goon:
380#else
wdenk0442ed82002-11-03 10:24:00 +0000381 bl tlbtab /* Get tlbtab pointer */
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200382#endif
wdenk0442ed82002-11-03 10:24:00 +0000383 mr r5,r0
384 li r1,0x003f /* 64 TLB entries max */
385 mtctr r1
386 li r4,0 /* TLB # */
387
388 addi r5,r5,-4
3891: lwzu r0,4(r5)
390 cmpwi r0,0
391 beq 2f /* 0 marks end */
392 lwzu r1,4(r5)
393 lwzu r2,4(r5)
394 tlbwe r0,r4,0 /* TLB Word 0 */
395 tlbwe r1,r4,1 /* TLB Word 1 */
396 tlbwe r2,r4,2 /* TLB Word 2 */
397 addi r4,r4,1 /* Next TLB */
398 bdnz 1b
399
400 /*----------------------------------------------------------------*/
401 /* Continue from 'normal' start */
402 /*----------------------------------------------------------------*/
Stefan Roese42fbddd2006-09-07 11:51:23 +02004032:
404
405#if defined(CONFIG_NAND_SPL)
Stefan Roese42743512007-06-01 15:27:11 +0200406#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200407 /*
Stefan Roese42743512007-06-01 15:27:11 +0200408 * Enable internal SRAM (only on 440EPx/GRx, 440EP/GR have no OCM)
Stefan Roese42fbddd2006-09-07 11:51:23 +0200409 */
410 lis r2,0x7fff
411 ori r2,r2,0xffff
412 mfdcr r1,isram0_dpc
413 and r1,r1,r2 /* Disable parity check */
414 mtdcr isram0_dpc,r1
415 mfdcr r1,isram0_pmeg
416 and r1,r1,r2 /* Disable pwr mgmt */
417 mtdcr isram0_pmeg,r1
Stefan Roese42743512007-06-01 15:27:11 +0200418#endif
419#if defined(CONFIG_440EP)
420 /*
421 * On 440EP with no internal SRAM, we setup SDRAM very early
422 * and copy the NAND_SPL to SDRAM and jump to it
423 */
424 /* Clear Dcache to use as RAM */
425 addis r3,r0,CFG_INIT_RAM_ADDR@h
426 ori r3,r3,CFG_INIT_RAM_ADDR@l
427 addis r4,r0,CFG_INIT_RAM_END@h
428 ori r4,r4,CFG_INIT_RAM_END@l
429 rlwinm. r5,r4,0,27,31
430 rlwinm r5,r4,27,5,31
431 beq ..d_ran3
432 addi r5,r5,0x0001
433..d_ran3:
434 mtctr r5
435..d_ag3:
436 dcbz r0,r3
437 addi r3,r3,32
438 bdnz ..d_ag3
439 /*----------------------------------------------------------------*/
440 /* Setup the stack in internal SRAM */
441 /*----------------------------------------------------------------*/
442 lis r1,CFG_INIT_RAM_ADDR@h
443 ori r1,r1,CFG_INIT_SP_OFFSET@l
444 li r0,0
445 stwu r0,-4(r1)
446 stwu r0,-4(r1) /* Terminate call chain */
447
448 stwu r1,-8(r1) /* Save back chain and move SP */
449 lis r0,RESET_VECTOR@h /* Address of reset vector */
450 ori r0,r0, RESET_VECTOR@l
451 stwu r1,-8(r1) /* Save back chain and move SP */
452 stw r0,+12(r1) /* Save return addr (underflow vect) */
453 sync
454 bl early_sdram_init
455 sync
456#endif /* CONFIG_440EP */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200457
458 /*
459 * Copy SPL from cache into internal SRAM
460 */
461 li r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
462 mtctr r4
463 lis r2,CFG_NAND_BOOT_SPL_SRC@h
464 ori r2,r2,CFG_NAND_BOOT_SPL_SRC@l
465 lis r3,CFG_NAND_BOOT_SPL_DST@h
466 ori r3,r3,CFG_NAND_BOOT_SPL_DST@l
467spl_loop:
468 lwzu r4,4(r2)
469 stwu r4,4(r3)
470 bdnz spl_loop
471
472 /*
473 * Jump to code in RAM
474 */
475 bl 00f
47600: mflr r10
477 lis r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
478 ori r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
479 sub r10,r10,r3
480 addi r10,r10,28
481 mtlr r10
482 blr
483
484start_ram:
485 sync
486 isync
Stefan Roese42743512007-06-01 15:27:11 +0200487#endif /* CONFIG_NAND_SPL */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200488
489 bl 3f
wdenk0442ed82002-11-03 10:24:00 +0000490 b _start
491
4923: li r0,0
493 mtspr srr1,r0 /* Keep things disabled for now */
494 mflr r1
495 mtspr srr0,r1
496 rfi
stroese434979e2003-05-23 11:18:02 +0000497#endif /* CONFIG_440 */
wdenk0442ed82002-11-03 10:24:00 +0000498
499/*
500 * r3 - 1st arg to board_init(): IMMP pointer
501 * r4 - 2nd arg to board_init(): boot flag
502 */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200503#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +0000504 .text
505 .long 0x27051956 /* U-Boot Magic Number */
506 .globl version_string
507version_string:
508 .ascii U_BOOT_VERSION
509 .ascii " (", __DATE__, " - ", __TIME__, ")"
510 .ascii CONFIG_IDENT_STRING, "\0"
511
wdenk0442ed82002-11-03 10:24:00 +0000512 . = EXC_OFF_SYS_RESET
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200513 .globl _start_of_vectors
514_start_of_vectors:
515
516/* Critical input. */
517 CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
518
519#ifdef CONFIG_440
520/* Machine check */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200521 MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200522#else
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200523 CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200524#endif /* CONFIG_440 */
525
526/* Data Storage exception. */
527 STD_EXCEPTION(0x300, DataStorage, UnknownException)
528
529/* Instruction Storage exception. */
530 STD_EXCEPTION(0x400, InstStorage, UnknownException)
531
532/* External Interrupt exception. */
533 STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
534
535/* Alignment exception. */
536 . = 0x600
537Alignment:
538 EXCEPTION_PROLOG(SRR0, SRR1)
539 mfspr r4,DAR
540 stw r4,_DAR(r21)
541 mfspr r5,DSISR
542 stw r5,_DSISR(r21)
543 addi r3,r1,STACK_FRAME_OVERHEAD
544 li r20,MSR_KERNEL
545 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
546 lwz r6,GOT(transfer_to_handler)
547 mtlr r6
548 blrl
549.L_Alignment:
550 .long AlignmentException - _start + _START_OFFSET
551 .long int_return - _start + _START_OFFSET
552
553/* Program check exception */
554 . = 0x700
555ProgramCheck:
556 EXCEPTION_PROLOG(SRR0, SRR1)
557 addi r3,r1,STACK_FRAME_OVERHEAD
558 li r20,MSR_KERNEL
559 rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
560 lwz r6,GOT(transfer_to_handler)
561 mtlr r6
562 blrl
563.L_ProgramCheck:
564 .long ProgramCheckException - _start + _START_OFFSET
565 .long int_return - _start + _START_OFFSET
566
567#ifdef CONFIG_440
568 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
569 STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
570 STD_EXCEPTION(0xa00, APU, UnknownException)
Stefan Roese80d99a42007-06-19 16:42:31 +0200571#endif
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +0200572 STD_EXCEPTION(0xc00, SystemCall, UnknownException)
573
574#ifdef CONFIG_440
575 STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
576 STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
577#else
578 STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
579 STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
580 STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
581#endif
582 CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
583
584 .globl _end_of_vectors
585_end_of_vectors:
586 . = _START_OFFSET
Stefan Roese42fbddd2006-09-07 11:51:23 +0200587#endif
wdenk0442ed82002-11-03 10:24:00 +0000588 .globl _start
589_start:
590
591/*****************************************************************************/
592#if defined(CONFIG_440)
593
594 /*----------------------------------------------------------------*/
595 /* Clear and set up some registers. */
596 /*----------------------------------------------------------------*/
597 li r0,0x0000
598 lis r1,0xffff
599 mtspr dec,r0 /* prevent dec exceptions */
600 mtspr tbl,r0 /* prevent fit & wdt exceptions */
601 mtspr tbu,r0
602 mtspr tsr,r1 /* clear all timer exception status */
603 mtspr tcr,r0 /* disable all */
604 mtspr esr,r0 /* clear exception syndrome register */
605 mtxer r0 /* clear integer exception register */
wdenk0442ed82002-11-03 10:24:00 +0000606
607 /*----------------------------------------------------------------*/
608 /* Debug setup -- some (not very good) ice's need an event*/
609 /* to establish control :-( Define CFG_INIT_DBCR to the dbsr */
610 /* value you need in this case 0x8cff 0000 should do the trick */
611 /*----------------------------------------------------------------*/
612#if defined(CFG_INIT_DBCR)
613 lis r1,0xffff
614 ori r1,r1,0xffff
615 mtspr dbsr,r1 /* Clear all status bits */
616 lis r0,CFG_INIT_DBCR@h
617 ori r0,r0,CFG_INIT_DBCR@l
618 mtspr dbcr0,r0
619 isync
620#endif
621
622 /*----------------------------------------------------------------*/
623 /* Setup the internal SRAM */
624 /*----------------------------------------------------------------*/
625 li r0,0
Stefan Roese42fbddd2006-09-07 11:51:23 +0200626
627#ifdef CFG_INIT_RAM_DCACHE
Stefan Roese326c9712005-08-01 16:41:48 +0200628 /* Clear Dcache to use as RAM */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200629 addis r3,r0,CFG_INIT_RAM_ADDR@h
630 ori r3,r3,CFG_INIT_RAM_ADDR@l
631 addis r4,r0,CFG_INIT_RAM_END@h
632 ori r4,r4,CFG_INIT_RAM_END@l
Stefan Roese326c9712005-08-01 16:41:48 +0200633 rlwinm. r5,r4,0,27,31
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200634 rlwinm r5,r4,27,5,31
635 beq ..d_ran
636 addi r5,r5,0x0001
Stefan Roese326c9712005-08-01 16:41:48 +0200637..d_ran:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200638 mtctr r5
Stefan Roese326c9712005-08-01 16:41:48 +0200639..d_ag:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200640 dcbz r0,r3
641 addi r3,r3,32
642 bdnz ..d_ag
Stefan Roesea86bde32008-01-09 10:23:16 +0100643
644 /*
645 * Lock the init-ram/stack in d-cache, so that other regions
646 * may use d-cache as well
647 * Note, that this current implementation locks exactly 4k
648 * of d-cache, so please make sure that you don't define a
649 * bigger init-ram area. Take a look at the lwmon5 440EPx
650 * implementation as a reference.
651 */
652 msync
653 isync
654 /* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
655 lis r1,0x0201
656 ori r1,r1,0xf808
657 mtspr dvlim,r1
658 lis r1,0x0808
659 ori r1,r1,0x0808
660 mtspr dnv0,r1
661 mtspr dnv1,r1
662 mtspr dnv2,r1
663 mtspr dnv3,r1
664 mtspr dtv0,r1
665 mtspr dtv1,r1
666 mtspr dtv2,r1
667 mtspr dtv3,r1
668 msync
669 isync
Stefan Roese42fbddd2006-09-07 11:51:23 +0200670#endif /* CFG_INIT_RAM_DCACHE */
671
672 /* 440EP & 440GR are only 440er PPC's without internal SRAM */
673#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
674 /* not all PPC's have internal SRAM usable as L2-cache */
675#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200676 mtdcr l2_cache_cfg,r0 /* Ensure L2 Cache is off */
wdenk544e9732004-02-06 23:19:44 +0000677#endif
wdenk0442ed82002-11-03 10:24:00 +0000678
Stefan Roese42fbddd2006-09-07 11:51:23 +0200679 lis r2,0x7fff
wdenk0442ed82002-11-03 10:24:00 +0000680 ori r2,r2,0xffff
681 mfdcr r1,isram0_dpc
682 and r1,r1,r2 /* Disable parity check */
683 mtdcr isram0_dpc,r1
684 mfdcr r1,isram0_pmeg
Stefan Roese42fbddd2006-09-07 11:51:23 +0200685 and r1,r1,r2 /* Disable pwr mgmt */
wdenk0442ed82002-11-03 10:24:00 +0000686 mtdcr isram0_pmeg,r1
687
688 lis r1,0x8000 /* BAS = 8000_0000 */
Stefan Roese99644742005-11-29 18:18:21 +0100689#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
wdenk544e9732004-02-06 23:19:44 +0000690 ori r1,r1,0x0980 /* first 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200691 mtdcr isram0_sb0cr,r1
wdenk544e9732004-02-06 23:19:44 +0000692 lis r1,0x8001
693 ori r1,r1,0x0980 /* second 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200694 mtdcr isram0_sb1cr,r1
wdenk544e9732004-02-06 23:19:44 +0000695 lis r1, 0x8002
696 ori r1,r1, 0x0980 /* third 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200697 mtdcr isram0_sb2cr,r1
wdenk544e9732004-02-06 23:19:44 +0000698 lis r1, 0x8003
699 ori r1,r1, 0x0980 /* fourth 64k */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200700 mtdcr isram0_sb3cr,r1
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200701#elif defined(CONFIG_440SPE)
702 lis r1,0x0000 /* BAS = 0000_0000 */
703 ori r1,r1,0x0984 /* first 64k */
704 mtdcr isram0_sb0cr,r1
705 lis r1,0x0001
706 ori r1,r1,0x0984 /* second 64k */
707 mtdcr isram0_sb1cr,r1
708 lis r1, 0x0002
709 ori r1,r1, 0x0984 /* third 64k */
710 mtdcr isram0_sb2cr,r1
711 lis r1, 0x0003
712 ori r1,r1, 0x0984 /* fourth 64k */
713 mtdcr isram0_sb3cr,r1
Stefan Roese42fbddd2006-09-07 11:51:23 +0200714#elif defined(CONFIG_440GP)
wdenk0442ed82002-11-03 10:24:00 +0000715 ori r1,r1,0x0380 /* 8k rw */
716 mtdcr isram0_sb0cr,r1
Stefan Roese42fbddd2006-09-07 11:51:23 +0200717 mtdcr isram0_sb1cr,r0 /* Disable bank 1 */
Stefan Roese326c9712005-08-01 16:41:48 +0200718#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200719#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
wdenk0442ed82002-11-03 10:24:00 +0000720
721 /*----------------------------------------------------------------*/
722 /* Setup the stack in internal SRAM */
723 /*----------------------------------------------------------------*/
724 lis r1,CFG_INIT_RAM_ADDR@h
725 ori r1,r1,CFG_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +0000726 li r0,0
727 stwu r0,-4(r1)
728 stwu r0,-4(r1) /* Terminate call chain */
729
730 stwu r1,-8(r1) /* Save back chain and move SP */
731 lis r0,RESET_VECTOR@h /* Address of reset vector */
732 ori r0,r0, RESET_VECTOR@l
733 stwu r1,-8(r1) /* Save back chain and move SP */
734 stw r0,+12(r1) /* Save return addr (underflow vect) */
735
Stefan Roese42fbddd2006-09-07 11:51:23 +0200736#ifdef CONFIG_NAND_SPL
737 bl nand_boot /* will not return */
738#else
wdenk0442ed82002-11-03 10:24:00 +0000739 GET_GOT
Stefan Roesec443fe92005-11-22 13:20:42 +0100740
741 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +0000742 bl board_init_f
Stefan Roese42fbddd2006-09-07 11:51:23 +0200743#endif
wdenk0442ed82002-11-03 10:24:00 +0000744
745#endif /* CONFIG_440 */
746
747/*****************************************************************************/
748#ifdef CONFIG_IOP480
749 /*----------------------------------------------------------------------- */
750 /* Set up some machine state registers. */
751 /*----------------------------------------------------------------------- */
752 addi r0,r0,0x0000 /* initialize r0 to zero */
753 mtspr esr,r0 /* clear Exception Syndrome Reg */
754 mttcr r0 /* timer control register */
755 mtexier r0 /* disable all interrupts */
wdenk0442ed82002-11-03 10:24:00 +0000756 addis r4,r0,0xFFFF /* set r4 to 0xFFFFFFFF (status in the */
757 ori r4,r4,0xFFFF /* dbsr is cleared by setting bits to 1) */
758 mtdbsr r4 /* clear/reset the dbsr */
759 mtexisr r4 /* clear all pending interrupts */
760 addis r4,r0,0x8000
761 mtexier r4 /* enable critical exceptions */
762 addis r4,r0,0x0000 /* assume 403GCX - enable core clk */
763 ori r4,r4,0x4020 /* dbling (no harm done on GA and GC */
764 mtiocr r4 /* since bit not used) & DRC to latch */
765 /* data bus on rising edge of CAS */
766 /*----------------------------------------------------------------------- */
767 /* Clear XER. */
768 /*----------------------------------------------------------------------- */
769 mtxer r0
770 /*----------------------------------------------------------------------- */
771 /* Invalidate i-cache and d-cache TAG arrays. */
772 /*----------------------------------------------------------------------- */
773 addi r3,0,1024 /* 1/4 of I-cache size, half of D-cache */
774 addi r4,0,1024 /* 1/4 of I-cache */
775..cloop:
776 iccci 0,r3
777 iccci r4,r3
778 dccci 0,r3
779 addic. r3,r3,-16 /* move back one cache line */
780 bne ..cloop /* loop back to do rest until r3 = 0 */
781
782 /* */
783 /* initialize IOP480 so it can read 1 MB code area for SRAM spaces */
784 /* this requires enabling MA[17..0], by default only MA[12..0] are enabled. */
785 /* */
786
787 /* first copy IOP480 register base address into r3 */
788 addis r3,0,0x5000 /* IOP480 register base address hi */
789/* ori r3,r3,0x0000 / IOP480 register base address lo */
790
791#ifdef CONFIG_ADCIOP
792 /* use r4 as the working variable */
793 /* turn on CS3 (LOCCTL.7) */
794 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
795 andi. r4,r4,0xff7f /* make bit 7 = 0 -- CS3 mode */
796 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
797#endif
798
799#ifdef CONFIG_DASA_SIM
800 /* use r4 as the working variable */
801 /* turn on MA17 (LOCCTL.7) */
802 lwz r4,0x84(r3) /* LOCTL is at offset 0x84 */
803 ori r4,r4,0x80 /* make bit 7 = 1 -- MA17 mode */
804 stw r4,0x84(r3) /* LOCTL is at offset 0x84 */
805#endif
806
807 /* turn on MA16..13 (LCS0BRD.12 = 0) */
808 lwz r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
809 andi. r4,r4,0xefff /* make bit 12 = 0 */
810 stw r4,0x100(r3) /* LCS0BRD is at offset 0x100 */
811
812 /* make sure above stores all comlete before going on */
813 sync
814
815 /* last thing, set local init status done bit (DEVINIT.31) */
816 lwz r4,0x80(r3) /* DEVINIT is at offset 0x80 */
817 oris r4,r4,0x8000 /* make bit 31 = 1 */
818 stw r4,0x80(r3) /* DEVINIT is at offset 0x80 */
819
820 /* clear all pending interrupts and disable all interrupts */
821 li r4,-1 /* set p1 to 0xffffffff */
822 stw r4,0x1b0(r3) /* clear all pending interrupts */
823 stw r4,0x1b8(r3) /* clear all pending interrupts */
824 li r4,0 /* set r4 to 0 */
825 stw r4,0x1b4(r3) /* disable all interrupts */
826 stw r4,0x1bc(r3) /* disable all interrupts */
827
828 /* make sure above stores all comlete before going on */
829 sync
830
831 /*----------------------------------------------------------------------- */
832 /* Enable two 128MB cachable regions. */
833 /*----------------------------------------------------------------------- */
Stefan Roese153b3e22007-10-05 17:10:59 +0200834 addis r1,r0,0xc000
wdenk0442ed82002-11-03 10:24:00 +0000835 addi r1,r1,0x0001
836 mticcr r1 /* instruction cache */
837
838 addis r1,r0,0x0000
839 addi r1,r1,0x0000
840 mtdccr r1 /* data cache */
841
842 addis r1,r0,CFG_INIT_RAM_ADDR@h
843 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack to SDRAM */
844 li r0, 0 /* Make room for stack frame header and */
845 stwu r0, -4(r1) /* clear final stack frame so that */
846 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
847
848 GET_GOT /* initialize GOT access */
849
850 bl board_init_f /* run first part of init code (from Flash) */
851
852#endif /* CONFIG_IOP480 */
853
854/*****************************************************************************/
Stefan Roese17ffbc82007-03-21 13:38:59 +0100855#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
856 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
Stefan Roese153b3e22007-10-05 17:10:59 +0200857 defined(CONFIG_405EX) || defined(CONFIG_405)
wdenk0442ed82002-11-03 10:24:00 +0000858 /*----------------------------------------------------------------------- */
859 /* Clear and set up some registers. */
860 /*----------------------------------------------------------------------- */
861 addi r4,r0,0x0000
Stefan Roese153b3e22007-10-05 17:10:59 +0200862#if !defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000863 mtspr sgr,r4
Stefan Roese153b3e22007-10-05 17:10:59 +0200864#else
865 /*
866 * On 405EX, completely clearing the SGR leads to PPC hangup
867 * upon PCIe configuration access. The PCIe memory regions
868 * need to be guarded!
869 */
870 lis r3,0x0000
871 ori r3,r3,0x7FFC
872 mtspr sgr,r3
873#endif
wdenk0442ed82002-11-03 10:24:00 +0000874 mtspr dcwr,r4
875 mtesr r4 /* clear Exception Syndrome Reg */
876 mttcr r4 /* clear Timer Control Reg */
877 mtxer r4 /* clear Fixed-Point Exception Reg */
878 mtevpr r4 /* clear Exception Vector Prefix Reg */
wdenk0442ed82002-11-03 10:24:00 +0000879 addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
880 /* dbsr is cleared by setting bits to 1) */
881 mtdbsr r4 /* clear/reset the dbsr */
882
883 /*----------------------------------------------------------------------- */
884 /* Invalidate I and D caches. Enable I cache for defined memory regions */
885 /* to speed things up. Leave the D cache disabled for now. It will be */
886 /* enabled/left disabled later based on user selected menu options. */
887 /* Be aware that the I cache may be disabled later based on the menu */
888 /* options as well. See miscLib/main.c. */
889 /*----------------------------------------------------------------------- */
890 bl invalidate_icache
891 bl invalidate_dcache
892
893 /*----------------------------------------------------------------------- */
894 /* Enable two 128MB cachable regions. */
895 /*----------------------------------------------------------------------- */
Stefan Roese153b3e22007-10-05 17:10:59 +0200896 lis r4,0xc000
Stefan Roese17ffbc82007-03-21 13:38:59 +0100897 ori r4,r4,0x0001
wdenk0442ed82002-11-03 10:24:00 +0000898 mticcr r4 /* instruction cache */
899 isync
900
Stefan Roese17ffbc82007-03-21 13:38:59 +0100901 lis r4,0x0000
902 ori r4,r4,0x0000
wdenk0442ed82002-11-03 10:24:00 +0000903 mtdccr r4 /* data cache */
904
Stefan Roese153b3e22007-10-05 17:10:59 +0200905#if !(defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR)) || defined(CONFIG_405EX)
wdenk0442ed82002-11-03 10:24:00 +0000906 /*----------------------------------------------------------------------- */
907 /* Tune the speed and size for flash CS0 */
908 /*----------------------------------------------------------------------- */
909 bl ext_bus_cntlr_init
910#endif
Stefan Roese153b3e22007-10-05 17:10:59 +0200911#if !(defined(CFG_INIT_DCACHE_CS) || defined(CFG_TEMP_STACK_OCM))
912 /*
913 * Boards like the Kilauea (405EX) don't have OCM and can't use
914 * DCache for init-ram. So setup stack here directly after the
915 * SDRAM is initialized.
916 */
917 lis r1, CFG_INIT_RAM_ADDR@h
918 ori r1,r1,CFG_INIT_SP_OFFSET /* set up the stack in SDRAM */
919
920 li r0, 0 /* Make room for stack frame header and */
921 stwu r0, -4(r1) /* clear final stack frame so that */
922 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
923 /*
924 * Set up a dummy frame to store reset vector as return address.
925 * this causes stack underflow to reset board.
926 */
927 stwu r1, -8(r1) /* Save back chain and move SP */
928 lis r0, RESET_VECTOR@h /* Address of reset vector */
929 ori r0, r0, RESET_VECTOR@l
930 stwu r1, -8(r1) /* Save back chain and move SP */
931 stw r0, +12(r1) /* Save return addr (underflow vect) */
932#endif /* !(CFG_INIT_DCACHE_CS || !CFG_TEM_STACK_OCM) */
wdenk0442ed82002-11-03 10:24:00 +0000933
stroese434979e2003-05-23 11:18:02 +0000934#if defined(CONFIG_405EP)
935 /*----------------------------------------------------------------------- */
936 /* DMA Status, clear to come up clean */
937 /*----------------------------------------------------------------------- */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200938 addis r3,r0, 0xFFFF /* Clear all existing DMA status */
939 ori r3,r3, 0xFFFF
940 mtdcr dmasr, r3
stroese434979e2003-05-23 11:18:02 +0000941
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200942 bl ppc405ep_init /* do ppc405ep specific init */
stroese434979e2003-05-23 11:18:02 +0000943#endif /* CONFIG_405EP */
944
wdenk0442ed82002-11-03 10:24:00 +0000945#if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)
Stefan Roese17ffbc82007-03-21 13:38:59 +0100946#if defined(CONFIG_405EZ)
947 /********************************************************************
948 * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
949 *******************************************************************/
950 /*
951 * We can map the OCM on the PLB3, so map it at
952 * CFG_OCM_DATA_ADDR + 0x8000
953 */
954 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
955 ori r3,r3,CFG_OCM_DATA_ADDR@l
Stefan Roese80d99a42007-06-19 16:42:31 +0200956 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100957 mtdcr ocmplb3cr1,r3 /* Set PLB Access */
958 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
959 mtdcr ocmplb3cr2,r3 /* Set PLB Access */
960 isync
961
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200962 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100963 ori r3,r3,CFG_OCM_DATA_ADDR@l
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200964 ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
965 mtdcr ocmdscr1, r3 /* Set Data Side */
966 mtdcr ocmiscr1, r3 /* Set Instruction Side */
Stefan Roese17ffbc82007-03-21 13:38:59 +0100967 ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200968 mtdcr ocmdscr2, r3 /* Set Data Side */
969 mtdcr ocmiscr2, r3 /* Set Instruction Side */
970 addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
Stefan Roesed85f5d72007-05-24 09:49:00 +0200971 mtdcr ocmdsisdpc,r3
Stefan Roese17ffbc82007-03-21 13:38:59 +0100972
973 isync
Stefan Roesef6c7b762007-03-24 15:45:34 +0100974#else /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000975 /********************************************************************
976 * Setup OCM - On Chip Memory
977 *******************************************************************/
978 /* Setup OCM */
wdenk57b2d802003-06-27 21:31:46 +0000979 lis r0, 0x7FFF
980 ori r0, r0, 0xFFFF
Wolfgang Denk8dd4d332005-08-06 01:42:58 +0200981 mfdcr r3, ocmiscntl /* get instr-side IRAM config */
Stefan Roesef6c7b762007-03-24 15:45:34 +0100982 mfdcr r4, ocmdscntl /* get data-side IRAM config */
983 and r3, r3, r0 /* disable data-side IRAM */
984 and r4, r4, r0 /* disable data-side IRAM */
985 mtdcr ocmiscntl, r3 /* set instr-side IRAM config */
986 mtdcr ocmdscntl, r4 /* set data-side IRAM config */
wdenk57b2d802003-06-27 21:31:46 +0000987 isync
wdenk0442ed82002-11-03 10:24:00 +0000988
Wolfgang Denk09675ef2007-06-20 18:14:24 +0200989 lis r3,CFG_OCM_DATA_ADDR@h /* OCM location */
Stefan Roesef6c7b762007-03-24 15:45:34 +0100990 ori r3,r3,CFG_OCM_DATA_ADDR@l
wdenk0442ed82002-11-03 10:24:00 +0000991 mtdcr ocmdsarc, r3
992 addis r4, 0, 0xC000 /* OCM data area enabled */
993 mtdcr ocmdscntl, r4
wdenk57b2d802003-06-27 21:31:46 +0000994 isync
Stefan Roese17ffbc82007-03-21 13:38:59 +0100995#endif /* CONFIG_405EZ */
wdenk0442ed82002-11-03 10:24:00 +0000996#endif
997
Stefan Roese23d8d342007-06-06 11:42:13 +0200998#ifdef CONFIG_NAND_SPL
999 /*
1000 * Copy SPL from cache into internal SRAM
1001 */
1002 li r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
1003 mtctr r4
1004 lis r2,CFG_NAND_BOOT_SPL_SRC@h
1005 ori r2,r2,CFG_NAND_BOOT_SPL_SRC@l
1006 lis r3,CFG_NAND_BOOT_SPL_DST@h
1007 ori r3,r3,CFG_NAND_BOOT_SPL_DST@l
1008spl_loop:
1009 lwzu r4,4(r2)
1010 stwu r4,4(r3)
1011 bdnz spl_loop
1012
1013 /*
1014 * Jump to code in RAM
1015 */
1016 bl 00f
101700: mflr r10
1018 lis r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
1019 ori r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
1020 sub r10,r10,r3
1021 addi r10,r10,28
1022 mtlr r10
1023 blr
1024
1025start_ram:
1026 sync
1027 isync
1028#endif /* CONFIG_NAND_SPL */
1029
wdenk0442ed82002-11-03 10:24:00 +00001030 /*----------------------------------------------------------------------- */
1031 /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
1032 /*----------------------------------------------------------------------- */
1033#ifdef CFG_INIT_DCACHE_CS
1034 /*----------------------------------------------------------------------- */
1035 /* Memory Bank x (nothingness) initialization 1GB+64MEG */
1036 /* used as temporary stack pointer for stage0 */
1037 /*----------------------------------------------------------------------- */
1038 li r4,PBxAP
1039 mtdcr ebccfga,r4
1040 lis r4,0x0380
1041 ori r4,r4,0x0480
1042 mtdcr ebccfgd,r4
1043
1044 addi r4,0,PBxCR
1045 mtdcr ebccfga,r4
1046 lis r4,0x400D
1047 ori r4,r4,0xa000
1048 mtdcr ebccfgd,r4
1049
Stefan Roese153b3e22007-10-05 17:10:59 +02001050 /* turn on data cache for this region */
wdenk0442ed82002-11-03 10:24:00 +00001051 lis r4,0x0080
1052 mtdccr r4
1053
1054 /* set stack pointer and clear stack to known value */
1055
1056 lis r1,CFG_INIT_RAM_ADDR@h
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001057 ori r1,r1,CFG_INIT_SP_OFFSET@l
wdenk0442ed82002-11-03 10:24:00 +00001058
1059 li r4,2048 /* we store 2048 words to stack */
1060 mtctr r4
1061
1062 lis r2,CFG_INIT_RAM_ADDR@h /* we also clear data area */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001063 ori r2,r2,CFG_INIT_RAM_END@l /* so cant copy value from r1 */
wdenk0442ed82002-11-03 10:24:00 +00001064
1065 lis r4,0xdead /* we store 0xdeaddead in the stack */
1066 ori r4,r4,0xdead
1067
1068..stackloop:
1069 stwu r4,-4(r2)
1070 bdnz ..stackloop
1071
1072 li r0, 0 /* Make room for stack frame header and */
1073 stwu r0, -4(r1) /* clear final stack frame so that */
1074 stwu r0, -4(r1) /* stack backtraces terminate cleanly */
1075 /*
1076 * Set up a dummy frame to store reset vector as return address.
1077 * this causes stack underflow to reset board.
1078 */
1079 stwu r1, -8(r1) /* Save back chain and move SP */
1080 addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
1081 ori r0, r0, RESET_VECTOR@l
1082 stwu r1, -8(r1) /* Save back chain and move SP */
1083 stw r0, +12(r1) /* Save return addr (underflow vect) */
1084
1085#elif defined(CFG_TEMP_STACK_OCM) && \
1086 (defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE))
1087 /*
1088 * Stack in OCM.
1089 */
1090
1091 /* Set up Stack at top of OCM */
1092 lis r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@h
1093 ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@l
1094
1095 /* Set up a zeroized stack frame so that backtrace works right */
1096 li r0, 0
1097 stwu r0, -4(r1)
1098 stwu r0, -4(r1)
1099
1100 /*
1101 * Set up a dummy frame to store reset vector as return address.
1102 * this causes stack underflow to reset board.
1103 */
1104 stwu r1, -8(r1) /* Save back chain and move SP */
1105 lis r0, RESET_VECTOR@h /* Address of reset vector */
1106 ori r0, r0, RESET_VECTOR@l
1107 stwu r1, -8(r1) /* Save back chain and move SP */
1108 stw r0, +12(r1) /* Save return addr (underflow vect) */
1109#endif /* CFG_INIT_DCACHE_CS */
1110
1111 /*----------------------------------------------------------------------- */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001112 /* Initialize SDRAM Controller */
wdenk0442ed82002-11-03 10:24:00 +00001113 /*----------------------------------------------------------------------- */
1114 bl sdram_init
1115
Stefan Roese23d8d342007-06-06 11:42:13 +02001116#ifdef CONFIG_NAND_SPL
1117 bl nand_boot /* will not return */
1118#else
wdenk0442ed82002-11-03 10:24:00 +00001119 GET_GOT /* initialize GOT access */
1120
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001121 bl cpu_init_f /* run low-level CPU init code (from Flash) */
wdenk0442ed82002-11-03 10:24:00 +00001122
1123 /* NEVER RETURNS! */
1124 bl board_init_f /* run first part of init code (from Flash) */
Stefan Roese23d8d342007-06-06 11:42:13 +02001125#endif /* CONFIG_NAND_SPL */
wdenk0442ed82002-11-03 10:24:00 +00001126
wdenk232fe0b2003-09-02 22:48:03 +00001127#endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
1128 /*----------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001129
1130
Stefan Roese42fbddd2006-09-07 11:51:23 +02001131#ifndef CONFIG_NAND_SPL
wdenk0442ed82002-11-03 10:24:00 +00001132/*
1133 * This code finishes saving the registers to the exception frame
1134 * and jumps to the appropriate handler for the exception.
1135 * Register r21 is pointer into trap frame, r1 has new stack pointer.
1136 */
1137 .globl transfer_to_handler
1138transfer_to_handler:
1139 stw r22,_NIP(r21)
1140 lis r22,MSR_POW@h
1141 andc r23,r23,r22
1142 stw r23,_MSR(r21)
1143 SAVE_GPR(7, r21)
1144 SAVE_4GPRS(8, r21)
1145 SAVE_8GPRS(12, r21)
1146 SAVE_8GPRS(24, r21)
wdenk0442ed82002-11-03 10:24:00 +00001147 mflr r23
1148 andi. r24,r23,0x3f00 /* get vector offset */
1149 stw r24,TRAP(r21)
1150 li r22,0
1151 stw r22,RESULT(r21)
1152 mtspr SPRG2,r22 /* r1 is now kernel sp */
wdenk0442ed82002-11-03 10:24:00 +00001153 lwz r24,0(r23) /* virtual address of handler */
1154 lwz r23,4(r23) /* where to go when done */
1155 mtspr SRR0,r24
1156 mtspr SRR1,r20
1157 mtlr r23
1158 SYNC
1159 rfi /* jump to handler, enable MMU */
1160
1161int_return:
1162 mfmsr r28 /* Disable interrupts */
1163 li r4,0
1164 ori r4,r4,MSR_EE
1165 andc r28,r28,r4
1166 SYNC /* Some chip revs need this... */
1167 mtmsr r28
1168 SYNC
1169 lwz r2,_CTR(r1)
1170 lwz r0,_LINK(r1)
1171 mtctr r2
1172 mtlr r0
1173 lwz r2,_XER(r1)
1174 lwz r0,_CCR(r1)
1175 mtspr XER,r2
1176 mtcrf 0xFF,r0
1177 REST_10GPRS(3, r1)
1178 REST_10GPRS(13, r1)
1179 REST_8GPRS(23, r1)
1180 REST_GPR(31, r1)
1181 lwz r2,_NIP(r1) /* Restore environment */
1182 lwz r0,_MSR(r1)
1183 mtspr SRR0,r2
1184 mtspr SRR1,r0
1185 lwz r0,GPR0(r1)
1186 lwz r2,GPR2(r1)
1187 lwz r1,GPR1(r1)
1188 SYNC
1189 rfi
1190
1191crit_return:
1192 mfmsr r28 /* Disable interrupts */
1193 li r4,0
1194 ori r4,r4,MSR_EE
1195 andc r28,r28,r4
1196 SYNC /* Some chip revs need this... */
1197 mtmsr r28
1198 SYNC
1199 lwz r2,_CTR(r1)
1200 lwz r0,_LINK(r1)
1201 mtctr r2
1202 mtlr r0
1203 lwz r2,_XER(r1)
1204 lwz r0,_CCR(r1)
1205 mtspr XER,r2
1206 mtcrf 0xFF,r0
1207 REST_10GPRS(3, r1)
1208 REST_10GPRS(13, r1)
1209 REST_8GPRS(23, r1)
1210 REST_GPR(31, r1)
1211 lwz r2,_NIP(r1) /* Restore environment */
1212 lwz r0,_MSR(r1)
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001213 mtspr csrr0,r2
1214 mtspr csrr1,r0
wdenk0442ed82002-11-03 10:24:00 +00001215 lwz r0,GPR0(r1)
1216 lwz r2,GPR2(r1)
1217 lwz r1,GPR1(r1)
1218 SYNC
1219 rfci
1220
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001221#ifdef CONFIG_440
1222mck_return:
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001223 mfmsr r28 /* Disable interrupts */
1224 li r4,0
1225 ori r4,r4,MSR_EE
1226 andc r28,r28,r4
1227 SYNC /* Some chip revs need this... */
1228 mtmsr r28
1229 SYNC
1230 lwz r2,_CTR(r1)
1231 lwz r0,_LINK(r1)
1232 mtctr r2
1233 mtlr r0
1234 lwz r2,_XER(r1)
1235 lwz r0,_CCR(r1)
1236 mtspr XER,r2
1237 mtcrf 0xFF,r0
1238 REST_10GPRS(3, r1)
1239 REST_10GPRS(13, r1)
1240 REST_8GPRS(23, r1)
1241 REST_GPR(31, r1)
1242 lwz r2,_NIP(r1) /* Restore environment */
1243 lwz r0,_MSR(r1)
1244 mtspr mcsrr0,r2
1245 mtspr mcsrr1,r0
1246 lwz r0,GPR0(r1)
1247 lwz r2,GPR2(r1)
1248 lwz r1,GPR1(r1)
1249 SYNC
1250 rfmci
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001251#endif /* CONFIG_440 */
1252
1253
wdenk0442ed82002-11-03 10:24:00 +00001254 .globl get_pvr
1255get_pvr:
1256 mfspr r3, PVR
1257 blr
1258
wdenk0442ed82002-11-03 10:24:00 +00001259/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001260/* Function: out16 */
1261/* Description: Output 16 bits */
1262/*------------------------------------------------------------------------------- */
1263 .globl out16
1264out16:
1265 sth r4,0x0000(r3)
1266 blr
1267
1268/*------------------------------------------------------------------------------- */
1269/* Function: out16r */
1270/* Description: Byte reverse and output 16 bits */
1271/*------------------------------------------------------------------------------- */
1272 .globl out16r
1273out16r:
1274 sthbrx r4,r0,r3
1275 blr
1276
1277/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001278/* Function: out32r */
1279/* Description: Byte reverse and output 32 bits */
1280/*------------------------------------------------------------------------------- */
1281 .globl out32r
1282out32r:
1283 stwbrx r4,r0,r3
1284 blr
1285
1286/*------------------------------------------------------------------------------- */
1287/* Function: in16 */
1288/* Description: Input 16 bits */
1289/*------------------------------------------------------------------------------- */
1290 .globl in16
1291in16:
1292 lhz r3,0x0000(r3)
1293 blr
1294
1295/*------------------------------------------------------------------------------- */
1296/* Function: in16r */
1297/* Description: Input 16 bits and byte reverse */
1298/*------------------------------------------------------------------------------- */
1299 .globl in16r
1300in16r:
1301 lhbrx r3,r0,r3
1302 blr
1303
1304/*------------------------------------------------------------------------------- */
wdenk0442ed82002-11-03 10:24:00 +00001305/* Function: in32r */
1306/* Description: Input 32 bits and byte reverse */
1307/*------------------------------------------------------------------------------- */
1308 .globl in32r
1309in32r:
1310 lwbrx r3,r0,r3
1311 blr
1312
wdenk0442ed82002-11-03 10:24:00 +00001313/*
1314 * void relocate_code (addr_sp, gd, addr_moni)
1315 *
1316 * This "function" does not return, instead it continues in RAM
1317 * after relocating the monitor code.
1318 *
1319 * r3 = dest
1320 * r4 = src
1321 * r5 = length in bytes
1322 * r6 = cachelinesize
1323 */
1324 .globl relocate_code
1325relocate_code:
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001326#ifdef CONFIG_4xx_DCACHE
1327 /*
1328 * We need to flush the Init Data before the dcache will be
1329 * invalidated
1330 */
1331
1332 /* save regs */
1333 mr r9,r3
1334 mr r10,r4
1335 mr r11,r5
1336
1337 mr r3,r4
1338 addi r4,r4,0x200 /* should be enough for init data */
1339 bl flush_dcache_range
1340
1341 /* restore regs */
1342 mr r3,r9
1343 mr r4,r10
1344 mr r5,r11
1345#endif
Stefan Roesea86bde32008-01-09 10:23:16 +01001346
1347#ifdef CFG_INIT_RAM_DCACHE
1348 /*
1349 * Unlock the previously locked d-cache
1350 */
1351 msync
1352 isync
1353 /* set TFLOOR/NFLOOR to 0 again */
1354 lis r6,0x0001
1355 ori r6,r6,0xf800
1356 mtspr dvlim,r6
1357 lis r6,0x0000
1358 ori r6,r6,0x0000
1359 mtspr dnv0,r6
1360 mtspr dnv1,r6
1361 mtspr dnv2,r6
1362 mtspr dnv3,r6
1363 mtspr dtv0,r6
1364 mtspr dtv1,r6
1365 mtspr dtv2,r6
1366 mtspr dtv3,r6
1367 msync
1368 isync
1369#endif /* CFG_INIT_RAM_DCACHE */
1370
Stefan Roese42fbddd2006-09-07 11:51:23 +02001371#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
1372 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
Stefan Roese05ac3032007-03-08 10:13:16 +01001373 defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese9eba0c82006-06-02 16:18:04 +02001374 /*
1375 * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1376 * to speed up the boot process. Now this cache needs to be disabled.
1377 */
1378 iccci 0,0 /* Invalidate inst cache */
1379 dccci 0,0 /* Invalidate data cache, now no longer our stack */
Stefan Roese326c9712005-08-01 16:41:48 +02001380 sync
Stefan Roese9eba0c82006-06-02 16:18:04 +02001381 isync
Niklaus Giger86cb27b2007-11-30 18:35:11 +01001382#ifdef CFG_TLB_FOR_BOOT_FLASH
1383 addi r1,r0,CFG_TLB_FOR_BOOT_FLASH /* Use defined TLB */
1384#else
1385 addi r1,r0,0x0000 /* Default TLB entry is #0 */
1386#endif
Stefan Roese326c9712005-08-01 16:41:48 +02001387 tlbre r0,r1,0x0002 /* Read contents */
Stefan Roese99644742005-11-29 18:18:21 +01001388 ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001389 tlbwe r0,r1,0x0002 /* Save it out */
Stefan Roese9eba0c82006-06-02 16:18:04 +02001390 sync
Stefan Roese326c9712005-08-01 16:41:48 +02001391 isync
1392#endif
wdenk0442ed82002-11-03 10:24:00 +00001393 mr r1, r3 /* Set new stack pointer */
1394 mr r9, r4 /* Save copy of Init Data pointer */
1395 mr r10, r5 /* Save copy of Destination Address */
1396
1397 mr r3, r5 /* Destination Address */
1398 lis r4, CFG_MONITOR_BASE@h /* Source Address */
1399 ori r4, r4, CFG_MONITOR_BASE@l
wdenkb9a83a92003-05-30 12:48:29 +00001400 lwz r5, GOT(__init_end)
1401 sub r5, r5, r4
Stefan Roeseeff3a0a2007-10-31 17:55:58 +01001402 li r6, L1_CACHE_BYTES /* Cache Line Size */
wdenk0442ed82002-11-03 10:24:00 +00001403
1404 /*
1405 * Fix GOT pointer:
1406 *
1407 * New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address
1408 *
1409 * Offset:
1410 */
1411 sub r15, r10, r4
1412
1413 /* First our own GOT */
1414 add r14, r14, r15
1415 /* the the one used by the C code */
1416 add r30, r30, r15
1417
1418 /*
1419 * Now relocate code
1420 */
1421
1422 cmplw cr1,r3,r4
1423 addi r0,r5,3
1424 srwi. r0,r0,2
1425 beq cr1,4f /* In place copy is not necessary */
1426 beq 7f /* Protect against 0 count */
1427 mtctr r0
1428 bge cr1,2f
1429
1430 la r8,-4(r4)
1431 la r7,-4(r3)
14321: lwzu r0,4(r8)
1433 stwu r0,4(r7)
1434 bdnz 1b
1435 b 4f
1436
14372: slwi r0,r0,2
1438 add r8,r4,r0
1439 add r7,r3,r0
14403: lwzu r0,-4(r8)
1441 stwu r0,-4(r7)
1442 bdnz 3b
1443
1444/*
1445 * Now flush the cache: note that we must start from a cache aligned
1446 * address. Otherwise we might miss one cache line.
1447 */
14484: cmpwi r6,0
1449 add r5,r3,r5
1450 beq 7f /* Always flush prefetch queue in any case */
1451 subi r0,r6,1
1452 andc r3,r3,r0
1453 mr r4,r3
14545: dcbst 0,r4
1455 add r4,r4,r6
1456 cmplw r4,r5
1457 blt 5b
1458 sync /* Wait for all dcbst to complete on bus */
1459 mr r4,r3
14606: icbi 0,r4
1461 add r4,r4,r6
1462 cmplw r4,r5
1463 blt 6b
14647: sync /* Wait for all icbi to complete on bus */
1465 isync
1466
1467/*
1468 * We are done. Do not return, instead branch to second part of board
1469 * initialization, now running from RAM.
1470 */
1471
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001472 addi r0, r10, in_ram - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001473 mtlr r0
1474 blr /* NEVER RETURNS! */
1475
1476in_ram:
1477
1478 /*
1479 * Relocation Function, r14 point to got2+0x8000
1480 *
1481 * Adjust got2 pointers, no need to check for 0, this code
1482 * already puts a few entries in the table.
1483 */
1484 li r0,__got2_entries@sectoff@l
1485 la r3,GOT(_GOT2_TABLE_)
1486 lwz r11,GOT(_GOT2_TABLE_)
1487 mtctr r0
1488 sub r11,r3,r11
1489 addi r3,r3,-4
14901: lwzu r0,4(r3)
1491 add r0,r0,r11
1492 stw r0,0(r3)
1493 bdnz 1b
1494
1495 /*
1496 * Now adjust the fixups and the pointers to the fixups
1497 * in case we need to move ourselves again.
1498 */
14992: li r0,__fixup_entries@sectoff@l
1500 lwz r3,GOT(_FIXUP_TABLE_)
1501 cmpwi r0,0
1502 mtctr r0
1503 addi r3,r3,-4
1504 beq 4f
15053: lwzu r4,4(r3)
1506 lwzux r0,r4,r11
1507 add r0,r0,r11
1508 stw r10,0(r3)
1509 stw r0,0(r4)
1510 bdnz 3b
15114:
1512clear_bss:
1513 /*
1514 * Now clear BSS segment
1515 */
wdenkbf2f8c92003-05-22 22:52:13 +00001516 lwz r3,GOT(__bss_start)
wdenk0442ed82002-11-03 10:24:00 +00001517 lwz r4,GOT(_end)
1518
1519 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001520 beq 7f
wdenk0442ed82002-11-03 10:24:00 +00001521
1522 li r0, 0
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001523
1524 andi. r5, r4, 3
1525 beq 6f
1526 sub r4, r4, r5
1527 mtctr r5
1528 mr r5, r4
15295: stb r0, 0(r5)
1530 addi r5, r5, 1
1531 bdnz 5b
15326:
wdenk0442ed82002-11-03 10:24:00 +00001533 stw r0, 0(r3)
1534 addi r3, r3, 4
1535 cmplw 0, r3, r4
Anatolij Gustschin720025b2007-12-05 17:43:20 +01001536 bne 6b
wdenk0442ed82002-11-03 10:24:00 +00001537
Anatolij Gustschin720025b2007-12-05 17:43:20 +010015387:
wdenk0442ed82002-11-03 10:24:00 +00001539 mr r3, r9 /* Init Data pointer */
1540 mr r4, r10 /* Destination Address */
1541 bl board_init_r
1542
wdenk0442ed82002-11-03 10:24:00 +00001543 /*
1544 * Copy exception vector code to low memory
1545 *
1546 * r3: dest_addr
1547 * r7: source address, r8: end address, r9: target address
1548 */
1549 .globl trap_init
1550trap_init:
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001551 lwz r7, GOT(_start_of_vectors)
wdenk0442ed82002-11-03 10:24:00 +00001552 lwz r8, GOT(_end_of_vectors)
1553
wdenk4e112c12003-06-03 23:54:09 +00001554 li r9, 0x100 /* reset vector always at 0x100 */
wdenk0442ed82002-11-03 10:24:00 +00001555
1556 cmplw 0, r7, r8
1557 bgelr /* return if r7>=r8 - just in case */
1558
1559 mflr r4 /* save link register */
15601:
1561 lwz r0, 0(r7)
1562 stw r0, 0(r9)
1563 addi r7, r7, 4
1564 addi r9, r9, 4
1565 cmplw 0, r7, r8
1566 bne 1b
1567
1568 /*
1569 * relocate `hdlr' and `int_return' entries
1570 */
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001571 li r7, .L_MachineCheck - _start + _START_OFFSET
1572 li r8, Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +000015732:
1574 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001575 addi r7, r7, 0x100 /* next exception vector */
wdenk0442ed82002-11-03 10:24:00 +00001576 cmplw 0, r7, r8
1577 blt 2b
1578
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001579 li r7, .L_Alignment - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001580 bl trap_reloc
1581
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001582 li r7, .L_ProgramCheck - _start + _START_OFFSET
wdenk0442ed82002-11-03 10:24:00 +00001583 bl trap_reloc
1584
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001585#ifdef CONFIG_440
1586 li r7, .L_FPUnavailable - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001587 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001588
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001589 li r7, .L_Decrementer - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001590 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001591
1592 li r7, .L_APU - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001593 bl trap_reloc
Stefan Roese80d99a42007-06-19 16:42:31 +02001594
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001595 li r7, .L_InstructionTLBError - _start + _START_OFFSET
1596 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001597
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001598 li r7, .L_DataTLBError - _start + _START_OFFSET
1599 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001600#else /* CONFIG_440 */
1601 li r7, .L_PIT - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001602 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001603
1604 li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001605 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001606
1607 li r7, .L_DataTLBMiss - _start + _START_OFFSET
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001608 bl trap_reloc
Grzegorz Bernacki837bc5b2007-06-15 11:19:28 +02001609#endif /* CONFIG_440 */
1610
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001611 li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1612 bl trap_reloc
wdenk0442ed82002-11-03 10:24:00 +00001613
Stefan Roese42fbddd2006-09-07 11:51:23 +02001614#if !defined(CONFIG_440)
Stefan Roese7b12aa82006-03-13 09:42:28 +01001615 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1616 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1617 mtmsr r7 /* change MSR */
1618#else
Stefan Roese42fbddd2006-09-07 11:51:23 +02001619 bl __440_msr_set
1620 b __440_msr_continue
Stefan Roese7b12aa82006-03-13 09:42:28 +01001621
Stefan Roese42fbddd2006-09-07 11:51:23 +02001622__440_msr_set:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001623 addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1624 oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1625 mtspr srr1,r7
1626 mflr r7
1627 mtspr srr0,r7
1628 rfi
Stefan Roese42fbddd2006-09-07 11:51:23 +02001629__440_msr_continue:
Stefan Roese7b12aa82006-03-13 09:42:28 +01001630#endif
1631
wdenk0442ed82002-11-03 10:24:00 +00001632 mtlr r4 /* restore link register */
1633 blr
1634
1635 /*
1636 * Function: relocate entries for one exception vector
1637 */
1638trap_reloc:
1639 lwz r0, 0(r7) /* hdlr ... */
1640 add r0, r0, r3 /* ... += dest_addr */
1641 stw r0, 0(r7)
1642
1643 lwz r0, 4(r7) /* int_return ... */
1644 add r0, r0, r3 /* ... += dest_addr */
1645 stw r0, 4(r7)
1646
1647 blr
Stefan Roese42743512007-06-01 15:27:11 +02001648
1649#if defined(CONFIG_440)
1650/*----------------------------------------------------------------------------+
1651| dcbz_area.
1652+----------------------------------------------------------------------------*/
1653 function_prolog(dcbz_area)
1654 rlwinm. r5,r4,0,27,31
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001655 rlwinm r5,r4,27,5,31
1656 beq ..d_ra2
1657 addi r5,r5,0x0001
1658..d_ra2:mtctr r5
1659..d_ag2:dcbz r0,r3
1660 addi r3,r3,32
1661 bdnz ..d_ag2
Stefan Roese42743512007-06-01 15:27:11 +02001662 sync
1663 blr
1664 function_epilog(dcbz_area)
1665
1666/*----------------------------------------------------------------------------+
1667| dflush. Assume 32K at vector address is cachable.
1668+----------------------------------------------------------------------------*/
1669 function_prolog(dflush)
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001670 mfmsr r9
1671 rlwinm r8,r9,0,15,13
1672 rlwinm r8,r8,0,17,15
1673 mtmsr r8
Larry Johnson54f63cd2008-01-09 23:10:27 -05001674 mfspr r8,dvlim
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001675 addi r3,r0,0x0000
1676 mtspr dvlim,r3
1677 mfspr r3,ivpr
1678 addi r4,r0,1024
1679 mtctr r4
Stefan Roese42743512007-06-01 15:27:11 +02001680..dflush_loop:
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001681 lwz r6,0x0(r3)
1682 addi r3,r3,32
1683 bdnz ..dflush_loop
1684 addi r3,r3,-32
1685 mtctr r4
1686..ag: dcbf r0,r3
1687 addi r3,r3,-32
1688 bdnz ..ag
Larry Johnson54f63cd2008-01-09 23:10:27 -05001689 mtspr dvlim,r8
Stefan Roese42743512007-06-01 15:27:11 +02001690 sync
Wolfgang Denk09675ef2007-06-20 18:14:24 +02001691 mtmsr r9
Stefan Roese42743512007-06-01 15:27:11 +02001692 blr
1693 function_epilog(dflush)
1694#endif /* CONFIG_440 */
Stefan Roese42fbddd2006-09-07 11:51:23 +02001695#endif /* CONFIG_NAND_SPL */
stroese434979e2003-05-23 11:18:02 +00001696
Stefan Roese42743512007-06-01 15:27:11 +02001697/*------------------------------------------------------------------------------- */
1698/* Function: in8 */
1699/* Description: Input 8 bits */
1700/*------------------------------------------------------------------------------- */
1701 .globl in8
1702in8:
1703 lbz r3,0x0000(r3)
1704 blr
1705
1706/*------------------------------------------------------------------------------- */
1707/* Function: out8 */
1708/* Description: Output 8 bits */
1709/*------------------------------------------------------------------------------- */
1710 .globl out8
1711out8:
1712 stb r4,0x0000(r3)
1713 blr
1714
1715/*------------------------------------------------------------------------------- */
1716/* Function: out32 */
1717/* Description: Output 32 bits */
1718/*------------------------------------------------------------------------------- */
1719 .globl out32
1720out32:
1721 stw r4,0x0000(r3)
1722 blr
1723
1724/*------------------------------------------------------------------------------- */
1725/* Function: in32 */
1726/* Description: Input 32 bits */
1727/*------------------------------------------------------------------------------- */
1728 .globl in32
1729in32:
1730 lwz 3,0x0000(3)
1731 blr
stroese434979e2003-05-23 11:18:02 +00001732
1733/**************************************************************************/
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001734/* PPC405EP specific stuff */
stroese434979e2003-05-23 11:18:02 +00001735/**************************************************************************/
1736#ifdef CONFIG_405EP
1737ppc405ep_init:
stroese5ad6d4d2003-12-09 14:54:43 +00001738
Stefan Roese326c9712005-08-01 16:41:48 +02001739#ifdef CONFIG_BUBINGA
stroese5ad6d4d2003-12-09 14:54:43 +00001740 /*
1741 * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1742 * function) to support FPGA and NVRAM accesses below.
1743 */
1744
1745 lis r3,GPIO0_OSRH@h /* config GPIO output select */
1746 ori r3,r3,GPIO0_OSRH@l
1747 lis r4,CFG_GPIO0_OSRH@h
1748 ori r4,r4,CFG_GPIO0_OSRH@l
1749 stw r4,0(r3)
1750 lis r3,GPIO0_OSRL@h
1751 ori r3,r3,GPIO0_OSRL@l
1752 lis r4,CFG_GPIO0_OSRL@h
1753 ori r4,r4,CFG_GPIO0_OSRL@l
1754 stw r4,0(r3)
1755
1756 lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1757 ori r3,r3,GPIO0_ISR1H@l
1758 lis r4,CFG_GPIO0_ISR1H@h
1759 ori r4,r4,CFG_GPIO0_ISR1H@l
1760 stw r4,0(r3)
1761 lis r3,GPIO0_ISR1L@h
1762 ori r3,r3,GPIO0_ISR1L@l
1763 lis r4,CFG_GPIO0_ISR1L@h
1764 ori r4,r4,CFG_GPIO0_ISR1L@l
1765 stw r4,0(r3)
1766
1767 lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1768 ori r3,r3,GPIO0_TSRH@l
1769 lis r4,CFG_GPIO0_TSRH@h
1770 ori r4,r4,CFG_GPIO0_TSRH@l
1771 stw r4,0(r3)
1772 lis r3,GPIO0_TSRL@h
1773 ori r3,r3,GPIO0_TSRL@l
1774 lis r4,CFG_GPIO0_TSRL@h
1775 ori r4,r4,CFG_GPIO0_TSRL@l
1776 stw r4,0(r3)
1777
1778 lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1779 ori r3,r3,GPIO0_TCR@l
1780 lis r4,CFG_GPIO0_TCR@h
1781 ori r4,r4,CFG_GPIO0_TCR@l
1782 stw r4,0(r3)
1783
1784 li r3,pb1ap /* program EBC bank 1 for RTC access */
1785 mtdcr ebccfga,r3
1786 lis r3,CFG_EBC_PB1AP@h
1787 ori r3,r3,CFG_EBC_PB1AP@l
1788 mtdcr ebccfgd,r3
1789 li r3,pb1cr
1790 mtdcr ebccfga,r3
1791 lis r3,CFG_EBC_PB1CR@h
1792 ori r3,r3,CFG_EBC_PB1CR@l
1793 mtdcr ebccfgd,r3
1794
1795 li r3,pb1ap /* program EBC bank 1 for RTC access */
1796 mtdcr ebccfga,r3
1797 lis r3,CFG_EBC_PB1AP@h
1798 ori r3,r3,CFG_EBC_PB1AP@l
1799 mtdcr ebccfgd,r3
1800 li r3,pb1cr
1801 mtdcr ebccfga,r3
1802 lis r3,CFG_EBC_PB1CR@h
1803 ori r3,r3,CFG_EBC_PB1CR@l
1804 mtdcr ebccfgd,r3
1805
1806 li r3,pb4ap /* program EBC bank 4 for FPGA access */
1807 mtdcr ebccfga,r3
1808 lis r3,CFG_EBC_PB4AP@h
1809 ori r3,r3,CFG_EBC_PB4AP@l
1810 mtdcr ebccfgd,r3
1811 li r3,pb4cr
1812 mtdcr ebccfga,r3
1813 lis r3,CFG_EBC_PB4CR@h
1814 ori r3,r3,CFG_EBC_PB4CR@l
1815 mtdcr ebccfgd,r3
1816#endif
stroese434979e2003-05-23 11:18:02 +00001817
wdenk57b2d802003-06-27 21:31:46 +00001818 /*
1819 !-----------------------------------------------------------------------
1820 ! Check to see if chip is in bypass mode.
1821 ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1822 ! CPU reset Otherwise, skip this step and keep going.
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001823 ! Note: Running BIOS in bypass mode is not supported since PLB speed
1824 ! will not be fast enough for the SDRAM (min 66MHz)
wdenk57b2d802003-06-27 21:31:46 +00001825 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001826 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001827 mfdcr r5, CPC0_PLLMR1
1828 rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
1829 cmpi cr0,0,r4,0x1
stroese434979e2003-05-23 11:18:02 +00001830
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001831 beq pll_done /* if SSCS =b'1' then PLL has */
wdenk57b2d802003-06-27 21:31:46 +00001832 /* already been set */
1833 /* and CPU has been reset */
1834 /* so skip to next section */
stroese434979e2003-05-23 11:18:02 +00001835
Stefan Roese326c9712005-08-01 16:41:48 +02001836#ifdef CONFIG_BUBINGA
stroese434979e2003-05-23 11:18:02 +00001837 /*
wdenk57b2d802003-06-27 21:31:46 +00001838 !-----------------------------------------------------------------------
1839 ! Read NVRAM to get value to write in PLLMR.
1840 ! If value has not been correctly saved, write default value
1841 ! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1842 ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1843 !
1844 ! WARNING: This code assumes the first three words in the nvram_t
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001845 ! structure in openbios.h. Changing the beginning of
1846 ! the structure will break this code.
wdenk57b2d802003-06-27 21:31:46 +00001847 !
1848 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001849 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001850 addis r3,0,NVRAM_BASE@h
1851 addi r3,r3,NVRAM_BASE@l
stroese434979e2003-05-23 11:18:02 +00001852
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001853 lwz r4, 0(r3)
1854 addis r5,0,NVRVFY1@h
1855 addi r5,r5,NVRVFY1@l
1856 cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
1857 bne ..no_pllset
1858 addi r3,r3,4
1859 lwz r4, 0(r3)
1860 addis r5,0,NVRVFY2@h
1861 addi r5,r5,NVRVFY2@l
1862 cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
1863 bne ..no_pllset
1864 addi r3,r3,8 /* Skip over conf_size */
1865 lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1866 lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1867 rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1868 cmpi cr0,0,r5,1 /* See if PLL is locked */
1869 beq pll_write
stroese434979e2003-05-23 11:18:02 +00001870..no_pllset:
Stefan Roese326c9712005-08-01 16:41:48 +02001871#endif /* CONFIG_BUBINGA */
stroese434979e2003-05-23 11:18:02 +00001872
John Otken9aa36772007-07-26 17:49:11 +02001873#ifdef CONFIG_TAIHU
1874 mfdcr r4, CPC0_BOOT
1875 andi. r5, r4, CPC0_BOOT_SEP@l
1876 bne strap_1 /* serial eeprom present */
1877 addis r5,0,CPLD_REG0_ADDR@h
1878 ori r5,r5,CPLD_REG0_ADDR@l
1879 andi. r5, r5, 0x10
1880 bne _pci_66mhz
1881#endif /* CONFIG_TAIHU */
1882
Stefan Roesea5d182e2007-08-14 14:44:41 +02001883#if defined(CONFIG_ZEUS)
1884 mfdcr r4, CPC0_BOOT
1885 andi. r5, r4, CPC0_BOOT_SEP@l
1886 bne strap_1 /* serial eeprom present */
1887 lis r3,0x0000
1888 addi r3,r3,0x3030
1889 lis r4,0x8042
1890 addi r4,r4,0x223e
1891 b 1f
1892strap_1:
1893 mfdcr r3, CPC0_PLLMR0
1894 mfdcr r4, CPC0_PLLMR1
1895 b 1f
1896#endif
1897
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001898 addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1899 ori r3,r3,PLLMR0_DEFAULT@l /* */
1900 addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1901 ori r4,r4,PLLMR1_DEFAULT@l /* */
stroese434979e2003-05-23 11:18:02 +00001902
John Otken9aa36772007-07-26 17:49:11 +02001903#ifdef CONFIG_TAIHU
1904 b 1f
1905_pci_66mhz:
1906 addis r3,0,PLLMR0_DEFAULT_PCI66@h
1907 ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1908 addis r4,0,PLLMR1_DEFAULT_PCI66@h
1909 ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1910 b 1f
1911strap_1:
1912 mfdcr r3, CPC0_PLLMR0
1913 mfdcr r4, CPC0_PLLMR1
John Otken9aa36772007-07-26 17:49:11 +02001914#endif /* CONFIG_TAIHU */
1915
Stefan Roesea5d182e2007-08-14 14:44:41 +020019161:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001917 b pll_write /* Write the CPC0_PLLMR with new value */
stroese434979e2003-05-23 11:18:02 +00001918
1919pll_done:
wdenk57b2d802003-06-27 21:31:46 +00001920 /*
1921 !-----------------------------------------------------------------------
1922 ! Clear Soft Reset Register
1923 ! This is needed to enable PCI if not booting from serial EPROM
1924 !-----------------------------------------------------------------------
stroese434979e2003-05-23 11:18:02 +00001925 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001926 addi r3, 0, 0x0
1927 mtdcr CPC0_SRR, r3
stroese434979e2003-05-23 11:18:02 +00001928
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001929 addis r3,0,0x0010
1930 mtctr r3
stroese434979e2003-05-23 11:18:02 +00001931pci_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001932 bdnz pci_wait
stroese434979e2003-05-23 11:18:02 +00001933
1934 blr /* return to main code */
1935
1936/*
1937!-----------------------------------------------------------------------------
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001938! Function: pll_write
1939! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1940! That is:
1941! 1. Pll is first disabled (de-activated by putting in bypass mode)
1942! 2. PLL is reset
1943! 3. Clock dividers are set while PLL is held in reset and bypassed
1944! 4. PLL Reset is cleared
1945! 5. Wait 100us for PLL to lock
1946! 6. A core reset is performed
stroese434979e2003-05-23 11:18:02 +00001947! Input: r3 = Value to write to CPC0_PLLMR0
1948! Input: r4 = Value to write to CPC0_PLLMR1
1949! Output r3 = none
1950!-----------------------------------------------------------------------------
1951*/
1952pll_write:
wdenk57b2d802003-06-27 21:31:46 +00001953 mfdcr r5, CPC0_UCR
1954 andis. r5,r5,0xFFFF
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001955 ori r5,r5,0x0101 /* Stop the UART clocks */
1956 mtdcr CPC0_UCR,r5 /* Before changing PLL */
stroese434979e2003-05-23 11:18:02 +00001957
wdenk57b2d802003-06-27 21:31:46 +00001958 mfdcr r5, CPC0_PLLMR1
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001959 rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
1960 mtdcr CPC0_PLLMR1,r5
1961 oris r5,r5,0x4000 /* Set PLL Reset */
1962 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00001963
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001964 mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1965 rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1966 oris r5,r5,0x4000 /* Set PLL Reset */
1967 mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1968 rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
1969 mtdcr CPC0_PLLMR1,r5
stroese434979e2003-05-23 11:18:02 +00001970
1971 /*
wdenk57b2d802003-06-27 21:31:46 +00001972 ! Wait min of 100us for PLL to lock.
1973 ! See CMOS 27E databook for more info.
1974 ! At 200MHz, that means waiting 20,000 instructions
stroese434979e2003-05-23 11:18:02 +00001975 */
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001976 addi r3,0,20000 /* 2000 = 0x4e20 */
1977 mtctr r3
stroese434979e2003-05-23 11:18:02 +00001978pll_wait:
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001979 bdnz pll_wait
stroese434979e2003-05-23 11:18:02 +00001980
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001981 oris r5,r5,0x8000 /* Enable PLL */
1982 mtdcr CPC0_PLLMR1,r5 /* Engage */
stroese434979e2003-05-23 11:18:02 +00001983
wdenk57b2d802003-06-27 21:31:46 +00001984 /*
1985 * Reset CPU to guarantee timings are OK
1986 * Not sure if this is needed...
1987 */
1988 addis r3,0,0x1000
Wolfgang Denk8dd4d332005-08-06 01:42:58 +02001989 mtspr dbcr0,r3 /* This will cause a CPU core reset, and */
wdenk57b2d802003-06-27 21:31:46 +00001990 /* execution will continue from the poweron */
1991 /* vector of 0xfffffffc */
stroese434979e2003-05-23 11:18:02 +00001992#endif /* CONFIG_405EP */
Stefan Roesea8856e32007-02-20 10:57:08 +01001993
1994#if defined(CONFIG_440)
Stefan Roesea8856e32007-02-20 10:57:08 +01001995/*----------------------------------------------------------------------------+
1996| mttlb3.
1997+----------------------------------------------------------------------------*/
1998 function_prolog(mttlb3)
1999 TLBWE(4,3,2)
2000 blr
2001 function_epilog(mttlb3)
2002
2003/*----------------------------------------------------------------------------+
2004| mftlb3.
2005+----------------------------------------------------------------------------*/
2006 function_prolog(mftlb3)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002007 TLBRE(3,3,2)
Stefan Roesea8856e32007-02-20 10:57:08 +01002008 blr
2009 function_epilog(mftlb3)
2010
2011/*----------------------------------------------------------------------------+
2012| mttlb2.
2013+----------------------------------------------------------------------------*/
2014 function_prolog(mttlb2)
2015 TLBWE(4,3,1)
2016 blr
2017 function_epilog(mttlb2)
2018
2019/*----------------------------------------------------------------------------+
2020| mftlb2.
2021+----------------------------------------------------------------------------*/
2022 function_prolog(mftlb2)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002023 TLBRE(3,3,1)
Stefan Roesea8856e32007-02-20 10:57:08 +01002024 blr
2025 function_epilog(mftlb2)
2026
2027/*----------------------------------------------------------------------------+
2028| mttlb1.
2029+----------------------------------------------------------------------------*/
2030 function_prolog(mttlb1)
2031 TLBWE(4,3,0)
2032 blr
2033 function_epilog(mttlb1)
2034
2035/*----------------------------------------------------------------------------+
2036| mftlb1.
2037+----------------------------------------------------------------------------*/
2038 function_prolog(mftlb1)
Wolfgang Denk52232fd2007-02-27 14:26:04 +01002039 TLBRE(3,3,0)
Stefan Roesea8856e32007-02-20 10:57:08 +01002040 blr
2041 function_epilog(mftlb1)
2042#endif /* CONFIG_440 */