lib: utils/suspend: wait for the secondary Andes harts to sleep

A secondary hart may not have reached the target sleep state by the time
the primary checks, so the one-shot check could fail spuriously. Poll
each PCS status instead and give up after HART_SLEEP_TIMEOUT_MS.

Rework atcsmu_pcs_is_sleep() into the atcsmu_hart_is_sleep() predicate so
sbi_timer_waitms_until() can drive it.

Signed-off-by: Ben Zong-You Xie <ben717@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20260728081041.2724668-7-ben717@andestech.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Ben Zong-You Xie
2026-09-01 10:46:23 +05:30
committed by Anup Patel
parent e01bd7926b
commit 0fb4799307
3 changed files with 35 additions and 21 deletions
+6 -1
View File
@@ -9,6 +9,11 @@
#include <sbi/sbi_types.h>
struct atcsmu_sleep_arg {
u32 hartid;
bool deep_sleep;
};
/* clang-format off */
#define SCRATCH_PAD_OFFSET 0x40
@@ -61,6 +66,6 @@ int atcsmu_set_reset_vector(u64 wakeup_addr, u32 hartid);
u32 atcsmu_get_sleep_type(u32 hartid);
void atcsmu_write_scratch(u32 value);
u32 atcsmu_read_scratch(void);
bool atcsmu_pcs_is_sleep(u32 hartid, bool deep_sleep);
bool atcsmu_hart_is_sleep(void *opaque);
#endif