[PATCH 14/41] imx9: add reset cause print

Simon Glass sjg at chromium.org
Mon Jan 23 19:42:31 CET 2023


Hi Peng,

On Mon, 23 Jan 2023 at 01:37, Peng Fan (OSS) <peng.fan at oss.nxp.com> wrote:
>
> From: Peng Fan <peng.fan at nxp.com>
>
> Add reset cause print to u-boot log on i.MX93.
> Since the SRC GENERAL registers are read only for non-secure mode.
> We have to clear SRSR in secure mode (SPL) and pass the value to
> non-secure mode via GPR1 register.
>
> Signed-off-by: Ye Li <ye.li at nxp.com>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
> ---
>  arch/arm/mach-imx/imx9/soc.c | 54 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 54 insertions(+)
>
> diff --git a/arch/arm/mach-imx/imx9/soc.c b/arch/arm/mach-imx/imx9/soc.c
> index ed75be6e195..60044155a63 100644
> --- a/arch/arm/mach-imx/imx9/soc.c
> +++ b/arch/arm/mach-imx/imx9/soc.c
> @@ -461,10 +461,59 @@ err:
>         printf("%s: fuse read err: %d\n", __func__, ret);
>  }
>
> +const char *reset_cause[] = {
> +       "POR ",
> +       "JTAG ",
> +       "IPP USER ",
> +       "WDOG1 ",
> +       "WDOG2 ",
> +       "WDOG3 ",
> +       "WDOG4 ",
> +       "WDOG5 ",
> +       "TEMPSENSE ",
> +       "CSU ",
> +       "JTAG_SW ",
> +       "M33_REQ ",
> +       "M33_LOCKUP "
> +       "UNK ",
> +       "UNK ",
> +       "UNK "
> +};
> +
> +static void save_reset_cause(void)
> +{
> +       struct src_general_regs *src = (struct src_general_regs *)SRC_GLOBAL_RBASE;
> +       u32 srsr = readl(&src->srsr);
> +
> +       /* clear srsr in sec mode */
> +       writel(srsr, &src->srsr);
> +       /* Save value to GPR1 to pass to nonsecure */
> +       writel(srsr, &src->gpr[0]);
> +}
> +
> +static const char *get_reset_cause(u32 *srsr_ret)
> +{
> +       struct src_general_regs *src = (struct src_general_regs *)SRC_GLOBAL_RBASE;
> +       u32 srsr;
> +       u32 i;
> +
> +       srsr = readl(&src->gpr[0]);
> +       if (srsr_ret)
> +               *srsr_ret = srsr;
> +
> +       for (i = ARRAY_SIZE(reset_cause); i > 0; i--) {
> +               if (srsr & (BIT(i - 1)))
> +                       return reset_cause[i - 1];
> +       }
> +
> +       return "unknown reset";
> +}
> +
>  int print_cpuinfo(void)
>  {
>         u32 cpurev, max_freq;
>         int minc, maxc;
> +       u32 ssrs_ret;
>
>         cpurev = get_cpu_rev();
>
> @@ -495,6 +544,8 @@ int print_cpuinfo(void)
>         }
>         printf("(%dC to %dC)", minc, maxc);
>
> +       printf("\nReset cause: %s (0x%x)\n", get_reset_cause(&ssrs_ret), ssrs_ret);
> +
>         return 0;
>  }
>
> @@ -528,6 +579,9 @@ int arch_cpu_init(void)
>                 clock_init();
>
>                 trdc_early_init();
> +
> +               /* Save SRC SRSR to GPR1 and clear it */
> +               save_reset_cause();
>         }
>
>         return 0;
> --
> 2.36.0
>

Please use a sysrest driver and sysreset_get_last() instead, adding
any necessary reset causes.

Regards,
Simon


More information about the U-Boot mailing list