[U-Boot] [PATCH 1/2] mips: mscc: serval: Fix reset
Daniel Schwierzeck
daniel.schwierzeck at gmail.com
Fri Apr 12 15:41:23 UTC 2019
Am 11.04.19 um 13:51 schrieb Horatiu Vultur:
> In case the ddr training was failing, it couldn't reset, it was just
> hanging. Therefore reimplement it, so when ddr training is failing
> it would call _machine_restart, which power downs the DDR and does
> a force reset.
>
> Signed-off-by: Horatiu Vultur <horatiu.vultur at microchip.com>
> ---
> arch/mips/mach-mscc/include/mach/ddr.h | 14 ++++++++++++++
> arch/mips/mach-mscc/reset.c | 5 +----
> 2 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/arch/mips/mach-mscc/include/mach/ddr.h b/arch/mips/mach-mscc/include/mach/ddr.h
> index 84ecfbd..97dac3e 100644
> --- a/arch/mips/mach-mscc/include/mach/ddr.h
> +++ b/arch/mips/mach-mscc/include/mach/ddr.h
> @@ -464,6 +464,19 @@ static inline void hal_vcoreiii_ddr_reset_assert(void)
> ICPU_RESET_MEM_RST_FORCE, BASE_CFG + ICPU_RESET);
> }
>
> +#if defined(CONFIG_SOC_SERVAL)
> +static inline void hal_vcoreiii_ddr_failed(void)
> +{
> + register u32 reset;
> +
> + pr_err("DDR training failed\n");
> +
> + /* Jump to reset - does not return */
> + reset = KSEG0ADDR(_machine_restart);
> + icache_lock((void *)reset, 128); // Reset while running from cache
> + asm volatile ("jr %0" : : "r" (reset));
> +}
there is no real difference to the current hal_vcoreiii_ddr_failed()
except the GPIO toggling. If that toggling is bad on Serval, couldn't
you simply wrap it with #if !defined(CONFIG_SOC_SERVAL)?
> +#else // JR2 || ServalT
> static inline void hal_vcoreiii_ddr_failed(void)
> {
> writel(0, BASE_CFG + ICPU_RESET);
> @@ -471,6 +484,7 @@ static inline void hal_vcoreiii_ddr_failed(void)
>
> panic("DDR init failed\n");
> }
> +#endif /* Serval */
> #endif /* JR2 || ServalT || Serval */
>
> /*
> diff --git a/arch/mips/mach-mscc/reset.c b/arch/mips/mach-mscc/reset.c
> index a555fc9..95fe0d8 100644
> --- a/arch/mips/mach-mscc/reset.c
> +++ b/arch/mips/mach-mscc/reset.c
> @@ -28,16 +28,13 @@ void _machine_restart(void)
> ICPU_RESET_CORE_RST_FORCE,
> BASE_CFG + ICPU_RESET);
> #elif defined(CONFIG_SOC_SERVAL)
> - register unsigned long i;
> -
> /* Prevent VCore-III from being reset with a global reset */
> writel(ICPU_RESET_CORE_RST_PROTECT, BASE_CFG + ICPU_RESET);
>
> /* Do global reset */
> writel(PERF_SOFT_RST_SOFT_CHIP_RST, BASE_DEVCPU_GCB + PERF_SOFT_RST);
>
> - for (i = 0; i < 1000; i++)
> - ;
> + mdelay(100);
I guess Gregory open-coded that because mdelay() can't run in the very
restricted environment without stack and BSS. If the delay is too short,
maybe you should rather increase the iteration count?
>
> /* Power down DDR for clean DDR re-training */
> writel(readl(BASE_CFG + ICPU_MEMCTRL_CTRL) |
>
--
- Daniel
More information about the U-Boot
mailing list