[U-Boot] [PATCH] arm: socfpga: control reboot from SRAM via env callback

Marek Vasut marex at denx.de
Fri May 3 20:28:50 UTC 2019


On 5/3/19 10:08 PM, Simon Goldschmidt wrote:
> This moves the code that enables the Boot ROM to just jump to SRAM instead
> of loading SPL from the original boot source on warm reboot.
> 
> Instead of always enabling this, an environment callback for the env var
> "socfpga_reboot_from_sram" is used. This way, the behaviour can be enabled
> at runtime and via saved environment.
> 
> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>

Would that be like a default "reset" command action ?
This probably shouldn't be socfpga specific then.

> ---
> 
>  arch/arm/mach-socfpga/misc_gen5.c | 49 +++++++++++++++++++++++++------
>  include/configs/socfpga_common.h  |  5 ++++
>  2 files changed, 45 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/arm/mach-socfpga/misc_gen5.c b/arch/arm/mach-socfpga/misc_gen5.c
> index 9865f5b5b1..db662bb22a 100644
> --- a/arch/arm/mach-socfpga/misc_gen5.c
> +++ b/arch/arm/mach-socfpga/misc_gen5.c
> @@ -6,6 +6,7 @@
>  #include <common.h>
>  #include <asm/io.h>
>  #include <errno.h>
> +#include <environment.h>
>  #include <fdtdec.h>
>  #include <linux/libfdt.h>
>  #include <altera.h>
> @@ -182,15 +183,6 @@ int arch_early_init_r(void)
>  {
>  	int i;
>  
> -	/*
> -	 * Write magic value into magic register to unlock support for
> -	 * issuing warm reset. The ancient kernel code expects this
> -	 * value to be written into the register by the bootloader, so
> -	 * to support that old code, we write it here instead of in the
> -	 * reset_cpu() function just before resetting the CPU.
> -	 */
> -	writel(0xae9efebc, &sysmgr_regs->romcodegrp_warmramgrp_enable);
> -
>  	for (i = 0; i < 8; i++)	/* Cache initial SW setting regs */
>  		iswgrp_handoff[i] = readl(&sysmgr_regs->iswgrp_handoff[i]);
>  
> @@ -255,4 +247,43 @@ void do_bridge_reset(int enable)
>  		writel(1, &nic301_regs->remap);
>  	}
>  }
> +
> +/*
> + * This function controls the reboot behaviour via an environment callback to
> + * the variable "socfpga_reboot_from_sram".
> + *
> + * Setting this variable to 1 writes a magic value into a magic register that
> + * makes the Boot ROM jump to SRAM on a warm reset. Note that this doesn't
> + * happen on cold reset, and that the SPL is not CRC protected, so if it gets
> + * overwritten before boot, something bad will happen.
> + *
> + * Given these limitations, this env callback only exists for backwards
> + * compatibility.
> + */
> +static int on_socfpga_reboot_from_sram(const char *name, const char *value,
> +				       enum env_op op, int flags)
> +{
> +	int val;
> +	u32 reg;
> +
> +	val = simple_strtoul(value, NULL, 10);
> +	if (val) {
> +		/*
> +		 * Write magic value into magic register to unlock support for
> +		 * issuing warm reset. The ancient kernel code expects this
> +		 * value to be written into the register by the bootloader, so
> +		 * to support that old code, we write it here instead of in the
> +		 * reset_cpu() function just before resetting the CPU.
> +		 */
> +		reg = 0xae9efebc;
> +	} else {
> +		reg = 0;
> +	}
> +	writel(reg, &sysmgr_regs->romcodegrp_warmramgrp_enable);
> +
> +	return 0;
> +}
> +
> +U_BOOT_ENV_CALLBACK(socfpga_reboot_from_sram, on_socfpga_reboot_from_sram);
> +
>  #endif
> diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
> index d1034ac280..aae4daf5d2 100644
> --- a/include/configs/socfpga_common.h
> +++ b/include/configs/socfpga_common.h
> @@ -273,4 +273,9 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>  #endif
>  #endif
>  
> +#ifndef CONFIG_ENV_CALLBACK_LIST_STATIC
> +#define CONFIG_ENV_CALLBACK_LIST_STATIC \
> +	"socfpga_reboot_from_sram:socfpga_reboot_from_sram"
> +#endif
> +
>  #endif	/* __CONFIG_SOCFPGA_COMMON_H__ */
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list