[PATCH v4 2/4] ARM: stm32: Factor out save_boot_params
Patrice CHOTARD
patrice.chotard at foss.st.com
Fri Jan 13 15:02:02 CET 2023
On 1/12/23 18:58, Marek Vasut wrote:
> The STM32MP15xx platform currently comes with two incompatible
> implementations of save_boot_params() weak function override.
> Factor the save_boot_params() implementation into common cpu.c
> code and provide accessors to read out both ROM API table address
> and DT address from any place in the code instead.
>
> Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>
> Reviewed-by: Patrick Delaunay <patrick.delaunay at foss.st.com>
> Signed-off-by: Marek Vasut <marex at denx.de>
> ---
> Cc: Alexandru Gagniuc <mr.nuke.me at gmail.com>
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> ---
> V2: Avoid #if CONFIG... , use if (CONFIG... instead
> V3: No change
> V4: - Add RB from Patrick
> - Include sys_proto.h to avoid undefined symbol warning
> ---
> arch/arm/mach-stm32mp/boot_params.c | 21 ++---------
> arch/arm/mach-stm32mp/cpu.c | 35 +++++++++++++++++++
> arch/arm/mach-stm32mp/ecdsa_romapi.c | 20 ++---------
> .../arm/mach-stm32mp/include/mach/sys_proto.h | 3 ++
> 4 files changed, 43 insertions(+), 36 deletions(-)
>
> diff --git a/arch/arm/mach-stm32mp/boot_params.c b/arch/arm/mach-stm32mp/boot_params.c
> index e91ef1b2fc7..24d04dcf0f9 100644
> --- a/arch/arm/mach-stm32mp/boot_params.c
> +++ b/arch/arm/mach-stm32mp/boot_params.c
> @@ -8,33 +8,18 @@
> #include <common.h>
> #include <log.h>
> #include <linux/libfdt.h>
> +#include <asm/arch/sys_proto.h>
> #include <asm/sections.h>
> #include <asm/system.h>
>
> -/*
> - * Force data-section, as .bss will not be valid
> - * when save_boot_params is invoked.
> - */
> -static unsigned long nt_fw_dtb __section(".data");
> -
> -/*
> - * Save the FDT address provided by TF-A in r2 at boot time
> - * This function is called from start.S
> - */
> -void save_boot_params(unsigned long r0, unsigned long r1, unsigned long r2,
> - unsigned long r3)
> -{
> - nt_fw_dtb = r2;
> -
> - save_boot_params_ret();
> -}
> -
> /*
> * Use the saved FDT address provided by TF-A at boot time (NT_FW_CONFIG =
> * Non Trusted Firmware configuration file) when the pointer is valid
> */
> void *board_fdt_blob_setup(int *err)
> {
> + unsigned long nt_fw_dtb = get_stm32mp_bl2_dtb();
> +
> log_debug("%s: nt_fw_dtb=%lx\n", __func__, nt_fw_dtb);
>
> *err = 0;
> diff --git a/arch/arm/mach-stm32mp/cpu.c b/arch/arm/mach-stm32mp/cpu.c
> index 855fc755fe0..ee59866bb73 100644
> --- a/arch/arm/mach-stm32mp/cpu.c
> +++ b/arch/arm/mach-stm32mp/cpu.c
> @@ -378,3 +378,38 @@ int arch_misc_init(void)
>
> return 0;
> }
> +
> +/*
> + * Without forcing the ".data" section, this would get saved in ".bss". BSS
> + * will be cleared soon after, so it's not suitable.
> + */
> +static uintptr_t rom_api_table __section(".data");
> +static uintptr_t nt_fw_dtb __section(".data");
> +
> +/*
> + * The ROM gives us the API location in r0 when starting. This is only available
> + * during SPL, as there isn't (yet) a mechanism to pass this on to u-boot. Save
> + * the FDT address provided by TF-A in r2 at boot time. This function is called
> + * from start.S
> + */
> +void save_boot_params(unsigned long r0, unsigned long r1, unsigned long r2,
> + unsigned long r3)
> +{
> + if (IS_ENABLED(CONFIG_STM32_ECDSA_VERIFY))
> + rom_api_table = r0;
> +
> + if (IS_ENABLED(CONFIG_TFABOOT))
> + nt_fw_dtb = r2;
> +
> + save_boot_params_ret();
> +}
> +
> +uintptr_t get_stm32mp_rom_api_table(void)
> +{
> + return rom_api_table;
> +}
> +
> +uintptr_t get_stm32mp_bl2_dtb(void)
> +{
> + return nt_fw_dtb;
> +}
> diff --git a/arch/arm/mach-stm32mp/ecdsa_romapi.c b/arch/arm/mach-stm32mp/ecdsa_romapi.c
> index 6156526253c..12b42b9d59c 100644
> --- a/arch/arm/mach-stm32mp/ecdsa_romapi.c
> +++ b/arch/arm/mach-stm32mp/ecdsa_romapi.c
> @@ -24,26 +24,10 @@ struct ecdsa_rom_api {
> uint32_t ecc_algo);
> };
>
> -/*
> - * Without forcing the ".data" section, this would get saved in ".bss". BSS
> - * will be cleared soon after, so it's not suitable.
> - */
> -static uintptr_t rom_api_loc __section(".data");
> -
> -/*
> - * The ROM gives us the API location in r0 when starting. This is only available
> - * during SPL, as there isn't (yet) a mechanism to pass this on to u-boot.
> - */
> -void save_boot_params(unsigned long r0, unsigned long r1, unsigned long r2,
> - unsigned long r3)
> -{
> - rom_api_loc = r0;
> - save_boot_params_ret();
> -}
> -
> static void stm32mp_rom_get_ecdsa_functions(struct ecdsa_rom_api *rom)
> {
> - uintptr_t verify_ptr = rom_api_loc + ROM_API_OFFSET_ECDSA_VERIFY;
> + uintptr_t verify_ptr = get_stm32mp_rom_api_table() +
> + ROM_API_OFFSET_ECDSA_VERIFY;
>
> rom->ecdsa_verify_signature = *(void **)verify_ptr;
> }
> diff --git a/arch/arm/mach-stm32mp/include/mach/sys_proto.h b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
> index f19a70e53e0..0d39b67178e 100644
> --- a/arch/arm/mach-stm32mp/include/mach/sys_proto.h
> +++ b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
> @@ -77,3 +77,6 @@ void stm32mp_misc_init(void);
>
> /* helper function: read data from OTP */
> u32 get_otp(int index, int shift, int mask);
> +
> +uintptr_t get_stm32mp_rom_api_table(void);
> +uintptr_t get_stm32mp_bl2_dtb(void);
Applied to u-boot-stm/master
Thanks
Patrice
More information about the U-Boot
mailing list