Re: [PATCH 6/7] xen/acpi/sleep: Enable ACPI sleep via the __acpi_override_sleep

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 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

_______________________________________________
linux-pm mailing list
linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/linux-pm


[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux