ARM: stm32: Factor out save_boot_params
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@foss.st.com> Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com> Signed-off-by: Marek Vasut <marex@denx.de>
This commit is contained in:
parent
bbafbc044d
commit
dbeaca79b7
@ -8,33 +8,18 @@
|
|||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <linux/libfdt.h>
|
#include <linux/libfdt.h>
|
||||||
|
#include <asm/arch/sys_proto.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/system.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 =
|
* 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
|
* Non Trusted Firmware configuration file) when the pointer is valid
|
||||||
*/
|
*/
|
||||||
void *board_fdt_blob_setup(int *err)
|
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);
|
log_debug("%s: nt_fw_dtb=%lx\n", __func__, nt_fw_dtb);
|
||||||
|
|
||||||
*err = 0;
|
*err = 0;
|
||||||
|
@ -378,3 +378,38 @@ int arch_misc_init(void)
|
|||||||
|
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
@ -24,26 +24,10 @@ struct ecdsa_rom_api {
|
|||||||
uint32_t ecc_algo);
|
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)
|
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;
|
rom->ecdsa_verify_signature = *(void **)verify_ptr;
|
||||||
}
|
}
|
||||||
|
@ -77,3 +77,6 @@ void stm32mp_misc_init(void);
|
|||||||
|
|
||||||
/* helper function: read data from OTP */
|
/* helper function: read data from OTP */
|
||||||
u32 get_otp(int index, int shift, int mask);
|
u32 get_otp(int index, int shift, int mask);
|
||||||
|
|
||||||
|
uintptr_t get_stm32mp_rom_api_table(void);
|
||||||
|
uintptr_t get_stm32mp_bl2_dtb(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user