Deleted Added
full compact
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}