diff mbox series

[v1,3/4] arch: arm: mach-k3: am642_init: Probe ESM nodes

Message ID 20220202182223.16521-4-hnagalla@ti.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series Add ESM driver support for AM64x R5 | expand

Commit Message

Hari Nagalla Feb. 2, 2022, 6:22 p.m. UTC
On AM64x devices, it is possible to route Main ESM0 error events to MCU
ESM. MCU ESM high error output can trigger the reset logic to reset the
device. So, for these devices we expect two ESM device nodes in the
device tree, one for Main ESM and the another MCU ESM in the device tree.
 When these ESM device nodes are properly configired it is possible to
route the Main RTI0 WWDT output to the MCU ESM high ouput through Main
ESM and trigger a device reset when
CTRLMMR_MCU_RST_CTRL:MCU_ESM_ERROR_RESET_EN_Z is set to '0'.

On K3 AM64x devices, the R5 SPL u-boot handles the ESM device node
configurations.

Signed-off-by: Hari Nagalla <hnagalla@ti.com>
---
 arch/arm/mach-k3/am642_init.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

Comments

Christian Gmeiner Feb. 3, 2022, 8:40 a.m. UTC | #1
Hi

Some comments from my side.

>  /*
>   * This uninitialized global variable would normal end up in the .bss section,
>   * but the .bss is cleared between writing and reading this variable, so move
> @@ -160,6 +173,9 @@ void board_init_f(ulong dummy)

>         store_boot_info_from_rom();
>
>         ctrl_mmr_unlock();
> +       mcu_ctrl_mmr_unlock();
> +
> +       enable_mcu_esm_reset();
>
>         /* Init DM early */
>         spl_early_init();
> @@ -194,6 +210,18 @@ void board_init_f(ulong dummy)
>         /* Output System Firmware version info */
>         k3_sysfw_print_ver();
>
> +#ifdef CONFIG_ESM_K3

Maybe use #if defined(CONFIG_ESM_K3)

> +       /* Probe/configure ESM0 */
> +       ret = uclass_get_device_by_name(UCLASS_MISC, "esm@420000", &dev);

ret condinaly defined and could not compile for every configuration.

void board_init_f(ulong dummy)
{
#if defined(CONFIG_K3_LOAD_SYSFW) || defined(CONFIG_K3_AM64_DDRSS)
struct udevice *dev;
int ret;
#endif


> +       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);
> +#endif
> +
>  #if defined(CONFIG_K3_AM64_DDRSS)
>         ret = uclass_get_device(UCLASS_RAM, 0, &dev);
>         if (ret)
> --
> 2.17.1
>
Nishanth Menon Feb. 3, 2022, 9:42 p.m. UTC | #2
On 12:22-20220202, Hari Nagalla wrote:

One additional comment independent of Christian's comment..

[...]
> diff --git a/arch/arm/mach-k3/am642_init.c b/arch/arm/mach-k3/am642_init.c
> index 543dea02bc..cb9495e525 100644
> --- a/arch/arm/mach-k3/am642_init.c
> +++ b/arch/arm/mach-k3/am642_init.c
> @@ -24,6 +24,8 @@
>  #include <dm/root.h>
>  
>  #if defined(CONFIG_SPL_BUILD)
> +#define MCU_CTRL_MMR0_BASE			0x04500000
> +#define CTRLMMR_MCU_RST_CTRL			0x04518170
>  
>  static void ctrl_mmr_unlock(void)
>  {
> @@ -42,6 +44,17 @@ static void ctrl_mmr_unlock(void)
>  	mmr_unlock(MCU_PADCFG_MMR1_BASE, 1);
>  }
>  
> +static void mcu_ctrl_mmr_unlock(void)
> +{

There is no real point in spliting this up into mcu_ctrl_mmr_unlock.
I'd suggest putting it part of ctrl_mmr_unlock (we already do unlock MCU
padconf mmrs there)


[...]
diff mbox series

Patch

diff --git a/arch/arm/mach-k3/am642_init.c b/arch/arm/mach-k3/am642_init.c
index 543dea02bc..cb9495e525 100644
--- a/arch/arm/mach-k3/am642_init.c
+++ b/arch/arm/mach-k3/am642_init.c
@@ -24,6 +24,8 @@ 
 #include <dm/root.h>
 
 #if defined(CONFIG_SPL_BUILD)
+#define MCU_CTRL_MMR0_BASE			0x04500000
+#define CTRLMMR_MCU_RST_CTRL			0x04518170
 
 static void ctrl_mmr_unlock(void)
 {
@@ -42,6 +44,17 @@  static void ctrl_mmr_unlock(void)
 	mmr_unlock(MCU_PADCFG_MMR1_BASE, 1);
 }
 
+static void mcu_ctrl_mmr_unlock(void)
+{
+	/* Unlock all MCU_CTRL_MMR0 module registers */
+	mmr_unlock(MCU_CTRL_MMR0_BASE, 0);
+	mmr_unlock(MCU_CTRL_MMR0_BASE, 1);
+	mmr_unlock(MCU_CTRL_MMR0_BASE, 2);
+	mmr_unlock(MCU_CTRL_MMR0_BASE, 3);
+	mmr_unlock(MCU_CTRL_MMR0_BASE, 4);
+	mmr_unlock(MCU_CTRL_MMR0_BASE, 6);
+}
+
 /*
  * This uninitialized global variable would normal end up in the .bss section,
  * but the .bss is cleared between writing and reading this variable, so move
@@ -160,6 +173,9 @@  void board_init_f(ulong dummy)
 	store_boot_info_from_rom();
 
 	ctrl_mmr_unlock();
+	mcu_ctrl_mmr_unlock();
+
+	enable_mcu_esm_reset();
 
 	/* Init DM early */
 	spl_early_init();
@@ -194,6 +210,18 @@  void board_init_f(ulong dummy)
 	/* Output System Firmware version info */
 	k3_sysfw_print_ver();
 
+#ifdef 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);
+#endif
+
 #if defined(CONFIG_K3_AM64_DDRSS)
 	ret = uclass_get_device(UCLASS_RAM, 0, &dev);
 	if (ret)