126f3cdf0SGordon Ross /****************************************************************************** 226f3cdf0SGordon Ross * 326f3cdf0SGordon Ross * Module Name: evglock - Global Lock support 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 #include "acinterp.h" 4826f3cdf0SGordon Ross 4926f3cdf0SGordon Ross #define _COMPONENT ACPI_EVENTS 5026f3cdf0SGordon Ross ACPI_MODULE_NAME ("evglock") 5126f3cdf0SGordon Ross 52*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE) /* Entire module */ 5326f3cdf0SGordon Ross 5426f3cdf0SGordon Ross /* Local prototypes */ 5526f3cdf0SGordon Ross 5626f3cdf0SGordon Ross static UINT32 5726f3cdf0SGordon Ross AcpiEvGlobalLockHandler ( 5826f3cdf0SGordon Ross void *Context); 5926f3cdf0SGordon Ross 6026f3cdf0SGordon Ross 6126f3cdf0SGordon Ross /******************************************************************************* 6226f3cdf0SGordon Ross * 6326f3cdf0SGordon Ross * FUNCTION: AcpiEvInitGlobalLockHandler 6426f3cdf0SGordon Ross * 6526f3cdf0SGordon Ross * PARAMETERS: None 6626f3cdf0SGordon Ross * 6726f3cdf0SGordon Ross * RETURN: Status 6826f3cdf0SGordon Ross * 6926f3cdf0SGordon Ross * DESCRIPTION: Install a handler for the global lock release event 7026f3cdf0SGordon Ross * 7126f3cdf0SGordon Ross ******************************************************************************/ 7226f3cdf0SGordon Ross 7326f3cdf0SGordon Ross ACPI_STATUS 7426f3cdf0SGordon Ross AcpiEvInitGlobalLockHandler ( 7526f3cdf0SGordon Ross void) 7626f3cdf0SGordon Ross { 7726f3cdf0SGordon Ross ACPI_STATUS Status; 7826f3cdf0SGordon Ross 7926f3cdf0SGordon Ross 8026f3cdf0SGordon Ross ACPI_FUNCTION_TRACE (EvInitGlobalLockHandler); 8126f3cdf0SGordon Ross 8226f3cdf0SGordon Ross 83*385cc6b4SJerry Jelinek /* If Hardware Reduced flag is set, there is no global lock */ 84*385cc6b4SJerry Jelinek 85*385cc6b4SJerry Jelinek if (AcpiGbl_ReducedHardware) 86*385cc6b4SJerry Jelinek { 87*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK); 88*385cc6b4SJerry Jelinek } 89*385cc6b4SJerry Jelinek 9026f3cdf0SGordon Ross /* Attempt installation of the global lock handler */ 9126f3cdf0SGordon Ross 9226f3cdf0SGordon Ross Status = AcpiInstallFixedEventHandler (ACPI_EVENT_GLOBAL, 9326f3cdf0SGordon Ross AcpiEvGlobalLockHandler, NULL); 9426f3cdf0SGordon Ross 9526f3cdf0SGordon Ross /* 9626f3cdf0SGordon Ross * If the global lock does not exist on this platform, the attempt to 9726f3cdf0SGordon Ross * enable GBL_STATUS will fail (the GBL_ENABLE bit will not stick). 9826f3cdf0SGordon Ross * Map to AE_OK, but mark global lock as not present. Any attempt to 9926f3cdf0SGordon Ross * actually use the global lock will be flagged with an error. 10026f3cdf0SGordon Ross */ 10126f3cdf0SGordon Ross AcpiGbl_GlobalLockPresent = FALSE; 10226f3cdf0SGordon Ross if (Status == AE_NO_HARDWARE_RESPONSE) 10326f3cdf0SGordon Ross { 10426f3cdf0SGordon Ross ACPI_ERROR ((AE_INFO, 10526f3cdf0SGordon Ross "No response from Global Lock hardware, disabling lock")); 10626f3cdf0SGordon Ross 10726f3cdf0SGordon Ross return_ACPI_STATUS (AE_OK); 10826f3cdf0SGordon Ross } 10926f3cdf0SGordon Ross 11026f3cdf0SGordon Ross Status = AcpiOsCreateLock (&AcpiGbl_GlobalLockPendingLock); 11126f3cdf0SGordon Ross if (ACPI_FAILURE (Status)) 11226f3cdf0SGordon Ross { 11326f3cdf0SGordon Ross return_ACPI_STATUS (Status); 11426f3cdf0SGordon Ross } 11526f3cdf0SGordon Ross 11626f3cdf0SGordon Ross AcpiGbl_GlobalLockPending = FALSE; 11726f3cdf0SGordon Ross AcpiGbl_GlobalLockPresent = TRUE; 11826f3cdf0SGordon Ross return_ACPI_STATUS (Status); 11926f3cdf0SGordon Ross } 12026f3cdf0SGordon Ross 12126f3cdf0SGordon Ross 12226f3cdf0SGordon Ross /******************************************************************************* 12326f3cdf0SGordon Ross * 12426f3cdf0SGordon Ross * FUNCTION: AcpiEvRemoveGlobalLockHandler 12526f3cdf0SGordon Ross * 12626f3cdf0SGordon Ross * PARAMETERS: None 12726f3cdf0SGordon Ross * 12826f3cdf0SGordon Ross * RETURN: Status 12926f3cdf0SGordon Ross * 13026f3cdf0SGordon Ross * DESCRIPTION: Remove the handler for the Global Lock 13126f3cdf0SGordon Ross * 13226f3cdf0SGordon Ross ******************************************************************************/ 13326f3cdf0SGordon Ross 13426f3cdf0SGordon Ross ACPI_STATUS 13526f3cdf0SGordon Ross AcpiEvRemoveGlobalLockHandler ( 13626f3cdf0SGordon Ross void) 13726f3cdf0SGordon Ross { 13826f3cdf0SGordon Ross ACPI_STATUS Status; 13926f3cdf0SGordon Ross 14026f3cdf0SGordon Ross 14126f3cdf0SGordon Ross ACPI_FUNCTION_TRACE (EvRemoveGlobalLockHandler); 14226f3cdf0SGordon Ross 143*385cc6b4SJerry Jelinek 14426f3cdf0SGordon Ross AcpiGbl_GlobalLockPresent = FALSE; 14526f3cdf0SGordon Ross Status = AcpiRemoveFixedEventHandler (ACPI_EVENT_GLOBAL, 14626f3cdf0SGordon Ross AcpiEvGlobalLockHandler); 14726f3cdf0SGordon Ross 148*385cc6b4SJerry Jelinek AcpiOsDeleteLock (AcpiGbl_GlobalLockPendingLock); 14926f3cdf0SGordon Ross return_ACPI_STATUS (Status); 15026f3cdf0SGordon Ross } 15126f3cdf0SGordon Ross 15226f3cdf0SGordon Ross 15326f3cdf0SGordon Ross /******************************************************************************* 15426f3cdf0SGordon Ross * 15526f3cdf0SGordon Ross * FUNCTION: AcpiEvGlobalLockHandler 15626f3cdf0SGordon Ross * 15726f3cdf0SGordon Ross * PARAMETERS: Context - From thread interface, not used 15826f3cdf0SGordon Ross * 15926f3cdf0SGordon Ross * RETURN: ACPI_INTERRUPT_HANDLED 16026f3cdf0SGordon Ross * 16126f3cdf0SGordon Ross * DESCRIPTION: Invoked directly from the SCI handler when a global lock 16226f3cdf0SGordon Ross * release interrupt occurs. If there is actually a pending 16326f3cdf0SGordon Ross * request for the lock, signal the waiting thread. 16426f3cdf0SGordon Ross * 16526f3cdf0SGordon Ross ******************************************************************************/ 16626f3cdf0SGordon Ross 16726f3cdf0SGordon Ross static UINT32 16826f3cdf0SGordon Ross AcpiEvGlobalLockHandler ( 16926f3cdf0SGordon Ross void *Context) 17026f3cdf0SGordon Ross { 17126f3cdf0SGordon Ross ACPI_STATUS Status; 17226f3cdf0SGordon Ross ACPI_CPU_FLAGS Flags; 17326f3cdf0SGordon Ross 17426f3cdf0SGordon Ross 17526f3cdf0SGordon Ross Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock); 17626f3cdf0SGordon Ross 17726f3cdf0SGordon Ross /* 17826f3cdf0SGordon Ross * If a request for the global lock is not actually pending, 17926f3cdf0SGordon Ross * we are done. This handles "spurious" global lock interrupts 18026f3cdf0SGordon Ross * which are possible (and have been seen) with bad BIOSs. 18126f3cdf0SGordon Ross */ 18226f3cdf0SGordon Ross if (!AcpiGbl_GlobalLockPending) 18326f3cdf0SGordon Ross { 18426f3cdf0SGordon Ross goto CleanupAndExit; 18526f3cdf0SGordon Ross } 18626f3cdf0SGordon Ross 18726f3cdf0SGordon Ross /* 18826f3cdf0SGordon Ross * Send a unit to the global lock semaphore. The actual acquisition 18926f3cdf0SGordon Ross * of the global lock will be performed by the waiting thread. 19026f3cdf0SGordon Ross */ 19126f3cdf0SGordon Ross Status = AcpiOsSignalSemaphore (AcpiGbl_GlobalLockSemaphore, 1); 19226f3cdf0SGordon Ross if (ACPI_FAILURE (Status)) 19326f3cdf0SGordon Ross { 19426f3cdf0SGordon Ross ACPI_ERROR ((AE_INFO, "Could not signal Global Lock semaphore")); 19526f3cdf0SGordon Ross } 19626f3cdf0SGordon Ross 19726f3cdf0SGordon Ross AcpiGbl_GlobalLockPending = FALSE; 19826f3cdf0SGordon Ross 19926f3cdf0SGordon Ross 20026f3cdf0SGordon Ross CleanupAndExit: 20126f3cdf0SGordon Ross 20226f3cdf0SGordon Ross AcpiOsReleaseLock (AcpiGbl_GlobalLockPendingLock, Flags); 20326f3cdf0SGordon Ross return (ACPI_INTERRUPT_HANDLED); 20426f3cdf0SGordon Ross } 20526f3cdf0SGordon Ross 20626f3cdf0SGordon Ross 20726f3cdf0SGordon Ross /****************************************************************************** 20826f3cdf0SGordon Ross * 20926f3cdf0SGordon Ross * FUNCTION: AcpiEvAcquireGlobalLock 21026f3cdf0SGordon Ross * 21126f3cdf0SGordon Ross * PARAMETERS: Timeout - Max time to wait for the lock, in millisec. 21226f3cdf0SGordon Ross * 21326f3cdf0SGordon Ross * RETURN: Status 21426f3cdf0SGordon Ross * 21526f3cdf0SGordon Ross * DESCRIPTION: Attempt to gain ownership of the Global Lock. 21626f3cdf0SGordon Ross * 21726f3cdf0SGordon Ross * MUTEX: Interpreter must be locked 21826f3cdf0SGordon Ross * 21926f3cdf0SGordon Ross * Note: The original implementation allowed multiple threads to "acquire" the 22026f3cdf0SGordon Ross * Global Lock, and the OS would hold the lock until the last thread had 22126f3cdf0SGordon Ross * released it. However, this could potentially starve the BIOS out of the 22226f3cdf0SGordon Ross * lock, especially in the case where there is a tight handshake between the 22326f3cdf0SGordon Ross * Embedded Controller driver and the BIOS. Therefore, this implementation 22426f3cdf0SGordon Ross * allows only one thread to acquire the HW Global Lock at a time, and makes 22526f3cdf0SGordon Ross * the global lock appear as a standard mutex on the OS side. 22626f3cdf0SGordon Ross * 22726f3cdf0SGordon Ross *****************************************************************************/ 22826f3cdf0SGordon Ross 22926f3cdf0SGordon Ross ACPI_STATUS 23026f3cdf0SGordon Ross AcpiEvAcquireGlobalLock ( 23126f3cdf0SGordon Ross UINT16 Timeout) 23226f3cdf0SGordon Ross { 23326f3cdf0SGordon Ross ACPI_CPU_FLAGS Flags; 23426f3cdf0SGordon Ross ACPI_STATUS Status; 23526f3cdf0SGordon Ross BOOLEAN Acquired = FALSE; 23626f3cdf0SGordon Ross 23726f3cdf0SGordon Ross 23826f3cdf0SGordon Ross ACPI_FUNCTION_TRACE (EvAcquireGlobalLock); 23926f3cdf0SGordon Ross 24026f3cdf0SGordon Ross 24126f3cdf0SGordon Ross /* 24226f3cdf0SGordon Ross * Only one thread can acquire the GL at a time, the GlobalLockMutex 24326f3cdf0SGordon Ross * enforces this. This interface releases the interpreter if we must wait. 24426f3cdf0SGordon Ross */ 24526f3cdf0SGordon Ross Status = AcpiExSystemWaitMutex (AcpiGbl_GlobalLockMutex->Mutex.OsMutex, 24626f3cdf0SGordon Ross Timeout); 24726f3cdf0SGordon Ross if (ACPI_FAILURE (Status)) 24826f3cdf0SGordon Ross { 24926f3cdf0SGordon Ross return_ACPI_STATUS (Status); 25026f3cdf0SGordon Ross } 25126f3cdf0SGordon Ross 25226f3cdf0SGordon Ross /* 25326f3cdf0SGordon Ross * Update the global lock handle and check for wraparound. The handle is 25426f3cdf0SGordon Ross * only used for the external global lock interfaces, but it is updated 25526f3cdf0SGordon Ross * here to properly handle the case where a single thread may acquire the 25626f3cdf0SGordon Ross * lock via both the AML and the AcpiAcquireGlobalLock interfaces. The 25726f3cdf0SGordon Ross * handle is therefore updated on the first acquire from a given thread 25826f3cdf0SGordon Ross * regardless of where the acquisition request originated. 25926f3cdf0SGordon Ross */ 26026f3cdf0SGordon Ross AcpiGbl_GlobalLockHandle++; 26126f3cdf0SGordon Ross if (AcpiGbl_GlobalLockHandle == 0) 26226f3cdf0SGordon Ross { 26326f3cdf0SGordon Ross AcpiGbl_GlobalLockHandle = 1; 26426f3cdf0SGordon Ross } 26526f3cdf0SGordon Ross 26626f3cdf0SGordon Ross /* 26726f3cdf0SGordon Ross * Make sure that a global lock actually exists. If not, just 26826f3cdf0SGordon Ross * treat the lock as a standard mutex. 26926f3cdf0SGordon Ross */ 27026f3cdf0SGordon Ross if (!AcpiGbl_GlobalLockPresent) 27126f3cdf0SGordon Ross { 27226f3cdf0SGordon Ross AcpiGbl_GlobalLockAcquired = TRUE; 27326f3cdf0SGordon Ross return_ACPI_STATUS (AE_OK); 27426f3cdf0SGordon Ross } 27526f3cdf0SGordon Ross 27626f3cdf0SGordon Ross Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock); 27726f3cdf0SGordon Ross 27826f3cdf0SGordon Ross do 27926f3cdf0SGordon Ross { 28026f3cdf0SGordon Ross /* Attempt to acquire the actual hardware lock */ 28126f3cdf0SGordon Ross 28226f3cdf0SGordon Ross ACPI_ACQUIRE_GLOBAL_LOCK (AcpiGbl_FACS, Acquired); 28326f3cdf0SGordon Ross if (Acquired) 28426f3cdf0SGordon Ross { 28526f3cdf0SGordon Ross AcpiGbl_GlobalLockAcquired = TRUE; 28626f3cdf0SGordon Ross ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 28726f3cdf0SGordon Ross "Acquired hardware Global Lock\n")); 28826f3cdf0SGordon Ross break; 28926f3cdf0SGordon Ross } 29026f3cdf0SGordon Ross 29126f3cdf0SGordon Ross /* 29226f3cdf0SGordon Ross * Did not get the lock. The pending bit was set above, and 29326f3cdf0SGordon Ross * we must now wait until we receive the global lock 29426f3cdf0SGordon Ross * released interrupt. 29526f3cdf0SGordon Ross */ 29626f3cdf0SGordon Ross AcpiGbl_GlobalLockPending = TRUE; 29726f3cdf0SGordon Ross AcpiOsReleaseLock (AcpiGbl_GlobalLockPendingLock, Flags); 29826f3cdf0SGordon Ross 29926f3cdf0SGordon Ross ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 30026f3cdf0SGordon Ross "Waiting for hardware Global Lock\n")); 30126f3cdf0SGordon Ross 30226f3cdf0SGordon Ross /* 30326f3cdf0SGordon Ross * Wait for handshake with the global lock interrupt handler. 30426f3cdf0SGordon Ross * This interface releases the interpreter if we must wait. 30526f3cdf0SGordon Ross */ 306*385cc6b4SJerry Jelinek Status = AcpiExSystemWaitSemaphore ( 307*385cc6b4SJerry Jelinek AcpiGbl_GlobalLockSemaphore, ACPI_WAIT_FOREVER); 30826f3cdf0SGordon Ross 30926f3cdf0SGordon Ross Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock); 31026f3cdf0SGordon Ross 31126f3cdf0SGordon Ross } while (ACPI_SUCCESS (Status)); 31226f3cdf0SGordon Ross 31326f3cdf0SGordon Ross AcpiGbl_GlobalLockPending = FALSE; 31426f3cdf0SGordon Ross AcpiOsReleaseLock (AcpiGbl_GlobalLockPendingLock, Flags); 31526f3cdf0SGordon Ross 31626f3cdf0SGordon Ross return_ACPI_STATUS (Status); 31726f3cdf0SGordon Ross } 31826f3cdf0SGordon Ross 31926f3cdf0SGordon Ross 32026f3cdf0SGordon Ross /******************************************************************************* 32126f3cdf0SGordon Ross * 32226f3cdf0SGordon Ross * FUNCTION: AcpiEvReleaseGlobalLock 32326f3cdf0SGordon Ross * 32426f3cdf0SGordon Ross * PARAMETERS: None 32526f3cdf0SGordon Ross * 32626f3cdf0SGordon Ross * RETURN: Status 32726f3cdf0SGordon Ross * 32826f3cdf0SGordon Ross * DESCRIPTION: Releases ownership of the Global Lock. 32926f3cdf0SGordon Ross * 33026f3cdf0SGordon Ross ******************************************************************************/ 33126f3cdf0SGordon Ross 33226f3cdf0SGordon Ross ACPI_STATUS 33326f3cdf0SGordon Ross AcpiEvReleaseGlobalLock ( 33426f3cdf0SGordon Ross void) 33526f3cdf0SGordon Ross { 33626f3cdf0SGordon Ross BOOLEAN Pending = FALSE; 33726f3cdf0SGordon Ross ACPI_STATUS Status = AE_OK; 33826f3cdf0SGordon Ross 33926f3cdf0SGordon Ross 34026f3cdf0SGordon Ross ACPI_FUNCTION_TRACE (EvReleaseGlobalLock); 34126f3cdf0SGordon Ross 34226f3cdf0SGordon Ross 34326f3cdf0SGordon Ross /* Lock must be already acquired */ 34426f3cdf0SGordon Ross 34526f3cdf0SGordon Ross if (!AcpiGbl_GlobalLockAcquired) 34626f3cdf0SGordon Ross { 34726f3cdf0SGordon Ross ACPI_WARNING ((AE_INFO, 34826f3cdf0SGordon Ross "Cannot release the ACPI Global Lock, it has not been acquired")); 34926f3cdf0SGordon Ross return_ACPI_STATUS (AE_NOT_ACQUIRED); 35026f3cdf0SGordon Ross } 35126f3cdf0SGordon Ross 35226f3cdf0SGordon Ross if (AcpiGbl_GlobalLockPresent) 35326f3cdf0SGordon Ross { 35426f3cdf0SGordon Ross /* Allow any thread to release the lock */ 35526f3cdf0SGordon Ross 35626f3cdf0SGordon Ross ACPI_RELEASE_GLOBAL_LOCK (AcpiGbl_FACS, Pending); 35726f3cdf0SGordon Ross 35826f3cdf0SGordon Ross /* 35926f3cdf0SGordon Ross * If the pending bit was set, we must write GBL_RLS to the control 36026f3cdf0SGordon Ross * register 36126f3cdf0SGordon Ross */ 36226f3cdf0SGordon Ross if (Pending) 36326f3cdf0SGordon Ross { 36426f3cdf0SGordon Ross Status = AcpiWriteBitRegister ( 36526f3cdf0SGordon Ross ACPI_BITREG_GLOBAL_LOCK_RELEASE, ACPI_ENABLE_EVENT); 36626f3cdf0SGordon Ross } 36726f3cdf0SGordon Ross 36826f3cdf0SGordon Ross ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Released hardware Global Lock\n")); 36926f3cdf0SGordon Ross } 37026f3cdf0SGordon Ross 37126f3cdf0SGordon Ross AcpiGbl_GlobalLockAcquired = FALSE; 37226f3cdf0SGordon Ross 37326f3cdf0SGordon Ross /* Release the local GL mutex */ 37426f3cdf0SGordon Ross 37526f3cdf0SGordon Ross AcpiOsReleaseMutex (AcpiGbl_GlobalLockMutex->Mutex.OsMutex); 37626f3cdf0SGordon Ross return_ACPI_STATUS (Status); 37726f3cdf0SGordon Ross } 378*385cc6b4SJerry Jelinek 379*385cc6b4SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */ 380