Home | History | Annotate | Line # | Download | only in hardware
hwxface.c revision 1.1.1.3
      1 /******************************************************************************
      2  *
      3  * Module Name: hwxface - Public ACPICA hardware interfaces
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2013, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #define EXPORT_ACPI_INTERFACES
     45 
     46 #include "acpi.h"
     47 #include "accommon.h"
     48 #include "acnamesp.h"
     49 
     50 #define _COMPONENT          ACPI_HARDWARE
     51         ACPI_MODULE_NAME    ("hwxface")
     52 
     53 
     54 /******************************************************************************
     55  *
     56  * FUNCTION:    AcpiReset
     57  *
     58  * PARAMETERS:  None
     59  *
     60  * RETURN:      Status
     61  *
     62  * DESCRIPTION: Set reset register in memory or IO space. Note: Does not
     63  *              support reset register in PCI config space, this must be
     64  *              handled separately.
     65  *
     66  ******************************************************************************/
     67 
     68 ACPI_STATUS
     69 AcpiReset (
     70     void)
     71 {
     72     ACPI_GENERIC_ADDRESS    *ResetReg;
     73     ACPI_STATUS             Status;
     74 
     75 
     76     ACPI_FUNCTION_TRACE (AcpiReset);
     77 
     78 
     79     ResetReg = &AcpiGbl_FADT.ResetRegister;
     80 
     81     /* Check if the reset register is supported */
     82 
     83     if (!(AcpiGbl_FADT.Flags & ACPI_FADT_RESET_REGISTER) ||
     84         !ResetReg->Address)
     85     {
     86         return_ACPI_STATUS (AE_NOT_EXIST);
     87     }
     88 
     89     if (ResetReg->SpaceId == ACPI_ADR_SPACE_SYSTEM_IO)
     90     {
     91         /*
     92          * For I/O space, write directly to the OSL. This bypasses the port
     93          * validation mechanism, which may block a valid write to the reset
     94          * register.
     95          *
     96          * NOTE:
     97          * The ACPI spec requires the reset register width to be 8, so we
     98          * hardcode it here and ignore the FADT value. This maintains
     99          * compatibility with other ACPI implementations that have allowed
    100          * BIOS code with bad register width values to go unnoticed.
    101          */
    102         Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) ResetReg->Address,
    103             AcpiGbl_FADT.ResetValue, ACPI_RESET_REGISTER_WIDTH);
    104     }
    105     else
    106     {
    107         /* Write the reset value to the reset register */
    108 
    109         Status = AcpiHwWrite (AcpiGbl_FADT.ResetValue, ResetReg);
    110     }
    111 
    112     return_ACPI_STATUS (Status);
    113 }
    114 
    115 ACPI_EXPORT_SYMBOL (AcpiReset)
    116 
    117 
    118 /******************************************************************************
    119  *
    120  * FUNCTION:    AcpiRead
    121  *
    122  * PARAMETERS:  Value               - Where the value is returned
    123  *              Reg                 - GAS register structure
    124  *
    125  * RETURN:      Status
    126  *
    127  * DESCRIPTION: Read from either memory or IO space.
    128  *
    129  * LIMITATIONS: <These limitations also apply to AcpiWrite>
    130  *      BitWidth must be exactly 8, 16, 32, or 64.
    131  *      SpaceID must be SystemMemory or SystemIO.
    132  *      BitOffset and AccessWidth are currently ignored, as there has
    133  *          not been a need to implement these.
    134  *
    135  ******************************************************************************/
    136 
    137 ACPI_STATUS
    138 AcpiRead (
    139     UINT64                  *ReturnValue,
    140     ACPI_GENERIC_ADDRESS    *Reg)
    141 {
    142     UINT32                  ValueLo;
    143     UINT32                  ValueHi;
    144     UINT32                  Width;
    145     UINT64                  Address;
    146     ACPI_STATUS             Status;
    147 
    148 
    149     ACPI_FUNCTION_NAME (AcpiRead);
    150 
    151 
    152     if (!ReturnValue)
    153     {
    154         return (AE_BAD_PARAMETER);
    155     }
    156 
    157     /* Validate contents of the GAS register. Allow 64-bit transfers */
    158 
    159     Status = AcpiHwValidateRegister (Reg, 64, &Address);
    160     if (ACPI_FAILURE (Status))
    161     {
    162         return (Status);
    163     }
    164 
    165     /*
    166      * Two address spaces supported: Memory or I/O. PCI_Config is
    167      * not supported here because the GAS structure is insufficient
    168      */
    169     if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
    170     {
    171         Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS)
    172                     Address, ReturnValue, Reg->BitWidth);
    173         if (ACPI_FAILURE (Status))
    174         {
    175             return (Status);
    176         }
    177     }
    178     else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
    179     {
    180         ValueLo = 0;
    181         ValueHi = 0;
    182 
    183         Width = Reg->BitWidth;
    184         if (Width == 64)
    185         {
    186             Width = 32; /* Break into two 32-bit transfers */
    187         }
    188 
    189         Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
    190                     Address, &ValueLo, Width);
    191         if (ACPI_FAILURE (Status))
    192         {
    193             return (Status);
    194         }
    195 
    196         if (Reg->BitWidth == 64)
    197         {
    198             /* Read the top 32 bits */
    199 
    200             Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
    201                         (Address + 4), &ValueHi, 32);
    202             if (ACPI_FAILURE (Status))
    203             {
    204                 return (Status);
    205             }
    206         }
    207 
    208         /* Set the return value only if status is AE_OK */
    209 
    210         *ReturnValue = (ValueLo | ((UINT64) ValueHi << 32));
    211     }
    212 
    213     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
    214         "Read:  %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
    215         ACPI_FORMAT_UINT64 (*ReturnValue), Reg->BitWidth,
    216         ACPI_FORMAT_UINT64 (Address),
    217         AcpiUtGetRegionName (Reg->SpaceId)));
    218 
    219     return (AE_OK);
    220 }
    221 
    222 ACPI_EXPORT_SYMBOL (AcpiRead)
    223 
    224 
    225 /******************************************************************************
    226  *
    227  * FUNCTION:    AcpiWrite
    228  *
    229  * PARAMETERS:  Value               - Value to be written
    230  *              Reg                 - GAS register structure
    231  *
    232  * RETURN:      Status
    233  *
    234  * DESCRIPTION: Write to either memory or IO space.
    235  *
    236  ******************************************************************************/
    237 
    238 ACPI_STATUS
    239 AcpiWrite (
    240     UINT64                  Value,
    241     ACPI_GENERIC_ADDRESS    *Reg)
    242 {
    243     UINT32                  Width;
    244     UINT64                  Address;
    245     ACPI_STATUS             Status;
    246 
    247 
    248     ACPI_FUNCTION_NAME (AcpiWrite);
    249 
    250 
    251     /* Validate contents of the GAS register. Allow 64-bit transfers */
    252 
    253     Status = AcpiHwValidateRegister (Reg, 64, &Address);
    254     if (ACPI_FAILURE (Status))
    255     {
    256         return (Status);
    257     }
    258 
    259     /*
    260      * Two address spaces supported: Memory or IO. PCI_Config is
    261      * not supported here because the GAS structure is insufficient
    262      */
    263     if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
    264     {
    265         Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS)
    266                     Address, Value, Reg->BitWidth);
    267         if (ACPI_FAILURE (Status))
    268         {
    269             return (Status);
    270         }
    271     }
    272     else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
    273     {
    274         Width = Reg->BitWidth;
    275         if (Width == 64)
    276         {
    277             Width = 32; /* Break into two 32-bit transfers */
    278         }
    279 
    280         Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
    281                     Address, ACPI_LODWORD (Value), Width);
    282         if (ACPI_FAILURE (Status))
    283         {
    284             return (Status);
    285         }
    286 
    287         if (Reg->BitWidth == 64)
    288         {
    289             Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
    290                         (Address + 4), ACPI_HIDWORD (Value), 32);
    291             if (ACPI_FAILURE (Status))
    292             {
    293                 return (Status);
    294             }
    295         }
    296     }
    297 
    298     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
    299         "Wrote: %8.8X%8.8X width %2d   to %8.8X%8.8X (%s)\n",
    300         ACPI_FORMAT_UINT64 (Value), Reg->BitWidth,
    301         ACPI_FORMAT_UINT64 (Address),
    302         AcpiUtGetRegionName (Reg->SpaceId)));
    303 
    304     return (Status);
    305 }
    306 
    307 ACPI_EXPORT_SYMBOL (AcpiWrite)
    308 
    309 
    310 #if (!ACPI_REDUCED_HARDWARE)
    311 /*******************************************************************************
    312  *
    313  * FUNCTION:    AcpiReadBitRegister
    314  *
    315  * PARAMETERS:  RegisterId      - ID of ACPI Bit Register to access
    316  *              ReturnValue     - Value that was read from the register,
    317  *                                normalized to bit position zero.
    318  *
    319  * RETURN:      Status and the value read from the specified Register. Value
    320  *              returned is normalized to bit0 (is shifted all the way right)
    321  *
    322  * DESCRIPTION: ACPI BitRegister read function. Does not acquire the HW lock.
    323  *
    324  * SUPPORTS:    Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
    325  *              PM2 Control.
    326  *
    327  * Note: The hardware lock is not required when reading the ACPI bit registers
    328  *       since almost all of them are single bit and it does not matter that
    329  *       the parent hardware register can be split across two physical
    330  *       registers. The only multi-bit field is SLP_TYP in the PM1 control
    331  *       register, but this field does not cross an 8-bit boundary (nor does
    332  *       it make much sense to actually read this field.)
    333  *
    334  ******************************************************************************/
    335 
    336 ACPI_STATUS
    337 AcpiReadBitRegister (
    338     UINT32                  RegisterId,
    339     UINT32                  *ReturnValue)
    340 {
    341     ACPI_BIT_REGISTER_INFO  *BitRegInfo;
    342     UINT32                  RegisterValue;
    343     UINT32                  Value;
    344     ACPI_STATUS             Status;
    345 
    346 
    347     ACPI_FUNCTION_TRACE_U32 (AcpiReadBitRegister, RegisterId);
    348 
    349 
    350     /* Get the info structure corresponding to the requested ACPI Register */
    351 
    352     BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
    353     if (!BitRegInfo)
    354     {
    355         return_ACPI_STATUS (AE_BAD_PARAMETER);
    356     }
    357 
    358     /* Read the entire parent register */
    359 
    360     Status = AcpiHwRegisterRead (BitRegInfo->ParentRegister,
    361                 &RegisterValue);
    362     if (ACPI_FAILURE (Status))
    363     {
    364         return_ACPI_STATUS (Status);
    365     }
    366 
    367     /* Normalize the value that was read, mask off other bits */
    368 
    369     Value = ((RegisterValue & BitRegInfo->AccessBitMask)
    370                 >> BitRegInfo->BitPosition);
    371 
    372     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
    373         "BitReg %X, ParentReg %X, Actual %8.8X, ReturnValue %8.8X\n",
    374         RegisterId, BitRegInfo->ParentRegister, RegisterValue, Value));
    375 
    376     *ReturnValue = Value;
    377     return_ACPI_STATUS (AE_OK);
    378 }
    379 
    380 ACPI_EXPORT_SYMBOL (AcpiReadBitRegister)
    381 
    382 
    383 /*******************************************************************************
    384  *
    385  * FUNCTION:    AcpiWriteBitRegister
    386  *
    387  * PARAMETERS:  RegisterId      - ID of ACPI Bit Register to access
    388  *              Value           - Value to write to the register, in bit
    389  *                                position zero. The bit is automatically
    390  *                                shifted to the correct position.
    391  *
    392  * RETURN:      Status
    393  *
    394  * DESCRIPTION: ACPI Bit Register write function. Acquires the hardware lock
    395  *              since most operations require a read/modify/write sequence.
    396  *
    397  * SUPPORTS:    Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
    398  *              PM2 Control.
    399  *
    400  * Note that at this level, the fact that there may be actually two
    401  * hardware registers (A and B - and B may not exist) is abstracted.
    402  *
    403  ******************************************************************************/
    404 
    405 ACPI_STATUS
    406 AcpiWriteBitRegister (
    407     UINT32                  RegisterId,
    408     UINT32                  Value)
    409 {
    410     ACPI_BIT_REGISTER_INFO  *BitRegInfo;
    411     ACPI_CPU_FLAGS          LockFlags;
    412     UINT32                  RegisterValue;
    413     ACPI_STATUS             Status = AE_OK;
    414 
    415 
    416     ACPI_FUNCTION_TRACE_U32 (AcpiWriteBitRegister, RegisterId);
    417 
    418 
    419     /* Get the info structure corresponding to the requested ACPI Register */
    420 
    421     BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
    422     if (!BitRegInfo)
    423     {
    424         return_ACPI_STATUS (AE_BAD_PARAMETER);
    425     }
    426 
    427     LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
    428 
    429     /*
    430      * At this point, we know that the parent register is one of the
    431      * following: PM1 Status, PM1 Enable, PM1 Control, or PM2 Control
    432      */
    433     if (BitRegInfo->ParentRegister != ACPI_REGISTER_PM1_STATUS)
    434     {
    435         /*
    436          * 1) Case for PM1 Enable, PM1 Control, and PM2 Control
    437          *
    438          * Perform a register read to preserve the bits that we are not
    439          * interested in
    440          */
    441         Status = AcpiHwRegisterRead (BitRegInfo->ParentRegister,
    442                     &RegisterValue);
    443         if (ACPI_FAILURE (Status))
    444         {
    445             goto UnlockAndExit;
    446         }
    447 
    448         /*
    449          * Insert the input bit into the value that was just read
    450          * and write the register
    451          */
    452         ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,
    453             BitRegInfo->AccessBitMask, Value);
    454 
    455         Status = AcpiHwRegisterWrite (BitRegInfo->ParentRegister,
    456                     RegisterValue);
    457     }
    458     else
    459     {
    460         /*
    461          * 2) Case for PM1 Status
    462          *
    463          * The Status register is different from the rest. Clear an event
    464          * by writing 1, writing 0 has no effect. So, the only relevant
    465          * information is the single bit we're interested in, all others
    466          * should be written as 0 so they will be left unchanged.
    467          */
    468         RegisterValue = ACPI_REGISTER_PREPARE_BITS (Value,
    469             BitRegInfo->BitPosition, BitRegInfo->AccessBitMask);
    470 
    471         /* No need to write the register if value is all zeros */
    472 
    473         if (RegisterValue)
    474         {
    475             Status = AcpiHwRegisterWrite (ACPI_REGISTER_PM1_STATUS,
    476                         RegisterValue);
    477         }
    478     }
    479 
    480     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
    481         "BitReg %X, ParentReg %X, Value %8.8X, Actual %8.8X\n",
    482         RegisterId, BitRegInfo->ParentRegister, Value, RegisterValue));
    483 
    484 
    485 UnlockAndExit:
    486 
    487     AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
    488     return_ACPI_STATUS (Status);
    489 }
    490 
    491 ACPI_EXPORT_SYMBOL (AcpiWriteBitRegister)
    492 
    493 #endif /* !ACPI_REDUCED_HARDWARE */
    494 
    495 
    496 /*******************************************************************************
    497  *
    498  * FUNCTION:    AcpiGetSleepTypeData
    499  *
    500  * PARAMETERS:  SleepState          - Numeric sleep state
    501  *              *SleepTypeA         - Where SLP_TYPa is returned
    502  *              *SleepTypeB         - Where SLP_TYPb is returned
    503  *
    504  * RETURN:      Status
    505  *
    506  * DESCRIPTION: Obtain the SLP_TYPa and SLP_TYPb values for the requested
    507  *              sleep state via the appropriate \_Sx object.
    508  *
    509  *  The sleep state package returned from the corresponding \_Sx_ object
    510  *  must contain at least one integer.
    511  *
    512  *  March 2005:
    513  *  Added support for a package that contains two integers. This
    514  *  goes against the ACPI specification which defines this object as a
    515  *  package with one encoded DWORD integer. However, existing practice
    516  *  by many BIOS vendors is to return a package with 2 or more integer
    517  *  elements, at least one per sleep type (A/B).
    518  *
    519  *  January 2013:
    520  *  Therefore, we must be prepared to accept a package with either a
    521  *  single integer or multiple integers.
    522  *
    523  *  The single integer DWORD format is as follows:
    524  *      BYTE 0 - Value for the PM1A SLP_TYP register
    525  *      BYTE 1 - Value for the PM1B SLP_TYP register
    526  *      BYTE 2-3 - Reserved
    527  *
    528  *  The dual integer format is as follows:
    529  *      Integer 0 - Value for the PM1A SLP_TYP register
    530  *      Integer 1 - Value for the PM1A SLP_TYP register
    531  *
    532  ******************************************************************************/
    533 
    534 ACPI_STATUS
    535 AcpiGetSleepTypeData (
    536     UINT8                   SleepState,
    537     UINT8                   *SleepTypeA,
    538     UINT8                   *SleepTypeB)
    539 {
    540     ACPI_STATUS             Status;
    541     ACPI_EVALUATE_INFO      *Info;
    542     ACPI_OPERAND_OBJECT     **Elements;
    543 
    544 
    545     ACPI_FUNCTION_TRACE (AcpiGetSleepTypeData);
    546 
    547 
    548     /* Validate parameters */
    549 
    550     if ((SleepState > ACPI_S_STATES_MAX) ||
    551         !SleepTypeA || !SleepTypeB)
    552     {
    553         return_ACPI_STATUS (AE_BAD_PARAMETER);
    554     }
    555 
    556     /* Allocate the evaluation information block */
    557 
    558     Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
    559     if (!Info)
    560     {
    561         return_ACPI_STATUS (AE_NO_MEMORY);
    562     }
    563 
    564     /*
    565      * Evaluate the \_Sx namespace object containing the register values
    566      * for this state
    567      */
    568     Info->RelativePathname = ACPI_CAST_PTR (
    569         char, AcpiGbl_SleepStateNames[SleepState]);
    570     Status = AcpiNsEvaluate (Info);
    571     if (ACPI_FAILURE (Status))
    572     {
    573         goto Cleanup;
    574     }
    575 
    576     /* Must have a return object */
    577 
    578     if (!Info->ReturnObject)
    579     {
    580         ACPI_ERROR ((AE_INFO, "No Sleep State object returned from [%s]",
    581             Info->RelativePathname));
    582         Status = AE_AML_NO_RETURN_VALUE;
    583         goto Cleanup;
    584     }
    585 
    586     /* Return object must be of type Package */
    587 
    588     if (Info->ReturnObject->Common.Type != ACPI_TYPE_PACKAGE)
    589     {
    590         ACPI_ERROR ((AE_INFO, "Sleep State return object is not a Package"));
    591         Status = AE_AML_OPERAND_TYPE;
    592         goto Cleanup1;
    593     }
    594 
    595     /*
    596      * Any warnings about the package length or the object types have
    597      * already been issued by the predefined name module -- there is no
    598      * need to repeat them here.
    599      */
    600     Elements = Info->ReturnObject->Package.Elements;
    601     switch (Info->ReturnObject->Package.Count)
    602     {
    603     case 0:
    604 
    605         Status = AE_AML_PACKAGE_LIMIT;
    606         break;
    607 
    608     case 1:
    609 
    610         if (Elements[0]->Common.Type != ACPI_TYPE_INTEGER)
    611         {
    612             Status = AE_AML_OPERAND_TYPE;
    613             break;
    614         }
    615 
    616         /* A valid _Sx_ package with one integer */
    617 
    618         *SleepTypeA = (UINT8) Elements[0]->Integer.Value;
    619         *SleepTypeB = (UINT8) (Elements[0]->Integer.Value >> 8);
    620         break;
    621 
    622     case 2:
    623     default:
    624 
    625         if ((Elements[0]->Common.Type != ACPI_TYPE_INTEGER) ||
    626             (Elements[1]->Common.Type != ACPI_TYPE_INTEGER))
    627         {
    628             Status = AE_AML_OPERAND_TYPE;
    629             break;
    630         }
    631 
    632         /* A valid _Sx_ package with two integers */
    633 
    634         *SleepTypeA = (UINT8) Elements[0]->Integer.Value;
    635         *SleepTypeB = (UINT8) Elements[1]->Integer.Value;
    636         break;
    637     }
    638 
    639 Cleanup1:
    640     AcpiUtRemoveReference (Info->ReturnObject);
    641 
    642 Cleanup:
    643     if (ACPI_FAILURE (Status))
    644     {
    645         ACPI_EXCEPTION ((AE_INFO, Status,
    646             "While evaluating Sleep State [%s]", Info->RelativePathname));
    647     }
    648 
    649     ACPI_FREE (Info);
    650     return_ACPI_STATUS (Status);
    651 }
    652 
    653 ACPI_EXPORT_SYMBOL (AcpiGetSleepTypeData)
    654