diff options
Diffstat (limited to 'sys/contrib/dev/acpica/evgpeblk.c')
-rw-r--r-- | sys/contrib/dev/acpica/evgpeblk.c | 126 |
1 files changed, 84 insertions, 42 deletions
diff --git a/sys/contrib/dev/acpica/evgpeblk.c b/sys/contrib/dev/acpica/evgpeblk.c index 985e6eae5193..ed6321c89e7c 100644 --- a/sys/contrib/dev/acpica/evgpeblk.c +++ b/sys/contrib/dev/acpica/evgpeblk.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evgpeblk - GPE block creation and initialization. - * $Revision: 39 $ + * $Revision: 1.47 $ * *****************************************************************************/ @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp. * All rights reserved. * * 2. License @@ -121,6 +121,39 @@ #define _COMPONENT ACPI_EVENTS ACPI_MODULE_NAME ("evgpeblk") +/* Local prototypes */ + +static ACPI_STATUS +AcpiEvSaveMethodInfo ( + ACPI_HANDLE ObjHandle, + UINT32 Level, + void *ObjDesc, + void **ReturnValue); + +static ACPI_STATUS +AcpiEvMatchPrwAndGpe ( + ACPI_HANDLE ObjHandle, + UINT32 Level, + void *Info, + void **ReturnValue); + +static ACPI_GPE_XRUPT_INFO * +AcpiEvGetGpeXruptBlock ( + UINT32 InterruptNumber); + +static ACPI_STATUS +AcpiEvDeleteGpeXrupt ( + ACPI_GPE_XRUPT_INFO *GpeXrupt); + +static ACPI_STATUS +AcpiEvInstallGpeBlock ( + ACPI_GPE_BLOCK_INFO *GpeBlock, + UINT32 InterruptNumber); + +static ACPI_STATUS +AcpiEvCreateGpeInfoBlocks ( + ACPI_GPE_BLOCK_INFO *GpeBlock); + /******************************************************************************* * @@ -181,7 +214,6 @@ AcpiEvValidGpeEvent ( * FUNCTION: AcpiEvWalkGpeList * * PARAMETERS: GpeWalkCallback - Routine called for each GPE block - * Flags - ACPI_NOT_ISR or ACPI_ISR * * RETURN: Status * @@ -191,18 +223,18 @@ AcpiEvValidGpeEvent ( ACPI_STATUS AcpiEvWalkGpeList ( - ACPI_GPE_CALLBACK GpeWalkCallback, - UINT32 Flags) + ACPI_GPE_CALLBACK GpeWalkCallback) { ACPI_GPE_BLOCK_INFO *GpeBlock; ACPI_GPE_XRUPT_INFO *GpeXruptInfo; ACPI_STATUS Status = AE_OK; + ACPI_NATIVE_UINT Flags; ACPI_FUNCTION_TRACE ("EvWalkGpeList"); - AcpiOsAcquireLock (AcpiGbl_GpeLock, Flags); + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); /* Walk the interrupt level descriptor list */ @@ -234,7 +266,7 @@ UnlockAndExit: } -/****************************************************************************** +/******************************************************************************* * * FUNCTION: AcpiEvDeleteGpeHandlers * @@ -271,7 +303,8 @@ AcpiEvDeleteGpeHandlers ( { GpeEventInfo = &GpeBlock->EventInfo[(i * ACPI_GPE_REGISTER_WIDTH) + j]; - if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_HANDLER) + if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == + ACPI_GPE_DISPATCH_HANDLER) { ACPI_MEM_FREE (GpeEventInfo->Dispatch.Handler); GpeEventInfo->Dispatch.Handler = NULL; @@ -541,7 +574,7 @@ Cleanup: * * FUNCTION: AcpiEvGetGpeXruptBlock * - * PARAMETERS: InterruptLevel - Interrupt for a GPE block + * PARAMETERS: InterruptNumber - Interrupt for a GPE block * * RETURN: A GPE interrupt block * @@ -554,22 +587,23 @@ Cleanup: static ACPI_GPE_XRUPT_INFO * AcpiEvGetGpeXruptBlock ( - UINT32 InterruptLevel) + UINT32 InterruptNumber) { ACPI_GPE_XRUPT_INFO *NextGpeXrupt; ACPI_GPE_XRUPT_INFO *GpeXrupt; ACPI_STATUS Status; + ACPI_NATIVE_UINT Flags; ACPI_FUNCTION_TRACE ("EvGetGpeXruptBlock"); - /* No need for spin lock since we are not changing any list elements here */ + /* No need for lock since we are not changing any list elements here */ NextGpeXrupt = AcpiGbl_GpeXruptListHead; while (NextGpeXrupt) { - if (NextGpeXrupt->InterruptLevel == InterruptLevel) + if (NextGpeXrupt->InterruptNumber == InterruptNumber) { return_PTR (NextGpeXrupt); } @@ -585,11 +619,11 @@ AcpiEvGetGpeXruptBlock ( return_PTR (NULL); } - GpeXrupt->InterruptLevel = InterruptLevel; + GpeXrupt->InterruptNumber = InterruptNumber; /* Install new interrupt descriptor with spin lock */ - AcpiOsAcquireLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); if (AcpiGbl_GpeXruptListHead) { NextGpeXrupt = AcpiGbl_GpeXruptListHead; @@ -605,19 +639,19 @@ AcpiEvGetGpeXruptBlock ( { AcpiGbl_GpeXruptListHead = GpeXrupt; } - AcpiOsReleaseLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); /* Install new interrupt handler if not SCI_INT */ - if (InterruptLevel != AcpiGbl_FADT->SciInt) + if (InterruptNumber != AcpiGbl_FADT->SciInt) { - Status = AcpiOsInstallInterruptHandler (InterruptLevel, + Status = AcpiOsInstallInterruptHandler (InterruptNumber, AcpiEvGpeXruptHandler, GpeXrupt); if (ACPI_FAILURE (Status)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not install GPE interrupt handler at level 0x%X\n", - InterruptLevel)); + InterruptNumber)); return_PTR (NULL); } } @@ -644,6 +678,7 @@ AcpiEvDeleteGpeXrupt ( ACPI_GPE_XRUPT_INFO *GpeXrupt) { ACPI_STATUS Status; + ACPI_NATIVE_UINT Flags; ACPI_FUNCTION_TRACE ("EvDeleteGpeXrupt"); @@ -651,7 +686,7 @@ AcpiEvDeleteGpeXrupt ( /* We never want to remove the SCI interrupt handler */ - if (GpeXrupt->InterruptLevel == AcpiGbl_FADT->SciInt) + if (GpeXrupt->InterruptNumber == AcpiGbl_FADT->SciInt) { GpeXrupt->GpeBlockListHead = NULL; return_ACPI_STATUS (AE_OK); @@ -659,7 +694,7 @@ AcpiEvDeleteGpeXrupt ( /* Disable this interrupt */ - Status = AcpiOsRemoveInterruptHandler (GpeXrupt->InterruptLevel, + Status = AcpiOsRemoveInterruptHandler (GpeXrupt->InterruptNumber, AcpiEvGpeXruptHandler); if (ACPI_FAILURE (Status)) { @@ -668,7 +703,7 @@ AcpiEvDeleteGpeXrupt ( /* Unlink the interrupt block with lock */ - AcpiOsAcquireLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); if (GpeXrupt->Previous) { GpeXrupt->Previous->Next = GpeXrupt->Next; @@ -678,7 +713,7 @@ AcpiEvDeleteGpeXrupt ( { GpeXrupt->Next->Previous = GpeXrupt->Previous; } - AcpiOsReleaseLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); /* Free the block */ @@ -692,7 +727,7 @@ AcpiEvDeleteGpeXrupt ( * FUNCTION: AcpiEvInstallGpeBlock * * PARAMETERS: GpeBlock - New GPE block - * InterruptLevel - Level to be associated with this GPE block + * InterruptNumber - Xrupt to be associated with this GPE block * * RETURN: Status * @@ -703,11 +738,12 @@ AcpiEvDeleteGpeXrupt ( static ACPI_STATUS AcpiEvInstallGpeBlock ( ACPI_GPE_BLOCK_INFO *GpeBlock, - UINT32 InterruptLevel) + UINT32 InterruptNumber) { ACPI_GPE_BLOCK_INFO *NextGpeBlock; ACPI_GPE_XRUPT_INFO *GpeXruptBlock; ACPI_STATUS Status; + ACPI_NATIVE_UINT Flags; ACPI_FUNCTION_TRACE ("EvInstallGpeBlock"); @@ -719,16 +755,16 @@ AcpiEvInstallGpeBlock ( return_ACPI_STATUS (Status); } - GpeXruptBlock = AcpiEvGetGpeXruptBlock (InterruptLevel); + GpeXruptBlock = AcpiEvGetGpeXruptBlock (InterruptNumber); if (!GpeXruptBlock) { Status = AE_NO_MEMORY; goto UnlockAndExit; } - /* Install the new block at the end of the list for this interrupt with lock */ + /* Install the new block at the end of the list with lock */ - AcpiOsAcquireLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); if (GpeXruptBlock->GpeBlockListHead) { NextGpeBlock = GpeXruptBlock->GpeBlockListHead; @@ -746,7 +782,7 @@ AcpiEvInstallGpeBlock ( } GpeBlock->XruptBlock = GpeXruptBlock; - AcpiOsReleaseLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); UnlockAndExit: Status = AcpiUtReleaseMutex (ACPI_MTX_EVENTS); @@ -771,6 +807,7 @@ AcpiEvDeleteGpeBlock ( ACPI_GPE_BLOCK_INFO *GpeBlock) { ACPI_STATUS Status; + ACPI_NATIVE_UINT Flags; ACPI_FUNCTION_TRACE ("EvInstallGpeBlock"); @@ -800,7 +837,7 @@ AcpiEvDeleteGpeBlock ( { /* Remove the block on this interrupt with lock */ - AcpiOsAcquireLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); if (GpeBlock->Previous) { GpeBlock->Previous->Next = GpeBlock->Next; @@ -814,7 +851,7 @@ AcpiEvDeleteGpeBlock ( { GpeBlock->Next->Previous = GpeBlock->Previous; } - AcpiOsReleaseLock (AcpiGbl_GpeLock, ACPI_NOT_ISR); + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); } /* Free the GpeBlock */ @@ -874,11 +911,13 @@ AcpiEvCreateGpeInfoBlocks ( * per register. Initialization to zeros is sufficient. */ GpeEventInfo = ACPI_MEM_CALLOCATE ( - ((ACPI_SIZE) GpeBlock->RegisterCount * ACPI_GPE_REGISTER_WIDTH) * + ((ACPI_SIZE) GpeBlock->RegisterCount * + ACPI_GPE_REGISTER_WIDTH) * sizeof (ACPI_GPE_EVENT_INFO)); if (!GpeEventInfo) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not allocate the GpeEventInfo table\n")); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Could not allocate the GpeEventInfo table\n")); Status = AE_NO_MEMORY; goto ErrorExit; } @@ -976,7 +1015,7 @@ ErrorExit: * GpeBlockAddress - Address and SpaceID * RegisterCount - Number of GPE register pairs in the block * GpeBlockBaseNumber - Starting GPE number for the block - * InterruptLevel - H/W interrupt for the block + * InterruptNumber - H/W interrupt for the block * ReturnGpeBlock - Where the new block descriptor is returned * * RETURN: Status @@ -991,7 +1030,7 @@ AcpiEvCreateGpeBlock ( ACPI_GENERIC_ADDRESS *GpeBlockAddress, UINT32 RegisterCount, UINT8 GpeBlockBaseNumber, - UINT32 InterruptLevel, + UINT32 InterruptNumber, ACPI_GPE_BLOCK_INFO **ReturnGpeBlock) { ACPI_GPE_BLOCK_INFO *GpeBlock; @@ -1026,7 +1065,8 @@ AcpiEvCreateGpeBlock ( GpeBlock->BlockBaseNumber = GpeBlockBaseNumber; GpeBlock->Node = GpeDevice; - ACPI_MEMCPY (&GpeBlock->BlockAddress, GpeBlockAddress, sizeof (ACPI_GENERIC_ADDRESS)); + ACPI_MEMCPY (&GpeBlock->BlockAddress, GpeBlockAddress, + sizeof (ACPI_GENERIC_ADDRESS)); /* Create the RegisterInfo and EventInfo sub-structures */ @@ -1039,7 +1079,7 @@ AcpiEvCreateGpeBlock ( /* Install the new block in the global list(s) */ - Status = AcpiEvInstallGpeBlock (GpeBlock, InterruptLevel); + Status = AcpiEvInstallGpeBlock (GpeBlock, InterruptNumber); if (ACPI_FAILURE (Status)) { ACPI_MEM_FREE (GpeBlock); @@ -1110,7 +1150,7 @@ AcpiEvCreateGpeBlock ( ((GpeBlock->RegisterCount * ACPI_GPE_REGISTER_WIDTH) -1)), GpeDevice->Name.Ascii, GpeBlock->RegisterCount, - InterruptLevel)); + InterruptNumber)); /* Enable all valid GPEs found above */ @@ -1198,8 +1238,9 @@ AcpiEvGpeInitialize ( /* Install GPE Block 0 */ - Status = AcpiEvCreateGpeBlock (AcpiGbl_FadtGpeDevice, &AcpiGbl_FADT->XGpe0Blk, - RegisterCount0, 0, AcpiGbl_FADT->SciInt, &AcpiGbl_GpeFadtBlocks[0]); + Status = AcpiEvCreateGpeBlock (AcpiGbl_FadtGpeDevice, + &AcpiGbl_FADT->XGpe0Blk, RegisterCount0, 0, + AcpiGbl_FADT->SciInt, &AcpiGbl_GpeFadtBlocks[0]); if (ACPI_FAILURE (Status)) { @@ -1235,8 +1276,9 @@ AcpiEvGpeInitialize ( { /* Install GPE Block 1 */ - Status = AcpiEvCreateGpeBlock (AcpiGbl_FadtGpeDevice, &AcpiGbl_FADT->XGpe1Blk, - RegisterCount1, AcpiGbl_FADT->Gpe1Base, + Status = AcpiEvCreateGpeBlock (AcpiGbl_FadtGpeDevice, + &AcpiGbl_FADT->XGpe1Blk, RegisterCount1, + AcpiGbl_FADT->Gpe1Base, AcpiGbl_FADT->SciInt, &AcpiGbl_GpeFadtBlocks[1]); if (ACPI_FAILURE (Status)) @@ -1251,7 +1293,7 @@ AcpiEvGpeInitialize ( * space. However, GPE0 always starts at GPE number zero. */ GpeNumberMax = AcpiGbl_FADT->Gpe1Base + - ((RegisterCount1 * ACPI_GPE_REGISTER_WIDTH) - 1); + ((RegisterCount1 * ACPI_GPE_REGISTER_WIDTH) - 1); } } |