[PATCH v2 07/22] arm: mach-k3: common: Helper for LPM meta data address from DT
Markus Schneider-Pargmann
msp at baylibre.com
Fri Jun 13 15:19:27 CEST 2025
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 <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 c6b230ad46a891ff0250a2bc65af2aa72d09fbc9..706dc9a300cd90dbd7b3da10e7bb0eee11ffea38 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>
@@ -33,6 +35,7 @@
#include <wait_bit.h>
#define CLKSTOP_TRANSITION_TIMEOUT_MS 10
+#define K3_R5_MEMREGION_LPM_METADATA_OFFSET 0x108000
#include <asm/arch/k3-qos.h>
@@ -153,6 +156,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;
+}
static int lpm_restore_context(u64 ctx_addr)
{
struct ti_sci_handle *ti_sci = get_ti_sci_handle();
@@ -190,6 +229,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 53a509f4ff5159b32d1c359ab458ec9a7aa07956..096b4859040c464394c0d4a543917b783ade1597 100644
--- a/arch/arm/mach-k3/common.h
+++ b/arch/arm/mach-k3/common.h
@@ -51,6 +51,7 @@ void do_board_detect(void);
void ti_secure_image_check_binary(void **p_image, size_t *p_size);
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))
--
2.49.0
More information about the U-Boot
mailing list