]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/acpi/acpica/hwxfsleep.c
ACPICA: Hardware: Enable 64-bit firmware waking vector for selected FACS
[karo-tx-linux.git] / drivers / acpi / acpica / hwxfsleep.c
index 82e310b94ae4681ca2923336436f0edea3bafec3..25cd9783b640aa3dd3ba5f90f9d761946d9539dd 100644 (file)
@@ -72,6 +72,7 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
 
 /*
  * These functions are removed for the ACPI_REDUCED_HARDWARE case:
+ *      acpi_set_firmware_waking_vectors
  *      acpi_set_firmware_waking_vector
  *      acpi_set_firmware_waking_vector64
  *      acpi_enter_sleep_state_s4bios
@@ -80,20 +81,24 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
 #if (!ACPI_REDUCED_HARDWARE)
 /*******************************************************************************
  *
- * FUNCTION:    acpi_set_firmware_waking_vector
+ * 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 32-bit firmware_waking_vector field of the FACS
+ * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
  *
  ******************************************************************************/
 
-acpi_status acpi_set_firmware_waking_vector(u32 physical_address)
+acpi_status
+acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
+                                acpi_physical_address physical_address64)
 {
-       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
+       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vectors);
 
 
        /*
@@ -106,17 +111,51 @@ acpi_status acpi_set_firmware_waking_vector(u32 physical_address)
 
        /* Set the 32-bit vector */
 
-       acpi_gbl_FACS->firmware_waking_vector = physical_address;
+       acpi_gbl_FACS->firmware_waking_vector = (u32)physical_address;
 
-       /* Clear the 64-bit vector if it exists */
+       if (acpi_gbl_FACS->length > 32) {
+               if (acpi_gbl_FACS->version >= 1) {
 
-       if ((acpi_gbl_FACS->length > 32) && (acpi_gbl_FACS->version >= 1)) {
-               acpi_gbl_FACS->xfirmware_waking_vector = 0;
+                       /* Set the 64-bit vector */
+
+                       acpi_gbl_FACS->xfirmware_waking_vector =
+                           physical_address64;
+               } else {
+                       /* Clear the 64-bit vector if it exists */
+
+                       acpi_gbl_FACS->xfirmware_waking_vector = 0;
+               }
        }
 
        return_ACPI_STATUS(AE_OK);
 }
 
+ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vectors)
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_set_firmware_waking_vector
+ *
+ * PARAMETERS:  physical_address    - 32-bit physical address of ACPI real mode
+ *                                    entry point.
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Sets the 32-bit firmware_waking_vector field of the FACS
+ *
+ ******************************************************************************/
+acpi_status acpi_set_firmware_waking_vector(u32 physical_address)
+{
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
+
+       status = acpi_set_firmware_waking_vectors((acpi_physical_address)
+                                                 physical_address, 0);
+
+       return_ACPI_STATUS(status);
+}
+
 ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
 
 #if ACPI_MACHINE_WIDTH == 64
@@ -136,19 +175,15 @@ ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
  ******************************************************************************/
 acpi_status acpi_set_firmware_waking_vector64(u64 physical_address)
 {
-       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
-
-       /* Determine if the 64-bit vector actually exists */
+       acpi_status status;
 
-       if ((acpi_gbl_FACS->length <= 32) || (acpi_gbl_FACS->version < 1)) {
-               return_ACPI_STATUS(AE_NOT_EXIST);
-       }
+       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
 
-       /* Clear 32-bit vector, set the 64-bit X_ vector */
+       status = acpi_set_firmware_waking_vectors(0,
+                                                 (acpi_physical_address)
+                                                 physical_address);
 
-       acpi_gbl_FACS->firmware_waking_vector = 0;
-       acpi_gbl_FACS->xfirmware_waking_vector = physical_address;
-       return_ACPI_STATUS(AE_OK);
+       return_ACPI_STATUS(status);
 }
 
 ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64)