start.S 26.1 KB
Newer Older
W
wdenk 已提交
1
/*
2
 * Copyright 2004, 2007-2010 Freescale Semiconductor, Inc.
W
wdenk 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 * Copyright (C) 2003  Motorola,Inc.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/* U-Boot Startup Code for Motorola 85xx PowerPC based Embedded Boards
 *
 * The processor starts at 0xfffffffc and the code is first executed in the
 * last 4K page(0xfffff000-0xffffffff) in flash/rom.
 *
 */

#include <config.h>
#include <mpc85xx.h>
33
#include <timestamp.h>
W
wdenk 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
#include <version.h>

#define _LINUX_CONFIG_H 1	/* avoid reading Linux autoconf.h file	*/

#include <ppc_asm.tmpl>
#include <ppc_defs.h>

#include <asm/cache.h>
#include <asm/mmu.h>

#ifndef	 CONFIG_IDENT_STRING
#define	 CONFIG_IDENT_STRING ""
#endif

#undef	MSR_KERNEL
49
#define MSR_KERNEL ( MSR_ME )	/* Machine Check */
W
wdenk 已提交
50 51 52 53

/*
 * Set up GOT: Global Offset Table
 *
54
 * Use r12 to access the GOT
W
wdenk 已提交
55 56 57 58 59
 */
	START_GOT
	GOT_ENTRY(_GOT2_TABLE_)
	GOT_ENTRY(_FIXUP_TABLE_)

60
#ifndef CONFIG_NAND_SPL
W
wdenk 已提交
61 62 63 64
	GOT_ENTRY(_start)
	GOT_ENTRY(_start_of_vectors)
	GOT_ENTRY(_end_of_vectors)
	GOT_ENTRY(transfer_to_handler)
65
#endif
W
wdenk 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

	GOT_ENTRY(__init_end)
	GOT_ENTRY(_end)
	GOT_ENTRY(__bss_start)
	END_GOT

/*
 * e500 Startup -- after reset only the last 4KB of the effective
 * address space is mapped in the MMU L2 TLB1 Entry0. The .bootpg
 * section is located at THIS LAST page and basically does three
 * things: clear some registers, set up exception tables and
 * add more TLB entries for 'larger spaces'(e.g. the boot rom) to
 * continue the boot procedure.

 * Once the boot rom is mapped by TLB entries we can proceed
 * with normal startup.
 *
 */

85 86
	.section .bootpg,"ax"
	.globl _start_e500
W
wdenk 已提交
87 88

_start_e500:
89

90
/* clear registers/arrays not reset by hardware */
W
wdenk 已提交
91

92 93 94
	/* L1 */
	li	r0,2
	mtspr	L1CSR0,r0	/* invalidate d-cache */
W
Wolfgang Denk 已提交
95
	mtspr	L1CSR1,r0	/* invalidate i-cache */
W
wdenk 已提交
96 97 98 99

	mfspr	r1,DBSR
	mtspr	DBSR,r1		/* Clear all valid bits */

100 101 102 103
	/*
	 *	Enable L1 Caches early
	 *
	 */
W
wdenk 已提交
104

105 106 107 108 109 110
#if defined(CONFIG_E500MC) && defined(CONFIG_SYS_CACHE_STASHING)
	/* set stash id to (coreID) * 2 + 32 + L1 CT (0) */
	li	r2,(32 + 0)
	mtspr	L1CSR2,r2
#endif

111 112 113 114 115 116 117 118 119 120 121 122
	/* Enable/invalidate the I-Cache */
	lis	r2,(L1CSR1_ICFI|L1CSR1_ICLFR)@h
	ori	r2,r2,(L1CSR1_ICFI|L1CSR1_ICLFR)@l
	mtspr	SPRN_L1CSR1,r2
1:
	mfspr	r3,SPRN_L1CSR1
	and.	r1,r3,r2
	bne	1b

	lis	r3,(L1CSR1_CPE|L1CSR1_ICE)@h
	ori	r3,r3,(L1CSR1_CPE|L1CSR1_ICE)@l
	mtspr	SPRN_L1CSR1,r3
123
	isync
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
2:
	mfspr	r3,SPRN_L1CSR1
	andi.	r1,r3,L1CSR1_ICE@l
	beq	2b

	/* Enable/invalidate the D-Cache */
	lis	r2,(L1CSR0_DCFI|L1CSR0_DCLFR)@h
	ori	r2,r2,(L1CSR0_DCFI|L1CSR0_DCLFR)@l
	mtspr	SPRN_L1CSR0,r2
1:
	mfspr	r3,SPRN_L1CSR0
	and.	r1,r3,r2
	bne	1b

	lis	r3,(L1CSR0_CPE|L1CSR0_DCE)@h
	ori	r3,r3,(L1CSR0_CPE|L1CSR0_DCE)@l
	mtspr	SPRN_L1CSR0,r3
W
wdenk 已提交
141
	isync
142 143 144 145
2:
	mfspr	r3,SPRN_L1CSR0
	andi.	r1,r3,L1CSR0_DCE@l
	beq	2b
W
wdenk 已提交
146 147

	/* Setup interrupt vectors */
148
	lis	r1,CONFIG_SYS_TEXT_BASE@h
149
	mtspr	IVPR,r1
W
wdenk 已提交
150

W
wdenk 已提交
151
	li	r1,0x0100
W
wdenk 已提交
152
	mtspr	IVOR0,r1	/* 0: Critical input */
W
wdenk 已提交
153
	li	r1,0x0200
W
wdenk 已提交
154
	mtspr	IVOR1,r1	/* 1: Machine check */
W
wdenk 已提交
155
	li	r1,0x0300
W
wdenk 已提交
156
	mtspr	IVOR2,r1	/* 2: Data storage */
W
wdenk 已提交
157
	li	r1,0x0400
