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