^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Name: hwxfsleep.c - ACPI Hardware Sleep/Wake External Interfaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define EXPORT_ACPI_INTERFACES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define _COMPONENT ACPI_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ACPI_MODULE_NAME("hwxfsleep")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #if (!ACPI_REDUCED_HARDWARE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) acpi_physical_address physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) acpi_physical_address physical_address64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * These functions are removed for the ACPI_REDUCED_HARDWARE case:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * acpi_set_firmware_waking_vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * acpi_enter_sleep_state_s4bios
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #if (!ACPI_REDUCED_HARDWARE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * FUNCTION: acpi_hw_set_firmware_waking_vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * PARAMETERS: facs - Pointer to FACS table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * physical_address - 32-bit physical address of ACPI real mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * physical_address64 - 64-bit physical address of ACPI protected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * mode entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) acpi_physical_address physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) acpi_physical_address physical_address64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * According to the ACPI specification 2.0c and later, the 64-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * waking vector should be cleared and the 32-bit waking vector should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * be used, unless we want the wake-up code to be called by the BIOS in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * Protected Mode. Some systems (for example HP dv5-1004nr) are known
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * to fail to resume if the 64-bit vector is used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* Set the 32-bit vector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) facs->firmware_waking_vector = (u32)physical_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (facs->length > 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (facs->version >= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Set the 64-bit vector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) facs->xfirmware_waking_vector = physical_address64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) /* Clear the 64-bit vector if it exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) facs->xfirmware_waking_vector = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * FUNCTION: acpi_set_firmware_waking_vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * physical_address64 - 64-bit physical address of ACPI protected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * mode entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) acpi_set_firmware_waking_vector(acpi_physical_address physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) acpi_physical_address physical_address64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) if (acpi_gbl_FACS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) (void)acpi_hw_set_firmware_waking_vector(acpi_gbl_FACS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) physical_address64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * FUNCTION: acpi_enter_sleep_state_s4bios
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * PARAMETERS: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * DESCRIPTION: Perform a S4 bios request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) acpi_status acpi_enter_sleep_state_s4bios(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u32 in_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_s4bios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* Clear the wake status bit (PM1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) status = acpi_hw_clear_acpi_status();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * 1) Disable all GPEs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * 2) Enable all wakeup GPEs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) status = acpi_hw_disable_all_gpes();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) acpi_gbl_system_awake_and_running = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) status = acpi_hw_enable_all_wakeup_gpes();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) (u32)acpi_gbl_FADT.s4_bios_request, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) acpi_os_stall(ACPI_USEC_PER_MSEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) acpi_read_bit_register(ACPI_BITREG_WAKE_STATUS, &in_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) } while (!in_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #endif /* !ACPI_REDUCED_HARDWARE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * FUNCTION: acpi_enter_sleep_state_prep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * PARAMETERS: sleep_state - Which sleep state to enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * DESCRIPTION: Prepare to enter a system sleep state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * This function must execute with interrupts enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * We break sleeping into 2 stages so that OSPM can handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * various OS-specific tasks between the two steps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct acpi_object_list arg_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) union acpi_object arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) u32 sst_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_prep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) status = acpi_get_sleep_type_data(sleep_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) &acpi_gbl_sleep_type_a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) &acpi_gbl_sleep_type_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) status = acpi_get_sleep_type_data(ACPI_STATE_S0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) &acpi_gbl_sleep_type_a_s0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) &acpi_gbl_sleep_type_b_s0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) acpi_gbl_sleep_type_a_s0 = ACPI_SLEEP_TYPE_INVALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) /* Execute the _PTS method (Prepare To Sleep) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) arg_list.count = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) arg_list.pointer = &arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) arg.type = ACPI_TYPE_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) arg.integer.value = sleep_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) acpi_evaluate_object(NULL, METHOD_PATHNAME__PTS, &arg_list, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* Setup the argument to the _SST method (System STatus) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) switch (sleep_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) case ACPI_STATE_S0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) sst_value = ACPI_SST_WORKING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) case ACPI_STATE_S1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) case ACPI_STATE_S2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) case ACPI_STATE_S3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) sst_value = ACPI_SST_SLEEPING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) case ACPI_STATE_S4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) sst_value = ACPI_SST_SLEEP_CONTEXT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) sst_value = ACPI_SST_INDICATOR_OFF; /* Default is off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) * Set the system indicators to show the desired sleep state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * _SST is an optional method (return no error if not found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) acpi_hw_execute_sleep_method(METHOD_PATHNAME__SST, sst_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) * FUNCTION: acpi_enter_sleep_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * PARAMETERS: sleep_state - Which sleep state to enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * DESCRIPTION: Enter a system sleep state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) acpi_status acpi_enter_sleep_state(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) ACPI_FUNCTION_TRACE(acpi_enter_sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) ACPI_ERROR((AE_INFO, "Sleep values out of range: A=0x%X B=0x%X",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #if !ACPI_REDUCED_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) if (!acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) status = acpi_hw_legacy_sleep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) status = acpi_hw_extended_sleep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) * FUNCTION: acpi_leave_sleep_state_prep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) * PARAMETERS: sleep_state - Which sleep state we are exiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * sleep. Called with interrupts DISABLED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) * We break wake/resume into 2 stages so that OSPM can handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) * various OS-specific tasks between the two steps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) ACPI_FUNCTION_TRACE(acpi_leave_sleep_state_prep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #if !ACPI_REDUCED_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if (!acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) status = acpi_hw_legacy_wake_prep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) status = acpi_hw_extended_wake_prep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ACPI_EXPORT_SYMBOL(acpi_leave_sleep_state_prep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) * FUNCTION: acpi_leave_sleep_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) * PARAMETERS: sleep_state - Which sleep state we are exiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) * Called with interrupts ENABLED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) acpi_status acpi_leave_sleep_state(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) ACPI_FUNCTION_TRACE(acpi_leave_sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #if !ACPI_REDUCED_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) if (!acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) status = acpi_hw_legacy_wake(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) status = acpi_hw_extended_wake(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) ACPI_EXPORT_SYMBOL(acpi_leave_sleep_state)