W
wdenk 已提交
158 159 160 161 162 163 164 165 166
	mtspr	IVOR3,r1	/* 3: Instruction storage */
	li	r1,0x0500
	mtspr	IVOR4,r1	/* 4: External interrupt */
	li	r1,0x0600
	mtspr	IVOR5,r1	/* 5: Alignment */
	li	r1,0x0700
	mtspr	IVOR6,r1	/* 6: Program check */
	li	r1,0x0800
	mtspr	IVOR7,r1	/* 7: floating point unavailable */
W
wdenk 已提交
167
	li	r1,0x0900
W
wdenk 已提交
168 169
	mtspr	IVOR8,r1	/* 8: System call */
	/* 9: Auxiliary processor unavailable(unsupported) */
W
wdenk 已提交
170
	li	r1,0x0a00
W
wdenk 已提交
171
	mtspr	IVOR10,r1	/* 10: Decrementer */
W
wdenk 已提交
172 173 174
	li	r1,0x0b00
	mtspr	IVOR11,r1	/* 11: Interval timer */
	li	r1,0x0c00
175 176
	mtspr	IVOR12,r1	/* 12: Watchdog timer */
	li	r1,0x0d00
W
wdenk 已提交
177
	mtspr	IVOR13,r1	/* 13: Data TLB error */
W
wdenk 已提交
178
	li	r1,0x0e00
W
wdenk 已提交
179
	mtspr	IVOR14,r1	/* 14: Instruction TLB error */
W
wdenk 已提交
180
	li	r1,0x0f00
W
wdenk 已提交
181 182 183
	mtspr	IVOR15,r1	/* 15: Debug */

	/* Clear and set up some registers. */
184
	li      r0,0x0000
W
wdenk 已提交
185 186 187 188 189 190 191 192 193 194
	lis	r1,0xffff
	mtspr	DEC,r0			/* prevent dec exceptions */
	mttbl	r0			/* prevent fit & wdt exceptions */
	mttbu	r0
	mtspr	TSR,r1			/* clear all timer exception status */
	mtspr	TCR,r0			/* disable all */
	mtspr	ESR,r0			/* clear exception syndrome register */
	mtspr	MCSR,r0			/* machine check syndrome register */
	mtxer	r0			/* clear integer exception register */

195 196 197 198
#ifdef CONFIG_SYS_BOOK3E_HV
	mtspr	MAS8,r0			/* make sure MAS8 is clear */
#endif

W
wdenk 已提交
199
	/* Enable Time Base and Select Time Base Clock */
W
wdenk 已提交
200
	lis	r0,HID0_EMCP@h		/* Enable machine check */
201
#if defined(CONFIG_ENABLE_36BIT_PHYS)
202
	ori	r0,r0,HID0_ENMAS7@l	/* Enable MAS7 */
203
#endif
204
#ifndef CONFIG_E500MC
205
	ori	r0,r0,HID0_TBEN@l	/* Enable Timebase */
206
#endif
W
wdenk 已提交
207 208
	mtspr	HID0,r0

K
Kumar Gala 已提交
209
#ifndef CONFIG_E500MC
210
	li	r0,(HID1_ASTME|HID1_ABE)@l	/* Addr streaming & broadcast */
211 212 213 214 215 216 217
	mfspr	r3,PVR
	andi.	r3,r3, 0xff
	cmpwi	r3,0x50@l	/* if we are rev 5.0 or greater set MBDD */
	blt 1f
	/* Set MBDD bit also */
	ori r0, r0, HID1_MBDD@l
1:
W
wdenk 已提交
218
	mtspr	HID1,r0
K
Kumar Gala 已提交
219
#endif
W
wdenk 已提交
220 221 222

	/* Enable Branch Prediction */
#if defined(CONFIG_BTB)
223 224 225
	lis	r0,BUCSR_ENABLE@h
	ori	r0,r0,BUCSR_ENABLE@l
	mtspr	SPRN_BUCSR,r0
W
wdenk 已提交
226 227
#endif

228
#if defined(CONFIG_SYS_INIT_DBCR)
W
wdenk 已提交
229 230
	lis	r1,0xffff
	ori	r1,r1,0xffff
W
wdenk 已提交
231
	mtspr	DBSR,r1			/* Clear all status bits */
232 233
	lis	r0,CONFIG_SYS_INIT_DBCR@h	/* DBCR0[IDM] must be set */
	ori	r0,r0,CONFIG_SYS_INIT_DBCR@l
W
wdenk 已提交
234
	mtspr	DBCR0,r0
W
wdenk 已提交
235 236
#endif

H
Haiying Wang 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
#ifdef CONFIG_MPC8569
#define CONFIG_SYS_LBC_ADDR (CONFIG_SYS_CCSRBAR_DEFAULT + 0x5000)
#define CONFIG_SYS_LBCR_ADDR (CONFIG_SYS_LBC_ADDR + 0xd0)

	/* MPC8569 Rev.0 silcon needs to set bit 13 of LBCR to allow elBC to
	 * use address space which is more than 12bits, and it must be done in
	 * the 4K boot page. So we set this bit here.
	 */

	/* create a temp mapping TLB0[0] for LBCR  */
	lis     r6,FSL_BOOKE_MAS0(0, 0, 0)@h
	ori     r6,r6,FSL_BOOKE_MAS0(0, 0, 0)@l

	lis     r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h
	ori     r7,r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l

	lis     r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@h
	ori     r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@l

	lis     r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0,
						(MAS3_SX|MAS3_SW|MAS3_SR))@h
	ori     r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0,
						(MAS3_SX|MAS3_SW|MAS3_SR))@l

	mtspr   MAS0,r6
	mtspr   MAS1,r7
	mtspr   MAS2,r8
	mtspr   MAS3,r9
	isync
	msync
	tlbwe

	/* Set LBCR register */
	lis     r4,CONFIG_SYS_LBCR_ADDR@h
	ori     r4,r4,CONFIG_SYS_LBCR_ADDR@l

	lis     r5,CONFIG_SYS_LBC_LBCR@h
	ori     r5,r5,CONFIG_SYS_LBC_LBCR@l
	stw     r5,0(r4)
	isync

	/* invalidate this temp TLB */
	lis	r4,CONFIG_SYS_LBC_ADDR@h
	ori	r4,r4,CONFIG_SYS_LBC_ADDR@l
	tlbivax	0,r4
	isync

