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

Andrew Davis afd at ti.com
Tue Jan 6 18:23:00 CET 2026


On 1/5/26 10:38 AM, 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.
> 
> Signed-off-by: Markus Schneider-Pargmann (TI.com) <msp at baylibre.com>
> ---
>   arch/arm/mach-k3/am62xx-lpm-common.c | 45 ++++++++++++++++++++++++++++++++++++
>   arch/arm/mach-k3/am62xx-lpm-common.h |  1 +
>   2 files changed, 46 insertions(+)
> 
> diff --git a/arch/arm/mach-k3/am62xx-lpm-common.c b/arch/arm/mach-k3/am62xx-lpm-common.c
> index fa068c60ce9ccf9cec89aeae1d224b07091a3298..6870395aec838949b5c25a32262a6c30e6c88d2e 100644
> --- a/arch/arm/mach-k3/am62xx-lpm-common.c
> +++ b/arch/arm/mach-k3/am62xx-lpm-common.c
> @@ -9,6 +9,8 @@
>   #include <config.h>
>   #include <asm/arch/hardware.h>
>   #include <asm/io.h>
> +#include <dm/of_access.h>
> +#include <dm/ofnode.h>
>   #include <linux/soc/ti/ti_sci_protocol.h>
>   #include <vsprintf.h>
>   #include <wait_bit.h>
> @@ -48,6 +50,8 @@
>   #define WKUP_CTRL_MMR_CANUART_WAKE_OFF_MODE_STAT		0x18318
>   #define WKUP_CTRL_MMR_CANUART_WAKE_OFF_MODE_STAT_MW		0x555555
>   
> +#define K3_R5_MEMREGION_LPM_METADATA_OFFSET	0x108000
> +

Could this offset into the R5's second reserved memory area change based
on the firmware used? Actually this whole thing feels hacky. Why not
just add the location to DT explicitly instead of trying to derive it.

Actually, don't we pick this address as part of the TISCI_MSG_PREPARE_SLEEP?
Or does DM do it now, either way there must be some better way to coordinate
between DM and R5 SPL than hardcoded offsets..

Andrew

>   #define CLKSTOP_TRANSITION_TIMEOUT_MS	10
>   
>   static int wkup_ctrl_remove_can_io_isolation(void)
> @@ -126,6 +130,43 @@ int __maybe_unused wkup_ctrl_remove_can_io_isolation_if_set(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;
> +}
> +
>   static int lpm_restore_context(u64 ctx_addr)
>   {
>   	struct ti_sci_handle *ti_sci = get_ti_sci_handle();
> @@ -167,6 +208,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/am62xx-lpm-common.h b/arch/arm/mach-k3/am62xx-lpm-common.h
> index d5793759da4a05d355f5d88fbd8e103ebc46f9cc..741e3ccbcbd082da9d11c61624df8a4f456fd724 100644
> --- a/arch/arm/mach-k3/am62xx-lpm-common.h
> +++ b/arch/arm/mach-k3/am62xx-lpm-common.h
> @@ -13,6 +13,7 @@
>   
>   bool wkup_ctrl_is_lpm_exit(void);
>   int wkup_ctrl_remove_can_io_isolation_if_set(void);
> +int wkup_r5f_am62_lpm_meta_data_addr(u64 *meta_data_addr);
>   void lpm_resume_from_ddr(u64 meta_data_addr);
>   
>   #endif  /* _AM62XX_LPM_COMMON_H_ */
> 



More information about the U-Boot mailing list