Re: [PATCH u-boot-marvell v2 11/20] arm: mvebu: Correctly set LOAD_ADDRESS for U-Boot SPL binary in kwbimage

Stefan Roese
2022-01-13T06:40:14Z

On 1/12/22 18:20, Pali Rohár wrote:
> U-Boot SPL for mvebu platform is not compiled as position independent.
> Therefore it is required to instruct BootROM to load U-Boot SPL at the
> correct address. Loading of kwbimage binary code at specific address can be
> now achieved by the new LOAD_ADDRESS token as part of BINARY command in
> kwbimage config file.
>
> Update mvebu Makefile to put value of $(CONFIG_SPL_TEXT_BASE) into
> LOAD_ADDRESS token when generating kwbimage.cfg from kwbimage.cfg.in.
>
> It is required to update regex for sed to find replacement tokens at any
> position on a line in kwbimage config file and not only at the beginning of
> the line. This is because LOAD_ADDRESS is specified at the end of line
> containing the BINARY command.
>
> It looks like all Armada boards set CONFIG_SPL_TEXT_BASE to value
> 0x40004030 or 0x40000030. Why this value? It is because main kwbimage
> header is at address 0x40004030 or 0x40000000 and it is 32 bytes long.
> After the main header there is the binary header, which consist of 1 byte
> for type, 3 bytes for size, 1 byte for number of arguments, 3 reserved
> bytes and then 4 bytes for each argument. After these arguments comes the
> executable code.
>
> So arguments start at address 0x40004028 or 0x40000028. Before commit
> e6571f38c943 ("arm: mvebu: Remove dummy BIN header arguments for SPL
> binary") there were two (dummy) arguments, which resulted in load address
> of 0x40004030 or 0x40000030, always. After that commit (which removed dummy
> arguments), load address stayed same due to the 128-bit alignment done by
> mkimage.
>
> This patch now reflects the dependency between $(CONFIG_SPL_TEXT_BASE),
> load address and dummy kwbimage arguments, and allows the user to adjust
> $(CONFIG_SPL_TEXT_BASE) config option to some other value.
>
> For unsupported values, when mkimage/kwbimage cannot set chosen load address
> as specified by $(CONFIG_SPL_TEXT_BASE), the build process now fails,
> instead of silently generating non-working kwbimage.
>
> Removal of this alignment between $(CONFIG_SPL_TEXT_BASE) and LOAD_ADDRESS
> can only be done by compiling U-Boot SPL as position independent. But this
> currently is not possible for 32-bit ARM version of U-Boot SPL.
>
> Signed-off-by: Pali Rohár <pali@kernel.org>
> Reviewed-by: Marek Behún <marek.behun@nic.cz>

Reviewed-by: Stefan Roese <sr@denx.de>

Thanks,
Stefan

> ---
> arch/arm/mach-mvebu/Makefile | 5 ++++-
> arch/arm/mach-mvebu/kwbimage.cfg.in | 4 ++--
> 2 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile
> index 17006c9df9b0..9ace049c9d7c 100644
> --- a/arch/arm/mach-mvebu/Makefile
> +++ b/arch/arm/mach-mvebu/Makefile
> @@ -38,6 +38,9 @@ else ifneq ($(CONFIG_ARMADA_375)$(CONFIG_ARMADA_38X)$(CONFIG_ARMADA_39X),)
> KWB_CFG_CPU = A9
> endif
>
> +KWB_REPLACE += LOAD_ADDRESS
> +KWB_CFG_LOAD_ADDRESS = $(CONFIG_SPL_TEXT_BASE)
> +
> KWB_REPLACE += BOOT_FROM
> ifneq ($(CONFIG_MVEBU_SPL_BOOT_DEVICE_SPI),)
> KWB_CFG_BOOT_FROM=spi
> @@ -67,7 +70,7 @@ KWB_CFG_SEC_FUSE_DUMP = a38x
> endif
>
> quiet_cmd_kwbcfg = KWBCFG $@
> -cmd_kwbcfg = sed -ne '$(foreach V,$(KWB_REPLACE),s/^\#@$(V)/$(V) $(KWB_CFG_$(V))/;)p' \
> +cmd_kwbcfg = sed -ne '$(foreach V,$(KWB_REPLACE),s/\#@$(V)/$(V) $(KWB_CFG_$(V))/;)p' \
> <$< >$(dir $@)$(@F)
>
> $(obj)/kwbimage.cfg: $(src)/kwbimage.cfg.in include/autoconf.mk \
> diff --git a/arch/arm/mach-mvebu/kwbimage.cfg.in b/arch/arm/mach-mvebu/kwbimage.cfg.in
> index 8e720daf4820..603e8863450c 100644
> --- a/arch/arm/mach-mvebu/kwbimage.cfg.in
> +++ b/arch/arm/mach-mvebu/kwbimage.cfg.in
> @@ -11,5 +11,5 @@ VERSION 1
> # Boot Media configurations
> #@BOOT_FROM
>
> -# Binary Header (bin_hdr) with DDR3 training code
> -BINARY spl/u-boot-spl.bin
> +# Include U-Boot SPL with DDR3 training code into Binary Header
> +BINARY spl/u-boot-spl.bin #@LOAD_ADDRESS
>

Viele Grüße,
Stefan Roese

--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr@denx.de