On 11/20/2025 9:33 PM, 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 <[email protected]>
Signed-off-by: Markus Schneider-Pargmann (TI.com) <[email protected]>
---
  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)

device specific function in common file ?



+{
+       struct ofnode_phandle_args memregion_phandle;
+       ofnode memregion;
+       ofnode wkup_bus;
+       int ret;
+
+       wkup_bus = ofnode_path("/bus@f0000/bus@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();
@@ -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))

Reply via email to