mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +00:00 
			
		
		
		
	Signed-off-by: Wolfgang Denk <wd@denx.de> [trini: Fixup common/cmd_io.c] Signed-off-by: Tom Rini <trini@ti.com>
		
			
				
	
	
		
			152 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/*
 | 
						|
 * Copyright 2004, 2007, 2008 Freescale Semiconductor.
 | 
						|
 * Srikanth Srinivasan <srikanth.srinivaan@freescale.com>
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier:	GPL-2.0+
 | 
						|
 */
 | 
						|
#include <config.h>
 | 
						|
#include <mpc86xx.h>
 | 
						|
#include <version.h>
 | 
						|
 | 
						|
#include <ppc_asm.tmpl>
 | 
						|
#include <ppc_defs.h>
 | 
						|
 | 
						|
#include <asm/cache.h>
 | 
						|
#include <asm/mmu.h>
 | 
						|
 | 
						|
/* If this is a multi-cpu system then we need to handle the
 | 
						|
 * 2nd cpu.  The assumption is that the 2nd cpu is being
 | 
						|
 * held in boot holdoff mode until the 1st cpu unlocks it
 | 
						|
 * from Linux.	We'll do some basic cpu init and then pass
 | 
						|
 * it to the Linux Reset Vector.
 | 
						|
 * Sri:	 Much of this initialization is not required. Linux
 | 
						|
 * rewrites the bats, and the sprs and also enables the L1 cache.
 | 
						|
 *
 | 
						|
 * Core 0 must copy this to a 1M aligned region and set BPTR
 | 
						|
 * to point to it.
 | 
						|
 */
 | 
						|
	.align 12
 | 
						|
.globl __secondary_start_page
 | 
						|
__secondary_start_page:
 | 
						|
	.space 0x100	/* space over to reset vector loc */
 | 
						|
	mfspr	r0, MSSCR0
 | 
						|
	andi.	r0, r0, 0x0020
 | 
						|
	rlwinm	r0,r0,27,31,31
 | 
						|
	mtspr	PIR, r0
 | 
						|
 | 
						|
	/* Invalidate BATs */
 | 
						|
	li	r0, 0
 | 
						|
	mtspr	IBAT0U, r0
 | 
						|
	mtspr	IBAT1U, r0
 | 
						|
	mtspr	IBAT2U, r0
 | 
						|
	mtspr	IBAT3U, r0
 | 
						|
	mtspr	IBAT4U, r0
 | 
						|
	mtspr	IBAT5U, r0
 | 
						|
	mtspr	IBAT6U, r0
 | 
						|
	mtspr	IBAT7U, r0
 | 
						|
	isync
 | 
						|
	mtspr	DBAT0U, r0
 | 
						|
	mtspr	DBAT1U, r0
 | 
						|
	mtspr	DBAT2U, r0
 | 
						|
	mtspr	DBAT3U, r0
 | 
						|
	mtspr	DBAT4U, r0
 | 
						|
	mtspr	DBAT5U, r0
 | 
						|
	mtspr	DBAT6U, r0
 | 
						|
	mtspr	DBAT7U, r0
 | 
						|
	isync
 | 
						|
	sync
 | 
						|
 | 
						|
	/* enable extended addressing */
 | 
						|
	mfspr	r0, HID0
 | 
						|
	lis	r0, (HID0_HIGH_BAT_EN | HID0_XBSEN | HID0_XAEN)@h
 | 
						|
	ori	r0, r0, (HID0_HIGH_BAT_EN | HID0_XBSEN | HID0_XAEN)@l
 | 
						|
	mtspr	HID0, r0
 | 
						|
	sync
 | 
						|
	isync
 | 
						|
 | 
						|
#ifdef CONFIG_SYS_L2
 | 
						|
	/* init the L2 cache */
 | 
						|
	addis	r3, r0, L2_INIT@h
 | 
						|
	ori	r3, r3, L2_INIT@l
 | 
						|
	sync
 | 
						|
	mtspr	l2cr, r3
 | 
						|
