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 <s...@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 <hen...@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

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to