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
AcpiEvSciDispatch(void)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
AcpiEvSciXruptHandler(void * Context)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
AcpiEvGpeXruptHandler(void * Context)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
AcpiEvInstallSciHandler(void)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
AcpiEvRemoveAllSciHandlers(void)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