xref: /onnv-gate/usr/src/uts/intel/io/acpica/hardware/hwxface.c (revision 11225:eb6056029d84)
19980SDana.Myers@Sun.COM 
29980SDana.Myers@Sun.COM /******************************************************************************
39980SDana.Myers@Sun.COM  *
49980SDana.Myers@Sun.COM  * Module Name: hwxface - Public ACPICA hardware interfaces
59980SDana.Myers@Sun.COM  *
69980SDana.Myers@Sun.COM  *****************************************************************************/
79980SDana.Myers@Sun.COM 
89980SDana.Myers@Sun.COM /******************************************************************************
99980SDana.Myers@Sun.COM  *
109980SDana.Myers@Sun.COM  * 1. Copyright Notice
119980SDana.Myers@Sun.COM  *
129980SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
139980SDana.Myers@Sun.COM  * All rights reserved.
149980SDana.Myers@Sun.COM  *
159980SDana.Myers@Sun.COM  * 2. License
169980SDana.Myers@Sun.COM  *
179980SDana.Myers@Sun.COM  * 2.1. This is your license from Intel Corp. under its intellectual property
189980SDana.Myers@Sun.COM  * rights.  You may have additional license terms from the party that provided
199980SDana.Myers@Sun.COM  * you this software, covering your right to use that party's intellectual
209980SDana.Myers@Sun.COM  * property rights.
219980SDana.Myers@Sun.COM  *
229980SDana.Myers@Sun.COM  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
239980SDana.Myers@Sun.COM  * copy of the source code appearing in this file ("Covered Code") an
249980SDana.Myers@Sun.COM  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
259980SDana.Myers@Sun.COM  * base code distributed originally by Intel ("Original Intel Code") to copy,
269980SDana.Myers@Sun.COM  * make derivatives, distribute, use and display any portion of the Covered
279980SDana.Myers@Sun.COM  * Code in any form, with the right to sublicense such rights; and
289980SDana.Myers@Sun.COM  *
299980SDana.Myers@Sun.COM  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
309980SDana.Myers@Sun.COM  * license (with the right to sublicense), under only those claims of Intel
319980SDana.Myers@Sun.COM  * patents that are infringed by the Original Intel Code, to make, use, sell,
329980SDana.Myers@Sun.COM  * offer to sell, and import the Covered Code and derivative works thereof
339980SDana.Myers@Sun.COM  * solely to the minimum extent necessary to exercise the above copyright
349980SDana.Myers@Sun.COM  * license, and in no event shall the patent license extend to any additions
359980SDana.Myers@Sun.COM  * to or modifications of the Original Intel Code.  No other license or right
369980SDana.Myers@Sun.COM  * is granted directly or by implication, estoppel or otherwise;
379980SDana.Myers@Sun.COM  *
389980SDana.Myers@Sun.COM  * The above copyright and patent license is granted only if the following
399980SDana.Myers@Sun.COM  * conditions are met:
409980SDana.Myers@Sun.COM  *
419980SDana.Myers@Sun.COM  * 3. Conditions
429980SDana.Myers@Sun.COM  *
439980SDana.Myers@Sun.COM  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
449980SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
459980SDana.Myers@Sun.COM  * Code or modification with rights to further distribute source must include
469980SDana.Myers@Sun.COM  * the above Copyright Notice, the above License, this list of Conditions,
479980SDana.Myers@Sun.COM  * and the following Disclaimer and Export Compliance provision.  In addition,
489980SDana.Myers@Sun.COM  * Licensee must cause all Covered Code to which Licensee contributes to
499980SDana.Myers@Sun.COM  * contain a file documenting the changes Licensee made to create that Covered
509980SDana.Myers@Sun.COM  * Code and the date of any change.  Licensee must include in that file the
519980SDana.Myers@Sun.COM  * documentation of any changes made by any predecessor Licensee.  Licensee
529980SDana.Myers@Sun.COM  * must include a prominent statement that the modification is derived,
539980SDana.Myers@Sun.COM  * directly or indirectly, from Original Intel Code.
549980SDana.Myers@Sun.COM  *
559980SDana.Myers@Sun.COM  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
569980SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
579980SDana.Myers@Sun.COM  * Code or modification without rights to further distribute source must
589980SDana.Myers@Sun.COM  * include the following Disclaimer and Export Compliance provision in the
599980SDana.Myers@Sun.COM  * documentation and/or other materials provided with distribution.  In
609980SDana.Myers@Sun.COM  * addition, Licensee may not authorize further sublicense of source of any
619980SDana.Myers@Sun.COM  * portion of the Covered Code, and must include terms to the effect that the
629980SDana.Myers@Sun.COM  * license from Licensee to its licensee is limited to the intellectual
639980SDana.Myers@Sun.COM  * property embodied in the software Licensee provides to its licensee, and
649980SDana.Myers@Sun.COM  * not to intellectual property embodied in modifications its licensee may
659980SDana.Myers@Sun.COM  * make.
669980SDana.Myers@Sun.COM  *
679980SDana.Myers@Sun.COM  * 3.3. Redistribution of Executable. Redistribution in executable form of any
689980SDana.Myers@Sun.COM  * substantial portion of the Covered Code or modification must reproduce the
699980SDana.Myers@Sun.COM  * above Copyright Notice, and the following Disclaimer and Export Compliance
709980SDana.Myers@Sun.COM  * provision in the documentation and/or other materials provided with the
719980SDana.Myers@Sun.COM  * distribution.
729980SDana.Myers@Sun.COM  *
739980SDana.Myers@Sun.COM  * 3.4. Intel retains all right, title, and interest in and to the Original
749980SDana.Myers@Sun.COM  * Intel Code.
759980SDana.Myers@Sun.COM  *
769980SDana.Myers@Sun.COM  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
779980SDana.Myers@Sun.COM  * Intel shall be used in advertising or otherwise to promote the sale, use or
789980SDana.Myers@Sun.COM  * other dealings in products derived from or relating to the Covered Code
799980SDana.Myers@Sun.COM  * without prior written authorization from Intel.
809980SDana.Myers@Sun.COM  *
819980SDana.Myers@Sun.COM  * 4. Disclaimer and Export Compliance
829980SDana.Myers@Sun.COM  *
839980SDana.Myers@Sun.COM  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
849980SDana.Myers@Sun.COM  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
859980SDana.Myers@Sun.COM  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
869980SDana.Myers@Sun.COM  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
879980SDana.Myers@Sun.COM  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
889980SDana.Myers@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
899980SDana.Myers@Sun.COM  * PARTICULAR PURPOSE.
909980SDana.Myers@Sun.COM  *
919980SDana.Myers@Sun.COM  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
929980SDana.Myers@Sun.COM  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
939980SDana.Myers@Sun.COM  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
949980SDana.Myers@Sun.COM  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
959980SDana.Myers@Sun.COM  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
969980SDana.Myers@Sun.COM  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
979980SDana.Myers@Sun.COM  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
989980SDana.Myers@Sun.COM  * LIMITED REMEDY.
999980SDana.Myers@Sun.COM  *
1009980SDana.Myers@Sun.COM  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1019980SDana.Myers@Sun.COM  * software or system incorporating such software without first obtaining any
1029980SDana.Myers@Sun.COM  * required license or other approval from the U. S. Department of Commerce or
1039980SDana.Myers@Sun.COM  * any other agency or department of the United States Government.  In the
1049980SDana.Myers@Sun.COM  * event Licensee exports any such software from the United States or
1059980SDana.Myers@Sun.COM  * re-exports any such software from a foreign destination, Licensee shall
1069980SDana.Myers@Sun.COM  * ensure that the distribution and export/re-export of the software is in
1079980SDana.Myers@Sun.COM  * compliance with all laws, regulations, orders, or other restrictions of the
1089980SDana.Myers@Sun.COM  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1099980SDana.Myers@Sun.COM  * any of its subsidiaries will export/re-export any technical data, process,
1109980SDana.Myers@Sun.COM  * software, or service, directly or indirectly, to any country for which the
1119980SDana.Myers@Sun.COM  * United States government or any agency thereof requires an export license,
1129980SDana.Myers@Sun.COM  * other governmental approval, or letter of assurance, without first obtaining
1139980SDana.Myers@Sun.COM  * such license, approval or letter.
1149980SDana.Myers@Sun.COM  *
1159980SDana.Myers@Sun.COM  *****************************************************************************/
1169980SDana.Myers@Sun.COM 
1179980SDana.Myers@Sun.COM #include "acpi.h"
1189980SDana.Myers@Sun.COM #include "accommon.h"
1199980SDana.Myers@Sun.COM #include "acnamesp.h"
1209980SDana.Myers@Sun.COM 
1219980SDana.Myers@Sun.COM #define _COMPONENT          ACPI_HARDWARE
1229980SDana.Myers@Sun.COM         ACPI_MODULE_NAME    ("hwxface")
1239980SDana.Myers@Sun.COM 
1249980SDana.Myers@Sun.COM 
1259980SDana.Myers@Sun.COM /******************************************************************************
1269980SDana.Myers@Sun.COM  *
1279980SDana.Myers@Sun.COM  * FUNCTION:    AcpiReset
1289980SDana.Myers@Sun.COM  *
1299980SDana.Myers@Sun.COM  * PARAMETERS:  None
1309980SDana.Myers@Sun.COM  *
1319980SDana.Myers@Sun.COM  * RETURN:      Status
1329980SDana.Myers@Sun.COM  *
1339980SDana.Myers@Sun.COM  * DESCRIPTION: Set reset register in memory or IO space. Note: Does not
1349980SDana.Myers@Sun.COM  *              support reset register in PCI config space, this must be
1359980SDana.Myers@Sun.COM  *              handled separately.
1369980SDana.Myers@Sun.COM  *
1379980SDana.Myers@Sun.COM  ******************************************************************************/
1389980SDana.Myers@Sun.COM 
1399980SDana.Myers@Sun.COM ACPI_STATUS
AcpiReset(void)1409980SDana.Myers@Sun.COM AcpiReset (
1419980SDana.Myers@Sun.COM     void)
1429980SDana.Myers@Sun.COM {
1439980SDana.Myers@Sun.COM     ACPI_GENERIC_ADDRESS    *ResetReg;
1449980SDana.Myers@Sun.COM     ACPI_STATUS             Status;
1459980SDana.Myers@Sun.COM 
1469980SDana.Myers@Sun.COM 
1479980SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (AcpiReset);
1489980SDana.Myers@Sun.COM 
1499980SDana.Myers@Sun.COM 
1509980SDana.Myers@Sun.COM     ResetReg = &AcpiGbl_FADT.ResetRegister;
1519980SDana.Myers@Sun.COM 
1529980SDana.Myers@Sun.COM     /* Check if the reset register is supported */
1539980SDana.Myers@Sun.COM 
1549980SDana.Myers@Sun.COM     if (!(AcpiGbl_FADT.Flags & ACPI_FADT_RESET_REGISTER) ||
1559980SDana.Myers@Sun.COM         !ResetReg->Address)
1569980SDana.Myers@Sun.COM     {
1579980SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NOT_EXIST);
1589980SDana.Myers@Sun.COM     }
1599980SDana.Myers@Sun.COM 
16010457SSaurabh.Mishra@Sun.COM     if (ResetReg->SpaceId == ACPI_ADR_SPACE_SYSTEM_IO)
16110457SSaurabh.Mishra@Sun.COM     {
16210457SSaurabh.Mishra@Sun.COM         /*
16310457SSaurabh.Mishra@Sun.COM          * For I/O space, write directly to the OSL. This bypasses the port
16410457SSaurabh.Mishra@Sun.COM          * validation mechanism, which may block a valid write to the reset
165*11225SDana.Myers@Sun.COM          * register.
166*11225SDana.Myers@Sun.COM          */
16710457SSaurabh.Mishra@Sun.COM         Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) ResetReg->Address,
16810457SSaurabh.Mishra@Sun.COM                     AcpiGbl_FADT.ResetValue, ResetReg->BitWidth);
16910457SSaurabh.Mishra@Sun.COM     }
17010457SSaurabh.Mishra@Sun.COM     else
17110457SSaurabh.Mishra@Sun.COM     {
172*11225SDana.Myers@Sun.COM         /* Write the reset value to the reset register */
1739980SDana.Myers@Sun.COM 
174*11225SDana.Myers@Sun.COM         Status = AcpiHwWrite (AcpiGbl_FADT.ResetValue, ResetReg);
17510457SSaurabh.Mishra@Sun.COM     }
17610457SSaurabh.Mishra@Sun.COM 
1779980SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
1789980SDana.Myers@Sun.COM }
1799980SDana.Myers@Sun.COM 
ACPI_EXPORT_SYMBOL(AcpiReset)1809980SDana.Myers@Sun.COM ACPI_EXPORT_SYMBOL (AcpiReset)
1819980SDana.Myers@Sun.COM 
1829980SDana.Myers@Sun.COM 
1839980SDana.Myers@Sun.COM /******************************************************************************
1849980SDana.Myers@Sun.COM  *
1859980SDana.Myers@Sun.COM  * FUNCTION:    AcpiRead
1869980SDana.Myers@Sun.COM  *
1879980SDana.Myers@Sun.COM  * PARAMETERS:  Value               - Where the value is returned
1889980SDana.Myers@Sun.COM  *              Reg                 - GAS register structure
1899980SDana.Myers@Sun.COM  *
1909980SDana.Myers@Sun.COM  * RETURN:      Status
1919980SDana.Myers@Sun.COM  *
1929980SDana.Myers@Sun.COM  * DESCRIPTION: Read from either memory or IO space.
1939980SDana.Myers@Sun.COM  *
194*11225SDana.Myers@Sun.COM  * LIMITATIONS: <These limitations also apply to AcpiWrite>
195*11225SDana.Myers@Sun.COM  *      BitWidth must be exactly 8, 16, 32, or 64.
196*11225SDana.Myers@Sun.COM  *      SpaceID must be SystemMemory or SystemIO.
197*11225SDana.Myers@Sun.COM  *      BitOffset and AccessWidth are currently ignored, as there has
198*11225SDana.Myers@Sun.COM  *          not been a need to implement these.
199*11225SDana.Myers@Sun.COM  *
2009980SDana.Myers@Sun.COM  ******************************************************************************/
2019980SDana.Myers@Sun.COM 
2029980SDana.Myers@Sun.COM ACPI_STATUS
2039980SDana.Myers@Sun.COM AcpiRead (
204*11225SDana.Myers@Sun.COM     UINT64                  *ReturnValue,
2059980SDana.Myers@Sun.COM     ACPI_GENERIC_ADDRESS    *Reg)
2069980SDana.Myers@Sun.COM {
207*11225SDana.Myers@Sun.COM     UINT32                  Value;
2089980SDana.Myers@Sun.COM     UINT32                  Width;
2099980SDana.Myers@Sun.COM     UINT64                  Address;
2109980SDana.Myers@Sun.COM     ACPI_STATUS             Status;
2119980SDana.Myers@Sun.COM 
2129980SDana.Myers@Sun.COM 
2139980SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (AcpiRead);
2149980SDana.Myers@Sun.COM 
2159980SDana.Myers@Sun.COM 
216*11225SDana.Myers@Sun.COM     if (!ReturnValue)
2179980SDana.Myers@Sun.COM     {
2189980SDana.Myers@Sun.COM         return (AE_BAD_PARAMETER);
2199980SDana.Myers@Sun.COM     }
2209980SDana.Myers@Sun.COM 
221*11225SDana.Myers@Sun.COM     /* Validate contents of the GAS register. Allow 64-bit transfers */
2229980SDana.Myers@Sun.COM 
223*11225SDana.Myers@Sun.COM     Status = AcpiHwValidateRegister (Reg, 64, &Address);
224*11225SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
2259980SDana.Myers@Sun.COM     {
226*11225SDana.Myers@Sun.COM         return (Status);
2279980SDana.Myers@Sun.COM     }
2289980SDana.Myers@Sun.COM 
2299980SDana.Myers@Sun.COM     Width = Reg->BitWidth;
230*11225SDana.Myers@Sun.COM     if (Width == 64)
2319980SDana.Myers@Sun.COM     {
232*11225SDana.Myers@Sun.COM         Width = 32; /* Break into two 32-bit transfers */
2339980SDana.Myers@Sun.COM     }
2349980SDana.Myers@Sun.COM 
235*11225SDana.Myers@Sun.COM     /* Initialize entire 64-bit return value to zero */
2369980SDana.Myers@Sun.COM 
237*11225SDana.Myers@Sun.COM     *ReturnValue = 0;
238*11225SDana.Myers@Sun.COM     Value = 0;
2399980SDana.Myers@Sun.COM 
2409980SDana.Myers@Sun.COM     /*
2419980SDana.Myers@Sun.COM      * Two address spaces supported: Memory or IO. PCI_Config is
2429980SDana.Myers@Sun.COM      * not supported here because the GAS structure is insufficient
2439980SDana.Myers@Sun.COM      */
244*11225SDana.Myers@Sun.COM     if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
2459980SDana.Myers@Sun.COM     {
246*11225SDana.Myers@Sun.COM         Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS)
247*11225SDana.Myers@Sun.COM                     Address, &Value, Width);
248*11225SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
249*11225SDana.Myers@Sun.COM         {
250*11225SDana.Myers@Sun.COM             return (Status);
251*11225SDana.Myers@Sun.COM         }
252*11225SDana.Myers@Sun.COM         *ReturnValue = Value;
2539980SDana.Myers@Sun.COM 
254*11225SDana.Myers@Sun.COM         if (Reg->BitWidth == 64)
255*11225SDana.Myers@Sun.COM         {
256*11225SDana.Myers@Sun.COM             /* Read the top 32 bits */
2579980SDana.Myers@Sun.COM 
258*11225SDana.Myers@Sun.COM             Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS)
259*11225SDana.Myers@Sun.COM                         (Address + 4), &Value, 32);
260*11225SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
261*11225SDana.Myers@Sun.COM             {
262*11225SDana.Myers@Sun.COM                 return (Status);
263*11225SDana.Myers@Sun.COM             }
264*11225SDana.Myers@Sun.COM             *ReturnValue |= ((UINT64) Value << 32);
265*11225SDana.Myers@Sun.COM         }
266*11225SDana.Myers@Sun.COM     }
267*11225SDana.Myers@Sun.COM     else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
268*11225SDana.Myers@Sun.COM     {
269*11225SDana.Myers@Sun.COM         Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
270*11225SDana.Myers@Sun.COM                     Address, &Value, Width);
271*11225SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
272*11225SDana.Myers@Sun.COM         {
273*11225SDana.Myers@Sun.COM             return (Status);
274*11225SDana.Myers@Sun.COM         }
275*11225SDana.Myers@Sun.COM         *ReturnValue = Value;
2769980SDana.Myers@Sun.COM 
277*11225SDana.Myers@Sun.COM         if (Reg->BitWidth == 64)
278*11225SDana.Myers@Sun.COM         {
279*11225SDana.Myers@Sun.COM             /* Read the top 32 bits */
2809980SDana.Myers@Sun.COM 
281*11225SDana.Myers@Sun.COM             Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
282*11225SDana.Myers@Sun.COM                         (Address + 4), &Value, 32);
283*11225SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
284*11225SDana.Myers@Sun.COM             {
285*11225SDana.Myers@Sun.COM                 return (Status);
286*11225SDana.Myers@Sun.COM             }
287*11225SDana.Myers@Sun.COM             *ReturnValue |= ((UINT64) Value << 32);
288*11225SDana.Myers@Sun.COM         }
2899980SDana.Myers@Sun.COM     }
2909980SDana.Myers@Sun.COM 
2919980SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
292*11225SDana.Myers@Sun.COM         "Read:  %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
293*11225SDana.Myers@Sun.COM         ACPI_FORMAT_UINT64 (*ReturnValue), Reg->BitWidth,
294*11225SDana.Myers@Sun.COM         ACPI_FORMAT_UINT64 (Address),
2959980SDana.Myers@Sun.COM         AcpiUtGetRegionName (Reg->SpaceId)));
2969980SDana.Myers@Sun.COM 
2979980SDana.Myers@Sun.COM     return (Status);
2989980SDana.Myers@Sun.COM }
2999980SDana.Myers@Sun.COM 
ACPI_EXPORT_SYMBOL(AcpiRead)3009980SDana.Myers@Sun.COM ACPI_EXPORT_SYMBOL (AcpiRead)
3019980SDana.Myers@Sun.COM 
3029980SDana.Myers@Sun.COM 
3039980SDana.Myers@Sun.COM /******************************************************************************
3049980SDana.Myers@Sun.COM  *
3059980SDana.Myers@Sun.COM  * FUNCTION:    AcpiWrite
3069980SDana.Myers@Sun.COM  *
307*11225SDana.Myers@Sun.COM  * PARAMETERS:  Value               - Value to be written
3089980SDana.Myers@Sun.COM  *              Reg                 - GAS register structure
3099980SDana.Myers@Sun.COM  *
3109980SDana.Myers@Sun.COM  * RETURN:      Status
3119980SDana.Myers@Sun.COM  *
3129980SDana.Myers@Sun.COM  * DESCRIPTION: Write to either memory or IO space.
3139980SDana.Myers@Sun.COM  *
3149980SDana.Myers@Sun.COM  ******************************************************************************/
3159980SDana.Myers@Sun.COM 
3169980SDana.Myers@Sun.COM ACPI_STATUS
3179980SDana.Myers@Sun.COM AcpiWrite (
318*11225SDana.Myers@Sun.COM     UINT64                  Value,
3199980SDana.Myers@Sun.COM     ACPI_GENERIC_ADDRESS    *Reg)
3209980SDana.Myers@Sun.COM {
3219980SDana.Myers@Sun.COM     UINT32                  Width;
3229980SDana.Myers@Sun.COM     UINT64                  Address;
3239980SDana.Myers@Sun.COM     ACPI_STATUS             Status;
3249980SDana.Myers@Sun.COM 
3259980SDana.Myers@Sun.COM 
3269980SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (AcpiWrite);
3279980SDana.Myers@Sun.COM 
3289980SDana.Myers@Sun.COM 
329*11225SDana.Myers@Sun.COM     /* Validate contents of the GAS register. Allow 64-bit transfers */
330*11225SDana.Myers@Sun.COM 
331*11225SDana.Myers@Sun.COM     Status = AcpiHwValidateRegister (Reg, 64, &Address);
332*11225SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
3339980SDana.Myers@Sun.COM     {
334*11225SDana.Myers@Sun.COM         return (Status);
3359980SDana.Myers@Sun.COM     }
3369980SDana.Myers@Sun.COM 
337*11225SDana.Myers@Sun.COM     Width = Reg->BitWidth;
338*11225SDana.Myers@Sun.COM     if (Width == 64)
3399980SDana.Myers@Sun.COM     {
340*11225SDana.Myers@Sun.COM         Width = 32; /* Break into two 32-bit transfers */
3419980SDana.Myers@Sun.COM     }
3429980SDana.Myers@Sun.COM 
3439980SDana.Myers@Sun.COM     /*
344*11225SDana.Myers@Sun.COM      * Two address spaces supported: Memory or IO. PCI_Config is
345*11225SDana.Myers@Sun.COM      * not supported here because the GAS structure is insufficient
3469980SDana.Myers@Sun.COM      */
347*11225SDana.Myers@Sun.COM     if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
3489980SDana.Myers@Sun.COM     {
349*11225SDana.Myers@Sun.COM         Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS)
350*11225SDana.Myers@Sun.COM                     Address, ACPI_LODWORD (Value), Width);
351*11225SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
352*11225SDana.Myers@Sun.COM         {
353*11225SDana.Myers@Sun.COM             return (Status);
354*11225SDana.Myers@Sun.COM         }
3559980SDana.Myers@Sun.COM 
356*11225SDana.Myers@Sun.COM         if (Reg->BitWidth == 64)
357*11225SDana.Myers@Sun.COM         {
358*11225SDana.Myers@Sun.COM             Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS)
359*11225SDana.Myers@Sun.COM                         (Address + 4), ACPI_HIDWORD (Value), 32);
360*11225SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
361*11225SDana.Myers@Sun.COM             {
362*11225SDana.Myers@Sun.COM                 return (Status);
363*11225SDana.Myers@Sun.COM             }
364*11225SDana.Myers@Sun.COM         }
365*11225SDana.Myers@Sun.COM     }
366*11225SDana.Myers@Sun.COM     else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
367*11225SDana.Myers@Sun.COM     {
368*11225SDana.Myers@Sun.COM         Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
369*11225SDana.Myers@Sun.COM                     Address, ACPI_LODWORD (Value), Width);
370*11225SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
371*11225SDana.Myers@Sun.COM         {
372*11225SDana.Myers@Sun.COM             return (Status);
373*11225SDana.Myers@Sun.COM         }
3749980SDana.Myers@Sun.COM 
375*11225SDana.Myers@Sun.COM         if (Reg->BitWidth == 64)
376*11225SDana.Myers@Sun.COM         {
377*11225SDana.Myers@Sun.COM             Status = AcpiHwWritePort ((ACPI_IO_ADDRESS)
378*11225SDana.Myers@Sun.COM                         (Address + 4), ACPI_HIDWORD (Value), 32);
379*11225SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
380*11225SDana.Myers@Sun.COM             {
381*11225SDana.Myers@Sun.COM                 return (Status);
382*11225SDana.Myers@Sun.COM             }
383*11225SDana.Myers@Sun.COM         }
3849980SDana.Myers@Sun.COM     }
3859980SDana.Myers@Sun.COM 
3869980SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
387*11225SDana.Myers@Sun.COM         "Wrote: %8.8X%8.8X width %2d   to %8.8X%8.8X (%s)\n",
388*11225SDana.Myers@Sun.COM         ACPI_FORMAT_UINT64 (Value), Reg->BitWidth,
389*11225SDana.Myers@Sun.COM         ACPI_FORMAT_UINT64 (Address),
3909980SDana.Myers@Sun.COM         AcpiUtGetRegionName (Reg->SpaceId)));
3919980SDana.Myers@Sun.COM 
3929980SDana.Myers@Sun.COM     return (Status);
3939980SDana.Myers@Sun.COM }
3949980SDana.Myers@Sun.COM 
ACPI_EXPORT_SYMBOL(AcpiWrite)3959980SDana.Myers@Sun.COM ACPI_EXPORT_SYMBOL (AcpiWrite)
3969980SDana.Myers@Sun.COM 
3979980SDana.Myers@Sun.COM 
3989980SDana.Myers@Sun.COM /*******************************************************************************
3999980SDana.Myers@Sun.COM  *
4009980SDana.Myers@Sun.COM  * FUNCTION:    AcpiReadBitRegister
4019980SDana.Myers@Sun.COM  *
4029980SDana.Myers@Sun.COM  * PARAMETERS:  RegisterId      - ID of ACPI Bit Register to access
4039980SDana.Myers@Sun.COM  *              ReturnValue     - Value that was read from the register,
4049980SDana.Myers@Sun.COM  *                                normalized to bit position zero.
4059980SDana.Myers@Sun.COM  *
4069980SDana.Myers@Sun.COM  * RETURN:      Status and the value read from the specified Register. Value
4079980SDana.Myers@Sun.COM  *              returned is normalized to bit0 (is shifted all the way right)
4089980SDana.Myers@Sun.COM  *
4099980SDana.Myers@Sun.COM  * DESCRIPTION: ACPI BitRegister read function. Does not acquire the HW lock.
4109980SDana.Myers@Sun.COM  *
4119980SDana.Myers@Sun.COM  * SUPPORTS:    Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
4129980SDana.Myers@Sun.COM  *              PM2 Control.
4139980SDana.Myers@Sun.COM  *
4149980SDana.Myers@Sun.COM  * Note: The hardware lock is not required when reading the ACPI bit registers
4159980SDana.Myers@Sun.COM  *       since almost all of them are single bit and it does not matter that
4169980SDana.Myers@Sun.COM  *       the parent hardware register can be split across two physical
4179980SDana.Myers@Sun.COM  *       registers. The only multi-bit field is SLP_TYP in the PM1 control
4189980SDana.Myers@Sun.COM  *       register, but this field does not cross an 8-bit boundary (nor does
4199980SDana.Myers@Sun.COM  *       it make much sense to actually read this field.)
4209980SDana.Myers@Sun.COM  *
4219980SDana.Myers@Sun.COM  ******************************************************************************/
4229980SDana.Myers@Sun.COM 
4239980SDana.Myers@Sun.COM ACPI_STATUS
4249980SDana.Myers@Sun.COM AcpiReadBitRegister (
4259980SDana.Myers@Sun.COM     UINT32                  RegisterId,
4269980SDana.Myers@Sun.COM     UINT32                  *ReturnValue)
4279980SDana.Myers@Sun.COM {
4289980SDana.Myers@Sun.COM     ACPI_BIT_REGISTER_INFO  *BitRegInfo;
4299980SDana.Myers@Sun.COM     UINT32                  RegisterValue;
4309980SDana.Myers@Sun.COM     UINT32                  Value;
4319980SDana.Myers@Sun.COM     ACPI_STATUS             Status;
4329980SDana.Myers@Sun.COM 
4339980SDana.Myers@Sun.COM 
4349980SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_U32 (AcpiReadBitRegister, RegisterId);
4359980SDana.Myers@Sun.COM 
4369980SDana.Myers@Sun.COM 
4379980SDana.Myers@Sun.COM     /* Get the info structure corresponding to the requested ACPI Register */
4389980SDana.Myers@Sun.COM 
4399980SDana.Myers@Sun.COM     BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
4409980SDana.Myers@Sun.COM     if (!BitRegInfo)
4419980SDana.Myers@Sun.COM     {
4429980SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_BAD_PARAMETER);
4439980SDana.Myers@Sun.COM     }
4449980SDana.Myers@Sun.COM 
4459980SDana.Myers@Sun.COM     /* Read the entire parent register */
4469980SDana.Myers@Sun.COM 
4479980SDana.Myers@Sun.COM     Status = AcpiHwRegisterRead (BitRegInfo->ParentRegister,
4489980SDana.Myers@Sun.COM                 &RegisterValue);
4499980SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
4509980SDana.Myers@Sun.COM     {
4519980SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
4529980SDana.Myers@Sun.COM     }
4539980SDana.Myers@Sun.COM 
4549980SDana.Myers@Sun.COM     /* Normalize the value that was read, mask off other bits */
4559980SDana.Myers@Sun.COM 
4569980SDana.Myers@Sun.COM     Value = ((RegisterValue & BitRegInfo->AccessBitMask)
4579980SDana.Myers@Sun.COM                 >> BitRegInfo->BitPosition);
4589980SDana.Myers@Sun.COM 
4599980SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
4609980SDana.Myers@Sun.COM         "BitReg %X, ParentReg %X, Actual %8.8X, ReturnValue %8.8X\n",
4619980SDana.Myers@Sun.COM         RegisterId, BitRegInfo->ParentRegister, RegisterValue, Value));
4629980SDana.Myers@Sun.COM 
4639980SDana.Myers@Sun.COM     *ReturnValue = Value;
4649980SDana.Myers@Sun.COM     return_ACPI_STATUS (AE_OK);
4659980SDana.Myers@Sun.COM }
4669980SDana.Myers@Sun.COM 
ACPI_EXPORT_SYMBOL(AcpiReadBitRegister)4679980SDana.Myers@Sun.COM ACPI_EXPORT_SYMBOL (AcpiReadBitRegister)
4689980SDana.Myers@Sun.COM 
4699980SDana.Myers@Sun.COM 
4709980SDana.Myers@Sun.COM /*******************************************************************************
4719980SDana.Myers@Sun.COM  *
4729980SDana.Myers@Sun.COM  * FUNCTION:    AcpiWriteBitRegister
4739980SDana.Myers@Sun.COM  *
4749980SDana.Myers@Sun.COM  * PARAMETERS:  RegisterId      - ID of ACPI Bit Register to access
4759980SDana.Myers@Sun.COM  *              Value           - Value to write to the register, in bit
4769980SDana.Myers@Sun.COM  *                                position zero. The bit is automaticallly
4779980SDana.Myers@Sun.COM  *                                shifted to the correct position.
4789980SDana.Myers@Sun.COM  *
4799980SDana.Myers@Sun.COM  * RETURN:      Status
4809980SDana.Myers@Sun.COM  *
4819980SDana.Myers@Sun.COM  * DESCRIPTION: ACPI Bit Register write function. Acquires the hardware lock
4829980SDana.Myers@Sun.COM  *              since most operations require a read/modify/write sequence.
4839980SDana.Myers@Sun.COM  *
4849980SDana.Myers@Sun.COM  * SUPPORTS:    Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
4859980SDana.Myers@Sun.COM  *              PM2 Control.
4869980SDana.Myers@Sun.COM  *
4879980SDana.Myers@Sun.COM  * Note that at this level, the fact that there may be actually two
4889980SDana.Myers@Sun.COM  * hardware registers (A and B - and B may not exist) is abstracted.
4899980SDana.Myers@Sun.COM  *
4909980SDana.Myers@Sun.COM  ******************************************************************************/
4919980SDana.Myers@Sun.COM 
4929980SDana.Myers@Sun.COM ACPI_STATUS
4939980SDana.Myers@Sun.COM AcpiWriteBitRegister (
4949980SDana.Myers@Sun.COM     UINT32                  RegisterId,
4959980SDana.Myers@Sun.COM     UINT32                  Value)
4969980SDana.Myers@Sun.COM {
4979980SDana.Myers@Sun.COM     ACPI_BIT_REGISTER_INFO  *BitRegInfo;
4989980SDana.Myers@Sun.COM     ACPI_CPU_FLAGS          LockFlags;
4999980SDana.Myers@Sun.COM     UINT32                  RegisterValue;
5009980SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
5019980SDana.Myers@Sun.COM 
5029980SDana.Myers@Sun.COM 
5039980SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_U32 (AcpiWriteBitRegister, RegisterId);
5049980SDana.Myers@Sun.COM 
5059980SDana.Myers@Sun.COM 
5069980SDana.Myers@Sun.COM     /* Get the info structure corresponding to the requested ACPI Register */
5079980SDana.Myers@Sun.COM 
5089980SDana.Myers@Sun.COM     BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
5099980SDana.Myers@Sun.COM     if (!BitRegInfo)
5109980SDana.Myers@Sun.COM     {
5119980SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_BAD_PARAMETER);
5129980SDana.Myers@Sun.COM     }
5139980SDana.Myers@Sun.COM 
5149980SDana.Myers@Sun.COM     LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
5159980SDana.Myers@Sun.COM 
5169980SDana.Myers@Sun.COM     /*
5179980SDana.Myers@Sun.COM      * At this point, we know that the parent register is one of the
5189980SDana.Myers@Sun.COM      * following: PM1 Status, PM1 Enable, PM1 Control, or PM2 Control
5199980SDana.Myers@Sun.COM      */
5209980SDana.Myers@Sun.COM     if (BitRegInfo->ParentRegister != ACPI_REGISTER_PM1_STATUS)
5219980SDana.Myers@Sun.COM     {
5229980SDana.Myers@Sun.COM         /*
5239980SDana.Myers@Sun.COM          * 1) Case for PM1 Enable, PM1 Control, and PM2 Control
5249980SDana.Myers@Sun.COM          *
5259980SDana.Myers@Sun.COM          * Perform a register read to preserve the bits that we are not
5269980SDana.Myers@Sun.COM          * interested in
5279980SDana.Myers@Sun.COM          */
5289980SDana.Myers@Sun.COM         Status = AcpiHwRegisterRead (BitRegInfo->ParentRegister,
5299980SDana.Myers@Sun.COM                     &RegisterValue);
5309980SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
5319980SDana.Myers@Sun.COM         {
5329980SDana.Myers@Sun.COM             goto UnlockAndExit;
5339980SDana.Myers@Sun.COM         }
5349980SDana.Myers@Sun.COM 
5359980SDana.Myers@Sun.COM         /*
5369980SDana.Myers@Sun.COM          * Insert the input bit into the value that was just read
5379980SDana.Myers@Sun.COM          * and write the register
5389980SDana.Myers@Sun.COM          */
5399980SDana.Myers@Sun.COM         ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,
5409980SDana.Myers@Sun.COM             BitRegInfo->AccessBitMask, Value);
5419980SDana.Myers@Sun.COM 
5429980SDana.Myers@Sun.COM         Status = AcpiHwRegisterWrite (BitRegInfo->ParentRegister,
5439980SDana.Myers@Sun.COM                     RegisterValue);
5449980SDana.Myers@Sun.COM     }
5459980SDana.Myers@Sun.COM     else
5469980SDana.Myers@Sun.COM     {
5479980SDana.Myers@Sun.COM         /*
5489980SDana.Myers@Sun.COM          * 2) Case for PM1 Status
5499980SDana.Myers@Sun.COM          *
5509980SDana.Myers@Sun.COM          * The Status register is different from the rest. Clear an event
5519980SDana.Myers@Sun.COM          * by writing 1, writing 0 has no effect. So, the only relevant
5529980SDana.Myers@Sun.COM          * information is the single bit we're interested in, all others
5539980SDana.Myers@Sun.COM          * should be written as 0 so they will be left unchanged.
5549980SDana.Myers@Sun.COM          */
5559980SDana.Myers@Sun.COM         RegisterValue = ACPI_REGISTER_PREPARE_BITS (Value,
5569980SDana.Myers@Sun.COM             BitRegInfo->BitPosition, BitRegInfo->AccessBitMask);
5579980SDana.Myers@Sun.COM 
5589980SDana.Myers@Sun.COM         /* No need to write the register if value is all zeros */
5599980SDana.Myers@Sun.COM 
5609980SDana.Myers@Sun.COM         if (RegisterValue)
5619980SDana.Myers@Sun.COM         {
5629980SDana.Myers@Sun.COM             Status = AcpiHwRegisterWrite (ACPI_REGISTER_PM1_STATUS,
5639980SDana.Myers@Sun.COM                         RegisterValue);
5649980SDana.Myers@Sun.COM         }
5659980SDana.Myers@Sun.COM     }
5669980SDana.Myers@Sun.COM 
5679980SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
5689980SDana.Myers@Sun.COM         "BitReg %X, ParentReg %X, Value %8.8X, Actual %8.8X\n",
5699980SDana.Myers@Sun.COM         RegisterId, BitRegInfo->ParentRegister, Value, RegisterValue));
5709980SDana.Myers@Sun.COM 
5719980SDana.Myers@Sun.COM 
5729980SDana.Myers@Sun.COM UnlockAndExit:
5739980SDana.Myers@Sun.COM 
5749980SDana.Myers@Sun.COM     AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
5759980SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
5769980SDana.Myers@Sun.COM }
5779980SDana.Myers@Sun.COM 
ACPI_EXPORT_SYMBOL(AcpiWriteBitRegister)5789980SDana.Myers@Sun.COM ACPI_EXPORT_SYMBOL (AcpiWriteBitRegister)
5799980SDana.Myers@Sun.COM 
5809980SDana.Myers@Sun.COM 
5819980SDana.Myers@Sun.COM /*******************************************************************************
5829980SDana.Myers@Sun.COM  *
5839980SDana.Myers@Sun.COM  * FUNCTION:    AcpiGetSleepTypeData
5849980SDana.Myers@Sun.COM  *
5859980SDana.Myers@Sun.COM  * PARAMETERS:  SleepState          - Numeric sleep state
5869980SDana.Myers@Sun.COM  *              *SleepTypeA         - Where SLP_TYPa is returned
5879980SDana.Myers@Sun.COM  *              *SleepTypeB         - Where SLP_TYPb is returned
5889980SDana.Myers@Sun.COM  *
5899980SDana.Myers@Sun.COM  * RETURN:      Status - ACPI status
5909980SDana.Myers@Sun.COM  *
5919980SDana.Myers@Sun.COM  * DESCRIPTION: Obtain the SLP_TYPa and SLP_TYPb values for the requested sleep
5929980SDana.Myers@Sun.COM  *              state.
5939980SDana.Myers@Sun.COM  *
5949980SDana.Myers@Sun.COM  ******************************************************************************/
5959980SDana.Myers@Sun.COM 
5969980SDana.Myers@Sun.COM ACPI_STATUS
5979980SDana.Myers@Sun.COM AcpiGetSleepTypeData (
5989980SDana.Myers@Sun.COM     UINT8                   SleepState,
5999980SDana.Myers@Sun.COM     UINT8                   *SleepTypeA,
6009980SDana.Myers@Sun.COM     UINT8                   *SleepTypeB)
6019980SDana.Myers@Sun.COM {
6029980SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
6039980SDana.Myers@Sun.COM     ACPI_EVALUATE_INFO      *Info;
6049980SDana.Myers@Sun.COM 
6059980SDana.Myers@Sun.COM 
6069980SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (AcpiGetSleepTypeData);
6079980SDana.Myers@Sun.COM 
6089980SDana.Myers@Sun.COM 
6099980SDana.Myers@Sun.COM     /* Validate parameters */
6109980SDana.Myers@Sun.COM 
6119980SDana.Myers@Sun.COM     if ((SleepState > ACPI_S_STATES_MAX) ||
6129980SDana.Myers@Sun.COM         !SleepTypeA ||
6139980SDana.Myers@Sun.COM         !SleepTypeB)
6149980SDana.Myers@Sun.COM     {
6159980SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_BAD_PARAMETER);
6169980SDana.Myers@Sun.COM     }
6179980SDana.Myers@Sun.COM 
6189980SDana.Myers@Sun.COM     /* Allocate the evaluation information block */
6199980SDana.Myers@Sun.COM 
6209980SDana.Myers@Sun.COM     Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
6219980SDana.Myers@Sun.COM     if (!Info)
6229980SDana.Myers@Sun.COM     {
6239980SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NO_MEMORY);
6249980SDana.Myers@Sun.COM     }
6259980SDana.Myers@Sun.COM 
6269980SDana.Myers@Sun.COM     Info->Pathname = ACPI_CAST_PTR (char, AcpiGbl_SleepStateNames[SleepState]);
6279980SDana.Myers@Sun.COM 
6289980SDana.Myers@Sun.COM     /* Evaluate the namespace object containing the values for this state */
6299980SDana.Myers@Sun.COM 
6309980SDana.Myers@Sun.COM     Status = AcpiNsEvaluate (Info);
6319980SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
6329980SDana.Myers@Sun.COM     {
6339980SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
6349980SDana.Myers@Sun.COM             "%s while evaluating SleepState [%s]\n",
6359980SDana.Myers@Sun.COM             AcpiFormatException (Status), Info->Pathname));
6369980SDana.Myers@Sun.COM 
6379980SDana.Myers@Sun.COM         goto Cleanup;
6389980SDana.Myers@Sun.COM     }
6399980SDana.Myers@Sun.COM 
6409980SDana.Myers@Sun.COM     /* Must have a return object */
6419980SDana.Myers@Sun.COM 
6429980SDana.Myers@Sun.COM     if (!Info->ReturnObject)
6439980SDana.Myers@Sun.COM     {
6449980SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "No Sleep State object returned from [%s]",
6459980SDana.Myers@Sun.COM             Info->Pathname));
6469980SDana.Myers@Sun.COM         Status = AE_NOT_EXIST;
6479980SDana.Myers@Sun.COM     }
6489980SDana.Myers@Sun.COM 
6499980SDana.Myers@Sun.COM     /* It must be of type Package */
6509980SDana.Myers@Sun.COM 
6519980SDana.Myers@Sun.COM     else if (Info->ReturnObject->Common.Type != ACPI_TYPE_PACKAGE)
6529980SDana.Myers@Sun.COM     {
6539980SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Sleep State return object is not a Package"));
6549980SDana.Myers@Sun.COM         Status = AE_AML_OPERAND_TYPE;
6559980SDana.Myers@Sun.COM     }
6569980SDana.Myers@Sun.COM 
6579980SDana.Myers@Sun.COM     /*
6589980SDana.Myers@Sun.COM      * The package must have at least two elements. NOTE (March 2005): This
6599980SDana.Myers@Sun.COM      * goes against the current ACPI spec which defines this object as a
6609980SDana.Myers@Sun.COM      * package with one encoded DWORD element. However, existing practice
6619980SDana.Myers@Sun.COM      * by BIOS vendors seems to be to have 2 or more elements, at least
6629980SDana.Myers@Sun.COM      * one per sleep type (A/B).
6639980SDana.Myers@Sun.COM      */
6649980SDana.Myers@Sun.COM     else if (Info->ReturnObject->Package.Count < 2)
6659980SDana.Myers@Sun.COM     {
6669980SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
6679980SDana.Myers@Sun.COM             "Sleep State return package does not have at least two elements"));
6689980SDana.Myers@Sun.COM         Status = AE_AML_NO_OPERAND;
6699980SDana.Myers@Sun.COM     }
6709980SDana.Myers@Sun.COM 
6719980SDana.Myers@Sun.COM     /* The first two elements must both be of type Integer */
6729980SDana.Myers@Sun.COM 
6739980SDana.Myers@Sun.COM     else if (((Info->ReturnObject->Package.Elements[0])->Common.Type
6749980SDana.Myers@Sun.COM                 != ACPI_TYPE_INTEGER) ||
6759980SDana.Myers@Sun.COM              ((Info->ReturnObject->Package.Elements[1])->Common.Type
6769980SDana.Myers@Sun.COM                 != ACPI_TYPE_INTEGER))
6779980SDana.Myers@Sun.COM     {
6789980SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
6799980SDana.Myers@Sun.COM             "Sleep State return package elements are not both Integers "
6809980SDana.Myers@Sun.COM             "(%s, %s)",
6819980SDana.Myers@Sun.COM             AcpiUtGetObjectTypeName (Info->ReturnObject->Package.Elements[0]),
6829980SDana.Myers@Sun.COM             AcpiUtGetObjectTypeName (Info->ReturnObject->Package.Elements[1])));
6839980SDana.Myers@Sun.COM         Status = AE_AML_OPERAND_TYPE;
6849980SDana.Myers@Sun.COM     }
6859980SDana.Myers@Sun.COM     else
6869980SDana.Myers@Sun.COM     {
6879980SDana.Myers@Sun.COM         /* Valid _Sx_ package size, type, and value */
6889980SDana.Myers@Sun.COM 
6899980SDana.Myers@Sun.COM         *SleepTypeA = (UINT8)
6909980SDana.Myers@Sun.COM             (Info->ReturnObject->Package.Elements[0])->Integer.Value;
6919980SDana.Myers@Sun.COM         *SleepTypeB = (UINT8)
6929980SDana.Myers@Sun.COM             (Info->ReturnObject->Package.Elements[1])->Integer.Value;
6939980SDana.Myers@Sun.COM     }
6949980SDana.Myers@Sun.COM 
6959980SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
6969980SDana.Myers@Sun.COM     {
6979980SDana.Myers@Sun.COM         ACPI_EXCEPTION ((AE_INFO, Status,
6989980SDana.Myers@Sun.COM             "While evaluating SleepState [%s], bad Sleep object %p type %s",
6999980SDana.Myers@Sun.COM             Info->Pathname, Info->ReturnObject,
7009980SDana.Myers@Sun.COM             AcpiUtGetObjectTypeName (Info->ReturnObject)));
7019980SDana.Myers@Sun.COM     }
7029980SDana.Myers@Sun.COM 
7039980SDana.Myers@Sun.COM     AcpiUtRemoveReference (Info->ReturnObject);
7049980SDana.Myers@Sun.COM 
7059980SDana.Myers@Sun.COM Cleanup:
7069980SDana.Myers@Sun.COM     ACPI_FREE (Info);
7079980SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
7089980SDana.Myers@Sun.COM }
7099980SDana.Myers@Sun.COM 
7109980SDana.Myers@Sun.COM ACPI_EXPORT_SYMBOL (AcpiGetSleepTypeData)
711