[PATCH v3 3/4] arch: arm: mach-k3: am642_init: Probe ESM nodes

Christian Gmeiner christian.gmeiner at gmail.com
Mon Mar 21 13:47:12 CET 2022


Am Mi., 9. März 2022 um 21:43 Uhr schrieb Hari Nagalla <hnagalla at ti.com>:
>
> 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 output 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 at ti.com>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
>  arch/arm/mach-k3/am642_init.c | 40 +++++++++++++++++++++++++++++++----
>  1 file changed, 36 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/mach-k3/am642_init.c b/arch/arm/mach-k3/am642_init.c
> index 543dea02bc..3a75dcea35 100644
> --- a/arch/arm/mach-k3/am642_init.c
> +++ b/arch/arm/mach-k3/am642_init.c
> @@ -24,12 +24,22 @@
>  #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)
>  {
>         /* Unlock all PADCFG_MMR1 module registers */
>         mmr_unlock(PADCFG_MMR1_BASE, 1);
>
> +       /* 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);
> +
>         /* Unlock all CTRL_MMR0 module registers */
>         mmr_unlock(CTRL_MMR0_BASE, 0);
>         mmr_unlock(CTRL_MMR0_BASE, 1);
> @@ -37,9 +47,6 @@ static void ctrl_mmr_unlock(void)
>         mmr_unlock(CTRL_MMR0_BASE, 3);
>         mmr_unlock(CTRL_MMR0_BASE, 5);
>         mmr_unlock(CTRL_MMR0_BASE, 6);
> -
> -       /* Unlock all MCU_PADCFG_MMR1 module registers */
> -       mmr_unlock(MCU_PADCFG_MMR1_BASE, 1);
>  }
>
>  /*
> @@ -142,9 +149,20 @@ int fdtdec_board_setup(const void *fdt_blob)
>  }
>  #endif
>
> +#if defined(CONFIG_ESM_K3)
> +static 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 &= 0xFFFDFFFF;
> +       writel(stat, CTRLMMR_MCU_RST_CTRL);
> +}
> +#endif
> +
>  void board_init_f(ulong dummy)
>  {
> -#if defined(CONFIG_K3_LOAD_SYSFW) || defined(CONFIG_K3_AM64_DDRSS)
> +#if defined(CONFIG_K3_LOAD_SYSFW) || defined(CONFIG_K3_AM64_DDRSS) || defined(CONFIG_ESM_K3)
>         struct udevice *dev;
>         int ret;
>  #endif
> @@ -194,6 +212,20 @@ void board_init_f(ulong dummy)
>         /* Output System Firmware version info */
>         k3_sysfw_print_ver();
>
> +#if defined(CONFIG_ESM_K3)
> +       /* Probe/configure ESM0 */
> +       ret = uclass_get_device_by_name(UCLASS_MISC, "esm at 420000", &dev);
> +       if (ret)
> +               printf("esm main init failed: %d\n", ret);
> +
> +       /* Probe/configure MCUESM */
> +       ret = uclass_get_device_by_name(UCLASS_MISC, "esm at 4100000", &dev);
> +       if (ret)
> +               printf("esm mcu init failed: %d\n", ret);
> +
> +       enable_mcu_esm_reset();
> +#endif
> +
>  #if defined(CONFIG_K3_AM64_DDRSS)
>         ret = uclass_get_device(UCLASS_RAM, 0, &dev);
>         if (ret)
> --
> 2.17.1
>


-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info/privacypolicy


More information about the U-Boot mailing list