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