lib: sbi_hsm: Call a device hook during hart resume

Non-retentive suspend states may require platform-specific actions
during resume. For example, firmware may need to save and restore the
values of custom CSRs. Add a hook to support this.

Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Samuel Holland <samuel@sholland.org>
This commit is contained in:
Samuel Holland
2022-06-12 20:03:47 -05:00
committed by Anup Patel
parent ce1d6188a2
commit b20ed9febe
2 changed files with 16 additions and 0 deletions

View File

@@ -37,6 +37,14 @@ struct sbi_hsm_device {
* specified resume address
*/
int (*hart_suspend)(u32 suspend_type, ulong raddr);
/**
* Perform platform-specific actions to resume from a suspended state.
*
* This includes restoring any platform state that was lost during
* non-retentive suspend.
*/
void (*hart_resume)(void);
};
struct sbi_domain;

View File

@@ -178,6 +178,12 @@ static int hsm_device_hart_suspend(u32 suspend_type, ulong raddr)
return SBI_ENOTSUPP;
}
static void hsm_device_hart_resume(void)
{
if (hsm_dev && hsm_dev->hart_resume)
hsm_dev->hart_resume();
}
int sbi_hsm_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot)
{
u32 i;
@@ -384,6 +390,8 @@ void sbi_hsm_hart_resume_start(struct sbi_scratch *scratch)
__func__, oldstate);
sbi_hart_hang();
}
hsm_device_hart_resume();
}
void sbi_hsm_hart_resume_finish(struct sbi_scratch *scratch)