[Skiboot] [PATCH] fast-reboot: disable on FSP code update or unrecoverable HMI

Mahesh Jagannath Salgaonkar mahesh at linux.vnet.ibm.com
Mon Oct 24 17:48:43 AEDT 2016


On 10/24/2016 11:58 AM, Stewart Smith wrote:
> Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>
> ---
>  core/fast-reboot.c      | 18 ++++++++++++++++++
>  core/hmi.c              |  2 ++
>  hw/fsp/fsp-codeupdate.c |  2 ++
>  include/skiboot.h       |  1 +
>  4 files changed, 23 insertions(+)
> 
> diff --git a/core/fast-reboot.c b/core/fast-reboot.c
> index 66b31824c9eb..7f861b9760cd 100644
> --- a/core/fast-reboot.c
> +++ b/core/fast-reboot.c
> @@ -281,6 +281,16 @@ static bool fast_reset_p8(void)
>  extern void *fdt;
>  extern struct lock capi_lock;
>  
> +static const char *fast_reboot_disabled = NULL;
> +static struct lock fast_reboot_disabled_lock = LOCK_UNLOCKED;
> +
> +void disable_fast_reboot(const char *reason)
> +{
> +	lock(&fast_reboot_disabled_lock);
> +	fast_reboot_disabled = reason;
> +	unlock(&fast_reboot_disabled_lock);
> +}
> +
>  void fast_reboot(void)
>  {
>  	bool success;
> @@ -298,6 +308,14 @@ void fast_reboot(void)
>  		return;
>  	}
>  
> +	lock(&fast_reboot_disabled_lock);
> +	if (fast_reboot_disabled) {
> +		prlog(PR_DEBUG, "RESET: Fast reboot disabled because %s\n",
> +		      fast_reboot_disabled);

Shouldn't we unlock and return ?

> +		return;
> +	}
> +	unlock(&fast_reboot_disabled_lock);
> +
>  	lock(&capi_lock);
>  	for_each_chip(chip) {
>  		if (chip->capp_phb3_attached_mask) {
> diff --git a/core/hmi.c b/core/hmi.c
> index 69403c6db350..6fe060dc7c56 100644
> --- a/core/hmi.c
> +++ b/core/hmi.c
> @@ -836,6 +836,8 @@ int handle_hmi_exception(uint64_t hmer, struct OpalHMIEvent *hmi_evt)
>  		}
>  	}
>  
> +	if (recover == 0)
> +		disable_fast_reboot("Unrecoverable HMI");

This only fixes platform error reported by HMI.. What about memory
errors like memory UE ?

I think we should disable fast reboot from opal_cec_reboot2() under
'OPAL_REBOOT_PLATFORM_ERROR' switch case. Linux always call
opal_cec_reboot2() on any platform errors reported to it e.g.
unrecoverable HMI or MCE. What do you think ?

Thanks,
-Mahesh.

>  	/*
>  	 * HMER bits are sticky, once set to 1 they remain set to 1 until
>  	 * they are set to 0. Reset the error source bit to 0, otherwise
> diff --git a/hw/fsp/fsp-codeupdate.c b/hw/fsp/fsp-codeupdate.c
> index 2263bf36dcc8..ae1c4b6c5a42 100644
> --- a/hw/fsp/fsp-codeupdate.c
> +++ b/hw/fsp/fsp-codeupdate.c
> @@ -1126,6 +1126,8 @@ static int64_t fsp_opal_update_flash(struct opal_sg_list *list)
>  	struct opal_sg_entry *entry;
>  	int length, num_entries, result = 0, rc = OPAL_PARAMETER;
>  
> +	disable_fast_reboot("FSP Code Update");
> +
>  	/* Ensure that the sg list honors our alignment requirements */
>  	rc = validate_sglist(list);
>  	if (rc) {
> diff --git a/include/skiboot.h b/include/skiboot.h
> index b50868d2d8c7..45f230a37635 100644
> --- a/include/skiboot.h
> +++ b/include/skiboot.h
> @@ -190,6 +190,7 @@ extern unsigned long get_symbol(unsigned long addr,
>  				char **sym, char **sym_end);
>  
>  /* Fast reboot support */
> +extern void disable_fast_reboot(const char *reason);
>  extern void fast_reboot(void);
>  extern void __noreturn __secondary_cpu_entry(void);
>  extern void __noreturn load_and_boot_kernel(bool is_reboot);
> 



More information about the Skiboot mailing list