xref: /onnv-gate/usr/src/uts/intel/io/acpica/events/evxfevnt.c (revision 9980:13d7f3eec672)
13446Smrj /******************************************************************************
23446Smrj  *
33446Smrj  * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
43446Smrj  *
53446Smrj  *****************************************************************************/
63446Smrj 
73446Smrj /******************************************************************************
83446Smrj  *
93446Smrj  * 1. Copyright Notice
103446Smrj  *
11*9980SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
123446Smrj  * All rights reserved.
133446Smrj  *
143446Smrj  * 2. License
153446Smrj  *
163446Smrj  * 2.1. This is your license from Intel Corp. under its intellectual property
173446Smrj  * rights.  You may have additional license terms from the party that provided
183446Smrj  * you this software, covering your right to use that party's intellectual
193446Smrj  * property rights.
203446Smrj  *
213446Smrj  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
223446Smrj  * copy of the source code appearing in this file ("Covered Code") an
233446Smrj  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
243446Smrj  * base code distributed originally by Intel ("Original Intel Code") to copy,
253446Smrj  * make derivatives, distribute, use and display any portion of the Covered
263446Smrj  * Code in any form, with the right to sublicense such rights; and
273446Smrj  *
283446Smrj  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
293446Smrj  * license (with the right to sublicense), under only those claims of Intel
303446Smrj  * patents that are infringed by the Original Intel Code, to make, use, sell,
313446Smrj  * offer to sell, and import the Covered Code and derivative works thereof
323446Smrj  * solely to the minimum extent necessary to exercise the above copyright
333446Smrj  * license, and in no event shall the patent license extend to any additions
343446Smrj  * to or modifications of the Original Intel Code.  No other license or right
353446Smrj  * is granted directly or by implication, estoppel or otherwise;
363446Smrj  *
373446Smrj  * The above copyright and patent license is granted only if the following
383446Smrj  * conditions are met:
393446Smrj  *
403446Smrj  * 3. Conditions
413446Smrj  *
423446Smrj  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
433446Smrj  * Redistribution of source code of any substantial portion of the Covered
443446Smrj  * Code or modification with rights to further distribute source must include
453446Smrj  * the above Copyright Notice, the above License, this list of Conditions,
463446Smrj  * and the following Disclaimer and Export Compliance provision.  In addition,
473446Smrj  * Licensee must cause all Covered Code to which Licensee contributes to
483446Smrj  * contain a file documenting the changes Licensee made to create that Covered
493446Smrj  * Code and the date of any change.  Licensee must include in that file the
503446Smrj  * documentation of any changes made by any predecessor Licensee.  Licensee
513446Smrj  * must include a prominent statement that the modification is derived,
523446Smrj  * directly or indirectly, from Original Intel Code.
533446Smrj  *
543446Smrj  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
553446Smrj  * Redistribution of source code of any substantial portion of the Covered
563446Smrj  * Code or modification without rights to further distribute source must
573446Smrj  * include the following Disclaimer and Export Compliance provision in the
583446Smrj  * documentation and/or other materials provided with distribution.  In
593446Smrj  * addition, Licensee may not authorize further sublicense of source of any
603446Smrj  * portion of the Covered Code, and must include terms to the effect that the
613446Smrj  * license from Licensee to its licensee is limited to the intellectual
623446Smrj  * property embodied in the software Licensee provides to its licensee, and
633446Smrj  * not to intellectual property embodied in modifications its licensee may
643446Smrj  * make.
653446Smrj  *
663446Smrj  * 3.3. Redistribution of Executable. Redistribution in executable form of any
673446Smrj  * substantial portion of the Covered Code or modification must reproduce the
683446Smrj  * above Copyright Notice, and the following Disclaimer and Export Compliance
693446Smrj  * provision in the documentation and/or other materials provided with the
703446Smrj  * distribution.
713446Smrj  *
723446Smrj  * 3.4. Intel retains all right, title, and interest in and to the Original
733446Smrj  * Intel Code.
743446Smrj  *
753446Smrj  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
763446Smrj  * Intel shall be used in advertising or otherwise to promote the sale, use or
773446Smrj  * other dealings in products derived from or relating to the Covered Code
783446Smrj  * without prior written authorization from Intel.
793446Smrj  *
803446Smrj  * 4. Disclaimer and Export Compliance
813446Smrj  *
823446Smrj  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
833446Smrj  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
843446Smrj  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
853446Smrj  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
863446Smrj  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
873446Smrj  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
883446Smrj  * PARTICULAR PURPOSE.
893446Smrj  *
903446Smrj  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
913446Smrj  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
923446Smrj  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
933446Smrj  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
943446Smrj  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
953446Smrj  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
963446Smrj  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
973446Smrj  * LIMITED REMEDY.
983446Smrj  *
993446Smrj  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1003446Smrj  * software or system incorporating such software without first obtaining any
1013446Smrj  * required license or other approval from the U. S. Department of Commerce or
1023446Smrj  * any other agency or department of the United States Government.  In the
1033446Smrj  * event Licensee exports any such software from the United States or
1043446Smrj  * re-exports any such software from a foreign destination, Licensee shall
1053446Smrj  * ensure that the distribution and export/re-export of the software is in
1063446Smrj  * compliance with all laws, regulations, orders, or other restrictions of the
1073446Smrj  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1083446Smrj  * any of its subsidiaries will export/re-export any technical data, process,
1093446Smrj  * software, or service, directly or indirectly, to any country for which the
1103446Smrj  * United States government or any agency thereof requires an export license,
1113446Smrj  * other governmental approval, or letter of assurance, without first obtaining
1123446Smrj  * such license, approval or letter.
1133446Smrj  *
1143446Smrj  *****************************************************************************/
1153446Smrj 
1163446Smrj 
1173446Smrj #define __EVXFEVNT_C__
1183446Smrj 
1193446Smrj #include "acpi.h"
120*9980SDana.Myers@Sun.COM #include "accommon.h"
1213446Smrj #include "acevents.h"
1223446Smrj #include "acnamesp.h"
1237851SDana.Myers@Sun.COM #include "actables.h"
1243446Smrj 
1253446Smrj #define _COMPONENT          ACPI_EVENTS
1263446Smrj         ACPI_MODULE_NAME    ("evxfevnt")
1273446Smrj 
128*9980SDana.Myers@Sun.COM /* Local prototypes */
129*9980SDana.Myers@Sun.COM 
130*9980SDana.Myers@Sun.COM static ACPI_STATUS
131*9980SDana.Myers@Sun.COM AcpiEvGetGpeDevice (
132*9980SDana.Myers@Sun.COM     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
133*9980SDana.Myers@Sun.COM     ACPI_GPE_BLOCK_INFO     *GpeBlock,
134*9980SDana.Myers@Sun.COM     void                    *Context);
135*9980SDana.Myers@Sun.COM 
1363446Smrj 
1373446Smrj /*******************************************************************************
1383446Smrj  *
1393446Smrj  * FUNCTION:    AcpiEnable
1403446Smrj  *
1413446Smrj  * PARAMETERS:  None
1423446Smrj  *
1433446Smrj  * RETURN:      Status
1443446Smrj  *
1453446Smrj  * DESCRIPTION: Transfers the system into ACPI mode.
1463446Smrj  *
1473446Smrj  ******************************************************************************/
1483446Smrj 
1493446Smrj ACPI_STATUS
AcpiEnable(void)1503446Smrj AcpiEnable (
1513446Smrj     void)
1523446Smrj {
1533446Smrj     ACPI_STATUS             Status = AE_OK;
1543446Smrj 
1553446Smrj 
1563446Smrj     ACPI_FUNCTION_TRACE (AcpiEnable);
1573446Smrj 
1583446Smrj 
1597851SDana.Myers@Sun.COM     /* ACPI tables must be present */
1603446Smrj 
1617851SDana.Myers@Sun.COM     if (!AcpiTbTablesLoaded ())
1623446Smrj     {
1633446Smrj         return_ACPI_STATUS (AE_NO_ACPI_TABLES);
1643446Smrj     }
1653446Smrj 
1667851SDana.Myers@Sun.COM     /* Check current mode */
1677851SDana.Myers@Sun.COM 
1683446Smrj     if (AcpiHwGetMode() == ACPI_SYS_MODE_ACPI)
1693446Smrj     {
1703446Smrj         ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "System is already in ACPI mode\n"));
1713446Smrj     }
1723446Smrj     else
1733446Smrj     {
1743446Smrj         /* Transition to ACPI mode */
1753446Smrj 
1763446Smrj         Status = AcpiHwSetMode (ACPI_SYS_MODE_ACPI);
1773446Smrj         if (ACPI_FAILURE (Status))
1783446Smrj         {
1793446Smrj             ACPI_ERROR ((AE_INFO, "Could not transition to ACPI mode"));
1803446Smrj             return_ACPI_STATUS (Status);
1813446Smrj         }
1823446Smrj 
1833446Smrj         ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
1843446Smrj             "Transition to ACPI mode successful\n"));
1853446Smrj     }
1863446Smrj 
1873446Smrj     return_ACPI_STATUS (Status);
1883446Smrj }
1893446Smrj 
ACPI_EXPORT_SYMBOL(AcpiEnable)1903446Smrj ACPI_EXPORT_SYMBOL (AcpiEnable)
1913446Smrj 
1923446Smrj 
1933446Smrj /*******************************************************************************
1943446Smrj  *
1953446Smrj  * FUNCTION:    AcpiDisable
1963446Smrj  *
1973446Smrj  * PARAMETERS:  None
1983446Smrj  *
1993446Smrj  * RETURN:      Status
2003446Smrj  *
2013446Smrj  * DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.
2023446Smrj  *
2033446Smrj  ******************************************************************************/
2043446Smrj 
2053446Smrj ACPI_STATUS
2063446Smrj AcpiDisable (
2073446Smrj     void)
2083446Smrj {
2093446Smrj     ACPI_STATUS             Status = AE_OK;
2103446Smrj 
2113446Smrj 
2123446Smrj     ACPI_FUNCTION_TRACE (AcpiDisable);
2133446Smrj 
2143446Smrj 
2153446Smrj     if (AcpiHwGetMode() == ACPI_SYS_MODE_LEGACY)
2163446Smrj     {
2173446Smrj         ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
2183446Smrj             "System is already in legacy (non-ACPI) mode\n"));
2193446Smrj     }
2203446Smrj     else
2213446Smrj     {
2223446Smrj         /* Transition to LEGACY mode */
2233446Smrj 
2243446Smrj         Status = AcpiHwSetMode (ACPI_SYS_MODE_LEGACY);
2253446Smrj 
2263446Smrj         if (ACPI_FAILURE (Status))
2273446Smrj         {
2283446Smrj             ACPI_ERROR ((AE_INFO,
2293446Smrj                 "Could not exit ACPI mode to legacy mode"));
2303446Smrj             return_ACPI_STATUS (Status);
2313446Smrj         }
2323446Smrj 
2333446Smrj         ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI mode disabled\n"));
2343446Smrj     }
2353446Smrj 
2363446Smrj     return_ACPI_STATUS (Status);
2373446Smrj }
2383446Smrj 
ACPI_EXPORT_SYMBOL(AcpiDisable)2393446Smrj ACPI_EXPORT_SYMBOL (AcpiDisable)
2403446Smrj 
2413446Smrj 
2423446Smrj /*******************************************************************************
2433446Smrj  *
2443446Smrj  * FUNCTION:    AcpiEnableEvent
2453446Smrj  *
2463446Smrj  * PARAMETERS:  Event           - The fixed eventto be enabled
2473446Smrj  *              Flags           - Reserved
2483446Smrj  *
2493446Smrj  * RETURN:      Status
2503446Smrj  *
2513446Smrj  * DESCRIPTION: Enable an ACPI event (fixed)
2523446Smrj  *
2533446Smrj  ******************************************************************************/
2543446Smrj 
2553446Smrj ACPI_STATUS
2563446Smrj AcpiEnableEvent (
2573446Smrj     UINT32                  Event,
2583446Smrj     UINT32                  Flags)
2593446Smrj {
2603446Smrj     ACPI_STATUS             Status = AE_OK;
2613446Smrj     UINT32                  Value;
2623446Smrj 
2633446Smrj 
2643446Smrj     ACPI_FUNCTION_TRACE (AcpiEnableEvent);
2653446Smrj 
2663446Smrj 
2673446Smrj     /* Decode the Fixed Event */
2683446Smrj 
2693446Smrj     if (Event > ACPI_EVENT_MAX)
2703446Smrj     {
2713446Smrj         return_ACPI_STATUS (AE_BAD_PARAMETER);
2723446Smrj     }
2733446Smrj 
2743446Smrj     /*
275*9980SDana.Myers@Sun.COM      * Enable the requested fixed event (by writing a one to the enable
276*9980SDana.Myers@Sun.COM      * register bit)
2773446Smrj      */
278*9980SDana.Myers@Sun.COM     Status = AcpiWriteBitRegister (
279*9980SDana.Myers@Sun.COM                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
280*9980SDana.Myers@Sun.COM                 ACPI_ENABLE_EVENT);
2813446Smrj     if (ACPI_FAILURE (Status))
2823446Smrj     {
2833446Smrj         return_ACPI_STATUS (Status);
2843446Smrj     }
2853446Smrj 
2863446Smrj     /* Make sure that the hardware responded */
2873446Smrj 
288*9980SDana.Myers@Sun.COM     Status = AcpiReadBitRegister (
289*9980SDana.Myers@Sun.COM                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value);
2903446Smrj     if (ACPI_FAILURE (Status))
2913446Smrj     {
2923446Smrj         return_ACPI_STATUS (Status);
2933446Smrj     }
2943446Smrj 
2953446Smrj     if (Value != 1)
2963446Smrj     {
2973446Smrj         ACPI_ERROR ((AE_INFO,
2983446Smrj             "Could not enable %s event", AcpiUtGetEventName (Event)));
2993446Smrj         return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
3003446Smrj     }
3013446Smrj 
3023446Smrj     return_ACPI_STATUS (Status);
3033446Smrj }
3043446Smrj 
ACPI_EXPORT_SYMBOL(AcpiEnableEvent)3053446Smrj ACPI_EXPORT_SYMBOL (AcpiEnableEvent)
3063446Smrj 
3073446Smrj 
3083446Smrj /*******************************************************************************
3093446Smrj  *
3103446Smrj  * FUNCTION:    AcpiSetGpeType
3113446Smrj  *
3123446Smrj  * PARAMETERS:  GpeDevice       - Parent GPE Device
3133446Smrj  *              GpeNumber       - GPE level within the GPE block
3143446Smrj  *              Type            - New GPE type
3153446Smrj  *
3163446Smrj  * RETURN:      Status
3173446Smrj  *
3183446Smrj  * DESCRIPTION: Set the type of an individual GPE
3193446Smrj  *
3203446Smrj  ******************************************************************************/
3213446Smrj 
3223446Smrj ACPI_STATUS
3233446Smrj AcpiSetGpeType (
3243446Smrj     ACPI_HANDLE             GpeDevice,
3253446Smrj     UINT32                  GpeNumber,
3263446Smrj     UINT8                   Type)
3273446Smrj {
3283446Smrj     ACPI_STATUS             Status = AE_OK;
3293446Smrj     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
3303446Smrj 
3313446Smrj 
3323446Smrj     ACPI_FUNCTION_TRACE (AcpiSetGpeType);
3333446Smrj 
3343446Smrj 
3353446Smrj     /* Ensure that we have a valid GPE number */
3363446Smrj 
3373446Smrj     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
3383446Smrj     if (!GpeEventInfo)
3393446Smrj     {
3403446Smrj         Status = AE_BAD_PARAMETER;
3413446Smrj         goto UnlockAndExit;
3423446Smrj     }
3433446Smrj 
3443446Smrj     if ((GpeEventInfo->Flags & ACPI_GPE_TYPE_MASK) == Type)
3453446Smrj     {
3463446Smrj         return_ACPI_STATUS (AE_OK);
3473446Smrj     }
3483446Smrj 
3493446Smrj     /* Set the new type (will disable GPE if currently enabled) */
3503446Smrj 
3513446Smrj     Status = AcpiEvSetGpeType (GpeEventInfo, Type);
3523446Smrj 
3533446Smrj UnlockAndExit:
3543446Smrj     return_ACPI_STATUS (Status);
3553446Smrj }
3563446Smrj 
ACPI_EXPORT_SYMBOL(AcpiSetGpeType)3573446Smrj ACPI_EXPORT_SYMBOL (AcpiSetGpeType)
3583446Smrj 
3593446Smrj 
3603446Smrj /*******************************************************************************
3613446Smrj  *
3623446Smrj  * FUNCTION:    AcpiEnableGpe
3633446Smrj  *
3643446Smrj  * PARAMETERS:  GpeDevice       - Parent GPE Device
3653446Smrj  *              GpeNumber       - GPE level within the GPE block
3663446Smrj  *              Flags           - Just enable, or also wake enable?
3673446Smrj  *                                Called from ISR or not
3683446Smrj  *
3693446Smrj  * RETURN:      Status
3703446Smrj  *
3713446Smrj  * DESCRIPTION: Enable an ACPI event (general purpose)
3723446Smrj  *
3733446Smrj  ******************************************************************************/
3743446Smrj 
3753446Smrj ACPI_STATUS
3763446Smrj AcpiEnableGpe (
3773446Smrj     ACPI_HANDLE             GpeDevice,
3783446Smrj     UINT32                  GpeNumber,
3793446Smrj     UINT32                  Flags)
3803446Smrj {
3813446Smrj     ACPI_STATUS             Status = AE_OK;
3823446Smrj     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
3833446Smrj 
3843446Smrj 
3853446Smrj     ACPI_FUNCTION_TRACE (AcpiEnableGpe);
3863446Smrj 
3873446Smrj 
3883446Smrj     /* Use semaphore lock if not executing at interrupt level */
3893446Smrj 
3903446Smrj     if (Flags & ACPI_NOT_ISR)
3913446Smrj     {
3923446Smrj         Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
3933446Smrj         if (ACPI_FAILURE (Status))
3943446Smrj         {
3953446Smrj             return_ACPI_STATUS (Status);
3963446Smrj         }
3973446Smrj     }
3983446Smrj 
3993446Smrj     /* Ensure that we have a valid GPE number */
4003446Smrj 
4013446Smrj     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
4023446Smrj     if (!GpeEventInfo)
4033446Smrj     {
4043446Smrj         Status = AE_BAD_PARAMETER;
4053446Smrj         goto UnlockAndExit;
4063446Smrj     }
4073446Smrj 
4083446Smrj     /* Perform the enable */
4093446Smrj 
4103446Smrj     Status = AcpiEvEnableGpe (GpeEventInfo, TRUE);
4113446Smrj 
4123446Smrj UnlockAndExit:
4133446Smrj     if (Flags & ACPI_NOT_ISR)
4143446Smrj     {
4153446Smrj         (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
4163446Smrj     }
4173446Smrj     return_ACPI_STATUS (Status);
4183446Smrj }
4193446Smrj 
ACPI_EXPORT_SYMBOL(AcpiEnableGpe)4203446Smrj ACPI_EXPORT_SYMBOL (AcpiEnableGpe)
4213446Smrj 
4223446Smrj 
4233446Smrj /*******************************************************************************
4243446Smrj  *
4253446Smrj  * FUNCTION:    AcpiDisableGpe
4263446Smrj  *
4273446Smrj  * PARAMETERS:  GpeDevice       - Parent GPE Device
4283446Smrj  *              GpeNumber       - GPE level within the GPE block
4293446Smrj  *              Flags           - Just disable, or also wake disable?
4303446Smrj  *                                Called from ISR or not
4313446Smrj  *
4323446Smrj  * RETURN:      Status
4333446Smrj  *
4343446Smrj  * DESCRIPTION: Disable an ACPI event (general purpose)
4353446Smrj  *
4363446Smrj  ******************************************************************************/
4373446Smrj 
4383446Smrj ACPI_STATUS
4393446Smrj AcpiDisableGpe (
4403446Smrj     ACPI_HANDLE             GpeDevice,
4413446Smrj     UINT32                  GpeNumber,
4423446Smrj     UINT32                  Flags)
4433446Smrj {
4443446Smrj     ACPI_STATUS             Status = AE_OK;
4453446Smrj     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
4463446Smrj 
4473446Smrj 
4483446Smrj     ACPI_FUNCTION_TRACE (AcpiDisableGpe);
4493446Smrj 
4503446Smrj 
4513446Smrj     /* Use semaphore lock if not executing at interrupt level */
4523446Smrj 
4533446Smrj     if (Flags & ACPI_NOT_ISR)
4543446Smrj     {
4553446Smrj         Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
4563446Smrj         if (ACPI_FAILURE (Status))
4573446Smrj         {
4583446Smrj             return_ACPI_STATUS (Status);
4593446Smrj         }
4603446Smrj     }
4613446Smrj 
4623446Smrj     /* Ensure that we have a valid GPE number */
4633446Smrj 
4643446Smrj     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
4653446Smrj     if (!GpeEventInfo)
4663446Smrj     {
4673446Smrj         Status = AE_BAD_PARAMETER;
4683446Smrj         goto UnlockAndExit;
4693446Smrj     }
4703446Smrj 
4713446Smrj     Status = AcpiEvDisableGpe (GpeEventInfo);
4723446Smrj 
4733446Smrj UnlockAndExit:
4743446Smrj     if (Flags & ACPI_NOT_ISR)
4753446Smrj     {
4763446Smrj         (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
4773446Smrj     }
4783446Smrj     return_ACPI_STATUS (Status);
4793446Smrj }
4803446Smrj 
ACPI_EXPORT_SYMBOL(AcpiDisableGpe)4813446Smrj ACPI_EXPORT_SYMBOL (AcpiDisableGpe)
4823446Smrj 
4833446Smrj 
4843446Smrj /*******************************************************************************
4853446Smrj  *
4863446Smrj  * FUNCTION:    AcpiDisableEvent
4873446Smrj  *
4883446Smrj  * PARAMETERS:  Event           - The fixed eventto be enabled
4893446Smrj  *              Flags           - Reserved
4903446Smrj  *
4913446Smrj  * RETURN:      Status
4923446Smrj  *
4933446Smrj  * DESCRIPTION: Disable an ACPI event (fixed)
4943446Smrj  *
4953446Smrj  ******************************************************************************/
4963446Smrj 
4973446Smrj ACPI_STATUS
4983446Smrj AcpiDisableEvent (
4993446Smrj     UINT32                  Event,
5003446Smrj     UINT32                  Flags)
5013446Smrj {
5023446Smrj     ACPI_STATUS             Status = AE_OK;
5033446Smrj     UINT32                  Value;
5043446Smrj 
5053446Smrj 
5063446Smrj     ACPI_FUNCTION_TRACE (AcpiDisableEvent);
5073446Smrj 
5083446Smrj 
5093446Smrj     /* Decode the Fixed Event */
5103446Smrj 
5113446Smrj     if (Event > ACPI_EVENT_MAX)
5123446Smrj     {
5133446Smrj         return_ACPI_STATUS (AE_BAD_PARAMETER);
5143446Smrj     }
5153446Smrj 
5163446Smrj     /*
517*9980SDana.Myers@Sun.COM      * Disable the requested fixed event (by writing a zero to the enable
518*9980SDana.Myers@Sun.COM      * register bit)
5193446Smrj      */
520*9980SDana.Myers@Sun.COM     Status = AcpiWriteBitRegister (
521*9980SDana.Myers@Sun.COM                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
522*9980SDana.Myers@Sun.COM                 ACPI_DISABLE_EVENT);
5233446Smrj     if (ACPI_FAILURE (Status))
5243446Smrj     {
5253446Smrj         return_ACPI_STATUS (Status);
5263446Smrj     }
5273446Smrj 
528*9980SDana.Myers@Sun.COM     Status = AcpiReadBitRegister (
529*9980SDana.Myers@Sun.COM                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value);
5303446Smrj     if (ACPI_FAILURE (Status))
5313446Smrj     {
5323446Smrj         return_ACPI_STATUS (Status);
5333446Smrj     }
5343446Smrj 
5353446Smrj     if (Value != 0)
5363446Smrj     {
5373446Smrj         ACPI_ERROR ((AE_INFO,
5383446Smrj             "Could not disable %s events", AcpiUtGetEventName (Event)));
5393446Smrj         return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
5403446Smrj     }
5413446Smrj 
5423446Smrj     return_ACPI_STATUS (Status);
5433446Smrj }
5443446Smrj 
ACPI_EXPORT_SYMBOL(AcpiDisableEvent)5453446Smrj ACPI_EXPORT_SYMBOL (AcpiDisableEvent)
5463446Smrj 
5473446Smrj 
5483446Smrj /*******************************************************************************
5493446Smrj  *
5503446Smrj  * FUNCTION:    AcpiClearEvent
5513446Smrj  *
5523446Smrj  * PARAMETERS:  Event           - The fixed event to be cleared
5533446Smrj  *
5543446Smrj  * RETURN:      Status
5553446Smrj  *
5563446Smrj  * DESCRIPTION: Clear an ACPI event (fixed)
5573446Smrj  *
5583446Smrj  ******************************************************************************/
5593446Smrj 
5603446Smrj ACPI_STATUS
5613446Smrj AcpiClearEvent (
5623446Smrj     UINT32                  Event)
5633446Smrj {
5643446Smrj     ACPI_STATUS             Status = AE_OK;
5653446Smrj 
5663446Smrj 
5673446Smrj     ACPI_FUNCTION_TRACE (AcpiClearEvent);
5683446Smrj 
5693446Smrj 
5703446Smrj     /* Decode the Fixed Event */
5713446Smrj 
5723446Smrj     if (Event > ACPI_EVENT_MAX)
5733446Smrj     {
5743446Smrj         return_ACPI_STATUS (AE_BAD_PARAMETER);
5753446Smrj     }
5763446Smrj 
5773446Smrj     /*
578*9980SDana.Myers@Sun.COM      * Clear the requested fixed event (By writing a one to the status
579*9980SDana.Myers@Sun.COM      * register bit)
5803446Smrj      */
581*9980SDana.Myers@Sun.COM     Status = AcpiWriteBitRegister (
582*9980SDana.Myers@Sun.COM                 AcpiGbl_FixedEventInfo[Event].StatusRegisterId,
583*9980SDana.Myers@Sun.COM                 ACPI_CLEAR_STATUS);
5843446Smrj 
5853446Smrj     return_ACPI_STATUS (Status);
5863446Smrj }
5873446Smrj 
ACPI_EXPORT_SYMBOL(AcpiClearEvent)5883446Smrj ACPI_EXPORT_SYMBOL (AcpiClearEvent)
5893446Smrj 
5903446Smrj 
5913446Smrj /*******************************************************************************
5923446Smrj  *
5933446Smrj  * FUNCTION:    AcpiClearGpe
5943446Smrj  *
5953446Smrj  * PARAMETERS:  GpeDevice       - Parent GPE Device
5963446Smrj  *              GpeNumber       - GPE level within the GPE block
5973446Smrj  *              Flags           - Called from an ISR or not
5983446Smrj  *
5993446Smrj  * RETURN:      Status
6003446Smrj  *
6013446Smrj  * DESCRIPTION: Clear an ACPI event (general purpose)
6023446Smrj  *
6033446Smrj  ******************************************************************************/
6043446Smrj 
6053446Smrj ACPI_STATUS
6063446Smrj AcpiClearGpe (
6073446Smrj     ACPI_HANDLE             GpeDevice,
6083446Smrj     UINT32                  GpeNumber,
6093446Smrj     UINT32                  Flags)
6103446Smrj {
6113446Smrj     ACPI_STATUS             Status = AE_OK;
6123446Smrj     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
6133446Smrj 
6143446Smrj 
6153446Smrj     ACPI_FUNCTION_TRACE (AcpiClearGpe);
6163446Smrj 
6173446Smrj 
6183446Smrj     /* Use semaphore lock if not executing at interrupt level */
6193446Smrj 
6203446Smrj     if (Flags & ACPI_NOT_ISR)
6213446Smrj     {
6223446Smrj         Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
6233446Smrj         if (ACPI_FAILURE (Status))
6243446Smrj         {
6253446Smrj             return_ACPI_STATUS (Status);
6263446Smrj         }
6273446Smrj     }
6283446Smrj 
6293446Smrj     /* Ensure that we have a valid GPE number */
6303446Smrj 
6313446Smrj     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
6323446Smrj     if (!GpeEventInfo)
6333446Smrj     {
6343446Smrj         Status = AE_BAD_PARAMETER;
6353446Smrj         goto UnlockAndExit;
6363446Smrj     }
6373446Smrj 
6383446Smrj     Status = AcpiHwClearGpe (GpeEventInfo);
6393446Smrj 
6403446Smrj UnlockAndExit:
6413446Smrj     if (Flags & ACPI_NOT_ISR)
6423446Smrj     {
6433446Smrj         (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
6443446Smrj     }
6453446Smrj     return_ACPI_STATUS (Status);
6463446Smrj }
6473446Smrj 
ACPI_EXPORT_SYMBOL(AcpiClearGpe)6483446Smrj ACPI_EXPORT_SYMBOL (AcpiClearGpe)
6493446Smrj 
6503446Smrj 
6513446Smrj /*******************************************************************************
6523446Smrj  *
6533446Smrj  * FUNCTION:    AcpiGetEventStatus
6543446Smrj  *
6553446Smrj  * PARAMETERS:  Event           - The fixed event
6563446Smrj  *              EventStatus     - Where the current status of the event will
6573446Smrj  *                                be returned
6583446Smrj  *
6593446Smrj  * RETURN:      Status
6603446Smrj  *
6613446Smrj  * DESCRIPTION: Obtains and returns the current status of the event
6623446Smrj  *
6633446Smrj  ******************************************************************************/
6643446Smrj 
6653446Smrj ACPI_STATUS
6663446Smrj AcpiGetEventStatus (
6673446Smrj     UINT32                  Event,
6683446Smrj     ACPI_EVENT_STATUS       *EventStatus)
6693446Smrj {
6703446Smrj     ACPI_STATUS             Status = AE_OK;
6713446Smrj 
6723446Smrj 
6733446Smrj     ACPI_FUNCTION_TRACE (AcpiGetEventStatus);
6743446Smrj 
6753446Smrj 
6763446Smrj     if (!EventStatus)
6773446Smrj     {
6783446Smrj         return_ACPI_STATUS (AE_BAD_PARAMETER);
6793446Smrj     }
6803446Smrj 
6813446Smrj     /* Decode the Fixed Event */
6823446Smrj 
6833446Smrj     if (Event > ACPI_EVENT_MAX)
6843446Smrj     {
6853446Smrj         return_ACPI_STATUS (AE_BAD_PARAMETER);
6863446Smrj     }
6873446Smrj 
6883446Smrj     /* Get the status of the requested fixed event */
6893446Smrj 
690*9980SDana.Myers@Sun.COM     Status = AcpiReadBitRegister (
691*9980SDana.Myers@Sun.COM                 AcpiGbl_FixedEventInfo[Event].StatusRegisterId, EventStatus);
6923446Smrj 
6933446Smrj     return_ACPI_STATUS (Status);
6943446Smrj }
6953446Smrj 
ACPI_EXPORT_SYMBOL(AcpiGetEventStatus)6963446Smrj ACPI_EXPORT_SYMBOL (AcpiGetEventStatus)
6973446Smrj 
6983446Smrj 
6993446Smrj /*******************************************************************************
7003446Smrj  *
7013446Smrj  * FUNCTION:    AcpiGetGpeStatus
7023446Smrj  *
7033446Smrj  * PARAMETERS:  GpeDevice       - Parent GPE Device
7043446Smrj  *              GpeNumber       - GPE level within the GPE block
7053446Smrj  *              Flags           - Called from an ISR or not
7063446Smrj  *              EventStatus     - Where the current status of the event will
7073446Smrj  *                                be returned
7083446Smrj  *
7093446Smrj  * RETURN:      Status
7103446Smrj  *
7113446Smrj  * DESCRIPTION: Get status of an event (general purpose)
7123446Smrj  *
7133446Smrj  ******************************************************************************/
7143446Smrj 
7153446Smrj ACPI_STATUS
7163446Smrj AcpiGetGpeStatus (
7173446Smrj     ACPI_HANDLE             GpeDevice,
7183446Smrj     UINT32                  GpeNumber,
7193446Smrj     UINT32                  Flags,
7203446Smrj     ACPI_EVENT_STATUS       *EventStatus)
7213446Smrj {
7223446Smrj     ACPI_STATUS             Status = AE_OK;
7233446Smrj     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
7243446Smrj 
7253446Smrj 
7263446Smrj     ACPI_FUNCTION_TRACE (AcpiGetGpeStatus);
7273446Smrj 
7283446Smrj 
7293446Smrj     /* Use semaphore lock if not executing at interrupt level */
7303446Smrj 
7313446Smrj     if (Flags & ACPI_NOT_ISR)
7323446Smrj     {
7333446Smrj         Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
7343446Smrj         if (ACPI_FAILURE (Status))
7353446Smrj         {
7363446Smrj             return_ACPI_STATUS (Status);
7373446Smrj         }
7383446Smrj     }
7393446Smrj 
7403446Smrj     /* Ensure that we have a valid GPE number */
7413446Smrj 
7423446Smrj     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
7433446Smrj     if (!GpeEventInfo)
7443446Smrj     {
7453446Smrj         Status = AE_BAD_PARAMETER;
7463446Smrj         goto UnlockAndExit;
7473446Smrj     }
7483446Smrj 
7493446Smrj     /* Obtain status on the requested GPE number */
7503446Smrj 
7513446Smrj     Status = AcpiHwGetGpeStatus (GpeEventInfo, EventStatus);
7523446Smrj 
7533446Smrj UnlockAndExit:
7543446Smrj     if (Flags & ACPI_NOT_ISR)
7553446Smrj     {
7563446Smrj         (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
7573446Smrj     }
7583446Smrj     return_ACPI_STATUS (Status);
7593446Smrj }
7603446Smrj 
ACPI_EXPORT_SYMBOL(AcpiGetGpeStatus)7613446Smrj ACPI_EXPORT_SYMBOL (AcpiGetGpeStatus)
7623446Smrj 
7633446Smrj 
7643446Smrj /*******************************************************************************
7653446Smrj  *
7663446Smrj  * FUNCTION:    AcpiInstallGpeBlock
7673446Smrj  *
7683446Smrj  * PARAMETERS:  GpeDevice           - Handle to the parent GPE Block Device
7693446Smrj  *              GpeBlockAddress     - Address and SpaceID
7703446Smrj  *              RegisterCount       - Number of GPE register pairs in the block
7713446Smrj  *              InterruptNumber     - H/W interrupt for the block
7723446Smrj  *
7733446Smrj  * RETURN:      Status
7743446Smrj  *
7753446Smrj  * DESCRIPTION: Create and Install a block of GPE registers
7763446Smrj  *
7773446Smrj  ******************************************************************************/
7783446Smrj 
7793446Smrj ACPI_STATUS
7803446Smrj AcpiInstallGpeBlock (
7813446Smrj     ACPI_HANDLE             GpeDevice,
7823446Smrj     ACPI_GENERIC_ADDRESS    *GpeBlockAddress,
7833446Smrj     UINT32                  RegisterCount,
7843446Smrj     UINT32                  InterruptNumber)
7853446Smrj {
7863446Smrj     ACPI_STATUS             Status;
7873446Smrj     ACPI_OPERAND_OBJECT     *ObjDesc;
7883446Smrj     ACPI_NAMESPACE_NODE     *Node;
7893446Smrj     ACPI_GPE_BLOCK_INFO     *GpeBlock;
7903446Smrj 
7913446Smrj 
7923446Smrj     ACPI_FUNCTION_TRACE (AcpiInstallGpeBlock);
7933446Smrj 
7943446Smrj 
7953446Smrj     if ((!GpeDevice)       ||
7963446Smrj         (!GpeBlockAddress) ||
7973446Smrj         (!RegisterCount))
7983446Smrj     {
7993446Smrj         return_ACPI_STATUS (AE_BAD_PARAMETER);
8003446Smrj     }
8013446Smrj 
8023446Smrj     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
8033446Smrj     if (ACPI_FAILURE (Status))
8043446Smrj     {
8053446Smrj         return (Status);
8063446Smrj     }
8073446Smrj 
8083446Smrj     Node = AcpiNsMapHandleToNode (GpeDevice);
8093446Smrj     if (!Node)
8103446Smrj     {
8113446Smrj         Status = AE_BAD_PARAMETER;
8123446Smrj         goto UnlockAndExit;
8133446Smrj     }
8143446Smrj 
8153446Smrj     /*
8163446Smrj      * For user-installed GPE Block Devices, the GpeBlockBaseNumber
8173446Smrj      * is always zero
8183446Smrj      */
8193446Smrj     Status = AcpiEvCreateGpeBlock (Node, GpeBlockAddress, RegisterCount,
820*9980SDana.Myers@Sun.COM                 0, InterruptNumber, &GpeBlock);
8213446Smrj     if (ACPI_FAILURE (Status))
8223446Smrj     {
8233446Smrj         goto UnlockAndExit;
8243446Smrj     }
8253446Smrj 
8263446Smrj     /* Run the _PRW methods and enable the GPEs */
8273446Smrj 
8283446Smrj     Status = AcpiEvInitializeGpeBlock (Node, GpeBlock);
8293446Smrj     if (ACPI_FAILURE (Status))
8303446Smrj     {
8313446Smrj         goto UnlockAndExit;
8323446Smrj     }
8333446Smrj 
8343446Smrj     /* Get the DeviceObject attached to the node */
8353446Smrj 
8363446Smrj     ObjDesc = AcpiNsGetAttachedObject (Node);
8373446Smrj     if (!ObjDesc)
8383446Smrj     {
8393446Smrj         /* No object, create a new one */
8403446Smrj 
8413446Smrj         ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_DEVICE);
8423446Smrj         if (!ObjDesc)
8433446Smrj         {
8443446Smrj             Status = AE_NO_MEMORY;
8453446Smrj             goto UnlockAndExit;
8463446Smrj         }
8473446Smrj 
8483446Smrj         Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_DEVICE);
8493446Smrj 
8503446Smrj         /* Remove local reference to the object */
8513446Smrj 
8523446Smrj         AcpiUtRemoveReference (ObjDesc);
8533446Smrj 
8543446Smrj         if (ACPI_FAILURE (Status))
8553446Smrj         {
8563446Smrj             goto UnlockAndExit;
8573446Smrj         }
8583446Smrj     }
8593446Smrj 
8603446Smrj     /* Install the GPE block in the DeviceObject */
8613446Smrj 
8623446Smrj     ObjDesc->Device.GpeBlock = GpeBlock;
8633446Smrj 
8643446Smrj 
8653446Smrj UnlockAndExit:
8663446Smrj     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
8673446Smrj     return_ACPI_STATUS (Status);
8683446Smrj }
8693446Smrj 
ACPI_EXPORT_SYMBOL(AcpiInstallGpeBlock)8703446Smrj ACPI_EXPORT_SYMBOL (AcpiInstallGpeBlock)
8713446Smrj 
8723446Smrj 
8733446Smrj /*******************************************************************************
8743446Smrj  *
8753446Smrj  * FUNCTION:    AcpiRemoveGpeBlock
8763446Smrj  *
8773446Smrj  * PARAMETERS:  GpeDevice           - Handle to the parent GPE Block Device
8783446Smrj  *
8793446Smrj  * RETURN:      Status
8803446Smrj  *
8813446Smrj  * DESCRIPTION: Remove a previously installed block of GPE registers
8823446Smrj  *
8833446Smrj  ******************************************************************************/
8843446Smrj 
8853446Smrj ACPI_STATUS
8863446Smrj AcpiRemoveGpeBlock (
8873446Smrj     ACPI_HANDLE             GpeDevice)
8883446Smrj {
8893446Smrj     ACPI_OPERAND_OBJECT     *ObjDesc;
8903446Smrj     ACPI_STATUS             Status;
8913446Smrj     ACPI_NAMESPACE_NODE     *Node;
8923446Smrj 
8933446Smrj 
8943446Smrj     ACPI_FUNCTION_TRACE (AcpiRemoveGpeBlock);
8953446Smrj 
8963446Smrj 
8973446Smrj     if (!GpeDevice)
8983446Smrj     {
8993446Smrj         return_ACPI_STATUS (AE_BAD_PARAMETER);
9003446Smrj     }
9013446Smrj 
9023446Smrj     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
9033446Smrj     if (ACPI_FAILURE (Status))
9043446Smrj     {
9053446Smrj         return (Status);
9063446Smrj     }
9073446Smrj 
9083446Smrj     Node = AcpiNsMapHandleToNode (GpeDevice);
9093446Smrj     if (!Node)
9103446Smrj     {
9113446Smrj         Status = AE_BAD_PARAMETER;
9123446Smrj         goto UnlockAndExit;
9133446Smrj     }
9143446Smrj 
9153446Smrj     /* Get the DeviceObject attached to the node */
9163446Smrj 
9173446Smrj     ObjDesc = AcpiNsGetAttachedObject (Node);
9183446Smrj     if (!ObjDesc ||
9193446Smrj         !ObjDesc->Device.GpeBlock)
9203446Smrj     {
9213446Smrj         return_ACPI_STATUS (AE_NULL_OBJECT);
9223446Smrj     }
9233446Smrj 
9243446Smrj     /* Delete the GPE block (but not the DeviceObject) */
9253446Smrj 
9263446Smrj     Status = AcpiEvDeleteGpeBlock (ObjDesc->Device.GpeBlock);
9273446Smrj     if (ACPI_SUCCESS (Status))
9283446Smrj     {
9293446Smrj         ObjDesc->Device.GpeBlock = NULL;
9303446Smrj     }
9313446Smrj 
9323446Smrj UnlockAndExit:
9333446Smrj     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
9343446Smrj     return_ACPI_STATUS (Status);
9353446Smrj }
9363446Smrj 
ACPI_EXPORT_SYMBOL(AcpiRemoveGpeBlock)9373446Smrj ACPI_EXPORT_SYMBOL (AcpiRemoveGpeBlock)
9383446Smrj 
939*9980SDana.Myers@Sun.COM 
940*9980SDana.Myers@Sun.COM /*******************************************************************************
941*9980SDana.Myers@Sun.COM  *
942*9980SDana.Myers@Sun.COM  * FUNCTION:    AcpiGetGpeDevice
943*9980SDana.Myers@Sun.COM  *
944*9980SDana.Myers@Sun.COM  * PARAMETERS:  Index               - System GPE index (0-CurrentGpeCount)
945*9980SDana.Myers@Sun.COM  *              GpeDevice           - Where the parent GPE Device is returned
946*9980SDana.Myers@Sun.COM  *
947*9980SDana.Myers@Sun.COM  * RETURN:      Status
948*9980SDana.Myers@Sun.COM  *
949*9980SDana.Myers@Sun.COM  * DESCRIPTION: Obtain the GPE device associated with the input index. A NULL
950*9980SDana.Myers@Sun.COM  *              gpe device indicates that the gpe number is contained in one of
951*9980SDana.Myers@Sun.COM  *              the FADT-defined gpe blocks. Otherwise, the GPE block device.
952*9980SDana.Myers@Sun.COM  *
953*9980SDana.Myers@Sun.COM  ******************************************************************************/
954*9980SDana.Myers@Sun.COM 
955*9980SDana.Myers@Sun.COM ACPI_STATUS
956*9980SDana.Myers@Sun.COM AcpiGetGpeDevice (
957*9980SDana.Myers@Sun.COM     UINT32                  Index,
958*9980SDana.Myers@Sun.COM     ACPI_HANDLE             *GpeDevice)
959*9980SDana.Myers@Sun.COM {
960*9980SDana.Myers@Sun.COM     ACPI_GPE_DEVICE_INFO    Info;
961*9980SDana.Myers@Sun.COM     ACPI_STATUS             Status;
962*9980SDana.Myers@Sun.COM 
963*9980SDana.Myers@Sun.COM 
964*9980SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (AcpiGetGpeDevice);
965*9980SDana.Myers@Sun.COM 
966*9980SDana.Myers@Sun.COM 
967*9980SDana.Myers@Sun.COM     if (!GpeDevice)
968*9980SDana.Myers@Sun.COM     {
969*9980SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_BAD_PARAMETER);
970*9980SDana.Myers@Sun.COM     }
971*9980SDana.Myers@Sun.COM 
972*9980SDana.Myers@Sun.COM     if (Index >= AcpiCurrentGpeCount)
973*9980SDana.Myers@Sun.COM     {
974*9980SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NOT_EXIST);
975*9980SDana.Myers@Sun.COM     }
976*9980SDana.Myers@Sun.COM 
977*9980SDana.Myers@Sun.COM     /* Setup and walk the GPE list */
978*9980SDana.Myers@Sun.COM 
979*9980SDana.Myers@Sun.COM     Info.Index = Index;
980*9980SDana.Myers@Sun.COM     Info.Status = AE_NOT_EXIST;
981*9980SDana.Myers@Sun.COM     Info.GpeDevice = NULL;
982*9980SDana.Myers@Sun.COM     Info.NextBlockBaseIndex = 0;
983*9980SDana.Myers@Sun.COM 
984*9980SDana.Myers@Sun.COM     Status = AcpiEvWalkGpeList (AcpiEvGetGpeDevice, &Info);
985*9980SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
986*9980SDana.Myers@Sun.COM     {
987*9980SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
988*9980SDana.Myers@Sun.COM     }
989*9980SDana.Myers@Sun.COM 
990*9980SDana.Myers@Sun.COM     *GpeDevice = ACPI_CAST_PTR (ACPI_HANDLE, Info.GpeDevice);
991*9980SDana.Myers@Sun.COM     return_ACPI_STATUS (Info.Status);
992*9980SDana.Myers@Sun.COM }
993*9980SDana.Myers@Sun.COM 
ACPI_EXPORT_SYMBOL(AcpiGetGpeDevice)994*9980SDana.Myers@Sun.COM ACPI_EXPORT_SYMBOL (AcpiGetGpeDevice)
995*9980SDana.Myers@Sun.COM 
996*9980SDana.Myers@Sun.COM 
997*9980SDana.Myers@Sun.COM /*******************************************************************************
998*9980SDana.Myers@Sun.COM  *
999*9980SDana.Myers@Sun.COM  * FUNCTION:    AcpiEvGetGpeDevice
1000*9980SDana.Myers@Sun.COM  *
1001*9980SDana.Myers@Sun.COM  * PARAMETERS:  GPE_WALK_CALLBACK
1002*9980SDana.Myers@Sun.COM  *
1003*9980SDana.Myers@Sun.COM  * RETURN:      Status
1004*9980SDana.Myers@Sun.COM  *
1005*9980SDana.Myers@Sun.COM  * DESCRIPTION: Matches the input GPE index (0-CurrentGpeCount) with a GPE
1006*9980SDana.Myers@Sun.COM  *              block device. NULL if the GPE is one of the FADT-defined GPEs.
1007*9980SDana.Myers@Sun.COM  *
1008*9980SDana.Myers@Sun.COM  ******************************************************************************/
1009*9980SDana.Myers@Sun.COM 
1010*9980SDana.Myers@Sun.COM static ACPI_STATUS
1011*9980SDana.Myers@Sun.COM AcpiEvGetGpeDevice (
1012*9980SDana.Myers@Sun.COM     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
1013*9980SDana.Myers@Sun.COM     ACPI_GPE_BLOCK_INFO     *GpeBlock,
1014*9980SDana.Myers@Sun.COM     void                    *Context)
1015*9980SDana.Myers@Sun.COM {
1016*9980SDana.Myers@Sun.COM     ACPI_GPE_DEVICE_INFO    *Info = Context;
1017*9980SDana.Myers@Sun.COM 
1018*9980SDana.Myers@Sun.COM 
1019*9980SDana.Myers@Sun.COM     /* Increment Index by the number of GPEs in this block */
1020*9980SDana.Myers@Sun.COM 
1021*9980SDana.Myers@Sun.COM     Info->NextBlockBaseIndex +=
1022*9980SDana.Myers@Sun.COM         (GpeBlock->RegisterCount * ACPI_GPE_REGISTER_WIDTH);
1023*9980SDana.Myers@Sun.COM 
1024*9980SDana.Myers@Sun.COM     if (Info->Index < Info->NextBlockBaseIndex)
1025*9980SDana.Myers@Sun.COM     {
1026*9980SDana.Myers@Sun.COM         /*
1027*9980SDana.Myers@Sun.COM          * The GPE index is within this block, get the node. Leave the node
1028*9980SDana.Myers@Sun.COM          * NULL for the FADT-defined GPEs
1029*9980SDana.Myers@Sun.COM          */
1030*9980SDana.Myers@Sun.COM         if ((GpeBlock->Node)->Type == ACPI_TYPE_DEVICE)
1031*9980SDana.Myers@Sun.COM         {
1032*9980SDana.Myers@Sun.COM             Info->GpeDevice = GpeBlock->Node;
1033*9980SDana.Myers@Sun.COM         }
1034*9980SDana.Myers@Sun.COM 
1035*9980SDana.Myers@Sun.COM         Info->Status = AE_OK;
1036*9980SDana.Myers@Sun.COM         return (AE_CTRL_END);
1037*9980SDana.Myers@Sun.COM     }
1038*9980SDana.Myers@Sun.COM 
1039*9980SDana.Myers@Sun.COM     return (AE_OK);
1040*9980SDana.Myers@Sun.COM }
1041*9980SDana.Myers@Sun.COM 
1042*9980SDana.Myers@Sun.COM 
1043*9980SDana.Myers@Sun.COM /******************************************************************************
1044*9980SDana.Myers@Sun.COM  *
1045*9980SDana.Myers@Sun.COM  * FUNCTION:    AcpiDisableAllGpes
1046*9980SDana.Myers@Sun.COM  *
1047*9980SDana.Myers@Sun.COM  * PARAMETERS:  None
1048*9980SDana.Myers@Sun.COM  *
1049*9980SDana.Myers@Sun.COM  * RETURN:      Status
1050*9980SDana.Myers@Sun.COM  *
1051*9980SDana.Myers@Sun.COM  * DESCRIPTION: Disable and clear all GPEs in all GPE blocks
1052*9980SDana.Myers@Sun.COM  *
1053*9980SDana.Myers@Sun.COM  ******************************************************************************/
1054*9980SDana.Myers@Sun.COM 
1055*9980SDana.Myers@Sun.COM ACPI_STATUS
AcpiDisableAllGpes(void)1056*9980SDana.Myers@Sun.COM AcpiDisableAllGpes (
1057*9980SDana.Myers@Sun.COM     void)
1058*9980SDana.Myers@Sun.COM {
1059*9980SDana.Myers@Sun.COM     ACPI_STATUS             Status;
1060*9980SDana.Myers@Sun.COM 
1061*9980SDana.Myers@Sun.COM 
1062*9980SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (AcpiDisableAllGpes);
1063*9980SDana.Myers@Sun.COM 
1064*9980SDana.Myers@Sun.COM 
1065*9980SDana.Myers@Sun.COM     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
1066*9980SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
1067*9980SDana.Myers@Sun.COM     {
1068*9980SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
1069*9980SDana.Myers@Sun.COM     }
1070*9980SDana.Myers@Sun.COM 
1071*9980SDana.Myers@Sun.COM     Status = AcpiHwDisableAllGpes ();
1072*9980SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
1073*9980SDana.Myers@Sun.COM 
1074*9980SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
1075*9980SDana.Myers@Sun.COM }
1076*9980SDana.Myers@Sun.COM 
1077*9980SDana.Myers@Sun.COM 
1078*9980SDana.Myers@Sun.COM /******************************************************************************
1079*9980SDana.Myers@Sun.COM  *
1080*9980SDana.Myers@Sun.COM  * FUNCTION:    AcpiEnableAllRuntimeGpes
1081*9980SDana.Myers@Sun.COM  *
1082*9980SDana.Myers@Sun.COM  * PARAMETERS:  None
1083*9980SDana.Myers@Sun.COM  *
1084*9980SDana.Myers@Sun.COM  * RETURN:      Status
1085*9980SDana.Myers@Sun.COM  *
1086*9980SDana.Myers@Sun.COM  * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks
1087*9980SDana.Myers@Sun.COM  *
1088*9980SDana.Myers@Sun.COM  ******************************************************************************/
1089*9980SDana.Myers@Sun.COM 
1090*9980SDana.Myers@Sun.COM ACPI_STATUS
AcpiEnableAllRuntimeGpes(void)1091*9980SDana.Myers@Sun.COM AcpiEnableAllRuntimeGpes (
1092*9980SDana.Myers@Sun.COM     void)
1093*9980SDana.Myers@Sun.COM {
1094*9980SDana.Myers@Sun.COM     ACPI_STATUS             Status;
1095*9980SDana.Myers@Sun.COM 
1096*9980SDana.Myers@Sun.COM 
1097*9980SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (AcpiEnableAllRuntimeGpes);
1098*9980SDana.Myers@Sun.COM 
1099*9980SDana.Myers@Sun.COM 
1100*9980SDana.Myers@Sun.COM     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
1101*9980SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
1102*9980SDana.Myers@Sun.COM     {
1103*9980SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
1104*9980SDana.Myers@Sun.COM     }
1105*9980SDana.Myers@Sun.COM 
1106*9980SDana.Myers@Sun.COM     Status = AcpiHwEnableAllRuntimeGpes ();
1107*9980SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
1108*9980SDana.Myers@Sun.COM 
1109*9980SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
1110*9980SDana.Myers@Sun.COM }
1111*9980SDana.Myers@Sun.COM 
1112*9980SDana.Myers@Sun.COM 
1113