#endif /* CONFIG_MPC8569 */

286 287 288
	lis     r6,FSL_BOOKE_MAS0(1, 15, 0)@h
	ori     r6,r6,FSL_BOOKE_MAS0(1, 15, 0)@l

289 290
#ifndef CONFIG_SYS_RAMBOOT
	/* create a temp mapping in AS=1 to the 4M boot window */
D
Dave Liu 已提交
291 292
	lis     r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@h
	ori     r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@l
293

294 295
	lis     r8,FSL_BOOKE_MAS2(CONFIG_SYS_TEXT_BASE & 0xffc00000, (MAS2_I|MAS2_G))@h
	ori     r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_TEXT_BASE & 0xffc00000, (MAS2_I|MAS2_G))@l
296

D
Dave Liu 已提交
297 298 299
	/* The 85xx has the default boot window 0xff800000 - 0xffffffff */
	lis     r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
	ori     r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
300 301
#else
	/*
302 303
	 * create a temp mapping in AS=1 to the 1M CONFIG_SYS_TEXT_BASE space, the main
	 * image has been relocated to CONFIG_SYS_TEXT_BASE on the second stage.
304 305 306 307
	 */
	lis     r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h
	ori     r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l

308 309
	lis     r8,FSL_BOOKE_MAS2(CONFIG_SYS_TEXT_BASE, (MAS2_I|MAS2_G))@h
	ori     r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_TEXT_BASE, (MAS2_I|MAS2_G))@l
310

311 312
	lis     r9,FSL_BOOKE_MAS3(CONFIG_SYS_TEXT_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
	ori     r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_TEXT_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
313
#endif
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

	mtspr   MAS0,r6
	mtspr   MAS1,r7
	mtspr   MAS2,r8
	mtspr   MAS3,r9
	isync
	msync
	tlbwe

	/* create a temp mapping in AS=1 to the stack */
	lis     r6,FSL_BOOKE_MAS0(1, 14, 0)@h
	ori     r6,r6,FSL_BOOKE_MAS0(1, 14, 0)@l

	lis     r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@h
	ori     r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@l

330 331
	lis     r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@h
	ori     r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@l
332

333 334 335 336 337 338 339 340 341
#if defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW) && \
    defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH)
	lis     r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0,
				(MAS3_SX|MAS3_SW|MAS3_SR))@h
	ori     r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0,
				(MAS3_SX|MAS3_SW|MAS3_SR))@l
	li      r10,CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH
	mtspr	MAS7,r10
#else
342 343
	lis     r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
	ori     r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
344
#endif
345 346 347 348 349 350 351 352 353

	mtspr   MAS0,r6
	mtspr   MAS1,r7
	mtspr   MAS2,r8
	mtspr   MAS3,r9
	isync
	msync
	tlbwe

354 355
	lis	r6,MSR_IS|MSR_DS@h
	ori	r6,r6,MSR_IS|MSR_DS@l
356 357 358 359 360 361 362 363
	lis	r7,switch_as@h
	ori	r7,r7,switch_as@l

	mtspr	SPRN_SRR0,r7
	mtspr	SPRN_SRR1,r6
	rfi

switch_as:
364 365 366 367
/* L1 DCache is used for initial RAM */

	/* Allocate Initial RAM in data cache.
	 */
368 369
	lis	r3,CONFIG_SYS_INIT_RAM_ADDR@h
	ori	r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
370 371 372 373
	mfspr	r2, L1CFG0
	andi.	r2, r2, 0x1ff
	/* cache size * 1024 / (2 * L1 line size) */
	slwi	r2, r2, (10 - 1 - L1_CACHE_SHIFT)
374 375 376 377 378
	mtctr	r2
	li	r0,0
1:
	dcbz	r0,r3
	dcbtls	0,r0,r3
379
	addi	r3,r3,CONFIG_SYS_CACHELINE_SIZE
380 381
	bdnz	1b

382
	/* Jump out the last 4K page and continue to 'normal' start */
383
#ifdef CONFIG_SYS_RAMBOOT
384
	b	_start_cont
385 386 387
#else
	/* Calculate absolute address in FLASH and jump there		*/
	/*--------------------------------------------------------------*/
388 389
	lis	r3,CONFIG_SYS_MONITOR_BASE@h
	ori	r3,r3,CONFIG_SYS_MONITOR_BASE@l
390 391
	addi	r3,r3,_start_cont - _start + _START_OFFSET
	mtlr	r3
U
urwithsughosh@gmail.com 已提交
392
	blr
393
#endif
394 395 396 397 398 399 400 401

	.text
	.globl	_start
_start:
	.long	0x27051956		/* U-BOOT Magic Number */
	.globl	version_string
version_string:
	.ascii U_BOOT_VERSION
402
	.ascii " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
403 404 405 406 407
	.ascii CONFIG_IDENT_STRING, "\0"

	.align	4
	.globl	_start_cont
_start_cont:
W
wdenk 已提交
408
	/* Setup the stack in initial RAM,could be L2-as-SRAM or L1 dcache*/
409 410
	lis	r1,CONFIG_SYS_INIT_RAM_ADDR@h
	ori	r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l
