Re: [PATCH 07/19] xen/arm: Disable/enable non-boot physical CPUs on suspend/resume

2022-12-06 Thread Julien Grall

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

2022-10-07 Thread Mykyta Poturai
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