[PATCH 2/6] lib: sbi_hsm: handle failure when hart_stop returns SBI_ENOTSUPP

Andrew Jones ajones at ventanamicro.com
Fri Jan 6 05:40:32 PST 2023


On Wed, Jan 04, 2023 at 02:29:23PM +0800, Yu Chien Peter Lin wrote:
> Make use of generic warm-boot path when platform hart_stop callback
> returns SBI_ENOTSUPP, in case certain hart can not turn off its
> power domain, or it detects some error occured in power management
> unit, it can fall through warmboot flow and wait for interrupt in
> sbi_hsm_hart_wait().
> 
> Also improves comment in sbi_hsm_hart_wait().
> 
> Signed-off-by: Yu Chien Peter Lin <peterlin at andestech.com>
> ---
> On ae350-ax25mp, hart0 shares power domain with L2-cache, thus turning
> it off would break working system.
> ---
>  include/sbi/sbi_hsm.h | 8 ++++++--
>  lib/sbi/sbi_hsm.c     | 7 +++----
>  2 files changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/include/sbi/sbi_hsm.h b/include/sbi/sbi_hsm.h
> index d6cc468..1e23884 100644
> --- a/include/sbi/sbi_hsm.h
> +++ b/include/sbi/sbi_hsm.h
> @@ -21,8 +21,12 @@ struct sbi_hsm_device {
>  	int (*hart_start)(u32 hartid, ulong saddr);
>  
>  	/**
> -	 * Stop (or power-down) the current hart from running. This call
> -	 * doesn't expect to return if success.
> +	 * Stop (or power-down) the current hart from running.
> +	 *
> +	 * Return SBI_ENOTSUPP if the hart does not support platform-specific
> +	 * stop actions.
> +	 *
> +	 * For successful stop, the call won't return.
>  	 */
>  	int (*hart_stop)(void);
>  
> diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
> index 836008f..b89253b 100644
> --- a/lib/sbi/sbi_hsm.c
> +++ b/lib/sbi/sbi_hsm.c
> @@ -116,7 +116,7 @@ static void sbi_hsm_hart_wait(struct sbi_scratch *scratch, u32 hartid)
>  	/* Set MSIE and MEIE bits to receive IPI */
>  	csr_set(CSR_MIE, MIP_MSIP | MIP_MEIP);
>  
> -	/* Wait for hart_add call*/
> +	/* Wait for state transition requested by sbi_hsm_hart_start() */
>  	while (atomic_read(&hdata->state) != SBI_HSM_STATE_START_PENDING) {
>  		wfi();
>  	};
> @@ -228,9 +228,8 @@ void __noreturn sbi_hsm_exit(struct sbi_scratch *scratch)
>  		goto fail_exit;
>  
>  	if (hsm_device_has_hart_hotplug()) {
> -		hsm_device_hart_stop();
> -		/* It should never reach here */
> -		goto fail_exit;
> +		if (hsm_device_hart_stop() != SBI_ENOTSUPP)
> +			goto fail_exit;
>  	}
>  
>  	/**
> -- 
> 2.34.1
>

Reviewed-by: Andrew Jones <ajones at ventanamicro.com>



More information about the opensbi mailing list