W
wdenk 已提交
411 412 413 414 415 416 417

	li	r0,0
	stwu	r0,-4(r1)
	stwu	r0,-4(r1)		/* Terminate call chain */

	stwu	r1,-8(r1)		/* Save back chain and move SP */
	lis	r0,RESET_VECTOR@h	/* Address of reset vector */
418
	ori	r0,r0,RESET_VECTOR@l
W
wdenk 已提交
419 420 421 422
	stwu	r1,-8(r1)		/* Save back chain and move SP */
	stw	r0,+12(r1)		/* Save return addr (underflow vect) */

	GET_GOT
423 424 425 426 427 428 429 430
	bl	cpu_init_early_f

	/* switch back to AS = 0 */
	lis	r3,(MSR_CE|MSR_ME|MSR_DE)@h
	ori	r3,r3,(MSR_CE|MSR_ME|MSR_DE)@l
	mtmsr	r3
	isync

W
wdenk 已提交
431 432
	bl	cpu_init_f
	bl	board_init_f
W
wdenk 已提交
433
	isync
W
wdenk 已提交
434

435 436
	/* NOTREACHED - board_init_f() does not return */

437
#ifndef CONFIG_NAND_SPL
438
	. = EXC_OFF_SYS_RESET
W
wdenk 已提交
439 440
	.globl	_start_of_vectors
_start_of_vectors:
441

W
wdenk 已提交
442
/* Critical input. */
443 444 445 446
	CRIT_EXCEPTION(0x0100, CriticalInput, CritcalInputException)

/* Machine check */
	MCK_EXCEPTION(0x200, MachineCheck, MachineCheckException)
W
wdenk 已提交
447 448 449 450 451 452 453 454

/* Data Storage exception. */
	STD_EXCEPTION(0x0300, DataStorage, UnknownException)

/* Instruction Storage exception. */
	STD_EXCEPTION(0x0400, InstStorage, UnknownException)

/* External Interrupt exception. */
455
	STD_EXCEPTION(0x0500, ExtInterrupt, ExtIntException)
W
wdenk 已提交
456 457 458 459

/* Alignment exception. */
	. = 0x0600
Alignment:
460
	EXCEPTION_PROLOG(SRR0, SRR1)
W
wdenk 已提交
461 462 463 464 465
	mfspr	r4,DAR
	stw	r4,_DAR(r21)
	mfspr	r5,DSISR
	stw	r5,_DSISR(r21)
	addi	r3,r1,STACK_FRAME_OVERHEAD
J
Joakim Tjernlund 已提交
466
	EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
W
wdenk 已提交
467 468 469 470

/* Program check exception */
	. = 0x0700
ProgramCheck:
471
	EXCEPTION_PROLOG(SRR0, SRR1)
W
wdenk 已提交
472
	addi	r3,r1,STACK_FRAME_OVERHEAD
J
Joakim Tjernlund 已提交
473 474
	EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
		MSR_KERNEL, COPY_EE)
W
wdenk 已提交
475 476 477 478 479

	/* No FPU on MPC85xx.  This exception is not supposed to happen.
	*/
	STD_EXCEPTION(0x0800, FPUnavailable, UnknownException)

W
wdenk 已提交
480
	. = 0x0900
W
wdenk 已提交
481 482 483 484 485
/*
 * r0 - SYSCALL number
 * r3-... arguments
 */
SystemCall:
486 487 488
	addis	r11,r0,0	/* get functions table addr */
	ori	r11,r11,0	/* Note: this code is patched in trap_init */
	addis	r12,r0,0	/* get number of functions */
W
wdenk 已提交
489 490
	ori	r12,r12,0

491
	cmplw	0,r0,r12
W
wdenk 已提交
492 493
	bge	1f

494
	rlwinm	r0,r0,2,0,31	/* fn_addr = fn_tbl[r0] */
W
wdenk 已提交
495 496 497
	add	r11,r11,r0
	lwz	r11,0(r11)

498
	li	r20,0xd00-4	/* Get stack pointer */
W
wdenk 已提交
499
	lwz	r12,0(r20)
500
	subi	r12,r12,12	/* Adjust stack pointer */
W
wdenk 已提交
501
	li	r0,0xc00+_end_back-SystemCall
502
	cmplw	0,r0,r12	/* Check stack overflow */
W
wdenk 已提交
503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
	bgt	1f
	stw	r12,0(r20)

	mflr	r0
	stw	r0,0(r12)
	mfspr	r0,SRR0
	stw	r0,4(r12)
	mfspr	r0,SRR1
	stw	r0,8(r12)

	li	r12,0xc00+_back-SystemCall
	mtlr	r12
	mtspr	SRR0,r11

1:	SYNC
W
wdenk 已提交
518 519 520
	rfi
_back:

W
wdenk 已提交
521 522 523 524 525 526
	mfmsr	r11			/* Disable interrupts */
	li	r12,0
	ori	r12,r12,MSR_EE
	andc	r11,r11,r12
	SYNC				/* Some chip revs need this... */
	mtmsr	r11
W
wdenk 已提交
527 528
	SYNC

W
wdenk 已提交
529 530
	li	r12,0xd00-4		/* restore regs */
	lwz	r12,0(r12)
W
wdenk 已提交
531

W
wdenk 已提交
532 533 534 535 536 537
	lwz	r11,0(r12)
	mtlr	r11
	lwz	r11,4(r12)
	mtspr	SRR0,r11
	lwz	r11,8(r12)
	mtspr	SRR1,r11
W
wdenk 已提交
538

W
wdenk 已提交
539 540 541
	addi	r12,r12,12		/* Adjust stack pointer */
	li	r20,0xd00-4
	stw	r12,0(r20)
W
wdenk 已提交
542 543 544 545 546

	SYNC
	rfi
_end_back:

