diff options
| -rw-r--r-- | arch/powerpc/cpu/mpc5xxx/Makefile | 4 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc5xxx/spl_boot.c | 79 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc5xxx/start.S | 22 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds | 57 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/spl.h | 31 | ||||
| -rw-r--r-- | arch/powerpc/lib/Makefile | 8 | 
6 files changed, 201 insertions, 0 deletions
| diff --git a/arch/powerpc/cpu/mpc5xxx/Makefile b/arch/powerpc/cpu/mpc5xxx/Makefile index 1a088b77b..8de2c1359 100644 --- a/arch/powerpc/cpu/mpc5xxx/Makefile +++ b/arch/powerpc/cpu/mpc5xxx/Makefile @@ -41,6 +41,10 @@ COBJS-y += speed.o  COBJS-$(CONFIG_CMD_USB) += usb_ohci.o  COBJS-$(CONFIG_CMD_USB) += usb.o +ifdef CONFIG_SPL_BUILD +COBJS-y += spl_boot.o +endif +  SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))  START	:= $(addprefix $(obj),$(SSTART) $(CSTART)) diff --git a/arch/powerpc/cpu/mpc5xxx/spl_boot.c b/arch/powerpc/cpu/mpc5xxx/spl_boot.c new file mode 100644 index 000000000..9f14127dc --- /dev/null +++ b/arch/powerpc/cpu/mpc5xxx/spl_boot.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2012 Stefan Roese <sr@denx.de> + * + * 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. + */ + +#include <common.h> +#include <spl.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* + * Needed to align size SPL image to a 4-byte length + */ +u32 end_align __attribute__ ((section(".end_align"))); + +/* + * Return selected boot device. On MPC5200 its only NOR flash right now. + */ +u32 spl_boot_device(void) +{ +	return BOOT_DEVICE_NOR; +} + +/* + * SPL version of board_init_f() + */ +void board_init_f(ulong bootflag) +{ +	end_align = (u32)__spl_flash_end; + +	/* +	 * First we need to initialize the SDRAM, so that the real +	 * U-Boot or the OS (Linux) can be loaded +	 */ +	initdram(0); + +	/* Clear bss */ +	memset(__bss_start, '\0', __bss_end__ - __bss_start); + +	/* +	 * Init global_data pointer. Has to be done before calling +	 * get_clocks(), as it stores some clock values into gd needed +	 * later on in the serial driver. +	 */ +	/* Pointer is writable since we allocated a register for it */ +	gd = (gd_t *)(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET); +	/* Clear initial global data */ +	memset((void *)gd, 0, sizeof(gd_t)); + +	/* +	 * get_clocks() needs to be called so that the serial driver +	 * works correctly +	 */ +	get_clocks(); + +	/* +	 * Do rudimental console / serial setup +	 */ +	preloader_console_init(); + +	/* +	 * Call board_init_r() (SPL framework version) to load and boot +	 * real U-Boot or OS +	 */ +	board_init_r(NULL, 0); +	/* Does not return!!! */ +} diff --git a/arch/powerpc/cpu/mpc5xxx/start.S b/arch/powerpc/cpu/mpc5xxx/start.S index 51cc4e2a1..ad5bc0a17 100644 --- a/arch/powerpc/cpu/mpc5xxx/start.S +++ b/arch/powerpc/cpu/mpc5xxx/start.S @@ -50,6 +50,7 @@  #define MSR_KERNEL (MSR_FP|MSR_ME|MSR_RI)  #endif +#ifndef CONFIG_SPL_BUILD  /*   * Set up GOT: Global Offset Table   * @@ -68,6 +69,7 @@  	GOT_ENTRY(__bss_end__)  	GOT_ENTRY(__bss_start)  	END_GOT +#endif  /*   * Version string @@ -84,6 +86,18 @@ version_string:  	. = EXC_OFF_SYS_RESET  	.globl	_start  _start: + +#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD) +	/* +	 * This is the entry of the real U-Boot from a board port +	 * that supports SPL booting on the MPC5200. We only need +	 * to call board_init_f() here. Everything else has already +	 * been done in the SPL u-boot version. +	 */ +	GET_GOT			/* initialize GOT access		*/ +	bl	board_init_f	/* run 1st part of board init code (in Flash)*/ +	/* NOTREACHED - board_init_f() does not return */ +#else  	mfmsr	r5			/* save msr contents		*/  	/* Move CSBoot and adjust instruction pointer                   */ @@ -152,7 +166,9 @@ lowboot_reentry:  	/* Be careful to keep code relocatable !			*/  	/*--------------------------------------------------------------*/ +#ifndef CONFIG_SPL_BUILD  	GET_GOT			/* initialize GOT access		*/ +#endif  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code (in Flash)*/ @@ -160,7 +176,9 @@ lowboot_reentry:  	bl	board_init_f	/* run 1st part of board init code (in Flash)*/  	/* NOTREACHED - board_init_f() does not return */ +#endif +#ifndef CONFIG_SPL_BUILD  /*   * Vector Table   */ @@ -333,6 +351,7 @@ int_return:  	lwz	r1,GPR1(r1)  	SYNC  	rfi +#endif /* CONFIG_SPL_BUILD */  /*   * This code initialises the MPC5xxx processor core @@ -522,6 +541,7 @@ get_pvr:  	mfspr	r3, PVR  	blr +#ifndef CONFIG_SPL_BUILD  /*------------------------------------------------------------------------------*/  /* @@ -759,3 +779,5 @@ trap_init:  	mtlr	r4			/* restore link register    */  	blr + +#endif /* CONFIG_SPL_BUILD */ diff --git a/arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds b/arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds new file mode 100644 index 000000000..cab9b9265 --- /dev/null +++ b/arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds @@ -0,0 +1,57 @@ +/* + * Copyright 2012 Stefan Roese <sr@denx.de> + * + * 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 + */ + +MEMORY +{ +	sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR, +		LENGTH = CONFIG_SPL_BSS_MAX_SIZE +	flash : ORIGIN = CONFIG_SPL_TEXT_BASE, +		LENGTH = CONFIG_SYS_SPL_MAX_LEN +} + +OUTPUT_ARCH(powerpc) +ENTRY(_start) +SECTIONS +{ +	.text : +	{ +		__start = .; +		arch/powerpc/cpu/mpc5xxx/start.o	(.text) +		*(.text*) +	} > flash + +	. = ALIGN(4); +	.data : { *(SORT_BY_ALIGNMENT(.data*)) } > flash + +	. = ALIGN(4); +	.rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) } > flash + +	. = ALIGN(4); +	.end_align : { *(.end_align*) } > flash +	__spl_flash_end = .; + +	.bss : +	{ +		. = ALIGN(4); +		__bss_start = .; +		*(.bss*) +		. = ALIGN(4); +		__bss_end__ = .; +	} > sdram +} diff --git a/arch/powerpc/include/asm/spl.h b/arch/powerpc/include/asm/spl.h new file mode 100644 index 000000000..f43bc23c9 --- /dev/null +++ b/arch/powerpc/include/asm/spl.h @@ -0,0 +1,31 @@ +/* + * (C) Copyright 2012 + * Texas Instruments, <www.ti.com> + * + * 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 + */ +#ifndef	_ASM_SPL_H_ +#define	_ASM_SPL_H_ + +#define BOOT_DEVICE_NOR		1 + +/* Linker symbols */ +extern char __bss_start[], __bss_end__[]; + +#endif diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index bf40676ab..844fe8636 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile @@ -57,7 +57,9 @@ SOBJS-y	+= ticks.o  SOBJS-y	+= reloc.o  COBJS-$(CONFIG_BAT_RW) += bat_rw.o +ifndef CONFIG_SPL_BUILD  COBJS-y	+= board.o +endif  COBJS-y	+= bootm.o  COBJS-y	+= cache.o  COBJS-y	+= extable.o @@ -66,6 +68,11 @@ COBJS-$(CONFIG_CMD_KGDB) += kgdb.o  COBJS-${CONFIG_CMD_IDE} += ide.o  COBJS-y	+= time.o +# Don't include the MPC5xxx special memcpy into the +# SPL U-Boot image. memcpy is used in the SPL NOR +# flash driver. And we need the real, fast memcpy +# here. We have no problems with unaligned access. +ifndef CONFIG_SPL_BUILD  # Workaround for local bus unaligned access problems  # on MPC512x and MPC5200  ifdef CONFIG_MPC512X @@ -76,6 +83,7 @@ ifdef CONFIG_MPC5200  $(obj)ppcstring.o: AFLAGS += -Dmemcpy=__memcpy  COBJS-y += memcpy_mpc5200.o  endif +endif  endif # not minimal |