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>
5
* Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
6
* Copyright (c) 2008 Nuovation System Designs, LLC
7
* Grant Erickson <gerickson@nuovations.com>
9
* SPDX-License-Identifier: GPL-2.0 IBM-pibs
13
* Startup code for IBM/AMCC PowerPC 4xx (PPC4xx) based boards
15
* The following description only applies to the NOR flash style booting.
16
* NAND booting is different. For more details about NAND booting on 4xx
17
* take a look at doc/README.nand-boot-ppc440.
19
* The CPU starts at address 0xfffffffc (last word in the address space).
20
* The U-Boot image therefore has to be located in the "upper" area of the
21
* flash (e.g. 512MiB - 0xfff80000 ... 0xffffffff). The default value for
22
* the boot chip-select (CS0) is quite big and covers this area. On the
23
* 405EX this is for example 0xffe00000 ... 0xffffffff. U-Boot will
24
* reconfigure this CS0 (and other chip-selects as well when configured
25
* this way) in the boot process to the "correct" values matching the
29
#include <asm-offsets.h>
31
#include <asm/ppc4xx.h>
34
#include <ppc_asm.tmpl>
37
#include <asm/cache.h>
39
#include <asm/ppc4xx-isram.h>
41
#ifdef CONFIG_SYS_INIT_DCACHE_CS
42
# if (CONFIG_SYS_INIT_DCACHE_CS == 0)
45
# if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
46
# define PBxAP_VAL CONFIG_SYS_EBC_PB0AP
47
# define PBxCR_VAL CONFIG_SYS_EBC_PB0CR
50
# if (CONFIG_SYS_INIT_DCACHE_CS == 1)
53
# if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR))
54
# define PBxAP_VAL CONFIG_SYS_EBC_PB1AP
55
# define PBxCR_VAL CONFIG_SYS_EBC_PB1CR
58
# if (CONFIG_SYS_INIT_DCACHE_CS == 2)
61
# if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR))
62
# define PBxAP_VAL CONFIG_SYS_EBC_PB2AP
63
# define PBxCR_VAL CONFIG_SYS_EBC_PB2CR
66
# if (CONFIG_SYS_INIT_DCACHE_CS == 3)
69
# if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR))
70
# define PBxAP_VAL CONFIG_SYS_EBC_PB3AP
71
# define PBxCR_VAL CONFIG_SYS_EBC_PB3CR
74
# if (CONFIG_SYS_INIT_DCACHE_CS == 4)
77
# if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR))
78
# define PBxAP_VAL CONFIG_SYS_EBC_PB4AP
79
# define PBxCR_VAL CONFIG_SYS_EBC_PB4CR
82
# if (CONFIG_SYS_INIT_DCACHE_CS == 5)
85
# if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR))
86
# define PBxAP_VAL CONFIG_SYS_EBC_PB5AP
87
# define PBxCR_VAL CONFIG_SYS_EBC_PB5CR
90
# if (CONFIG_SYS_INIT_DCACHE_CS == 6)
93
# if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR))
94
# define PBxAP_VAL CONFIG_SYS_EBC_PB6AP
95
# define PBxCR_VAL CONFIG_SYS_EBC_PB6CR
98
# if (CONFIG_SYS_INIT_DCACHE_CS == 7)
101
# if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR))
102
# define PBxAP_VAL CONFIG_SYS_EBC_PB7AP
103
# define PBxCR_VAL CONFIG_SYS_EBC_PB7CR
113
* Memory Bank x (nothingness) initialization CONFIG_SYS_INIT_RAM_ADDR + 64 MiB
114
* used as temporary stack pointer for the primordial stack
116
# ifndef CONFIG_SYS_INIT_DCACHE_PBxAR
117
# define CONFIG_SYS_INIT_DCACHE_PBxAR (EBC_BXAP_BME_DISABLED | \
118
EBC_BXAP_TWT_ENCODE(7) | \
119
EBC_BXAP_BCE_DISABLE | \
120
EBC_BXAP_BCT_2TRANS | \
121
EBC_BXAP_CSN_ENCODE(0) | \
122
EBC_BXAP_OEN_ENCODE(0) | \
123
EBC_BXAP_WBN_ENCODE(0) | \
124
EBC_BXAP_WBF_ENCODE(0) | \
125
EBC_BXAP_TH_ENCODE(2) | \
126
EBC_BXAP_RE_DISABLED | \
127
EBC_BXAP_SOR_NONDELAYED | \
128
EBC_BXAP_BEM_WRITEONLY | \
129
EBC_BXAP_PEN_DISABLED)
130
# endif /* CONFIG_SYS_INIT_DCACHE_PBxAR */
131
# ifndef CONFIG_SYS_INIT_DCACHE_PBxCR
132
# define CONFIG_SYS_INIT_DCACHE_PBxCR (EBC_BXCR_BAS_ENCODE(CONFIG_SYS_INIT_RAM_ADDR) | \
136
# endif /* CONFIG_SYS_INIT_DCACHE_PBxCR */
137
# ifndef CONFIG_SYS_INIT_RAM_PATTERN
138
# define CONFIG_SYS_INIT_RAM_PATTERN 0xDEADDEAD
140
#endif /* CONFIG_SYS_INIT_DCACHE_CS */
142
#if (defined(CONFIG_SYS_INIT_RAM_DCACHE) && (CONFIG_SYS_INIT_RAM_SIZE > (4 << 10)))
143
#error Only 4k of init-ram is supported - please adjust CONFIG_SYS_INIT_RAM_SIZE!
147
* Unless otherwise overriden, enable two 128MB cachable instruction regions
148
* at CONFIG_SYS_SDRAM_BASE and another 128MB cacheable instruction region covering
149
* NOR flash at CONFIG_SYS_FLASH_BASE. Disable all cacheable data regions.
151
#if !defined(CONFIG_SYS_FLASH_BASE)
152
/* If not already defined, set it to the "last" 128MByte region */
153
# define CONFIG_SYS_FLASH_BASE 0xf8000000
155
#if !defined(CONFIG_SYS_ICACHE_SACR_VALUE)
156
# define CONFIG_SYS_ICACHE_SACR_VALUE \
157
(PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + ( 0 << 20)) | \
158
PPC_128MB_SACR_VALUE(CONFIG_SYS_SDRAM_BASE + (128 << 20)) | \
159
PPC_128MB_SACR_VALUE(CONFIG_SYS_FLASH_BASE))
160
#endif /* !defined(CONFIG_SYS_ICACHE_SACR_VALUE) */
162
#if !defined(CONFIG_SYS_DCACHE_SACR_VALUE)
163
# define CONFIG_SYS_DCACHE_SACR_VALUE \
165
#endif /* !defined(CONFIG_SYS_DCACHE_SACR_VALUE) */
167
#if !defined(CONFIG_SYS_TLB_FOR_BOOT_FLASH)
168
#define CONFIG_SYS_TLB_FOR_BOOT_FLASH 0 /* use TLB 0 as default */
171
#define function_prolog(func_name) .text; \
175
#define function_epilog(func_name) .type func_name,@function; \
176
.size func_name,.-func_name
178
/* We don't want the MMU yet.
181
#define MSR_KERNEL ( MSR_ME ) /* Machine Check */
184
.extern ext_bus_cntlr_init
187
* Set up GOT: Global Offset Table
189
* Use r12 to access the GOT
191
#if !defined(CONFIG_SPL_BUILD)
193
GOT_ENTRY(_GOT2_TABLE_)
194
GOT_ENTRY(_FIXUP_TABLE_)
197
GOT_ENTRY(_start_of_vectors)
198
GOT_ENTRY(_end_of_vectors)
199
GOT_ENTRY(transfer_to_handler)
201
GOT_ENTRY(__init_end)
203
GOT_ENTRY(__bss_start)
205
#endif /* CONFIG_SPL_BUILD */
207
#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_BOOT_FROM_XMD)
209
* 4xx RAM-booting U-Boot image is started from offset 0
215
#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
217
* This is the entry of the real U-Boot from a board port
218
* that supports SPL booting on the PPC4xx. We only need
219
* to call board_init_f() here. Everything else has already
220
* been done in the SPL u-boot version.
222
GET_GOT /* initialize GOT access */
223
bl board_init_f /* run 1st part of board init code (in Flash)*/
224
/* NOTREACHED - board_init_f() does not return */
228
* 440 Startup -- on reset only the top 4k of the effective
229
* address space is mapped in by an entry in the instruction
230
* and data shadow TLB. The .bootpg section is located in the
231
* top 4k & does only what's necessary to map in the the rest
232
* of the boot rom. Once the boot rom is mapped in we can
233
* proceed with normal startup.
235
* NOTE: CS0 only covers the top 2MB of the effective address
239
#if defined(CONFIG_440)
240
.section .bootpg,"ax"
243
/**************************************************************************/
245
/*--------------------------------------------------------------------+
246
| 440EPX BUP Change - Hardware team request
247
+--------------------------------------------------------------------*/
248
#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
253
/*----------------------------------------------------------------+
254
| Core bug fix. Clear the esr
255
+-----------------------------------------------------------------*/
258
/*----------------------------------------------------------------*/
259
/* Clear and set up some registers. */
260
/*----------------------------------------------------------------*/
261
iccci r0,r0 /* NOTE: operands not used for 440 */
262
dccci r0,r0 /* NOTE: operands not used for 440 */
269
/* NOTE: 440GX adds machine check status regs */
270
#if defined(CONFIG_440) && !defined(CONFIG_440GP)
277
/*----------------------------------------------------------------*/
279
/*----------------------------------------------------------------*/
280
/* Disable store gathering & broadcast, guarantee inst/data
281
* cache block touch, force load/store alignment
282
* (see errata 1.12: 440_33)
284
lis r1,0x0030 /* store gathering & broadcast disable */
285
ori r1,r1,0x6000 /* cache touch */
288
/*----------------------------------------------------------------*/
289
/* Initialize debug */
290
/*----------------------------------------------------------------*/
292
andis. r1, r1, 0x8000 /* test DBCR0[EDM] bit */
293
bne skip_debug_init /* if set, don't clear debug register */
295
ori r1,r1,CCR0_DTB@l /* Disable Trace Broadcast */
309
mtspr SPRN_DBSR,r1 /* Clear all valid bits */
312
#if defined (CONFIG_440SPE)
313
/*----------------------------------------------------------------+
314
| Initialize Core Configuration Reg1.
315
| a. ICDPEI: Record even parity. Normal operation.
316
| b. ICTPEI: Record even parity. Normal operation.
317
| c. DCTPEI: Record even parity. Normal operation.
318
| d. DCDPEI: Record even parity. Normal operation.
319
| e. DCUPEI: Record even parity. Normal operation.
320
| f. DCMPEI: Record even parity. Normal operation.
321
| g. FCOM: Normal operation
322
| h. MMUPEI: Record even parity. Normal operation.
323
| i. FFF: Flush only as much data as necessary.
324
| j. TCS: Timebase increments from CPU clock.
325
+-----------------------------------------------------------------*/
329
/*----------------------------------------------------------------+
330
| Reset the timebase.
331
| The previous write to CCR1 sets the timebase source.
332
+-----------------------------------------------------------------*/
337
/*----------------------------------------------------------------*/
338
/* Setup interrupt vectors */
339
/*----------------------------------------------------------------*/
340
mtspr SPRN_IVPR,r0 /* Vectors start at 0x0000_0000 */
342
mtspr SPRN_IVOR0,r1 /* Critical input */
344
mtspr SPRN_IVOR1,r1 /* Machine check */
346
mtspr SPRN_IVOR2,r1 /* Data storage */
348
mtspr SPRN_IVOR3,r1 /* Instruction storage */
350
mtspr SPRN_IVOR4,r1 /* External interrupt */
352
mtspr SPRN_IVOR5,r1 /* Alignment */
354
mtspr SPRN_IVOR6,r1 /* Program check */
356
mtspr SPRN_IVOR7,r1 /* Floating point unavailable */
358
mtspr SPRN_IVOR8,r1 /* System call */
360
mtspr SPRN_IVOR9,r1 /* Auxiliary Processor unavailable */
362
mtspr SPRN_IVOR10,r1 /* Decrementer */
364
mtspr SPRN_IVOR13,r1 /* Data TLB error */
366
mtspr SPRN_IVOR14,r1 /* Instr TLB error */
368
mtspr SPRN_IVOR15,r1 /* Debug */
370
/*----------------------------------------------------------------*/
371
/* Configure cache regions */
372
/*----------------------------------------------------------------*/
390
/*----------------------------------------------------------------*/
391
/* Cache victim limits */
392
/*----------------------------------------------------------------*/
393
/* floors 0, ceiling max to use the entire cache -- nothing locked
400
/*----------------------------------------------------------------+
401
|Initialize MMUCR[STID] = 0.
402
+-----------------------------------------------------------------*/
409
/*----------------------------------------------------------------*/
410
/* Clear all TLB entries -- TID = 0, TS = 0 */
411
/*----------------------------------------------------------------*/
413
#ifdef CONFIG_SYS_RAMBOOT
414
li r4,0 /* Start with TLB #0 */
416
li r4,1 /* Start with TLB #1 */
418
li r1,64 /* 64 TLB entries */
419
sub r1,r1,r4 /* calculate last TLB # */
422
#ifdef CONFIG_SYS_RAMBOOT
423
tlbre r3,r4,0 /* Read contents from TLB word #0 to get EPN */
424
rlwinm. r3,r3,0,0xfffffc00 /* Mask EPN */
425
beq tlbnxt /* Skip EPN=0 TLB, this is the SDRAM TLB */
427
tlbwe r0,r4,0 /* Invalidate all entries (V=0)*/
430
tlbnxt: addi r4,r4,1 /* Next TLB */
433
/*----------------------------------------------------------------*/
434
/* TLB entry setup -- step thru tlbtab */
435
/*----------------------------------------------------------------*/
436
#if defined(CONFIG_440SPE_REVA)
437
/*----------------------------------------------------------------*/
438
/* We have different TLB tables for revA and rev B of 440SPe */
439
/*----------------------------------------------------------------*/
451
bl tlbtab /* Get tlbtab pointer */
454
li r1,0x003f /* 64 TLB entries max */
460
#ifdef CONFIG_SYS_RAMBOOT
461
tlbre r3,r4,0 /* Read contents from TLB word #0 */
462
rlwinm. r3,r3,0,0x00000200 /* Mask V (valid) bit */
463
bne tlbnx2 /* Skip V=1 TLB, this is the SDRAM TLB */
467
beq 2f /* 0 marks end */
470
tlbwe r0,r4,0 /* TLB Word 0 */
471
tlbwe r1,r4,1 /* TLB Word 1 */
472
tlbwe r2,r4,2 /* TLB Word 2 */
473
tlbnx2: addi r4,r4,1 /* Next TLB */
476
/*----------------------------------------------------------------*/
477
/* Continue from 'normal' start */
478
/*----------------------------------------------------------------*/
484
mtspr SPRN_SRR1,r0 /* Keep things disabled for now */
488
#endif /* CONFIG_440 */
491
* r3 - 1st arg to board_init(): IMMP pointer
492
* r4 - 2nd arg to board_init(): boot flag
494
#if !defined(CONFIG_SPL_BUILD)
496
.long 0x27051956 /* U-Boot Magic Number */
497
.globl version_string
499
.ascii U_BOOT_VERSION_STRING, "\0"
501
. = EXC_OFF_SYS_RESET
502
.globl _start_of_vectors
505
/* Critical input. */
506
CRIT_EXCEPTION(0x100, CritcalInput, UnknownException)
510
MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
512
CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)
513
#endif /* CONFIG_440 */
515
/* Data Storage exception. */
516
STD_EXCEPTION(0x300, DataStorage, UnknownException)
518
/* Instruction Storage exception. */
519
STD_EXCEPTION(0x400, InstStorage, UnknownException)
521
/* External Interrupt exception. */
522
STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)
524
/* Alignment exception. */
527
EXCEPTION_PROLOG(SRR0, SRR1)
532
addi r3,r1,STACK_FRAME_OVERHEAD
533
EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
535
/* Program check exception */
538
EXCEPTION_PROLOG(SRR0, SRR1)
539
addi r3,r1,STACK_FRAME_OVERHEAD
540
EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
544
STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
545
STD_EXCEPTION(0x900, Decrementer, DecrementerPITException)
546
STD_EXCEPTION(0xa00, APU, UnknownException)
548
STD_EXCEPTION(0xc00, SystemCall, UnknownException)
551
STD_EXCEPTION(0x1300, DataTLBError, UnknownException)
552
STD_EXCEPTION(0x1400, InstructionTLBError, UnknownException)
554
STD_EXCEPTION(0x1000, PIT, DecrementerPITException)
555
STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)
556
STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)
558
CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )
560
.globl _end_of_vectors
567
#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
569
* This is the entry of the real U-Boot from a board port
570
* that supports SPL booting on the PPC4xx. We only need
571
* to call board_init_f() here. Everything else has already
572
* been done in the SPL u-boot version.
574
GET_GOT /* initialize GOT access */
575
bl board_init_f /* run 1st part of board init code (in Flash)*/
576
/* NOTREACHED - board_init_f() does not return */
579
/*****************************************************************************/
580
#if defined(CONFIG_440)
582
/*----------------------------------------------------------------*/
583
/* Clear and set up some registers. */
584
/*----------------------------------------------------------------*/
587
mtspr SPRN_DEC,r0 /* prevent dec exceptions */
588
mtspr SPRN_TBWL,r0 /* prevent fit & wdt exceptions */
590
mtspr SPRN_TSR,r1 /* clear all timer exception status */
591
mtspr SPRN_TCR,r0 /* disable all */
592
mtspr SPRN_ESR,r0 /* clear exception syndrome register */
593
mtxer r0 /* clear integer exception register */
595
/*----------------------------------------------------------------*/
596
/* Debug setup -- some (not very good) ice's need an event*/
597
/* to establish control :-( Define CONFIG_SYS_INIT_DBCR to the dbsr */
598
/* value you need in this case 0x8cff 0000 should do the trick */
599
/*----------------------------------------------------------------*/
600
#if defined(CONFIG_SYS_INIT_DBCR)
603
mtspr SPRN_DBSR,r1 /* Clear all status bits */
604
lis r0,CONFIG_SYS_INIT_DBCR@h
605
ori r0,r0,CONFIG_SYS_INIT_DBCR@l
610
/*----------------------------------------------------------------*/
611
/* Setup the internal SRAM */
612
/*----------------------------------------------------------------*/
615
#ifdef CONFIG_SYS_INIT_RAM_DCACHE
616
/* Clear Dcache to use as RAM */
617
addis r3,r0,CONFIG_SYS_INIT_RAM_ADDR@h
618
ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
619
addis r4,r0,CONFIG_SYS_INIT_RAM_SIZE@h
620
ori r4,r4,CONFIG_SYS_INIT_RAM_SIZE@l
621
rlwinm. r5,r4,0,27,31
633
* Lock the init-ram/stack in d-cache, so that other regions
634
* may use d-cache as well
635
* Note, that this current implementation locks exactly 4k
636
* of d-cache, so please make sure that you don't define a
637
* bigger init-ram area. Take a look at the lwmon5 440EPx
638
* implementation as a reference.
642
/* 8. set TFLOOR/NFLOOR to 8 (-> 8*16*32 bytes locked -> 4k) */
658
#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
660
/* 440EP & 440GR are only 440er PPC's without internal SRAM */
661
#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
662
/* not all PPC's have internal SRAM usable as L2-cache */
663
#if defined(CONFIG_440GX) || \
664
defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
665
defined(CONFIG_460SX)
666
mtdcr L2_CACHE_CFG,r0 /* Ensure L2 Cache is off */
667
#elif defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
668
defined(CONFIG_APM821XX)
670
ori r1,r1,0x0008 /* Set L2_CACHE_CFG[RDBW]=1 */
671
mtdcr L2_CACHE_CFG,r1
677
and r1,r1,r2 /* Disable parity check */
680
and r1,r1,r2 /* Disable pwr mgmt */
683
lis r1,0x8000 /* BAS = 8000_0000 */
684
#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
685
ori r1,r1,0x0980 /* first 64k */
686
mtdcr ISRAM0_SB0CR,r1
688
ori r1,r1,0x0980 /* second 64k */
689
mtdcr ISRAM0_SB1CR,r1
691
ori r1,r1, 0x0980 /* third 64k */
692
mtdcr ISRAM0_SB2CR,r1
694
ori r1,r1, 0x0980 /* fourth 64k */
695
mtdcr ISRAM0_SB3CR,r1
696
#elif defined(CONFIG_440SPE) || defined(CONFIG_460EX) || \
697
defined(CONFIG_460GT) || defined(CONFIG_APM821XX)
698
lis r1,0x0000 /* BAS = X_0000_0000 */
699
ori r1,r1,0x0984 /* first 64k */
700
mtdcr ISRAM0_SB0CR,r1
702
ori r1,r1,0x0984 /* second 64k */
703
mtdcr ISRAM0_SB1CR,r1
705
ori r1,r1, 0x0984 /* third 64k */
706
mtdcr ISRAM0_SB2CR,r1
708
ori r1,r1, 0x0984 /* fourth 64k */
709
mtdcr ISRAM0_SB3CR,r1
710
#if defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
711
defined(CONFIG_APM821XX)
715
and r1,r1,r2 /* Disable parity check */
718
and r1,r1,r2 /* Disable pwr mgmt */
721
lis r1,0x0004 /* BAS = 4_0004_0000 */
722
ori r1,r1,ISRAM1_SIZE /* ocm size */
723
mtdcr ISRAM1_SB0CR,r1
725
#elif defined(CONFIG_460SX)
726
lis r1,0x0000 /* BAS = 0000_0000 */
727
ori r1,r1,0x0B84 /* first 128k */
728
mtdcr ISRAM0_SB0CR,r1
730
ori r1,r1,0x0B84 /* second 128k */
731
mtdcr ISRAM0_SB1CR,r1
733
ori r1,r1, 0x0B84 /* third 128k */
734
mtdcr ISRAM0_SB2CR,r1
736
ori r1,r1, 0x0B84 /* fourth 128k */
737
mtdcr ISRAM0_SB3CR,r1
738
#elif defined(CONFIG_440GP)
739
ori r1,r1,0x0380 /* 8k rw */
740
mtdcr ISRAM0_SB0CR,r1
741
mtdcr ISRAM0_SB1CR,r0 /* Disable bank 1 */
743
#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
745
/*----------------------------------------------------------------*/
746
/* Setup the stack in internal SRAM */
747
/*----------------------------------------------------------------*/
748
lis r1,CONFIG_SYS_INIT_RAM_ADDR@h
749
ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
752
stwu r0,-4(r1) /* Terminate call chain */
754
stwu r1,-8(r1) /* Save back chain and move SP */
755
lis r0,RESET_VECTOR@h /* Address of reset vector */
756
ori r0,r0, RESET_VECTOR@l
757
stwu r1,-8(r1) /* Save back chain and move SP */
758
stw r0,+12(r1) /* Save return addr (underflow vect) */
760
#ifndef CONFIG_SPL_BUILD
764
bl cpu_init_f /* run low-level CPU init code (from Flash) */
766
/* NOTREACHED - board_init_f() does not return */
768
#endif /* CONFIG_440 */
770
/*****************************************************************************/
771
#if defined(CONFIG_405GP) || \
772
defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
773
defined(CONFIG_405EX) || defined(CONFIG_405)
774
/*----------------------------------------------------------------------- */
775
/* Clear and set up some registers. */
776
/*----------------------------------------------------------------------- */
778
#if !defined(CONFIG_405EX)
782
* On 405EX, completely clearing the SGR leads to PPC hangup
783
* upon PCIe configuration access. The PCIe memory regions
784
* need to be guarded!
791
mtesr r4 /* clear Exception Syndrome Reg */
792
mttcr r4 /* clear Timer Control Reg */
793
mtxer r4 /* clear Fixed-Point Exception Reg */
794
mtevpr r4 /* clear Exception Vector Prefix Reg */
795
addi r4,r0,(0xFFFF-0x10000) /* set r4 to 0xFFFFFFFF (status in the */
796
/* dbsr is cleared by setting bits to 1) */
797
mtdbsr r4 /* clear/reset the dbsr */
799
/* Invalidate the i- and d-caches. */
803
/* Set-up icache cacheability. */
804
lis r4, CONFIG_SYS_ICACHE_SACR_VALUE@h
805
ori r4, r4, CONFIG_SYS_ICACHE_SACR_VALUE@l
809
/* Set-up dcache cacheability. */
810
lis r4, CONFIG_SYS_DCACHE_SACR_VALUE@h
811
ori r4, r4, CONFIG_SYS_DCACHE_SACR_VALUE@l
814
#if !(defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))\
815
&& !defined (CONFIG_XILINX_405)
816
/*----------------------------------------------------------------------- */
817
/* Tune the speed and size for flash CS0 */
818
/*----------------------------------------------------------------------- */
819
bl ext_bus_cntlr_init
822
#if !(defined(CONFIG_SYS_INIT_DCACHE_CS) || defined(CONFIG_SYS_TEMP_STACK_OCM))
824
* For boards that don't have OCM and can't use the data cache
825
* for their primordial stack, setup stack here directly after the
826
* SDRAM is initialized in ext_bus_cntlr_init.
828
lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
829
ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */
831
li r0, 0 /* Make room for stack frame header and */
832
stwu r0, -4(r1) /* clear final stack frame so that */
833
stwu r0, -4(r1) /* stack backtraces terminate cleanly */
835
* Set up a dummy frame to store reset vector as return address.
836
* this causes stack underflow to reset board.
838
stwu r1, -8(r1) /* Save back chain and move SP */
839
lis r0, RESET_VECTOR@h /* Address of reset vector */
840
ori r0, r0, RESET_VECTOR@l
841
stwu r1, -8(r1) /* Save back chain and move SP */
842
stw r0, +12(r1) /* Save return addr (underflow vect) */
843
#endif /* !(CONFIG_SYS_INIT_DCACHE_CS || !CONFIG_SYS_TEM_STACK_OCM) */
845
#if defined(CONFIG_405EP)
846
/*----------------------------------------------------------------------- */
847
/* DMA Status, clear to come up clean */
848
/*----------------------------------------------------------------------- */
849
addis r3,r0, 0xFFFF /* Clear all existing DMA status */
853
bl ppc405ep_init /* do ppc405ep specific init */
854
#endif /* CONFIG_405EP */
856
#if defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE)
857
#if defined(CONFIG_405EZ)
858
/********************************************************************
859
* Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
860
*******************************************************************/
862
* We can map the OCM on the PLB3, so map it at
863
* CONFIG_SYS_OCM_DATA_ADDR + 0x8000
865
lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
866
ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
867
ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
868
mtdcr OCM0_PLBCR1,r3 /* Set PLB Access */
869
ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
870
mtdcr OCM0_PLBCR2,r3 /* Set PLB Access */
873
lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
874
ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
875
ori r3,r3,0x0270 /* 16K for Bank 1, R/W/Enable */
876
mtdcr OCM0_DSRC1, r3 /* Set Data Side */
877
mtdcr OCM0_ISRC1, r3 /* Set Instruction Side */
878
ori r3,r3,0x4000 /* Add 0x4000 for bank 2 */
879
mtdcr OCM0_DSRC2, r3 /* Set Data Side */
880
mtdcr OCM0_ISRC2, r3 /* Set Instruction Side */
881
addis r3,0,0x0800 /* OCM Data Parity Disable - 1 Wait State */
885
#else /* CONFIG_405EZ */
886
/********************************************************************
887
* Setup OCM - On Chip Memory
888
*******************************************************************/
892
mfdcr r3, OCM0_ISCNTL /* get instr-side IRAM config */
893
mfdcr r4, OCM0_DSCNTL /* get data-side IRAM config */
894
and r3, r3, r0 /* disable data-side IRAM */
895
and r4, r4, r0 /* disable data-side IRAM */
896
mtdcr OCM0_ISCNTL, r3 /* set instr-side IRAM config */
897
mtdcr OCM0_DSCNTL, r4 /* set data-side IRAM config */
900
lis r3,CONFIG_SYS_OCM_DATA_ADDR@h /* OCM location */
901
ori r3,r3,CONFIG_SYS_OCM_DATA_ADDR@l
903
addis r4, 0, 0xC000 /* OCM data area enabled */
904
mtdcr OCM0_DSCNTL, r4
906
#endif /* CONFIG_405EZ */
909
/*----------------------------------------------------------------------- */
910
/* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
911
/*----------------------------------------------------------------------- */
912
#ifdef CONFIG_SYS_INIT_DCACHE_CS
914
mtdcr EBC0_CFGADDR, r4
915
lis r4, CONFIG_SYS_INIT_DCACHE_PBxAR@h
916
ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxAR@l
917
mtdcr EBC0_CFGDATA, r4
920
mtdcr EBC0_CFGADDR, r4
921
lis r4, CONFIG_SYS_INIT_DCACHE_PBxCR@h
922
ori r4, r4, CONFIG_SYS_INIT_DCACHE_PBxCR@l
923
mtdcr EBC0_CFGDATA, r4
926
* Enable the data cache for the 128MB storage access control region
927
* at CONFIG_SYS_INIT_RAM_ADDR.
930
oris r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
931
ori r4, r4, PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
935
* Preallocate data cache lines to be used to avoid a subsequent
936
* cache miss and an ensuing machine check exception when exceptions
941
lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
942
ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
944
lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
945
ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
948
* Convert the size, in bytes, to the number of cache lines/blocks
951
clrlwi. r5, r4, (32 - L1_CACHE_SHIFT)
952
srwi r5, r4, L1_CACHE_SHIFT
958
/* Preallocate the computed number of cache blocks. */
959
..alloc_dcache_block:
961
addi r3, r3, L1_CACHE_BYTES
962
bdnz ..alloc_dcache_block
966
* Load the initial stack pointer and data area and convert the size,
967
* in bytes, to the number of words to initialize to a known value.
969
lis r1, CONFIG_SYS_INIT_RAM_ADDR@h
970
ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l
972
lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h
973
ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l
976
lis r2, CONFIG_SYS_INIT_RAM_ADDR@h
977
ori r2, r2, CONFIG_SYS_INIT_RAM_SIZE@l
979
lis r4, CONFIG_SYS_INIT_RAM_PATTERN@h
980
ori r4, r4, CONFIG_SYS_INIT_RAM_PATTERN@l
987
* Make room for stack frame header and clear final stack frame so
988
* that stack backtraces terminate cleanly.
994
* Set up a dummy frame to store reset vector as return address.
995
* this causes stack underflow to reset board.
997
stwu r1, -8(r1) /* Save back chain and move SP */
998
addis r0, 0, RESET_VECTOR@h /* Address of reset vector */
999
ori r0, r0, RESET_VECTOR@l
1000
stwu r1, -8(r1) /* Save back chain and move SP */
1001
stw r0, +12(r1) /* Save return addr (underflow vect) */
1003
#elif defined(CONFIG_SYS_TEMP_STACK_OCM) && \
1004
(defined(CONFIG_SYS_OCM_DATA_ADDR) && defined(CONFIG_SYS_OCM_DATA_SIZE))
1009
/* Set up Stack at top of OCM */
1010
lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h
1011
ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l
1013
/* Set up a zeroized stack frame so that backtrace works right */
1019
* Set up a dummy frame to store reset vector as return address.
1020
* this causes stack underflow to reset board.
1022
stwu r1, -8(r1) /* Save back chain and move SP */
1023
lis r0, RESET_VECTOR@h /* Address of reset vector */
1024
ori r0, r0, RESET_VECTOR@l
1025
stwu r1, -8(r1) /* Save back chain and move SP */
1026
stw r0, +12(r1) /* Save return addr (underflow vect) */
1027
#endif /* CONFIG_SYS_INIT_DCACHE_CS */
1029
GET_GOT /* initialize GOT access */
1031
bl cpu_init_f /* run low-level CPU init code (from Flash) */
1033
bl board_init_f /* run first part of init code (from Flash) */
1034
/* NOTREACHED - board_init_f() does not return */
1036
#endif /* CONFIG_405GP || CONFIG_405 || CONFIG_405EP */
1037
/*----------------------------------------------------------------------- */
1040
#if !defined(CONFIG_SPL_BUILD)
1042
* This code finishes saving the registers to the exception frame
1043
* and jumps to the appropriate handler for the exception.
1044
* Register r21 is pointer into trap frame, r1 has new stack pointer.
1046
.globl transfer_to_handler
1047
transfer_to_handler:
1057
andi. r24,r23,0x3f00 /* get vector offset */
1061
mtspr SPRG2,r22 /* r1 is now kernel sp */
1062
lwz r24,0(r23) /* virtual address of handler */
1063
lwz r23,4(r23) /* where to go when done */
1068
rfi /* jump to handler, enable MMU */
1071
mfmsr r28 /* Disable interrupts */
1075
SYNC /* Some chip revs need this... */
1090
lwz r2,_NIP(r1) /* Restore environment */
1101
mfmsr r28 /* Disable interrupts */
1105
SYNC /* Some chip revs need this... */
1120
lwz r2,_NIP(r1) /* Restore environment */
1132
mfmsr r28 /* Disable interrupts */
1136
SYNC /* Some chip revs need this... */
1151
lwz r2,_NIP(r1) /* Restore environment */
1153
mtspr SPRN_MCSRR0,r2
1154
mtspr SPRN_MCSRR1,r0
1160
#endif /* CONFIG_440 */
1168
/*------------------------------------------------------------------------------- */
1169
/* Function: out16 */
1170
/* Description: Output 16 bits */
1171
/*------------------------------------------------------------------------------- */
1177
/*------------------------------------------------------------------------------- */
1178
/* Function: out16r */
1179
/* Description: Byte reverse and output 16 bits */
1180
/*------------------------------------------------------------------------------- */
1186
/*------------------------------------------------------------------------------- */
1187
/* Function: out32r */
1188
/* Description: Byte reverse and output 32 bits */
1189
/*------------------------------------------------------------------------------- */
1195
/*------------------------------------------------------------------------------- */
1196
/* Function: in16 */
1197
/* Description: Input 16 bits */
1198
/*------------------------------------------------------------------------------- */
1204
/*------------------------------------------------------------------------------- */
1205
/* Function: in16r */
1206
/* Description: Input 16 bits and byte reverse */
1207
/*------------------------------------------------------------------------------- */
1213
/*------------------------------------------------------------------------------- */
1214
/* Function: in32r */
1215
/* Description: Input 32 bits and byte reverse */
1216
/*------------------------------------------------------------------------------- */
1222
#if !defined(CONFIG_SPL_BUILD)
1224
* void relocate_code (addr_sp, gd, addr_moni)
1226
* This "function" does not return, instead it continues in RAM
1227
* after relocating the monitor code.
1229
* r3 = Relocated stack pointer
1230
* r4 = Relocated global data pointer
1231
* r5 = Relocated text pointer
1233
.globl relocate_code
1235
#if defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS)
1237
* We need to flush the initial global data (gd_t) and bd_info
1238
* before the dcache will be invalidated.
1241
/* Save registers */
1247
* Flush complete dcache, this is faster than flushing the
1248
* ranges for global_data and bd_info instead.
1252
#if defined(CONFIG_SYS_INIT_DCACHE_CS)
1254
* Undo the earlier data cache set-up for the primordial stack and
1255
* data area. First, invalidate the data cache and then disable data
1256
* cacheability for that area. Finally, restore the EBC values, if
1260
/* Invalidate the primordial stack and data area in cache */
1261
lis r3, CONFIG_SYS_INIT_RAM_ADDR@h
1262
ori r3, r3, CONFIG_SYS_INIT_RAM_ADDR@l
1264
lis r4, CONFIG_SYS_INIT_RAM_SIZE@h
1265
ori r4, r4, CONFIG_SYS_INIT_RAM_SIZE@l
1268
bl invalidate_dcache_range
1270
/* Disable cacheability for the region */
1272
lis r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@h
1273
ori r4, r4, ~PPC_128MB_SACR_VALUE(CONFIG_SYS_INIT_RAM_ADDR)@l
1277
/* Restore the EBC parameters */
1279
mtdcr EBC0_CFGADDR, r3
1281
ori r3, r3, PBxAP_VAL@l
1282
mtdcr EBC0_CFGDATA, r3
1285
mtdcr EBC0_CFGADDR, r3
1287
ori r3, r3, PBxCR_VAL@l
1288
mtdcr EBC0_CFGDATA, r3
1289
#endif /* defined(CONFIG_SYS_INIT_DCACHE_CS) */
1291
/* Restore registers */
1295
#endif /* defined(CONFIG_4xx_DCACHE) || defined(CONFIG_SYS_INIT_DCACHE_CS) */
1297
#ifdef CONFIG_SYS_INIT_RAM_DCACHE
1299
* Unlock the previously locked d-cache
1303
/* set TFLOOR/NFLOOR to 0 again */
1320
/* Invalidate data cache, now no longer our stack */
1324
#endif /* CONFIG_SYS_INIT_RAM_DCACHE */
1327
* On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
1328
* to speed up the boot process. Now this cache needs to be disabled.
1330
#if defined(CONFIG_440)
1331
/* Clear all potential pending exceptions */
1334
addi r1,r0,CONFIG_SYS_TLB_FOR_BOOT_FLASH /* Use defined TLB */
1335
tlbre r0,r1,0x0002 /* Read contents */
1336
ori r0,r0,0x0c00 /* Or in the inhibit, write through bit */
1337
tlbwe r0,r1,0x0002 /* Save it out */
1340
#endif /* defined(CONFIG_440) */
1341
mr r1, r3 /* Set new stack pointer */
1342
mr r9, r4 /* Save copy of Init Data pointer */
1343
mr r10, r5 /* Save copy of Destination Address */
1346
mr r3, r5 /* Destination Address */
1347
lis r4, CONFIG_SYS_MONITOR_BASE@h /* Source Address */
1348
ori r4, r4, CONFIG_SYS_MONITOR_BASE@l
1349
lwz r5, GOT(__init_end)
1351
li r6, L1_CACHE_BYTES /* Cache Line Size */
1356
* New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
1362
/* First our own GOT */
1364
/* then the one used by the C code */
1374
beq cr1,4f /* In place copy is not necessary */
1375
beq 7f /* Protect against 0 count */
1394
* Now flush the cache: note that we must start from a cache aligned
1395
* address. Otherwise we might miss one cache line.
1399
beq 7f /* Always flush prefetch queue in any case */
1407
sync /* Wait for all dcbst to complete on bus */
1413
7: sync /* Wait for all icbi to complete on bus */
1417
* We are done. Do not return, instead branch to second part of board
1418
* initialization, now running from RAM.
1421
addi r0, r10, in_ram - _start + _START_OFFSET
1423
blr /* NEVER RETURNS! */
1428
* Relocation Function, r12 point to got2+0x8000
1430
* Adjust got2 pointers, no need to check for 0, this code
1431
* already puts a few entries in the table.
1433
li r0,__got2_entries@sectoff@l
1434
la r3,GOT(_GOT2_TABLE_)
1435
lwz r11,GOT(_GOT2_TABLE_)
1447
* Now adjust the fixups and the pointers to the fixups
1448
* in case we need to move ourselves again.
1450
li r0,__fixup_entries@sectoff@l
1451
lwz r3,GOT(_FIXUP_TABLE_)
1467
* Now clear BSS segment
1469
lwz r3,GOT(__bss_start)
1470
lwz r4,GOT(__bss_end)
1492
mr r3, r9 /* Init Data pointer */
1493
mr r4, r10 /* Destination Address */
1497
* Copy exception vector code to low memory
1500
* r7: source address, r8: end address, r9: target address
1504
mflr r4 /* save link register */
1506
lwz r7, GOT(_start_of_vectors)
1507
lwz r8, GOT(_end_of_vectors)
1509
li r9, 0x100 /* reset vector always at 0x100 */
1512
bgelr /* return if r7>=r8 - just in case */
1522
* relocate `hdlr' and `int_return' entries
1524
li r7, .L_MachineCheck - _start + _START_OFFSET
1525
li r8, Alignment - _start + _START_OFFSET
1528
addi r7, r7, 0x100 /* next exception vector */
1532
li r7, .L_Alignment - _start + _START_OFFSET
1535
li r7, .L_ProgramCheck - _start + _START_OFFSET
1539
li r7, .L_FPUnavailable - _start + _START_OFFSET
1542
li r7, .L_Decrementer - _start + _START_OFFSET
1545
li r7, .L_APU - _start + _START_OFFSET
1548
li r7, .L_InstructionTLBError - _start + _START_OFFSET
1551
li r7, .L_DataTLBError - _start + _START_OFFSET
1553
#else /* CONFIG_440 */
1554
li r7, .L_PIT - _start + _START_OFFSET
1557
li r7, .L_InstructionTLBMiss - _start + _START_OFFSET
1560
li r7, .L_DataTLBMiss - _start + _START_OFFSET
1562
#endif /* CONFIG_440 */
1564
li r7, .L_DebugBreakpoint - _start + _START_OFFSET
1567
#if !defined(CONFIG_440)
1568
addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1569
oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1570
mtmsr r7 /* change MSR */
1573
b __440_msr_continue
1576
addi r7,r0,0x1000 /* set ME bit (Machine Exceptions) */
1577
oris r7,r7,0x0002 /* set CE bit (Critical Exceptions) */
1585
mtlr r4 /* restore link register */
1587
#endif /* CONFIG_SPL_BUILD */
1589
#if defined(CONFIG_440)
1590
/*----------------------------------------------------------------------------+
1592
+----------------------------------------------------------------------------*/
1593
function_prolog(dcbz_area)
1594
rlwinm. r5,r4,0,27,31
1595
rlwinm r5,r4,27,5,31
1604
function_epilog(dcbz_area)
1605
#endif /* CONFIG_440 */
1606
#endif /* CONFIG_SPL_BUILD */
1608
/*------------------------------------------------------------------------------- */
1610
/* Description: Input 8 bits */
1611
/*------------------------------------------------------------------------------- */
1617
/*------------------------------------------------------------------------------- */
1618
/* Function: out8 */
1619
/* Description: Output 8 bits */
1620
/*------------------------------------------------------------------------------- */
1626
/*------------------------------------------------------------------------------- */
1627
/* Function: out32 */
1628
/* Description: Output 32 bits */
1629
/*------------------------------------------------------------------------------- */
1635
/*------------------------------------------------------------------------------- */
1636
/* Function: in32 */
1637
/* Description: Input 32 bits */
1638
/*------------------------------------------------------------------------------- */
1644
/**************************************************************************/
1645
/* PPC405EP specific stuff */
1646
/**************************************************************************/
1650
#ifdef CONFIG_BUBINGA
1652
* Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
1653
* function) to support FPGA and NVRAM accesses below.
1656
lis r3,GPIO0_OSRH@h /* config GPIO output select */
1657
ori r3,r3,GPIO0_OSRH@l
1658
lis r4,CONFIG_SYS_GPIO0_OSRH@h
1659
ori r4,r4,CONFIG_SYS_GPIO0_OSRH@l
1662
ori r3,r3,GPIO0_OSRL@l
1663
lis r4,CONFIG_SYS_GPIO0_OSRL@h
1664
ori r4,r4,CONFIG_SYS_GPIO0_OSRL@l
1667
lis r3,GPIO0_ISR1H@h /* config GPIO input select */
1668
ori r3,r3,GPIO0_ISR1H@l
1669
lis r4,CONFIG_SYS_GPIO0_ISR1H@h
1670
ori r4,r4,CONFIG_SYS_GPIO0_ISR1H@l
1672
lis r3,GPIO0_ISR1L@h
1673
ori r3,r3,GPIO0_ISR1L@l
1674
lis r4,CONFIG_SYS_GPIO0_ISR1L@h
1675
ori r4,r4,CONFIG_SYS_GPIO0_ISR1L@l
1678
lis r3,GPIO0_TSRH@h /* config GPIO three-state select */
1679
ori r3,r3,GPIO0_TSRH@l
1680
lis r4,CONFIG_SYS_GPIO0_TSRH@h
1681
ori r4,r4,CONFIG_SYS_GPIO0_TSRH@l
1684
ori r3,r3,GPIO0_TSRL@l
1685
lis r4,CONFIG_SYS_GPIO0_TSRL@h
1686
ori r4,r4,CONFIG_SYS_GPIO0_TSRL@l
1689
lis r3,GPIO0_TCR@h /* config GPIO driver output enables */
1690
ori r3,r3,GPIO0_TCR@l
1691
lis r4,CONFIG_SYS_GPIO0_TCR@h
1692
ori r4,r4,CONFIG_SYS_GPIO0_TCR@l
1695
li r3,PB1AP /* program EBC bank 1 for RTC access */
1696
mtdcr EBC0_CFGADDR,r3
1697
lis r3,CONFIG_SYS_EBC_PB1AP@h
1698
ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
1699
mtdcr EBC0_CFGDATA,r3
1701
mtdcr EBC0_CFGADDR,r3
1702
lis r3,CONFIG_SYS_EBC_PB1CR@h
1703
ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
1704
mtdcr EBC0_CFGDATA,r3
1706
li r3,PB1AP /* program EBC bank 1 for RTC access */
1707
mtdcr EBC0_CFGADDR,r3
1708
lis r3,CONFIG_SYS_EBC_PB1AP@h
1709
ori r3,r3,CONFIG_SYS_EBC_PB1AP@l
1710
mtdcr EBC0_CFGDATA,r3
1712
mtdcr EBC0_CFGADDR,r3
1713
lis r3,CONFIG_SYS_EBC_PB1CR@h
1714
ori r3,r3,CONFIG_SYS_EBC_PB1CR@l
1715
mtdcr EBC0_CFGDATA,r3
1717
li r3,PB4AP /* program EBC bank 4 for FPGA access */
1718
mtdcr EBC0_CFGADDR,r3
1719
lis r3,CONFIG_SYS_EBC_PB4AP@h
1720
ori r3,r3,CONFIG_SYS_EBC_PB4AP@l
1721
mtdcr EBC0_CFGDATA,r3
1723
mtdcr EBC0_CFGADDR,r3
1724
lis r3,CONFIG_SYS_EBC_PB4CR@h
1725
ori r3,r3,CONFIG_SYS_EBC_PB4CR@l
1726
mtdcr EBC0_CFGDATA,r3
1730
!-----------------------------------------------------------------------
1731
! Check to see if chip is in bypass mode.
1732
! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
1733
! CPU reset Otherwise, skip this step and keep going.
1734
! Note: Running BIOS in bypass mode is not supported since PLB speed
1735
! will not be fast enough for the SDRAM (min 66MHz)
1736
!-----------------------------------------------------------------------
1738
mfdcr r5, CPC0_PLLMR1
1739
rlwinm r4,r5,1,0x1 /* get system clock source (SSCS) */
1742
beq pll_done /* if SSCS =b'1' then PLL has */
1743
/* already been set */
1744
/* and CPU has been reset */
1745
/* so skip to next section */
1747
#ifdef CONFIG_BUBINGA
1749
!-----------------------------------------------------------------------
1750
! Read NVRAM to get value to write in PLLMR.
1751
! If value has not been correctly saved, write default value
1752
! Default config values (assuming on-board 33MHz SYS_CLK) are above.
1753
! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
1755
! WARNING: This code assumes the first three words in the nvram_t
1756
! structure in openbios.h. Changing the beginning of
1757
! the structure will break this code.
1759
!-----------------------------------------------------------------------
1761
addis r3,0,NVRAM_BASE@h
1762
addi r3,r3,NVRAM_BASE@l
1765
addis r5,0,NVRVFY1@h
1766
addi r5,r5,NVRVFY1@l
1767
cmp cr0,0,r4,r5 /* Compare 1st NVRAM Magic number*/
1771
addis r5,0,NVRVFY2@h
1772
addi r5,r5,NVRVFY2@l
1773
cmp cr0,0,r4,r5 /* Compare 2 NVRAM Magic number */
1775
addi r3,r3,8 /* Skip over conf_size */
1776
lwz r4, 4(r3) /* Load PLLMR1 value from NVRAM */
1777
lwz r3, 0(r3) /* Load PLLMR0 value from NVRAM */
1778
rlwinm r5,r4,1,0x1 /* get system clock source (SSCS) */
1779
cmpi cr0,0,r5,1 /* See if PLL is locked */
1782
#endif /* CONFIG_BUBINGA */
1786
andi. r5, r4, CPC0_BOOT_SEP@l
1787
bne strap_1 /* serial eeprom present */
1788
addis r5,0,CPLD_REG0_ADDR@h
1789
ori r5,r5,CPLD_REG0_ADDR@l
1792
#endif /* CONFIG_TAIHU */
1794
#if defined(CONFIG_ZEUS)
1796
andi. r5, r4, CPC0_BOOT_SEP@l
1797
bne strap_1 /* serial eeprom present */
1804
mfdcr r3, CPC0_PLLMR0
1805
mfdcr r4, CPC0_PLLMR1
1809
addis r3,0,PLLMR0_DEFAULT@h /* PLLMR0 default value */
1810
ori r3,r3,PLLMR0_DEFAULT@l /* */
1811
addis r4,0,PLLMR1_DEFAULT@h /* PLLMR1 default value */
1812
ori r4,r4,PLLMR1_DEFAULT@l /* */
1817
addis r3,0,PLLMR0_DEFAULT_PCI66@h
1818
ori r3,r3,PLLMR0_DEFAULT_PCI66@l
1819
addis r4,0,PLLMR1_DEFAULT_PCI66@h
1820
ori r4,r4,PLLMR1_DEFAULT_PCI66@l
1823
mfdcr r3, CPC0_PLLMR0
1824
mfdcr r4, CPC0_PLLMR1
1825
#endif /* CONFIG_TAIHU */
1828
b pll_write /* Write the CPC0_PLLMR with new value */
1832
!-----------------------------------------------------------------------
1833
! Clear Soft Reset Register
1834
! This is needed to enable PCI if not booting from serial EPROM
1835
!-----------------------------------------------------------------------
1845
blr /* return to main code */
1848
!-----------------------------------------------------------------------------
1849
! Function: pll_write
1850
! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
1852
! 1. Pll is first disabled (de-activated by putting in bypass mode)
1854
! 3. Clock dividers are set while PLL is held in reset and bypassed
1855
! 4. PLL Reset is cleared
1856
! 5. Wait 100us for PLL to lock
1857
! 6. A core reset is performed
1858
! Input: r3 = Value to write to CPC0_PLLMR0
1859
! Input: r4 = Value to write to CPC0_PLLMR1
1861
!-----------------------------------------------------------------------------
1867
ori r5,r5,0x0101 /* Stop the UART clocks */
1868
mtdcr CPC0_UCR,r5 /* Before changing PLL */
1870
mfdcr r5, CPC0_PLLMR1
1871
rlwinm r5,r5,0,0x7FFFFFFF /* Disable PLL */
1872
mtdcr CPC0_PLLMR1,r5
1873
oris r5,r5,0x4000 /* Set PLL Reset */
1874
mtdcr CPC0_PLLMR1,r5
1876
mtdcr CPC0_PLLMR0,r3 /* Set clock dividers */
1877
rlwinm r5,r4,0,0x3FFFFFFF /* Reset & Bypass new PLL dividers */
1878
oris r5,r5,0x4000 /* Set PLL Reset */
1879
mtdcr CPC0_PLLMR1,r5 /* Set clock dividers */
1880
rlwinm r5,r5,0,0xBFFFFFFF /* Clear PLL Reset */
1881
mtdcr CPC0_PLLMR1,r5
1884
! Wait min of 100us for PLL to lock.
1885
! See CMOS 27E databook for more info.
1886
! At 200MHz, that means waiting 20,000 instructions
1888
addi r3,0,20000 /* 2000 = 0x4e20 */
1893
oris r5,r5,0x8000 /* Enable PLL */
1894
mtdcr CPC0_PLLMR1,r5 /* Engage */
1897
* Reset CPU to guarantee timings are OK
1898
* Not sure if this is needed...
1901
mtspr SPRN_DBCR0,r3 /* This will cause a CPU core reset, and */
1902
/* execution will continue from the poweron */
1903
/* vector of 0xfffffffc */
1904
#endif /* CONFIG_405EP */
1906
#if defined(CONFIG_440)
1907
/*----------------------------------------------------------------------------+
1909
+----------------------------------------------------------------------------*/
1910
function_prolog(mttlb3)
1913
function_epilog(mttlb3)
1915
/*----------------------------------------------------------------------------+
1917
+----------------------------------------------------------------------------*/
1918
function_prolog(mftlb3)
1921
function_epilog(mftlb3)
1923
/*----------------------------------------------------------------------------+
1925
+----------------------------------------------------------------------------*/
1926
function_prolog(mttlb2)
1929
function_epilog(mttlb2)
1931
/*----------------------------------------------------------------------------+
1933
+----------------------------------------------------------------------------*/
1934
function_prolog(mftlb2)
1937
function_epilog(mftlb2)
1939
/*----------------------------------------------------------------------------+
1941
+----------------------------------------------------------------------------*/
1942
function_prolog(mttlb1)
1945
function_epilog(mttlb1)
1947
/*----------------------------------------------------------------------------+
1949
+----------------------------------------------------------------------------*/
1950
function_prolog(mftlb1)
1953
function_epilog(mftlb1)
1954
#endif /* CONFIG_440 */