W
wdenk 已提交
547 548 549
	STD_EXCEPTION(0x0a00, Decrementer, timer_interrupt)
	STD_EXCEPTION(0x0b00, IntervalTimer, UnknownException)
	STD_EXCEPTION(0x0c00, WatchdogTimer, UnknownException)
W
wdenk 已提交
550

W
wdenk 已提交
551 552
	STD_EXCEPTION(0x0d00, DataTLBError, UnknownException)
	STD_EXCEPTION(0x0e00, InstructionTLBError, UnknownException)
W
wdenk 已提交
553

W
wdenk 已提交
554
	CRIT_EXCEPTION(0x0f00, DebugBreakpoint, DebugException )
W
wdenk 已提交
555

W
wdenk 已提交
556
	.globl	_end_of_vectors
W
wdenk 已提交
557 558 559
_end_of_vectors:


560
	. = . + (0x100 - ( . & 0xff ))	/* align for debug */
W
wdenk 已提交
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644

/*
 * This code finishes saving the registers to the exception frame
 * and jumps to the appropriate handler for the exception.
 * Register r21 is pointer into trap frame, r1 has new stack pointer.
 */
	.globl	transfer_to_handler
transfer_to_handler:
	stw	r22,_NIP(r21)
	lis	r22,MSR_POW@h
	andc	r23,r23,r22
	stw	r23,_MSR(r21)
	SAVE_GPR(7, r21)
	SAVE_4GPRS(8, r21)
	SAVE_8GPRS(12, r21)
	SAVE_8GPRS(24, r21)

	mflr	r23
	andi.	r24,r23,0x3f00		/* get vector offset */
	stw	r24,TRAP(r21)
	li	r22,0
	stw	r22,RESULT(r21)
	mtspr	SPRG2,r22		/* r1 is now kernel sp */

	lwz	r24,0(r23)		/* virtual address of handler */
	lwz	r23,4(r23)		/* where to go when done */
	mtspr	SRR0,r24
	mtspr	SRR1,r20
	mtlr	r23
	SYNC
	rfi				/* jump to handler, enable MMU */

int_return:
	mfmsr	r28		/* Disable interrupts */
	li	r4,0
	ori	r4,r4,MSR_EE
	andc	r28,r28,r4
	SYNC			/* Some chip revs need this... */
	mtmsr	r28
	SYNC
	lwz	r2,_CTR(r1)
	lwz	r0,_LINK(r1)
	mtctr	r2
	mtlr	r0
	lwz	r2,_XER(r1)
	lwz	r0,_CCR(r1)
	mtspr	XER,r2
	mtcrf	0xFF,r0
	REST_10GPRS(3, r1)
	REST_10GPRS(13, r1)
	REST_8GPRS(23, r1)
	REST_GPR(31, r1)
	lwz	r2,_NIP(r1)	/* Restore environment */
	lwz	r0,_MSR(r1)
	mtspr	SRR0,r2
	mtspr	SRR1,r0
	lwz	r0,GPR0(r1)
	lwz	r2,GPR2(r1)
	lwz	r1,GPR1(r1)
	SYNC
	rfi

crit_return:
	mfmsr	r28		/* Disable interrupts */
	li	r4,0
	ori	r4,r4,MSR_EE
	andc	r28,r28,r4
	SYNC			/* Some chip revs need this... */
	mtmsr	r28
	SYNC
	lwz	r2,_CTR(r1)
	lwz	r0,_LINK(r1)
	mtctr	r2
	mtlr	r0
	lwz	r2,_XER(r1)
	lwz	r0,_CCR(r1)
	mtspr	XER,r2
	mtcrf	0xFF,r0
	REST_10GPRS(3, r1)
	REST_10GPRS(13, r1)
	REST_8GPRS(23, r1)
	REST_GPR(31, r1)
	lwz	r2,_NIP(r1)	/* Restore environment */
	lwz	r0,_MSR(r1)
645 646
	mtspr	SPRN_CSRR0,r2
	mtspr	SPRN_CSRR1,r0
W
wdenk 已提交
647 648 649 650 651 652
	lwz	r0,GPR0(r1)
	lwz	r2,GPR2(r1)
	lwz	r1,GPR1(r1)
	SYNC
	rfci

653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
mck_return:
	mfmsr	r28		/* Disable interrupts */
	li	r4,0
	ori	r4,r4,MSR_EE
	andc	r28,r28,r4
	SYNC			/* Some chip revs need this... */
	mtmsr	r28
	SYNC
	lwz	r2,_CTR(r1)
	lwz	r0,_LINK(r1)
	mtctr	r2
	mtlr	r0
	lwz	r2,_XER(r1)
	lwz	r0,_CCR(r1)
	mtspr	XER,r2
	mtcrf	0xFF,r0
	REST_10GPRS(3, r1)
	REST_10GPRS(13, r1)
	REST_8GPRS(23, r1)
	REST_GPR(31, r1)
	lwz	r2,_NIP(r1)	/* Restore environment */
	lwz	r0,_MSR(r1)
	mtspr	SPRN_MCSRR0,r2
	mtspr	SPRN_MCSRR1,r0
	lwz	r0,GPR0(r1)
	lwz	r2,GPR2(r1)
	lwz	r1,GPR1(r1)
	SYNC
	rfmci

W
wdenk 已提交
683 684
/* Cache functions.
*/
685
.globl invalidate_icache
W
wdenk 已提交
686 687
invalidate_icache:
	mfspr	r0,L1CSR1
688 689 690
	ori	r0,r0,L1CSR1_ICFI
	msync
	isync
W
wdenk 已提交
691 692
	mtspr	L1CSR1,r0
	isync
693
	blr				/* entire I cache */
W
wdenk 已提交
694

695
.globl invalidate_dcache
W
wdenk 已提交
696 697
invalidate_dcache:
	mfspr	r0,L1CSR0
