> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@xxxxxxxxxx]
> Sent: Wednesday, August 31, 2011 11:31 AM
>
> Provide the registration callback to call in the Xen's ACPI sleep
> functionality. This means that
> during S3/S5 we make a hypercall XENPF_enter_acpi_sleep with the proper
> PM1A/PM1B registers.
>
> Based of Ke Yu's <ke.yu@xxxxxxxxx> initial idea.
> [ From http://xenbits.xensource.com/linux-2.6.18-xen.hg
> change c68699484a65 ]
>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> ---
> arch/x86/include/asm/xen/hypercall.h | 8 ++++++++
> arch/x86/xen/enlighten.c | 3 +++
> drivers/xen/Makefile | 2 +-
> drivers/xen/acpi.c | 25 +++++++++++++++++++++++++
> include/xen/acpi.h | 26 ++++++++++++++++++++++++++
> 5 files changed, 63 insertions(+), 1 deletions(-) create mode 100644
> drivers/xen/acpi.c create
> mode 100644 include/xen/acpi.h
>
> diff --git a/arch/x86/include/asm/xen/hypercall.h
> b/arch/x86/include/asm/xen/hypercall.h
> index d240ea9..0c9894e 100644
> --- a/arch/x86/include/asm/xen/hypercall.h
> +++ b/arch/x86/include/asm/xen/hypercall.h
> @@ -45,6 +45,7 @@
> #include <xen/interface/xen.h>
> #include <xen/interface/sched.h>
> #include <xen/interface/physdev.h>
> +#include <xen/interface/platform.h>
>
> /*
> * The hypercall asms have to meet several constraints:
> @@ -299,6 +300,13 @@ HYPERVISOR_set_timer_op(u64 timeout) }
>
> static inline int
> +HYPERVISOR_dom0_op(struct xen_platform_op *platform_op) {
> + platform_op->interface_version = XENPF_INTERFACE_VERSION;
> + return _hypercall1(int, dom0_op, platform_op); }
> +
> +static inline int
> HYPERVISOR_set_debugreg(int reg, unsigned long value) {
> return _hypercall2(int, set_debugreg, reg, value); diff --git
> a/arch/x86/xen/enlighten.c
> b/arch/x86/xen/enlighten.c index 5525163..6962653 100644
> --- a/arch/x86/xen/enlighten.c
> +++ b/arch/x86/xen/enlighten.c
> @@ -42,6 +42,7 @@
> #include <xen/page.h>
> #include <xen/hvm.h>
> #include <xen/hvc-console.h>
> +#include <xen/acpi.h>
>
> #include <asm/paravirt.h>
> #include <asm/apic.h>
> @@ -1250,6 +1251,8 @@ asmlinkage void __init xen_start_kernel(void)
> } else {
> /* Make sure ACS will be enabled */
> pci_request_acs();
> +
> + xen_acpi_sleep_register();
> }
>
>
> diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index
> bbc1825..370552d 100644
> --- a/drivers/xen/Makefile
> +++ b/drivers/xen/Makefile
> @@ -16,7 +16,7 @@ obj-$(CONFIG_XENFS) += xenfs/
> obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o
> obj-$(CONFIG_XEN_PLATFORM_PCI) += xen-platform-pci.o
> obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o
> -obj-$(CONFIG_XEN_DOM0) += pci.o
> +obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o
>
> xen-evtchn-y := evtchn.o
> xen-gntdev-y := gntdev.o
> diff --git a/drivers/xen/acpi.c b/drivers/xen/acpi.c new file mode 100644
> index 0000000..c0f829f
> --- /dev/null
> +++ b/drivers/xen/acpi.c
> @@ -0,0 +1,25 @@
Copyright and license?
> +#include <xen/acpi.h>
> +#include <xen/interface/platform.h>
> +#include <asm/xen/hypercall.h>
> +#include <asm/xen/hypervisor.h>
> +
> +int xen_acpi_notify_hypervisor_state(u8 sleep_state,
> + u32 pm1a_cnt, u32 pm1b_cnt,
> + bool *skip_rest)
> +{
> + struct xen_platform_op op = {
> + .cmd = XENPF_enter_acpi_sleep,
> + .interface_version = XENPF_INTERFACE_VERSION,
> + .u = {
> + .enter_acpi_sleep = {
> + .pm1a_cnt_val = (u16)pm1a_cnt,
> + .pm1b_cnt_val = (u16)pm1b_cnt,
> + .sleep_state = sleep_state,
> + },
> + },
> + };
> + if (skip_rest)
> + *skip_rest = true;
> +
> + return HYPERVISOR_dom0_op(&op);
> +}
> diff --git a/include/xen/acpi.h b/include/xen/acpi.h new file mode 100644
> index 0000000..e414f14
> --- /dev/null
> +++ b/include/xen/acpi.h
> @@ -0,0 +1,26 @@
Copyright and license?
> +#ifndef _XEN_ACPI_H
> +#define _XEN_ACPI_H
> +
> +#include <linux/types.h>
> +
> +#ifdef CONFIG_XEN_DOM0
> +#include <asm/xen/hypervisor.h>
> +#include <xen/xen.h>
> +#include <linux/acpi.h>
> +
> +int xen_acpi_notify_hypervisor_state(u8 sleep_state,
> + u32 pm1a_cnt, u32 pm1b_cnd,
> + bool *skip_rest);
> +
> +static inline void xen_acpi_sleep_register(void) {
> + if (xen_initial_domain())
> + __acpi_override_sleep = xen_acpi_notify_hypervisor_state; }
> #else
> +static inline void xen_acpi_sleep_register(void) { } #endif
> +
> +#endif /* _XEN_ACPI_H */
> --
> 1.7.4.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|