mpc5200: Add SPL support
This patch adds SPL booting support (NOR flash) for the MPC5200 platforms. Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
parent
d3aa8b8be2
commit
083f2e08d2
@ -41,6 +41,10 @@ COBJS-y += speed.o
|
|||||||
COBJS-$(CONFIG_CMD_USB) += usb_ohci.o
|
COBJS-$(CONFIG_CMD_USB) += usb_ohci.o
|
||||||
COBJS-$(CONFIG_CMD_USB) += usb.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)
|
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
|
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
|
||||||
START := $(addprefix $(obj),$(SSTART) $(CSTART))
|
START := $(addprefix $(obj),$(SSTART) $(CSTART))
|
||||||
|
79
arch/powerpc/cpu/mpc5xxx/spl_boot.c
Normal file
79
arch/powerpc/cpu/mpc5xxx/spl_boot.c
Normal file
@ -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!!! */
|
||||||
|
}
|
@ -50,6 +50,7 @@
|
|||||||
#define MSR_KERNEL (MSR_FP|MSR_ME|MSR_RI)
|
#define MSR_KERNEL (MSR_FP|MSR_ME|MSR_RI)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_SPL_BUILD
|
||||||
/*
|
/*
|
||||||
* Set up GOT: Global Offset Table
|
* Set up GOT: Global Offset Table
|
||||||
*
|
*
|
||||||
@ -68,6 +69,7 @@
|
|||||||
GOT_ENTRY(__bss_end__)
|
GOT_ENTRY(__bss_end__)
|
||||||
GOT_ENTRY(__bss_start)
|
GOT_ENTRY(__bss_start)
|
||||||
END_GOT
|
END_GOT
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version string
|
* Version string
|
||||||
@ -84,6 +86,18 @@ version_string:
|
|||||||
. = EXC_OFF_SYS_RESET
|
. = EXC_OFF_SYS_RESET
|
||||||
.globl _start
|
.globl _start
|
||||||
_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 */
|
mfmsr r5 /* save msr contents */
|
||||||
|
|
||||||
/* Move CSBoot and adjust instruction pointer */
|
/* Move CSBoot and adjust instruction pointer */
|
||||||
@ -152,7 +166,9 @@ lowboot_reentry:
|
|||||||
/* Be careful to keep code relocatable ! */
|
/* Be careful to keep code relocatable ! */
|
||||||
/*--------------------------------------------------------------*/
|
/*--------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_SPL_BUILD
|
||||||
GET_GOT /* initialize GOT access */
|
GET_GOT /* initialize GOT access */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* r3: IMMR */
|
/* r3: IMMR */
|
||||||
bl cpu_init_f /* run low-level CPU init code (in Flash)*/
|
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)*/
|
bl board_init_f /* run 1st part of board init code (in Flash)*/
|
||||||
|
|
||||||
/* NOTREACHED - board_init_f() does not return */
|
/* NOTREACHED - board_init_f() does not return */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_SPL_BUILD
|
||||||
/*
|
/*
|
||||||
* Vector Table
|
* Vector Table
|
||||||
*/
|
*/
|
||||||
@ -333,6 +351,7 @@ int_return:
|
|||||||
lwz r1,GPR1(r1)
|
lwz r1,GPR1(r1)
|
||||||
SYNC
|
SYNC
|
||||||
rfi
|
rfi
|
||||||
|
#endif /* CONFIG_SPL_BUILD */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This code initialises the MPC5xxx processor core
|
* This code initialises the MPC5xxx processor core
|
||||||
@ -522,6 +541,7 @@ get_pvr:
|
|||||||
mfspr r3, PVR
|
mfspr r3, PVR
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
#ifndef CONFIG_SPL_BUILD
|
||||||
/*------------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -759,3 +779,5 @@ trap_init:
|
|||||||
|
|
||||||
mtlr r4 /* restore link register */
|
mtlr r4 /* restore link register */
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
#endif /* CONFIG_SPL_BUILD */
|
||||||
|
57
arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds
Normal file
57
arch/powerpc/cpu/mpc5xxx/u-boot-spl.lds
Normal file
@ -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
|
||||||
|
}
|
31
arch/powerpc/include/asm/spl.h
Normal file
31
arch/powerpc/include/asm/spl.h
Normal file
@ -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
|
@ -57,7 +57,9 @@ SOBJS-y += ticks.o
|
|||||||
SOBJS-y += reloc.o
|
SOBJS-y += reloc.o
|
||||||
|
|
||||||
COBJS-$(CONFIG_BAT_RW) += bat_rw.o
|
COBJS-$(CONFIG_BAT_RW) += bat_rw.o
|
||||||
|
ifndef CONFIG_SPL_BUILD
|
||||||
COBJS-y += board.o
|
COBJS-y += board.o
|
||||||
|
endif
|
||||||
COBJS-y += bootm.o
|
COBJS-y += bootm.o
|
||||||
COBJS-y += cache.o
|
COBJS-y += cache.o
|
||||||
COBJS-y += extable.o
|
COBJS-y += extable.o
|
||||||
@ -66,6 +68,11 @@ COBJS-$(CONFIG_CMD_KGDB) += kgdb.o
|
|||||||
COBJS-${CONFIG_CMD_IDE} += ide.o
|
COBJS-${CONFIG_CMD_IDE} += ide.o
|
||||||
COBJS-y += time.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
|
# Workaround for local bus unaligned access problems
|
||||||
# on MPC512x and MPC5200
|
# on MPC512x and MPC5200
|
||||||
ifdef CONFIG_MPC512X
|
ifdef CONFIG_MPC512X
|
||||||
@ -76,6 +83,7 @@ ifdef CONFIG_MPC5200
|
|||||||
$(obj)ppcstring.o: AFLAGS += -Dmemcpy=__memcpy
|
$(obj)ppcstring.o: AFLAGS += -Dmemcpy=__memcpy
|
||||||
COBJS-y += memcpy_mpc5200.o
|
COBJS-y += memcpy_mpc5200.o
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
endif # not minimal
|
endif # not minimal
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user