[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/7] x86, acpi, tboot: Have a ACPI os prepare sleep instead of calling tboot_sleep.
From: Tang Liang <liang.tang@xxxxxxxxxx> The ACPI suspend path makes a call to tboot_sleep right before it writes the PM1A, PM1B values. We replace the direct call to tboot via an registration callback similar to __acpi_register_gsi. As part of this, the tboot_sleep need only to register with the acpi_os_prepare_sleep_register and if it not (on IA64) then it simply won't be called. We can also remove the tboot_sleep declerations. [v1: Added __attribute__ ((unused))] [v2: Introduced a wrapper instead of changing tboot_sleep return values] Signed-off-by: Tang Liang <liang.tang@xxxxxxxxxx> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- arch/x86/kernel/tboot.c | 9 +++++++++ drivers/acpi/acpica/hwsleep.c | 7 ++++--- drivers/acpi/osl.c | 19 +++++++++++++++++++ include/acpi/acpiosxf.h | 6 ++++++ include/linux/tboot.h | 3 --- 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c index e2410e2..751d673 100644 --- a/arch/x86/kernel/tboot.c +++ b/arch/x86/kernel/tboot.c @@ -31,6 +31,7 @@ #include <linux/pfn.h> #include <linux/mm.h> #include <linux/tboot.h> +#include <acpi/acpiosxf.h> #include <asm/trampoline.h> #include <asm/processor.h> @@ -297,6 +298,12 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) tboot_shutdown(acpi_shutdown_map[sleep_state]); } +static acpi_status tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control, + u32 pm1b_control) +{ + tboot_sleep(sleep_state, pm1a_control, pm1b_control); + return AE_OK; +} static atomic_t ap_wfs_count; @@ -345,6 +352,8 @@ static __init int tboot_late_init(void) atomic_set(&ap_wfs_count, 0); register_hotcpu_notifier(&tboot_cpu_notifier); + + acpi_os_prepare_sleep_register(&tboot_sleep_wrapper); return 0; } diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c index d52da30..b10bc90 100644 --- a/drivers/acpi/acpica/hwsleep.c +++ b/drivers/acpi/acpica/hwsleep.c @@ -45,7 +45,6 @@ #include <acpi/acpi.h> #include "accommon.h" #include "actables.h" -#include <linux/tboot.h> #include <linux/module.h> #define _COMPONENT ACPI_HARDWARE @@ -344,8 +343,10 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state) ACPI_FLUSH_CPU_CACHE(); - tboot_sleep(sleep_state, pm1a_control, pm1b_control); - + status = acpi_os_prepare_sleep(sleep_state, pm1a_control, + pm1b_control); + if (ACPI_FAILURE(status)) + return_ACPI_STATUS(status); /* Write #2: Write both SLP_TYP + SLP_EN */ status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control); diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index f31c5c5..40daa68 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -1659,3 +1659,22 @@ acpi_status acpi_os_terminate(void) return AE_OK; } + +acpi_status (*__acpi_os_prepare_sleep)(u8 sleep_state, u32 pm1a_ctrl, + u32 pm1b_ctrl); + +acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control, + u32 pm1b_control) +{ + if (__acpi_os_prepare_sleep) + return __acpi_os_prepare_sleep(sleep_state, pm1a_control, + pm1b_control); + else + return AE_OK; +} + +void acpi_os_prepare_sleep_register(acpi_status (*func)(u8 sleep_state, + u32 pm1a_ctrl, u32 pm1b_ctrl)) +{ + __acpi_os_prepare_sleep = func; +} diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 83062ed..ebde1e1 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h @@ -108,6 +108,12 @@ void acpi_os_delete_lock(acpi_spinlock handle); acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle); +void acpi_os_prepare_sleep_register(acpi_status (*func)(u8 sleep_state, + u32 pm1a_ctrl, u32 pm1b_ctrl)); + +acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control, + u32 pm1b_control); + void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags); /* diff --git a/include/linux/tboot.h b/include/linux/tboot.h index 1dba6ee..d57732d 100644 --- a/include/linux/tboot.h +++ b/include/linux/tboot.h @@ -143,7 +143,6 @@ static inline int tboot_enabled(void) extern void tboot_probe(void); extern void tboot_shutdown(u32 shutdown_type); -extern void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control); extern struct acpi_table_header *tboot_get_dmar_table( struct acpi_table_header *dmar_tbl); extern int tboot_force_iommu(void); @@ -153,8 +152,6 @@ extern int tboot_force_iommu(void); #define tboot_enabled() 0 #define tboot_probe() do { } while (0) #define tboot_shutdown(shutdown_type) do { } while (0) -#define tboot_sleep(sleep_state, pm1a_control, pm1b_control) \ - do { } while (0) #define tboot_get_dmar_table(dmar_tbl) (dmar_tbl) #define tboot_force_iommu() 0 -- 1.7.7.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |