[U-Boot] [PATCH v2 3/3] sunxi: Normalise FEL support

Hans de Goede hdegoede at redhat.com
Sat Feb 7 18:59:06 CET 2015


Hi,

On 02/07/2015 06:47 PM, Simon Glass wrote:
> 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.

About the #ifdefs, I would really like to see us move to having 1 unified
loader for sunxi, which means getting rid of them. Even though we do use
a label to return from save_boot_params, save_boot_params could still
use r0 to return stuff, like you did in your previous patch-set, or we
could add a global variable to start.S which lives in .data and gets
initialized with 0, and save_boot_params could optionally save some
skip flags there.

Note this dropping of #ifdefs can wait till after v2015.04, for now this
patch-set should get fel mode working as before which is the goal for
v2015.04.

Regards,

Hans

>
> This series is available at u-boot-dm, branch sunxi-working.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2:
> - Adjust for new save_boot_params() API
> - Drop patch to change r0 to r2 in start.S
> - Add #ifdefs to start.S to deal with FEL
> - Use 'Fast Early Loader' as the full name for FEL
>
>   arch/arm/cpu/armv7/start.S                  |  5 +-
>   arch/arm/cpu/armv7/sunxi/Makefile           |  4 +-
>   arch/arm/cpu/armv7/sunxi/board.c            | 21 ++++++++
>   arch/arm/cpu/armv7/sunxi/config.mk          |  2 -
>   arch/arm/cpu/armv7/sunxi/fel_utils.S        | 25 +++++++++
>   arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds | 82 -----------------------------
>   arch/arm/include/asm/arch-sunxi/sys_proto.h | 10 ++++
>   board/sunxi/Kconfig                         | 10 ++++
>   include/configs/sunxi-common.h              |  6 +--
>   scripts/Makefile.spl                        |  2 -
>   10 files changed, 73 insertions(+), 94 deletions(-)
>   create mode 100644 arch/arm/cpu/armv7/sunxi/fel_utils.S
>   delete mode 100644 arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
>
> diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S
> index 9b49ece..098a83a 100644
> --- a/arch/arm/cpu/armv7/start.S
> +++ b/arch/arm/cpu/armv7/start.S
> @@ -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
>
> diff --git a/arch/arm/cpu/armv7/sunxi/Makefile b/arch/arm/cpu/armv7/sunxi/Makefile
> index 48db744..c1b975a 100644
> --- a/arch/arm/cpu/armv7/sunxi/Makefile
> +++ b/arch/arm/cpu/armv7/sunxi/Makefile
> @@ -38,7 +38,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
> diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
> index 6e28bcd..b7492ac 100644
> --- a/arch/arm/cpu/armv7/sunxi/board.c
> +++ b/arch/arm/cpu/armv7/sunxi/board.c
> @@ -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;
>   }
>
> diff --git a/arch/arm/cpu/armv7/sunxi/config.mk b/arch/arm/cpu/armv7/sunxi/config.mk
> index 00f5ffc..76ffec9 100644
> --- a/arch/arm/cpu/armv7/sunxi/config.mk
> +++ b/arch/arm/cpu/armv7/sunxi/config.mk
> @@ -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
> diff --git a/arch/arm/cpu/armv7/sunxi/fel_utils.S b/arch/arm/cpu/armv7/sunxi/fel_utils.S
> new file mode 100644
> index 0000000..0c1de52
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/sunxi/fel_utils.S
> @@ -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)
> diff --git a/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds b/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
> deleted file mode 100644
> index 928b7c1..0000000
> --- a/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
> +++ /dev/null
> @@ -1,82 +0,0 @@
> -/*
> - * (C) Copyright 2013
> - * Henrik Nordstrom <henrik at 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*) }
> -}
> diff --git a/arch/arm/include/asm/arch-sunxi/sys_proto.h b/arch/arm/include/asm/arch-sunxi/sys_proto.h
> index c3e636e..60a5bd8 100644
> --- a/arch/arm/include/asm/arch-sunxi/sys_proto.h
> +++ b/arch/arm/include/asm/arch-sunxi/sys_proto.h
> @@ -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
> diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
> index 4a21589..3eab81f 100644
> --- a/board/sunxi/Kconfig
> +++ b/board/sunxi/Kconfig
> @@ -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"
> diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
> index 6cfd7e1..3becb4f 100644
> --- a/include/configs/sunxi-common.h
> +++ b/include/configs/sunxi-common.h
> @@ -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 */
>
> @@ -146,10 +144,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 */
>
> diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
> index ecf3037..5a1962b 100644
> --- a/scripts/Makefile.spl
> +++ b/scripts/Makefile.spl
> @@ -153,10 +153,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
>


More information about the U-Boot mailing list