ACPICA: Hardware: Enable firmware waking vector for both 32-bit and 64-bit FACS
[deliverable/linux.git] / drivers / acpi / acpica / hwxfsleep.c
index 25cd9783b640aa3dd3ba5f90f9d761946d9539dd..52dfd0d050fa30b09077446e55cd7b27f054452d 100644 (file)
 ACPI_MODULE_NAME("hwxfsleep")
 
 /* Local prototypes */
+#if (!ACPI_REDUCED_HARDWARE)
+static acpi_status
+acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
+                                   acpi_physical_address physical_address,
+                                   acpi_physical_address physical_address64);
+#endif
+
 static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id);
 
 /*
@@ -81,9 +88,10 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
 #if (!ACPI_REDUCED_HARDWARE)
 /*******************************************************************************
  *
- * FUNCTION:    acpi_set_firmware_waking_vectors
+ * FUNCTION:    acpi_hw_set_firmware_waking_vectors
  *
- * PARAMETERS:  physical_address    - 32-bit physical address of ACPI real mode
+ * PARAMETERS:  facs                - Pointer to FACS table
+ *              physical_address    - 32-bit physical address of ACPI real mode
  *                                    entry point.
  *              physical_address64  - 64-bit physical address of ACPI protected
  *                                    mode entry point.
@@ -94,11 +102,12 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
  *
  ******************************************************************************/
 
-acpi_status
-acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
-                                acpi_physical_address physical_address64)
+static acpi_status
+acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
+                                   acpi_physical_address physical_address,
+                                   acpi_physical_address physical_address64)
 {
-       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vectors);
+       ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vectors);
 
 
        /*
@@ -111,25 +120,66 @@ acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
 
        /* Set the 32-bit vector */
 
-       acpi_gbl_FACS->firmware_waking_vector = (u32)physical_address;
+       facs->firmware_waking_vector = (u32)physical_address;
 
-       if (acpi_gbl_FACS->length > 32) {
-               if (acpi_gbl_FACS->version >= 1) {
+       if (facs->length > 32) {
+               if (facs->version >= 1) {
 
                        /* Set the 64-bit vector */
 
-                       acpi_gbl_FACS->xfirmware_waking_vector =
-                           physical_address64;
+                       facs->xfirmware_waking_vector = physical_address64;
                } else {
                        /* Clear the 64-bit vector if it exists */
 
-                       acpi_gbl_FACS->xfirmware_waking_vector = 0;
+                       facs->xfirmware_waking_vector = 0;
                }
        }
 
        return_ACPI_STATUS(AE_OK);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_set_firmware_waking_vectors
+ *
+ * PARAMETERS:  physical_address    - 32-bit physical address of ACPI real mode
+ *                                    entry point.
+ *              physical_address64  - 64-bit physical address of ACPI protected
+ *                                    mode entry point.
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
+                                acpi_physical_address physical_address64)
+{
+
+       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vectors);
+
+       /* If Hardware Reduced flag is set, there is no FACS */
+
+       if (acpi_gbl_reduced_hardware) {
+               return_ACPI_STATUS (AE_OK);
+       }
+
+       if (acpi_gbl_facs32) {
+               (void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_facs32,
+                                                         physical_address,
+                                                         physical_address64);
+       }
+       if (acpi_gbl_facs64) {
+               (void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_facs64,
+                                                         physical_address,
+                                                         physical_address64);
+       }
+
+       return_ACPI_STATUS(AE_OK);
+}
+
 ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vectors)
 
 /*******************************************************************************
This page took 0.029799 seconds and 5 git commands to generate.