sunxi: Normalise FEL support
authorSimon Glass <sjg@chromium.org>
Sat, 7 Feb 2015 17:47:30 +0000 (10:47 -0700)
committerHans de Goede <hdegoede@redhat.com>
Mon, 16 Feb 2015 19:15:09 +0000 (20:15 +0100)
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>
arch/arm/cpu/armv7/start.S
arch/arm/cpu/armv7/sunxi/Makefile
arch/arm/cpu/armv7/sunxi/board.c
arch/arm/cpu/armv7/sunxi/config.mk
arch/arm/cpu/armv7/sunxi/fel_utils.S [new file with mode: 0644]
arch/arm/cpu/armv7/sunxi/u-boot-spl-fel.lds [deleted file]
arch/arm/include/asm/arch-sunxi/sys_proto.h
board/sunxi/Kconfig
include/configs/sunxi-common.h
scripts/Makefile.spl

index 9b49ece2d650e199a1ed3415ed2ae47794f20fab..098a83ab7145bd324e6db9c20e0a5aea95c70970 100644 (file)
@@ -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
 
index a790a2392f9d42256e3baba24c8e7baf1a3c8446..4bb12ad8bdb06a85ace3de8a3aae769f781bdda0 100644 (file)
@@ -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
index 6e28bcd040686a3cc2c36b72cb5f7ff1234da796..b7492ac1fe5e5f5f7552a19b003cbd5dc3da5d60 100644 (file)
 
 #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;
 }
 
index 00f5ffc68301d8e0e9bb56bffaa1f87745b1b167..76ffec9df6aa87f5625daabfc67aa9ba7d848726 100644 (file)
@@ -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 (file)
index 0000000..0c1de52
--- /dev/null
@@ -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 (file)
index 928b7c1..0000000
+++ /dev/null
@@ -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*) }
-}
index c3e636e1d9b6ae9ce1ff331a9660ad538ecc3028..60a5bd8c850d31ef0e04343e773ee86de081339f 100644 (file)
 
 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
index 4a2158988fc9bce0d1991d51e72586e7c2af5615..3eab81fd12b17fc530595258cbecd2b91d926816 100644 (file)
@@ -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"
index 33c06146c6d3f1d8e366fefd4d2abbd4c51d8550..5ece0202a6cb74ecfe0b2ab91a10f322d5603c52 100644 (file)
  */
 #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 */
 
 #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 */
 
index e4b98811867da5d6ce753cbe578d187caaaf60b5..cc189adc0c604bdb2440dc3b5f9b1bc8e1a8d543 100644 (file)
@@ -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