]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm: mach-k3: am62*_init: Probe ESM nodes
authorSanthosh Kumar K <s-k6@ti.com>
Wed, 29 Jan 2025 23:44:02 +0000 (17:44 -0600)
committerTom Rini <trini@konsulko.com>
Mon, 10 Feb 2025 16:30:41 +0000 (10:30 -0600)
On AM62A and AM62P devices, it is possible to route Main ESM error
events to MCU ESM. MCU ESM high error output can trigger the reset
logic to reset the device. So, for these devices we have Main ESM and
MCU ESM nodes in the device tree. Add functions to probe these nodes
if CONFIG_ESM_K3 is enabled.

Signed-off-by: Santhosh Kumar K <s-k6@ti.com>
Signed-off-by: Judith Mendez <jm@ti.com>
arch/arm/mach-k3/am62ax/am62a7_init.c
arch/arm/mach-k3/am62px/am62p5_init.c

index 78153c97a58aff99dba8a76d915802be37d58745..698e6d5c587522cd63ff8795312532ad1dbf7833 100644 (file)
@@ -15,6 +15,9 @@
 #include "../sysfw-loader.h"
 #include "../common.h"
 
+#define CTRLMMR_MCU_RST_CTRL             0x04518170
+#define RST_CTRL_ESM_ERROR_RST_EN_Z_MASK 0xFFFDFFFF
+
 struct fwl_data cbass_main_fwls[] = {
        { "FSS_DAT_REG3", 7, 8 },
 };
@@ -70,6 +73,15 @@ static void ctrl_mmr_unlock(void)
        mmr_unlock(PADCFG_MMR1_BASE, 1);
 }
 
+static __maybe_unused void enable_mcu_esm_reset(void)
+{
+       /* Set CTRLMMR_MCU_RST_CTRL:MCU_ESM_ERROR_RST_EN_Z  to '0' (low active) */
+       u32 stat = readl(CTRLMMR_MCU_RST_CTRL);
+
+       stat &= RST_CTRL_ESM_ERROR_RST_EN_Z_MASK;
+       writel(stat, CTRLMMR_MCU_RST_CTRL);
+}
+
 void board_init_f(ulong dummy)
 {
        struct udevice *dev;
@@ -160,6 +172,20 @@ void board_init_f(ulong dummy)
        /* Output System Firmware version info */
        k3_sysfw_print_ver();
 
+       if (IS_ENABLED(CONFIG_ESM_K3)) {
+               /* Probe/configure ESM0 */
+               ret = uclass_get_device_by_name(UCLASS_MISC, "esm@420000", &dev);
+               if (ret)
+                       printf("esm main init failed: %d\n", ret);
+
+               /* Probe/configure MCUESM */
+               ret = uclass_get_device_by_name(UCLASS_MISC, "esm@4100000", &dev);
+               if (ret)
+                       printf("esm mcu init failed: %d\n", ret);
+
+               enable_mcu_esm_reset();
+       }
+
 #if defined(CONFIG_K3_AM62A_DDRSS)
        ret = uclass_get_device(UCLASS_RAM, 0, &dev);
        if (ret)
index 2d35a7ce77ec73224a0bc08ff5b964b2ae7a5ed2..36216aac90ca38428deb9aaea6c97d19e5574299 100644 (file)
@@ -15,6 +15,9 @@
 #include "../sysfw-loader.h"
 #include "../common.h"
 
+#define CTRLMMR_MCU_RST_CTRL             0x04518170
+#define RST_CTRL_ESM_ERROR_RST_EN_Z_MASK 0xFFFDFFFF
+
 struct fwl_data cbass_main_fwls[] = {
        { "FSS_DAT_REG3", 7, 8 },
 };
@@ -67,6 +70,15 @@ static void ctrl_mmr_unlock(void)
        mmr_unlock(PADCFG_MMR1_BASE, 1);
 }
 
+static __maybe_unused void enable_mcu_esm_reset(void)
+{
+       /* Set CTRLMMR_MCU_RST_CTRL:MCU_ESM_ERROR_RST_EN_Z  to '0' (low active) */
+       u32 stat = readl(CTRLMMR_MCU_RST_CTRL);
+
+       stat &= RST_CTRL_ESM_ERROR_RST_EN_Z_MASK;
+       writel(stat, CTRLMMR_MCU_RST_CTRL);
+}
+
 void board_init_f(ulong dummy)
 {
        struct udevice *dev;
@@ -158,6 +170,20 @@ void board_init_f(ulong dummy)
                        panic("DRAM init failed: %d\n", ret);
        }
 
+       if (IS_ENABLED(CONFIG_ESM_K3)) {
+               /* Probe/configure ESM0 */
+               ret = uclass_get_device_by_name(UCLASS_MISC, "esm@420000", &dev);
+               if (ret)
+                       printf("esm main init failed: %d\n", ret);
+
+               /* Probe/configure MCUESM */
+               ret = uclass_get_device_by_name(UCLASS_MISC, "esm@4100000", &dev);
+               if (ret)
+                       printf("esm mcu init failed: %d\n", ret);
+
+               enable_mcu_esm_reset();
+       }
+
        spl_enable_cache();
 
        setup_qos();