mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-06-22 14:41:42 +00:00
sunxi: Normalise FEL support
Make sunxi's FEL code fit with the normal U-Boot boot sequence instead of creating its own. There are some #ifdefs required in start.S. Future work will hopefully remove these. This series is available at u-boot-dm, branch sunxi-working. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
c01c71bc16
commit
942cb0b6a2
10 changed files with 73 additions and 94 deletions
|
@ -54,7 +54,8 @@ save_boot_params_ret:
|
||||||
* (OMAP4 spl TEXT_BASE is not 32 byte aligned.
|
* (OMAP4 spl TEXT_BASE is not 32 byte aligned.
|
||||||
* Continue to use ROM code vector only in OMAP4 spl)
|
* Continue to use ROM code vector only in OMAP4 spl)
|
||||||
*/
|
*/
|
||||||
#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
|
#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD)) && \
|
||||||
|
!defined(CONFIG_SPL_FEL)
|
||||||
/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
|
/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
|
||||||
mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Register
|
mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Register
|
||||||
bic r0, #CR_V @ V = 0
|
bic r0, #CR_V @ V = 0
|
||||||
|
@ -67,7 +68,9 @@ save_boot_params_ret:
|
||||||
|
|
||||||
/* the mask ROM code should have PLL and others stable */
|
/* the mask ROM code should have PLL and others stable */
|
||||||
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
||||||
|
#ifndef CONFIG_SPL_FEL
|
||||||
bl cpu_init_cp15
|
bl cpu_init_cp15
|
||||||
|
#endif
|
||||||
bl cpu_init_crit
|
bl cpu_init_crit
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,5 @@ obj-$(CONFIG_MACH_SUN5I) += dram_sun4i.o
|
||||||
obj-$(CONFIG_MACH_SUN6I) += dram_sun6i.o
|
obj-$(CONFIG_MACH_SUN6I) += dram_sun6i.o
|
||||||
obj-$(CONFIG_MACH_SUN7I) += dram_sun4i.o
|
obj-$(CONFIG_MACH_SUN7I) += dram_sun4i.o
|
||||||
obj-$(CONFIG_MACH_SUN8I) += dram_sun8i.o
|
obj-$(CONFIG_MACH_SUN8I) += dram_sun8i.o
|
||||||
ifdef CONFIG_SPL_FEL
|
obj-y += fel_utils.o
|
||||||
obj-y += start.o
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -27,6 +27,13 @@
|
||||||
|
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
struct fel_stash {
|
||||||
|
uint32_t sp;
|
||||||
|
uint32_t lr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fel_stash fel_stash __attribute__((section(".data")));
|
||||||
|
|
||||||
static int gpio_init(void)
|
static int gpio_init(void)
|
||||||
{
|
{
|
||||||
#if CONFIG_CONS_INDEX == 1 && defined(CONFIG_UART0_PORT_F)
|
#if CONFIG_CONS_INDEX == 1 && defined(CONFIG_UART0_PORT_F)
|
||||||
|
@ -65,6 +72,12 @@ static int gpio_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void spl_board_load_image(void)
|
||||||
|
{
|
||||||
|
debug("Returning to FEL sp=%x, lr=%x\n", fel_stash.sp, fel_stash.lr);
|
||||||
|
return_to_fel(fel_stash.sp, fel_stash.lr);
|
||||||
|
}
|
||||||
|
|
||||||
void s_init(void)
|
void s_init(void)
|
||||||
{
|
{
|
||||||
#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I
|
#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I
|
||||||
|
@ -95,6 +108,14 @@ void s_init(void)
|
||||||
*/
|
*/
|
||||||
u32 spl_boot_device(void)
|
u32 spl_boot_device(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Have we been asked to return to the FEL portion of the boot ROM?
|
||||||
|
* TODO: We need a more robust test here, or bracket this with
|
||||||
|
* #ifdef CONFIG_SPL_FEL.
|
||||||
|
*/
|
||||||
|
if (fel_stash.lr >= 0xffff0000 && fel_stash.lr < 0xffff4000)
|
||||||
|
return BOOT_DEVICE_BOARD;
|
||||||
|
|
||||||
return BOOT_DEVICE_MMC1;
|
return BOOT_DEVICE_MMC1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
# Build a combined spl + u-boot image
|
# Build a combined spl + u-boot image
|
||||||
ifdef CONFIG_SPL
|
ifdef CONFIG_SPL
|
||||||
ifndef CONFIG_SPL_BUILD
|
ifndef CONFIG_SPL_BUILD
|
||||||
ifndef CONFIG_SPL_FEL
|
|
||||||
ALL-y += u-boot-sunxi-with-spl.bin
|
ALL-y += u-boot-sunxi-with-spl.bin
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
|
|
25
arch/arm/cpu/armv7/sunxi/fel_utils.S
Normal file
25
arch/arm/cpu/armv7/sunxi/fel_utils.S
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Utility functions for FEL mode.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Google, Inc
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm-offsets.h>
|
||||||
|
#include <config.h>
|
||||||
|
#include <asm/system.h>
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
ENTRY(save_boot_params)
|
||||||
|
ldr r0, =fel_stash
|
||||||
|
str sp, [r0, #0]
|
||||||
|
str lr, [r0, #4]
|
||||||
|
b save_boot_params_ret
|
||||||
|
ENDPROC(save_boot_params)
|
||||||
|
|
||||||
|
ENTRY(return_to_fel)
|
||||||
|
mov sp, r0
|
||||||
|
mov lr, r1
|
||||||
|
bx lr
|
||||||
|
ENDPROC(return_to_fel)
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2013
|
|
||||||
* Henrik Nordstrom <henrik@henriknordstrom.net>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
|
||||||
*/
|
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(s_init)
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = 0x00002000;
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.text :
|
|
||||||
{
|
|
||||||
*(.text.s_init)
|
|
||||||
*(.text*)
|
|
||||||
}
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.data : {
|
|
||||||
*(.data*)
|
|
||||||
}
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.u_boot_list : {
|
|
||||||
KEEP(*(SORT(.u_boot_list*)));
|
|
||||||
}
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
. = .;
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.rel.dyn : {
|
|
||||||
__rel_dyn_start = .;
|
|
||||||
*(.rel*)
|
|
||||||
__rel_dyn_end = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dynsym : {
|
|
||||||
__dynsym_start = .;
|
|
||||||
*(.dynsym)
|
|
||||||
}
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.note.gnu.build-id :
|
|
||||||
{
|
|
||||||
*(.note.gnu.build-id)
|
|
||||||
}
|
|
||||||
_end = .;
|
|
||||||
|
|
||||||
. = ALIGN(4096);
|
|
||||||
.mmutable : {
|
|
||||||
*(.mmutable)
|
|
||||||
}
|
|
||||||
|
|
||||||
.bss_start __rel_dyn_start (OVERLAY) : {
|
|
||||||
KEEP(*(.__bss_start));
|
|
||||||
__bss_base = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bss __bss_base (OVERLAY) : {
|
|
||||||
*(.bss*)
|
|
||||||
. = ALIGN(4);
|
|
||||||
__bss_limit = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bss_end __bss_limit (OVERLAY) : {
|
|
||||||
KEEP(*(.__bss_end));
|
|
||||||
}
|
|
||||||
|
|
||||||
/DISCARD/ : { *(.dynstr*) }
|
|
||||||
/DISCARD/ : { *(.dynamic*) }
|
|
||||||
/DISCARD/ : { *(.plt*) }
|
|
||||||
/DISCARD/ : { *(.interp*) }
|
|
||||||
/DISCARD/ : { *(.gnu*) }
|
|
||||||
/DISCARD/ : { *(.note*) }
|
|
||||||
}
|
|
|
@ -13,4 +13,14 @@
|
||||||
|
|
||||||
void sdelay(unsigned long);
|
void sdelay(unsigned long);
|
||||||
|
|
||||||
|
/* return_to_fel() - Return to BROM from SPL
|
||||||
|
*
|
||||||
|
* This returns back into the BROM after U-Boot SPL has performed its initial
|
||||||
|
* init. It uses the provided lr and sp to do so.
|
||||||
|
*
|
||||||
|
* @lr: BROM link register value (return address)
|
||||||
|
* @sp: BROM stack pointer
|
||||||
|
*/
|
||||||
|
void return_to_fel(uint32_t lr, uint32_t sp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -149,6 +149,16 @@ config SPL_FEL
|
||||||
bool "SPL/FEL mode support"
|
bool "SPL/FEL mode support"
|
||||||
depends on SPL
|
depends on SPL
|
||||||
default n
|
default n
|
||||||
|
help
|
||||||
|
This enables support for Fast Early Loader (FEL) mode. This
|
||||||
|
allows U-Boot to be loaded to the board over USB by the on-chip
|
||||||
|
boot rom. U-Boot should be sent in two parts: SPL first, with
|
||||||
|
'fel write 0x2000 u-boot-spl.bin; fel exe 0x2000' then U-Boot with
|
||||||
|
'fel write 0x4a000000 u-boot.bin; fel exe 0x4a000000'. This option
|
||||||
|
shrinks the amount of SRAM available to SPL, so only enable it if
|
||||||
|
you need FEL. Note that enabling this option only allows FEL to be
|
||||||
|
used; it is still possible to boot U-Boot from boot media. U-Boot
|
||||||
|
SPL detects when it is being loaded using FEL.
|
||||||
|
|
||||||
config UART0_PORT_F
|
config UART0_PORT_F
|
||||||
bool "UART0 on MicroSD breakout board"
|
bool "UART0 on MicroSD breakout board"
|
||||||
|
|
|
@ -18,10 +18,8 @@
|
||||||
*/
|
*/
|
||||||
#define CONFIG_SUNXI /* sunxi family */
|
#define CONFIG_SUNXI /* sunxi family */
|
||||||
#ifdef CONFIG_SPL_BUILD
|
#ifdef CONFIG_SPL_BUILD
|
||||||
#ifndef CONFIG_SPL_FEL
|
|
||||||
#define CONFIG_SYS_THUMB_BUILD /* Thumbs mode to save space in SPL */
|
#define CONFIG_SYS_THUMB_BUILD /* Thumbs mode to save space in SPL */
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <asm/arch/cpu.h> /* get chip and board defs */
|
#include <asm/arch/cpu.h> /* get chip and board defs */
|
||||||
|
|
||||||
|
@ -149,10 +147,10 @@
|
||||||
#define CONFIG_SPL_SERIAL_SUPPORT
|
#define CONFIG_SPL_SERIAL_SUPPORT
|
||||||
#define CONFIG_SPL_LIBGENERIC_SUPPORT
|
#define CONFIG_SPL_LIBGENERIC_SUPPORT
|
||||||
|
|
||||||
|
#define CONFIG_SPL_BOARD_LOAD_IMAGE
|
||||||
|
|
||||||
#ifdef CONFIG_SPL_FEL
|
#ifdef CONFIG_SPL_FEL
|
||||||
|
|
||||||
#define CONFIG_SPL_LDSCRIPT "arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds"
|
|
||||||
#define CONFIG_SPL_START_S_PATH "arch/arm/cpu/armv7/sunxi"
|
|
||||||
#define CONFIG_SPL_TEXT_BASE 0x2000
|
#define CONFIG_SPL_TEXT_BASE 0x2000
|
||||||
#define CONFIG_SPL_MAX_SIZE 0x4000 /* 16 KiB */
|
#define CONFIG_SPL_MAX_SIZE 0x4000 /* 16 KiB */
|
||||||
|
|
||||||
|
|
|
@ -154,10 +154,8 @@ ALL-y += $(obj)/$(BOARD)-spl.bin
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_SUNXI
|
ifdef CONFIG_SUNXI
|
||||||
ifndef CONFIG_SPL_FEL
|
|
||||||
ALL-y += $(obj)/sunxi-spl.bin
|
ALL-y += $(obj)/sunxi-spl.bin
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_SYS_SOC),"at91")
|
ifeq ($(CONFIG_SYS_SOC),"at91")
|
||||||
ALL-y += boot.bin
|
ALL-y += boot.bin
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue