xref: /titanic_52/usr/src/uts/intel/io/acpica/events/evsci.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
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