[PATCH v6 07/13] arm: mach-k3: common: Helper for LPM meta data address from DT

Kendall Willis k-willis at ti.com
Thu Nov 20 23:21:26 CET 2025


On 11/20/25 10:03, Markus Schneider-Pargmann (TI.com) wrote:
> Add a small helper that uses memory regions referenced by the R5
> devicetree node to calculate the LPM meta data address.
> 
> 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 | 43 +++++++++++++++++++++++++++++++++++++++++++
>   arch/arm/mach-k3/common.h |  1 +
>   2 files changed, 44 insertions(+)
> 
> diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c
> index b28c2cd5776f29d75d54da9078e5fb17768d69c9..191254b391af68cb6c277f986069ed87211f2fc1 100644
> --- a/arch/arm/mach-k3/common.c
> +++ b/arch/arm/mach-k3/common.c
> @@ -16,6 +16,8 @@
>   #include <linux/printk.h>
>   #include "common.h"
>   #include <dm.h>
> +#include <dm/of_access.h>
> +#include <dm/ofnode.h>
>   #include <remoteproc.h>
>   #include <asm/cache.h>
>   #include <linux/soc/ti/ti_sci_protocol.h>
> @@ -36,6 +38,7 @@
>   #include <wait_bit.h>
>   
>   #define CLKSTOP_TRANSITION_TIMEOUT_MS	10
> +#define K3_R5_MEMREGION_LPM_METADATA_OFFSET	0x108000
>   
>   #define PROC_BOOT_CTRL_FLAG_R5_CORE_HALT	0x00000001
>   #define PROC_BOOT_STATUS_FLAG_R5_WFI		0x00000002
> @@ -191,6 +194,42 @@ bool wkup_ctrl_is_lpm_exit(void)
>   }
>   
>   #if IS_ENABLED(CONFIG_K3_IODDR)
> +int wkup_r5f_am62_lpm_meta_data_addr(u64 *meta_data_addr)
> +{
> +	struct ofnode_phandle_args memregion_phandle;
> +	ofnode memregion;
> +	ofnode wkup_bus;
> +	int ret;
> +
> +	wkup_bus = ofnode_path("/bus at f0000/bus at b00000");
> +	if (!ofnode_valid(wkup_bus)) {
> +		printf("Failed to find wkup bus\n");
> +		return -EINVAL;
> +	}
> +
> +	memregion = ofnode_by_compatible(wkup_bus, "ti,am62-r5f");
> +	if (!ofnode_valid(memregion)) {
> +		printf("Failed to find r5f devicetree node ti,am62-r5f\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = ofnode_parse_phandle_with_args(memregion, "memory-region", NULL,
> +					     0, 1, &memregion_phandle);
> +	if (ret) {
> +		printf("Failed to parse phandle for second memory region\n");
> +		return ret;
> +	}
> +
> +	ret = ofnode_read_u64_index(memregion_phandle.node, "reg", 0, meta_data_addr);
> +	if (ret) {
> +		printf("Failed to read memory region offset\n");
> +		return ret;
> +	}
> +
> +	*meta_data_addr += K3_R5_MEMREGION_LPM_METADATA_OFFSET;
> +
> +	return 0;
> +}

nit: Missing new line here.

>   static int lpm_restore_context(u64 ctx_addr)
>   {
>   	struct ti_sci_handle *ti_sci = get_ti_sci_handle();
> @@ -232,6 +271,10 @@ void __noreturn lpm_resume_from_ddr(u64 meta_data_addr)
>   	image_entry();
>   }
>   #else
> +int wkup_r5f_am62_lpm_meta_data_addr(u64 *meta_data_addr)
> +{
> +	return -EINVAL;
> +}
>   
>   void __noreturn lpm_resume_from_ddr(u64 meta_data_addr)
>   {
> diff --git a/arch/arm/mach-k3/common.h b/arch/arm/mach-k3/common.h
> index 3333b30b56e711b082d4da7f6773cf0002bbfe30..c579796a7a3baec12792ad137c5c03e7ea361d55 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);
>   void wkup_ctrl_remove_can_io_isolation_if_set(void);
>   bool wkup_ctrl_is_lpm_exit(void);
> +int wkup_r5f_am62_lpm_meta_data_addr(u64 *meta_data_addr);
>   void lpm_resume_from_ddr(u64 meta_data_addr);
>   
>   #if (IS_ENABLED(CONFIG_K3_QOS))
> 

LGTM,

Reviewed-by: Kendall Willis <k-willis at ti.com>

Best,
Kendall



More information about the U-Boot mailing list