|
@@ -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)
|