698
	ori	r0,r0,L1CSR0_DCFI
W
wdenk 已提交
699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
	msync
	isync
	mtspr	L1CSR0,r0
	isync
	blr

	.globl	icache_enable
icache_enable:
	mflr	r8
	bl	invalidate_icache
	mtlr	r8
	isync
	mfspr	r4,L1CSR1
	ori	r4,r4,0x0001
	oris	r4,r4,0x0001
	mtspr	L1CSR1,r4
	isync
	blr

	.globl	icache_disable
icache_disable:
	mfspr	r0,L1CSR1
721 722 723
	lis	r3,0
	ori	r3,r3,L1CSR1_ICE
	andc	r0,r0,r3
W
wdenk 已提交
724 725 726 727 728 729 730
	mtspr	L1CSR1,r0
	isync
	blr

	.globl	icache_status
icache_status:
	mfspr	r3,L1CSR1
731
	andi.	r3,r3,L1CSR1_ICE
W
wdenk 已提交
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750
	blr

	.globl	dcache_enable
dcache_enable:
	mflr	r8
	bl	invalidate_dcache
	mtlr	r8
	isync
	mfspr	r0,L1CSR0
	ori	r0,r0,0x0001
	oris	r0,r0,0x0001
	msync
	isync
	mtspr	L1CSR0,r0
	isync
	blr

	.globl	dcache_disable
dcache_disable:
751 752 753 754
	mfspr	r3,L1CSR0
	lis	r4,0
	ori	r4,r4,L1CSR0_DCE
	andc	r3,r3,r4
W
wdenk 已提交
755 756 757 758 759 760 761
	mtspr	L1CSR0,r0
	isync
	blr

	.globl	dcache_status
dcache_status:
	mfspr	r3,L1CSR0
762
	andi.	r3,r3,L1CSR0_DCE
W
wdenk 已提交
763 764 765 766
	blr

	.globl get_pir
get_pir:
767
	mfspr	r3,PIR
W
wdenk 已提交
768 769 770 771
	blr

	.globl get_pvr
get_pvr:
772
	mfspr	r3,PVR
W
wdenk 已提交
773 774
	blr

775 776
	.globl get_svr
get_svr:
777
	mfspr	r3,SVR
778 779
	blr

W
wdenk 已提交
780 781
	.globl wr_tcr
wr_tcr:
782
	mtspr	TCR,r3
W
wdenk 已提交
783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 in8 */
/* Description:	 Input 8 bits */
/*------------------------------------------------------------------------------- */
	.globl	in8
in8:
	lbz	r3,0x0000(r3)
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 out8 */
/* Description:	 Output 8 bits */
/*------------------------------------------------------------------------------- */
	.globl	out8
out8:
	stb	r4,0x0000(r3)
801
	sync
W
wdenk 已提交
802 803 804 805 806 807 808 809 810
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 out16 */
/* Description:	 Output 16 bits */
/*------------------------------------------------------------------------------- */
	.globl	out16
out16:
	sth	r4,0x0000(r3)
811
	sync
W
wdenk 已提交
812 813 814 815 816 817 818 819 820
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 out16r */
/* Description:	 Byte reverse and output 16 bits */
/*------------------------------------------------------------------------------- */
	.globl	out16r
out16r:
	sthbrx	r4,r0,r3
821
	sync
W
wdenk 已提交
822 823 824 825 826 827 828 829 830
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 out32 */
/* Description:	 Output 32 bits */
/*------------------------------------------------------------------------------- */
	.globl	out32
out32:
	stw	r4,0x0000(r3)
831
	sync
W
wdenk 已提交
832 833 834 835 836 837 838 839 840
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 out32r */
/* Description:	 Byte reverse and output 32 bits */
/*------------------------------------------------------------------------------- */
	.globl	out32r
out32r:
	stwbrx	r4,r0,r3
841
	sync
W
wdenk 已提交
842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 in16 */
/* Description:	 Input 16 bits */
/*------------------------------------------------------------------------------- */
	.globl	in16
in16:
	lhz	r3,0x0000(r3)
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 in16r */
/* Description:	 Input 16 bits and byte reverse */
/*------------------------------------------------------------------------------- */
	.globl	in16r
in16r:
	lhbrx	r3,r0,r3
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 in32 */
/* Description:	 Input 32 bits */
/*------------------------------------------------------------------------------- */
	.globl	in32
in32:
	lwz	3,0x0000(3)
	blr

/*------------------------------------------------------------------------------- */
/* Function:	 in32r */
/* Description:	 Input 32 bits and byte reverse */
/*------------------------------------------------------------------------------- */
	.globl	in32r
in32r:
	lwbrx	r3,r0,r3
	blr
879
#endif  /* !CONFIG_NAND_SPL */
W
wdenk 已提交
880 881 882

/*------------------------------------------------------------------------------*/

883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904
/*
 * void write_tlb(mas0, mas1, mas2, mas3, mas7)
 */
	.globl	write_tlb
write_tlb:
	mtspr	MAS0,r3
	mtspr	MAS1,r4
	mtspr	MAS2,r5
	mtspr	MAS3,r6
#ifdef CONFIG_ENABLE_36BIT_PHYS
	mtspr	MAS7,r7
#endif
	li	r3,0
#ifdef CONFIG_SYS_BOOK3E_HV
	mtspr	MAS8,r3
#endif
	isync
	tlbwe
	msync
	isync
	blr

W
wdenk 已提交
905 906 907 908 909 910 911 912 913 914 915 916 917
/*
 * void relocate_code (addr_sp, gd, addr_moni)
 *
 * This "function" does not return, instead it continues in RAM
 * after relocating the monitor code.
 *
 * r3 = dest
 * r4 = src
 * r5 = length in bytes
 * r6 = cachelinesize
 */
	.globl	relocate_code
