diff options
Diffstat (limited to 'roms/u-boot/arch/m68k/cpu/mcf523x')
| -rw-r--r-- | roms/u-boot/arch/m68k/cpu/mcf523x/Makefile | 11 | ||||
| -rw-r--r-- | roms/u-boot/arch/m68k/cpu/mcf523x/config.mk | 10 | ||||
| -rw-r--r-- | roms/u-boot/arch/m68k/cpu/mcf523x/cpu.c | 111 | ||||
| -rw-r--r-- | roms/u-boot/arch/m68k/cpu/mcf523x/cpu_init.c | 169 | ||||
| -rw-r--r-- | roms/u-boot/arch/m68k/cpu/mcf523x/interrupts.c | 34 | ||||
| -rw-r--r-- | roms/u-boot/arch/m68k/cpu/mcf523x/speed.c | 39 | ||||
| -rw-r--r-- | roms/u-boot/arch/m68k/cpu/mcf523x/start.S | 257 | 
7 files changed, 631 insertions, 0 deletions
| diff --git a/roms/u-boot/arch/m68k/cpu/mcf523x/Makefile b/roms/u-boot/arch/m68k/cpu/mcf523x/Makefile new file mode 100644 index 00000000..e0c5db60 --- /dev/null +++ b/roms/u-boot/arch/m68k/cpu/mcf523x/Makefile @@ -0,0 +1,11 @@ +# +# (C) Copyright 2000-2004 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +# ccflags-y += -DET_DEBUG + +extra-y	= start.o +obj-y	= cpu.o speed.o cpu_init.o interrupts.o diff --git a/roms/u-boot/arch/m68k/cpu/mcf523x/config.mk b/roms/u-boot/arch/m68k/cpu/mcf523x/config.mk new file mode 100644 index 00000000..c9435ab9 --- /dev/null +++ b/roms/u-boot/arch/m68k/cpu/mcf523x/config.mk @@ -0,0 +1,10 @@ +# +# (C) Copyright 2003 Josef Baumgartner <josef.baumgartner@telex.de> +# +# (C) Copyright 2000-2004 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +PLATFORM_CPPFLAGS += -mcpu=5235 -fPIC diff --git a/roms/u-boot/arch/m68k/cpu/mcf523x/cpu.c b/roms/u-boot/arch/m68k/cpu/mcf523x/cpu.c new file mode 100644 index 00000000..67879c7d --- /dev/null +++ b/roms/u-boot/arch/m68k/cpu/mcf523x/cpu.c @@ -0,0 +1,111 @@ +/* + * + * (C) Copyright 2000-2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc. + * TsiChung Liew (Tsi-Chung.Liew@freescale.com) + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <watchdog.h> +#include <command.h> +#include <netdev.h> + +#include <asm/immap.h> +#include <asm/io.h> + +DECLARE_GLOBAL_DATA_PTR; + +int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	ccm_t *ccm = (ccm_t *) MMAP_CCM; + +	out_8(&ccm->rcr, CCM_RCR_SOFTRST); +	/* we don't return! */ +	return 0; +} + +int checkcpu(void) +{ +	ccm_t *ccm = (ccm_t *) MMAP_CCM; +	u16 msk; +	u16 id = 0; +	u8 ver; + +	puts("CPU:   "); +	msk = (in_be16(&ccm->cir) >> 6); +	ver = (in_be16(&ccm->cir) & 0x003f); +	switch (msk) { +	case 0x31: +		id = 5235; +		break; +	} + +	if (id) { +		char buf1[32], buf2[32]; + +		printf("Freescale MCF%d (Mask:%01x Version:%x)\n", id, msk, +		       ver); +		printf("       CPU CLK %s MHz BUS CLK %s MHz\n", +		       strmhz(buf1, gd->cpu_clk), +		       strmhz(buf2, gd->bus_clk)); +	} + +	return 0; +}; + +#if defined(CONFIG_WATCHDOG) +/* Called by macro WATCHDOG_RESET */ +void watchdog_reset(void) +{ +	wdog_t *wdp = (wdog_t *) (MMAP_WDOG); + +	/* Count register */ +	out_be16(&wdp->sr, 0x5555); +	asm("nop"); +	out_be16(&wdp->sr, 0xaaaa); +} + +int watchdog_disable(void) +{ +	wdog_t *wdp = (wdog_t *) (MMAP_WDOG); + +	/* UserManual, once the wdog is disabled, wdog cannot be re-enabled */ +	/* halted watchdog timer */ +	setbits_be16(&wdp->cr, WTM_WCR_HALTED); + +	puts("WATCHDOG:disabled\n"); +	return (0); +} + +int watchdog_init(void) +{ +	wdog_t *wdp = (wdog_t *) (MMAP_WDOG); +	u32 wdog_module = 0; + +	/* set timeout and enable watchdog */ +	wdog_module = ((CONFIG_SYS_CLK / CONFIG_SYS_HZ) * CONFIG_WATCHDOG_TIMEOUT); +	wdog_module |= (wdog_module / 8192); +	out_be16(&wdp->mr, wdog_module); + +	out_be16(&wdp->cr, WTM_WCR_EN); +	puts("WATCHDOG:enabled\n"); + +	return (0); +} +#endif				/* CONFIG_WATCHDOG */ + +#if defined(CONFIG_MCFFEC) +/* Default initializations for MCFFEC controllers.  To override, + * create a board-specific function called: + * 	int board_eth_init(bd_t *bis) + */ + +int cpu_eth_init(bd_t *bis) +{ +	return mcffec_initialize(bis); +} +#endif diff --git a/roms/u-boot/arch/m68k/cpu/mcf523x/cpu_init.c b/roms/u-boot/arch/m68k/cpu/mcf523x/cpu_init.c new file mode 100644 index 00000000..5a789540 --- /dev/null +++ b/roms/u-boot/arch/m68k/cpu/mcf523x/cpu_init.c @@ -0,0 +1,169 @@ +/* + * + * (C) Copyright 2000-2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * (C) Copyright 2007, 2012 Freescale Semiconductor, Inc. + * TsiChung Liew (Tsi-Chung.Liew@freescale.com) + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <watchdog.h> +#include <asm/immap.h> +#include <asm/io.h> + +#if defined(CONFIG_CMD_NET) +#include <config.h> +#include <net.h> +#include <asm/fec.h> +#endif + +/* + * Breath some life into the CPU... + * + * Set up the memory map, + * initialize a bunch of registers, + * initialize the UPM's + */ +void cpu_init_f(void) +{ +	gpio_t *gpio = (gpio_t *) MMAP_GPIO; +	fbcs_t *fbcs = (fbcs_t *) MMAP_FBCS; +	wdog_t *wdog = (wdog_t *) MMAP_WDOG; +	scm_t *scm = (scm_t *) MMAP_SCM; + +	/* watchdog is enabled by default - disable the watchdog */ +#ifndef CONFIG_WATCHDOG +	out_be16(&wdog->cr, 0); +#endif + +	out_be32(&scm->rambar, CONFIG_SYS_INIT_RAM_ADDR | SCM_RAMBAR_BDE); + +	/* Port configuration */ +	out_8(&gpio->par_cs, 0); + +#if (defined(CONFIG_SYS_CS0_BASE) && defined(CONFIG_SYS_CS0_MASK) && defined(CONFIG_SYS_CS0_CTRL)) +	out_be32(&fbcs->csar0, CONFIG_SYS_CS0_BASE); +	out_be32(&fbcs->cscr0, CONFIG_SYS_CS0_CTRL); +	out_be32(&fbcs->csmr0, CONFIG_SYS_CS0_MASK); +#endif + +#if (defined(CONFIG_SYS_CS1_BASE) && defined(CONFIG_SYS_CS1_MASK) && defined(CONFIG_SYS_CS1_CTRL)) +	setbits_8(&gpio->par_cs, GPIO_PAR_CS_CS1); +	out_be32(&fbcs->csar1, CONFIG_SYS_CS1_BASE); +	out_be32(&fbcs->cscr1, CONFIG_SYS_CS1_CTRL); +	out_be32(&fbcs->csmr1, CONFIG_SYS_CS1_MASK); +#endif + +#if (defined(CONFIG_SYS_CS2_BASE) && defined(CONFIG_SYS_CS2_MASK) && defined(CONFIG_SYS_CS2_CTRL)) +	setbits_8(&gpio->par_cs, GPIO_PAR_CS_CS2); +	out_be32(&fbcs->csar2, CONFIG_SYS_CS2_BASE); +	out_be32(&fbcs->cscr2, CONFIG_SYS_CS2_CTRL); +	out_be32(&fbcs->csmr2, CONFIG_SYS_CS2_MASK); +#endif + +#if (defined(CONFIG_SYS_CS3_BASE) && defined(CONFIG_SYS_CS3_MASK) && defined(CONFIG_SYS_CS3_CTRL)) +	setbits_8(&gpio->par_cs, GPIO_PAR_CS_CS3); +	out_be32(&fbcs->csar3, CONFIG_SYS_CS3_BASE); +	out_be32(&fbcs->cscr3, CONFIG_SYS_CS3_CTRL); +	out_be32(&fbcs->csmr3, CONFIG_SYS_CS3_MASK); +#endif + +#if (defined(CONFIG_SYS_CS4_BASE) && defined(CONFIG_SYS_CS4_MASK) && defined(CONFIG_SYS_CS4_CTRL)) +	setbits_8(&gpio->par_cs, GPIO_PAR_CS_CS4); +	out_be32(&fbcs->csar4, CONFIG_SYS_CS4_BASE); +	out_be32(&fbcs->cscr4, CONFIG_SYS_CS4_CTRL); +	out_be32(&fbcs->csmr4, CONFIG_SYS_CS4_MASK); +#endif + +#if (defined(CONFIG_SYS_CS5_BASE) && defined(CONFIG_SYS_CS5_MASK) && defined(CONFIG_SYS_CS5_CTRL)) +	setbits_8(&gpio->par_cs, GPIO_PAR_CS_CS5); +	out_be32(&fbcs->csar5, CONFIG_SYS_CS5_BASE); +	out_be32(&fbcs->cscr5, CONFIG_SYS_CS5_CTRL); +	out_be32(&fbcs->csmr5, CONFIG_SYS_CS5_MASK); +#endif + +#if (defined(CONFIG_SYS_CS6_BASE) && defined(CONFIG_SYS_CS6_MASK) && defined(CONFIG_SYS_CS6_CTRL)) +	setbits_8(&gpio->par_cs, GPIO_PAR_CS_CS6); +	out_be32(&fbcs->csar6, CONFIG_SYS_CS6_BASE); +	out_be32(&fbcs->cscr6, CONFIG_SYS_CS6_CTRL); +	out_be32(&fbcs->csmr6, CONFIG_SYS_CS6_MASK); +#endif + +#if (defined(CONFIG_SYS_CS7_BASE) && defined(CONFIG_SYS_CS7_MASK) && defined(CONFIG_SYS_CS7_CTRL)) +	setbits_8(&gpio->par_cs, GPIO_PAR_CS_CS7); +	out_be32(&fbcs->csar7, CONFIG_SYS_CS7_BASE); +	out_be32(&fbcs->cscr7, CONFIG_SYS_CS7_CTRL); +	out_be32(&fbcs->csmr7, CONFIG_SYS_CS7_MASK); +#endif + +#ifdef CONFIG_SYS_I2C_FSL +	CONFIG_SYS_I2C_PINMUX_REG &= CONFIG_SYS_I2C_PINMUX_CLR; +	CONFIG_SYS_I2C_PINMUX_REG |= CONFIG_SYS_I2C_PINMUX_SET; +#endif + +	icache_enable(); +} + +/* + * initialize higher level parts of CPU like timers + */ +int cpu_init_r(void) +{ +	return (0); +} + +void uart_port_conf(int port) +{ +	gpio_t *gpio = (gpio_t *) MMAP_GPIO; + +	/* Setup Ports: */ +	switch (port) { +	case 0: +		clrbits_be16(&gpio->par_uart, +			GPIO_PAR_UART_U0RXD | GPIO_PAR_UART_U0TXD); +		setbits_be16(&gpio->par_uart, +			GPIO_PAR_UART_U0RXD | GPIO_PAR_UART_U0TXD); +		break; +	case 1: +		clrbits_be16(&gpio->par_uart, +			GPIO_PAR_UART_U1RXD_MASK | GPIO_PAR_UART_U1TXD_MASK); +		setbits_be16(&gpio->par_uart, +			GPIO_PAR_UART_U1RXD_U1RXD | GPIO_PAR_UART_U1TXD_U1TXD); +		break; +	case 2: +#ifdef CONFIG_SYS_UART2_PRI_GPIO +		clrbits_be16(&gpio->par_uart, +			GPIO_PAR_UART_U2RXD | GPIO_PAR_UART_U2TXD); +		setbits_be16(&gpio->par_uart, +			GPIO_PAR_UART_U2RXD | GPIO_PAR_UART_U2TXD); +#elif defined(CONFIG_SYS_UART2_ALT1_GPIO) +		clrbits_8(&gpio->par_feci2c, +			GPIO_PAR_FECI2C_EMDC_MASK | GPIO_PAR_FECI2C_EMDIO_MASK); +		setbits_8(&gpio->par_feci2c, +			GPIO_PAR_FECI2C_EMDC_U2TXD | GPIO_PAR_FECI2C_EMDIO_U2RXD); +#endif +		break; +	} +} + +#if defined(CONFIG_CMD_NET) +int fecpin_setclear(struct eth_device *dev, int setclear) +{ +	gpio_t *gpio = (gpio_t *) MMAP_GPIO; + +	if (setclear) { +		setbits_8(&gpio->par_feci2c, +			GPIO_PAR_FECI2C_EMDC_FECEMDC | +			GPIO_PAR_FECI2C_EMDIO_FECEMDIO); +	} else { +		clrbits_8(&gpio->par_feci2c, +			GPIO_PAR_FECI2C_EMDC_MASK | +			GPIO_PAR_FECI2C_EMDIO_MASK); +	} + +	return 0; +} +#endif diff --git a/roms/u-boot/arch/m68k/cpu/mcf523x/interrupts.c b/roms/u-boot/arch/m68k/cpu/mcf523x/interrupts.c new file mode 100644 index 00000000..b8ee527b --- /dev/null +++ b/roms/u-boot/arch/m68k/cpu/mcf523x/interrupts.c @@ -0,0 +1,34 @@ +/* + * + * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc. + * TsiChung Liew (Tsi-Chung.Liew@freescale.com) + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +/* CPU specific interrupt routine */ +#include <common.h> +#include <asm/immap.h> +#include <asm/io.h> + +int interrupt_init(void) +{ +	int0_t *intp = (int0_t *) (CONFIG_SYS_INTR_BASE); + +	/* Make sure all interrupts are disabled */ +	setbits_be32(&intp->imrl0, 0x1); + +	enable_interrupts(); +	return 0; +} + +#if defined(CONFIG_MCFTMR) +void dtimer_intr_setup(void) +{ +	int0_t *intp = (int0_t *) (CONFIG_SYS_INTR_BASE); + +	out_8(&intp->icr0[CONFIG_SYS_TMRINTR_NO], CONFIG_SYS_TMRINTR_PRI); +	clrbits_be32(&intp->imrl0, INTC_IPRL_INT0); +	clrbits_be32(&intp->imrl0, CONFIG_SYS_TMRINTR_MASK); +} +#endif diff --git a/roms/u-boot/arch/m68k/cpu/mcf523x/speed.c b/roms/u-boot/arch/m68k/cpu/mcf523x/speed.c new file mode 100644 index 00000000..a4aa05b3 --- /dev/null +++ b/roms/u-boot/arch/m68k/cpu/mcf523x/speed.c @@ -0,0 +1,39 @@ +/* + * + * (C) Copyright 2000-2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc. + * TsiChung Liew (Tsi-Chung.Liew@freescale.com) + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <asm/processor.h> + +#include <asm/immap.h> +#include <asm/io.h> + +DECLARE_GLOBAL_DATA_PTR; +/* + * get_clocks() fills in gd->cpu_clock and gd->bus_clk + */ +int get_clocks(void) +{ +	pll_t *pll = (pll_t *)(MMAP_PLL); + +	out_be32(&pll->syncr, PLL_SYNCR_MFD(1)); + +	while (!(in_be32(&pll->synsr) & PLL_SYNSR_LOCK)) +		; + +	gd->bus_clk = CONFIG_SYS_CLK; +	gd->cpu_clk = (gd->bus_clk * 2); + +#ifdef CONFIG_SYS_I2C_FSL +	gd->arch.i2c1_clk = gd->bus_clk; +#endif + +	return (0); +} diff --git a/roms/u-boot/arch/m68k/cpu/mcf523x/start.S b/roms/u-boot/arch/m68k/cpu/mcf523x/start.S new file mode 100644 index 00000000..8a23e72e --- /dev/null +++ b/roms/u-boot/arch/m68k/cpu/mcf523x/start.S @@ -0,0 +1,257 @@ +/* + * Copyright (C) 2003	Josef Baumgartner <josef.baumgartner@telex.de> + * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <asm-offsets.h> +#include <config.h> +#include "version.h" +#include <asm/cache.h> + +#ifndef	 CONFIG_IDENT_STRING +#define	 CONFIG_IDENT_STRING "" +#endif + +#define _START	_start +#define _FAULT	_fault + +#define SAVE_ALL						\ +	move.w	#0x2700,%sr;		/* disable intrs */	\ +	subl	#60,%sp;		/* space for 15 regs */ \ +	moveml	%d0-%d7/%a0-%a6,%sp@; + +#define RESTORE_ALL						\ +	moveml	%sp@,%d0-%d7/%a0-%a6;				\ +	addl	#60,%sp;		/* space for 15 regs */ \ +	rte; + +.text +/* + *	Vector table. This is used for initial platform startup. + *	These vectors are to catch any un-intended traps. + */ +_vectors: + +INITSP:		.long	0x00000000	/* Initial SP	*/ +INITPC:		.long	_START	/* Initial PC		*/ +vector02:	.long	_FAULT	/* Access Error		*/ +vector03:	.long	_FAULT	/* Address Error	*/ +vector04:	.long	_FAULT	/* Illegal Instruction	*/ +vector05:	.long	_FAULT	/* Reserved		*/ +vector06:	.long	_FAULT	/* Reserved		*/ +vector07:	.long	_FAULT	/* Reserved		*/ +vector08:	.long	_FAULT	/* Privilege Violation	*/ +vector09:	.long	_FAULT	/* Trace		*/ +vector0A:	.long	_FAULT	/* Unimplemented A-Line	*/ +vector0B:	.long	_FAULT	/* Unimplemented F-Line	*/ +vector0C:	.long	_FAULT	/* Debug Interrupt	*/ +vector0D:	.long	_FAULT	/* Reserved		*/ +vector0E:	.long	_FAULT	/* Format Error		*/ +vector0F:	.long	_FAULT	/* Unitialized Int.	*/ + +/* Reserved */ +vector10_17: +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT + +vector18:	.long	_FAULT	/* Spurious Interrupt	*/ +vector19:	.long	_FAULT	/* Autovector Level 1	*/ +vector1A:	.long	_FAULT	/* Autovector Level 2	*/ +vector1B:	.long	_FAULT	/* Autovector Level 3	*/ +vector1C:	.long	_FAULT	/* Autovector Level 4	*/ +vector1D:	.long	_FAULT	/* Autovector Level 5	*/ +vector1E:	.long	_FAULT	/* Autovector Level 6	*/ +vector1F:	.long	_FAULT	/* Autovector Level 7	*/ + +/* TRAP #0 - #15 */ +vector20_2F: +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT + +/* Reserved	*/ +vector30_3F: +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT + +vector64_127: +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT + +vector128_191: +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT + +vector192_255: +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT +.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT + +	.text + +	.globl	_start +_start: +	nop +	nop +	move.w #0x2700,%sr	/* Mask off Interrupt */ + +	/* Set vector base register at the beginning of the Flash */ +	move.l	#CONFIG_SYS_FLASH_BASE, %d0 +	movec	%d0, %VBR + +	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0 +	movec	%d0, %RAMBAR1 + +	/* invalidate and disable cache */ +	move.l	#CF_CACR_CINV, %d0		/* Invalidate cache cmd */ +	movec	%d0, %CACR			/* Invalidate cache */ +	nop +	move.l	#0, %d0 +	movec	%d0, %ACR0 +	movec	%d0, %ACR1 + +	/* initialize general use internal ram */ +	move.l #0, %d0 +	move.l #(ICACHE_STATUS), %a1	/* icache */ +	move.l #(DCACHE_STATUS), %a2	/* icache */ +	move.l %d0, (%a1) +	move.l %d0, (%a2) + +	/* set stackpointer to end of internal ram to get some stackspace for the +	   first c-code */ +	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp +	clr.l %sp@- + +	move.l #__got_start, %a5	/* put relocation table address to a5 */ + +	bsr cpu_init_f			/* run low-level CPU init code (from flash) */ +	bsr board_init_f		/* run low-level board init code (from flash) */ + +	/* board_init_f() does not return */ + +/*------------------------------------------------------------------------------*/ + +/* + * 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: +	link.w %a6,#0 +	move.l 8(%a6), %sp		/* set new stack pointer */ + +	move.l 12(%a6), %d0		/* Save copy of Global Data pointer */ +	move.l 16(%a6), %a0		/* Save copy of Destination Address */ + +	move.l #CONFIG_SYS_MONITOR_BASE, %a1 +	move.l #__init_end, %a2 +	move.l %a0, %a3 + +	/* copy the code to RAM */ +1: +	move.l (%a1)+, (%a3)+ +	cmp.l  %a1,%a2 +	bgt.s	 1b + +/* + * We are done. Do not return, instead branch to second part of board + * initialization, now running from RAM. + */ +	move.l	%a0, %a1 +	add.l	#(in_ram - CONFIG_SYS_MONITOR_BASE), %a1 +	jmp	(%a1) + +in_ram: + +clear_bss: +	/* +	 * Now clear BSS segment +	 */ +	move.l	%a0, %a1 +	add.l	#(_sbss - CONFIG_SYS_MONITOR_BASE),%a1 +	move.l	%a0, %d1 +	add.l	#(_ebss - CONFIG_SYS_MONITOR_BASE),%d1 +6: +	clr.l	(%a1)+ +	cmp.l	%a1,%d1 +	bgt.s	6b + +	/* +	 * fix got table in RAM +	 */ +	move.l	%a0, %a1 +	add.l	#(__got_start - CONFIG_SYS_MONITOR_BASE),%a1 +	move.l	%a1,%a5		/* * fix got pointer register a5 */ + +	move.l	%a0, %a2 +	add.l	#(__got_end - CONFIG_SYS_MONITOR_BASE),%a2 + +7: +	move.l	(%a1),%d1 +	sub.l	#_start,%d1 +	add.l	%a0,%d1 +	move.l	%d1,(%a1)+ +	cmp.l	%a2, %a1 +	bne	7b + +	/* calculate relative jump to board_init_r in ram */ +	move.l %a0, %a1 +	add.l #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1 + +	/* set parameters for board_init_r */ +	move.l %a0,-(%sp)		/* dest_addr */ +	move.l %d0,-(%sp)		/* gd */ +	jsr	(%a1) + +/*------------------------------------------------------------------------------*/ +/* exception code */ +	.globl _fault +_fault: +	bra _fault +	.globl	_exc_handler + +_exc_handler: +	SAVE_ALL +	movel	%sp,%sp@- +	bsr exc_handler +	addql	#4,%sp +	RESTORE_ALL + +	.globl	_int_handler +_int_handler: +	SAVE_ALL +	movel	%sp,%sp@- +	bsr int_handler +	addql	#4,%sp +	RESTORE_ALL + +/*------------------------------------------------------------------------------*/ + +	.globl	version_string +version_string: +	.ascii U_BOOT_VERSION_STRING, "\0" +	.align 4 | 
