[U-Boot] [PATCH] sunxi: Support the FEL boot mode in the regular u-boot build
Hans de Goede
hdegoede at redhat.com
Mon Feb 16 20:42:03 CET 2015
Hi,
On 16-02-15 09:23, Siarhei Siamashka wrote:
> So that the CONFIG_SPL_FEL option is not needed anymore. And the regular
> SPL binary, generated by the default u-boot build, is now also bootable
> over USB in the FEL mode. The SPL still can boot from the SD card too.
>
> A bunch of system registers need to be saved/restored in order to ensure
> that the IRQ handler still works in the BROM FEL code after getting
> control back from the SPL. This is done in the sunxi code instead of
> abusing ifdefs in 'start.S'.
>
> The decision whether to load the main u-boot binary from the SD card or
> return to the FEL code in the BROM is done at runtime.
>
> Signed-off-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>
Thanks, applied to u-boot-sunxi/next and included in the pull-req
which I've just send out. Note I've might a slight change, instead
of adding the #ifndef CONFIG_SPL_FEL to not restore the extra
regs in fel_utils.S, I've removed the #ifdef-s CONFIG_SPL_FEL from
start.S (effectively reverting a small part of Simon's patch) as it
is cleaner to not have sunxi specific #ifdef-s in start.S .
Regards,
Hans
> ---
>
> This patch needs to be applied after Simon's FEL patches:
> http://patchwork.ozlabs.org/patch/437580/
> http://patchwork.ozlabs.org/patch/437581/
> http://patchwork.ozlabs.org/patch/437582/
>
> The CONFIG_SPL_FEL option can be still kept during the transition period.
>
> But we really need to get rid of this special CONFIG_SPL_FEL option as soon
> as possible. Because it is an extra maintenance burden and also introduces
> restrictions, such as the SPL size limit. Which hinders the addition of
> useful features to the SPL.
>
> arch/arm/cpu/armv7/sunxi/board.c | 35 +++++++++++++++++++++++++++++------
> arch/arm/cpu/armv7/sunxi/fel_utils.S | 23 +++++++++++++++++++++++
> 2 files changed, 52 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
> index b7492ac..c02c015 100644
> --- a/arch/arm/cpu/armv7/sunxi/board.c
> +++ b/arch/arm/cpu/armv7/sunxi/board.c
> @@ -30,6 +30,10 @@
> struct fel_stash {
> uint32_t sp;
> uint32_t lr;
> + uint32_t cpsr;
> + uint32_t sctlr;
> + uint32_t vbar;
> + uint32_t cr;
> };
>
> struct fel_stash fel_stash __attribute__((section(".data")));
> @@ -108,15 +112,34 @@ void s_init(void)
> */
> u32 spl_boot_device(void)
> {
> +#ifdef CONFIG_SPL_FEL
> /*
> - * 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.
> + * This is the legacy compile time configuration for a special FEL
> + * enabled build. It has many restrictions and can only boot over USB.
> */
> - if (fel_stash.lr >= 0xffff0000 && fel_stash.lr < 0xffff4000)
> + return BOOT_DEVICE_BOARD;
> +#else
> + /*
> + * When booting from the SD card, the "eGON.BT0" signature is expected
> + * to be found in memory at the address 0x0004 (see the "mksunxiboot"
> + * tool, which generates this header).
> + *
> + * When booting in the FEL mode over USB, this signature is patched in
> + * memory and replaced with something else by the 'fel' tool. This other
> + * signature is selected in such a way, that it can't be present in a
> + * valid bootable SD card image (because the BROM would refuse to
> + * execute the SPL in this case).
> + *
> + * This branch is just making a decision at runtime whether to load
> + * the main u-boot binary from the SD card (if the "eGON.BT0" signature
> + * is found) or return to the FEL code in the BROM to wait and receive
> + * the main u-boot binary over USB.
> + */
> + if (readl(4) == 0x4E4F4765 && readl(8) == 0x3054422E) /* eGON.BT0 */
> + return BOOT_DEVICE_MMC1;
> + else
> return BOOT_DEVICE_BOARD;
> -
> - return BOOT_DEVICE_MMC1;
> +#endif
> }
>
> /* No confirmation data available in SPL yet. Hardcode bootmode */
> diff --git a/arch/arm/cpu/armv7/sunxi/fel_utils.S b/arch/arm/cpu/armv7/sunxi/fel_utils.S
> index 0c1de52..e1b28a3 100644
> --- a/arch/arm/cpu/armv7/sunxi/fel_utils.S
> +++ b/arch/arm/cpu/armv7/sunxi/fel_utils.S
> @@ -15,11 +15,34 @@ ENTRY(save_boot_params)
> ldr r0, =fel_stash
> str sp, [r0, #0]
> str lr, [r0, #4]
> + mrs lr, cpsr @ Read CPSR
> + str lr, [r0, #8]
> + mrc p15, 0, lr, c1, c0, 0 @ Read CP15 SCTLR Register
> + str lr, [r0, #12]
> + mrc p15, 0, lr, c12, c0, 0 @ Read VBAR
> + str lr, [r0, #16]
> + mrc p15, 0, lr, c1, c0, 0 @ Read CP15 Control Register
> + str lr, [r0, #20]
> b save_boot_params_ret
> ENDPROC(save_boot_params)
>
> ENTRY(return_to_fel)
> mov sp, r0
> mov lr, r1
> +#ifndef CONFIG_SPL_FEL
> + /*
> + * The CONFIG_SPL_FEL build skips setting these registers,
> + * so there is no need to restore them here.
> + */
> + ldr r0, =fel_stash
> + ldr r1, [r0, #20]
> + mcr p15, 0, r1, c1, c0, 0 @ Write CP15 Control Register
> + ldr r1, [r0, #16]
> + mcr p15, 0, r1, c12, c0, 0 @ Write VBAR
> + ldr r1, [r0, #12]
> + mcr p15, 0, r1, c1, c0, 0 @ Write CP15 SCTLR Register
> + ldr r1, [r0, #8]
> + msr cpsr, r1 @ Write CPSR
> +#endif
> bx lr
> ENDPROC(return_to_fel)
>
More information about the U-Boot
mailing list