[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