[U-Boot] [PATCH 1/4] sunxi: Make FEL mode usable again

Simon Glass sjg at chromium.org
Sun Feb 1 17:28:36 CET 2015


Hi,

On 30 January 2015 at 04:58, Siarhei Siamashka
<siarhei.siamashka at gmail.com> wrote:
> The commit f630974ccb3ce93e9607a3354e9acb266a8b7e95
> 'sunxi: Move SPL s_init() code to board_init_f()'
> broke the FEL boot mode.
>
> This patch moves the DRAM initialization back to s_init() and
> introduces an assembly entry point for FEL in order to provide
> guaranteed initialization of the gdata pointer (r9). The assembly
> entry point is also needed to ensure that the SPL code starts
> executing in ARM mode.
>
> Because the sunxi board_init_f() does not contain anything that
> is not already done by the default board_init_f(), it is removed
> too.
>
> Signed-off-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>
> ---
>  arch/arm/cpu/armv7/sunxi/Makefile           |  1 +
>  arch/arm/cpu/armv7/sunxi/board.c            | 26 ++++++++++----------------
>  arch/arm/cpu/armv7/sunxi/start_fel.S        | 16 ++++++++++++++++
>  arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds |  3 ++-
>  4 files changed, 29 insertions(+), 17 deletions(-)
>  create mode 100644 arch/arm/cpu/armv7/sunxi/start_fel.S
>
> diff --git a/arch/arm/cpu/armv7/sunxi/Makefile b/arch/arm/cpu/armv7/sunxi/Makefile
> index 48db744..e0d413d 100644
> --- a/arch/arm/cpu/armv7/sunxi/Makefile
> +++ b/arch/arm/cpu/armv7/sunxi/Makefile
> @@ -40,5 +40,6 @@ obj-$(CONFIG_MACH_SUN7I)      += dram_sun4i.o
>  obj-$(CONFIG_MACH_SUN8I)       += dram_sun8i.o
>  ifdef CONFIG_SPL_FEL
>  obj-y  += start.o
> +extra-y        += start_fel.o
>  endif
>  endif
> diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
> index 6e28bcd..ea6cb60 100644
> --- a/arch/arm/cpu/armv7/sunxi/board.c
> +++ b/arch/arm/cpu/armv7/sunxi/board.c
> @@ -85,6 +85,16 @@ void s_init(void)
>         timer_init();
>         gpio_init();
>         i2c_init_board();
> +
> +#ifdef CONFIG_SPL_BUILD
> +       preloader_console_init();

s_init() is called before we have global_data, so you can't use a console.

> +
> +#ifdef CONFIG_SPL_I2C_SUPPORT
> +       /* Needed early by sunxi_board_init if PMU is enabled */
> +       i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
> +#endif
> +       sunxi_board_init();
> +#endif

Why do you need this code here? Can it not go in board_init_f()?

>  }
>
>  #ifdef CONFIG_SPL_BUILD
> @@ -103,22 +113,6 @@ u32 spl_boot_mode(void)
>  {
>         return MMCSD_MODE_RAW;
>  }
> -
> -void board_init_f(ulong dummy)
> -{
> -       preloader_console_init();
> -
> -#ifdef CONFIG_SPL_I2C_SUPPORT
> -       /* Needed early by sunxi_board_init if PMU is enabled */
> -       i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
> -#endif
> -       sunxi_board_init();
> -
> -       /* Clear the BSS. */
> -       memset(__bss_start, 0, __bss_end - __bss_start);
> -
> -       board_init_r(NULL, 0);
> -}
>  #endif
>
>  void reset_cpu(ulong addr)
> diff --git a/arch/arm/cpu/armv7/sunxi/start_fel.S b/arch/arm/cpu/armv7/sunxi/start_fel.S
> new file mode 100644
> index 0000000..e1c7cd4
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/sunxi/start_fel.S
> @@ -0,0 +1,16 @@
> +/*
> + * Entry point of the FEL mode SPL.
> + *
> + * Copyright (c) 2015 Siarhei Siamashka <siarhei.siamashka at gmail.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <asm-offsets.h>
> +#include <config.h>
> +#include <linux/linkage.h>
> +
> +ENTRY(_start_fel)
> +       ldr     r9, =gdata
> +       b       s_init

No we don't want global data here, and need to get rid of gdata so we
can use driver model, etc.

> +ENDPROC(_start_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
> index 928b7c1..beb8900 100644
> --- a/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
> +++ b/arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds
> @@ -6,7 +6,7 @@
>   */
>  OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
>  OUTPUT_ARCH(arm)
> -ENTRY(s_init)
> +ENTRY(_start_fel)
>  SECTIONS
>  {
>         . = 0x00002000;
> @@ -14,6 +14,7 @@ SECTIONS
>         . = ALIGN(4);
>         .text :
>         {
> +               arch/arm/cpu/armv7/sunxi/start_fel.o    (.text)
>                 *(.text.s_init)

Why does this have to jump to a special s_init? Can it not just start
SPL normally as it does on Tegra, Exynos, etc?

>                 *(.text*)
>         }

There has to be a better way of making this work. Also do you have
instructions on how I can try this out on a pcduino3 or other low-cost
board?

I understand that we need to fix this, but other archs deal with this
within the existing framework, so I'd really like to get sunxi into
the same state.

Regards,
Simon


More information about the U-Boot mailing list