forked from Mirrors/opensbi
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:

committed by
Anup Patel

parent
ce1d6188a2
commit
b20ed9febe
@@ -37,6 +37,14 @@ struct sbi_hsm_device {
|
|||||||
* specified resume address
|
* specified resume address
|
||||||
*/
|
*/
|
||||||
int (*hart_suspend)(u32 suspend_type, ulong raddr);
|
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;
|
struct sbi_domain;
|
||||||
|
@@ -178,6 +178,12 @@ static int hsm_device_hart_suspend(u32 suspend_type, ulong raddr)
|
|||||||
return SBI_ENOTSUPP;
|
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)
|
int sbi_hsm_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
@@ -384,6 +390,8 @@ void sbi_hsm_hart_resume_start(struct sbi_scratch *scratch)
|
|||||||
__func__, oldstate);
|
__func__, oldstate);
|
||||||
sbi_hart_hang();
|
sbi_hart_hang();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hsm_device_hart_resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_hsm_hart_resume_finish(struct sbi_scratch *scratch)
|
void sbi_hsm_hart_resume_finish(struct sbi_scratch *scratch)
|
||||||
|
Reference in New Issue
Block a user