mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +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.
|
||||
* 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 */
|
||||
mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Register
|
||||
bic r0, #CR_V @ V = 0
|
||||
|
@ -67,7 +68,9 @@ save_boot_params_ret:
|
|||
|
||||
/* the mask ROM code should have PLL and others stable */
|
||||
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
||||
#ifndef CONFIG_SPL_FEL
|
||||
bl cpu_init_cp15
|
||||
#endif
|
||||
bl cpu_init_crit
|
||||
#endif
|
||||
|
||||
|
|
|
@ -39,7 +39,5 @@ obj-$(CONFIG_MACH_SUN5I) += dram_sun4i.o
|
|||
obj-$(CONFIG_MACH_SUN6I) += dram_sun6i.o
|
||||
obj-$(CONFIG_MACH_SUN7I) += dram_sun4i.o
|
||||
obj-$(CONFIG_MACH_SUN8I) += dram_sun8i.o
|
||||
ifdef CONFIG_SPL_FEL
|
||||
obj-y += start.o
|
||||
endif
|
||||
obj-y += fel_utils.o
|
||||
endif
|
||||
|
|
|
@ -27,6 +27,13 @@
|
|||
|
||||
#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)
|
||||
{
|
||||
#if CONFIG_CONS_INDEX == 1 && defined(CONFIG_UART0_PORT_F)
|
||||
|
@ -65,6 +72,12 @@ static int gpio_init(void)
|
|||
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)
|
||||
{
|
||||
#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I
|
||||
|
@ -95,6 +108,14 @@ void s_init(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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
# Build a combined spl + u-boot image
|
||||
ifdef CONFIG_SPL
|
||||
ifndef CONFIG_SPL_BUILD
|
||||
ifndef CONFIG_SPL_FEL
|
||||
ALL-y += u-boot-sunxi-with-spl.bin
|
||||
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);
|
||||
|
||||
/* 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
|
||||
|
|
|
@ -149,6 +149,16 @@ config SPL_FEL
|
|||
bool "SPL/FEL mode support"
|
||||
depends on SPL
|
||||
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
|
||||
bool "UART0 on MicroSD breakout board"
|
||||
|
|
|
@ -18,10 +18,8 @@
|
|||
*/
|
||||
#define CONFIG_SUNXI /* sunxi family */
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
#ifndef CONFIG_SPL_FEL
|
||||
#define CONFIG_SYS_THUMB_BUILD /* Thumbs mode to save space in SPL */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <asm/arch/cpu.h> /* get chip and board defs */
|
||||
|
||||
|
@ -149,10 +147,10 @@
|
|||
#define CONFIG_SPL_SERIAL_SUPPORT
|
||||
#define CONFIG_SPL_LIBGENERIC_SUPPORT
|
||||
|
||||
#define CONFIG_SPL_BOARD_LOAD_IMAGE
|
||||
|
||||
#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_MAX_SIZE 0x4000 /* 16 KiB */
|
||||
|
||||
|
|
|
@ -154,10 +154,8 @@ ALL-y += $(obj)/$(BOARD)-spl.bin
|
|||
endif
|
||||
|
||||
ifdef CONFIG_SUNXI
|
||||
ifndef CONFIG_SPL_FEL
|
||||
ALL-y += $(obj)/sunxi-spl.bin
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_SYS_SOC),"at91")
|
||||
ALL-y += boot.bin
|
||||
|
|
Loading…
Reference in a new issue