[PATCH] lib: sbi: Use hsm stop for hsm wait
Nick Hu
nick.hu at sifive.com
Tue Apr 29 19:25:19 PDT 2025
On Fri, Apr 18, 2025 at 2:46 PM Nick Hu <nick.hu at sifive.com> wrote:
>
> If we hotplug a core and then perform a suspend-to-RAM operation on a
> multi-core platform, the hotplugged CPU may be woken up along with the rest
> of the system, particularly on platforms that wake all cores from the
> deepest sleep state. When this happens, the hotplugged CPU enters the
> sbi_hsm_wait WFI wait loop instead of transitioning into a
> platform-specific low-power state. To address this, we add a HSM stop call
> within the wait loop. This allows platforms that support HSM stop to enter
> a low-power state when the CPU is unexpectedly woken up.
>
> Signed-off-by: Nick Hu <nick.hu at sifive.com>
> Reviewed-by: Samuel Holland <samuel.holland at sifive.com>
> ---
> lib/sbi/sbi_hsm.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
> index dfe8408d..e8128a39 100644
> --- a/lib/sbi/sbi_hsm.c
> +++ b/lib/sbi/sbi_hsm.c
> @@ -37,6 +37,8 @@
>
> static const struct sbi_hsm_device *hsm_dev = NULL;
> static unsigned long hart_data_offset;
> +static bool hsm_device_has_hart_hotplug(void);
> +static int hsm_device_hart_stop(void);
>
> /** Per hart specific data to manage state transition **/
> struct sbi_hsm_data {
> @@ -170,6 +172,13 @@ static void sbi_hsm_hart_wait(struct sbi_scratch *scratch)
>
> /* Wait for state transition requested by sbi_hsm_hart_start() */
> while (atomic_read(&hdata->state) != SBI_HSM_STATE_START_PENDING) {
> + /*
> + * If the hsm_dev is ready and it support the hotplug, we can
> + * use the hsm stop for more power saving
> + */
> + if (hsm_device_has_hart_hotplug())
> + hsm_device_hart_stop();
> +
> wfi();
> }
>
> --
> 2.17.1
>
Any feedback about this patch?
Regards,
Nick
More information about the opensbi
mailing list