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.goldschm...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot