1 /* 2 * sleep.c - ACPI sleep support. 3 * 4 * Copyright (c) 2005 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> 5 * Copyright (c) 2004 David Shaohua Li <shaohua.li@intel.com> 6 * Copyright (c) 2000-2003 Patrick Mochel 7 * Copyright (c) 2003 Open Source Development Lab 8 * 9 * This file is released under the GPLv2. 10 * 11 */ 12 13 #include <linux/delay.h> 14 #include <linux/irq.h> 15 #include <linux/dmi.h> 16 #include <linux/device.h> 17 #include <linux/suspend.h> 18 #include <linux/reboot.h> 19 #include <linux/acpi.h> 20 #include <linux/module.h> 21 #include <asm/io.h> 22 23 #include "internal.h" 24 #include "sleep.h" 25 26 static u8 sleep_states[ACPI_S_STATE_COUNT]; 27 28 static void acpi_sleep_tts_switch(u32 acpi_state) 29 { 30 acpi_status status; 31 32 status = acpi_execute_simple_method(NULL, "\\_TTS", acpi_state); 33 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 34 /* 35 * OS can't evaluate the _TTS object correctly. Some warning 36 * message will be printed. But it won't break anything. 37 */ 38 printk(KERN_NOTICE "Failure in evaluating _TTS object\n"); 39 } 40 } 41 42 static int tts_notify_reboot(struct notifier_block *this, 43 unsigned long code, void *x) 44 { 45 acpi_sleep_tts_switch(ACPI_STATE_S5); 46 return NOTIFY_DONE; 47 } 48 49 static struct notifier_block tts_notifier = { 50 .notifier_call = tts_notify_reboot, 51 .next = NULL, 52 .priority = 0, 53 }; 54 55 static int acpi_sleep_prepare(u32 acpi_state) 56 { 57 #ifdef CONFIG_ACPI_SLEEP 58 /* do we have a wakeup address for S2 and S3? */ 59 if (acpi_state == ACPI_STATE_S3) { 60 if (!acpi_wakeup_address) 61 return -EFAULT; 62 acpi_set_firmware_waking_vector(acpi_wakeup_address); 63 64 } 65 ACPI_FLUSH_CPU_CACHE(); 66 #endif 67 printk(KERN_INFO PREFIX "Preparing to enter system sleep state S%d\n", 68 acpi_state); 69 acpi_enable_wakeup_devices(acpi_state); 70 acpi_enter_sleep_state_prep(acpi_state); 71 return 0; 72 } 73 74 #ifdef CONFIG_ACPI_SLEEP 75 static u32 acpi_target_sleep_state = ACPI_STATE_S0; 76 77 u32 acpi_target_system_state(void) 78 { 79 return acpi_target_sleep_state; 80 } 81 82 static bool pwr_btn_event_pending; 83 84 /* 85 * The ACPI specification wants us to save NVS memory regions during hibernation 86 * and to restore them during the subsequent resume. Windows does that also for 87 * suspend to RAM. However, it is known that this mechanism does not work on 88 * all machines, so we allow the user to disable it with the help of the 89 * 'acpi_sleep=nonvs' kernel command line option. 90 */ 91 static bool nvs_nosave; 92 93 void __init acpi_nvs_nosave(void) 94 { 95 nvs_nosave = true; 96 } 97 98 /* 99 * The ACPI specification wants us to save NVS memory regions during hibernation 100 * but says nothing about saving NVS during S3. Not all versions of Windows 101 * save NVS on S3 suspend either, and it is clear that not all systems need 102 * NVS to be saved at S3 time. To improve suspend/resume time, allow the 103 * user to disable saving NVS on S3 if their system does not require it, but 104 * continue to save/restore NVS for S4 as specified. 105 */ 106 static bool nvs_nosave_s3; 107 108 void __init acpi_nvs_nosave_s3(void) 109 { 110 nvs_nosave_s3 = true; 111 } 112 113 /* 114 * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the 115 * user to request that behavior by using the 'acpi_old_suspend_ordering' 116 * kernel command line option that causes the following variable to be set. 117 */ 118 static bool old_suspend_ordering; 119 120 void __init acpi_old_suspend_ordering(void) 121 { 122 old_suspend_ordering = true; 123 } 124 125 static int __init init_old_suspend_ordering(const struct dmi_system_id *d) 126 { 127 acpi_old_suspend_ordering(); 128 return 0; 129 } 130 131 static int __init init_nvs_nosave(const struct dmi_system_id *d) 132 { 133 acpi_nvs_nosave(); 134 return 0; 135 } 136 137 static struct dmi_system_id acpisleep_dmi_table[] __initdata = { 138 { 139 .callback = init_old_suspend_ordering, 140 .ident = "Abit KN9 (nForce4 variant)", 141 .matches = { 142 DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"), 143 DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"), 144 }, 145 }, 146 { 147 .callback = init_old_suspend_ordering, 148 .ident = "HP xw4600 Workstation", 149 .matches = { 150 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 151 DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), 152 }, 153 }, 154 { 155 .callback = init_old_suspend_ordering, 156 .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)", 157 .matches = { 158 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."), 159 DMI_MATCH(DMI_BOARD_NAME, "M2N8L"), 160 }, 161 }, 162 { 163 .callback = init_old_suspend_ordering, 164 .ident = "Panasonic CF51-2L", 165 .matches = { 166 DMI_MATCH(DMI_BOARD_VENDOR, 167 "Matsushita Electric Industrial Co.,Ltd."), 168 DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"), 169 }, 170 }, 171 { 172 .callback = init_nvs_nosave, 173 .ident = "Sony Vaio VGN-FW41E_H", 174 .matches = { 175 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 176 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW41E_H"), 177 }, 178 }, 179 { 180 .callback = init_nvs_nosave, 181 .ident = "Sony Vaio VGN-FW21E", 182 .matches = { 183 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 184 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW21E"), 185 }, 186 }, 187 { 188 .callback = init_nvs_nosave, 189 .ident = "Sony Vaio VGN-FW21M", 190 .matches = { 191 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 192 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW21M"), 193 }, 194 }, 195 { 196 .callback = init_nvs_nosave, 197 .ident = "Sony Vaio VPCEB17FX", 198 .matches = { 199 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 200 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB17FX"), 201 }, 202 }, 203 { 204 .callback = init_nvs_nosave, 205 .ident = "Sony Vaio VGN-SR11M", 206 .matches = { 207 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 208 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR11M"), 209 }, 210 }, 211 { 212 .callback = init_nvs_nosave, 213 .ident = "Everex StepNote Series", 214 .matches = { 215 DMI_MATCH(DMI_SYS_VENDOR, "Everex Systems, Inc."), 216 DMI_MATCH(DMI_PRODUCT_NAME, "Everex StepNote Series"), 217 }, 218 }, 219 { 220 .callback = init_nvs_nosave, 221 .ident = "Sony Vaio VPCEB1Z1E", 222 .matches = { 223 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 224 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1Z1E"), 225 }, 226 }, 227 { 228 .callback = init_nvs_nosave, 229 .ident = "Sony Vaio VGN-NW130D", 230 .matches = { 231 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 232 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NW130D"), 233 }, 234 }, 235 { 236 .callback = init_nvs_nosave, 237 .ident = "Sony Vaio VPCCW29FX", 238 .matches = { 239 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 240 DMI_MATCH(DMI_PRODUCT_NAME, "VPCCW29FX"), 241 }, 242 }, 243 { 244 .callback = init_nvs_nosave, 245 .ident = "Averatec AV1020-ED2", 246 .matches = { 247 DMI_MATCH(DMI_SYS_VENDOR, "AVERATEC"), 248 DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"), 249 }, 250 }, 251 { 252 .callback = init_old_suspend_ordering, 253 .ident = "Asus A8N-SLI DELUXE", 254 .matches = { 255 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), 256 DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI DELUXE"), 257 }, 258 }, 259 { 260 .callback = init_old_suspend_ordering, 261 .ident = "Asus A8N-SLI Premium", 262 .matches = { 263 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), 264 DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI Premium"), 265 }, 266 }, 267 { 268 .callback = init_nvs_nosave, 269 .ident = "Sony Vaio VGN-SR26GN_P", 270 .matches = { 271 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 272 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR26GN_P"), 273 }, 274 }, 275 { 276 .callback = init_nvs_nosave, 277 .ident = "Sony Vaio VPCEB1S1E", 278 .matches = { 279 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 280 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1S1E"), 281 }, 282 }, 283 { 284 .callback = init_nvs_nosave, 285 .ident = "Sony Vaio VGN-FW520F", 286 .matches = { 287 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 288 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW520F"), 289 }, 290 }, 291 { 292 .callback = init_nvs_nosave, 293 .ident = "Asus K54C", 294 .matches = { 295 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), 296 DMI_MATCH(DMI_PRODUCT_NAME, "K54C"), 297 }, 298 }, 299 { 300 .callback = init_nvs_nosave, 301 .ident = "Asus K54HR", 302 .matches = { 303 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), 304 DMI_MATCH(DMI_PRODUCT_NAME, "K54HR"), 305 }, 306 }, 307 {}, 308 }; 309 310 static void acpi_sleep_dmi_check(void) 311 { 312 dmi_check_system(acpisleep_dmi_table); 313 } 314 315 /** 316 * acpi_pm_freeze - Disable the GPEs and suspend EC transactions. 317 */ 318 static int acpi_pm_freeze(void) 319 { 320 acpi_disable_all_gpes(); 321 acpi_os_wait_events_complete(); 322 acpi_ec_block_transactions(); 323 return 0; 324 } 325 326 /** 327 * acpi_pre_suspend - Enable wakeup devices, "freeze" EC and save NVS. 328 */ 329 static int acpi_pm_pre_suspend(void) 330 { 331 acpi_pm_freeze(); 332 return suspend_nvs_save(); 333 } 334 335 /** 336 * __acpi_pm_prepare - Prepare the platform to enter the target state. 337 * 338 * If necessary, set the firmware waking vector and do arch-specific 339 * nastiness to get the wakeup code to the waking vector. 340 */ 341 static int __acpi_pm_prepare(void) 342 { 343 int error = acpi_sleep_prepare(acpi_target_sleep_state); 344 if (error) 345 acpi_target_sleep_state = ACPI_STATE_S0; 346 347 return error; 348 } 349 350 /** 351 * acpi_pm_prepare - Prepare the platform to enter the target sleep 352 * state and disable the GPEs. 353 */ 354 static int acpi_pm_prepare(void) 355 { 356 int error = __acpi_pm_prepare(); 357 if (!error) 358 error = acpi_pm_pre_suspend(); 359 360 return error; 361 } 362 363 static int find_powerf_dev(struct device *dev, void *data) 364 { 365 struct acpi_device *device = to_acpi_device(dev); 366 const char *hid = acpi_device_hid(device); 367 368 return !strcmp(hid, ACPI_BUTTON_HID_POWERF); 369 } 370 371 /** 372 * acpi_pm_finish - Instruct the platform to leave a sleep state. 373 * 374 * This is called after we wake back up (or if entering the sleep state 375 * failed). 376 */ 377 static void acpi_pm_finish(void) 378 { 379 struct device *pwr_btn_dev; 380 u32 acpi_state = acpi_target_sleep_state; 381 382 acpi_ec_unblock_transactions(); 383 suspend_nvs_free(); 384 385 if (acpi_state == ACPI_STATE_S0) 386 return; 387 388 printk(KERN_INFO PREFIX "Waking up from system sleep state S%d\n", 389 acpi_state); 390 acpi_disable_wakeup_devices(acpi_state); 391 acpi_leave_sleep_state(acpi_state); 392 393 /* reset firmware waking vector */ 394 acpi_set_firmware_waking_vector((acpi_physical_address) 0); 395 396 acpi_target_sleep_state = ACPI_STATE_S0; 397 398 acpi_resume_power_resources(); 399 400 /* If we were woken with the fixed power button, provide a small 401 * hint to userspace in the form of a wakeup event on the fixed power 402 * button device (if it can be found). 403 * 404 * We delay the event generation til now, as the PM layer requires 405 * timekeeping to be running before we generate events. */ 406 if (!pwr_btn_event_pending) 407 return; 408 409 pwr_btn_event_pending = false; 410 pwr_btn_dev = bus_find_device(&acpi_bus_type, NULL, NULL, 411 find_powerf_dev); 412 if (pwr_btn_dev) { 413 pm_wakeup_event(pwr_btn_dev, 0); 414 put_device(pwr_btn_dev); 415 } 416 } 417 418 /** 419 * acpi_pm_start - Start system PM transition. 420 */ 421 static void acpi_pm_start(u32 acpi_state) 422 { 423 acpi_target_sleep_state = acpi_state; 424 acpi_sleep_tts_switch(acpi_target_sleep_state); 425 acpi_scan_lock_acquire(); 426 } 427 428 /** 429 * acpi_pm_end - Finish up system PM transition. 430 */ 431 static void acpi_pm_end(void) 432 { 433 acpi_scan_lock_release(); 434 /* 435 * This is necessary in case acpi_pm_finish() is not called during a 436 * failing transition to a sleep state. 437 */ 438 acpi_target_sleep_state = ACPI_STATE_S0; 439 acpi_sleep_tts_switch(acpi_target_sleep_state); 440 } 441 #else /* !CONFIG_ACPI_SLEEP */ 442 #define acpi_target_sleep_state ACPI_STATE_S0 443 static inline void acpi_sleep_dmi_check(void) {} 444 #endif /* CONFIG_ACPI_SLEEP */ 445 446 #ifdef CONFIG_SUSPEND 447 static u32 acpi_suspend_states[] = { 448 [PM_SUSPEND_ON] = ACPI_STATE_S0, 449 [PM_SUSPEND_STANDBY] = ACPI_STATE_S1, 450 [PM_SUSPEND_MEM] = ACPI_STATE_S3, 451 [PM_SUSPEND_MAX] = ACPI_STATE_S5 452 }; 453 454 /** 455 * acpi_suspend_begin - Set the target system sleep state to the state 456 * associated with given @pm_state, if supported. 457 */ 458 static int acpi_suspend_begin(suspend_state_t pm_state) 459 { 460 u32 acpi_state = acpi_suspend_states[pm_state]; 461 int error; 462 463 error = (nvs_nosave || nvs_nosave_s3) ? 0 : suspend_nvs_alloc(); 464 if (error) 465 return error; 466 467 if (!sleep_states[acpi_state]) { 468 pr_err("ACPI does not support sleep state S%u\n", acpi_state); 469 return -ENOSYS; 470 } 471 472 acpi_pm_start(acpi_state); 473 return 0; 474 } 475 476 /** 477 * acpi_suspend_enter - Actually enter a sleep state. 478 * @pm_state: ignored 479 * 480 * Flush caches and go to sleep. For STR we have to call arch-specific 481 * assembly, which in turn call acpi_enter_sleep_state(). 482 * It's unfortunate, but it works. Please fix if you're feeling frisky. 483 */ 484 static int acpi_suspend_enter(suspend_state_t pm_state) 485 { 486 acpi_status status = AE_OK; 487 u32 acpi_state = acpi_target_sleep_state; 488 int error; 489 490 ACPI_FLUSH_CPU_CACHE(); 491 492 switch (acpi_state) { 493 case ACPI_STATE_S1: 494 barrier(); 495 status = acpi_enter_sleep_state(acpi_state); 496 break; 497 498 case ACPI_STATE_S3: 499 if (!acpi_suspend_lowlevel) 500 return -ENOSYS; 501 error = acpi_suspend_lowlevel(); 502 if (error) 503 return error; 504 pr_info(PREFIX "Low-level resume complete\n"); 505 break; 506 } 507 508 /* This violates the spec but is required for bug compatibility. */ 509 acpi_write_bit_register(ACPI_BITREG_SCI_ENABLE, 1); 510 511 /* Reprogram control registers */ 512 acpi_leave_sleep_state_prep(acpi_state); 513 514 /* ACPI 3.0 specs (P62) says that it's the responsibility 515 * of the OSPM to clear the status bit [ implying that the 516 * POWER_BUTTON event should not reach userspace ] 517 * 518 * However, we do generate a small hint for userspace in the form of 519 * a wakeup event. We flag this condition for now and generate the 520 * event later, as we're currently too early in resume to be able to 521 * generate wakeup events. 522 */ 523 if (ACPI_SUCCESS(status) && (acpi_state == ACPI_STATE_S3)) { 524 acpi_event_status pwr_btn_status = ACPI_EVENT_FLAG_DISABLED; 525 526 acpi_get_event_status(ACPI_EVENT_POWER_BUTTON, &pwr_btn_status); 527 528 if (pwr_btn_status & ACPI_EVENT_FLAG_SET) { 529 acpi_clear_event(ACPI_EVENT_POWER_BUTTON); 530 /* Flag for later */ 531 pwr_btn_event_pending = true; 532 } 533 } 534 535 /* 536 * Disable and clear GPE status before interrupt is enabled. Some GPEs 537 * (like wakeup GPE) haven't handler, this can avoid such GPE misfire. 538 * acpi_leave_sleep_state will reenable specific GPEs later 539 */ 540 acpi_disable_all_gpes(); 541 /* Allow EC transactions to happen. */ 542 acpi_ec_unblock_transactions_early(); 543 544 suspend_nvs_restore(); 545 546 return ACPI_SUCCESS(status) ? 0 : -EFAULT; 547 } 548 549 static int acpi_suspend_state_valid(suspend_state_t pm_state) 550 { 551 u32 acpi_state; 552 553 switch (pm_state) { 554 case PM_SUSPEND_ON: 555 case PM_SUSPEND_STANDBY: 556 case PM_SUSPEND_MEM: 557 acpi_state = acpi_suspend_states[pm_state]; 558 559 return sleep_states[acpi_state]; 560 default: 561 return 0; 562 } 563 } 564 565 static const struct platform_suspend_ops acpi_suspend_ops = { 566 .valid = acpi_suspend_state_valid, 567 .begin = acpi_suspend_begin, 568 .prepare_late = acpi_pm_prepare, 569 .enter = acpi_suspend_enter, 570 .wake = acpi_pm_finish, 571 .end = acpi_pm_end, 572 }; 573 574 /** 575 * acpi_suspend_begin_old - Set the target system sleep state to the 576 * state associated with given @pm_state, if supported, and 577 * execute the _PTS control method. This function is used if the 578 * pre-ACPI 2.0 suspend ordering has been requested. 579 */ 580 static int acpi_suspend_begin_old(suspend_state_t pm_state) 581 { 582 int error = acpi_suspend_begin(pm_state); 583 if (!error) 584 error = __acpi_pm_prepare(); 585 586 return error; 587 } 588 589 /* 590 * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has 591 * been requested. 592 */ 593 static const struct platform_suspend_ops acpi_suspend_ops_old = { 594 .valid = acpi_suspend_state_valid, 595 .begin = acpi_suspend_begin_old, 596 .prepare_late = acpi_pm_pre_suspend, 597 .enter = acpi_suspend_enter, 598 .wake = acpi_pm_finish, 599 .end = acpi_pm_end, 600 .recover = acpi_pm_finish, 601 }; 602 603 static void acpi_sleep_suspend_setup(void) 604 { 605 int i; 606 607 for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++) { 608 acpi_status status; 609 u8 type_a, type_b; 610 611 status = acpi_get_sleep_type_data(i, &type_a, &type_b); 612 if (ACPI_SUCCESS(status)) { 613 sleep_states[i] = 1; 614 } 615 } 616 617 suspend_set_ops(old_suspend_ordering ? 618 &acpi_suspend_ops_old : &acpi_suspend_ops); 619 } 620 #else /* !CONFIG_SUSPEND */ 621 static inline void acpi_sleep_suspend_setup(void) {} 622 #endif /* !CONFIG_SUSPEND */ 623 624 #ifdef CONFIG_HIBERNATION 625 static unsigned long s4_hardware_signature; 626 static struct acpi_table_facs *facs; 627 static bool nosigcheck; 628 629 void __init acpi_no_s4_hw_signature(void) 630 { 631 nosigcheck = true; 632 } 633 634 static int acpi_hibernation_begin(void) 635 { 636 int error; 637 638 error = nvs_nosave ? 0 : suspend_nvs_alloc(); 639 if (!error) 640 acpi_pm_start(ACPI_STATE_S4); 641 642 return error; 643 } 644 645 static int acpi_hibernation_enter(void) 646 { 647 acpi_status status = AE_OK; 648 649 ACPI_FLUSH_CPU_CACHE(); 650 651 /* This shouldn't return. If it returns, we have a problem */ 652 status = acpi_enter_sleep_state(ACPI_STATE_S4); 653 /* Reprogram control registers */ 654 acpi_leave_sleep_state_prep(ACPI_STATE_S4); 655 656 return ACPI_SUCCESS(status) ? 0 : -EFAULT; 657 } 658 659 static void acpi_hibernation_leave(void) 660 { 661 /* 662 * If ACPI is not enabled by the BIOS and the boot kernel, we need to 663 * enable it here. 664 */ 665 acpi_enable(); 666 /* Reprogram control registers */ 667 acpi_leave_sleep_state_prep(ACPI_STATE_S4); 668 /* Check the hardware signature */ 669 if (facs && s4_hardware_signature != facs->hardware_signature) 670 pr_crit("ACPI: Hardware changed while hibernated, success doubtful!\n"); 671 /* Restore the NVS memory area */ 672 suspend_nvs_restore(); 673 /* Allow EC transactions to happen. */ 674 acpi_ec_unblock_transactions_early(); 675 } 676 677 static void acpi_pm_thaw(void) 678 { 679 acpi_ec_unblock_transactions(); 680 acpi_enable_all_runtime_gpes(); 681 } 682 683 static const struct platform_hibernation_ops acpi_hibernation_ops = { 684 .begin = acpi_hibernation_begin, 685 .end = acpi_pm_end, 686 .pre_snapshot = acpi_pm_prepare, 687 .finish = acpi_pm_finish, 688 .prepare = acpi_pm_prepare, 689 .enter = acpi_hibernation_enter, 690 .leave = acpi_hibernation_leave, 691 .pre_restore = acpi_pm_freeze, 692 .restore_cleanup = acpi_pm_thaw, 693 }; 694 695 /** 696 * acpi_hibernation_begin_old - Set the target system sleep state to 697 * ACPI_STATE_S4 and execute the _PTS control method. This 698 * function is used if the pre-ACPI 2.0 suspend ordering has been 699 * requested. 700 */ 701 static int acpi_hibernation_begin_old(void) 702 { 703 int error; 704 /* 705 * The _TTS object should always be evaluated before the _PTS object. 706 * When the old_suspended_ordering is true, the _PTS object is 707 * evaluated in the acpi_sleep_prepare. 708 */ 709 acpi_sleep_tts_switch(ACPI_STATE_S4); 710 711 error = acpi_sleep_prepare(ACPI_STATE_S4); 712 713 if (!error) { 714 if (!nvs_nosave) 715 error = suspend_nvs_alloc(); 716 if (!error) { 717 acpi_target_sleep_state = ACPI_STATE_S4; 718 acpi_scan_lock_acquire(); 719 } 720 } 721 return error; 722 } 723 724 /* 725 * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has 726 * been requested. 727 */ 728 static const struct platform_hibernation_ops acpi_hibernation_ops_old = { 729 .begin = acpi_hibernation_begin_old, 730 .end = acpi_pm_end, 731 .pre_snapshot = acpi_pm_pre_suspend, 732 .prepare = acpi_pm_freeze, 733 .finish = acpi_pm_finish, 734 .enter = acpi_hibernation_enter, 735 .leave = acpi_hibernation_leave, 736 .pre_restore = acpi_pm_freeze, 737 .restore_cleanup = acpi_pm_thaw, 738 .recover = acpi_pm_finish, 739 }; 740 741 static void acpi_sleep_hibernate_setup(void) 742 { 743 acpi_status status; 744 u8 type_a, type_b; 745 746 status = acpi_get_sleep_type_data(ACPI_STATE_S4, &type_a, &type_b); 747 if (ACPI_FAILURE(status)) 748 return; 749 750 hibernation_set_ops(old_suspend_ordering ? 751 &acpi_hibernation_ops_old : &acpi_hibernation_ops); 752 sleep_states[ACPI_STATE_S4] = 1; 753 if (nosigcheck) 754 return; 755 756 acpi_get_table(ACPI_SIG_FACS, 1, (struct acpi_table_header **)&facs); 757 if (facs) 758 s4_hardware_signature = facs->hardware_signature; 759 } 760 #else /* !CONFIG_HIBERNATION */ 761 static inline void acpi_sleep_hibernate_setup(void) {} 762 #endif /* !CONFIG_HIBERNATION */ 763 764 int acpi_suspend(u32 acpi_state) 765 { 766 suspend_state_t states[] = { 767 [1] = PM_SUSPEND_STANDBY, 768 [3] = PM_SUSPEND_MEM, 769 [5] = PM_SUSPEND_MAX 770 }; 771 772 if (acpi_state < 6 && states[acpi_state]) 773 return pm_suspend(states[acpi_state]); 774 if (acpi_state == 4) 775 return hibernate(); 776 return -EINVAL; 777 } 778 779 static void acpi_power_off_prepare(void) 780 { 781 /* Prepare to power off the system */ 782 acpi_sleep_prepare(ACPI_STATE_S5); 783 acpi_disable_all_gpes(); 784 } 785 786 static void acpi_power_off(void) 787 { 788 /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ 789 printk(KERN_DEBUG "%s called\n", __func__); 790 local_irq_disable(); 791 acpi_enter_sleep_state(ACPI_STATE_S5); 792 } 793 794 int __init acpi_sleep_init(void) 795 { 796 acpi_status status; 797 u8 type_a, type_b; 798 char supported[ACPI_S_STATE_COUNT * 3 + 1]; 799 char *pos = supported; 800 int i; 801 802 acpi_sleep_dmi_check(); 803 804 sleep_states[ACPI_STATE_S0] = 1; 805 806 acpi_sleep_suspend_setup(); 807 acpi_sleep_hibernate_setup(); 808 809 status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); 810 if (ACPI_SUCCESS(status)) { 811 sleep_states[ACPI_STATE_S5] = 1; 812 pm_power_off_prepare = acpi_power_off_prepare; 813 pm_power_off = acpi_power_off; 814 } 815 816 supported[0] = 0; 817 for (i = 0; i < ACPI_S_STATE_COUNT; i++) { 818 if (sleep_states[i]) 819 pos += sprintf(pos, " S%d", i); 820 } 821 pr_info(PREFIX "(supports%s)\n", supported); 822 823 /* 824 * Register the tts_notifier to reboot notifier list so that the _TTS 825 * object can also be evaluated when the system enters S5. 826 */ 827 register_reboot_notifier(&tts_notifier); 828 return 0; 829 } 830