xen: make CPU hotplug functions static
[safe/jmp/linux-2.6] / drivers / acpi / hardware / hwsleep.c
index 992128d..dba3cfb 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2006, R. Byron Moore
+ * Copyright (C) 2000 - 2008, Intel Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,8 +42,8 @@
  * POSSIBILITY OF SUCH DAMAGES.
  */
 
-#include <linux/module.h>
 #include <acpi/acpi.h>
+#include <acpi/actables.h>
 
 #define _COMPONENT          ACPI_HARDWARE
 ACPI_MODULE_NAME("hwsleep")
@@ -63,22 +63,40 @@ ACPI_MODULE_NAME("hwsleep")
 acpi_status
 acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
 {
+       struct acpi_table_facs *facs;
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
 
-       ACPI_FUNCTION_TRACE("acpi_set_firmware_waking_vector");
+       /* Get the FACS */
+
+       status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
+                                        ACPI_CAST_INDIRECT_PTR(struct
+                                                               acpi_table_header,
+                                                               &facs));
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
 
        /* Set the vector */
 
-       if (acpi_gbl_common_fACS.vector_width == 32) {
-               *(ACPI_CAST_PTR
-                 (u32, acpi_gbl_common_fACS.firmware_waking_vector))
-                   = (u32) physical_address;
+       if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
+               /*
+                * ACPI 1.0 FACS or short table or optional X_ field is zero
+                */
+               facs->firmware_waking_vector = (u32) physical_address;
        } else {
-               *acpi_gbl_common_fACS.firmware_waking_vector = physical_address;
+               /*
+                * ACPI 2.0 FACS with valid X_ field
+                */
+               facs->xfirmware_waking_vector = physical_address;
        }
 
        return_ACPI_STATUS(AE_OK);
 }
 
+ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_get_firmware_waking_vector
@@ -92,34 +110,50 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
  * DESCRIPTION: Access function for the firmware_waking_vector field in FACS
  *
  ******************************************************************************/
-
 #ifdef ACPI_FUTURE_USAGE
 acpi_status
 acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
 {
+       struct acpi_table_facs *facs;
+       acpi_status status;
 
-       ACPI_FUNCTION_TRACE("acpi_get_firmware_waking_vector");
+       ACPI_FUNCTION_TRACE(acpi_get_firmware_waking_vector);
 
        if (!physical_address) {
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
+       /* Get the FACS */
+
+       status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
+                                        ACPI_CAST_INDIRECT_PTR(struct
+                                                               acpi_table_header,
+                                                               &facs));
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
+
        /* Get the vector */
 
-       if (acpi_gbl_common_fACS.vector_width == 32) {
-               *physical_address = (acpi_physical_address)
-                   *
-                   (ACPI_CAST_PTR
-                    (u32, acpi_gbl_common_fACS.firmware_waking_vector));
+       if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
+               /*
+                * ACPI 1.0 FACS or short table or optional X_ field is zero
+                */
+               *physical_address =
+                   (acpi_physical_address) facs->firmware_waking_vector;
        } else {
+               /*
+                * ACPI 2.0 FACS with valid X_ field
+                */
                *physical_address =
-                   *acpi_gbl_common_fACS.firmware_waking_vector;
+                   (acpi_physical_address) facs->xfirmware_waking_vector;
        }
 
        return_ACPI_STATUS(AE_OK);
 }
-#endif
 
+ACPI_EXPORT_SYMBOL(acpi_get_firmware_waking_vector)
+#endif
 /*******************************************************************************
  *
  * FUNCTION:    acpi_enter_sleep_state_prep
@@ -134,14 +168,13 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
  *              various OS-specific tasks between the two steps.
  *
  ******************************************************************************/
-
 acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
 {
        acpi_status status;
        struct acpi_object_list arg_list;
        union acpi_object arg;
 
-       ACPI_FUNCTION_TRACE("acpi_enter_sleep_state_prep");
+       ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_prep);
 
        /*
         * _PSW methods could be run here to enable wake-on keyboard, LAN, etc.
@@ -161,18 +194,13 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
        arg.type = ACPI_TYPE_INTEGER;
        arg.integer.value = sleep_state;
 
-       /* Run the _PTS and _GTS methods */
+       /* Run the _PTS method */
 
        status = acpi_evaluate_object(NULL, METHOD_NAME__PTS, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
                return_ACPI_STATUS(status);
        }
 
-       status = acpi_evaluate_object(NULL, METHOD_NAME__GTS, &arg_list, NULL);
-       if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               return_ACPI_STATUS(status);
-       }
-
        /* Setup the argument to _SST */
 
        switch (sleep_state) {
@@ -195,17 +223,21 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
                break;
        }
 
