Message ID | 1423023534-4318-5-git-send-email-sjg@chromium.org |
---|---|
State | Superseded |
Delegated to: | Ian Campbell |
Headers | show |
Hi, On 04-02-15 05:18, Simon Glass wrote: > (What does FEL stand for?) > > This is an attempt to make sunxi's FEL code fit with the normal U-Boot > boot sequence instead of creating its own. > > Most of the FEL special-case code is removed, although I may have gone too > far with my changes to generate a u-boot-sunxi-with-spl.bin file even when > FEL is enabled. This may not be possible since the MMC stack makes SPL > too large for FEL anyway, although it may be possible for other boot > mediums. > > This series is available at u-boot-dm, branch sunxi-working. Thanks for working on this, I like the direction where this is heading, if Albert is ok with the start.S changes this would be an excellent way to fix FEL mode for v2015.04. WRT you going to far when also building a u-boot-sunxi-with-spl.bin when FEL is enabled, your right, AFAIK that binary will not work when written to sdcard because FEL mode has a CONFIG_SPL_TEXT_BASE of 0x2000 where as non FEL has CONFIG_SPL_TEXT_BASE set to 0x0020. But we've discussed in the past to use 0x2000 everywhere, this would mean moving the stack pointer to 0x2000 instead of 0x8000, and then making the normal SPL fit between 0x2000 - 0x8000. All you need to change then AFAIK is tools/mksunxiboot.c so that the jump instruction which is the first 32 bit word of the header it generates jumps to 0x2000 rather then 0x0020, and then we may be able to have a unified build which does both FEL and regular SPL for sdcard boot. Regards, Hans > > Signed-off-by: Simon Glass <sjg@chromium.org> > --- > > 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 | 26 +++++++++ > 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 - > 9 files changed, 70 insertions(+), 93 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/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..42739df > --- /dev/null > +++ b/arch/arm/cpu/armv7/sunxi/fel_utils.S > @@ -0,0 +1,26 @@ > +/* > + * 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 r4, [r0, #4] /* Store lr */ > + mov r0, #RESET_SKIP_VBVAR | RESET_SKIP_CP15 > + bx lr > +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@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..c50cffe 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 <insert_full_name_here> (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 (why? what do we lose?). 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 >
Hello Hans, On Wed, 04 Feb 2015 09:47:41 +0100, Hans de Goede <hdegoede@redhat.com> wrote: > Hi, > > On 04-02-15 05:18, Simon Glass wrote: > > (What does FEL stand for?) > > > > This is an attempt to make sunxi's FEL code fit with the normal U-Boot > > boot sequence instead of creating its own. > > > > Most of the FEL special-case code is removed, although I may have gone too > > far with my changes to generate a u-boot-sunxi-with-spl.bin file even when > > FEL is enabled. This may not be possible since the MMC stack makes SPL > > too large for FEL anyway, although it may be possible for other boot > > mediums. > > > > This series is available at u-boot-dm, branch sunxi-working. > > Thanks for working on this, I like the direction where this is heading, > if Albert is ok with the start.S changes this would be an excellent way > to fix FEL mode for v2015.04. Even though the series came in after window close and after -rc1, I'm fine with considering it for 2015.04. Amicalement,
Hi Hans, On 4 February 2015 at 01:47, Hans de Goede <hdegoede@redhat.com> wrote: > Hi, > > On 04-02-15 05:18, Simon Glass wrote: >> >> (What does FEL stand for?) >> >> This is an attempt to make sunxi's FEL code fit with the normal U-Boot >> boot sequence instead of creating its own. >> >> Most of the FEL special-case code is removed, although I may have gone too >> far with my changes to generate a u-boot-sunxi-with-spl.bin file even when >> FEL is enabled. This may not be possible since the MMC stack makes SPL >> too large for FEL anyway, although it may be possible for other boot >> mediums. >> >> This series is available at u-boot-dm, branch sunxi-working. > > > Thanks for working on this, I like the direction where this is heading, > if Albert is ok with the start.S changes this would be an excellent way > to fix FEL mode for v2015.04. OK great! > > WRT you going to far when also building a u-boot-sunxi-with-spl.bin when > FEL is enabled, your right, AFAIK that binary will not work when written > to sdcard because FEL mode has a CONFIG_SPL_TEXT_BASE of 0x2000 where > as non FEL has CONFIG_SPL_TEXT_BASE set to 0x0020. > > But we've discussed in the past to use 0x2000 everywhere, this would mean > moving the stack pointer to 0x2000 instead of 0x8000, and then making > the normal SPL fit between 0x2000 - 0x8000. > > All you need to change then AFAIK is tools/mksunxiboot.c so that the jump > instruction which is the first 32 bit word of the header it generates jumps > to 0x2000 rather then 0x0020, and then we may be able to have a unified > build which does both FEL and regular SPL for sdcard boot. Interesting, I wondered about that. I see your other series too so this could all fit quite nicely. I'll focus on getting this series through with Albert's help. Regards, Simon
Hi, On 05-02-15 03:52, Simon Glass wrote: > Hi Hans, > > On 4 February 2015 at 01:47, Hans de Goede <hdegoede@redhat.com> wrote: >> Hi, >> >> On 04-02-15 05:18, Simon Glass wrote: >>> >>> (What does FEL stand for?) >>> >>> This is an attempt to make sunxi's FEL code fit with the normal U-Boot >>> boot sequence instead of creating its own. >>> >>> Most of the FEL special-case code is removed, although I may have gone too >>> far with my changes to generate a u-boot-sunxi-with-spl.bin file even when >>> FEL is enabled. This may not be possible since the MMC stack makes SPL >>> too large for FEL anyway, although it may be possible for other boot >>> mediums. >>> >>> This series is available at u-boot-dm, branch sunxi-working. >> >> >> Thanks for working on this, I like the direction where this is heading, >> if Albert is ok with the start.S changes this would be an excellent way >> to fix FEL mode for v2015.04. > > OK great! > >> >> WRT you going to far when also building a u-boot-sunxi-with-spl.bin when >> FEL is enabled, your right, AFAIK that binary will not work when written >> to sdcard because FEL mode has a CONFIG_SPL_TEXT_BASE of 0x2000 where >> as non FEL has CONFIG_SPL_TEXT_BASE set to 0x0020. >> >> But we've discussed in the past to use 0x2000 everywhere, this would mean >> moving the stack pointer to 0x2000 instead of 0x8000, and then making >> the normal SPL fit between 0x2000 - 0x8000. >> >> All you need to change then AFAIK is tools/mksunxiboot.c so that the jump >> instruction which is the first 32 bit word of the header it generates jumps >> to 0x2000 rather then 0x0020, and then we may be able to have a unified >> build which does both FEL and regular SPL for sdcard boot. > > Interesting, I wondered about that. > > I see your other series too so this could all fit quite nicely. I'll > focus on getting this series through with Albert's help. Great, thanks for working on this. About the having one unified SPL, I believe that that is probably best left as something to do for v2015.07, and that we should just try to get your work to fix FEL mode to work in for v2015.04, do you agree ? I'm asking because I'm wondering what the plan is wrt merging my SPL size reduction series, we could in theory add that to v2015.04, but it can also wait, and from a merge window pov it should wait. If we want to add it to v2015.04 anyways I can take it upstream in its entirety through u-boot-sunxi, or you can first merge the 2 malloc_simple patches through u-boot-dm. Regards, Hans
On Tue, 3 Feb 2015 21:18:54 -0700 Simon Glass <sjg@chromium.org> wrote: > (What does FEL stand for?) That's a good question. I believe that it might be based on the "jump to fel" message from the console output of the Allwinner's BOOT0 bootloader: http://linux-sunxi.org/FEL#Serial_output Other than this, I don't know what this name stands for. In fact the FEL code has a special entry point at 0xffff0020, which is the target of this "jump to fel" action in BOOT0: https://github.com/hno/Allwinner-Info/blob/master/BROM/ffff0000.s#L9 It initializes the USB hardware again, and I believe that this is the reason why I have some problems trying to use this method. So far the flow looks like this: 1. The SPL is uploaded to SRAM and executed (to initialize DRAM) and other things. 2. As the last step in the SPL ('return_to_fel' in your code), we just transfer control directly to 0xffff0020 instead of using the address from the lr register. 3. The USB stack in my PC seems to be a bit confused by the MBUS hardware re-init. For example, the next "fel ver" command fails for me with a timeout. However the follow up fel commands work fine, and I can successfully "write" and "exe" the main u-boot binary. The incomplete demo patch for the fel tool has been posted at http://lists.denx.de/pipermail/u-boot/2015-February/204024.html > This is an attempt to make sunxi's FEL code fit with the normal U-Boot > boot sequence instead of creating its own. > > Most of the FEL special-case code is removed, although I may have gone too > far with my changes to generate a u-boot-sunxi-with-spl.bin file even when > FEL is enabled. This may not be possible since the MMC stack makes SPL > too large for FEL anyway, although it may be possible for other boot > mediums. This is actually very good. If we can resolve the jump to 0xffff0020 problems (try to perform a clean USB shutdown before doing this?), then the SPL size limitation for USB booting is gone and we get a unified SPL binary for both SD card boot and boot over USB. With no need for a lot of special sunxi things in the U-Boot boot sequence. I'm going to have another look at it today in the evening to see if the remaining problems can be resolved. > This series is available at u-boot-dm, branch sunxi-working. Thanks a lot for this work.
Hi Siarhei, On 5 February 2015 at 03:21, Siarhei Siamashka <siarhei.siamashka@gmail.com> wrote: > On Tue, 3 Feb 2015 21:18:54 -0700 > Simon Glass <sjg@chromium.org> wrote: > >> (What does FEL stand for?) > > That's a good question. I believe that it might be based on > the "jump to fel" message from the console output of the > Allwinner's BOOT0 bootloader: http://linux-sunxi.org/FEL#Serial_output > > Other than this, I don't know what this name stands for. Can we ask the manufacturer? Maybe it is something like Firmware Early Loader? > > In fact the FEL code has a special entry point at 0xffff0020, which is > the target of this "jump to fel" action in BOOT0: > https://github.com/hno/Allwinner-Info/blob/master/BROM/ffff0000.s#L9 > > It initializes the USB hardware again, and I believe that this is the > reason why I have some problems trying to use this method. So far the > flow looks like this: > > 1. The SPL is uploaded to SRAM and executed (to initialize DRAM) and > other things. > 2. As the last step in the SPL ('return_to_fel' in your code), we just > transfer control directly to 0xffff0020 instead of using the address > from the lr register. > 3. The USB stack in my PC seems to be a bit confused by the MBUS > hardware re-init. For example, the next "fel ver" command fails > for me with a timeout. However the follow up fel commands work fine, > and I can successfully "write" and "exe" the main u-boot binary. > > The incomplete demo patch for the fel tool has been posted at > http://lists.denx.de/pipermail/u-boot/2015-February/204024.html > >> This is an attempt to make sunxi's FEL code fit with the normal U-Boot >> boot sequence instead of creating its own. >> >> Most of the FEL special-case code is removed, although I may have gone too >> far with my changes to generate a u-boot-sunxi-with-spl.bin file even when >> FEL is enabled. This may not be possible since the MMC stack makes SPL >> too large for FEL anyway, although it may be possible for other boot >> mediums. > > This is actually very good. > > If we can resolve the jump to 0xffff0020 problems (try to perform a > clean USB shutdown before doing this?), then the SPL size limitation > for USB booting is gone and we get a unified SPL binary for both SD > card boot and boot over USB. With no need for a lot of special sunxi > things in the U-Boot boot sequence. I'm going to have another look > at it today in the evening to see if the remaining problems can be > resolved. > >> This series is available at u-boot-dm, branch sunxi-working. > > Thanks a lot for this work. It looks like this might get improved quite a bit - despite the lack of docs you seem to understand it very well :-) In any case I'll be using FEL from now on on sunxi. It is much more convenient. Regards, Simon
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..42739df --- /dev/null +++ b/arch/arm/cpu/armv7/sunxi/fel_utils.S @@ -0,0 +1,26 @@ +/* + * 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 r4, [r0, #4] /* Store lr */ + mov r0, #RESET_SKIP_VBVAR | RESET_SKIP_CP15 + bx lr +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@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..c50cffe 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 <insert_full_name_here> (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 (why? what do we lose?). 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
(What does FEL stand for?) This is an attempt to make sunxi's FEL code fit with the normal U-Boot boot sequence instead of creating its own. Most of the FEL special-case code is removed, although I may have gone too far with my changes to generate a u-boot-sunxi-with-spl.bin file even when FEL is enabled. This may not be possible since the MMC stack makes SPL too large for FEL anyway, although it may be possible for other boot mediums. This series is available at u-boot-dm, branch sunxi-working. Signed-off-by: Simon Glass <sjg@chromium.org> --- 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 | 26 +++++++++ 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 - 9 files changed, 70 insertions(+), 93 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