* [PATCH 0/2] Implement ACPI S3 for Xen dom0
@ 2013-05-14 17:09 Ben Guthro
2013-05-14 17:09 ` [PATCH 1/2] x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel Ben Guthro
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Ben Guthro @ 2013-05-14 17:09 UTC (permalink / raw)
To: linux-kernel, x86, linux-acpi, xen-devel; +Cc: Ben Guthro
The following series provides a mechanism for a Xen based dom0 to
be able to suspend the platform to ACPI S3.
The first patch provides a registration mechanism for alternate
implementations of acpi_suspend_lowlevel.
The second patch provides a Xen specific version of this, and hooks
into the callback.
Regards,
Ben Guthro
Konrad Rzeszutek Wilk (2):
x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel.
xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback.
arch/x86/include/asm/acpi.h | 2 +-
arch/x86/kernel/acpi/boot.c | 7 +++++++
arch/x86/kernel/acpi/sleep.c | 4 ++--
arch/x86/kernel/acpi/sleep.h | 2 ++
drivers/acpi/sleep.c | 2 ++
include/xen/acpi.h | 16 +++++++++++++++-
6 files changed, 29 insertions(+), 4 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel.
2013-05-14 17:09 [PATCH 0/2] Implement ACPI S3 for Xen dom0 Ben Guthro
@ 2013-05-14 17:09 ` Ben Guthro
2013-05-14 17:09 ` [PATCH 2/2] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback Ben Guthro
2013-05-14 17:46 ` Ben Guthro
2 siblings, 0 replies; 5+ messages in thread
From: Ben Guthro @ 2013-05-14 17:09 UTC (permalink / raw)
To: linux-kernel, x86, linux-acpi, xen-devel
Cc: Konrad Rzeszutek Wilk, Thomas Gleixner, H. Peter Anvin, Len Brown,
Joseph Cihula, Shane Wang, linux-pm, Liang Tang
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Which by default will be x86_acpi_suspend_lowlevel.
This registration allows us to register another callback
if there is a need to use another platform specific callback.
CC: Thomas Gleixner <tglx@linutronix.de>
CC: "H. Peter Anvin" <hpa@linux.intel.com>
CC: x86@kernel.org
CC: Len Brown <len.brown@intel.com>
CC: Joseph Cihula <joseph.cihula@intel.com>
CC: Shane Wang <shane.wang@intel.com>
CC: linux-pm@lists.linux-foundation.org
CC: linux-acpi@vger.kernel.org
CC: Len Brown <len.brown@intel.com>
Signed-off-by: Liang Tang <liang.tang@oracle.com>
[v1: Fix when CONFIG_ACPI_SLEEP is not set]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tested-by: Ben Guthro <benjamin.guthro@citrix.com>
Acked-by: "H. Peter Anvin" <hpa@linux.intel.com>
---
arch/x86/include/asm/acpi.h | 2 +-
arch/x86/kernel/acpi/boot.c | 7 +++++++
arch/x86/kernel/acpi/sleep.c | 4 ++--
arch/x86/kernel/acpi/sleep.h | 2 ++
drivers/acpi/sleep.c | 2 ++
5 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
index b31bf97..2dfac58 100644
--- a/arch/x86/include/asm/acpi.h
+++ b/arch/x86/include/asm/acpi.h
@@ -111,7 +111,7 @@ static inline void acpi_disable_pci(void)
}
/* Low-level suspend routine. */
-extern int acpi_suspend_lowlevel(void);
+extern int (*acpi_suspend_lowlevel)(void);
/* Physical address to resume after wakeup */
#define acpi_wakeup_address ((unsigned long)(real_mode_header->wakeup_start))
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 230c8ea..d81a972 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -44,6 +44,7 @@
#include <asm/mpspec.h>
#include <asm/smp.h>
+#include "sleep.h" /* To include x86_acpi_suspend_lowlevel */
static int __initdata acpi_force = 0;
u32 acpi_rsdt_forced;
int acpi_disabled;
@@ -559,6 +560,12 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
int (*__acpi_register_gsi)(struct device *dev, u32 gsi,
int trigger, int polarity) = acpi_register_gsi_pic;
+#ifdef CONFIG_ACPI_SLEEP
+int (*acpi_suspend_lowlevel)(void) = x86_acpi_suspend_lowlevel;
+#else
+int (*acpi_suspend_lowlevel)(void);
+#endif
+
/*
* success: return IRQ number (>=0)
* failure: return < 0
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index b44577b..2a34aaf 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -26,12 +26,12 @@ static char temp_stack[4096];
#endif
/**
- * acpi_suspend_lowlevel - save kernel state
+ * x86_acpi_suspend_lowlevel - save kernel state
*
* Create an identity mapped page table and copy the wakeup routine to
* low memory.
*/
-int acpi_suspend_lowlevel(void)
+int x86_acpi_suspend_lowlevel(void)
{
struct wakeup_header *header =
(struct wakeup_header *) __va(real_mode_header->wakeup_header);
diff --git a/arch/x86/kernel/acpi/sleep.h b/arch/x86/kernel/acpi/sleep.h
index 67f59f8..c9c2c98 100644
--- a/arch/x86/kernel/acpi/sleep.h
+++ b/arch/x86/kernel/acpi/sleep.h
@@ -15,3 +15,5 @@ extern unsigned long acpi_copy_wakeup_routine(unsigned long);
extern void wakeup_long64(void);
extern void do_suspend_lowlevel(void);
+
+extern int x86_acpi_suspend_lowlevel(void);
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 9c1a435..187ab61 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -494,6 +494,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
break;
case ACPI_STATE_S3:
+ if (!acpi_suspend_lowlevel)
+ return -ENOSYS;
error = acpi_suspend_lowlevel();
if (error)
return error;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback.
2013-05-14 17:09 [PATCH 0/2] Implement ACPI S3 for Xen dom0 Ben Guthro
2013-05-14 17:09 ` [PATCH 1/2] x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel Ben Guthro
@ 2013-05-14 17:09 ` Ben Guthro
2013-05-14 17:46 ` Ben Guthro
2 siblings, 0 replies; 5+ messages in thread
From: Ben Guthro @ 2013-05-14 17:09 UTC (permalink / raw)
To: linux-kernel, x86, linux-acpi, xen-devel
Cc: Konrad Rzeszutek Wilk, Liang Tang
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
We piggyback on "x86/acpi: Provide registration for acpi_suspend_lowlevel."
to register a Xen version of the callback. The callback does not
do anything special - except it omits the x86_acpi_suspend_lowlevel.
It does that b/c during suspend it tries to save cr8 values (which
the hypervisor does not support), and then on resume path the
cr3, cr8, idt, and gdt are all resumed which clashes with what
the hypervisor has set up for the guest.
Signed-off-by: Liang Tang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tested-by: Ben Guthro <benjamin.guthro@citrix.com>
Acked-by: H. Peter Anvin <hpa@linux.intel.com>
---
include/xen/acpi.h | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/include/xen/acpi.h b/include/xen/acpi.h
index 68d73d0..46aa3d1 100644
--- a/include/xen/acpi.h
+++ b/include/xen/acpi.h
@@ -78,11 +78,25 @@ static inline int xen_acpi_get_pxm(acpi_handle h)
int xen_acpi_notify_hypervisor_state(u8 sleep_state,
u32 pm1a_cnt, u32 pm1b_cnd);
+static inline int xen_acpi_suspend_lowlevel(void)
+{
+ /*
+ * Xen will save and restore CPU context, so
+ * we can skip that and just go straight to
+ * the suspend.
+ */
+ acpi_enter_sleep_state(ACPI_STATE_S3);
+ return 0;
+}
+
static inline void xen_acpi_sleep_register(void)
{
- if (xen_initial_domain())
+ if (xen_initial_domain()) {
acpi_os_set_prepare_sleep(
&xen_acpi_notify_hypervisor_state);
+
+ acpi_suspend_lowlevel = xen_acpi_suspend_lowlevel;
+ }
}
#else
static inline void xen_acpi_sleep_register(void)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback.
2013-05-14 17:09 [PATCH 0/2] Implement ACPI S3 for Xen dom0 Ben Guthro
2013-05-14 17:09 ` [PATCH 1/2] x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel Ben Guthro
2013-05-14 17:09 ` [PATCH 2/2] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback Ben Guthro
@ 2013-05-14 17:46 ` Ben Guthro
2013-05-14 17:46 ` [PATCH] " Ben Guthro
2 siblings, 1 reply; 5+ messages in thread
From: Ben Guthro @ 2013-05-14 17:46 UTC (permalink / raw)
To: linux-kernel, x86, linux-acpi, xen-devel
Apoligies, the prior description was a bit stale, in lieu of the 3.10 merge window.
cr3 is really the only thing that this needs to worry about anymore, since gdt pvops
has been removed, and the other registers are pvops'ed.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback.
2013-05-14 17:46 ` Ben Guthro
@ 2013-05-14 17:46 ` Ben Guthro
0 siblings, 0 replies; 5+ messages in thread
From: Ben Guthro @ 2013-05-14 17:46 UTC (permalink / raw)
To: linux-kernel, x86, linux-acpi, xen-devel
Cc: Konrad Rzeszutek Wilk, Liang Tang
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
We piggyback on "x86/acpi: Provide registration for acpi_suspend_lowlevel."
to register a Xen version of the callback. The callback does not
do anything special - except it omits the x86_acpi_suspend_lowlevel.
This is necessary b/c during suspend the generic code tries to write
cr3 values that clashes with what the hypervisor has set up for the guest.
Signed-off-by: Liang Tang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tested-by: Ben Guthro <benjamin.guthro@citrix.com>
Acked-by: H. Peter Anvin <hpa@linux.intel.com>
---
include/xen/acpi.h | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/include/xen/acpi.h b/include/xen/acpi.h
index 68d73d0..46aa3d1 100644
--- a/include/xen/acpi.h
+++ b/include/xen/acpi.h
@@ -78,11 +78,25 @@ static inline int xen_acpi_get_pxm(acpi_handle h)
int xen_acpi_notify_hypervisor_state(u8 sleep_state,
u32 pm1a_cnt, u32 pm1b_cnd);
+static inline int xen_acpi_suspend_lowlevel(void)
+{
+ /*
+ * Xen will save and restore CPU context, so
+ * we can skip that and just go straight to
+ * the suspend.
+ */
+ acpi_enter_sleep_state(ACPI_STATE_S3);
+ return 0;
+}
+
static inline void xen_acpi_sleep_register(void)
{
- if (xen_initial_domain())
+ if (xen_initial_domain()) {
acpi_os_set_prepare_sleep(
&xen_acpi_notify_hypervisor_state);
+
+ acpi_suspend_lowlevel = xen_acpi_suspend_lowlevel;
+ }
}
#else
static inline void xen_acpi_sleep_register(void)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-05-14 17:46 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-14 17:09 [PATCH 0/2] Implement ACPI S3 for Xen dom0 Ben Guthro
2013-05-14 17:09 ` [PATCH 1/2] x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel Ben Guthro
2013-05-14 17:09 ` [PATCH 2/2] xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback Ben Guthro
2013-05-14 17:46 ` Ben Guthro
2013-05-14 17:46 ` [PATCH] " Ben Guthro
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).