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

Simon Goldschmidt simon.k.r.goldschmidt at gmail.com
Fri May 3 20:30:19 UTC 2019



On 03.05.19 22:28, Marek Vasut wrote:
> 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.

No, it's a thing that lives on and influences even the soft reset issued 
by linux "reboot" command. This is something *very* socfpga specific.

Regards,
Simon

> 
>> ---
>>
>>   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__ */
>>
> 
> 


More information about the U-Boot mailing list