Message ID | 74bf02f1c6c5280f2d79b9cd60515895e8ba3319.1665137247.git.mykyta_poturai@epam.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/19] xen/arm: Implement PSCI system suspend | expand |
Hi, On 07/10/2022 11:32, Mykyta Poturai wrote: > From: Mirela Simonovic <mirela.simonovic@aggios.com> > > Non-boot CPUs have to be disabled on suspend and enabled on resume > (hotplug-based mechanism). Disabling non-boot CPUs will lead to PSCI > CPU_OFF to be called by each non-boot CPU. Depending on the underlying > platform capabilities, this may lead to the physical powering down of > CPUs. Tested on Xilinx Zynq Ultrascale+ MPSoC (including power down of > each non-boot CPU). > > Signed-off-by: Mirela Simonovic <mirela.simonovic@aggios.com> > Signed-off-by: Saeed Nowshadi <saeed.nowshadi@xilinx.com> > --- > xen/arch/arm/suspend.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/suspend.c b/xen/arch/arm/suspend.c > index 2b94816b63..0784979e4f 100644 > --- a/xen/arch/arm/suspend.c > +++ b/xen/arch/arm/suspend.c > @@ -13,6 +13,7 @@ > */ > > #include <xen/sched.h> > +#include <xen/cpu.h> > #include <asm/cpufeature.h> > #include <asm/event.h> > #include <asm/psci.h> > @@ -135,17 +136,29 @@ void vcpu_resume(struct vcpu *v) > /* Xen suspend. Note: data is not used (suspend is the suspend to RAM) */ > static long system_suspend(void *data) > { > + int status; > + > BUG_ON(system_state != SYS_STATE_active); > > system_state = SYS_STATE_suspend; > freeze_domains(); > > + status = disable_nonboot_cpus(); > + if ( status ) > + { > + system_state = SYS_STATE_resume; > + goto resume_nonboot_cpus; > + } > + > system_state = SYS_STATE_resume; > > +resume_nonboot_cpus: > + enable_nonboot_cpus(); > thaw_domains(); > system_state = SYS_STATE_active; > + dsb(sy); Please document what is this dsb() for. > > - return -ENOSYS; > + return status; > } > > int32_t domain_suspend(register_t epoint, register_t cid) Cheers,
diff --git a/xen/arch/arm/suspend.c b/xen/arch/arm/suspend.c index 2b94816b63..0784979e4f 100644 --- a/xen/arch/arm/suspend.c +++ b/xen/arch/arm/suspend.c @@ -13,6 +13,7 @@ */ #include <xen/sched.h> +#include <xen/cpu.h> #include <asm/cpufeature.h> #include <asm/event.h> #include <asm/psci.h> @@ -135,17 +136,29 @@ void vcpu_resume(struct vcpu *v) /* Xen suspend. Note: data is not used (suspend is the suspend to RAM) */ static long system_suspend(void *data) { + int status; + BUG_ON(system_state != SYS_STATE_active); system_state = SYS_STATE_suspend; freeze_domains(); + status = disable_nonboot_cpus(); + if ( status ) + { + system_state = SYS_STATE_resume; + goto resume_nonboot_cpus; + } + system_state = SYS_STATE_resume; +resume_nonboot_cpus: + enable_nonboot_cpus(); thaw_domains(); system_state = SYS_STATE_active; + dsb(sy); - return -ENOSYS; + return status; } int32_t domain_suspend(register_t epoint, register_t cid)