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
AcpiEvWalkGpeList(ACPI_GPE_CALLBACK GpeWalkCallback,void * Context)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
AcpiEvGetGpeDevice(ACPI_GPE_XRUPT_INFO * GpeXruptInfo,ACPI_GPE_BLOCK_INFO * GpeBlock,void * Context)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
AcpiEvGetGpeXruptBlock(UINT32 InterruptNumber,ACPI_GPE_XRUPT_INFO ** GpeXruptBlock)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
AcpiEvDeleteGpeXrupt(ACPI_GPE_XRUPT_INFO * GpeXrupt)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
AcpiEvDeleteGpeHandlers(ACPI_GPE_XRUPT_INFO * GpeXruptInfo,ACPI_GPE_BLOCK_INFO * GpeBlock,void * Context)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