Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xen/acpi/sleep: Enable ACPI sleep via the __acpi_os_prepare_sleep

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@intel.com> initial idea.
[ From http://xenbits.xensource.com/linux-2.6.18-xen.hg
change c68699484a65 ]

[v1: Added Copyright and license]
[v2: Added check if PM1A/B the 16-bits MSB contain something. The spec
only uses 16-bits but might have more in future]
Signed-off-by: Liang Tang <liang.tang@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

+124 -1
+3
arch/x86/xen/enlighten.c
··· 42 42 #include <xen/page.h> 43 43 #include <xen/hvm.h> 44 44 #include <xen/hvc-console.h> 45 + #include <xen/acpi.h> 45 46 46 47 #include <asm/paravirt.h> 47 48 #include <asm/apic.h> ··· 1374 1373 1375 1374 /* Make sure ACS will be enabled */ 1376 1375 pci_request_acs(); 1376 + 1377 + xen_acpi_sleep_register(); 1377 1378 } 1378 1379 1379 1380
+1 -1
drivers/xen/Makefile
··· 17 17 obj-$(CONFIG_XEN_PVHVM) += platform-pci.o 18 18 obj-$(CONFIG_XEN_TMEM) += tmem.o 19 19 obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o 20 - obj-$(CONFIG_XEN_DOM0) += pci.o 20 + obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o 21 21 obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ 22 22 obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o 23 23 obj-$(CONFIG_XEN_ACPI_PROCESSOR) += xen-acpi-processor.o
+62
drivers/xen/acpi.c
··· 1 + /****************************************************************************** 2 + * acpi.c 3 + * acpi file for domain 0 kernel 4 + * 5 + * Copyright (c) 2011 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> 6 + * Copyright (c) 2011 Yu Ke ke.yu@intel.com 7 + * 8 + * This program is free software; you can redistribute it and/or 9 + * modify it under the terms of the GNU General Public License version 2 10 + * as published by the Free Software Foundation; or, when distributed 11 + * separately from the Linux kernel or incorporated into other 12 + * software packages, subject to the following license: 13 + * 14 + * Permission is hereby granted, free of charge, to any person obtaining a copy 15 + * of this source file (the "Software"), to deal in the Software without 16 + * restriction, including without limitation the rights to use, copy, modify, 17 + * merge, publish, distribute, sublicense, and/or sell copies of the Software, 18 + * and to permit persons to whom the Software is furnished to do so, subject to 19 + * the following conditions: 20 + * 21 + * The above copyright notice and this permission notice shall be included in 22 + * all copies or substantial portions of the Software. 23 + * 24 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 29 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 30 + * IN THE SOFTWARE. 31 + */ 32 + 33 + #include <xen/acpi.h> 34 + #include <xen/interface/platform.h> 35 + #include <asm/xen/hypercall.h> 36 + #include <asm/xen/hypervisor.h> 37 + 38 + int xen_acpi_notify_hypervisor_state(u8 sleep_state, 39 + u32 pm1a_cnt, u32 pm1b_cnt) 40 + { 41 + struct xen_platform_op op = { 42 + .cmd = XENPF_enter_acpi_sleep, 43 + .interface_version = XENPF_INTERFACE_VERSION, 44 + .u = { 45 + .enter_acpi_sleep = { 46 + .pm1a_cnt_val = (u16)pm1a_cnt, 47 + .pm1b_cnt_val = (u16)pm1b_cnt, 48 + .sleep_state = sleep_state, 49 + }, 50 + }, 51 + }; 52 + 53 + if ((pm1a_cnt & 0xffff0000) || (pm1b_cnt & 0xffff0000)) { 54 + WARN(1, "Using more than 16bits of PM1A/B 0x%x/0x%x!" 55 + "Email xen-devel@lists.xensource.com Thank you.\n", \ 56 + pm1a_cnt, pm1b_cnt); 57 + return -1; 58 + } 59 + 60 + HYPERVISOR_dom0_op(&op); 61 + return 1; 62 + }
+58
include/xen/acpi.h
··· 1 + /****************************************************************************** 2 + * acpi.h 3 + * acpi file for domain 0 kernel 4 + * 5 + * Copyright (c) 2011 Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> 6 + * Copyright (c) 2011 Yu Ke <ke.yu@intel.com> 7 + * 8 + * This program is free software; you can redistribute it and/or 9 + * modify it under the terms of the GNU General Public License version 2 10 + * as published by the Free Software Foundation; or, when distributed 11 + * separately from the Linux kernel or incorporated into other 12 + * software packages, subject to the following license: 13 + * 14 + * Permission is hereby granted, free of charge, to any person obtaining a copy 15 + * of this source file (the "Software"), to deal in the Software without 16 + * restriction, including without limitation the rights to use, copy, modify, 17 + * merge, publish, distribute, sublicense, and/or sell copies of the Software, 18 + * and to permit persons to whom the Software is furnished to do so, subject to 19 + * the following conditions: 20 + * 21 + * The above copyright notice and this permission notice shall be included in 22 + * all copies or substantial portions of the Software. 23 + * 24 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 29 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 30 + * IN THE SOFTWARE. 31 + */ 32 + 33 + #ifndef _XEN_ACPI_H 34 + #define _XEN_ACPI_H 35 + 36 + #include <linux/types.h> 37 + 38 + #ifdef CONFIG_XEN_DOM0 39 + #include <asm/xen/hypervisor.h> 40 + #include <xen/xen.h> 41 + #include <linux/acpi.h> 42 + 43 + int xen_acpi_notify_hypervisor_state(u8 sleep_state, 44 + u32 pm1a_cnt, u32 pm1b_cnd); 45 + 46 + static inline void xen_acpi_sleep_register(void) 47 + { 48 + if (xen_initial_domain()) 49 + acpi_os_set_prepare_sleep( 50 + &xen_acpi_notify_hypervisor_state); 51 + } 52 + #else 53 + static inline void xen_acpi_sleep_register(void) 54 + { 55 + } 56 + #endif 57 + 58 + #endif /* _XEN_ACPI_H */