xref: /titanic_52/usr/src/uts/intel/io/acpica/events/evgpeutil.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
126f3cdf0SGordon Ross /******************************************************************************
226f3cdf0SGordon Ross  *
326f3cdf0SGordon Ross  * Module Name: evgpeutil - GPE utilities
426f3cdf0SGordon Ross  *
526f3cdf0SGordon Ross  *****************************************************************************/
626f3cdf0SGordon Ross 
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek  * Copyright (C) 2000 - 2016, Intel Corp.
926f3cdf0SGordon Ross  * All rights reserved.
1026f3cdf0SGordon Ross  *
1126f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
1226f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
1326f3cdf0SGordon Ross  * are met:
1426f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
1526f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
1626f3cdf0SGordon Ross  *    without modification.
1726f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1826f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
1926f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
2026f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
2126f3cdf0SGordon Ross  *    binary redistribution.
2226f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
2326f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
2426f3cdf0SGordon Ross  *    from this software without specific prior written permission.
2526f3cdf0SGordon Ross  *
2626f3cdf0SGordon Ross  * Alternatively, this software may be distributed under the terms of the
2726f3cdf0SGordon Ross  * GNU General Public License ("GPL") version 2 as published by the Free
2826f3cdf0SGordon Ross  * Software Foundation.
2926f3cdf0SGordon Ross  *
3026f3cdf0SGordon Ross  * NO WARRANTY
3126f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3226f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3326f3cdf0SGordon Ross  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3426f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3526f3cdf0SGordon Ross  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3626f3cdf0SGordon Ross  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3726f3cdf0SGordon Ross  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3826f3cdf0SGordon Ross  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3926f3cdf0SGordon Ross  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4026f3cdf0SGordon Ross  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4126f3cdf0SGordon Ross  * POSSIBILITY OF SUCH DAMAGES.
4226f3cdf0SGordon Ross  */
4326f3cdf0SGordon Ross 
4426f3cdf0SGordon Ross #include "acpi.h"
4526f3cdf0SGordon Ross #include "accommon.h"
4626f3cdf0SGordon Ross #include "acevents.h"
4726f3cdf0SGordon Ross 
4826f3cdf0SGordon Ross #define _COMPONENT          ACPI_EVENTS
4926f3cdf0SGordon Ross         ACPI_MODULE_NAME    ("evgpeutil")
5026f3cdf0SGordon Ross 
5126f3cdf0SGordon Ross 
52*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE) /* Entire module */
5326f3cdf0SGordon Ross /*******************************************************************************
5426f3cdf0SGordon Ross  *
5526f3cdf0SGordon Ross  * FUNCTION:    AcpiEvWalkGpeList
5626f3cdf0SGordon Ross  *
5726f3cdf0SGordon Ross  * PARAMETERS:  GpeWalkCallback     - Routine called for each GPE block
5826f3cdf0SGordon Ross  *              Context             - Value passed to callback
5926f3cdf0SGordon Ross  *
6026f3cdf0SGordon Ross  * RETURN:      Status
6126f3cdf0SGordon Ross  *
6226f3cdf0SGordon Ross  * DESCRIPTION: Walk the GPE lists.
6326f3cdf0SGordon Ross  *
6426f3cdf0SGordon Ross  ******************************************************************************/
6526f3cdf0SGordon Ross 
6626f3cdf0SGordon Ross ACPI_STATUS
6726f3cdf0SGordon Ross AcpiEvWalkGpeList (
6826f3cdf0SGordon Ross     ACPI_GPE_CALLBACK       GpeWalkCallback,
6926f3cdf0SGordon Ross     void                    *Context)
7026f3cdf0SGordon Ross {
7126f3cdf0SGordon Ross     ACPI_GPE_BLOCK_INFO     *GpeBlock;
7226f3cdf0SGordon Ross     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo;
7326f3cdf0SGordon Ross     ACPI_STATUS             Status = AE_OK;
7426f3cdf0SGordon Ross     ACPI_CPU_FLAGS          Flags;
7526f3cdf0SGordon Ross 
7626f3cdf0SGordon Ross 
7726f3cdf0SGordon Ross     ACPI_FUNCTION_TRACE (EvWalkGpeList);
7826f3cdf0SGordon Ross 
7926f3cdf0SGordon Ross 
8026f3cdf0SGordon Ross     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
8126f3cdf0SGordon Ross 
8226f3cdf0SGordon Ross     /* Walk the interrupt level descriptor list */
8326f3cdf0SGordon Ross 
8426f3cdf0SGordon Ross     GpeXruptInfo = AcpiGbl_GpeXruptListHead;
8526f3cdf0SGordon Ross     while (GpeXruptInfo)
8626f3cdf0SGordon Ross     {
8726f3cdf0SGordon Ross         /* Walk all Gpe Blocks attached to this interrupt level */
8826f3cdf0SGordon Ross 
8926f3cdf0SGordon Ross         GpeBlock = GpeXruptInfo->GpeBlockListHead;
9026f3cdf0SGordon Ross         while (GpeBlock)
9126f3cdf0SGordon Ross         {
9226f3cdf0SGordon Ross             /* One callback per GPE block */
9326f3cdf0SGordon Ross 
9426f3cdf0SGordon Ross             Status = GpeWalkCallback (GpeXruptInfo, GpeBlock, Context);
9526f3cdf0SGordon Ross             if (ACPI_FAILURE (Status))
9626f3cdf0SGordon Ross             {
9726f3cdf0SGordon Ross                 if (Status == AE_CTRL_END) /* Callback abort */
9826f3cdf0SGordon Ross                 {
9926f3cdf0SGordon Ross                     Status = AE_OK;
10026f3cdf0SGordon Ross                 }
10126f3cdf0SGordon Ross                 goto UnlockAndExit;
10226f3cdf0SGordon Ross             }
10326f3cdf0SGordon Ross 
10426f3cdf0SGordon Ross             GpeBlock = GpeBlock->Next;
10526f3cdf0SGordon Ross         }
10626f3cdf0SGordon Ross 
10726f3cdf0SGordon Ross         GpeXruptInfo = GpeXruptInfo->Next;
10826f3cdf0SGordon Ross     }
10926f3cdf0SGordon Ross 
11026f3cdf0SGordon Ross UnlockAndExit:
11126f3cdf0SGordon Ross     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
11226f3cdf0SGordon Ross     return_ACPI_STATUS (Status);
11326f3cdf0SGordon Ross }
11426f3cdf0SGordon Ross 
11526f3cdf0SGordon Ross 
11626f3cdf0SGordon Ross /*******************************************************************************
11726f3cdf0SGordon Ross  *
11826f3cdf0SGordon Ross  * FUNCTION:    AcpiEvGetGpeDevice
11926f3cdf0SGordon Ross  *
12026f3cdf0SGordon Ross  * PARAMETERS:  GPE_WALK_CALLBACK
12126f3cdf0SGordon Ross  *
12226f3cdf0SGordon Ross  * RETURN:      Status
12326f3cdf0SGordon Ross  *
12426f3cdf0SGordon Ross  * DESCRIPTION: Matches the input GPE index (0-CurrentGpeCount) with a GPE
12526f3cdf0SGordon Ross  *              block device. NULL if the GPE is one of the FADT-defined GPEs.
12626f3cdf0SGordon Ross  *
12726f3cdf0SGordon Ross  ******************************************************************************/
12826f3cdf0SGordon Ross 
12926f3cdf0SGordon Ross ACPI_STATUS
13026f3cdf0SGordon Ross AcpiEvGetGpeDevice (
13126f3cdf0SGordon Ross     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
13226f3cdf0SGordon Ross     ACPI_GPE_BLOCK_INFO     *GpeBlock,
13326f3cdf0SGordon Ross     void                    *Context)
13426f3cdf0SGordon Ross {
13526f3cdf0SGordon Ross     ACPI_GPE_DEVICE_INFO    *Info = Context;
13626f3cdf0SGordon Ross 
13726f3cdf0SGordon Ross 
13826f3cdf0SGordon Ross     /* Increment Index by the number of GPEs in this block */
13926f3cdf0SGordon Ross 
14026f3cdf0SGordon Ross     Info->NextBlockBaseIndex += GpeBlock->GpeCount;
14126f3cdf0SGordon Ross 
14226f3cdf0SGordon Ross     if (Info->Index < Info->NextBlockBaseIndex)
14326f3cdf0SGordon Ross     {
14426f3cdf0SGordon Ross         /*
14526f3cdf0SGordon Ross          * The GPE index is within this block, get the node. Leave the node
14626f3cdf0SGordon Ross          * NULL for the FADT-defined GPEs
14726f3cdf0SGordon Ross          */
14826f3cdf0SGordon Ross         if ((GpeBlock->Node)->Type == ACPI_TYPE_DEVICE)
14926f3cdf0SGordon Ross         {
15026f3cdf0SGordon Ross             Info->GpeDevice = GpeBlock->Node;
15126f3cdf0SGordon Ross         }
15226f3cdf0SGordon Ross 
15326f3cdf0SGordon Ross         Info->Status = AE_OK;
15426f3cdf0SGordon Ross         return (AE_CTRL_END);
15526f3cdf0SGordon Ross     }
15626f3cdf0SGordon Ross 
15726f3cdf0SGordon Ross     return (AE_OK);
15826f3cdf0SGordon Ross }
15926f3cdf0SGordon Ross 
16026f3cdf0SGordon Ross 
16126f3cdf0SGordon Ross /*******************************************************************************
16226f3cdf0SGordon Ross  *
16326f3cdf0SGordon Ross  * FUNCTION:    AcpiEvGetGpeXruptBlock
16426f3cdf0SGordon Ross  *
16526f3cdf0SGordon Ross  * PARAMETERS:  InterruptNumber             - Interrupt for a GPE block
166*385cc6b4SJerry Jelinek  *              GpeXruptBlock               - Where the block is returned
16726f3cdf0SGordon Ross  *
168*385cc6b4SJerry Jelinek  * RETURN:      Status
16926f3cdf0SGordon Ross  *
17026f3cdf0SGordon Ross  * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt
17126f3cdf0SGordon Ross  *              block per unique interrupt level used for GPEs. Should be
17226f3cdf0SGordon Ross  *              called only when the GPE lists are semaphore locked and not
17326f3cdf0SGordon Ross  *              subject to change.
17426f3cdf0SGordon Ross  *
17526f3cdf0SGordon Ross  ******************************************************************************/
17626f3cdf0SGordon Ross 
177*385cc6b4SJerry Jelinek ACPI_STATUS
17826f3cdf0SGordon Ross AcpiEvGetGpeXruptBlock (
179*385cc6b4SJerry Jelinek     UINT32                  InterruptNumber,
180*385cc6b4SJerry Jelinek     ACPI_GPE_XRUPT_INFO     **GpeXruptBlock)
18126f3cdf0SGordon Ross {
18226f3cdf0SGordon Ross     ACPI_GPE_XRUPT_INFO     *NextGpeXrupt;
18326f3cdf0SGordon Ross     ACPI_GPE_XRUPT_INFO     *GpeXrupt;
18426f3cdf0SGordon Ross     ACPI_STATUS             Status;
18526f3cdf0SGordon Ross     ACPI_CPU_FLAGS          Flags;
18626f3cdf0SGordon Ross 
18726f3cdf0SGordon Ross 
18826f3cdf0SGordon Ross     ACPI_FUNCTION_TRACE (EvGetGpeXruptBlock);
18926f3cdf0SGordon Ross 
19026f3cdf0SGordon Ross 
19126f3cdf0SGordon Ross     /* No need for lock since we are not changing any list elements here */
19226f3cdf0SGordon Ross 
19326f3cdf0SGordon Ross     NextGpeXrupt = AcpiGbl_GpeXruptListHead;
19426f3cdf0SGordon Ross     while (NextGpeXrupt)
19526f3cdf0SGordon Ross     {
19626f3cdf0SGordon Ross         if (NextGpeXrupt->InterruptNumber == InterruptNumber)
19726f3cdf0SGordon Ross         {
198*385cc6b4SJerry Jelinek             *GpeXruptBlock = NextGpeXrupt;
199*385cc6b4SJerry Jelinek             return_ACPI_STATUS (AE_OK);
20026f3cdf0SGordon Ross         }
20126f3cdf0SGordon Ross 
20226f3cdf0SGordon Ross         NextGpeXrupt = NextGpeXrupt->Next;
20326f3cdf0SGordon Ross     }
20426f3cdf0SGordon Ross 
20526f3cdf0SGordon Ross     /* Not found, must allocate a new xrupt descriptor */
20626f3cdf0SGordon Ross 
20726f3cdf0SGordon Ross     GpeXrupt = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_XRUPT_INFO));
20826f3cdf0SGordon Ross     if (!GpeXrupt)
20926f3cdf0SGordon Ross     {
210*385cc6b4SJerry Jelinek         return_ACPI_STATUS (AE_NO_MEMORY);
21126f3cdf0SGordon Ross     }
21226f3cdf0SGordon Ross 
21326f3cdf0SGordon Ross     GpeXrupt->InterruptNumber = InterruptNumber;
21426f3cdf0SGordon Ross 
21526f3cdf0SGordon Ross     /* Install new interrupt descriptor with spin lock */
21626f3cdf0SGordon Ross 
21726f3cdf0SGordon Ross     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
21826f3cdf0SGordon Ross     if (AcpiGbl_GpeXruptListHead)
21926f3cdf0SGordon Ross     {
22026f3cdf0SGordon Ross         NextGpeXrupt = AcpiGbl_GpeXruptListHead;
22126f3cdf0SGordon Ross         while (NextGpeXrupt->Next)
22226f3cdf0SGordon Ross         {
22326f3cdf0SGordon Ross             NextGpeXrupt = NextGpeXrupt->Next;
22426f3cdf0SGordon Ross         }
22526f3cdf0SGordon Ross 
22626f3cdf0SGordon Ross         NextGpeXrupt->Next = GpeXrupt;
22726f3cdf0SGordon Ross         GpeXrupt->Previous = NextGpeXrupt;
22826f3cdf0SGordon Ross     }
22926f3cdf0SGordon Ross     else
23026f3cdf0SGordon Ross     {
23126f3cdf0SGordon Ross         AcpiGbl_GpeXruptListHead = GpeXrupt;
23226f3cdf0SGordon Ross     }
233*385cc6b4SJerry Jelinek 
23426f3cdf0SGordon Ross     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
23526f3cdf0SGordon Ross 
23626f3cdf0SGordon Ross     /* Install new interrupt handler if not SCI_INT */
23726f3cdf0SGordon Ross 
23826f3cdf0SGordon Ross     if (InterruptNumber != AcpiGbl_FADT.SciInterrupt)
23926f3cdf0SGordon Ross     {
24026f3cdf0SGordon Ross         Status = AcpiOsInstallInterruptHandler (InterruptNumber,
24126f3cdf0SGordon Ross             AcpiEvGpeXruptHandler, GpeXrupt);
24226f3cdf0SGordon Ross         if (ACPI_FAILURE (Status))
24326f3cdf0SGordon Ross         {
244*385cc6b4SJerry Jelinek             ACPI_EXCEPTION ((AE_INFO, Status,
24526f3cdf0SGordon Ross                 "Could not install GPE interrupt handler at level 0x%X",
24626f3cdf0SGordon Ross                 InterruptNumber));
247*385cc6b4SJerry Jelinek             return_ACPI_STATUS (Status);
24826f3cdf0SGordon Ross         }
24926f3cdf0SGordon Ross     }
25026f3cdf0SGordon Ross 
251*385cc6b4SJerry Jelinek     *GpeXruptBlock = GpeXrupt;
252*385cc6b4SJerry Jelinek     return_ACPI_STATUS (AE_OK);
25326f3cdf0SGordon Ross }
25426f3cdf0SGordon Ross 
25526f3cdf0SGordon Ross 
25626f3cdf0SGordon Ross /*******************************************************************************
25726f3cdf0SGordon Ross  *
25826f3cdf0SGordon Ross  * FUNCTION:    AcpiEvDeleteGpeXrupt
25926f3cdf0SGordon Ross  *
26026f3cdf0SGordon Ross  * PARAMETERS:  GpeXrupt        - A GPE interrupt info block
26126f3cdf0SGordon Ross  *
26226f3cdf0SGordon Ross  * RETURN:      Status
26326f3cdf0SGordon Ross  *
26426f3cdf0SGordon Ross  * DESCRIPTION: Remove and free a GpeXrupt block. Remove an associated
26526f3cdf0SGordon Ross  *              interrupt handler if not the SCI interrupt.
26626f3cdf0SGordon Ross  *
26726f3cdf0SGordon Ross  ******************************************************************************/
26826f3cdf0SGordon Ross 
26926f3cdf0SGordon Ross ACPI_STATUS
27026f3cdf0SGordon Ross AcpiEvDeleteGpeXrupt (
27126f3cdf0SGordon Ross     ACPI_GPE_XRUPT_INFO     *GpeXrupt)
27226f3cdf0SGordon Ross {
27326f3cdf0SGordon Ross     ACPI_STATUS             Status;
27426f3cdf0SGordon Ross     ACPI_CPU_FLAGS          Flags;
27526f3cdf0SGordon Ross 
27626f3cdf0SGordon Ross 
27726f3cdf0SGordon Ross     ACPI_FUNCTION_TRACE (EvDeleteGpeXrupt);
27826f3cdf0SGordon Ross 
27926f3cdf0SGordon Ross 
28026f3cdf0SGordon Ross     /* We never want to remove the SCI interrupt handler */
28126f3cdf0SGordon Ross 
28226f3cdf0SGordon Ross     if (GpeXrupt->InterruptNumber == AcpiGbl_FADT.SciInterrupt)
28326f3cdf0SGordon Ross     {
28426f3cdf0SGordon Ross         GpeXrupt->GpeBlockListHead = NULL;
28526f3cdf0SGordon Ross         return_ACPI_STATUS (AE_OK);
28626f3cdf0SGordon Ross     }
28726f3cdf0SGordon Ross 
28826f3cdf0SGordon Ross     /* Disable this interrupt */
28926f3cdf0SGordon Ross 
29026f3cdf0SGordon Ross     Status = AcpiOsRemoveInterruptHandler (
29126f3cdf0SGordon Ross         GpeXrupt->InterruptNumber, AcpiEvGpeXruptHandler);
29226f3cdf0SGordon Ross     if (ACPI_FAILURE (Status))
29326f3cdf0SGordon Ross     {
29426f3cdf0SGordon Ross         return_ACPI_STATUS (Status);
29526f3cdf0SGordon Ross     }
29626f3cdf0SGordon Ross 
29726f3cdf0SGordon Ross     /* Unlink the interrupt block with lock */
29826f3cdf0SGordon Ross 
29926f3cdf0SGordon Ross     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
30026f3cdf0SGordon Ross     if (GpeXrupt->Previous)
30126f3cdf0SGordon Ross     {
30226f3cdf0SGordon Ross         GpeXrupt->Previous->Next = GpeXrupt->Next;
30326f3cdf0SGordon Ross     }
30426f3cdf0SGordon Ross     else
30526f3cdf0SGordon Ross     {
30626f3cdf0SGordon Ross         /* No previous, update list head */
30726f3cdf0SGordon Ross 
30826f3cdf0SGordon Ross         AcpiGbl_GpeXruptListHead = GpeXrupt->Next;
30926f3cdf0SGordon Ross     }
31026f3cdf0SGordon Ross 
31126f3cdf0SGordon Ross     if (GpeXrupt->Next)
31226f3cdf0SGordon Ross     {
31326f3cdf0SGordon Ross         GpeXrupt->Next->Previous = GpeXrupt->Previous;
31426f3cdf0SGordon Ross     }
31526f3cdf0SGordon Ross     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
31626f3cdf0SGordon Ross 
31726f3cdf0SGordon Ross     /* Free the block */
31826f3cdf0SGordon Ross 
31926f3cdf0SGordon Ross     ACPI_FREE (GpeXrupt);
32026f3cdf0SGordon Ross     return_ACPI_STATUS (AE_OK);
32126f3cdf0SGordon Ross }
32226f3cdf0SGordon Ross 
32326f3cdf0SGordon Ross 
32426f3cdf0SGordon Ross /*******************************************************************************
32526f3cdf0SGordon Ross  *
32626f3cdf0SGordon Ross  * FUNCTION:    AcpiEvDeleteGpeHandlers
32726f3cdf0SGordon Ross  *
32826f3cdf0SGordon Ross  * PARAMETERS:  GpeXruptInfo        - GPE Interrupt info
32926f3cdf0SGordon Ross  *              GpeBlock            - Gpe Block info
33026f3cdf0SGordon Ross  *
33126f3cdf0SGordon Ross  * RETURN:      Status
33226f3cdf0SGordon Ross  *
33326f3cdf0SGordon Ross  * DESCRIPTION: Delete all Handler objects found in the GPE data structs.
33426f3cdf0SGordon Ross  *              Used only prior to termination.
33526f3cdf0SGordon Ross  *
33626f3cdf0SGordon Ross  ******************************************************************************/
33726f3cdf0SGordon Ross 
33826f3cdf0SGordon Ross ACPI_STATUS
33926f3cdf0SGordon Ross AcpiEvDeleteGpeHandlers (
34026f3cdf0SGordon Ross     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
34126f3cdf0SGordon Ross     ACPI_GPE_BLOCK_INFO     *GpeBlock,
34226f3cdf0SGordon Ross     void                    *Context)
34326f3cdf0SGordon Ross {
34426f3cdf0SGordon Ross     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
345*385cc6b4SJerry Jelinek     ACPI_GPE_NOTIFY_INFO    *Notify;
346*385cc6b4SJerry Jelinek     ACPI_GPE_NOTIFY_INFO    *Next;
34726f3cdf0SGordon Ross     UINT32                  i;
34826f3cdf0SGordon Ross     UINT32                  j;
34926f3cdf0SGordon Ross 
35026f3cdf0SGordon Ross 
35126f3cdf0SGordon Ross     ACPI_FUNCTION_TRACE (EvDeleteGpeHandlers);
35226f3cdf0SGordon Ross 
35326f3cdf0SGordon Ross 
35426f3cdf0SGordon Ross     /* Examine each GPE Register within the block */
35526f3cdf0SGordon Ross 
35626f3cdf0SGordon Ross     for (i = 0; i < GpeBlock->RegisterCount; i++)
35726f3cdf0SGordon Ross     {
35826f3cdf0SGordon Ross         /* Now look at the individual GPEs in this byte register */
35926f3cdf0SGordon Ross 
36026f3cdf0SGordon Ross         for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
36126f3cdf0SGordon Ross         {
36226f3cdf0SGordon Ross             GpeEventInfo = &GpeBlock->EventInfo[((ACPI_SIZE) i *
36326f3cdf0SGordon Ross                 ACPI_GPE_REGISTER_WIDTH) + j];
36426f3cdf0SGordon Ross 
365*385cc6b4SJerry Jelinek             if ((ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
366*385cc6b4SJerry Jelinek                     ACPI_GPE_DISPATCH_HANDLER) ||
367*385cc6b4SJerry Jelinek                 (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
368*385cc6b4SJerry Jelinek                     ACPI_GPE_DISPATCH_RAW_HANDLER))
36926f3cdf0SGordon Ross             {
370*385cc6b4SJerry Jelinek                 /* Delete an installed handler block */
371*385cc6b4SJerry Jelinek 
37226f3cdf0SGordon Ross                 ACPI_FREE (GpeEventInfo->Dispatch.Handler);
37326f3cdf0SGordon Ross                 GpeEventInfo->Dispatch.Handler = NULL;
37426f3cdf0SGordon Ross                 GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
37526f3cdf0SGordon Ross             }
376*385cc6b4SJerry Jelinek             else if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
377*385cc6b4SJerry Jelinek                 ACPI_GPE_DISPATCH_NOTIFY)
378*385cc6b4SJerry Jelinek             {
379*385cc6b4SJerry Jelinek                 /* Delete the implicit notification device list */
380*385cc6b4SJerry Jelinek 
381*385cc6b4SJerry Jelinek                 Notify = GpeEventInfo->Dispatch.NotifyList;
382*385cc6b4SJerry Jelinek                 while (Notify)
383*385cc6b4SJerry Jelinek                 {
384*385cc6b4SJerry Jelinek                     Next = Notify->Next;
385*385cc6b4SJerry Jelinek                     ACPI_FREE (Notify);
386*385cc6b4SJerry Jelinek                     Notify = Next;
387*385cc6b4SJerry Jelinek                 }
388*385cc6b4SJerry Jelinek 
389*385cc6b4SJerry Jelinek                 GpeEventInfo->Dispatch.NotifyList = NULL;
390*385cc6b4SJerry Jelinek                 GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
391*385cc6b4SJerry Jelinek             }
39226f3cdf0SGordon Ross         }
39326f3cdf0SGordon Ross     }
39426f3cdf0SGordon Ross 
39526f3cdf0SGordon Ross     return_ACPI_STATUS (AE_OK);
39626f3cdf0SGordon Ross }
39726f3cdf0SGordon Ross 
398*385cc6b4SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */
399