Home | History | Annotate | Line # | Download | only in events
evgpeutil.c revision 1.1.1.6.4.1
      1          1.1    jruoho /******************************************************************************
      2          1.1    jruoho  *
      3          1.1    jruoho  * Module Name: evgpeutil - GPE utilities
      4          1.1    jruoho  *
      5          1.1    jruoho  *****************************************************************************/
      6          1.1    jruoho 
      7      1.1.1.2    jruoho /*
      8  1.1.1.6.4.1    bouyer  * Copyright (C) 2000 - 2017, Intel Corp.
      9          1.1    jruoho  * All rights reserved.
     10          1.1    jruoho  *
     11      1.1.1.2    jruoho  * Redistribution and use in source and binary forms, with or without
     12      1.1.1.2    jruoho  * modification, are permitted provided that the following conditions
     13      1.1.1.2    jruoho  * are met:
     14      1.1.1.2    jruoho  * 1. Redistributions of source code must retain the above copyright
     15      1.1.1.2    jruoho  *    notice, this list of conditions, and the following disclaimer,
     16      1.1.1.2    jruoho  *    without modification.
     17      1.1.1.2    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18      1.1.1.2    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19      1.1.1.2    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20      1.1.1.2    jruoho  *    including a substantially similar Disclaimer requirement for further
     21      1.1.1.2    jruoho  *    binary redistribution.
     22      1.1.1.2    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23      1.1.1.2    jruoho  *    of any contributors may be used to endorse or promote products derived
     24      1.1.1.2    jruoho  *    from this software without specific prior written permission.
     25      1.1.1.2    jruoho  *
     26      1.1.1.2    jruoho  * Alternatively, this software may be distributed under the terms of the
     27      1.1.1.2    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28      1.1.1.2    jruoho  * Software Foundation.
     29      1.1.1.2    jruoho  *
     30      1.1.1.2    jruoho  * NO WARRANTY
     31      1.1.1.2    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32      1.1.1.2    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33      1.1.1.2    jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34      1.1.1.2    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35      1.1.1.2    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36      1.1.1.2    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37      1.1.1.2    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38      1.1.1.2    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39      1.1.1.2    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40      1.1.1.2    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41      1.1.1.2    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42      1.1.1.2    jruoho  */
     43          1.1    jruoho 
     44          1.1    jruoho #include "acpi.h"
     45          1.1    jruoho #include "accommon.h"
     46          1.1    jruoho #include "acevents.h"
     47          1.1    jruoho 
     48          1.1    jruoho #define _COMPONENT          ACPI_EVENTS
     49          1.1    jruoho         ACPI_MODULE_NAME    ("evgpeutil")
     50          1.1    jruoho 
     51          1.1    jruoho 
     52      1.1.1.3  christos #if (!ACPI_REDUCED_HARDWARE) /* Entire module */
     53          1.1    jruoho /*******************************************************************************
     54          1.1    jruoho  *
     55          1.1    jruoho  * FUNCTION:    AcpiEvWalkGpeList
     56          1.1    jruoho  *
     57          1.1    jruoho  * PARAMETERS:  GpeWalkCallback     - Routine called for each GPE block
     58          1.1    jruoho  *              Context             - Value passed to callback
     59          1.1    jruoho  *
     60          1.1    jruoho  * RETURN:      Status
     61          1.1    jruoho  *
     62          1.1    jruoho  * DESCRIPTION: Walk the GPE lists.
     63          1.1    jruoho  *
     64          1.1    jruoho  ******************************************************************************/
     65          1.1    jruoho 
     66          1.1    jruoho ACPI_STATUS
     67          1.1    jruoho AcpiEvWalkGpeList (
     68          1.1    jruoho     ACPI_GPE_CALLBACK       GpeWalkCallback,
     69          1.1    jruoho     void                    *Context)
     70          1.1    jruoho {
     71          1.1    jruoho     ACPI_GPE_BLOCK_INFO     *GpeBlock;
     72          1.1    jruoho     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo;
     73          1.1    jruoho     ACPI_STATUS             Status = AE_OK;
     74          1.1    jruoho     ACPI_CPU_FLAGS          Flags;
     75          1.1    jruoho 
     76          1.1    jruoho 
     77          1.1    jruoho     ACPI_FUNCTION_TRACE (EvWalkGpeList);
     78          1.1    jruoho 
     79          1.1    jruoho 
     80          1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
     81          1.1    jruoho 
     82          1.1    jruoho     /* Walk the interrupt level descriptor list */
     83          1.1    jruoho 
     84          1.1    jruoho     GpeXruptInfo = AcpiGbl_GpeXruptListHead;
     85          1.1    jruoho     while (GpeXruptInfo)
     86          1.1    jruoho     {
     87          1.1    jruoho         /* Walk all Gpe Blocks attached to this interrupt level */
     88          1.1    jruoho 
     89          1.1    jruoho         GpeBlock = GpeXruptInfo->GpeBlockListHead;
     90          1.1    jruoho         while (GpeBlock)
     91          1.1    jruoho         {
     92          1.1    jruoho             /* One callback per GPE block */
     93          1.1    jruoho 
     94          1.1    jruoho             Status = GpeWalkCallback (GpeXruptInfo, GpeBlock, Context);
     95          1.1    jruoho             if (ACPI_FAILURE (Status))
     96          1.1    jruoho             {
     97          1.1    jruoho                 if (Status == AE_CTRL_END) /* Callback abort */
     98          1.1    jruoho                 {
     99          1.1    jruoho                     Status = AE_OK;
    100          1.1    jruoho                 }
    101          1.1    jruoho                 goto UnlockAndExit;
    102          1.1    jruoho             }
    103          1.1    jruoho 
    104          1.1    jruoho             GpeBlock = GpeBlock->Next;
    105          1.1    jruoho         }
    106          1.1    jruoho 
    107          1.1    jruoho         GpeXruptInfo = GpeXruptInfo->Next;
    108          1.1    jruoho     }
    109          1.1    jruoho 
    110          1.1    jruoho UnlockAndExit:
    111          1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    112          1.1    jruoho     return_ACPI_STATUS (Status);
    113          1.1    jruoho }
    114          1.1    jruoho 
    115          1.1    jruoho 
    116          1.1    jruoho /*******************************************************************************
    117          1.1    jruoho  *
    118      1.1.1.2    jruoho  * FUNCTION:    AcpiEvGetGpeDevice
    119      1.1.1.2    jruoho  *
    120      1.1.1.2    jruoho  * PARAMETERS:  GPE_WALK_CALLBACK
    121      1.1.1.2    jruoho  *
    122      1.1.1.2    jruoho  * RETURN:      Status
    123      1.1.1.2    jruoho  *
    124      1.1.1.2    jruoho  * DESCRIPTION: Matches the input GPE index (0-CurrentGpeCount) with a GPE
    125      1.1.1.2    jruoho  *              block device. NULL if the GPE is one of the FADT-defined GPEs.
    126      1.1.1.2    jruoho  *
    127      1.1.1.2    jruoho  ******************************************************************************/
    128      1.1.1.2    jruoho 
    129      1.1.1.2    jruoho ACPI_STATUS
    130      1.1.1.2    jruoho AcpiEvGetGpeDevice (
    131      1.1.1.2    jruoho     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
    132      1.1.1.2    jruoho     ACPI_GPE_BLOCK_INFO     *GpeBlock,
    133      1.1.1.2    jruoho     void                    *Context)
    134      1.1.1.2    jruoho {
    135      1.1.1.2    jruoho     ACPI_GPE_DEVICE_INFO    *Info = Context;
    136      1.1.1.2    jruoho 
    137      1.1.1.2    jruoho 
    138      1.1.1.2    jruoho     /* Increment Index by the number of GPEs in this block */
    139      1.1.1.2    jruoho 
    140      1.1.1.2    jruoho     Info->NextBlockBaseIndex += GpeBlock->GpeCount;
    141      1.1.1.2    jruoho 
    142      1.1.1.2    jruoho     if (Info->Index < Info->NextBlockBaseIndex)
    143      1.1.1.2    jruoho     {
    144      1.1.1.2    jruoho         /*
    145      1.1.1.2    jruoho          * The GPE index is within this block, get the node. Leave the node
    146      1.1.1.2    jruoho          * NULL for the FADT-defined GPEs
    147      1.1.1.2    jruoho          */
    148      1.1.1.2    jruoho         if ((GpeBlock->Node)->Type == ACPI_TYPE_DEVICE)
    149      1.1.1.2    jruoho         {
    150      1.1.1.2    jruoho             Info->GpeDevice = GpeBlock->Node;
    151      1.1.1.2    jruoho         }
    152      1.1.1.2    jruoho 
    153      1.1.1.2    jruoho         Info->Status = AE_OK;
    154      1.1.1.2    jruoho         return (AE_CTRL_END);
    155      1.1.1.2    jruoho     }
    156      1.1.1.2    jruoho 
    157      1.1.1.2    jruoho     return (AE_OK);
    158      1.1.1.2    jruoho }
    159      1.1.1.2    jruoho 
    160      1.1.1.2    jruoho 
    161      1.1.1.2    jruoho /*******************************************************************************
    162      1.1.1.2    jruoho  *
    163          1.1    jruoho  * FUNCTION:    AcpiEvGetGpeXruptBlock
    164          1.1    jruoho  *
    165      1.1.1.3  christos  * PARAMETERS:  InterruptNumber             - Interrupt for a GPE block
    166      1.1.1.3  christos  *              GpeXruptBlock               - Where the block is returned
    167          1.1    jruoho  *
    168      1.1.1.3  christos  * RETURN:      Status
    169          1.1    jruoho  *
    170          1.1    jruoho  * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt
    171          1.1    jruoho  *              block per unique interrupt level used for GPEs. Should be
    172          1.1    jruoho  *              called only when the GPE lists are semaphore locked and not
    173          1.1    jruoho  *              subject to change.
    174          1.1    jruoho  *
    175          1.1    jruoho  ******************************************************************************/
    176          1.1    jruoho 
    177      1.1.1.3  christos ACPI_STATUS
    178          1.1    jruoho AcpiEvGetGpeXruptBlock (
    179      1.1.1.3  christos     UINT32                  InterruptNumber,
    180      1.1.1.3  christos     ACPI_GPE_XRUPT_INFO     **GpeXruptBlock)
    181          1.1    jruoho {
    182          1.1    jruoho     ACPI_GPE_XRUPT_INFO     *NextGpeXrupt;
    183          1.1    jruoho     ACPI_GPE_XRUPT_INFO     *GpeXrupt;
    184          1.1    jruoho     ACPI_STATUS             Status;
    185          1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    186          1.1    jruoho 
    187          1.1    jruoho 
    188          1.1    jruoho     ACPI_FUNCTION_TRACE (EvGetGpeXruptBlock);
    189          1.1    jruoho 
    190          1.1    jruoho 
    191          1.1    jruoho     /* No need for lock since we are not changing any list elements here */
    192          1.1    jruoho 
    193          1.1    jruoho     NextGpeXrupt = AcpiGbl_GpeXruptListHead;
    194          1.1    jruoho     while (NextGpeXrupt)
    195          1.1    jruoho     {
    196          1.1    jruoho         if (NextGpeXrupt->InterruptNumber == InterruptNumber)
    197          1.1    jruoho         {
    198      1.1.1.3  christos             *GpeXruptBlock = NextGpeXrupt;
    199      1.1.1.3  christos             return_ACPI_STATUS (AE_OK);
    200          1.1    jruoho         }
    201          1.1    jruoho 
    202          1.1    jruoho         NextGpeXrupt = NextGpeXrupt->Next;
    203          1.1    jruoho     }
    204          1.1    jruoho 
    205          1.1    jruoho     /* Not found, must allocate a new xrupt descriptor */
    206          1.1    jruoho 
    207          1.1    jruoho     GpeXrupt = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_XRUPT_INFO));
    208          1.1    jruoho     if (!GpeXrupt)
    209          1.1    jruoho     {
    210      1.1.1.3  christos         return_ACPI_STATUS (AE_NO_MEMORY);
    211          1.1    jruoho     }
    212          1.1    jruoho 
    213          1.1    jruoho     GpeXrupt->InterruptNumber = InterruptNumber;
    214          1.1    jruoho 
    215          1.1    jruoho     /* Install new interrupt descriptor with spin lock */
    216          1.1    jruoho 
    217          1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    218          1.1    jruoho     if (AcpiGbl_GpeXruptListHead)
    219          1.1    jruoho     {
    220          1.1    jruoho         NextGpeXrupt = AcpiGbl_GpeXruptListHead;
    221          1.1    jruoho         while (NextGpeXrupt->Next)
    222          1.1    jruoho         {
    223          1.1    jruoho             NextGpeXrupt = NextGpeXrupt->Next;
    224          1.1    jruoho         }
    225          1.1    jruoho 
    226          1.1    jruoho         NextGpeXrupt->Next = GpeXrupt;
    227          1.1    jruoho         GpeXrupt->Previous = NextGpeXrupt;
    228          1.1    jruoho     }
    229          1.1    jruoho     else
    230          1.1    jruoho     {
    231          1.1    jruoho         AcpiGbl_GpeXruptListHead = GpeXrupt;
    232          1.1    jruoho     }
    233      1.1.1.3  christos 
    234          1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    235          1.1    jruoho 
    236          1.1    jruoho     /* Install new interrupt handler if not SCI_INT */
    237          1.1    jruoho 
    238          1.1    jruoho     if (InterruptNumber != AcpiGbl_FADT.SciInterrupt)
    239          1.1    jruoho     {
    240          1.1    jruoho         Status = AcpiOsInstallInterruptHandler (InterruptNumber,
    241      1.1.1.6  christos             AcpiEvGpeXruptHandler, GpeXrupt);
    242          1.1    jruoho         if (ACPI_FAILURE (Status))
    243          1.1    jruoho         {
    244      1.1.1.3  christos             ACPI_EXCEPTION ((AE_INFO, Status,
    245          1.1    jruoho                 "Could not install GPE interrupt handler at level 0x%X",
    246          1.1    jruoho                 InterruptNumber));
    247      1.1.1.3  christos             return_ACPI_STATUS (Status);
    248          1.1    jruoho         }
    249          1.1    jruoho     }
    250          1.1    jruoho 
    251      1.1.1.3  christos     *GpeXruptBlock = GpeXrupt;
    252      1.1.1.3  christos     return_ACPI_STATUS (AE_OK);
    253          1.1    jruoho }
    254          1.1    jruoho 
    255          1.1    jruoho 
    256          1.1    jruoho /*******************************************************************************
    257          1.1    jruoho  *
    258          1.1    jruoho  * FUNCTION:    AcpiEvDeleteGpeXrupt
    259          1.1    jruoho  *
    260          1.1    jruoho  * PARAMETERS:  GpeXrupt        - A GPE interrupt info block
    261          1.1    jruoho  *
    262          1.1    jruoho  * RETURN:      Status
    263          1.1    jruoho  *
    264          1.1    jruoho  * DESCRIPTION: Remove and free a GpeXrupt block. Remove an associated
    265          1.1    jruoho  *              interrupt handler if not the SCI interrupt.
    266          1.1    jruoho  *
    267          1.1    jruoho  ******************************************************************************/
    268          1.1    jruoho 
    269          1.1    jruoho ACPI_STATUS
    270          1.1    jruoho AcpiEvDeleteGpeXrupt (
    271          1.1    jruoho     ACPI_GPE_XRUPT_INFO     *GpeXrupt)
    272          1.1    jruoho {
    273          1.1    jruoho     ACPI_STATUS             Status;
    274          1.1    jruoho     ACPI_CPU_FLAGS          Flags;
    275          1.1    jruoho 
    276          1.1    jruoho 
    277          1.1    jruoho     ACPI_FUNCTION_TRACE (EvDeleteGpeXrupt);
    278          1.1    jruoho 
    279          1.1    jruoho 
    280          1.1    jruoho     /* We never want to remove the SCI interrupt handler */
    281          1.1    jruoho 
    282          1.1    jruoho     if (GpeXrupt->InterruptNumber == AcpiGbl_FADT.SciInterrupt)
    283          1.1    jruoho     {
    284          1.1    jruoho         GpeXrupt->GpeBlockListHead = NULL;
    285          1.1    jruoho         return_ACPI_STATUS (AE_OK);
    286          1.1    jruoho     }
    287          1.1    jruoho 
    288          1.1    jruoho     /* Disable this interrupt */
    289          1.1    jruoho 
    290          1.1    jruoho     Status = AcpiOsRemoveInterruptHandler (
    291      1.1.1.6  christos         GpeXrupt->InterruptNumber, AcpiEvGpeXruptHandler);
    292          1.1    jruoho     if (ACPI_FAILURE (Status))
    293          1.1    jruoho     {
    294          1.1    jruoho         return_ACPI_STATUS (Status);
    295          1.1    jruoho     }
    296          1.1    jruoho 
    297          1.1    jruoho     /* Unlink the interrupt block with lock */
    298          1.1    jruoho 
    299          1.1    jruoho     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
    300          1.1    jruoho     if (GpeXrupt->Previous)
    301          1.1    jruoho     {
    302          1.1    jruoho         GpeXrupt->Previous->Next = GpeXrupt->Next;
    303          1.1    jruoho     }
    304          1.1    jruoho     else
    305          1.1    jruoho     {
    306          1.1    jruoho         /* No previous, update list head */
    307          1.1    jruoho 
    308          1.1    jruoho         AcpiGbl_GpeXruptListHead = GpeXrupt->Next;
    309          1.1    jruoho     }
    310          1.1    jruoho 
    311          1.1    jruoho     if (GpeXrupt->Next)
    312          1.1    jruoho     {
    313          1.1    jruoho         GpeXrupt->Next->Previous = GpeXrupt->Previous;
    314          1.1    jruoho     }
    315          1.1    jruoho     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
    316          1.1    jruoho 
    317          1.1    jruoho     /* Free the block */
    318          1.1    jruoho 
    319          1.1    jruoho     ACPI_FREE (GpeXrupt);
    320          1.1    jruoho     return_ACPI_STATUS (AE_OK);
    321          1.1    jruoho }
    322          1.1    jruoho 
    323          1.1    jruoho 
    324          1.1    jruoho /*******************************************************************************
    325          1.1    jruoho  *
    326          1.1    jruoho  * FUNCTION:    AcpiEvDeleteGpeHandlers
    327          1.1    jruoho  *
    328          1.1    jruoho  * PARAMETERS:  GpeXruptInfo        - GPE Interrupt info
    329          1.1    jruoho  *              GpeBlock            - Gpe Block info
    330          1.1    jruoho  *
    331          1.1    jruoho  * RETURN:      Status
    332          1.1    jruoho  *
    333          1.1    jruoho  * DESCRIPTION: Delete all Handler objects found in the GPE data structs.
    334          1.1    jruoho  *              Used only prior to termination.
    335          1.1    jruoho  *
    336          1.1    jruoho  ******************************************************************************/
    337          1.1    jruoho 
    338          1.1    jruoho ACPI_STATUS
    339          1.1    jruoho AcpiEvDeleteGpeHandlers (
    340          1.1    jruoho     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
    341          1.1    jruoho     ACPI_GPE_BLOCK_INFO     *GpeBlock,
    342          1.1    jruoho     void                    *Context)
    343          1.1    jruoho {
    344          1.1    jruoho     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
    345      1.1.1.3  christos     ACPI_GPE_NOTIFY_INFO    *Notify;
    346      1.1.1.3  christos     ACPI_GPE_NOTIFY_INFO    *Next;
    347          1.1    jruoho     UINT32                  i;
    348          1.1    jruoho     UINT32                  j;
    349          1.1    jruoho 
    350          1.1    jruoho 
    351          1.1    jruoho     ACPI_FUNCTION_TRACE (EvDeleteGpeHandlers);
    352          1.1    jruoho 
    353          1.1    jruoho 
    354          1.1    jruoho     /* Examine each GPE Register within the block */
    355          1.1    jruoho 
    356          1.1    jruoho     for (i = 0; i < GpeBlock->RegisterCount; i++)
    357          1.1    jruoho     {
    358          1.1    jruoho         /* Now look at the individual GPEs in this byte register */
    359          1.1    jruoho 
    360          1.1    jruoho         for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
    361          1.1    jruoho         {
    362          1.1    jruoho             GpeEventInfo = &GpeBlock->EventInfo[((ACPI_SIZE) i *
    363          1.1    jruoho                 ACPI_GPE_REGISTER_WIDTH) + j];
    364          1.1    jruoho 
    365      1.1.1.5  christos             if ((ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
    366      1.1.1.5  christos                     ACPI_GPE_DISPATCH_HANDLER) ||
    367      1.1.1.5  christos                 (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
    368      1.1.1.5  christos                     ACPI_GPE_DISPATCH_RAW_HANDLER))
    369          1.1    jruoho             {
    370      1.1.1.3  christos                 /* Delete an installed handler block */
    371      1.1.1.3  christos 
    372          1.1    jruoho                 ACPI_FREE (GpeEventInfo->Dispatch.Handler);
    373          1.1    jruoho                 GpeEventInfo->Dispatch.Handler = NULL;
    374          1.1    jruoho                 GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
    375          1.1    jruoho             }
    376      1.1.1.5  christos             else if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
    377      1.1.1.6  christos                 ACPI_GPE_DISPATCH_NOTIFY)
    378      1.1.1.3  christos             {
    379      1.1.1.3  christos                 /* Delete the implicit notification device list */
    380      1.1.1.3  christos 
    381      1.1.1.3  christos                 Notify = GpeEventInfo->Dispatch.NotifyList;
    382      1.1.1.3  christos                 while (Notify)
    383      1.1.1.3  christos                 {
    384      1.1.1.3  christos                     Next = Notify->Next;
    385      1.1.1.3  christos                     ACPI_FREE (Notify);
    386      1.1.1.3  christos                     Notify = Next;
    387      1.1.1.3  christos                 }
    388      1.1.1.6  christos 
    389      1.1.1.3  christos                 GpeEventInfo->Dispatch.NotifyList = NULL;
    390      1.1.1.3  christos                 GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
    391      1.1.1.3  christos             }
    392          1.1    jruoho         }
    393          1.1    jruoho     }
    394          1.1    jruoho 
    395          1.1    jruoho     return_ACPI_STATUS (AE_OK);
    396          1.1    jruoho }
    397          1.1    jruoho 
    398      1.1.1.3  christos #endif /* !ACPI_REDUCED_HARDWARE */
    399