Re: [PATCH 07/19] xen/arm: Disable/enable non-boot physical CPUs on suspend/resume
Hi, On 07/10/2022 11:32, Mykyta Poturai wrote: From: Mirela Simonovic 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 Signed-off-by: Saeed Nowshadi --- 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 +#include #include #include #include @@ -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, -- Julien Grall
[PATCH 07/19] xen/arm: Disable/enable non-boot physical CPUs on suspend/resume
From: Mirela Simonovic 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 Signed-off-by: Saeed Nowshadi --- 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 +#include #include #include #include @@ -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) -- 2.37.1