hwsleep.c revision 114237
171867Smsmith 271867Smsmith/****************************************************************************** 371867Smsmith * 471867Smsmith * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface 5114237Snjl * $Revision: 52 $ 671867Smsmith * 771867Smsmith *****************************************************************************/ 871867Smsmith 971867Smsmith/****************************************************************************** 1071867Smsmith * 1171867Smsmith * 1. Copyright Notice 1271867Smsmith * 13114237Snjl * Some or all of this work - Copyright (c) 1999 - 2003, Intel Corp. 1471867Smsmith * All rights reserved. 1571867Smsmith * 1671867Smsmith * 2. License 1771867Smsmith * 1871867Smsmith * 2.1. This is your license from Intel Corp. under its intellectual property 1971867Smsmith * rights. You may have additional license terms from the party that provided 2071867Smsmith * you this software, covering your right to use that party's intellectual 2171867Smsmith * property rights. 2271867Smsmith * 2371867Smsmith * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 2471867Smsmith * copy of the source code appearing in this file ("Covered Code") an 2571867Smsmith * irrevocable, perpetual, worldwide license under Intel's copyrights in the 2671867Smsmith * base code distributed originally by Intel ("Original Intel Code") to copy, 2771867Smsmith * make derivatives, distribute, use and display any portion of the Covered 2871867Smsmith * Code in any form, with the right to sublicense such rights; and 2971867Smsmith * 3071867Smsmith * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 3171867Smsmith * license (with the right to sublicense), under only those claims of Intel 3271867Smsmith * patents that are infringed by the Original Intel Code, to make, use, sell, 3371867Smsmith * offer to sell, and import the Covered Code and derivative works thereof 3471867Smsmith * solely to the minimum extent necessary to exercise the above copyright 3571867Smsmith * license, and in no event shall the patent license extend to any additions 3671867Smsmith * to or modifications of the Original Intel Code. No other license or right 3771867Smsmith * is granted directly or by implication, estoppel or otherwise; 3871867Smsmith * 3971867Smsmith * The above copyright and patent license is granted only if the following 4071867Smsmith * conditions are met: 4171867Smsmith * 4271867Smsmith * 3. Conditions 4371867Smsmith * 4471867Smsmith * 3.1. Redistribution of Source with Rights to Further Distribute Source. 4571867Smsmith * Redistribution of source code of any substantial portion of the Covered 4671867Smsmith * Code or modification with rights to further distribute source must include 4771867Smsmith * the above Copyright Notice, the above License, this list of Conditions, 4871867Smsmith * and the following Disclaimer and Export Compliance provision. In addition, 4971867Smsmith * Licensee must cause all Covered Code to which Licensee contributes to 5071867Smsmith * contain a file documenting the changes Licensee made to create that Covered 5171867Smsmith * Code and the date of any change. Licensee must include in that file the 5271867Smsmith * documentation of any changes made by any predecessor Licensee. Licensee 5371867Smsmith * must include a prominent statement that the modification is derived, 5471867Smsmith * directly or indirectly, from Original Intel Code. 5571867Smsmith * 5671867Smsmith * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 5771867Smsmith * Redistribution of source code of any substantial portion of the Covered 5871867Smsmith * Code or modification without rights to further distribute source must 5971867Smsmith * include the following Disclaimer and Export Compliance provision in the 6071867Smsmith * documentation and/or other materials provided with distribution. In 6171867Smsmith * addition, Licensee may not authorize further sublicense of source of any 6271867Smsmith * portion of the Covered Code, and must include terms to the effect that the 6371867Smsmith * license from Licensee to its licensee is limited to the intellectual 6471867Smsmith * property embodied in the software Licensee provides to its licensee, and 6571867Smsmith * not to intellectual property embodied in modifications its licensee may 6671867Smsmith * make. 6771867Smsmith * 6871867Smsmith * 3.3. Redistribution of Executable. Redistribution in executable form of any 6971867Smsmith * substantial portion of the Covered Code or modification must reproduce the 7071867Smsmith * above Copyright Notice, and the following Disclaimer and Export Compliance 7171867Smsmith * provision in the documentation and/or other materials provided with the 7271867Smsmith * distribution. 7371867Smsmith * 7471867Smsmith * 3.4. Intel retains all right, title, and interest in and to the Original 7571867Smsmith * Intel Code. 7671867Smsmith * 7771867Smsmith * 3.5. Neither the name Intel nor any other trademark owned or controlled by 7871867Smsmith * Intel shall be used in advertising or otherwise to promote the sale, use or 7971867Smsmith * other dealings in products derived from or relating to the Covered Code 8071867Smsmith * without prior written authorization from Intel. 8171867Smsmith * 8271867Smsmith * 4. Disclaimer and Export Compliance 8371867Smsmith * 8471867Smsmith * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 8571867Smsmith * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 8671867Smsmith * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 8771867Smsmith * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 8871867Smsmith * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 8971867Smsmith * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 9071867Smsmith * PARTICULAR PURPOSE. 9171867Smsmith * 9271867Smsmith * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 9371867Smsmith * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 9471867Smsmith * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 9571867Smsmith * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 9671867Smsmith * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 9771867Smsmith * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 9871867Smsmith * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 9971867Smsmith * LIMITED REMEDY. 10071867Smsmith * 10171867Smsmith * 4.3. Licensee shall not export, either directly or indirectly, any of this 10271867Smsmith * software or system incorporating such software without first obtaining any 10371867Smsmith * required license or other approval from the U. S. Department of Commerce or 10471867Smsmith * any other agency or department of the United States Government. In the 10571867Smsmith * event Licensee exports any such software from the United States or 10671867Smsmith * re-exports any such software from a foreign destination, Licensee shall 10771867Smsmith * ensure that the distribution and export/re-export of the software is in 10871867Smsmith * compliance with all laws, regulations, orders, or other restrictions of the 10971867Smsmith * U.S. Export Administration Regulations. Licensee agrees that neither it nor 11071867Smsmith * any of its subsidiaries will export/re-export any technical data, process, 11171867Smsmith * software, or service, directly or indirectly, to any country for which the 11271867Smsmith * United States government or any agency thereof requires an export license, 11371867Smsmith * other governmental approval, or letter of assurance, without first obtaining 11471867Smsmith * such license, approval or letter. 11571867Smsmith * 11671867Smsmith *****************************************************************************/ 11771867Smsmith 11871867Smsmith#include "acpi.h" 11971867Smsmith 12077424Smsmith#define _COMPONENT ACPI_HARDWARE 12191116Smsmith ACPI_MODULE_NAME ("hwsleep") 12271867Smsmith 12371867Smsmith 12471867Smsmith/****************************************************************************** 12571867Smsmith * 12671867Smsmith * FUNCTION: AcpiSetFirmwareWakingVector 12771867Smsmith * 12871867Smsmith * PARAMETERS: PhysicalAddress - Physical address of ACPI real mode 12971867Smsmith * entry point. 13071867Smsmith * 13191116Smsmith * RETURN: Status 13271867Smsmith * 13371867Smsmith * DESCRIPTION: Access function for dFirmwareWakingVector field in FACS 13471867Smsmith * 13571867Smsmith ******************************************************************************/ 13671867Smsmith 13771867SmsmithACPI_STATUS 13871867SmsmithAcpiSetFirmwareWakingVector ( 13971867Smsmith ACPI_PHYSICAL_ADDRESS PhysicalAddress) 14071867Smsmith{ 14171867Smsmith 14291116Smsmith ACPI_FUNCTION_TRACE ("AcpiSetFirmwareWakingVector"); 14371867Smsmith 14471867Smsmith 14571867Smsmith /* Set the vector */ 14671867Smsmith 14791116Smsmith if (AcpiGbl_CommonFACS.VectorWidth == 32) 14871867Smsmith { 149102550Siwasaki *(ACPI_CAST_PTR (UINT32, AcpiGbl_CommonFACS.FirmwareWakingVector)) 15099679Siwasaki = (UINT32) PhysicalAddress; 15171867Smsmith } 15271867Smsmith else 15371867Smsmith { 154102550Siwasaki *AcpiGbl_CommonFACS.FirmwareWakingVector 15599679Siwasaki = PhysicalAddress; 15671867Smsmith } 15771867Smsmith 15871867Smsmith return_ACPI_STATUS (AE_OK); 15971867Smsmith} 16071867Smsmith 16171867Smsmith 16271867Smsmith/****************************************************************************** 16371867Smsmith * 16471867Smsmith * FUNCTION: AcpiGetFirmwareWakingVector 16571867Smsmith * 16671867Smsmith * PARAMETERS: *PhysicalAddress - Output buffer where contents of 16771867Smsmith * the FirmwareWakingVector field of 16871867Smsmith * the FACS will be stored. 16971867Smsmith * 17071867Smsmith * RETURN: Status 17171867Smsmith * 17291116Smsmith * DESCRIPTION: Access function for FirmwareWakingVector field in FACS 17371867Smsmith * 17471867Smsmith ******************************************************************************/ 17571867Smsmith 17671867SmsmithACPI_STATUS 17771867SmsmithAcpiGetFirmwareWakingVector ( 17871867Smsmith ACPI_PHYSICAL_ADDRESS *PhysicalAddress) 17971867Smsmith{ 18071867Smsmith 18191116Smsmith ACPI_FUNCTION_TRACE ("AcpiGetFirmwareWakingVector"); 18271867Smsmith 18371867Smsmith 18471867Smsmith if (!PhysicalAddress) 18571867Smsmith { 18671867Smsmith return_ACPI_STATUS (AE_BAD_PARAMETER); 18771867Smsmith } 18871867Smsmith 18971867Smsmith /* Get the vector */ 19071867Smsmith 19191116Smsmith if (AcpiGbl_CommonFACS.VectorWidth == 32) 19271867Smsmith { 193102550Siwasaki *PhysicalAddress = (ACPI_PHYSICAL_ADDRESS) 19499679Siwasaki *(ACPI_CAST_PTR (UINT32, AcpiGbl_CommonFACS.FirmwareWakingVector)); 19571867Smsmith } 19671867Smsmith else 19771867Smsmith { 198102550Siwasaki *PhysicalAddress = 19999679Siwasaki *AcpiGbl_CommonFACS.FirmwareWakingVector; 20071867Smsmith } 20171867Smsmith 20271867Smsmith return_ACPI_STATUS (AE_OK); 20371867Smsmith} 20471867Smsmith 20587031Smsmith 20671867Smsmith/****************************************************************************** 20771867Smsmith * 20887031Smsmith * FUNCTION: AcpiEnterSleepStatePrep 20971867Smsmith * 21071867Smsmith * PARAMETERS: SleepState - Which sleep state to enter 21171867Smsmith * 21271867Smsmith * RETURN: Status 21371867Smsmith * 21487031Smsmith * DESCRIPTION: Prepare to enter a system sleep state (see ACPI 2.0 spec p 231) 21587031Smsmith * This function must execute with interrupts enabled. 21687031Smsmith * We break sleeping into 2 stages so that OSPM can handle 21787031Smsmith * various OS-specific tasks between the two steps. 21871867Smsmith * 21971867Smsmith ******************************************************************************/ 22071867Smsmith 22171867SmsmithACPI_STATUS 22287031SmsmithAcpiEnterSleepStatePrep ( 22377424Smsmith UINT8 SleepState) 22471867Smsmith{ 22577424Smsmith ACPI_STATUS Status; 22677424Smsmith ACPI_OBJECT_LIST ArgList; 22777424Smsmith ACPI_OBJECT Arg; 22871867Smsmith 22977424Smsmith 23091116Smsmith ACPI_FUNCTION_TRACE ("AcpiEnterSleepStatePrep"); 23191116Smsmith 23291116Smsmith 23371867Smsmith /* 23471867Smsmith * _PSW methods could be run here to enable wake-on keyboard, LAN, etc. 23571867Smsmith */ 23699679Siwasaki Status = AcpiGetSleepTypeData (SleepState, 23791116Smsmith &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB); 23891116Smsmith if (ACPI_FAILURE (Status)) 23971867Smsmith { 24087031Smsmith return_ACPI_STATUS (Status); 24171867Smsmith } 24271867Smsmith 24391116Smsmith /* Setup parameter object */ 24477424Smsmith 24571867Smsmith ArgList.Count = 1; 24671867Smsmith ArgList.Pointer = &Arg; 24771867Smsmith 24871867Smsmith Arg.Type = ACPI_TYPE_INTEGER; 24971867Smsmith Arg.Integer.Value = SleepState; 25071867Smsmith 25191116Smsmith /* Run the _PTS and _GTS methods */ 25277424Smsmith 25391116Smsmith Status = AcpiEvaluateObject (NULL, "\\_PTS", &ArgList, NULL); 25491116Smsmith if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 25591116Smsmith { 25691116Smsmith return_ACPI_STATUS (Status); 25791116Smsmith } 25891116Smsmith 25991116Smsmith Status = AcpiEvaluateObject (NULL, "\\_GTS", &ArgList, NULL); 26091116Smsmith if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 26191116Smsmith { 26291116Smsmith return_ACPI_STATUS (Status); 26391116Smsmith } 26491116Smsmith 26587031Smsmith return_ACPI_STATUS (AE_OK); 26687031Smsmith} 26787031Smsmith 26887031Smsmith 26987031Smsmith/****************************************************************************** 27087031Smsmith * 27187031Smsmith * FUNCTION: AcpiEnterSleepState 27287031Smsmith * 27387031Smsmith * PARAMETERS: SleepState - Which sleep state to enter 27487031Smsmith * 27587031Smsmith * RETURN: Status 27687031Smsmith * 27787031Smsmith * DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231) 27887031Smsmith * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED 27987031Smsmith * 28087031Smsmith ******************************************************************************/ 28187031Smsmith 28287031SmsmithACPI_STATUS 28387031SmsmithAcpiEnterSleepState ( 28491116Smsmith UINT8 SleepState) 28587031Smsmith{ 28699679Siwasaki UINT32 PM1AControl; 28799679Siwasaki UINT32 PM1BControl; 28891116Smsmith ACPI_BIT_REGISTER_INFO *SleepTypeRegInfo; 28991116Smsmith ACPI_BIT_REGISTER_INFO *SleepEnableRegInfo; 29099679Siwasaki UINT32 InValue; 29199679Siwasaki ACPI_STATUS Status; 29287031Smsmith 29387031Smsmith 29491116Smsmith ACPI_FUNCTION_TRACE ("AcpiEnterSleepState"); 29587031Smsmith 29691116Smsmith 29791116Smsmith if ((AcpiGbl_SleepTypeA > ACPI_SLEEP_TYPE_MAX) || 29891116Smsmith (AcpiGbl_SleepTypeB > ACPI_SLEEP_TYPE_MAX)) 29987031Smsmith { 30099679Siwasaki ACPI_REPORT_ERROR (("Sleep values out of range: A=%X B=%X\n", 30191116Smsmith AcpiGbl_SleepTypeA, AcpiGbl_SleepTypeB)); 30291116Smsmith return_ACPI_STATUS (AE_AML_OPERAND_VALUE); 30387031Smsmith } 30487031Smsmith 30577424Smsmith 30691116Smsmith SleepTypeRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE_A); 30791116Smsmith SleepEnableRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE); 30871867Smsmith 30991116Smsmith /* Clear wake status */ 31091116Smsmith 31199679Siwasaki Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_LOCK); 31299679Siwasaki if (ACPI_FAILURE (Status)) 31399679Siwasaki { 31499679Siwasaki return_ACPI_STATUS (Status); 31599679Siwasaki } 31678986Smsmith 31799679Siwasaki Status = AcpiHwClearAcpiStatus(); 31899679Siwasaki if (ACPI_FAILURE (Status)) 31999679Siwasaki { 32099679Siwasaki return_ACPI_STATUS (Status); 32199679Siwasaki } 32287031Smsmith 32399679Siwasaki /* Disable BM arbitration */ 32471867Smsmith 32599679Siwasaki Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_LOCK); 32699679Siwasaki if (ACPI_FAILURE (Status)) 32799679Siwasaki { 32899679Siwasaki return_ACPI_STATUS (Status); 32999679Siwasaki } 33099679Siwasaki 33199679Siwasaki Status = AcpiHwDisableNonWakeupGpes(); 33299679Siwasaki if (ACPI_FAILURE (Status)) 33399679Siwasaki { 33499679Siwasaki return_ACPI_STATUS (Status); 33599679Siwasaki } 33699679Siwasaki 33791116Smsmith /* Get current value of PM1A control */ 33878986Smsmith 339114237Snjl Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_CONTROL, &PM1AControl); 34099679Siwasaki if (ACPI_FAILURE (Status)) 34199679Siwasaki { 34299679Siwasaki return_ACPI_STATUS (Status); 34399679Siwasaki } 344114237Snjl ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "Entering sleep state [S%d]\n", SleepState)); 34582367Smsmith 34691116Smsmith /* Clear SLP_EN and SLP_TYP fields */ 34782367Smsmith 34891116Smsmith PM1AControl &= ~(SleepTypeRegInfo->AccessBitMask | SleepEnableRegInfo->AccessBitMask); 34971867Smsmith PM1BControl = PM1AControl; 35071867Smsmith 35191116Smsmith /* Insert SLP_TYP bits */ 35282367Smsmith 35391116Smsmith PM1AControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition); 35491116Smsmith PM1BControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition); 35571867Smsmith 35691116Smsmith /* Write #1: fill in SLP_TYP data */ 35771867Smsmith 358114237Snjl Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1A_CONTROL, PM1AControl); 35999679Siwasaki if (ACPI_FAILURE (Status)) 36099679Siwasaki { 36199679Siwasaki return_ACPI_STATUS (Status); 36299679Siwasaki } 36382367Smsmith 364114237Snjl Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1B_CONTROL, PM1BControl); 36599679Siwasaki if (ACPI_FAILURE (Status)) 36699679Siwasaki { 36799679Siwasaki return_ACPI_STATUS (Status); 36899679Siwasaki } 36999679Siwasaki 37091116Smsmith /* Insert SLP_ENABLE bit */ 37182367Smsmith 37291116Smsmith PM1AControl |= SleepEnableRegInfo->AccessBitMask; 37391116Smsmith PM1BControl |= SleepEnableRegInfo->AccessBitMask; 37471867Smsmith 37591116Smsmith /* Write #2: SLP_TYP + SLP_EN */ 37671867Smsmith 37799679Siwasaki ACPI_FLUSH_CPU_CACHE (); 37880062Smsmith 379114237Snjl Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1A_CONTROL, PM1AControl); 38099679Siwasaki if (ACPI_FAILURE (Status)) 38199679Siwasaki { 38299679Siwasaki return_ACPI_STATUS (Status); 38399679Siwasaki } 38499679Siwasaki 385114237Snjl Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1B_CONTROL, PM1BControl); 38699679Siwasaki if (ACPI_FAILURE (Status)) 38799679Siwasaki { 38899679Siwasaki return_ACPI_STATUS (Status); 38999679Siwasaki } 39099679Siwasaki 39183174Smsmith /* 39282367Smsmith * Wait a second, then try again. This is to get S4/5 to work on all machines. 39382367Smsmith */ 39482367Smsmith if (SleepState > ACPI_STATE_S3) 39582367Smsmith { 39699679Siwasaki /* 39799679Siwasaki * We wait so long to allow chipsets that poll this reg very slowly to 39899679Siwasaki * still read the right value. Ideally, this entire block would go 39999679Siwasaki * away entirely. 40099679Siwasaki */ 40199679Siwasaki AcpiOsStall (10000000); 40282367Smsmith 403114237Snjl Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_CONTROL, 40499679Siwasaki SleepEnableRegInfo->AccessBitMask); 40599679Siwasaki if (ACPI_FAILURE (Status)) 40699679Siwasaki { 40799679Siwasaki return_ACPI_STATUS (Status); 40899679Siwasaki } 40980357Speter } 41080062Smsmith 41191116Smsmith /* Wait until we enter sleep state */ 41271867Smsmith 413102550Siwasaki do 41483174Smsmith { 415114237Snjl Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue, ACPI_MTX_DO_NOT_LOCK); 41699679Siwasaki if (ACPI_FAILURE (Status)) 41799679Siwasaki { 41899679Siwasaki return_ACPI_STATUS (Status); 41999679Siwasaki } 42099679Siwasaki 42191116Smsmith /* Spin until we wake */ 42282367Smsmith 42399679Siwasaki } while (!InValue); 42499679Siwasaki 425114237Snjl Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_DO_NOT_LOCK); 426107325Siwasaki if (ACPI_FAILURE (Status)) 427107325Siwasaki { 428107325Siwasaki return_ACPI_STATUS (Status); 429107325Siwasaki } 430107325Siwasaki 43171867Smsmith return_ACPI_STATUS (AE_OK); 43271867Smsmith} 43382367Smsmith 434114237Snjl 43582367Smsmith/****************************************************************************** 43682367Smsmith * 437114237Snjl * FUNCTION: AcpiEnterSleepStateS4bios 438114237Snjl * 439114237Snjl * PARAMETERS: None 440114237Snjl * 441114237Snjl * RETURN: Status 442114237Snjl * 443114237Snjl * DESCRIPTION: Perform a S4 bios request. 444114237Snjl * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED 445114237Snjl * 446114237Snjl ******************************************************************************/ 447114237Snjl 448114237SnjlACPI_STATUS 449114237SnjlAcpiEnterSleepStateS4bios ( 450114237Snjl void) 451114237Snjl{ 452114237Snjl UINT32 InValue; 453114237Snjl ACPI_STATUS Status; 454114237Snjl 455114237Snjl 456114237Snjl ACPI_FUNCTION_TRACE ("AcpiEnterSleepStateS4bios"); 457114237Snjl 458114237Snjl AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK); 459114237Snjl AcpiHwClearAcpiStatus(); 460114237Snjl 461114237Snjl AcpiHwDisableNonWakeupGpes(); 462114237Snjl 463114237Snjl ACPI_FLUSH_CPU_CACHE(); 464114237Snjl 465114237Snjl Status = AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, (ACPI_INTEGER) AcpiGbl_FADT->S4BiosReq, 8); 466114237Snjl 467114237Snjl do { 468114237Snjl AcpiOsStall(1000); 469114237Snjl Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue, ACPI_MTX_DO_NOT_LOCK); 470114237Snjl if (ACPI_FAILURE (Status)) 471114237Snjl { 472114237Snjl return_ACPI_STATUS (Status); 473114237Snjl } 474114237Snjl } while (!InValue); 475114237Snjl 476114237Snjl return_ACPI_STATUS (AE_OK); 477114237Snjl} 478114237Snjl 479114237Snjl 480114237Snjl/****************************************************************************** 481114237Snjl * 48282367Smsmith * FUNCTION: AcpiLeaveSleepState 48382367Smsmith * 48482367Smsmith * PARAMETERS: SleepState - Which sleep state we just exited 48582367Smsmith * 48682367Smsmith * RETURN: Status 48782367Smsmith * 48882367Smsmith * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep 48982367Smsmith * 49082367Smsmith ******************************************************************************/ 49182367Smsmith 49282367SmsmithACPI_STATUS 49382367SmsmithAcpiLeaveSleepState ( 49482367Smsmith UINT8 SleepState) 49582367Smsmith{ 49682367Smsmith ACPI_OBJECT_LIST ArgList; 49782367Smsmith ACPI_OBJECT Arg; 49891116Smsmith ACPI_STATUS Status; 49982367Smsmith 50083174Smsmith 50191116Smsmith ACPI_FUNCTION_TRACE ("AcpiLeaveSleepState"); 50282367Smsmith 50391116Smsmith 50487031Smsmith /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */ 50582367Smsmith 50691116Smsmith AcpiGbl_SleepTypeA = ACPI_SLEEP_TYPE_INVALID; 50791116Smsmith 50891116Smsmith /* Setup parameter object */ 50991116Smsmith 51082367Smsmith ArgList.Count = 1; 51182367Smsmith ArgList.Pointer = &Arg; 51282367Smsmith 51382367Smsmith Arg.Type = ACPI_TYPE_INTEGER; 51482367Smsmith Arg.Integer.Value = SleepState; 51582367Smsmith 51691116Smsmith /* Ignore any errors from these methods */ 51783174Smsmith 51891116Smsmith Status = AcpiEvaluateObject (NULL, "\\_BFS", &ArgList, NULL); 51991116Smsmith if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 52091116Smsmith { 52191116Smsmith ACPI_REPORT_ERROR (("Method _BFS failed, %s\n", AcpiFormatException (Status))); 52291116Smsmith } 52391116Smsmith 52491116Smsmith Status = AcpiEvaluateObject (NULL, "\\_WAK", &ArgList, NULL); 52591116Smsmith if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND) 52691116Smsmith { 52791116Smsmith ACPI_REPORT_ERROR (("Method _WAK failed, %s\n", AcpiFormatException (Status))); 52891116Smsmith } 52991116Smsmith 53082367Smsmith /* _WAK returns stuff - do we want to look at it? */ 53182367Smsmith 53299679Siwasaki Status = AcpiHwEnableNonWakeupGpes(); 53399679Siwasaki if (ACPI_FAILURE (Status)) 53499679Siwasaki { 53599679Siwasaki return_ACPI_STATUS (Status); 53699679Siwasaki } 53782367Smsmith 53899679Siwasaki /* Disable BM arbitration */ 53999679Siwasaki Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK); 54099679Siwasaki 54199679Siwasaki return_ACPI_STATUS (Status); 54282367Smsmith} 543