Home | History | Annotate | Line # | Download | only in events
evxfgpe.c revision 1.1.1.13
      1       1.1    jruoho /******************************************************************************
      2       1.1    jruoho  *
      3       1.1    jruoho  * Module Name: evxfgpe - External Interfaces for General Purpose Events (GPEs)
      4       1.1    jruoho  *
      5       1.1    jruoho  *****************************************************************************/
      6       1.1    jruoho 
      7       1.1    jruoho /*
      8  1.1.1.13  christos  * Copyright (C) 2000 - 2021, Intel Corp.
      9       1.1    jruoho  * All rights reserved.
     10       1.1    jruoho  *
     11       1.1    jruoho  * Redistribution and use in source and binary forms, with or without
     12       1.1    jruoho  * modification, are permitted provided that the following conditions
     13       1.1    jruoho  * are met:
     14       1.1    jruoho  * 1. Redistributions of source code must retain the above copyright
     15       1.1    jruoho  *    notice, this list of conditions, and the following disclaimer,
     16       1.1    jruoho  *    without modification.
     17       1.1    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18       1.1    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19       1.1    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20       1.1    jruoho  *    including a substantially similar Disclaimer requirement for further
     21       1.1    jruoho  *    binary redistribution.
     22       1.1    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23       1.1    jruoho  *    of any contributors may be used to endorse or promote products derived
     24       1.1    jruoho  *    from this software without specific prior written permission.
     25       1.1    jruoho  *
     26       1.1    jruoho  * Alternatively, this software may be distributed under the terms of the
     27       1.1    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28       1.1    jruoho  * Software Foundation.
     29       1.1    jruoho  *
     30       1.1    jruoho  * NO WARRANTY
     31       1.1    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32       1.1    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.13  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34       1.1    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35       1.1    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36       1.1    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37       1.1    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38       1.1    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39       1.1    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40       1.1    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41       1.1    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42       1.1    jruoho  */
     43       1.1    jruoho 
     44   1.1.1.3  christos #define EXPORT_ACPI_INTERFACES
     45       1.1    jruoho 
     46       1.1    jruoho #include "acpi.h"
     47       1.1    jruoho #include "accommon.h"
     48       1.1    jruoho #include "acevents.h"
     49       1.1    jruoho #include "acnamesp.h"
     50       1.1    jruoho 
     51       1.1    jruoho #define _COMPONENT          ACPI_EVENTS
     52       1.1    jruoho         ACPI_MODULE_NAME    ("evxfgpe")
     53       1.1    jruoho 
     54       1.1    jruoho 
     55   1.1.1.3  christos #if (!ACPI_REDUCED_HARDWARE) /* Entire module */
     56       1.1    jruoho /*******************************************************************************
     57       1.1    jruoho  *
     58       1.1    jruoho  * FUNCTION:    AcpiUpdateAllGpes
     59       1.1    jruoho  *
     60       1.1    jruoho  * PARAMETERS:  None
     61       1.1    jruoho  *
     62       1.1    jruoho  * RETURN:      Status
     63       1.1    jruoho  *
     64       1.1    jruoho  * DESCRIPTION: Complete GPE initialization and enable all GPEs that have
     65       1.1    jruoho  *              associated _Lxx or _Exx methods and are not pointed to by any
     66       1.1    jruoho  *              device _PRW methods (this indicates that these GPEs are
     67       1.1    jruoho  *              generally intended for system or device wakeup. Such GPEs
     68       1.1    jruoho  *              have to be enabled directly when the devices whose _PRW
     69       1.1    jruoho  *              methods point to them are set up for wakeup signaling.)
     70       1.1    jruoho  *
     71       1.1    jruoho  * NOTE: Should be called after any GPEs are added to the system. Primarily,
     72       1.1    jruoho  * after the system _PRW methods have been run, but also after a GPE Block
     73       1.1    jruoho  * Device has been added or if any new GPE methods have been added via a
     74       1.1    jruoho  * dynamic table load.
     75       1.1    jruoho  *
     76       1.1    jruoho  ******************************************************************************/
     77       1.1    jruoho 
     78       1.1    jruoho ACPI_STATUS
     79       1.1    jruoho AcpiUpdateAllGpes (
     80       1.1    jruoho     void)
     81       1.1    jruoho {
     82       1.1    jruoho     ACPI_STATUS             Status;
     83   1.1.1.9  christos     BOOLEAN                 IsPollingNeeded = FALSE;
     84       1.1    jruoho 
     85       1.1    jruoho 
     86   1.1.1.3  christos     ACPI_FUNCTION_TRACE (AcpiUpdateAllGpes);
     87       1.1    jruoho 
     88       1.1    jruoho 
     89       1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
     90       1.1    jruoho     if (ACPI_FAILURE (Status))
     91       1.1    jruoho     {
     92       1.1    jruoho         return_ACPI_STATUS (Status);
     93       1.1    jruoho     }
     94       1.1    jruoho 
     95       1.1    jruoho     if (AcpiGbl_AllGpesInitialized)
     96       1.1    jruoho     {
     97       1.1    jruoho         goto UnlockAndExit;
     98       1.1    jruoho     }
     99       1.1    jruoho 
    100   1.1.1.9  christos     Status = AcpiEvWalkGpeList (AcpiEvInitializeGpeBlock,
    101   1.1.1.9  christos         &IsPollingNeeded);
    102       1.1    jruoho     if (ACPI_SUCCESS (Status))
    103       1.1    jruoho     {
    104       1.1    jruoho         AcpiGbl_AllGpesInitialized = TRUE;
    105       1.1    jruoho     }
    106       1.1    jruoho 
    107       1.1    jruoho UnlockAndExit:
    108       1.1    jruoho     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
    109   1.1.1.9  christos 
    110   1.1.1.9  christos     if (IsPollingNeeded && AcpiGbl_AllGpesInitialized)
    111   1.1.1.9  christos     {
    112   1.1.1.9  christos         /* Poll GPEs to handle already triggered events */
    113   1.1.1.9  christos 
    114   1.1.1.9  christos         AcpiEvGpeDetect (AcpiGbl_GpeXruptListHead);
    115   1.1.1.9  christos     }
    116       1.1    jruoho     return_ACPI_STATUS (Status);
    117       1.1    jruoho }
    118       1.1    jruoho 
    119       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiUpdateAllGpes)
    120       1.1    jruoho 
    121       1.1    jruoho 
    122       1.1    jruoho /*******************************************************************************
    123       1.1    jruoho  *
    124       1.1    jruoho  * FUNCTION:    AcpiEnableGpe
    125       1.1    jruoho  *
    126       1.1    jruoho  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    127       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    128       1.1    jruoho  *
    129       1.1    jruoho  * RETURN:      Status
    130       1.1    jruoho  *
    131       1.1    jruoho  * DESCRIPTION: Add a reference to a GPE. On the first reference, the GPE is
    132       1.1    jruoho  *              hardware-enabled.
    133       1.1    jruoho  *
    134       1.1    jruoho  ******************************************************************************/
    135       1.1    jruoho 
    136       1.1    jruoho ACPI_STATUS
    137       1.1    jruoho AcpiEnableGpe (
    138       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    139       1.1    jruoho     UINT32                  GpeNumber)
    140       1.1    jruoho {
    141       1.1    jruoho     ACPI_STATUS             Status = AE_BAD_PARAMETER;
    142       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    143       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    144       1.1    jruoho 
    145       1.1    jruoho 
    146       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiEnableGpe);
    147       1.1    jruoho 
    148       1.1    jruoho 
    149       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    150       1.1    jruoho 
    151   1.1.1.4  christos     /*
    152   1.1.1.4  christos      * Ensure that we have a valid GPE number and that there is some way
    153   1.1.1.4  christos      * of handling the GPE (handler or a GPE method). In other words, we
    154   1.1.1.4  christos      * won't allow a valid GPE to be enabled if there is no way to handle it.
    155   1.1.1.4  christos      */
    156       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    157       1.1    jruoho     if (GpeEventInfo)
    158       1.1    jruoho     {
    159   1.1.1.5  christos         if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) !=
    160   1.1.1.4  christos             ACPI_GPE_DISPATCH_NONE)
    161   1.1.1.4  christos         {
    162  1.1.1.11  christos             Status = AcpiEvAddGpeReference (GpeEventInfo, TRUE);
    163   1.1.1.9  christos             if (ACPI_SUCCESS (Status) &&
    164   1.1.1.9  christos                 ACPI_GPE_IS_POLLING_NEEDED (GpeEventInfo))
    165   1.1.1.9  christos             {
    166   1.1.1.9  christos                 /* Poll edge-triggered GPEs to handle existing events */
    167   1.1.1.9  christos 
    168   1.1.1.9  christos                 AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    169   1.1.1.9  christos                 (void) AcpiEvDetectGpe (
    170   1.1.1.9  christos                     GpeDevice, GpeEventInfo, GpeNumber);
    171   1.1.1.9  christos                 Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    172   1.1.1.9  christos             }
    173   1.1.1.4  christos         }
    174   1.1.1.4  christos         else
    175   1.1.1.4  christos         {
    176   1.1.1.4  christos             Status = AE_NO_HANDLER;
    177   1.1.1.4  christos         }
    178       1.1    jruoho     }
    179       1.1    jruoho 
    180       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    181       1.1    jruoho     return_ACPI_STATUS (Status);
    182       1.1    jruoho }
    183       1.1    jruoho 
    184       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiEnableGpe)
    185       1.1    jruoho 
    186       1.1    jruoho 
    187       1.1    jruoho /*******************************************************************************
    188       1.1    jruoho  *
    189       1.1    jruoho  * FUNCTION:    AcpiDisableGpe
    190       1.1    jruoho  *
    191       1.1    jruoho  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    192       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    193       1.1    jruoho  *
    194       1.1    jruoho  * RETURN:      Status
    195       1.1    jruoho  *
    196       1.1    jruoho  * DESCRIPTION: Remove a reference to a GPE. When the last reference is
    197       1.1    jruoho  *              removed, only then is the GPE disabled (for runtime GPEs), or
    198       1.1    jruoho  *              the GPE mask bit disabled (for wake GPEs)
    199       1.1    jruoho  *
    200       1.1    jruoho  ******************************************************************************/
    201       1.1    jruoho 
    202       1.1    jruoho ACPI_STATUS
    203       1.1    jruoho AcpiDisableGpe (
    204       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    205       1.1    jruoho     UINT32                  GpeNumber)
    206       1.1    jruoho {
    207       1.1    jruoho     ACPI_STATUS             Status = AE_BAD_PARAMETER;
    208       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    209       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    210       1.1    jruoho 
    211       1.1    jruoho 
    212       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiDisableGpe);
    213       1.1    jruoho 
    214       1.1    jruoho 
    215       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    216       1.1    jruoho 
    217       1.1    jruoho     /* Ensure that we have a valid GPE number */
    218       1.1    jruoho 
    219       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    220       1.1    jruoho     if (GpeEventInfo)
    221       1.1    jruoho     {
    222       1.1    jruoho         Status = AcpiEvRemoveGpeReference (GpeEventInfo);
    223       1.1    jruoho     }
    224       1.1    jruoho 
    225       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    226       1.1    jruoho     return_ACPI_STATUS (Status);
    227       1.1    jruoho }
    228       1.1    jruoho 
    229       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiDisableGpe)
    230       1.1    jruoho 
    231       1.1    jruoho 
    232       1.1    jruoho /*******************************************************************************
    233       1.1    jruoho  *
    234       1.1    jruoho  * FUNCTION:    AcpiSetGpe
    235       1.1    jruoho  *
    236       1.1    jruoho  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    237       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    238       1.1    jruoho  *              Action              - ACPI_GPE_ENABLE or ACPI_GPE_DISABLE
    239       1.1    jruoho  *
    240       1.1    jruoho  * RETURN:      Status
    241       1.1    jruoho  *
    242       1.1    jruoho  * DESCRIPTION: Enable or disable an individual GPE. This function bypasses
    243   1.1.1.5  christos  *              the reference count mechanism used in the AcpiEnableGpe(),
    244   1.1.1.5  christos  *              AcpiDisableGpe() interfaces.
    245   1.1.1.5  christos  *              This API is typically used by the GPE raw handler mode driver
    246   1.1.1.5  christos  *              to switch between the polling mode and the interrupt mode after
    247   1.1.1.5  christos  *              the driver has enabled the GPE.
    248   1.1.1.5  christos  *              The APIs should be invoked in this order:
    249   1.1.1.5  christos  *               AcpiEnableGpe()              <- Ensure the reference count > 0
    250   1.1.1.5  christos  *               AcpiSetGpe(ACPI_GPE_DISABLE) <- Enter polling mode
    251   1.1.1.5  christos  *               AcpiSetGpe(ACPI_GPE_ENABLE)  <- Leave polling mode
    252   1.1.1.5  christos  *               AcpiDisableGpe()             <- Decrease the reference count
    253   1.1.1.5  christos  *
    254   1.1.1.5  christos  * Note: If a GPE is shared by 2 silicon components, then both the drivers
    255   1.1.1.5  christos  *       should support GPE polling mode or disabling the GPE for long period
    256   1.1.1.5  christos  *       for one driver may break the other. So use it with care since all
    257   1.1.1.5  christos  *       firmware _Lxx/_Exx handlers currently rely on the GPE interrupt mode.
    258       1.1    jruoho  *
    259       1.1    jruoho  ******************************************************************************/
    260       1.1    jruoho 
    261       1.1    jruoho ACPI_STATUS
    262       1.1    jruoho AcpiSetGpe (
    263       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    264       1.1    jruoho     UINT32                  GpeNumber,
    265       1.1    jruoho     UINT8                   Action)
    266       1.1    jruoho {
    267       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    268       1.1    jruoho     ACPI_STATUS             Status;
    269       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    270       1.1    jruoho 
    271       1.1    jruoho 
    272       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiSetGpe);
    273       1.1    jruoho 
    274       1.1    jruoho 
    275       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    276       1.1    jruoho 
    277       1.1    jruoho     /* Ensure that we have a valid GPE number */
    278       1.1    jruoho 
    279       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    280       1.1    jruoho     if (!GpeEventInfo)
    281       1.1    jruoho     {
    282       1.1    jruoho         Status = AE_BAD_PARAMETER;
    283       1.1    jruoho         goto UnlockAndExit;
    284       1.1    jruoho     }
    285       1.1    jruoho 
    286       1.1    jruoho     /* Perform the action */
    287       1.1    jruoho 
    288       1.1    jruoho     switch (Action)
    289       1.1    jruoho     {
    290       1.1    jruoho     case ACPI_GPE_ENABLE:
    291   1.1.1.3  christos 
    292   1.1.1.5  christos         Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_ENABLE);
    293   1.1.1.7  christos         GpeEventInfo->DisableForDispatch = FALSE;
    294       1.1    jruoho         break;
    295       1.1    jruoho 
    296       1.1    jruoho     case ACPI_GPE_DISABLE:
    297   1.1.1.3  christos 
    298       1.1    jruoho         Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_DISABLE);
    299   1.1.1.7  christos         GpeEventInfo->DisableForDispatch = TRUE;
    300       1.1    jruoho         break;
    301       1.1    jruoho 
    302       1.1    jruoho     default:
    303   1.1.1.3  christos 
    304       1.1    jruoho         Status = AE_BAD_PARAMETER;
    305       1.1    jruoho         break;
    306       1.1    jruoho     }
    307       1.1    jruoho 
    308       1.1    jruoho UnlockAndExit:
    309       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    310       1.1    jruoho     return_ACPI_STATUS (Status);
    311       1.1    jruoho }
    312       1.1    jruoho 
    313       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiSetGpe)
    314       1.1    jruoho 
    315       1.1    jruoho 
    316       1.1    jruoho /*******************************************************************************
    317       1.1    jruoho  *
    318   1.1.1.7  christos  * FUNCTION:    AcpiMaskGpe
    319   1.1.1.7  christos  *
    320   1.1.1.7  christos  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    321   1.1.1.7  christos  *              GpeNumber           - GPE level within the GPE block
    322   1.1.1.7  christos  *              IsMasked            - Whether the GPE is masked or not
    323   1.1.1.7  christos  *
    324   1.1.1.7  christos  * RETURN:      Status
    325   1.1.1.7  christos  *
    326   1.1.1.7  christos  * DESCRIPTION: Unconditionally mask/unmask the an individual GPE, ex., to
    327   1.1.1.7  christos  *              prevent a GPE flooding.
    328   1.1.1.7  christos  *
    329   1.1.1.7  christos  ******************************************************************************/
    330   1.1.1.7  christos 
    331   1.1.1.7  christos ACPI_STATUS
    332   1.1.1.7  christos AcpiMaskGpe (
    333   1.1.1.7  christos     ACPI_HANDLE             GpeDevice,
    334   1.1.1.7  christos     UINT32                  GpeNumber,
    335   1.1.1.7  christos     BOOLEAN                 IsMasked)
    336   1.1.1.7  christos {
    337   1.1.1.7  christos     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    338   1.1.1.7  christos     ACPI_STATUS             Status;
    339   1.1.1.7  christos     ACPI_CPU_FLAGS          Flags;
    340   1.1.1.7  christos 
    341   1.1.1.7  christos 
    342   1.1.1.7  christos     ACPI_FUNCTION_TRACE (AcpiMaskGpe);
    343   1.1.1.7  christos 
    344   1.1.1.7  christos 
    345   1.1.1.7  christos     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    346   1.1.1.7  christos 
    347   1.1.1.7  christos     /* Ensure that we have a valid GPE number */
    348   1.1.1.7  christos 
    349   1.1.1.7  christos     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    350   1.1.1.7  christos     if (!GpeEventInfo)
    351   1.1.1.7  christos     {
    352   1.1.1.7  christos         Status = AE_BAD_PARAMETER;
    353   1.1.1.7  christos         goto UnlockAndExit;
    354   1.1.1.7  christos     }
    355   1.1.1.7  christos 
    356   1.1.1.7  christos     Status = AcpiEvMaskGpe (GpeEventInfo, IsMasked);
    357   1.1.1.7  christos 
    358   1.1.1.7  christos UnlockAndExit:
    359   1.1.1.7  christos     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    360   1.1.1.7  christos     return_ACPI_STATUS (Status);
    361   1.1.1.7  christos }
    362   1.1.1.7  christos 
    363   1.1.1.7  christos ACPI_EXPORT_SYMBOL (AcpiMaskGpe)
    364   1.1.1.7  christos 
    365   1.1.1.7  christos 
    366   1.1.1.7  christos /*******************************************************************************
    367   1.1.1.7  christos  *
    368   1.1.1.4  christos  * FUNCTION:    AcpiMarkGpeForWake
    369   1.1.1.4  christos  *
    370   1.1.1.4  christos  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    371   1.1.1.4  christos  *              GpeNumber           - GPE level within the GPE block
    372   1.1.1.4  christos  *
    373   1.1.1.4  christos  * RETURN:      Status
    374   1.1.1.4  christos  *
    375   1.1.1.4  christos  * DESCRIPTION: Mark a GPE as having the ability to wake the system. Simply
    376   1.1.1.4  christos  *              sets the ACPI_GPE_CAN_WAKE flag.
    377   1.1.1.4  christos  *
    378   1.1.1.4  christos  * Some potential callers of AcpiSetupGpeForWake may know in advance that
    379   1.1.1.4  christos  * there won't be any notify handlers installed for device wake notifications
    380   1.1.1.4  christos  * from the given GPE (one example is a button GPE in Linux). For these cases,
    381   1.1.1.4  christos  * AcpiMarkGpeForWake should be used instead of AcpiSetupGpeForWake.
    382   1.1.1.4  christos  * This will set the ACPI_GPE_CAN_WAKE flag for the GPE without trying to
    383   1.1.1.4  christos  * setup implicit wake notification for it (since there's no handler method).
    384   1.1.1.4  christos  *
    385   1.1.1.4  christos  ******************************************************************************/
    386   1.1.1.4  christos 
    387   1.1.1.4  christos ACPI_STATUS
    388   1.1.1.4  christos AcpiMarkGpeForWake (
    389   1.1.1.4  christos     ACPI_HANDLE             GpeDevice,
    390   1.1.1.4  christos     UINT32                  GpeNumber)
    391   1.1.1.4  christos {
    392   1.1.1.4  christos     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    393   1.1.1.4  christos     ACPI_STATUS             Status = AE_BAD_PARAMETER;
    394   1.1.1.4  christos     ACPI_CPU_FLAGS          Flags;
    395   1.1.1.4  christos 
    396   1.1.1.4  christos 
    397   1.1.1.4  christos     ACPI_FUNCTION_TRACE (AcpiMarkGpeForWake);
    398   1.1.1.4  christos 
    399   1.1.1.4  christos 
    400   1.1.1.4  christos     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    401   1.1.1.4  christos 
    402   1.1.1.4  christos     /* Ensure that we have a valid GPE number */
    403   1.1.1.4  christos 
    404   1.1.1.4  christos     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    405   1.1.1.4  christos     if (GpeEventInfo)
    406   1.1.1.4  christos     {
    407   1.1.1.4  christos         /* Mark the GPE as a possible wake event */
    408   1.1.1.4  christos 
    409   1.1.1.4  christos         GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
    410   1.1.1.4  christos         Status = AE_OK;
    411   1.1.1.4  christos     }
    412   1.1.1.4  christos 
    413   1.1.1.4  christos     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    414   1.1.1.4  christos     return_ACPI_STATUS (Status);
    415   1.1.1.4  christos }
    416   1.1.1.4  christos 
    417   1.1.1.4  christos ACPI_EXPORT_SYMBOL (AcpiMarkGpeForWake)
    418   1.1.1.4  christos 
    419   1.1.1.4  christos 
    420   1.1.1.4  christos /*******************************************************************************
    421   1.1.1.4  christos  *
    422       1.1    jruoho  * FUNCTION:    AcpiSetupGpeForWake
    423       1.1    jruoho  *
    424       1.1    jruoho  * PARAMETERS:  WakeDevice          - Device associated with the GPE (via _PRW)
    425       1.1    jruoho  *              GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    426       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    427       1.1    jruoho  *
    428       1.1    jruoho  * RETURN:      Status
    429       1.1    jruoho  *
    430       1.1    jruoho  * DESCRIPTION: Mark a GPE as having the ability to wake the system. This
    431       1.1    jruoho  *              interface is intended to be used as the host executes the
    432       1.1    jruoho  *              _PRW methods (Power Resources for Wake) in the system tables.
    433       1.1    jruoho  *              Each _PRW appears under a Device Object (The WakeDevice), and
    434       1.1    jruoho  *              contains the info for the wake GPE associated with the
    435       1.1    jruoho  *              WakeDevice.
    436       1.1    jruoho  *
    437       1.1    jruoho  ******************************************************************************/
    438       1.1    jruoho 
    439       1.1    jruoho ACPI_STATUS
    440       1.1    jruoho AcpiSetupGpeForWake (
    441       1.1    jruoho     ACPI_HANDLE             WakeDevice,
    442       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    443       1.1    jruoho     UINT32                  GpeNumber)
    444       1.1    jruoho {
    445   1.1.1.3  christos     ACPI_STATUS             Status;
    446       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    447       1.1    jruoho     ACPI_NAMESPACE_NODE     *DeviceNode;
    448   1.1.1.3  christos     ACPI_GPE_NOTIFY_INFO    *Notify;
    449   1.1.1.3  christos     ACPI_GPE_NOTIFY_INFO    *NewNotify;
    450       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    451       1.1    jruoho 
    452       1.1    jruoho 
    453       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiSetupGpeForWake);
    454       1.1    jruoho 
    455       1.1    jruoho 
    456       1.1    jruoho     /* Parameter Validation */
    457       1.1    jruoho 
    458       1.1    jruoho     if (!WakeDevice)
    459       1.1    jruoho     {
    460       1.1    jruoho         /*
    461       1.1    jruoho          * By forcing WakeDevice to be valid, we automatically enable the
    462       1.1    jruoho          * implicit notify feature on all hosts.
    463       1.1    jruoho          */
    464       1.1    jruoho         return_ACPI_STATUS (AE_BAD_PARAMETER);
    465       1.1    jruoho     }
    466       1.1    jruoho 
    467   1.1.1.2    jruoho     /* Handle root object case */
    468   1.1.1.2    jruoho 
    469   1.1.1.2    jruoho     if (WakeDevice == ACPI_ROOT_OBJECT)
    470   1.1.1.2    jruoho     {
    471   1.1.1.2    jruoho         DeviceNode = AcpiGbl_RootNode;
    472   1.1.1.2    jruoho     }
    473   1.1.1.2    jruoho     else
    474   1.1.1.2    jruoho     {
    475   1.1.1.2    jruoho         DeviceNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, WakeDevice);
    476   1.1.1.2    jruoho     }
    477   1.1.1.2    jruoho 
    478       1.1    jruoho     /* Validate WakeDevice is of type Device */
    479       1.1    jruoho 
    480       1.1    jruoho     if (DeviceNode->Type != ACPI_TYPE_DEVICE)
    481       1.1    jruoho     {
    482       1.1    jruoho         return_ACPI_STATUS (AE_BAD_PARAMETER);
    483       1.1    jruoho     }
    484       1.1    jruoho 
    485   1.1.1.3  christos     /*
    486   1.1.1.3  christos      * Allocate a new notify object up front, in case it is needed.
    487   1.1.1.3  christos      * Memory allocation while holding a spinlock is a big no-no
    488   1.1.1.3  christos      * on some hosts.
    489   1.1.1.3  christos      */
    490   1.1.1.3  christos     NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO));
    491   1.1.1.3  christos     if (!NewNotify)
    492   1.1.1.3  christos     {
    493   1.1.1.3  christos         return_ACPI_STATUS (AE_NO_MEMORY);
    494   1.1.1.3  christos     }
    495   1.1.1.3  christos 
    496       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    497       1.1    jruoho 
    498       1.1    jruoho     /* Ensure that we have a valid GPE number */
    499       1.1    jruoho 
    500       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    501   1.1.1.3  christos     if (!GpeEventInfo)
    502   1.1.1.3  christos     {
    503   1.1.1.3  christos         Status = AE_BAD_PARAMETER;
    504   1.1.1.3  christos         goto UnlockAndExit;
    505   1.1.1.3  christos     }
    506   1.1.1.3  christos 
    507   1.1.1.3  christos     /*
    508   1.1.1.3  christos      * If there is no method or handler for this GPE, then the
    509   1.1.1.3  christos      * WakeDevice will be notified whenever this GPE fires. This is
    510   1.1.1.3  christos      * known as an "implicit notify". Note: The GPE is assumed to be
    511   1.1.1.3  christos      * level-triggered (for windows compatibility).
    512   1.1.1.3  christos      */
    513   1.1.1.5  christos     if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
    514   1.1.1.6  christos         ACPI_GPE_DISPATCH_NONE)
    515       1.1    jruoho     {
    516       1.1    jruoho         /*
    517   1.1.1.3  christos          * This is the first device for implicit notify on this GPE.
    518   1.1.1.3  christos          * Just set the flags here, and enter the NOTIFY block below.
    519       1.1    jruoho          */
    520   1.1.1.3  christos         GpeEventInfo->Flags =
    521   1.1.1.3  christos             (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
    522   1.1.1.3  christos     }
    523   1.1.1.9  christos     else if (GpeEventInfo->Flags & ACPI_GPE_AUTO_ENABLED)
    524   1.1.1.9  christos     {
    525   1.1.1.9  christos         /*
    526   1.1.1.9  christos          * A reference to this GPE has been added during the GPE block
    527   1.1.1.9  christos          * initialization, so drop it now to prevent the GPE from being
    528   1.1.1.9  christos          * permanently enabled and clear its ACPI_GPE_AUTO_ENABLED flag.
    529   1.1.1.9  christos          */
    530   1.1.1.9  christos         (void) AcpiEvRemoveGpeReference (GpeEventInfo);
    531   1.1.1.9  christos         GpeEventInfo->Flags &= ~~ACPI_GPE_AUTO_ENABLED;
    532   1.1.1.9  christos     }
    533   1.1.1.3  christos 
    534   1.1.1.3  christos     /*
    535   1.1.1.3  christos      * If we already have an implicit notify on this GPE, add
    536   1.1.1.3  christos      * this device to the notify list.
    537   1.1.1.3  christos      */
    538   1.1.1.5  christos     if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
    539   1.1.1.6  christos         ACPI_GPE_DISPATCH_NOTIFY)
    540   1.1.1.3  christos     {
    541   1.1.1.3  christos         /* Ensure that the device is not already in the list */
    542   1.1.1.3  christos 
    543   1.1.1.3  christos         Notify = GpeEventInfo->Dispatch.NotifyList;
    544   1.1.1.3  christos         while (Notify)
    545       1.1    jruoho         {
    546   1.1.1.3  christos             if (Notify->DeviceNode == DeviceNode)
    547   1.1.1.3  christos             {
    548   1.1.1.3  christos                 Status = AE_ALREADY_EXISTS;
    549   1.1.1.3  christos                 goto UnlockAndExit;
    550   1.1.1.3  christos             }
    551   1.1.1.3  christos             Notify = Notify->Next;
    552       1.1    jruoho         }
    553       1.1    jruoho 
    554   1.1.1.3  christos         /* Add this device to the notify list for this GPE */
    555   1.1.1.3  christos 
    556   1.1.1.3  christos         NewNotify->DeviceNode = DeviceNode;
    557   1.1.1.3  christos         NewNotify->Next = GpeEventInfo->Dispatch.NotifyList;
    558   1.1.1.3  christos         GpeEventInfo->Dispatch.NotifyList = NewNotify;
    559   1.1.1.3  christos         NewNotify = NULL;
    560       1.1    jruoho     }
    561       1.1    jruoho 
    562   1.1.1.3  christos     /* Mark the GPE as a possible wake event */
    563   1.1.1.3  christos 
    564   1.1.1.3  christos     GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
    565   1.1.1.3  christos     Status = AE_OK;
    566   1.1.1.3  christos 
    567   1.1.1.3  christos 
    568   1.1.1.3  christos UnlockAndExit:
    569       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    570   1.1.1.3  christos 
    571   1.1.1.3  christos     /* Delete the notify object if it was not used above */
    572   1.1.1.3  christos 
    573   1.1.1.3  christos     if (NewNotify)
    574   1.1.1.3  christos     {
    575   1.1.1.3  christos         ACPI_FREE (NewNotify);
    576   1.1.1.3  christos     }
    577       1.1    jruoho     return_ACPI_STATUS (Status);
    578       1.1    jruoho }
    579       1.1    jruoho 
    580       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiSetupGpeForWake)
    581       1.1    jruoho 
    582       1.1    jruoho 
    583       1.1    jruoho /*******************************************************************************
    584       1.1    jruoho  *
    585       1.1    jruoho  * FUNCTION:    AcpiSetGpeWakeMask
    586       1.1    jruoho  *
    587       1.1    jruoho  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    588       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    589       1.1    jruoho  *              Action              - Enable or Disable
    590       1.1    jruoho  *
    591       1.1    jruoho  * RETURN:      Status
    592       1.1    jruoho  *
    593       1.1    jruoho  * DESCRIPTION: Set or clear the GPE's wakeup enable mask bit. The GPE must
    594       1.1    jruoho  *              already be marked as a WAKE GPE.
    595       1.1    jruoho  *
    596       1.1    jruoho  ******************************************************************************/
    597       1.1    jruoho 
    598       1.1    jruoho ACPI_STATUS
    599       1.1    jruoho AcpiSetGpeWakeMask (
    600       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    601       1.1    jruoho     UINT32                  GpeNumber,
    602       1.1    jruoho     UINT8                   Action)
    603       1.1    jruoho {
    604       1.1    jruoho     ACPI_STATUS             Status = AE_OK;
    605       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    606       1.1    jruoho     ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
    607       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    608       1.1    jruoho     UINT32                  RegisterBit;
    609       1.1    jruoho 
    610       1.1    jruoho 
    611       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiSetGpeWakeMask);
    612       1.1    jruoho 
    613       1.1    jruoho 
    614       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    615       1.1    jruoho 
    616       1.1    jruoho     /*
    617       1.1    jruoho      * Ensure that we have a valid GPE number and that this GPE is in
    618       1.1    jruoho      * fact a wake GPE
    619       1.1    jruoho      */
    620       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    621       1.1    jruoho     if (!GpeEventInfo)
    622       1.1    jruoho     {
    623       1.1    jruoho         Status = AE_BAD_PARAMETER;
    624       1.1    jruoho         goto UnlockAndExit;
    625       1.1    jruoho     }
    626       1.1    jruoho 
    627       1.1    jruoho     if (!(GpeEventInfo->Flags & ACPI_GPE_CAN_WAKE))
    628       1.1    jruoho     {
    629       1.1    jruoho         Status = AE_TYPE;
    630       1.1    jruoho         goto UnlockAndExit;
    631       1.1    jruoho     }
    632       1.1    jruoho 
    633       1.1    jruoho     GpeRegisterInfo = GpeEventInfo->RegisterInfo;
    634       1.1    jruoho     if (!GpeRegisterInfo)
    635       1.1    jruoho     {
    636       1.1    jruoho         Status = AE_NOT_EXIST;
    637       1.1    jruoho         goto UnlockAndExit;
    638       1.1    jruoho     }
    639       1.1    jruoho 
    640   1.1.1.3  christos     RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
    641       1.1    jruoho 
    642       1.1    jruoho     /* Perform the action */
    643       1.1    jruoho 
    644       1.1    jruoho     switch (Action)
    645       1.1    jruoho     {
    646       1.1    jruoho     case ACPI_GPE_ENABLE:
    647   1.1.1.3  christos 
    648       1.1    jruoho         ACPI_SET_BIT (GpeRegisterInfo->EnableForWake, (UINT8) RegisterBit);
    649       1.1    jruoho         break;
    650       1.1    jruoho 
    651       1.1    jruoho     case ACPI_GPE_DISABLE:
    652   1.1.1.3  christos 
    653       1.1    jruoho         ACPI_CLEAR_BIT (GpeRegisterInfo->EnableForWake, (UINT8) RegisterBit);
    654       1.1    jruoho         break;
    655       1.1    jruoho 
    656       1.1    jruoho     default:
    657   1.1.1.3  christos 
    658       1.1    jruoho         ACPI_ERROR ((AE_INFO, "%u, Invalid action", Action));
    659       1.1    jruoho         Status = AE_BAD_PARAMETER;
    660       1.1    jruoho         break;
    661       1.1    jruoho     }
    662       1.1    jruoho 
    663       1.1    jruoho UnlockAndExit:
    664       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    665       1.1    jruoho     return_ACPI_STATUS (Status);
    666       1.1    jruoho }
    667       1.1    jruoho 
    668       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiSetGpeWakeMask)
    669       1.1    jruoho 
    670       1.1    jruoho 
    671       1.1    jruoho /*******************************************************************************
    672       1.1    jruoho  *
    673       1.1    jruoho  * FUNCTION:    AcpiClearGpe
    674       1.1    jruoho  *
    675       1.1    jruoho  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    676       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    677       1.1    jruoho  *
    678       1.1    jruoho  * RETURN:      Status
    679       1.1    jruoho  *
    680       1.1    jruoho  * DESCRIPTION: Clear an ACPI event (general purpose)
    681       1.1    jruoho  *
    682       1.1    jruoho  ******************************************************************************/
    683       1.1    jruoho 
    684       1.1    jruoho ACPI_STATUS
    685       1.1    jruoho AcpiClearGpe (
    686       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    687       1.1    jruoho     UINT32                  GpeNumber)
    688       1.1    jruoho {
    689       1.1    jruoho     ACPI_STATUS             Status = AE_OK;
    690       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    691       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    692       1.1    jruoho 
    693       1.1    jruoho 
    694       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiClearGpe);
    695       1.1    jruoho 
    696       1.1    jruoho 
    697       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    698       1.1    jruoho 
    699       1.1    jruoho     /* Ensure that we have a valid GPE number */
    700       1.1    jruoho 
    701       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    702       1.1    jruoho     if (!GpeEventInfo)
    703       1.1    jruoho     {
    704       1.1    jruoho         Status = AE_BAD_PARAMETER;
    705       1.1    jruoho         goto UnlockAndExit;
    706       1.1    jruoho     }
    707       1.1    jruoho 
    708       1.1    jruoho     Status = AcpiHwClearGpe (GpeEventInfo);
    709       1.1    jruoho 
    710       1.1    jruoho UnlockAndExit:
    711       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    712       1.1    jruoho     return_ACPI_STATUS (Status);
    713       1.1    jruoho }
    714       1.1    jruoho 
    715       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiClearGpe)
    716       1.1    jruoho 
    717       1.1    jruoho 
    718       1.1    jruoho /*******************************************************************************
    719       1.1    jruoho  *
    720       1.1    jruoho  * FUNCTION:    AcpiGetGpeStatus
    721       1.1    jruoho  *
    722       1.1    jruoho  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    723       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    724       1.1    jruoho  *              EventStatus         - Where the current status of the event
    725       1.1    jruoho  *                                    will be returned
    726       1.1    jruoho  *
    727       1.1    jruoho  * RETURN:      Status
    728       1.1    jruoho  *
    729       1.1    jruoho  * DESCRIPTION: Get the current status of a GPE (signalled/not_signalled)
    730       1.1    jruoho  *
    731       1.1    jruoho  ******************************************************************************/
    732       1.1    jruoho 
    733       1.1    jruoho ACPI_STATUS
    734       1.1    jruoho AcpiGetGpeStatus (
    735       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    736       1.1    jruoho     UINT32                  GpeNumber,
    737       1.1    jruoho     ACPI_EVENT_STATUS       *EventStatus)
    738       1.1    jruoho {
    739       1.1    jruoho     ACPI_STATUS             Status = AE_OK;
    740       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    741       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    742       1.1    jruoho 
    743       1.1    jruoho 
    744       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiGetGpeStatus);
    745       1.1    jruoho 
    746       1.1    jruoho 
    747       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    748       1.1    jruoho 
    749       1.1    jruoho     /* Ensure that we have a valid GPE number */
    750       1.1    jruoho 
    751       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    752       1.1    jruoho     if (!GpeEventInfo)
    753       1.1    jruoho     {
    754       1.1    jruoho         Status = AE_BAD_PARAMETER;
    755       1.1    jruoho         goto UnlockAndExit;
    756       1.1    jruoho     }
    757       1.1    jruoho 
    758       1.1    jruoho     /* Obtain status on the requested GPE number */
    759       1.1    jruoho 
    760       1.1    jruoho     Status = AcpiHwGetGpeStatus (GpeEventInfo, EventStatus);
    761       1.1    jruoho 
    762       1.1    jruoho UnlockAndExit:
    763       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    764       1.1    jruoho     return_ACPI_STATUS (Status);
    765       1.1    jruoho }
    766       1.1    jruoho 
    767       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiGetGpeStatus)
    768       1.1    jruoho 
    769       1.1    jruoho 
    770       1.1    jruoho /*******************************************************************************
    771       1.1    jruoho  *
    772  1.1.1.11  christos  * FUNCTION:    AcpiDispatchGpe
    773  1.1.1.11  christos  *
    774  1.1.1.11  christos  * PARAMETERS:  GpeDevice           - Parent GPE Device. NULL for GPE0/GPE1
    775  1.1.1.11  christos  *              GpeNumber           - GPE level within the GPE block
    776  1.1.1.11  christos  *
    777  1.1.1.11  christos  * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
    778  1.1.1.11  christos  *
    779  1.1.1.11  christos  * DESCRIPTION: Detect and dispatch a General Purpose Event to either a function
    780  1.1.1.11  christos  *              (e.g. EC) or method (e.g. _Lxx/_Exx) handler.
    781  1.1.1.11  christos  *
    782  1.1.1.11  christos  ******************************************************************************/
    783  1.1.1.11  christos 
    784  1.1.1.11  christos UINT32
    785  1.1.1.11  christos AcpiDispatchGpe(
    786  1.1.1.11  christos     ACPI_HANDLE             GpeDevice,
    787  1.1.1.11  christos     UINT32                  GpeNumber)
    788  1.1.1.11  christos {
    789  1.1.1.11  christos     ACPI_FUNCTION_TRACE(acpi_dispatch_gpe);
    790  1.1.1.11  christos 
    791  1.1.1.11  christos     return (AcpiEvDetectGpe (GpeDevice, NULL, GpeNumber));
    792  1.1.1.11  christos }
    793  1.1.1.11  christos 
    794  1.1.1.11  christos ACPI_EXPORT_SYMBOL (AcpiDispatchGpe)
    795  1.1.1.11  christos 
    796  1.1.1.11  christos 
    797  1.1.1.11  christos /*******************************************************************************
    798  1.1.1.11  christos  *
    799       1.1    jruoho  * FUNCTION:    AcpiFinishGpe
    800       1.1    jruoho  *
    801       1.1    jruoho  * PARAMETERS:  GpeDevice           - Namespace node for the GPE Block
    802       1.1    jruoho  *                                    (NULL for FADT defined GPEs)
    803       1.1    jruoho  *              GpeNumber           - GPE level within the GPE block
    804       1.1    jruoho  *
    805       1.1    jruoho  * RETURN:      Status
    806       1.1    jruoho  *
    807  1.1.1.10  christos  * DESCRIPTION: Clear and conditionally re-enable a GPE. This completes the GPE
    808       1.1    jruoho  *              processing. Intended for use by asynchronous host-installed
    809  1.1.1.10  christos  *              GPE handlers. The GPE is only re-enabled if the EnableForRun bit
    810       1.1    jruoho  *              is set in the GPE info.
    811       1.1    jruoho  *
    812       1.1    jruoho  ******************************************************************************/
    813       1.1    jruoho 
    814       1.1    jruoho ACPI_STATUS
    815       1.1    jruoho AcpiFinishGpe (
    816       1.1    jruoho     ACPI_HANDLE             GpeDevice,
    817       1.1    jruoho     UINT32                  GpeNumber)
    818       1.1    jruoho {
    819       1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    820       1.1    jruoho     ACPI_STATUS             Status;
    821       1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    822       1.1    jruoho 
    823       1.1    jruoho 
    824       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiFinishGpe);
    825       1.1    jruoho 
    826       1.1    jruoho 
    827       1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    828       1.1    jruoho 
    829       1.1    jruoho     /* Ensure that we have a valid GPE number */
    830       1.1    jruoho 
    831       1.1    jruoho     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
    832       1.1    jruoho     if (!GpeEventInfo)
    833       1.1    jruoho     {
    834       1.1    jruoho         Status = AE_BAD_PARAMETER;
    835       1.1    jruoho         goto UnlockAndExit;
    836       1.1    jruoho     }
    837       1.1    jruoho 
    838       1.1    jruoho     Status = AcpiEvFinishGpe (GpeEventInfo);
    839       1.1    jruoho 
    840       1.1    jruoho UnlockAndExit:
    841       1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    842       1.1    jruoho     return_ACPI_STATUS (Status);
    843       1.1    jruoho }
    844       1.1    jruoho 
    845       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiFinishGpe)
    846       1.1    jruoho 
    847       1.1    jruoho 
    848       1.1    jruoho /******************************************************************************
    849       1.1    jruoho  *
    850       1.1    jruoho  * FUNCTION:    AcpiDisableAllGpes
    851       1.1    jruoho  *
    852       1.1    jruoho  * PARAMETERS:  None
    853       1.1    jruoho  *
    854       1.1    jruoho  * RETURN:      Status
    855       1.1    jruoho  *
    856       1.1    jruoho  * DESCRIPTION: Disable and clear all GPEs in all GPE blocks
    857       1.1    jruoho  *
    858       1.1    jruoho  ******************************************************************************/
    859       1.1    jruoho 
    860       1.1    jruoho ACPI_STATUS
    861       1.1    jruoho AcpiDisableAllGpes (
    862       1.1    jruoho     void)
    863       1.1    jruoho {
    864       1.1    jruoho     ACPI_STATUS             Status;
    865       1.1    jruoho 
    866       1.1    jruoho 
    867       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiDisableAllGpes);
    868       1.1    jruoho 
    869       1.1    jruoho 
    870       1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
    871       1.1    jruoho     if (ACPI_FAILURE (Status))
    872       1.1    jruoho     {
    873       1.1    jruoho         return_ACPI_STATUS (Status);
    874       1.1    jruoho     }
    875       1.1    jruoho 
    876       1.1    jruoho     Status = AcpiHwDisableAllGpes ();
    877       1.1    jruoho     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
    878       1.1    jruoho 
    879       1.1    jruoho     return_ACPI_STATUS (Status);
    880       1.1    jruoho }
    881       1.1    jruoho 
    882       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiDisableAllGpes)
    883       1.1    jruoho 
    884       1.1    jruoho 
    885       1.1    jruoho /******************************************************************************
    886       1.1    jruoho  *
    887       1.1    jruoho  * FUNCTION:    AcpiEnableAllRuntimeGpes
    888       1.1    jruoho  *
    889       1.1    jruoho  * PARAMETERS:  None
    890       1.1    jruoho  *
    891       1.1    jruoho  * RETURN:      Status
    892       1.1    jruoho  *
    893       1.1    jruoho  * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks
    894       1.1    jruoho  *
    895       1.1    jruoho  ******************************************************************************/
    896       1.1    jruoho 
    897       1.1    jruoho ACPI_STATUS
    898       1.1    jruoho AcpiEnableAllRuntimeGpes (
    899       1.1    jruoho     void)
    900       1.1    jruoho {
    901       1.1    jruoho     ACPI_STATUS             Status;
    902       1.1    jruoho 
    903       1.1    jruoho 
    904       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiEnableAllRuntimeGpes);
    905       1.1    jruoho 
    906       1.1    jruoho 
    907       1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
    908       1.1    jruoho     if (ACPI_FAILURE (Status))
    909       1.1    jruoho     {
    910       1.1    jruoho         return_ACPI_STATUS (Status);
    911       1.1    jruoho     }
    912       1.1    jruoho 
    913       1.1    jruoho     Status = AcpiHwEnableAllRuntimeGpes ();
    914       1.1    jruoho     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
    915       1.1    jruoho 
    916       1.1    jruoho     return_ACPI_STATUS (Status);
    917       1.1    jruoho }
    918       1.1    jruoho 
    919       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiEnableAllRuntimeGpes)
    920       1.1    jruoho 
    921       1.1    jruoho 
    922   1.1.1.5  christos /******************************************************************************
    923   1.1.1.5  christos  *
    924   1.1.1.5  christos  * FUNCTION:    AcpiEnableAllWakeupGpes
    925   1.1.1.5  christos  *
    926   1.1.1.5  christos  * PARAMETERS:  None
    927   1.1.1.5  christos  *
    928   1.1.1.5  christos  * RETURN:      Status
    929   1.1.1.5  christos  *
    930   1.1.1.5  christos  * DESCRIPTION: Enable all "wakeup" GPEs and disable all of the other GPEs, in
    931   1.1.1.5  christos  *              all GPE blocks.
    932   1.1.1.5  christos  *
    933   1.1.1.5  christos  ******************************************************************************/
    934   1.1.1.5  christos 
    935   1.1.1.5  christos ACPI_STATUS
    936   1.1.1.5  christos AcpiEnableAllWakeupGpes (
    937   1.1.1.5  christos     void)
    938   1.1.1.5  christos {
    939   1.1.1.5  christos     ACPI_STATUS             Status;
    940   1.1.1.5  christos 
    941   1.1.1.5  christos 
    942   1.1.1.5  christos     ACPI_FUNCTION_TRACE (AcpiEnableAllWakeupGpes);
    943   1.1.1.5  christos 
    944   1.1.1.5  christos 
    945   1.1.1.5  christos     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
    946   1.1.1.5  christos     if (ACPI_FAILURE (Status))
    947   1.1.1.5  christos     {
    948   1.1.1.5  christos         return_ACPI_STATUS (Status);
    949   1.1.1.5  christos     }
    950   1.1.1.5  christos 
    951   1.1.1.5  christos     Status = AcpiHwEnableAllWakeupGpes ();
    952   1.1.1.5  christos     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
    953   1.1.1.5  christos 
    954   1.1.1.5  christos     return_ACPI_STATUS (Status);
    955   1.1.1.5  christos }
    956   1.1.1.5  christos 
    957   1.1.1.5  christos ACPI_EXPORT_SYMBOL (AcpiEnableAllWakeupGpes)
    958   1.1.1.5  christos 
    959   1.1.1.5  christos 
    960  1.1.1.12  christos /******************************************************************************
    961  1.1.1.12  christos  *
    962  1.1.1.12  christos  * FUNCTION:    AcpiAnyGpeStatusSet
    963  1.1.1.12  christos  *
    964  1.1.1.12  christos  * PARAMETERS:  None
    965  1.1.1.12  christos  *
    966  1.1.1.12  christos  * RETURN:      Whether or not the status bit is set for any GPE
    967  1.1.1.12  christos  *
    968  1.1.1.12  christos  * DESCRIPTION: Check the status bits of all enabled GPEs and return TRUE if any
    969  1.1.1.12  christos  *              of them is set or FALSE otherwise.
    970  1.1.1.12  christos  *
    971  1.1.1.12  christos  ******************************************************************************/
    972  1.1.1.12  christos 
    973  1.1.1.12  christos UINT32
    974  1.1.1.12  christos AcpiAnyGpeStatusSet (
    975  1.1.1.12  christos     void)
    976  1.1.1.12  christos {
    977  1.1.1.12  christos     ACPI_STATUS                Status;
    978  1.1.1.12  christos     UINT8                      Ret;
    979  1.1.1.12  christos 
    980  1.1.1.12  christos 
    981  1.1.1.12  christos     ACPI_FUNCTION_TRACE (AcpiAnyGpeStatusSet);
    982  1.1.1.12  christos 
    983  1.1.1.12  christos     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
    984  1.1.1.12  christos     if (ACPI_FAILURE (Status))
    985  1.1.1.12  christos     {
    986  1.1.1.12  christos         return (FALSE);
    987  1.1.1.12  christos     }
    988  1.1.1.12  christos 
    989  1.1.1.12  christos     Ret = AcpiHwCheckAllGpes ();
    990  1.1.1.12  christos     (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
    991  1.1.1.12  christos 
    992  1.1.1.12  christos     return (Ret);
    993  1.1.1.12  christos }
    994  1.1.1.12  christos 
    995  1.1.1.12  christos ACPI_EXPORT_SYMBOL(AcpiAnyGpeStatusSet)
    996  1.1.1.12  christos 
    997  1.1.1.12  christos 
    998       1.1    jruoho /*******************************************************************************
    999       1.1    jruoho  *
   1000       1.1    jruoho  * FUNCTION:    AcpiInstallGpeBlock
   1001       1.1    jruoho  *
   1002       1.1    jruoho  * PARAMETERS:  GpeDevice           - Handle to the parent GPE Block Device
   1003       1.1    jruoho  *              GpeBlockAddress     - Address and SpaceID
   1004       1.1    jruoho  *              RegisterCount       - Number of GPE register pairs in the block
   1005       1.1    jruoho  *              InterruptNumber     - H/W interrupt for the block
   1006       1.1    jruoho  *
   1007       1.1    jruoho  * RETURN:      Status
   1008       1.1    jruoho  *
   1009       1.1    jruoho  * DESCRIPTION: Create and Install a block of GPE registers. The GPEs are not
   1010       1.1    jruoho  *              enabled here.
   1011       1.1    jruoho  *
   1012       1.1    jruoho  ******************************************************************************/
   1013       1.1    jruoho 
   1014       1.1    jruoho ACPI_STATUS
   1015       1.1    jruoho AcpiInstallGpeBlock (
   1016       1.1    jruoho     ACPI_HANDLE             GpeDevice,
   1017       1.1    jruoho     ACPI_GENERIC_ADDRESS    *GpeBlockAddress,
   1018       1.1    jruoho     UINT32                  RegisterCount,
   1019       1.1    jruoho     UINT32                  InterruptNumber)
   1020       1.1    jruoho {
   1021       1.1    jruoho     ACPI_STATUS             Status;
   1022       1.1    jruoho     ACPI_OPERAND_OBJECT     *ObjDesc;
   1023       1.1    jruoho     ACPI_NAMESPACE_NODE     *Node;
   1024       1.1    jruoho     ACPI_GPE_BLOCK_INFO     *GpeBlock;
   1025       1.1    jruoho 
   1026       1.1    jruoho 
   1027       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiInstallGpeBlock);
   1028       1.1    jruoho 
   1029       1.1    jruoho 
   1030       1.1    jruoho     if ((!GpeDevice)       ||
   1031       1.1    jruoho         (!GpeBlockAddress) ||
   1032       1.1    jruoho         (!RegisterCount))
   1033       1.1    jruoho     {
   1034       1.1    jruoho         return_ACPI_STATUS (AE_BAD_PARAMETER);
   1035       1.1    jruoho     }
   1036       1.1    jruoho 
   1037       1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
   1038       1.1    jruoho     if (ACPI_FAILURE (Status))
   1039       1.1    jruoho     {
   1040   1.1.1.3  christos         return_ACPI_STATUS (Status);
   1041       1.1    jruoho     }
   1042       1.1    jruoho 
   1043       1.1    jruoho     Node = AcpiNsValidateHandle (GpeDevice);
   1044       1.1    jruoho     if (!Node)
   1045       1.1    jruoho     {
   1046       1.1    jruoho         Status = AE_BAD_PARAMETER;
   1047       1.1    jruoho         goto UnlockAndExit;
   1048       1.1    jruoho     }
   1049       1.1    jruoho 
   1050   1.1.1.4  christos     /* Validate the parent device */
   1051   1.1.1.4  christos 
   1052   1.1.1.4  christos     if (Node->Type != ACPI_TYPE_DEVICE)
   1053   1.1.1.4  christos     {
   1054   1.1.1.4  christos         Status = AE_TYPE;
   1055   1.1.1.4  christos         goto UnlockAndExit;
   1056   1.1.1.4  christos     }
   1057   1.1.1.4  christos 
   1058   1.1.1.4  christos     if (Node->Object)
   1059   1.1.1.4  christos     {
   1060   1.1.1.4  christos         Status = AE_ALREADY_EXISTS;
   1061   1.1.1.4  christos         goto UnlockAndExit;
   1062   1.1.1.4  christos     }
   1063   1.1.1.4  christos 
   1064       1.1    jruoho     /*
   1065       1.1    jruoho      * For user-installed GPE Block Devices, the GpeBlockBaseNumber
   1066       1.1    jruoho      * is always zero
   1067       1.1    jruoho      */
   1068   1.1.1.4  christos     Status = AcpiEvCreateGpeBlock (Node, GpeBlockAddress->Address,
   1069   1.1.1.6  christos         GpeBlockAddress->SpaceId, RegisterCount,
   1070   1.1.1.6  christos         0, InterruptNumber, &GpeBlock);
   1071       1.1    jruoho     if (ACPI_FAILURE (Status))
   1072       1.1    jruoho     {
   1073       1.1    jruoho         goto UnlockAndExit;
   1074       1.1    jruoho     }
   1075       1.1    jruoho 
   1076       1.1    jruoho     /* Install block in the DeviceObject attached to the node */
   1077       1.1    jruoho 
   1078       1.1    jruoho     ObjDesc = AcpiNsGetAttachedObject (Node);
   1079       1.1    jruoho     if (!ObjDesc)
   1080       1.1    jruoho     {
   1081       1.1    jruoho         /*
   1082       1.1    jruoho          * No object, create a new one (Device nodes do not always have
   1083       1.1    jruoho          * an attached object)
   1084       1.1    jruoho          */
   1085       1.1    jruoho         ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_DEVICE);
   1086       1.1    jruoho         if (!ObjDesc)
   1087       1.1    jruoho         {
   1088       1.1    jruoho             Status = AE_NO_MEMORY;
   1089       1.1    jruoho             goto UnlockAndExit;
   1090       1.1    jruoho         }
   1091       1.1    jruoho 
   1092       1.1    jruoho         Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_DEVICE);
   1093       1.1    jruoho 
   1094       1.1    jruoho         /* Remove local reference to the object */
   1095       1.1    jruoho 
   1096       1.1    jruoho         AcpiUtRemoveReference (ObjDesc);
   1097       1.1    jruoho         if (ACPI_FAILURE (Status))
   1098       1.1    jruoho         {
   1099       1.1    jruoho             goto UnlockAndExit;
   1100       1.1    jruoho         }
   1101       1.1    jruoho     }
   1102       1.1    jruoho 
   1103       1.1    jruoho     /* Now install the GPE block in the DeviceObject */
   1104       1.1    jruoho 
   1105       1.1    jruoho     ObjDesc->Device.GpeBlock = GpeBlock;
   1106       1.1    jruoho 
   1107       1.1    jruoho 
   1108       1.1    jruoho UnlockAndExit:
   1109       1.1    jruoho     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
   1110       1.1    jruoho     return_ACPI_STATUS (Status);
   1111       1.1    jruoho }
   1112       1.1    jruoho 
   1113       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiInstallGpeBlock)
   1114       1.1    jruoho 
   1115       1.1    jruoho 
   1116       1.1    jruoho /*******************************************************************************
   1117       1.1    jruoho  *
   1118       1.1    jruoho  * FUNCTION:    AcpiRemoveGpeBlock
   1119       1.1    jruoho  *
   1120       1.1    jruoho  * PARAMETERS:  GpeDevice           - Handle to the parent GPE Block Device
   1121       1.1    jruoho  *
   1122       1.1    jruoho  * RETURN:      Status
   1123       1.1    jruoho  *
   1124       1.1    jruoho  * DESCRIPTION: Remove a previously installed block of GPE registers
   1125       1.1    jruoho  *
   1126       1.1    jruoho  ******************************************************************************/
   1127       1.1    jruoho 
   1128       1.1    jruoho ACPI_STATUS
   1129       1.1    jruoho AcpiRemoveGpeBlock (
   1130       1.1    jruoho     ACPI_HANDLE             GpeDevice)
   1131       1.1    jruoho {
   1132       1.1    jruoho     ACPI_OPERAND_OBJECT     *ObjDesc;
   1133       1.1    jruoho     ACPI_STATUS             Status;
   1134       1.1    jruoho     ACPI_NAMESPACE_NODE     *Node;
   1135       1.1    jruoho 
   1136       1.1    jruoho 
   1137       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiRemoveGpeBlock);
   1138       1.1    jruoho 
   1139       1.1    jruoho 
   1140       1.1    jruoho     if (!GpeDevice)
   1141       1.1    jruoho     {
   1142       1.1    jruoho         return_ACPI_STATUS (AE_BAD_PARAMETER);
   1143       1.1    jruoho     }
   1144       1.1    jruoho 
   1145       1.1    jruoho     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
   1146       1.1    jruoho     if (ACPI_FAILURE (Status))
   1147       1.1    jruoho     {
   1148   1.1.1.3  christos         return_ACPI_STATUS (Status);
   1149       1.1    jruoho     }
   1150       1.1    jruoho 
   1151       1.1    jruoho     Node = AcpiNsValidateHandle (GpeDevice);
   1152       1.1    jruoho     if (!Node)
   1153       1.1    jruoho     {
   1154       1.1    jruoho         Status = AE_BAD_PARAMETER;
   1155       1.1    jruoho         goto UnlockAndExit;
   1156       1.1    jruoho     }
   1157       1.1    jruoho 
   1158   1.1.1.4  christos     /* Validate the parent device */
   1159   1.1.1.4  christos 
   1160   1.1.1.4  christos     if (Node->Type != ACPI_TYPE_DEVICE)
   1161   1.1.1.4  christos     {
   1162   1.1.1.4  christos         Status = AE_TYPE;
   1163   1.1.1.4  christos         goto UnlockAndExit;
   1164   1.1.1.4  christos     }
   1165   1.1.1.4  christos 
   1166       1.1    jruoho     /* Get the DeviceObject attached to the node */
   1167       1.1    jruoho 
   1168       1.1    jruoho     ObjDesc = AcpiNsGetAttachedObject (Node);
   1169       1.1    jruoho     if (!ObjDesc ||
   1170       1.1    jruoho         !ObjDesc->Device.GpeBlock)
   1171       1.1    jruoho     {
   1172       1.1    jruoho         return_ACPI_STATUS (AE_NULL_OBJECT);
   1173       1.1    jruoho     }
   1174       1.1    jruoho 
   1175       1.1    jruoho     /* Delete the GPE block (but not the DeviceObject) */
   1176       1.1    jruoho 
   1177       1.1    jruoho     Status = AcpiEvDeleteGpeBlock (ObjDesc->Device.GpeBlock);
   1178       1.1    jruoho     if (ACPI_SUCCESS (Status))
   1179       1.1    jruoho     {
   1180       1.1    jruoho         ObjDesc->Device.GpeBlock = NULL;
   1181       1.1    jruoho     }
   1182       1.1    jruoho 
   1183       1.1    jruoho UnlockAndExit:
   1184       1.1    jruoho     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
   1185       1.1    jruoho     return_ACPI_STATUS (Status);
   1186       1.1    jruoho }
   1187       1.1    jruoho 
   1188       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiRemoveGpeBlock)
   1189       1.1    jruoho 
   1190       1.1    jruoho 
   1191       1.1    jruoho /*******************************************************************************
   1192       1.1    jruoho  *
   1193       1.1    jruoho  * FUNCTION:    AcpiGetGpeDevice
   1194       1.1    jruoho  *
   1195       1.1    jruoho  * PARAMETERS:  Index               - System GPE index (0-CurrentGpeCount)
   1196       1.1    jruoho  *              GpeDevice           - Where the parent GPE Device is returned
   1197       1.1    jruoho  *
   1198       1.1    jruoho  * RETURN:      Status
   1199       1.1    jruoho  *
   1200       1.1    jruoho  * DESCRIPTION: Obtain the GPE device associated with the input index. A NULL
   1201       1.1    jruoho  *              gpe device indicates that the gpe number is contained in one of
   1202       1.1    jruoho  *              the FADT-defined gpe blocks. Otherwise, the GPE block device.
   1203       1.1    jruoho  *
   1204       1.1    jruoho  ******************************************************************************/
   1205       1.1    jruoho 
   1206       1.1    jruoho ACPI_STATUS
   1207       1.1    jruoho AcpiGetGpeDevice (
   1208       1.1    jruoho     UINT32                  Index,
   1209       1.1    jruoho     ACPI_HANDLE             *GpeDevice)
   1210       1.1    jruoho {
   1211       1.1    jruoho     ACPI_GPE_DEVICE_INFO    Info;
   1212       1.1    jruoho     ACPI_STATUS             Status;
   1213       1.1    jruoho 
   1214       1.1    jruoho 
   1215       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiGetGpeDevice);
   1216       1.1    jruoho 
   1217       1.1    jruoho 
   1218       1.1    jruoho     if (!GpeDevice)
   1219       1.1    jruoho     {
   1220       1.1    jruoho         return_ACPI_STATUS (AE_BAD_PARAMETER);
   1221       1.1    jruoho     }
   1222       1.1    jruoho 
   1223       1.1    jruoho     if (Index >= AcpiCurrentGpeCount)
   1224       1.1    jruoho     {
   1225       1.1    jruoho         return_ACPI_STATUS (AE_NOT_EXIST);
   1226       1.1    jruoho     }
   1227       1.1    jruoho 
   1228       1.1    jruoho     /* Setup and walk the GPE list */
   1229       1.1    jruoho 
   1230       1.1    jruoho     Info.Index = Index;
   1231       1.1    jruoho     Info.Status = AE_NOT_EXIST;
   1232       1.1    jruoho     Info.GpeDevice = NULL;
   1233       1.1    jruoho     Info.NextBlockBaseIndex = 0;
   1234       1.1    jruoho 
   1235       1.1    jruoho     Status = AcpiEvWalkGpeList (AcpiEvGetGpeDevice, &Info);
   1236       1.1    jruoho     if (ACPI_FAILURE (Status))
   1237       1.1    jruoho     {
   1238       1.1    jruoho         return_ACPI_STATUS (Status);
   1239       1.1    jruoho     }
   1240       1.1    jruoho 
   1241       1.1    jruoho     *GpeDevice = ACPI_CAST_PTR (ACPI_HANDLE, Info.GpeDevice);
   1242       1.1    jruoho     return_ACPI_STATUS (Info.Status);
   1243       1.1    jruoho }
   1244       1.1    jruoho 
   1245       1.1    jruoho ACPI_EXPORT_SYMBOL (AcpiGetGpeDevice)
   1246   1.1.1.3  christos 
   1247   1.1.1.3  christos #endif /* !ACPI_REDUCED_HARDWARE */
   1248