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