relocate_code:
918 919 920
	mr	r1,r3		/* Set new stack pointer		*/
	mr	r9,r4		/* Save copy of Init Data pointer	*/
	mr	r10,r5		/* Save copy of Destination Address	*/
W
wdenk 已提交
921

922
	GET_GOT
923
	mr	r3,r5				/* Destination Address	*/
924 925
	lis	r4,CONFIG_SYS_MONITOR_BASE@h		/* Source      Address	*/
	ori	r4,r4,CONFIG_SYS_MONITOR_BASE@l
W
wdenk 已提交
926 927
	lwz	r5,GOT(__init_end)
	sub	r5,r5,r4
928
	li	r6,CONFIG_SYS_CACHELINE_SIZE		/* Cache Line Size	*/
W
wdenk 已提交
929 930 931 932

	/*
	 * Fix GOT pointer:
	 *
933
	 * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE) + Destination Address
W
wdenk 已提交
934 935 936
	 *
	 * Offset:
	 */
937
	sub	r15,r10,r4
W
wdenk 已提交
938 939

	/* First our own GOT */
940
	add	r12,r12,r15
W
wdenk 已提交
941
	/* the the one used by the C code */
942
	add	r30,r30,r15
W
wdenk 已提交
943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992

	/*
	 * Now relocate code
	 */

	cmplw	cr1,r3,r4
	addi	r0,r5,3
	srwi.	r0,r0,2
	beq	cr1,4f		/* In place copy is not necessary	*/
	beq	7f		/* Protect against 0 count		*/
	mtctr	r0
	bge	cr1,2f

	la	r8,-4(r4)
	la	r7,-4(r3)
1:	lwzu	r0,4(r8)
	stwu	r0,4(r7)
	bdnz	1b
	b	4f

2:	slwi	r0,r0,2
	add	r8,r4,r0
	add	r7,r3,r0
3:	lwzu	r0,-4(r8)
	stwu	r0,-4(r7)
	bdnz	3b

/*
 * Now flush the cache: note that we must start from a cache aligned
 * address. Otherwise we might miss one cache line.
 */
4:	cmpwi	r6,0
	add	r5,r3,r5
	beq	7f		/* Always flush prefetch queue in any case */
	subi	r0,r6,1
	andc	r3,r3,r0
	mr	r4,r3
5:	dcbst	0,r4
	add	r4,r4,r6
	cmplw	r4,r5
	blt	5b
	sync			/* Wait for all dcbst to complete on bus */
	mr	r4,r3
6:	icbi	0,r4
	add	r4,r4,r6
	cmplw	r4,r5
	blt	6b
7:	sync			/* Wait for all icbi to complete on bus */
	isync

993 994 995 996
	/*
	 * Re-point the IVPR at RAM
	 */
	mtspr	IVPR,r10
997

W
wdenk 已提交
998 999 1000 1001 1002
/*
 * We are done. Do not return, instead branch to second part of board
 * initialization, now running from RAM.
 */

1003
	addi	r0,r10,in_ram - _start + _START_OFFSET
W
wdenk 已提交
1004 1005
	mtlr	r0
	blr				/* NEVER RETURNS! */
1006
	.globl	in_ram
W
wdenk 已提交
1007 1008 1009
in_ram:

	/*
1010
	 * Relocation Function, r12 point to got2+0x8000
W
wdenk 已提交
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
	 *
	 * Adjust got2 pointers, no need to check for 0, this code
	 * already puts a few entries in the table.
	 */
	li	r0,__got2_entries@sectoff@l
	la	r3,GOT(_GOT2_TABLE_)
	lwz	r11,GOT(_GOT2_TABLE_)
	mtctr	r0
	sub	r11,r3,r11
	addi	r3,r3,-4
1:	lwzu	r0,4(r3)
1022 1023
	cmpwi	r0,0
	beq-	2f
W
wdenk 已提交
1024 1025
	add	r0,r0,r11
	stw	r0,0(r3)
1026
2:	bdnz	1b
W
wdenk 已提交
1027 1028 1029 1030 1031

	/*
	 * Now adjust the fixups and the pointers to the fixups
	 * in case we need to move ourselves again.
	 */
1032
	li	r0,__fixup_entries@sectoff@l
W
wdenk 已提交
1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
	lwz	r3,GOT(_FIXUP_TABLE_)
	cmpwi	r0,0
	mtctr	r0
	addi	r3,r3,-4
	beq	4f
3:	lwzu	r4,4(r3)
	lwzux	r0,r4,r11
	add	r0,r0,r11
	stw	r10,0(r3)
	stw	r0,0(r4)
	bdnz	3b
4:
clear_bss:
	/*
	 * Now clear BSS segment
	 */
	lwz	r3,GOT(__bss_start)
	lwz	r4,GOT(_end)

1052
	cmplw	0,r3,r4
W
wdenk 已提交
1053 1054
	beq	6f

1055
	li	r0,0
W
wdenk 已提交
1056
5:
1057 1058 1059
	stw	r0,0(r3)
	addi	r3,r3,4
	cmplw	0,r3,r4
W
wdenk 已提交
1060 1061 1062
	bne	5b
6:

1063 1064
	mr	r3,r9		/* Init Data pointer		*/
	mr	r4,r10		/* Destination Address		*/
W
wdenk 已提交
1065 1066
	bl	board_init_r

1067
#ifndef CONFIG_NAND_SPL
W
wdenk 已提交
1068 1069 1070 1071 1072 1073
	/*
	 * Copy exception vector code to low memory
	 *
	 * r3: dest_addr
	 * r7: source address, r8: end address, r9: target address
	 */
W
wdenk 已提交
1074
	.globl	trap_init
W
wdenk 已提交
1075
trap_init:
1076 1077
	mflr	r4			/* save link register		*/
	GET_GOT
