root/drivers/acpi/sleep.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. acpi_sleep_tts_switch
  2. tts_notify_reboot
  3. acpi_sleep_prepare
  4. acpi_sleep_state_supported
  5. acpi_target_system_state
  6. acpi_nvs_nosave
  7. acpi_nvs_nosave_s3
  8. init_nvs_save_s3
  9. acpi_old_suspend_ordering
  10. init_old_suspend_ordering
  11. init_nvs_nosave
  12. init_default_s3
  13. acpi_sleep_no_blacklist
  14. acpi_sleep_dmi_check
  15. acpi_pm_freeze
  16. acpi_pm_pre_suspend
  17. __acpi_pm_prepare
  18. acpi_pm_prepare
  19. acpi_pm_finish
  20. acpi_pm_start
  21. acpi_pm_end
  22. acpi_sleep_dmi_check
  23. acpi_suspend_begin
  24. acpi_suspend_enter
  25. acpi_suspend_state_valid
  26. acpi_suspend_begin_old
  27. lpi_device_get_constraints
  28. lpi_check_constraints
  29. acpi_sleep_run_lps0_dsm
  30. lps0_device_attach
  31. acpi_s2idle_begin
  32. acpi_s2idle_prepare
  33. acpi_s2idle_prepare_late
  34. acpi_s2idle_wake
  35. acpi_s2idle_restore_early
  36. acpi_s2idle_restore
  37. acpi_s2idle_end
  38. acpi_sleep_suspend_setup
  39. acpi_sleep_suspend_setup
  40. acpi_s2idle_wakeup
  41. acpi_save_bm_rld
  42. acpi_restore_bm_rld
  43. acpi_sleep_syscore_init
  44. acpi_sleep_syscore_init
  45. acpi_no_s4_hw_signature
  46. acpi_hibernation_begin
  47. acpi_hibernation_enter
  48. acpi_hibernation_leave
  49. acpi_pm_thaw
  50. acpi_hibernation_begin_old
  51. acpi_sleep_hibernate_setup
  52. acpi_sleep_hibernate_setup
  53. acpi_power_off_prepare
  54. acpi_power_off
  55. acpi_sleep_init

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * sleep.c - ACPI sleep support.
   4  *
   5  * Copyright (c) 2005 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
   6  * Copyright (c) 2004 David Shaohua Li <shaohua.li@intel.com>
   7  * Copyright (c) 2000-2003 Patrick Mochel
   8  * Copyright (c) 2003 Open Source Development Lab
   9  */
  10 
  11 #include <linux/delay.h>
  12 #include <linux/irq.h>
  13 #include <linux/dmi.h>
  14 #include <linux/device.h>
  15 #include <linux/interrupt.h>
  16 #include <linux/suspend.h>
  17 #include <linux/reboot.h>
  18 #include <linux/acpi.h>
  19 #include <linux/module.h>
  20 #include <linux/syscore_ops.h>
  21 #include <asm/io.h>
  22 #include <trace/events/power.h>
  23 
  24 #include "internal.h"
  25 #include "sleep.h"
  26 
  27 /*
  28  * Some HW-full platforms do not have _S5, so they may need
  29  * to leverage efi power off for a shutdown.
  30  */
  31 bool acpi_no_s5;
  32 static u8 sleep_states[ACPI_S_STATE_COUNT];
  33 
  34 static void acpi_sleep_tts_switch(u32 acpi_state)
  35 {
  36         acpi_status status;
  37 
  38         status = acpi_execute_simple_method(NULL, "\\_TTS", acpi_state);
  39         if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
  40                 /*
  41                  * OS can't evaluate the _TTS object correctly. Some warning
  42                  * message will be printed. But it won't break anything.
  43                  */
  44                 printk(KERN_NOTICE "Failure in evaluating _TTS object\n");
  45         }
  46 }
  47 
  48 static int tts_notify_reboot(struct notifier_block *this,
  49                         unsigned long code, void *x)
  50 {
  51         acpi_sleep_tts_switch(ACPI_STATE_S5);
  52         return NOTIFY_DONE;
  53 }
  54 
  55 static struct notifier_block tts_notifier = {
  56         .notifier_call  = tts_notify_reboot,
  57         .next           = NULL,
  58         .priority       = 0,
  59 };
  60 
  61 static int acpi_sleep_prepare(u32 acpi_state)
  62 {
  63 #ifdef CONFIG_ACPI_SLEEP
  64         /* do we have a wakeup address for S2 and S3? */
  65         if (acpi_state == ACPI_STATE_S3) {
  66                 if (!acpi_wakeup_address)
  67                         return -EFAULT;
  68                 acpi_set_waking_vector(acpi_wakeup_address);
  69 
  70         }
  71         ACPI_FLUSH_CPU_CACHE();
  72 #endif
  73         printk(KERN_INFO PREFIX "Preparing to enter system sleep state S%d\n",
  74                 acpi_state);
  75         acpi_enable_wakeup_devices(acpi_state);
  76         acpi_enter_sleep_state_prep(acpi_state);
  77         return 0;
  78 }
  79 
  80 bool acpi_sleep_state_supported(u8 sleep_state)
  81 {
  82         acpi_status status;
  83         u8 type_a, type_b;
  84 
  85         status = acpi_get_sleep_type_data(sleep_state, &type_a, &type_b);
  86         return ACPI_SUCCESS(status) && (!acpi_gbl_reduced_hardware
  87                 || (acpi_gbl_FADT.sleep_control.address
  88                         && acpi_gbl_FADT.sleep_status.address));
  89 }
  90 
  91 #ifdef CONFIG_ACPI_SLEEP
  92 static bool sleep_no_lps0 __read_mostly;
  93 module_param(sleep_no_lps0, bool, 0644);
  94 MODULE_PARM_DESC(sleep_no_lps0, "Do not use the special LPS0 device interface");
  95 
  96 static u32 acpi_target_sleep_state = ACPI_STATE_S0;
  97 
  98 u32 acpi_target_system_state(void)
  99 {
 100         return acpi_target_sleep_state;
 101 }
 102 EXPORT_SYMBOL_GPL(acpi_target_system_state);
 103 
 104 static bool pwr_btn_event_pending;
 105 
 106 /*
 107  * The ACPI specification wants us to save NVS memory regions during hibernation
 108  * and to restore them during the subsequent resume.  Windows does that also for
 109  * suspend to RAM.  However, it is known that this mechanism does not work on
 110  * all machines, so we allow the user to disable it with the help of the
 111  * 'acpi_sleep=nonvs' kernel command line option.
 112  */
 113 static bool nvs_nosave;
 114 
 115 void __init acpi_nvs_nosave(void)
 116 {
 117         nvs_nosave = true;
 118 }
 119 
 120 /*
 121  * The ACPI specification wants us to save NVS memory regions during hibernation
 122  * but says nothing about saving NVS during S3.  Not all versions of Windows
 123  * save NVS on S3 suspend either, and it is clear that not all systems need
 124  * NVS to be saved at S3 time.  To improve suspend/resume time, allow the
 125  * user to disable saving NVS on S3 if their system does not require it, but
 126  * continue to save/restore NVS for S4 as specified.
 127  */
 128 static bool nvs_nosave_s3;
 129 
 130 void __init acpi_nvs_nosave_s3(void)
 131 {
 132         nvs_nosave_s3 = true;
 133 }
 134 
 135 static int __init init_nvs_save_s3(const struct dmi_system_id *d)
 136 {
 137         nvs_nosave_s3 = false;
 138         return 0;
 139 }
 140 
 141 /*
 142  * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the
 143  * user to request that behavior by using the 'acpi_old_suspend_ordering'
 144  * kernel command line option that causes the following variable to be set.
 145  */
 146 static bool old_suspend_ordering;
 147 
 148 void __init acpi_old_suspend_ordering(void)
 149 {
 150         old_suspend_ordering = true;
 151 }
 152 
 153 static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
 154 {
 155         acpi_old_suspend_ordering();
 156         return 0;
 157 }
 158 
 159 static int __init init_nvs_nosave(const struct dmi_system_id *d)
 160 {
 161         acpi_nvs_nosave();
 162         return 0;
 163 }
 164 
 165 static bool acpi_sleep_default_s3;
 166 
 167 static int __init init_default_s3(const struct dmi_system_id *d)
 168 {
 169         acpi_sleep_default_s3 = true;
 170         return 0;
 171 }
 172 
 173 static const struct dmi_system_id acpisleep_dmi_table[] __initconst = {
 174         {
 175         .callback = init_old_suspend_ordering,
 176         .ident = "Abit KN9 (nForce4 variant)",
 177         .matches = {
 178                 DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"),
 179                 DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"),
 180                 },
 181         },
 182         {
 183         .callback = init_old_suspend_ordering,
 184         .ident = "HP xw4600 Workstation",
 185         .matches = {
 186                 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
 187                 DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
 188                 },
 189         },
 190         {
 191         .callback = init_old_suspend_ordering,
 192         .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)",
 193         .matches = {
 194                 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."),
 195                 DMI_MATCH(DMI_BOARD_NAME, "M2N8L"),
 196                 },
 197         },
 198         {
 199         .callback = init_old_suspend_ordering,
 200         .ident = "Panasonic CF51-2L",
 201         .matches = {
 202                 DMI_MATCH(DMI_BOARD_VENDOR,
 203                                 "Matsushita Electric Industrial Co.,Ltd."),
 204                 DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"),
 205                 },
 206         },
 207         {
 208         .callback = init_nvs_nosave,
 209         .ident = "Sony Vaio VGN-FW41E_H",
 210         .matches = {
 211                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 212                 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW41E_H"),
 213                 },
 214         },
 215         {
 216         .callback = init_nvs_nosave,
 217         .ident = "Sony Vaio VGN-FW21E",
 218         .matches = {
 219                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 220                 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW21E"),
 221                 },
 222         },
 223         {
 224         .callback = init_nvs_nosave,
 225         .ident = "Sony Vaio VGN-FW21M",
 226         .matches = {
 227                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 228                 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW21M"),
 229                 },
 230         },
 231         {
 232         .callback = init_nvs_nosave,
 233         .ident = "Sony Vaio VPCEB17FX",
 234         .matches = {
 235                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 236                 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB17FX"),
 237                 },
 238         },
 239         {
 240         .callback = init_nvs_nosave,
 241         .ident = "Sony Vaio VGN-SR11M",
 242         .matches = {
 243                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 244                 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR11M"),
 245                 },
 246         },
 247         {
 248         .callback = init_nvs_nosave,
 249         .ident = "Everex StepNote Series",
 250         .matches = {
 251                 DMI_MATCH(DMI_SYS_VENDOR, "Everex Systems, Inc."),
 252                 DMI_MATCH(DMI_PRODUCT_NAME, "Everex StepNote Series"),
 253                 },
 254         },
 255         {
 256         .callback = init_nvs_nosave,
 257         .ident = "Sony Vaio VPCEB1Z1E",
 258         .matches = {
 259                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 260                 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1Z1E"),
 261                 },
 262         },
 263         {
 264         .callback = init_nvs_nosave,
 265         .ident = "Sony Vaio VGN-NW130D",
 266         .matches = {
 267                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 268                 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NW130D"),
 269                 },
 270         },
 271         {
 272         .callback = init_nvs_nosave,
 273         .ident = "Sony Vaio VPCCW29FX",
 274         .matches = {
 275                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 276                 DMI_MATCH(DMI_PRODUCT_NAME, "VPCCW29FX"),
 277                 },
 278         },
 279         {
 280         .callback = init_nvs_nosave,
 281         .ident = "Averatec AV1020-ED2",
 282         .matches = {
 283                 DMI_MATCH(DMI_SYS_VENDOR, "AVERATEC"),
 284                 DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"),
 285                 },
 286         },
 287         {
 288         .callback = init_old_suspend_ordering,
 289         .ident = "Asus A8N-SLI DELUXE",
 290         .matches = {
 291                 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
 292                 DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI DELUXE"),
 293                 },
 294         },
 295         {
 296         .callback = init_old_suspend_ordering,
 297         .ident = "Asus A8N-SLI Premium",
 298         .matches = {
 299                 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
 300                 DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI Premium"),
 301                 },
 302         },
 303         {
 304         .callback = init_nvs_nosave,
 305         .ident = "Sony Vaio VGN-SR26GN_P",
 306         .matches = {
 307                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 308                 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR26GN_P"),
 309                 },
 310         },
 311         {
 312         .callback = init_nvs_nosave,
 313         .ident = "Sony Vaio VPCEB1S1E",
 314         .matches = {
 315                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 316                 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1S1E"),
 317                 },
 318         },
 319         {
 320         .callback = init_nvs_nosave,
 321         .ident = "Sony Vaio VGN-FW520F",
 322         .matches = {
 323                 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
 324                 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW520F"),
 325                 },
 326         },
 327         {
 328         .callback = init_nvs_nosave,
 329         .ident = "Asus K54C",
 330         .matches = {
 331                 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
 332                 DMI_MATCH(DMI_PRODUCT_NAME, "K54C"),
 333                 },
 334         },
 335         {
 336         .callback = init_nvs_nosave,
 337         .ident = "Asus K54HR",
 338         .matches = {
 339                 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
 340                 DMI_MATCH(DMI_PRODUCT_NAME, "K54HR"),
 341                 },
 342         },
 343         {
 344         .callback = init_nvs_save_s3,
 345         .ident = "Asus 1025C",
 346         .matches = {
 347                 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
 348                 DMI_MATCH(DMI_PRODUCT_NAME, "1025C"),
 349                 },
 350         },
 351         /*
 352          * https://bugzilla.kernel.org/show_bug.cgi?id=189431
 353          * Lenovo G50-45 is a platform later than 2012, but needs nvs memory
 354          * saving during S3.
 355          */
 356         {
 357         .callback = init_nvs_save_s3,
 358         .ident = "Lenovo G50-45",
 359         .matches = {
 360                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
 361                 DMI_MATCH(DMI_PRODUCT_NAME, "80E3"),
 362                 },
 363         },
 364         /*
 365          * ThinkPad X1 Tablet(2016) cannot do suspend-to-idle using
 366          * the Low Power S0 Idle firmware interface (see
 367          * https://bugzilla.kernel.org/show_bug.cgi?id=199057).
 368          */
 369         {
 370         .callback = init_default_s3,
 371         .ident = "ThinkPad X1 Tablet(2016)",
 372         .matches = {
 373                 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
 374                 DMI_MATCH(DMI_PRODUCT_NAME, "20GGA00L00"),
 375                 },
 376         },
 377         {},
 378 };
 379 
 380 static bool ignore_blacklist;
 381 
 382 void __init acpi_sleep_no_blacklist(void)
 383 {
 384         ignore_blacklist = true;
 385 }
 386 
 387 static void __init acpi_sleep_dmi_check(void)
 388 {
 389         if (ignore_blacklist)
 390                 return;
 391 
 392         if (dmi_get_bios_year() >= 2012)
 393                 acpi_nvs_nosave_s3();
 394 
 395         dmi_check_system(acpisleep_dmi_table);
 396 }
 397 
 398 /**
 399  * acpi_pm_freeze - Disable the GPEs and suspend EC transactions.
 400  */
 401 static int acpi_pm_freeze(void)
 402 {
 403         acpi_disable_all_gpes();
 404         acpi_os_wait_events_complete();
 405         acpi_ec_block_transactions();
 406         return 0;
 407 }
 408 
 409 /**
 410  * acpi_pre_suspend - Enable wakeup devices, "freeze" EC and save NVS.
 411  */
 412 static int acpi_pm_pre_suspend(void)
 413 {
 414         acpi_pm_freeze();
 415         return suspend_nvs_save();
 416 }
 417 
 418 /**
 419  *      __acpi_pm_prepare - Prepare the platform to enter the target state.
 420  *
 421  *      If necessary, set the firmware waking vector and do arch-specific
 422  *      nastiness to get the wakeup code to the waking vector.
 423  */
 424 static int __acpi_pm_prepare(void)
 425 {
 426         int error = acpi_sleep_prepare(acpi_target_sleep_state);
 427         if (error)
 428                 acpi_target_sleep_state = ACPI_STATE_S0;
 429 
 430         return error;
 431 }
 432 
 433 /**
 434  *      acpi_pm_prepare - Prepare the platform to enter the target sleep
 435  *              state and disable the GPEs.
 436  */
 437 static int acpi_pm_prepare(void)
 438 {
 439         int error = __acpi_pm_prepare();
 440         if (!error)
 441                 error = acpi_pm_pre_suspend();
 442 
 443         return error;
 444 }
 445 
 446 /**
 447  *      acpi_pm_finish - Instruct the platform to leave a sleep state.
 448  *
 449  *      This is called after we wake back up (or if entering the sleep state
 450  *      failed).
 451  */
 452 static void acpi_pm_finish(void)
 453 {
 454         struct acpi_device *pwr_btn_adev;
 455         u32 acpi_state = acpi_target_sleep_state;
 456 
 457         acpi_ec_unblock_transactions();
 458         suspend_nvs_free();
 459 
 460         if (acpi_state == ACPI_STATE_S0)
 461                 return;
 462 
 463         printk(KERN_INFO PREFIX "Waking up from system sleep state S%d\n",
 464                 acpi_state);
 465         acpi_disable_wakeup_devices(acpi_state);
 466         acpi_leave_sleep_state(acpi_state);
 467 
 468         /* reset firmware waking vector */
 469         acpi_set_waking_vector(0);
 470 
 471         acpi_target_sleep_state = ACPI_STATE_S0;
 472 
 473         acpi_resume_power_resources();
 474 
 475         /* If we were woken with the fixed power button, provide a small
 476          * hint to userspace in the form of a wakeup event on the fixed power
 477          * button device (if it can be found).
 478          *
 479          * We delay the event generation til now, as the PM layer requires
 480          * timekeeping to be running before we generate events. */
 481         if (!pwr_btn_event_pending)
 482                 return;
 483 
 484         pwr_btn_event_pending = false;
 485         pwr_btn_adev = acpi_dev_get_first_match_dev(ACPI_BUTTON_HID_POWERF,
 486                                                     NULL, -1);
 487         if (pwr_btn_adev) {
 488                 pm_wakeup_event(&pwr_btn_adev->dev, 0);
 489                 acpi_dev_put(pwr_btn_adev);
 490         }
 491 }
 492 
 493 /**
 494  * acpi_pm_start - Start system PM transition.
 495  */
 496 static void acpi_pm_start(u32 acpi_state)
 497 {
 498         acpi_target_sleep_state = acpi_state;
 499         acpi_sleep_tts_switch(acpi_target_sleep_state);
 500         acpi_scan_lock_acquire();
 501 }
 502 
 503 /**
 504  * acpi_pm_end - Finish up system PM transition.
 505  */
 506 static void acpi_pm_end(void)
 507 {
 508         acpi_turn_off_unused_power_resources();
 509         acpi_scan_lock_release();
 510         /*
 511          * This is necessary in case acpi_pm_finish() is not called during a
 512          * failing transition to a sleep state.
 513          */
 514         acpi_target_sleep_state = ACPI_STATE_S0;
 515         acpi_sleep_tts_switch(acpi_target_sleep_state);
 516 }
 517 #else /* !CONFIG_ACPI_SLEEP */
 518 #define sleep_no_lps0   (1)
 519 #define acpi_target_sleep_state ACPI_STATE_S0
 520 #define acpi_sleep_default_s3   (1)
 521 static inline void acpi_sleep_dmi_check(void) {}
 522 #endif /* CONFIG_ACPI_SLEEP */
 523 
 524 #ifdef CONFIG_SUSPEND
 525 static u32 acpi_suspend_states[] = {
 526         [PM_SUSPEND_ON] = ACPI_STATE_S0,
 527         [PM_SUSPEND_STANDBY] = ACPI_STATE_S1,
 528         [PM_SUSPEND_MEM] = ACPI_STATE_S3,
 529         [PM_SUSPEND_MAX] = ACPI_STATE_S5
 530 };
 531 
 532 /**
 533  *      acpi_suspend_begin - Set the target system sleep state to the state
 534  *              associated with given @pm_state, if supported.
 535  */
 536 static int acpi_suspend_begin(suspend_state_t pm_state)
 537 {
 538         u32 acpi_state = acpi_suspend_states[pm_state];
 539         int error;
 540 
 541         error = (nvs_nosave || nvs_nosave_s3) ? 0 : suspend_nvs_alloc();
 542         if (error)
 543                 return error;
 544 
 545         if (!sleep_states[acpi_state]) {
 546                 pr_err("ACPI does not support sleep state S%u\n", acpi_state);
 547                 return -ENOSYS;
 548         }
 549         if (acpi_state > ACPI_STATE_S1)
 550                 pm_set_suspend_via_firmware();
 551 
 552         acpi_pm_start(acpi_state);
 553         return 0;
 554 }
 555 
 556 /**
 557  *      acpi_suspend_enter - Actually enter a sleep state.
 558  *      @pm_state: ignored
 559  *
 560  *      Flush caches and go to sleep. For STR we have to call arch-specific
 561  *      assembly, which in turn call acpi_enter_sleep_state().
 562  *      It's unfortunate, but it works. Please fix if you're feeling frisky.
 563  */
 564 static int acpi_suspend_enter(suspend_state_t pm_state)
 565 {
 566         acpi_status status = AE_OK;
 567         u32 acpi_state = acpi_target_sleep_state;
 568         int error;
 569 
 570         ACPI_FLUSH_CPU_CACHE();
 571 
 572         trace_suspend_resume(TPS("acpi_suspend"), acpi_state, true);
 573         switch (acpi_state) {
 574         case ACPI_STATE_S1:
 575                 barrier();
 576                 status = acpi_enter_sleep_state(acpi_state);
 577                 break;
 578 
 579         case ACPI_STATE_S3:
 580                 if (!acpi_suspend_lowlevel)
 581                         return -ENOSYS;
 582                 error = acpi_suspend_lowlevel();
 583                 if (error)
 584                         return error;
 585                 pr_info(PREFIX "Low-level resume complete\n");
 586                 pm_set_resume_via_firmware();
 587                 break;
 588         }
 589         trace_suspend_resume(TPS("acpi_suspend"), acpi_state, false);
 590 
 591         /* This violates the spec but is required for bug compatibility. */
 592         acpi_write_bit_register(ACPI_BITREG_SCI_ENABLE, 1);
 593 
 594         /* Reprogram control registers */
 595         acpi_leave_sleep_state_prep(acpi_state);
 596 
 597         /* ACPI 3.0 specs (P62) says that it's the responsibility
 598          * of the OSPM to clear the status bit [ implying that the
 599          * POWER_BUTTON event should not reach userspace ]
 600          *
 601          * However, we do generate a small hint for userspace in the form of
 602          * a wakeup event. We flag this condition for now and generate the
 603          * event later, as we're currently too early in resume to be able to
 604          * generate wakeup events.
 605          */
 606         if (ACPI_SUCCESS(status) && (acpi_state == ACPI_STATE_S3)) {
 607                 acpi_event_status pwr_btn_status = ACPI_EVENT_FLAG_DISABLED;
 608 
 609                 acpi_get_event_status(ACPI_EVENT_POWER_BUTTON, &pwr_btn_status);
 610 
 611                 if (pwr_btn_status & ACPI_EVENT_FLAG_STATUS_SET) {
 612                         acpi_clear_event(ACPI_EVENT_POWER_BUTTON);
 613                         /* Flag for later */
 614                         pwr_btn_event_pending = true;
 615                 }
 616         }
 617 
 618         /*
 619          * Disable and clear GPE status before interrupt is enabled. Some GPEs
 620          * (like wakeup GPE) haven't handler, this can avoid such GPE misfire.
 621          * acpi_leave_sleep_state will reenable specific GPEs later
 622          */
 623         acpi_disable_all_gpes();
 624         /* Allow EC transactions to happen. */
 625         acpi_ec_unblock_transactions();
 626 
 627         suspend_nvs_restore();
 628 
 629         return ACPI_SUCCESS(status) ? 0 : -EFAULT;
 630 }
 631 
 632 static int acpi_suspend_state_valid(suspend_state_t pm_state)
 633 {
 634         u32 acpi_state;
 635 
 636         switch (pm_state) {
 637         case PM_SUSPEND_ON:
 638         case PM_SUSPEND_STANDBY:
 639         case PM_SUSPEND_MEM:
 640                 acpi_state = acpi_suspend_states[pm_state];
 641 
 642                 return sleep_states[acpi_state];
 643         default:
 644                 return 0;
 645         }
 646 }
 647 
 648 static const struct platform_suspend_ops acpi_suspend_ops = {
 649         .valid = acpi_suspend_state_valid,
 650         .begin = acpi_suspend_begin,
 651         .prepare_late = acpi_pm_prepare,
 652         .enter = acpi_suspend_enter,
 653         .wake = acpi_pm_finish,
 654         .end = acpi_pm_end,
 655 };
 656 
 657 /**
 658  *      acpi_suspend_begin_old - Set the target system sleep state to the
 659  *              state associated with given @pm_state, if supported, and
 660  *              execute the _PTS control method.  This function is used if the
 661  *              pre-ACPI 2.0 suspend ordering has been requested.
 662  */
 663 static int acpi_suspend_begin_old(suspend_state_t pm_state)
 664 {
 665         int error = acpi_suspend_begin(pm_state);
 666         if (!error)
 667                 error = __acpi_pm_prepare();
 668 
 669         return error;
 670 }
 671 
 672 /*
 673  * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has
 674  * been requested.
 675  */
 676 static const struct platform_suspend_ops acpi_suspend_ops_old = {
 677         .valid = acpi_suspend_state_valid,
 678         .begin = acpi_suspend_begin_old,
 679         .prepare_late = acpi_pm_pre_suspend,
 680         .enter = acpi_suspend_enter,
 681         .wake = acpi_pm_finish,
 682         .end = acpi_pm_end,
 683         .recover = acpi_pm_finish,
 684 };
 685 
 686 static bool s2idle_wakeup;
 687 
 688 /*
 689  * On platforms supporting the Low Power S0 Idle interface there is an ACPI
 690  * device object with the PNP0D80 compatible device ID (System Power Management
 691  * Controller) and a specific _DSM method under it.  That method, if present,
 692  * can be used to indicate to the platform that the OS is transitioning into a
 693  * low-power state in which certain types of activity are not desirable or that
 694  * it is leaving such a state, which allows the platform to adjust its operation
 695  * mode accordingly.
 696  */
 697 static const struct acpi_device_id lps0_device_ids[] = {
 698         {"PNP0D80", },
 699         {"", },
 700 };
 701 
 702 #define ACPI_LPS0_DSM_UUID      "c4eb40a0-6cd2-11e2-bcfd-0800200c9a66"
 703 
 704 #define ACPI_LPS0_GET_DEVICE_CONSTRAINTS        1
 705 #define ACPI_LPS0_SCREEN_OFF    3
 706 #define ACPI_LPS0_SCREEN_ON     4
 707 #define ACPI_LPS0_ENTRY         5
 708 #define ACPI_LPS0_EXIT          6
 709 
 710 static acpi_handle lps0_device_handle;
 711 static guid_t lps0_dsm_guid;
 712 static char lps0_dsm_func_mask;
 713 
 714 /* Device constraint entry structure */
 715 struct lpi_device_info {
 716         char *name;
 717         int enabled;
 718         union acpi_object *package;
 719 };
 720 
 721 /* Constraint package structure */
 722 struct lpi_device_constraint {
 723         int uid;
 724         int min_dstate;
 725         int function_states;
 726 };
 727 
 728 struct lpi_constraints {
 729         acpi_handle handle;
 730         int min_dstate;
 731 };
 732 
 733 static struct lpi_constraints *lpi_constraints_table;
 734 static int lpi_constraints_table_size;
 735 
 736 static void lpi_device_get_constraints(void)
 737 {
 738         union acpi_object *out_obj;
 739         int i;
 740 
 741         out_obj = acpi_evaluate_dsm_typed(lps0_device_handle, &lps0_dsm_guid,
 742                                           1, ACPI_LPS0_GET_DEVICE_CONSTRAINTS,
 743                                           NULL, ACPI_TYPE_PACKAGE);
 744 
 745         acpi_handle_debug(lps0_device_handle, "_DSM function 1 eval %s\n",
 746                           out_obj ? "successful" : "failed");
 747 
 748         if (!out_obj)
 749                 return;
 750 
 751         lpi_constraints_table = kcalloc(out_obj->package.count,
 752                                         sizeof(*lpi_constraints_table),
 753                                         GFP_KERNEL);
 754         if (!lpi_constraints_table)
 755                 goto free_acpi_buffer;
 756 
 757         acpi_handle_debug(lps0_device_handle, "LPI: constraints list begin:\n");
 758 
 759         for (i = 0; i < out_obj->package.count; i++) {
 760                 struct lpi_constraints *constraint;
 761                 acpi_status status;
 762                 union acpi_object *package = &out_obj->package.elements[i];
 763                 struct lpi_device_info info = { };
 764                 int package_count = 0, j;
 765 
 766                 if (!package)
 767                         continue;
 768 
 769                 for (j = 0; j < package->package.count; ++j) {
 770                         union acpi_object *element =
 771                                         &(package->package.elements[j]);
 772 
 773                         switch (element->type) {
 774                         case ACPI_TYPE_INTEGER:
 775                                 info.enabled = element->integer.value;
 776                                 break;
 777                         case ACPI_TYPE_STRING:
 778                                 info.name = element->string.pointer;
 779                                 break;
 780                         case ACPI_TYPE_PACKAGE:
 781                                 package_count = element->package.count;
 782                                 info.package = element->package.elements;
 783                                 break;
 784                         }
 785                 }
 786 
 787                 if (!info.enabled || !info.package || !info.name)
 788                         continue;
 789 
 790                 constraint = &lpi_constraints_table[lpi_constraints_table_size];
 791 
 792                 status = acpi_get_handle(NULL, info.name, &constraint->handle);
 793                 if (ACPI_FAILURE(status))
 794                         continue;
 795 
 796                 acpi_handle_debug(lps0_device_handle,
 797                                   "index:%d Name:%s\n", i, info.name);
 798 
 799                 constraint->min_dstate = -1;
 800 
 801                 for (j = 0; j < package_count; ++j) {
 802                         union acpi_object *info_obj = &info.package[j];
 803                         union acpi_object *cnstr_pkg;
 804                         union acpi_object *obj;
 805                         struct lpi_device_constraint dev_info;
 806 
 807                         switch (info_obj->type) {
 808                         case ACPI_TYPE_INTEGER:
 809                                 /* version */
 810                                 break;
 811                         case ACPI_TYPE_PACKAGE:
 812                                 if (info_obj->package.count < 2)
 813                                         break;
 814 
 815                                 cnstr_pkg = info_obj->package.elements;
 816                                 obj = &cnstr_pkg[0];
 817                                 dev_info.uid = obj->integer.value;
 818                                 obj = &cnstr_pkg[1];
 819                                 dev_info.min_dstate = obj->integer.value;
 820 
 821                                 acpi_handle_debug(lps0_device_handle,
 822                                         "uid:%d min_dstate:%s\n",
 823                                         dev_info.uid,
 824                                         acpi_power_state_string(dev_info.min_dstate));
 825 
 826                                 constraint->min_dstate = dev_info.min_dstate;
 827                                 break;
 828                         }
 829                 }
 830 
 831                 if (constraint->min_dstate < 0) {
 832                         acpi_handle_debug(lps0_device_handle,
 833                                           "Incomplete constraint defined\n");
 834                         continue;
 835                 }
 836 
 837                 lpi_constraints_table_size++;
 838         }
 839 
 840         acpi_handle_debug(lps0_device_handle, "LPI: constraints list end\n");
 841 
 842 free_acpi_buffer:
 843         ACPI_FREE(out_obj);
 844 }
 845 
 846 static void lpi_check_constraints(void)
 847 {
 848         int i;
 849 
 850         for (i = 0; i < lpi_constraints_table_size; ++i) {
 851                 acpi_handle handle = lpi_constraints_table[i].handle;
 852                 struct acpi_device *adev;
 853 
 854                 if (!handle || acpi_bus_get_device(handle, &adev))
 855                         continue;
 856 
 857                 acpi_handle_debug(handle,
 858                         "LPI: required min power state:%s current power state:%s\n",
 859                         acpi_power_state_string(lpi_constraints_table[i].min_dstate),
 860                         acpi_power_state_string(adev->power.state));
 861 
 862                 if (!adev->flags.power_manageable) {
 863                         acpi_handle_info(handle, "LPI: Device not power manageable\n");
 864                         lpi_constraints_table[i].handle = NULL;
 865                         continue;
 866                 }
 867 
 868                 if (adev->power.state < lpi_constraints_table[i].min_dstate)
 869                         acpi_handle_info(handle,
 870                                 "LPI: Constraint not met; min power state:%s current power state:%s\n",
 871                                 acpi_power_state_string(lpi_constraints_table[i].min_dstate),
 872                                 acpi_power_state_string(adev->power.state));
 873         }
 874 }
 875 
 876 static void acpi_sleep_run_lps0_dsm(unsigned int func)
 877 {
 878         union acpi_object *out_obj;
 879 
 880         if (!(lps0_dsm_func_mask & (1 << func)))
 881                 return;
 882 
 883         out_obj = acpi_evaluate_dsm(lps0_device_handle, &lps0_dsm_guid, 1, func, NULL);
 884         ACPI_FREE(out_obj);
 885 
 886         acpi_handle_debug(lps0_device_handle, "_DSM function %u evaluation %s\n",
 887                           func, out_obj ? "successful" : "failed");
 888 }
 889 
 890 static int lps0_device_attach(struct acpi_device *adev,
 891                               const struct acpi_device_id *not_used)
 892 {
 893         union acpi_object *out_obj;
 894 
 895         if (lps0_device_handle)
 896                 return 0;
 897 
 898         if (!(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0))
 899                 return 0;
 900 
 901         guid_parse(ACPI_LPS0_DSM_UUID, &lps0_dsm_guid);
 902         /* Check if the _DSM is present and as expected. */
 903         out_obj = acpi_evaluate_dsm(adev->handle, &lps0_dsm_guid, 1, 0, NULL);
 904         if (!out_obj || out_obj->type != ACPI_TYPE_BUFFER) {
 905                 acpi_handle_debug(adev->handle,
 906                                   "_DSM function 0 evaluation failed\n");
 907                 return 0;
 908         }
 909 
 910         lps0_dsm_func_mask = *(char *)out_obj->buffer.pointer;
 911 
 912         ACPI_FREE(out_obj);
 913 
 914         acpi_handle_debug(adev->handle, "_DSM function mask: 0x%x\n",
 915                           lps0_dsm_func_mask);
 916 
 917         lps0_device_handle = adev->handle;
 918 
 919         lpi_device_get_constraints();
 920 
 921         /*
 922          * Use suspend-to-idle by default if the default suspend mode was not
 923          * set from the command line.
 924          */
 925         if (mem_sleep_default > PM_SUSPEND_MEM && !acpi_sleep_default_s3)
 926                 mem_sleep_current = PM_SUSPEND_TO_IDLE;
 927 
 928         /*
 929          * Some LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U, require the
 930          * EC GPE to be enabled while suspended for certain wakeup devices to
 931          * work, so mark it as wakeup-capable.
 932          */
 933         acpi_ec_mark_gpe_for_wake();
 934 
 935         return 0;
 936 }
 937 
 938 static struct acpi_scan_handler lps0_handler = {
 939         .ids = lps0_device_ids,
 940         .attach = lps0_device_attach,
 941 };
 942 
 943 static int acpi_s2idle_begin(void)
 944 {
 945         acpi_scan_lock_acquire();
 946         return 0;
 947 }
 948 
 949 static int acpi_s2idle_prepare(void)
 950 {
 951         if (acpi_sci_irq_valid()) {
 952                 enable_irq_wake(acpi_sci_irq);
 953                 acpi_ec_set_gpe_wake_mask(ACPI_GPE_ENABLE);
 954         }
 955 
 956         acpi_enable_wakeup_devices(ACPI_STATE_S0);
 957 
 958         /* Change the configuration of GPEs to avoid spurious wakeup. */
 959         acpi_enable_all_wakeup_gpes();
 960         acpi_os_wait_events_complete();
 961 
 962         s2idle_wakeup = true;
 963         return 0;
 964 }
 965 
 966 static int acpi_s2idle_prepare_late(void)
 967 {
 968         if (!lps0_device_handle || sleep_no_lps0)
 969                 return 0;
 970 
 971         if (pm_debug_messages_on)
 972                 lpi_check_constraints();
 973 
 974         acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF);
 975         acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY);
 976 
 977         return 0;
 978 }
 979 
 980 static bool acpi_s2idle_wake(void)
 981 {
 982         if (!acpi_sci_irq_valid())
 983                 return pm_wakeup_pending();
 984 
 985         while (pm_wakeup_pending()) {
 986                 /*
 987                  * If IRQD_WAKEUP_ARMED is set for the SCI at this point, the
 988                  * SCI has not triggered while suspended, so bail out (the
 989                  * wakeup is pending anyway and the SCI is not the source of
 990                  * it).
 991                  */
 992                 if (irqd_is_wakeup_armed(irq_get_irq_data(acpi_sci_irq)))
 993                         return true;
 994 
 995                 /*
 996                  * If the status bit of any enabled fixed event is set, the
 997                  * wakeup is regarded as valid.
 998                  */
 999                 if (acpi_any_fixed_event_status_set())
1000                         return true;
1001 
1002                 /* Check wakeups from drivers sharing the SCI. */
1003                 if (acpi_check_wakeup_handlers())
1004                         return true;
1005 
1006                 /* Check non-EC GPE wakeups and dispatch the EC GPE. */
1007                 if (acpi_ec_dispatch_gpe())
1008                         return true;
1009 
1010                 /*
1011                  * Cancel the SCI wakeup and process all pending events in case
1012                  * there are any wakeup ones in there.
1013                  *
1014                  * Note that if any non-EC GPEs are active at this point, the
1015                  * SCI will retrigger after the rearming below, so no events
1016                  * should be missed by canceling the wakeup here.
1017                  */
1018                 pm_system_cancel_wakeup();
1019                 acpi_os_wait_events_complete();
1020 
1021                 /*
1022                  * The SCI is in the "suspended" state now and it cannot produce
1023                  * new wakeup events till the rearming below, so if any of them
1024                  * are pending here, they must be resulting from the processing
1025                  * of EC events above or coming from somewhere else.
1026                  */
1027                 if (pm_wakeup_pending())
1028                         return true;
1029 
1030                 rearm_wake_irq(acpi_sci_irq);
1031         }
1032 
1033         return false;
1034 }
1035 
1036 static void acpi_s2idle_restore_early(void)
1037 {
1038         if (!lps0_device_handle || sleep_no_lps0)
1039                 return;
1040 
1041         acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT);
1042         acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON);
1043 }
1044 
1045 static void acpi_s2idle_restore(void)
1046 {
1047         /*
1048          * Drain pending events before restoring the working-state configuration
1049          * of GPEs.
1050          */
1051         acpi_os_wait_events_complete(); /* synchronize GPE processing */
1052         acpi_ec_flush_work(); /* flush the EC driver's workqueues */
1053         acpi_os_wait_events_complete(); /* synchronize Notify handling */
1054 
1055         s2idle_wakeup = false;
1056 
1057         acpi_enable_all_runtime_gpes();
1058 
1059         acpi_disable_wakeup_devices(ACPI_STATE_S0);
1060 
1061         if (acpi_sci_irq_valid()) {
1062                 acpi_ec_set_gpe_wake_mask(ACPI_GPE_DISABLE);
1063                 disable_irq_wake(acpi_sci_irq);
1064         }
1065 }
1066 
1067 static void acpi_s2idle_end(void)
1068 {
1069         acpi_scan_lock_release();
1070 }
1071 
1072 static const struct platform_s2idle_ops acpi_s2idle_ops = {
1073         .begin = acpi_s2idle_begin,
1074         .prepare = acpi_s2idle_prepare,
1075         .prepare_late = acpi_s2idle_prepare_late,
1076         .wake = acpi_s2idle_wake,
1077         .restore_early = acpi_s2idle_restore_early,
1078         .restore = acpi_s2idle_restore,
1079         .end = acpi_s2idle_end,
1080 };
1081 
1082 static void acpi_sleep_suspend_setup(void)
1083 {
1084         int i;
1085 
1086         for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++)
1087                 if (acpi_sleep_state_supported(i))
1088                         sleep_states[i] = 1;
1089 
1090         suspend_set_ops(old_suspend_ordering ?
1091                 &acpi_suspend_ops_old : &acpi_suspend_ops);
1092 
1093         acpi_scan_add_handler(&lps0_handler);
1094         s2idle_set_ops(&acpi_s2idle_ops);
1095 }
1096 
1097 #else /* !CONFIG_SUSPEND */
1098 #define s2idle_wakeup           (false)
1099 #define lps0_device_handle      (NULL)
1100 static inline void acpi_sleep_suspend_setup(void) {}
1101 #endif /* !CONFIG_SUSPEND */
1102 
1103 bool acpi_s2idle_wakeup(void)
1104 {
1105         return s2idle_wakeup;
1106 }
1107 
1108 #ifdef CONFIG_PM_SLEEP
1109 static u32 saved_bm_rld;
1110 
1111 static int  acpi_save_bm_rld(void)
1112 {
1113         acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &saved_bm_rld);
1114         return 0;
1115 }
1116 
1117 static void  acpi_restore_bm_rld(void)
1118 {
1119         u32 resumed_bm_rld = 0;
1120 
1121         acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &resumed_bm_rld);
1122         if (resumed_bm_rld == saved_bm_rld)
1123                 return;
1124 
1125         acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_RLD, saved_bm_rld);
1126 }
1127 
1128 static struct syscore_ops acpi_sleep_syscore_ops = {
1129         .suspend = acpi_save_bm_rld,
1130         .resume = acpi_restore_bm_rld,
1131 };
1132 
1133 static void acpi_sleep_syscore_init(void)
1134 {
1135         register_syscore_ops(&acpi_sleep_syscore_ops);
1136 }
1137 #else
1138 static inline void acpi_sleep_syscore_init(void) {}
1139 #endif /* CONFIG_PM_SLEEP */
1140 
1141 #ifdef CONFIG_HIBERNATION
1142 static unsigned long s4_hardware_signature;
1143 static struct acpi_table_facs *facs;
1144 static bool nosigcheck;
1145 
1146 void __init acpi_no_s4_hw_signature(void)
1147 {
1148         nosigcheck = true;
1149 }
1150 
1151 static int acpi_hibernation_begin(pm_message_t stage)
1152 {
1153         if (!nvs_nosave) {
1154                 int error = suspend_nvs_alloc();
1155                 if (error)
1156                         return error;
1157         }
1158 
1159         if (stage.event == PM_EVENT_HIBERNATE)
1160                 pm_set_suspend_via_firmware();
1161 
1162         acpi_pm_start(ACPI_STATE_S4);
1163         return 0;
1164 }
1165 
1166 static int acpi_hibernation_enter(void)
1167 {
1168         acpi_status status = AE_OK;
1169 
1170         ACPI_FLUSH_CPU_CACHE();
1171 
1172         /* This shouldn't return.  If it returns, we have a problem */
1173         status = acpi_enter_sleep_state(ACPI_STATE_S4);
1174         /* Reprogram control registers */
1175         acpi_leave_sleep_state_prep(ACPI_STATE_S4);
1176 
1177         return ACPI_SUCCESS(status) ? 0 : -EFAULT;
1178 }
1179 
1180 static void acpi_hibernation_leave(void)
1181 {
1182         pm_set_resume_via_firmware();
1183         /*
1184          * If ACPI is not enabled by the BIOS and the boot kernel, we need to
1185          * enable it here.
1186          */
1187         acpi_enable();
1188         /* Reprogram control registers */
1189         acpi_leave_sleep_state_prep(ACPI_STATE_S4);
1190         /* Check the hardware signature */
1191         if (facs && s4_hardware_signature != facs->hardware_signature)
1192                 pr_crit("ACPI: Hardware changed while hibernated, success doubtful!\n");
1193         /* Restore the NVS memory area */
1194         suspend_nvs_restore();
1195         /* Allow EC transactions to happen. */
1196         acpi_ec_unblock_transactions();
1197 }
1198 
1199 static void acpi_pm_thaw(void)
1200 {
1201         acpi_ec_unblock_transactions();
1202         acpi_enable_all_runtime_gpes();
1203 }
1204 
1205 static const struct platform_hibernation_ops acpi_hibernation_ops = {
1206         .begin = acpi_hibernation_begin,
1207         .end = acpi_pm_end,
1208         .pre_snapshot = acpi_pm_prepare,
1209         .finish = acpi_pm_finish,
1210         .prepare = acpi_pm_prepare,
1211         .enter = acpi_hibernation_enter,
1212         .leave = acpi_hibernation_leave,
1213         .pre_restore = acpi_pm_freeze,
1214         .restore_cleanup = acpi_pm_thaw,
1215 };
1216 
1217 /**
1218  *      acpi_hibernation_begin_old - Set the target system sleep state to
1219  *              ACPI_STATE_S4 and execute the _PTS control method.  This
1220  *              function is used if the pre-ACPI 2.0 suspend ordering has been
1221  *              requested.
1222  */
1223 static int acpi_hibernation_begin_old(pm_message_t stage)
1224 {
1225         int error;
1226         /*
1227          * The _TTS object should always be evaluated before the _PTS object.
1228          * When the old_suspended_ordering is true, the _PTS object is
1229          * evaluated in the acpi_sleep_prepare.
1230          */
1231         acpi_sleep_tts_switch(ACPI_STATE_S4);
1232 
1233         error = acpi_sleep_prepare(ACPI_STATE_S4);
1234         if (error)
1235                 return error;
1236 
1237         if (!nvs_nosave) {
1238                 error = suspend_nvs_alloc();
1239                 if (error)
1240                         return error;
1241         }
1242 
1243         if (stage.event == PM_EVENT_HIBERNATE)
1244                 pm_set_suspend_via_firmware();
1245 
1246         acpi_target_sleep_state = ACPI_STATE_S4;
1247         acpi_scan_lock_acquire();
1248         return 0;
1249 }
1250 
1251 /*
1252  * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has
1253  * been requested.
1254  */
1255 static const struct platform_hibernation_ops acpi_hibernation_ops_old = {
1256         .begin = acpi_hibernation_begin_old,
1257         .end = acpi_pm_end,
1258         .pre_snapshot = acpi_pm_pre_suspend,
1259         .prepare = acpi_pm_freeze,
1260         .finish = acpi_pm_finish,
1261         .enter = acpi_hibernation_enter,
1262         .leave = acpi_hibernation_leave,
1263         .pre_restore = acpi_pm_freeze,
1264         .restore_cleanup = acpi_pm_thaw,
1265         .recover = acpi_pm_finish,
1266 };
1267 
1268 static void acpi_sleep_hibernate_setup(void)
1269 {
1270         if (!acpi_sleep_state_supported(ACPI_STATE_S4))
1271                 return;
1272 
1273         hibernation_set_ops(old_suspend_ordering ?
1274                         &acpi_hibernation_ops_old : &acpi_hibernation_ops);
1275         sleep_states[ACPI_STATE_S4] = 1;
1276         if (nosigcheck)
1277                 return;
1278 
1279         acpi_get_table(ACPI_SIG_FACS, 1, (struct acpi_table_header **)&facs);
1280         if (facs)
1281                 s4_hardware_signature = facs->hardware_signature;
1282 }
1283 #else /* !CONFIG_HIBERNATION */
1284 static inline void acpi_sleep_hibernate_setup(void) {}
1285 #endif /* !CONFIG_HIBERNATION */
1286 
1287 static void acpi_power_off_prepare(void)
1288 {
1289         /* Prepare to power off the system */
1290         acpi_sleep_prepare(ACPI_STATE_S5);
1291         acpi_disable_all_gpes();
1292         acpi_os_wait_events_complete();
1293 }
1294 
1295 static void acpi_power_off(void)
1296 {
1297         /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
1298         printk(KERN_DEBUG "%s called\n", __func__);
1299         local_irq_disable();
1300         acpi_enter_sleep_state(ACPI_STATE_S5);
1301 }
1302 
1303 int __init acpi_sleep_init(void)
1304 {
1305         char supported[ACPI_S_STATE_COUNT * 3 + 1];
1306         char *pos = supported;
1307         int i;
1308 
1309         acpi_sleep_dmi_check();
1310 
1311         sleep_states[ACPI_STATE_S0] = 1;
1312 
1313         acpi_sleep_syscore_init();
1314         acpi_sleep_suspend_setup();
1315         acpi_sleep_hibernate_setup();
1316 
1317         if (acpi_sleep_state_supported(ACPI_STATE_S5)) {
1318                 sleep_states[ACPI_STATE_S5] = 1;
1319                 pm_power_off_prepare = acpi_power_off_prepare;
1320                 pm_power_off = acpi_power_off;
1321         } else {
1322                 acpi_no_s5 = true;
1323         }
1324 
1325         supported[0] = 0;
1326         for (i = 0; i < ACPI_S_STATE_COUNT; i++) {
1327                 if (sleep_states[i])
1328                         pos += sprintf(pos, " S%d", i);
1329         }
1330         pr_info(PREFIX "(supports%s)\n", supported);
1331 
1332         /*
1333          * Register the tts_notifier to reboot notifier list so that the _TTS
1334          * object can also be evaluated when the system enters S5.
1335          */
1336         register_reboot_notifier(&tts_notifier);
1337         return 0;
1338 }

/* [<][>][^][v][top][bottom][index][help] */