-       /* Set the system indicators to show the desired sleep state. */
-
+       /*
+        * Set the system indicators to show the desired sleep state.
+        * _SST is an optional method (return no error if not found)
+        */
        status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _SST failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "While executing method _SST"));
        }
 
        return_ACPI_STATUS(AE_OK);
 }
 
+ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep)
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_enter_sleep_state
@@ -218,7 +250,6 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
  *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
  *
  ******************************************************************************/
-
 acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 {
        u32 PM1Acontrol;
@@ -226,15 +257,16 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
        struct acpi_bit_register_info *sleep_type_reg_info;
        struct acpi_bit_register_info *sleep_enable_reg_info;
        u32 in_value;
+       struct acpi_object_list arg_list;
+       union acpi_object arg;
        acpi_status status;
 
-       ACPI_FUNCTION_TRACE("acpi_enter_sleep_state");
+       ACPI_FUNCTION_TRACE(acpi_enter_sleep_state);
 
        if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) ||
            (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) {
-               ACPI_REPORT_ERROR(("Sleep values out of range: A=%X B=%X\n",
-                                  acpi_gbl_sleep_type_a,
-                                  acpi_gbl_sleep_type_b));
+               ACPI_ERROR((AE_INFO, "Sleep values out of range: A=%X B=%X",
+                           acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b));
                return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
        }
 
@@ -245,15 +277,14 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 
        /* Clear wake status */
 
-       status =
-           acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
+       status = acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
        /* Clear all fixed and general purpose status bits */
 
-       status = acpi_hw_clear_acpi_status(ACPI_MTX_DO_NOT_LOCK);
+       status = acpi_hw_clear_acpi_status();
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -273,10 +304,21 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
                return_ACPI_STATUS(status);
        }
 
+       /* Execute the _GTS method */
+
+       arg_list.count = 1;
+       arg_list.pointer = &arg;
+       arg.type = ACPI_TYPE_INTEGER;
+       arg.integer.value = sleep_state;
+
+       status = acpi_evaluate_object(NULL, METHOD_NAME__GTS, &arg_list, NULL);
+       if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
+               return_ACPI_STATUS(status);
+       }
+
        /* Get current value of PM1A control */
 
-       status = acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK,
-                                      ACPI_REGISTER_PM1_CONTROL, &PM1Acontrol);
+       status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL, &PM1Acontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -303,15 +345,13 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 
        /* Write #1: fill in SLP_TYP data */
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1A_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
                                        PM1Acontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1B_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
                                        PM1Bcontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
@@ -326,15 +366,13 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 
        ACPI_FLUSH_CPU_CACHE();
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1A_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
                                        PM1Acontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1B_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
                                        PM1Bcontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
@@ -354,8 +392,7 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
                 */
                acpi_os_stall(10000000);
 
-               status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                               ACPI_REGISTER_PM1_CONTROL,
+               status = acpi_hw_register_write(ACPI_REGISTER_PM1_CONTROL,
                                                sleep_enable_reg_info->
                                                access_bit_mask);
                if (ACPI_FAILURE(status)) {
@@ -366,8 +403,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
        /* Wait until we enter sleep state */
 
        do {
-               status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value,
-                                          ACPI_MTX_DO_NOT_LOCK);
+               status = acpi_get_register_unlocked(ACPI_BITREG_WAKE_STATUS,
+                                                   &in_value);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
@@ -379,7 +416,7 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
        return_ACPI_STATUS(AE_OK);
 }
 
-EXPORT_SYMBOL(acpi_enter_sleep_state);
+ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state)
 
 /*******************************************************************************
  *
@@ -393,21 +430,19 @@ EXPORT_SYMBOL(acpi_enter_sleep_state);
  *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
  *
  ******************************************************************************/
-
 acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void)
 {
        u32 in_value;
        acpi_status status;
 
-       ACPI_FUNCTION_TRACE("acpi_enter_sleep_state_s4bios");
+       ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_s4bios);
 
-       status =
-           acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
+       status = acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
-       status = acpi_hw_clear_acpi_status(ACPI_MTX_DO_NOT_LOCK);
+       status = acpi_hw_clear_acpi_status();
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -429,13 +464,12 @@ acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void)
 
        ACPI_FLUSH_CPU_CACHE();
 
-       status = acpi_os_write_port(acpi_gbl_FADT->smi_cmd,
-                                   (u32) acpi_gbl_FADT->S4bios_req, 8);
+       status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
+                                   (u32) acpi_gbl_FADT.S4bios_request, 8);
 
        do {
                acpi_os_stall(1000);
-               status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value,
-                                          ACPI_MTX_DO_NOT_LOCK);
+               status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
@@ -444,22 +478,22 @@ acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void)
        return_ACPI_STATUS(AE_OK);
 }
 
-EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios);
+ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios)
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_leave_sleep_state
+ * FUNCTION:    acpi_leave_sleep_state_prep
  *
- * PARAMETERS:  sleep_state         - Which sleep state we just exited
+ * PARAMETERS:  sleep_state         - Which sleep state we are exiting
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
- *              Called with interrupts ENABLED.
+ * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
+ *              sleep.
+ *              Called with interrupts DISABLED.
  *
  ******************************************************************************/
-
-acpi_status acpi_leave_sleep_state(u8 sleep_state)
+acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
 {
        struct acpi_object_list arg_list;
        union acpi_object arg;
@@ -469,7 +503,7 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
        u32 PM1Acontrol;
        u32 PM1Bcontrol;
 
-       ACPI_FUNCTION_TRACE("acpi_leave_sleep_state");
+       ACPI_FUNCTION_TRACE(acpi_leave_sleep_state_prep);
 
        /*
         * Set SLP_TYPE and SLP_EN to state S0.
@@ -487,10 +521,10 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
 
                /* Get current value of PM1A control */
 
-               status = acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK,
-                                              ACPI_REGISTER_PM1_CONTROL,
+               status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
                                               &PM1Acontrol);
                if (ACPI_SUCCESS(status)) {
+
                        /* Clear SLP_EN and SLP_TYP fields */
 
                        PM1Acontrol &= ~(sleep_type_reg_info->access_bit_mask |
@@ -509,15 +543,48 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
 
                        /* Just ignore any errors */
 
-                       (void)acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                                    ACPI_REGISTER_PM1A_CONTROL,
+                       (void)acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
                                                     PM1Acontrol);
-                       (void)acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                                    ACPI_REGISTER_PM1B_CONTROL,
+                       (void)acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
                                                     PM1Bcontrol);
                }
        }
 
+       /* Execute the _BFS method */
+
+       arg_list.count = 1;
+       arg_list.pointer = &arg;
+       arg.type = ACPI_TYPE_INTEGER;
+       arg.integer.value = sleep_state;
+
+       status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);
+       if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS"));
+       }
+
+       return_ACPI_STATUS(status);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_leave_sleep_state
+ *
+ * PARAMETERS:  sleep_state         - Which sleep state we just exited
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
+ *              Called with interrupts ENABLED.
+ *
+ ******************************************************************************/
+acpi_status acpi_leave_sleep_state(u8 sleep_state)
+{
+       struct acpi_object_list arg_list;
+       union acpi_object arg;
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE(acpi_leave_sleep_state);
+
        /* Ensure enter_sleep_state_prep -> enter_sleep_state ordering */
 
        acpi_gbl_sleep_type_a = ACPI_SLEEP_TYPE_INVALID;
@@ -533,25 +600,13 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
        arg.integer.value = ACPI_SST_WAKING;
        status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _SST failed, %s\n",
-                                  acpi_format_exception(status)));
-       }
-
-       arg.integer.value = sleep_state;
-       status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);
-       if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _BFS failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
        }
 
-       status = acpi_evaluate_object(NULL, METHOD_NAME__WAK, &arg_list, NULL);
-       if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _WAK failed, %s\n",
-                                  acpi_format_exception(status)));
-       }
-       /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
-
        /*
+        * GPEs must be enabled before _WAK is called as GPEs
+        * might get fired there
+        *
         * Restore the GPEs:
         * 1) Disable/Clear all GPEs
         * 2) Enable all runtime GPEs
@@ -560,31 +615,37 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
-       acpi_gbl_system_awake_and_running = TRUE;
-
        status = acpi_hw_enable_all_runtime_gpes();
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
+       arg.integer.value = sleep_state;
+       status = acpi_evaluate_object(NULL, METHOD_NAME__WAK, &arg_list, NULL);
+       if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _WAK"));
+       }
+       /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
+
+       acpi_gbl_system_awake_and_running = TRUE;
+
        /* Enable power button */
 
        (void)
            acpi_set_register(acpi_gbl_fixed_event_info
-                             [ACPI_EVENT_POWER_BUTTON].enable_register_id, 1,
-                             ACPI_MTX_DO_NOT_LOCK);
+                             [ACPI_EVENT_POWER_BUTTON].enable_register_id, 1);
 
        (void)
            acpi_set_register(acpi_gbl_fixed_event_info
-                             [ACPI_EVENT_POWER_BUTTON].status_register_id, 1,
-                             ACPI_MTX_DO_NOT_LOCK);
+                             [ACPI_EVENT_POWER_BUTTON].status_register_id, 1);
 
        arg.integer.value = ACPI_SST_WORKING;
        status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _SST failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
        }
 
        return_ACPI_STATUS(status);
 }
+
+ACPI_EXPORT_SYMBOL(acpi_leave_sleep_state)