[PATCH v7 06/13] arm: mach-k3: common: Add lpm_resume_from_ddr
Kumar, Udit
u-kumar1 at ti.com
Sat Dec 13 07:47:03 CET 2025
On 12/10/2025 7:39 PM, Markus Schneider-Pargmann (TI.com) wrote:
> This is a common function that helps to resume from DDR. There are two
> pointers which are fetched from DDR to resume, the TIFS context pointer
> which points to the context in DDR. There is another pointer to the DM
> loadaddr to jump back into DM.
>
> Tested-by: Anshul Dalal <anshuld at ti.com>
> Signed-off-by: Markus Schneider-Pargmann (TI.com) <msp at baylibre.com>
> ---
> arch/arm/mach-k3/common.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++
> arch/arm/mach-k3/common.h | 1 +
> 2 files changed, 50 insertions(+)
>
> diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c
> index 81e180c8706445c270cfecb0500015eee7547f98..ee56f0b86ce303e319cfcd2b0db3bade1540635b 100644
> --- a/arch/arm/mach-k3/common.c
> +++ b/arch/arm/mach-k3/common.c
> @@ -193,6 +193,55 @@ int __maybe_unused wkup_ctrl_remove_can_io_isolation_if_set(void)
> return 0;
> }
>
> +#if IS_ENABLED(CONFIG_K3_IODDR)
> +static int lpm_restore_context(u64 ctx_addr)
> +{
> + struct ti_sci_handle *ti_sci = get_ti_sci_handle();
> + int ret;
> +
> + ret = ti_sci->ops.lpm_ops.min_context_restore(ti_sci, ctx_addr);
> + if (ret)
> + printf("Failed to restore context from DDR %d\n", ret);
> +
> + return ret;
> +}
> +
> +struct lpm_meta_data {
> + u64 dm_jump_address;
> + u64 tifs_context_save_address;
> + u64 reserved[30];
> +} __packed__;
> +
> +void __noreturn lpm_resume_from_ddr(u64 meta_data_addr)
> +{
> + struct lpm_meta_data lpm_data = *(struct lpm_meta_data *)(uintptr_t)meta_data_addr;
> + typedef void __noreturn (*image_entry_noargs_t)(void);
> + image_entry_noargs_t image_entry;
> + int ret;
> +
> + ret = lpm_restore_context(lpm_data.tifs_context_save_address);
> + if (ret)
> + panic("Failed to restore context from 0x%x%08x\n",
> + (u32)(lpm_data.tifs_context_save_address >> 32),
> + (u32)lpm_data.tifs_context_save_address);
> +
> + image_entry = (image_entry_noargs_t)(uintptr_t)lpm_data.dm_jump_address;
> + printf("Resuming from DDR, jumping to stored DM loadaddr 0x%x%08x, TIFS context restored from 0x%x%08x\n",
> + (u32)(lpm_data.dm_jump_address >> 32),
> + (u32)lpm_data.dm_jump_address,
> + (u32)(lpm_data.tifs_context_save_address >> 32),
> + (u32)lpm_data.tifs_context_save_address);
you want printf, here or could be debug info ?
> +
> + image_entry();
> +}
> +#else
> +
> +void __noreturn lpm_resume_from_ddr(u64 meta_data_addr)
> +{
> + panic("No IO+DDR support");
> +}
> +#endif
> +
> bool is_rom_loaded_sysfw(struct rom_extended_boot_data *data)
> {
> if (strncmp(data->header, K3_ROM_BOOT_HEADER_MAGIC, 7))
> diff --git a/arch/arm/mach-k3/common.h b/arch/arm/mach-k3/common.h
> index a68924a2123961642b63401f3600ac825fb62da5..2c7cc552505bcdffc17fd469db3ee90779f3c192 100644
> --- a/arch/arm/mach-k3/common.h
> +++ b/arch/arm/mach-k3/common.h
> @@ -53,6 +53,7 @@ void ti_secure_image_check_binary(void **p_image, size_t *p_size);
> int shutdown_mcu_r5_core1(void);
> bool wkup_ctrl_is_lpm_exit(void);
> int wkup_ctrl_remove_can_io_isolation_if_set(void);
> +void lpm_resume_from_ddr(u64 meta_data_addr);
>
> #if IS_ENABLED(CONFIG_SPL_OS_BOOT_SECURE) && !IS_ENABLED(CONFIG_ARM64)
> int k3_r5_falcon_bootmode(void);
>
More information about the U-Boot
mailing list