diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-08-26 19:28:38 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-08-26 19:28:38 -0400 |
commit | 4b319f290d3b9c756228a66f72095d0039ec1b50 (patch) | |
tree | 2cda8d4ac3d1f2d9732a2b16feb15b14f91c83f7 /drivers/xen | |
parent | 0ad4c9a9848fdd46dc422160efd947489a98bbc1 (diff) | |
parent | 01c6a6afd50f07dfd66b2891fd194c4b789fca48 (diff) |
Merge branch 'acpi-sleep'
* acpi-sleep:
x86 / tboot / ACPI: Fail extended mode reduced hardware sleep
xen / ACPI: notify xen when reduced hardware sleep is available
ACPI / sleep: Introduce acpi_os_prepare_extended_sleep() for extended sleep path
Diffstat (limited to 'drivers/xen')
-rw-r--r-- | drivers/xen/acpi.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/drivers/xen/acpi.c b/drivers/xen/acpi.c index 119d42a2bf57..90307c0b630c 100644 --- a/drivers/xen/acpi.c +++ b/drivers/xen/acpi.c | |||
@@ -35,28 +35,43 @@ | |||
35 | #include <asm/xen/hypercall.h> | 35 | #include <asm/xen/hypercall.h> |
36 | #include <asm/xen/hypervisor.h> | 36 | #include <asm/xen/hypervisor.h> |
37 | 37 | ||
38 | int xen_acpi_notify_hypervisor_state(u8 sleep_state, | 38 | static int xen_acpi_notify_hypervisor_state(u8 sleep_state, |
39 | u32 pm1a_cnt, u32 pm1b_cnt) | 39 | u32 val_a, u32 val_b, |
40 | bool extended) | ||
40 | { | 41 | { |
42 | unsigned int bits = extended ? 8 : 16; | ||
43 | |||
41 | struct xen_platform_op op = { | 44 | struct xen_platform_op op = { |
42 | .cmd = XENPF_enter_acpi_sleep, | 45 | .cmd = XENPF_enter_acpi_sleep, |
43 | .interface_version = XENPF_INTERFACE_VERSION, | 46 | .interface_version = XENPF_INTERFACE_VERSION, |
44 | .u = { | 47 | .u.enter_acpi_sleep = { |
45 | .enter_acpi_sleep = { | 48 | .val_a = (u16)val_a, |
46 | .pm1a_cnt_val = (u16)pm1a_cnt, | 49 | .val_b = (u16)val_b, |
47 | .pm1b_cnt_val = (u16)pm1b_cnt, | 50 | .sleep_state = sleep_state, |
48 | .sleep_state = sleep_state, | 51 | .flags = extended ? XENPF_ACPI_SLEEP_EXTENDED : 0, |
49 | }, | ||
50 | }, | 52 | }, |
51 | }; | 53 | }; |
52 | 54 | ||
53 | if ((pm1a_cnt & 0xffff0000) || (pm1b_cnt & 0xffff0000)) { | 55 | if (WARN((val_a & (~0 << bits)) || (val_b & (~0 << bits)), |
54 | WARN(1, "Using more than 16bits of PM1A/B 0x%x/0x%x!" | 56 | "Using more than %u bits of sleep control values %#x/%#x!" |
55 | "Email xen-devel@lists.xensource.com Thank you.\n", \ | 57 | "Email xen-devel@lists.xen.org - Thank you.\n", \ |
56 | pm1a_cnt, pm1b_cnt); | 58 | bits, val_a, val_b)) |
57 | return -1; | 59 | return -1; |
58 | } | ||
59 | 60 | ||
60 | HYPERVISOR_dom0_op(&op); | 61 | HYPERVISOR_dom0_op(&op); |
61 | return 1; | 62 | return 1; |
62 | } | 63 | } |
64 | |||
65 | int xen_acpi_notify_hypervisor_sleep(u8 sleep_state, | ||
66 | u32 pm1a_cnt, u32 pm1b_cnt) | ||
67 | { | ||
68 | return xen_acpi_notify_hypervisor_state(sleep_state, pm1a_cnt, | ||
69 | pm1b_cnt, false); | ||
70 | } | ||
71 | |||
72 | int xen_acpi_notify_hypervisor_extended_sleep(u8 sleep_state, | ||
73 | u32 val_a, u32 val_b) | ||
74 | { | ||
75 | return xen_acpi_notify_hypervisor_state(sleep_state, val_a, | ||
76 | val_b, true); | ||
77 | } | ||