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