hwsleep.c (123315) | hwsleep.c (126372) |
---|---|
1 2/****************************************************************************** 3 * 4 * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface | 1 2/****************************************************************************** 3 * 4 * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface |
5 * $Revision: 58 $ | 5 * $Revision: 65 $ |
6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * | 6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * |
13 * Some or all of this work - Copyright (c) 1999 - 2003, Intel Corp. | 13 * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. |
14 * All rights reserved. 15 * 16 * 2. License 17 * 18 * 2.1. This is your license from Intel Corp. under its intellectual property 19 * rights. You may have additional license terms from the party that provided 20 * you this software, covering your right to use that party's intellectual 21 * property rights. --- 94 unchanged lines hidden (view full) --- 116 *****************************************************************************/ 117 118#include "acpi.h" 119 120#define _COMPONENT ACPI_HARDWARE 121 ACPI_MODULE_NAME ("hwsleep") 122 123 | 14 * All rights reserved. 15 * 16 * 2. License 17 * 18 * 2.1. This is your license from Intel Corp. under its intellectual property 19 * rights. You may have additional license terms from the party that provided 20 * you this software, covering your right to use that party's intellectual 21 * property rights. --- 94 unchanged lines hidden (view full) --- 116 *****************************************************************************/ 117 118#include "acpi.h" 119 120#define _COMPONENT ACPI_HARDWARE 121 ACPI_MODULE_NAME ("hwsleep") 122 123 |
124#define METHOD_NAME__BFS "\\_BFS" 125#define METHOD_NAME__GTS "\\_GTS" 126#define METHOD_NAME__PTS "\\_PTS" 127#define METHOD_NAME__SST "\\_SI._SST" 128#define METHOD_NAME__WAK "\\_WAK" 129 130#define ACPI_SST_INDICATOR_OFF 0 131#define ACPI_SST_WORKING 1 132#define ACPI_SST_WAKING 2 133#define ACPI_SST_SLEEPING 3 134#define ACPI_SST_SLEEP_CONTEXT 4 135 136 |
|
124/****************************************************************************** 125 * 126 * FUNCTION: AcpiSetFirmwareWakingVector 127 * 128 * PARAMETERS: PhysicalAddress - Physical address of ACPI real mode 129 * entry point. 130 * 131 * RETURN: Status --- 113 unchanged lines hidden (view full) --- 245 ArgList.Count = 1; 246 ArgList.Pointer = &Arg; 247 248 Arg.Type = ACPI_TYPE_INTEGER; 249 Arg.Integer.Value = SleepState; 250 251 /* Run the _PTS and _GTS methods */ 252 | 137/****************************************************************************** 138 * 139 * FUNCTION: AcpiSetFirmwareWakingVector 140 * 141 * PARAMETERS: PhysicalAddress - Physical address of ACPI real mode 142 * entry point. 143 * 144 * RETURN: Status --- 113 unchanged lines hidden (view full) --- 258 ArgList.Count = 1; 259 ArgList.Pointer = &Arg; 260 261 Arg.Type = ACPI_TYPE_INTEGER; 262 Arg.Integer.Value = SleepState; 263 264 /* Run the _PTS and _GTS methods */ 265 |
253 Status = AcpiEvaluateObject (NULL, "\\_PTS", &ArgList, NULL); | 266 Status = AcpiEvaluateObject (NULL, METHOD_NAME__PTS, &ArgList, NULL); |
254 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 255 { 256 return_ACPI_STATUS (Status); 257 } 258 | 267 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 268 { 269 return_ACPI_STATUS (Status); 270 } 271 |
259 Status = AcpiEvaluateObject (NULL, "\\_GTS", &ArgList, NULL); | 272 Status = AcpiEvaluateObject (NULL, METHOD_NAME__GTS, &ArgList, NULL); |
260 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 261 { 262 return_ACPI_STATUS (Status); 263 } 264 | 273 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 274 { 275 return_ACPI_STATUS (Status); 276 } 277 |
278 /* Setup the argument to _SST */ 279 280 switch (SleepState) 281 { 282 case ACPI_STATE_S0: 283 Arg.Integer.Value = ACPI_SST_WORKING; 284 break; 285 286 case ACPI_STATE_S1: 287 case ACPI_STATE_S2: 288 case ACPI_STATE_S3: 289 Arg.Integer.Value = ACPI_SST_SLEEPING; 290 break; 291 292 case ACPI_STATE_S4: 293 Arg.Integer.Value = ACPI_SST_SLEEP_CONTEXT; 294 break; 295 296 default: 297 Arg.Integer.Value = ACPI_SST_INDICATOR_OFF; /* Default is indicator off */ 298 break; 299 } 300 |
|
265 /* Set the system indicators to show the desired sleep state. */ 266 | 301 /* Set the system indicators to show the desired sleep state. */ 302 |
267 Status = AcpiEvaluateObject (NULL, "\\_SI._SST", &ArgList, NULL); | 303 Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL); |
268 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 269 { 270 ACPI_REPORT_ERROR (("Method _SST failed, %s\n", AcpiFormatException (Status))); 271 } 272 273 return_ACPI_STATUS (AE_OK); 274} 275 --- 57 unchanged lines hidden (view full) --- 333 334 Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_DO_NOT_LOCK); 335 if (ACPI_FAILURE (Status)) 336 { 337 return_ACPI_STATUS (Status); 338 } 339 } 340 | 304 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 305 { 306 ACPI_REPORT_ERROR (("Method _SST failed, %s\n", AcpiFormatException (Status))); 307 } 308 309 return_ACPI_STATUS (AE_OK); 310} 311 --- 57 unchanged lines hidden (view full) --- 369 370 Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_DO_NOT_LOCK); 371 if (ACPI_FAILURE (Status)) 372 { 373 return_ACPI_STATUS (Status); 374 } 375 } 376 |
341 Status = AcpiHwDisableNonWakeupGpes(); | 377 Status = AcpiHwDisableNonWakeupGpes (); |
342 if (ACPI_FAILURE (Status)) 343 { 344 return_ACPI_STATUS (Status); 345 } 346 347 /* Get current value of PM1A control */ 348 349 Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_CONTROL, &PM1AControl); --- 8 unchanged lines hidden (view full) --- 358 PM1AControl &= ~(SleepTypeRegInfo->AccessBitMask | SleepEnableRegInfo->AccessBitMask); 359 PM1BControl = PM1AControl; 360 361 /* Insert SLP_TYP bits */ 362 363 PM1AControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition); 364 PM1BControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition); 365 | 378 if (ACPI_FAILURE (Status)) 379 { 380 return_ACPI_STATUS (Status); 381 } 382 383 /* Get current value of PM1A control */ 384 385 Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_CONTROL, &PM1AControl); --- 8 unchanged lines hidden (view full) --- 394 PM1AControl &= ~(SleepTypeRegInfo->AccessBitMask | SleepEnableRegInfo->AccessBitMask); 395 PM1BControl = PM1AControl; 396 397 /* Insert SLP_TYP bits */ 398 399 PM1AControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition); 400 PM1BControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition); 401 |
402 /* 403 * We split the writes of SLP_TYP and SLP_EN to workaround 404 * poorly implemented hardware. 405 */ 406 |
|
366 /* Write #1: fill in SLP_TYP data */ 367 368 Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1A_CONTROL, PM1AControl); 369 if (ACPI_FAILURE (Status)) 370 { 371 return_ACPI_STATUS (Status); 372 } 373 --- 28 unchanged lines hidden (view full) --- 402 { 403 /* 404 * We wanted to sleep > S3, but it didn't happen (by virtue of the fact that 405 * we are still executing!) 406 * 407 * Wait ten seconds, then try again. This is to get S4/S5 to work on all machines. 408 * 409 * We wait so long to allow chipsets that poll this reg very slowly to | 407 /* Write #1: fill in SLP_TYP data */ 408 409 Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1A_CONTROL, PM1AControl); 410 if (ACPI_FAILURE (Status)) 411 { 412 return_ACPI_STATUS (Status); 413 } 414 --- 28 unchanged lines hidden (view full) --- 443 { 444 /* 445 * We wanted to sleep > S3, but it didn't happen (by virtue of the fact that 446 * we are still executing!) 447 * 448 * Wait ten seconds, then try again. This is to get S4/S5 to work on all machines. 449 * 450 * We wait so long to allow chipsets that poll this reg very slowly to |
410 * still read the right value. Ideally, this entire block would go | 451 * still read the right value. Ideally, this block would go |
411 * away entirely. 412 */ 413 AcpiOsStall (10000000); 414 415 Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_CONTROL, 416 SleepEnableRegInfo->AccessBitMask); 417 if (ACPI_FAILURE (Status)) 418 { --- 38 unchanged lines hidden (view full) --- 457{ 458 UINT32 InValue; 459 ACPI_STATUS Status; 460 461 462 ACPI_FUNCTION_TRACE ("AcpiEnterSleepStateS4bios"); 463 464 | 452 * away entirely. 453 */ 454 AcpiOsStall (10000000); 455 456 Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_CONTROL, 457 SleepEnableRegInfo->AccessBitMask); 458 if (ACPI_FAILURE (Status)) 459 { --- 38 unchanged lines hidden (view full) --- 498{ 499 UINT32 InValue; 500 ACPI_STATUS Status; 501 502 503 ACPI_FUNCTION_TRACE ("AcpiEnterSleepStateS4bios"); 504 505 |
465 AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK); 466 AcpiHwClearAcpiStatus(ACPI_MTX_DO_NOT_LOCK); | 506 Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK); 507 if (ACPI_FAILURE (Status)) 508 { 509 return_ACPI_STATUS (Status); 510 } |
467 | 511 |
468 AcpiHwDisableNonWakeupGpes(); | 512 Status = AcpiHwClearAcpiStatus (ACPI_MTX_DO_NOT_LOCK); 513 if (ACPI_FAILURE (Status)) 514 { 515 return_ACPI_STATUS (Status); 516 } |
469 | 517 |
470 ACPI_FLUSH_CPU_CACHE(); | 518 Status = AcpiHwDisableNonWakeupGpes (); 519 if (ACPI_FAILURE (Status)) 520 { 521 return_ACPI_STATUS (Status); 522 } |
471 | 523 |
524 ACPI_FLUSH_CPU_CACHE (); 525 |
|
472 Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, (UINT32) AcpiGbl_FADT->S4BiosReq, 8); 473 474 do { 475 AcpiOsStall(1000); 476 Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue, ACPI_MTX_DO_NOT_LOCK); 477 if (ACPI_FAILURE (Status)) 478 { 479 return_ACPI_STATUS (Status); --- 20 unchanged lines hidden (view full) --- 500AcpiLeaveSleepState ( 501 UINT8 SleepState) 502{ 503 ACPI_OBJECT_LIST ArgList; 504 ACPI_OBJECT Arg; 505 ACPI_STATUS Status; 506 ACPI_BIT_REGISTER_INFO *SleepTypeRegInfo; 507 ACPI_BIT_REGISTER_INFO *SleepEnableRegInfo; | 526 Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, (UINT32) AcpiGbl_FADT->S4BiosReq, 8); 527 528 do { 529 AcpiOsStall(1000); 530 Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue, ACPI_MTX_DO_NOT_LOCK); 531 if (ACPI_FAILURE (Status)) 532 { 533 return_ACPI_STATUS (Status); --- 20 unchanged lines hidden (view full) --- 554AcpiLeaveSleepState ( 555 UINT8 SleepState) 556{ 557 ACPI_OBJECT_LIST ArgList; 558 ACPI_OBJECT Arg; 559 ACPI_STATUS Status; 560 ACPI_BIT_REGISTER_INFO *SleepTypeRegInfo; 561 ACPI_BIT_REGISTER_INFO *SleepEnableRegInfo; |
508 UINT32 PM1xControl; | 562 UINT32 PM1AControl; 563 UINT32 PM1BControl; |
509 510 511 ACPI_FUNCTION_TRACE ("AcpiLeaveSleepState"); 512 | 564 565 566 ACPI_FUNCTION_TRACE ("AcpiLeaveSleepState"); 567 |
513 /* Some machines require SLP_TYPE and SLP_EN to be cleared */ | |
514 | 568 |
515 SleepTypeRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE_A); 516 SleepEnableRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE); 517 518 /* Get current value of PM1A control */ 519 520 Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, 521 ACPI_REGISTER_PM1_CONTROL, &PM1xControl); | 569 /* 570 * Set SLP_TYPE and SLP_EN to state S0. 571 * This is unclear from the ACPI Spec, but it is required 572 * by some machines. 573 */ 574 Status = AcpiGetSleepTypeData (ACPI_STATE_S0, 575 &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB); |
522 if (ACPI_SUCCESS (Status)) 523 { | 576 if (ACPI_SUCCESS (Status)) 577 { |
524 /* Clear SLP_TYP and SLP_EN */ | 578 SleepTypeRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE_A); 579 SleepEnableRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE); |
525 | 580 |
526 PM1xControl &= ~(SleepTypeRegInfo->AccessBitMask | 527 SleepEnableRegInfo->AccessBitMask); | 581 /* Get current value of PM1A control */ |
528 | 582 |
529 AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, 530 ACPI_REGISTER_PM1A_CONTROL, PM1xControl); 531 AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, 532 ACPI_REGISTER_PM1B_CONTROL, PM1xControl); | 583 Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, 584 ACPI_REGISTER_PM1_CONTROL, &PM1AControl); 585 if (ACPI_SUCCESS (Status)) 586 { 587 /* Clear SLP_EN and SLP_TYP fields */ 588 589 PM1AControl &= ~(SleepTypeRegInfo->AccessBitMask | 590 SleepEnableRegInfo->AccessBitMask); 591 PM1BControl = PM1AControl; 592 593 /* Insert SLP_TYP bits */ 594 595 PM1AControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition); 596 PM1BControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition); 597 598 /* Just ignore any errors */ 599 600 (void) AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, 601 ACPI_REGISTER_PM1A_CONTROL, PM1AControl); 602 (void) AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, 603 ACPI_REGISTER_PM1B_CONTROL, PM1BControl); 604 } |
533 } 534 535 /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */ 536 537 AcpiGbl_SleepTypeA = ACPI_SLEEP_TYPE_INVALID; 538 539 /* Setup parameter object */ 540 541 ArgList.Count = 1; 542 ArgList.Pointer = &Arg; 543 Arg.Type = ACPI_TYPE_INTEGER; 544 545 /* Ignore any errors from these methods */ 546 | 605 } 606 607 /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */ 608 609 AcpiGbl_SleepTypeA = ACPI_SLEEP_TYPE_INVALID; 610 611 /* Setup parameter object */ 612 613 ArgList.Count = 1; 614 ArgList.Pointer = &Arg; 615 Arg.Type = ACPI_TYPE_INTEGER; 616 617 /* Ignore any errors from these methods */ 618 |
547 Arg.Integer.Value = 0; 548 Status = AcpiEvaluateObject (NULL, "\\_SI._SST", &ArgList, NULL); | 619 Arg.Integer.Value = ACPI_SST_WAKING; 620 Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL); |
549 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 550 { 551 ACPI_REPORT_ERROR (("Method _SST failed, %s\n", AcpiFormatException (Status))); 552 } 553 554 Arg.Integer.Value = SleepState; | 621 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 622 { 623 ACPI_REPORT_ERROR (("Method _SST failed, %s\n", AcpiFormatException (Status))); 624 } 625 626 Arg.Integer.Value = SleepState; |
555 Status = AcpiEvaluateObject (NULL, "\\_BFS", &ArgList, NULL); | 627 Status = AcpiEvaluateObject (NULL, METHOD_NAME__BFS, &ArgList, NULL); |
556 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 557 { 558 ACPI_REPORT_ERROR (("Method _BFS failed, %s\n", AcpiFormatException (Status))); 559 } 560 | 628 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 629 { 630 ACPI_REPORT_ERROR (("Method _BFS failed, %s\n", AcpiFormatException (Status))); 631 } 632 |
561 Status = AcpiEvaluateObject (NULL, "\\_WAK", &ArgList, NULL); | 633 Status = AcpiEvaluateObject (NULL, METHOD_NAME__WAK, &ArgList, NULL); |
562 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 563 { 564 ACPI_REPORT_ERROR (("Method _WAK failed, %s\n", AcpiFormatException (Status))); 565 } 566 567 /* _WAK returns stuff - do we want to look at it? */ 568 | 634 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 635 { 636 ACPI_REPORT_ERROR (("Method _WAK failed, %s\n", AcpiFormatException (Status))); 637 } 638 639 /* _WAK returns stuff - do we want to look at it? */ 640 |
569 Status = AcpiHwEnableNonWakeupGpes(); | 641 Status = AcpiHwEnableNonWakeupGpes (); |
570 if (ACPI_FAILURE (Status)) 571 { 572 return_ACPI_STATUS (Status); 573 } 574 | 642 if (ACPI_FAILURE (Status)) 643 { 644 return_ACPI_STATUS (Status); 645 } 646 |
647 /* Enable power button */ 648 649 AcpiSetRegister(AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].EnableRegisterId, 650 1, ACPI_MTX_DO_NOT_LOCK); 651 AcpiSetRegister(AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId, 652 1, ACPI_MTX_DO_NOT_LOCK); 653 |
|
575 /* Enable BM arbitration */ 576 577 Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK); | 654 /* Enable BM arbitration */ 655 656 Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK); |
657 if (ACPI_FAILURE (Status)) 658 { 659 return_ACPI_STATUS (Status); 660 } 661 662 Arg.Integer.Value = ACPI_SST_WORKING; 663 Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL); 664 if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 665 { 666 ACPI_REPORT_ERROR (("Method _SST failed, %s\n", AcpiFormatException (Status))); 667 } 668 |
|
578 return_ACPI_STATUS (Status); 579} | 669 return_ACPI_STATUS (Status); 670} |