diff options
Diffstat (limited to 'drivers/acpi/acpica/hwxfsleep.c')
-rw-r--r-- | drivers/acpi/acpica/hwxfsleep.c | 74 |
1 files changed, 62 insertions, 12 deletions
diff --git a/drivers/acpi/acpica/hwxfsleep.c b/drivers/acpi/acpica/hwxfsleep.c index 25cd9783b640..52dfd0d050fa 100644 --- a/drivers/acpi/acpica/hwxfsleep.c +++ b/drivers/acpi/acpica/hwxfsleep.c @@ -50,6 +50,13 @@ 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) /******************************************************************************* |