1ae115bc7Smrj /******************************************************************************* 2ae115bc7Smrj * 3ae115bc7Smrj * Module Name: evsci - System Control Interrupt configuration and 4ae115bc7Smrj * legacy to ACPI mode state transition functions 5ae115bc7Smrj * 6ae115bc7Smrj ******************************************************************************/ 7ae115bc7Smrj 826f3cdf0SGordon Ross /* 9*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 10ae115bc7Smrj * All rights reserved. 11ae115bc7Smrj * 1226f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1326f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1426f3cdf0SGordon Ross * are met: 1526f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1626f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1726f3cdf0SGordon Ross * without modification. 1826f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1926f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 2026f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2126f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2226f3cdf0SGordon Ross * binary redistribution. 2326f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2426f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2526f3cdf0SGordon Ross * from this software without specific prior written permission. 26ae115bc7Smrj * 2726f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2826f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2926f3cdf0SGordon Ross * Software Foundation. 30ae115bc7Smrj * 3126f3cdf0SGordon Ross * NO WARRANTY 3226f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3326f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3426f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3526f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3626f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3726f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3826f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3926f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 4026f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4126f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4226f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4326f3cdf0SGordon Ross */ 44ae115bc7Smrj 45ae115bc7Smrj #include "acpi.h" 46aa2aa9a6SDana Myers #include "accommon.h" 47ae115bc7Smrj #include "acevents.h" 48ae115bc7Smrj 49ae115bc7Smrj 50ae115bc7Smrj #define _COMPONENT ACPI_EVENTS 51ae115bc7Smrj ACPI_MODULE_NAME ("evsci") 52ae115bc7Smrj 53*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE) /* Entire module */ 54*385cc6b4SJerry Jelinek 55ae115bc7Smrj /* Local prototypes */ 56ae115bc7Smrj 57ae115bc7Smrj static UINT32 ACPI_SYSTEM_XFACE 58ae115bc7Smrj AcpiEvSciXruptHandler ( 59ae115bc7Smrj void *Context); 60ae115bc7Smrj 61ae115bc7Smrj 62ae115bc7Smrj /******************************************************************************* 63ae115bc7Smrj * 64*385cc6b4SJerry Jelinek * FUNCTION: AcpiEvSciDispatch 65*385cc6b4SJerry Jelinek * 66*385cc6b4SJerry Jelinek * PARAMETERS: None 67*385cc6b4SJerry Jelinek * 68*385cc6b4SJerry Jelinek * RETURN: Status code indicates whether interrupt was handled. 69*385cc6b4SJerry Jelinek * 70*385cc6b4SJerry Jelinek * DESCRIPTION: Dispatch the SCI to all host-installed SCI handlers. 71*385cc6b4SJerry Jelinek * 72*385cc6b4SJerry Jelinek ******************************************************************************/ 73*385cc6b4SJerry Jelinek 74*385cc6b4SJerry Jelinek UINT32 75*385cc6b4SJerry Jelinek AcpiEvSciDispatch ( 76*385cc6b4SJerry Jelinek void) 77*385cc6b4SJerry Jelinek { 78*385cc6b4SJerry Jelinek ACPI_SCI_HANDLER_INFO *SciHandler; 79*385cc6b4SJerry Jelinek ACPI_CPU_FLAGS Flags; 80*385cc6b4SJerry Jelinek UINT32 IntStatus = ACPI_INTERRUPT_NOT_HANDLED; 81*385cc6b4SJerry Jelinek 82*385cc6b4SJerry Jelinek 83*385cc6b4SJerry Jelinek ACPI_FUNCTION_NAME (EvSciDispatch); 84*385cc6b4SJerry Jelinek 85*385cc6b4SJerry Jelinek 86*385cc6b4SJerry Jelinek /* Are there any host-installed SCI handlers? */ 87*385cc6b4SJerry Jelinek 88*385cc6b4SJerry Jelinek if (!AcpiGbl_SciHandlerList) 89*385cc6b4SJerry Jelinek { 90*385cc6b4SJerry Jelinek return (IntStatus); 91*385cc6b4SJerry Jelinek } 92*385cc6b4SJerry Jelinek 93*385cc6b4SJerry Jelinek Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 94*385cc6b4SJerry Jelinek 95*385cc6b4SJerry Jelinek /* Invoke all host-installed SCI handlers */ 96*385cc6b4SJerry Jelinek 97*385cc6b4SJerry Jelinek SciHandler = AcpiGbl_SciHandlerList; 98*385cc6b4SJerry Jelinek while (SciHandler) 99*385cc6b4SJerry Jelinek { 100*385cc6b4SJerry Jelinek /* Invoke the installed handler (at interrupt level) */ 101*385cc6b4SJerry Jelinek 102*385cc6b4SJerry Jelinek IntStatus |= SciHandler->Address ( 103*385cc6b4SJerry Jelinek SciHandler->Context); 104*385cc6b4SJerry Jelinek 105*385cc6b4SJerry Jelinek SciHandler = SciHandler->Next; 106*385cc6b4SJerry Jelinek } 107*385cc6b4SJerry Jelinek 108*385cc6b4SJerry Jelinek AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 109*385cc6b4SJerry Jelinek return (IntStatus); 110*385cc6b4SJerry Jelinek } 111*385cc6b4SJerry Jelinek 112*385cc6b4SJerry Jelinek 113*385cc6b4SJerry Jelinek /******************************************************************************* 114*385cc6b4SJerry Jelinek * 115ae115bc7Smrj * FUNCTION: AcpiEvSciXruptHandler 116ae115bc7Smrj * 117ae115bc7Smrj * PARAMETERS: Context - Calling Context 118ae115bc7Smrj * 119ae115bc7Smrj * RETURN: Status code indicates whether interrupt was handled. 120ae115bc7Smrj * 121ae115bc7Smrj * DESCRIPTION: Interrupt handler that will figure out what function or 122ae115bc7Smrj * control method to call to deal with a SCI. 123ae115bc7Smrj * 124ae115bc7Smrj ******************************************************************************/ 125ae115bc7Smrj 126ae115bc7Smrj static UINT32 ACPI_SYSTEM_XFACE 127ae115bc7Smrj AcpiEvSciXruptHandler ( 128ae115bc7Smrj void *Context) 129ae115bc7Smrj { 130ae115bc7Smrj ACPI_GPE_XRUPT_INFO *GpeXruptList = Context; 131ae115bc7Smrj UINT32 InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED; 132ae115bc7Smrj 133ae115bc7Smrj 134ae115bc7Smrj ACPI_FUNCTION_TRACE (EvSciXruptHandler); 135ae115bc7Smrj 136ae115bc7Smrj 137ae115bc7Smrj /* 138ae115bc7Smrj * We are guaranteed by the ACPICA initialization/shutdown code that 139ae115bc7Smrj * if this interrupt handler is installed, ACPI is enabled. 140ae115bc7Smrj */ 141ae115bc7Smrj 142ae115bc7Smrj /* 143ae115bc7Smrj * Fixed Events: 144ae115bc7Smrj * Check for and dispatch any Fixed Events that have occurred 145ae115bc7Smrj */ 146ae115bc7Smrj InterruptHandled |= AcpiEvFixedEventDetect (); 147ae115bc7Smrj 148ae115bc7Smrj /* 149ae115bc7Smrj * General Purpose Events: 150ae115bc7Smrj * Check for and dispatch any GPEs that have occurred 151ae115bc7Smrj */ 152ae115bc7Smrj InterruptHandled |= AcpiEvGpeDetect (GpeXruptList); 153ae115bc7Smrj 154*385cc6b4SJerry Jelinek /* Invoke all host-installed SCI handlers */ 155*385cc6b4SJerry Jelinek 156*385cc6b4SJerry Jelinek InterruptHandled |= AcpiEvSciDispatch (); 157*385cc6b4SJerry Jelinek 158db2bae30SDana Myers AcpiSciCount++; 159ae115bc7Smrj return_UINT32 (InterruptHandled); 160ae115bc7Smrj } 161ae115bc7Smrj 162ae115bc7Smrj 163ae115bc7Smrj /******************************************************************************* 164ae115bc7Smrj * 165ae115bc7Smrj * FUNCTION: AcpiEvGpeXruptHandler 166ae115bc7Smrj * 167ae115bc7Smrj * PARAMETERS: Context - Calling Context 168ae115bc7Smrj * 169ae115bc7Smrj * RETURN: Status code indicates whether interrupt was handled. 170ae115bc7Smrj * 171ae115bc7Smrj * DESCRIPTION: Handler for GPE Block Device interrupts 172ae115bc7Smrj * 173ae115bc7Smrj ******************************************************************************/ 174ae115bc7Smrj 175ae115bc7Smrj UINT32 ACPI_SYSTEM_XFACE 176ae115bc7Smrj AcpiEvGpeXruptHandler ( 177ae115bc7Smrj void *Context) 178ae115bc7Smrj { 179ae115bc7Smrj ACPI_GPE_XRUPT_INFO *GpeXruptList = Context; 180ae115bc7Smrj UINT32 InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED; 181ae115bc7Smrj 182ae115bc7Smrj 183ae115bc7Smrj ACPI_FUNCTION_TRACE (EvGpeXruptHandler); 184ae115bc7Smrj 185ae115bc7Smrj 186ae115bc7Smrj /* 187ae115bc7Smrj * We are guaranteed by the ACPICA initialization/shutdown code that 188ae115bc7Smrj * if this interrupt handler is installed, ACPI is enabled. 189ae115bc7Smrj */ 190ae115bc7Smrj 191aa2aa9a6SDana Myers /* GPEs: Check for and dispatch any GPEs that have occurred */ 192aa2aa9a6SDana Myers 193ae115bc7Smrj InterruptHandled |= AcpiEvGpeDetect (GpeXruptList); 194ae115bc7Smrj return_UINT32 (InterruptHandled); 195ae115bc7Smrj } 196ae115bc7Smrj 197ae115bc7Smrj 198ae115bc7Smrj /****************************************************************************** 199ae115bc7Smrj * 200ae115bc7Smrj * FUNCTION: AcpiEvInstallSciHandler 201ae115bc7Smrj * 202ae115bc7Smrj * PARAMETERS: none 203ae115bc7Smrj * 204ae115bc7Smrj * RETURN: Status 205ae115bc7Smrj * 206ae115bc7Smrj * DESCRIPTION: Installs SCI handler. 207ae115bc7Smrj * 208ae115bc7Smrj ******************************************************************************/ 209ae115bc7Smrj 210ae115bc7Smrj UINT32 211ae115bc7Smrj AcpiEvInstallSciHandler ( 212ae115bc7Smrj void) 213ae115bc7Smrj { 214ae115bc7Smrj UINT32 Status = AE_OK; 215ae115bc7Smrj 216ae115bc7Smrj 217ae115bc7Smrj ACPI_FUNCTION_TRACE (EvInstallSciHandler); 218ae115bc7Smrj 219ae115bc7Smrj 220db2bae30SDana Myers Status = AcpiOsInstallInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt, 221ae115bc7Smrj AcpiEvSciXruptHandler, AcpiGbl_GpeXruptListHead); 222ae115bc7Smrj return_ACPI_STATUS (Status); 223ae115bc7Smrj } 224ae115bc7Smrj 225ae115bc7Smrj 226ae115bc7Smrj /****************************************************************************** 227ae115bc7Smrj * 228*385cc6b4SJerry Jelinek * FUNCTION: AcpiEvRemoveAllSciHandlers 229ae115bc7Smrj * 230ae115bc7Smrj * PARAMETERS: none 231ae115bc7Smrj * 232*385cc6b4SJerry Jelinek * RETURN: AE_OK if handler uninstalled, AE_ERROR if handler was not 233ae115bc7Smrj * installed to begin with 234ae115bc7Smrj * 235ae115bc7Smrj * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be 236*385cc6b4SJerry Jelinek * taken. Remove all host-installed SCI handlers. 237ae115bc7Smrj * 238ae115bc7Smrj * Note: It doesn't seem important to disable all events or set the event 239ae115bc7Smrj * enable registers to their original values. The OS should disable 240ae115bc7Smrj * the SCI interrupt level when the handler is removed, so no more 241ae115bc7Smrj * events will come in. 242ae115bc7Smrj * 243ae115bc7Smrj ******************************************************************************/ 244ae115bc7Smrj 245ae115bc7Smrj ACPI_STATUS 246*385cc6b4SJerry Jelinek AcpiEvRemoveAllSciHandlers ( 247ae115bc7Smrj void) 248ae115bc7Smrj { 249*385cc6b4SJerry Jelinek ACPI_SCI_HANDLER_INFO *SciHandler; 250*385cc6b4SJerry Jelinek ACPI_CPU_FLAGS Flags; 251ae115bc7Smrj ACPI_STATUS Status; 252ae115bc7Smrj 253ae115bc7Smrj 254*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (EvRemoveAllSciHandlers); 255ae115bc7Smrj 256ae115bc7Smrj 257ae115bc7Smrj /* Just let the OS remove the handler and disable the level */ 258ae115bc7Smrj 259db2bae30SDana Myers Status = AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt, 260ae115bc7Smrj AcpiEvSciXruptHandler); 261ae115bc7Smrj 262*385cc6b4SJerry Jelinek if (!AcpiGbl_SciHandlerList) 263*385cc6b4SJerry Jelinek { 264*385cc6b4SJerry Jelinek return (Status); 265*385cc6b4SJerry Jelinek } 266*385cc6b4SJerry Jelinek 267*385cc6b4SJerry Jelinek Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); 268*385cc6b4SJerry Jelinek 269*385cc6b4SJerry Jelinek /* Free all host-installed SCI handlers */ 270*385cc6b4SJerry Jelinek 271*385cc6b4SJerry Jelinek while (AcpiGbl_SciHandlerList) 272*385cc6b4SJerry Jelinek { 273*385cc6b4SJerry Jelinek SciHandler = AcpiGbl_SciHandlerList; 274*385cc6b4SJerry Jelinek AcpiGbl_SciHandlerList = SciHandler->Next; 275*385cc6b4SJerry Jelinek ACPI_FREE (SciHandler); 276*385cc6b4SJerry Jelinek } 277*385cc6b4SJerry Jelinek 278*385cc6b4SJerry Jelinek AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); 279ae115bc7Smrj return_ACPI_STATUS (Status); 280ae115bc7Smrj } 281ae115bc7Smrj 282*385cc6b4SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */ 283