1078 1079
	lwz	r7,GOT(_start_of_vectors)
	lwz	r8,GOT(_end_of_vectors)
W
wdenk 已提交
1080

1081
	li	r9,0x100		/* reset vector always at 0x100 */
W
wdenk 已提交
1082

1083
	cmplw	0,r7,r8
W
wdenk 已提交
1084
	bgelr				/* return if r7>=r8 - just in case */
W
wdenk 已提交
1085
1:
1086 1087 1088 1089 1090
	lwz	r0,0(r7)
	stw	r0,0(r9)
	addi	r7,r7,4
	addi	r9,r9,4
	cmplw	0,r7,r8
W
wdenk 已提交
1091
	bne	1b
W
wdenk 已提交
1092 1093 1094 1095

	/*
	 * relocate `hdlr' and `int_return' entries
	 */
1096
	li	r7,.L_CriticalInput - _start + _START_OFFSET
W
wdenk 已提交
1097
	bl	trap_reloc
1098
	li	r7,.L_MachineCheck - _start + _START_OFFSET
W
wdenk 已提交
1099
	bl	trap_reloc
1100
	li	r7,.L_DataStorage - _start + _START_OFFSET
W
wdenk 已提交
1101
	bl	trap_reloc
1102
	li	r7,.L_InstStorage - _start + _START_OFFSET
W
wdenk 已提交
1103
	bl	trap_reloc
1104
	li	r7,.L_ExtInterrupt - _start + _START_OFFSET
W
wdenk 已提交
1105
	bl	trap_reloc
1106
	li	r7,.L_Alignment - _start + _START_OFFSET
W
wdenk 已提交
1107
	bl	trap_reloc
1108
	li	r7,.L_ProgramCheck - _start + _START_OFFSET
W
wdenk 已提交
1109
	bl	trap_reloc
1110
	li	r7,.L_FPUnavailable - _start + _START_OFFSET
W
wdenk 已提交
1111
	bl	trap_reloc
1112 1113 1114 1115
	li	r7,.L_Decrementer - _start + _START_OFFSET
	bl	trap_reloc
	li	r7,.L_IntervalTimer - _start + _START_OFFSET
	li	r8,_end_of_vectors - _start + _START_OFFSET
W
wdenk 已提交
1116
2:
W
wdenk 已提交
1117
	bl	trap_reloc
1118 1119
	addi	r7,r7,0x100		/* next exception vector	*/
	cmplw	0,r7,r8
W
wdenk 已提交
1120 1121 1122
	blt	2b

	lis	r7,0x0
1123
	mtspr	IVPR,r7
W
wdenk 已提交
1124

W
wdenk 已提交
1125
	mtlr	r4			/* restore link register	*/
W
wdenk 已提交
1126 1127 1128 1129 1130
	blr

.globl unlock_ram_in_cache
unlock_ram_in_cache:
	/* invalidate the INIT_RAM section */
1131 1132
	lis	r3,(CONFIG_SYS_INIT_RAM_ADDR & ~(CONFIG_SYS_CACHELINE_SIZE-1))@h
	ori	r3,r3,(CONFIG_SYS_INIT_RAM_ADDR & ~(CONFIG_SYS_CACHELINE_SIZE-1))@l
1133 1134 1135
	mfspr	r4,L1CFG0
	andi.	r4,r4,0x1ff
	slwi	r4,r4,(10 - 1 - L1_CACHE_SHIFT)
1136
	mtctr	r4
1137
1:	dcbi	r0,r3
1138
	addi	r3,r3,CONFIG_SYS_CACHELINE_SIZE
W
wdenk 已提交
1139
	bdnz	1b
1140
	sync
A
Andy Fleming 已提交
1141 1142

	/* Invalidate the TLB entries for the cache */
1143 1144
	lis	r3,CONFIG_SYS_INIT_RAM_ADDR@h
	ori	r3,r3,CONFIG_SYS_INIT_RAM_ADDR@l
A
Andy Fleming 已提交
1145 1146 1147 1148 1149 1150 1151
	tlbivax	0,r3
	addi	r3,r3,0x1000
	tlbivax	0,r3
	addi	r3,r3,0x1000
	tlbivax	0,r3
	addi	r3,r3,0x1000
	tlbivax	0,r3
W
wdenk 已提交
1152 1153
	isync
	blr
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200

.globl flush_dcache
flush_dcache:
	mfspr	r3,SPRN_L1CFG0

	rlwinm	r5,r3,9,3	/* Extract cache block size */
	twlgti	r5,1		/* Only 32 and 64 byte cache blocks
				 * are currently defined.
				 */
	li	r4,32
	subfic	r6,r5,2		/* r6 = log2(1KiB / cache block size) -
				 *      log2(number of ways)
				 */
	slw	r5,r4,r5	/* r5 = cache block size */

	rlwinm	r7,r3,0,0xff	/* Extract number of KiB in the cache */
	mulli	r7,r7,13	/* An 8-way cache will require 13
				 * loads per set.
				 */
	slw	r7,r7,r6

	/* save off HID0 and set DCFA */
	mfspr	r8,SPRN_HID0
	ori	r9,r8,HID0_DCFA@l
	mtspr	SPRN_HID0,r9
	isync

	lis	r4,0
	mtctr	r7

1:	lwz	r3,0(r4)	/* Load... */
	add	r4,r4,r5
	bdnz	1b

	msync
	lis	r4,0
	mtctr	r7

1:	dcbf	0,r4		/* ...and flush. */
	add	r4,r4,r5
	bdnz	1b

	/* restore HID0 */
	mtspr	SPRN_HID0,r8
	isync

	blr
1201 1202 1203 1204 1205 1206

.globl setup_ivors
setup_ivors:

#include "fixed_ivor.S"
	blr
1207
#endif /* !CONFIG_NAND_SPL */