#ifdef CONFIG_ALTIVEC
 | 
						|
	dssall
 | 
						|
#endif
 | 
						|
	/* invalidate the L2 cache */
 | 
						|
	mfspr	r3, l2cr
 | 
						|
	rlwinm.	r3, r3, 0, 0, 0
 | 
						|
	beq	1f
 | 
						|
 | 
						|
	mfspr	r3, l2cr
 | 
						|
	rlwinm	r3, r3, 0, 1, 31
 | 
						|
 | 
						|
#ifdef	CONFIG_ALTIVEC
 | 
						|
	dssall
 | 
						|
#endif
 | 
						|
	sync
 | 
						|
	mtspr	l2cr, r3
 | 
						|
	sync
 | 
						|
1:	mfspr	r3, l2cr
 | 
						|
	oris	r3, r3, L2CR_L2I@h
 | 
						|
	mtspr	l2cr, r3
 | 
						|
 | 
						|
invl2:
 | 
						|
	mfspr	r3, l2cr
 | 
						|
	andis.	r3, r3, L2CR_L2I@h
 | 
						|
	bne	invl2
 | 
						|
	sync
 | 
						|
#endif
 | 
						|
 | 
						|
	/* enable and invalidate the data cache */
 | 
						|
	mfspr	r3, HID0
 | 
						|
	li	r5, HID0_DCFI|HID0_DLOCK
 | 
						|
	andc	r3, r3, r5
 | 
						|
	mtspr	HID0, r3		/* no invalidate, unlock */
 | 
						|
	ori	r3, r3, HID0_DCE
 | 
						|
	ori	r5, r3, HID0_DCFI
 | 
						|
	mtspr	HID0, r5		/* enable + invalidate */
 | 
						|
	mtspr	HID0, r3		/* enable */
 | 
						|
	sync
 | 
						|
#ifdef CONFIG_SYS_L2
 | 
						|
	sync
 | 
						|
	lis	r3, L2_ENABLE@h
 | 
						|
	ori	r3, r3, L2_ENABLE@l
 | 
						|
	mtspr	l2cr, r3
 | 
						|
	isync
 | 
						|
	sync
 | 
						|
#endif
 | 
						|
 | 
						|
	/* enable and invalidate the instruction cache*/
 | 
						|
	mfspr	r3, HID0
 | 
						|
	li	r5, HID0_ICFI|HID0_ILOCK
 | 
						|
	andc	r3, r3, r5
 | 
						|
	ori	r3, r3, HID0_ICE
 | 
						|
	ori	r5, r3, HID0_ICFI
 | 
						|
	mtspr	HID0, r5
 | 
						|
	mtspr	HID0, r3
 | 
						|
	isync
 | 
						|
	sync
 | 
						|
 | 
						|
	/* TBEN in HID0 */
 | 
						|
	mfspr	r4, HID0
 | 
						|
	oris	r4, r4, 0x0400
 | 
						|
	mtspr	HID0, r4
 | 
						|
	sync
 | 
						|
	isync
 | 
						|
 | 
						|
	/* MCP|SYNCBE|ABE in HID1 */
 | 
						|
	mfspr	r4, HID1
 | 
						|
	oris	r4, r4, 0x8000
 | 
						|
	ori	r4, r4, 0x0C00
 | 
						|
	mtspr	HID1, r4
 | 
						|
	sync
 | 
						|
	isync
 | 
						|
 | 
						|
	lis	r3, CONFIG_LINUX_RESET_VEC@h
 | 
						|
	ori	r3, r3, CONFIG_LINUX_RESET_VEC@l
 | 
						|
	mtlr	r3
 | 
						|
	blr
 | 
						|
 | 
						|
	/* Never Returns, Running in Linux Now */
 |