]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/contrib/dev/acpica/events/evsci.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / contrib / dev / acpica / events / evsci.c
1 /*******************************************************************************
2  *
3  * Module Name: evsci - System Control Interrupt configuration and
4  *                      legacy to ACPI mode state transition functions
5  *
6  ******************************************************************************/
7
8 /*
9  * Copyright (C) 2000 - 2011, Intel Corp.
10  * All rights reserved.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions, and the following disclaimer,
17  *    without modification.
18  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19  *    substantially similar to the "NO WARRANTY" disclaimer below
20  *    ("Disclaimer") and any redistribution must be conditioned upon
21  *    including a substantially similar Disclaimer requirement for further
22  *    binary redistribution.
23  * 3. Neither the names of the above-listed copyright holders nor the names
24  *    of any contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  * Alternatively, this software may be distributed under the terms of the
28  * GNU General Public License ("GPL") version 2 as published by the Free
29  * Software Foundation.
30  *
31  * NO WARRANTY
32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42  * POSSIBILITY OF SUCH DAMAGES.
43  */
44
45 #include <contrib/dev/acpica/include/acpi.h>
46 #include <contrib/dev/acpica/include/accommon.h>
47 #include <contrib/dev/acpica/include/acevents.h>
48
49
50 #define _COMPONENT          ACPI_EVENTS
51         ACPI_MODULE_NAME    ("evsci")
52
53 /* Local prototypes */
54
55 static UINT32 ACPI_SYSTEM_XFACE
56 AcpiEvSciXruptHandler (
57     void                    *Context);
58
59
60 /*******************************************************************************
61  *
62  * FUNCTION:    AcpiEvSciXruptHandler
63  *
64  * PARAMETERS:  Context   - Calling Context
65  *
66  * RETURN:      Status code indicates whether interrupt was handled.
67  *
68  * DESCRIPTION: Interrupt handler that will figure out what function or
69  *              control method to call to deal with a SCI.
70  *
71  ******************************************************************************/
72
73 static UINT32 ACPI_SYSTEM_XFACE
74 AcpiEvSciXruptHandler (
75     void                    *Context)
76 {
77     ACPI_GPE_XRUPT_INFO     *GpeXruptList = Context;
78     UINT32                  InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED;
79
80
81     ACPI_FUNCTION_TRACE (EvSciXruptHandler);
82
83
84     /*
85      * We are guaranteed by the ACPI CA initialization/shutdown code that
86      * if this interrupt handler is installed, ACPI is enabled.
87      */
88
89     /*
90      * Fixed Events:
91      * Check for and dispatch any Fixed Events that have occurred
92      */
93     InterruptHandled |= AcpiEvFixedEventDetect ();
94
95     /*
96      * General Purpose Events:
97      * Check for and dispatch any GPEs that have occurred
98      */
99     InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
100
101     AcpiSciCount++;
102     return_UINT32 (InterruptHandled);
103 }
104
105
106 /*******************************************************************************
107  *
108  * FUNCTION:    AcpiEvGpeXruptHandler
109  *
110  * PARAMETERS:  Context   - Calling Context
111  *
112  * RETURN:      Status code indicates whether interrupt was handled.
113  *
114  * DESCRIPTION: Handler for GPE Block Device interrupts
115  *
116  ******************************************************************************/
117
118 UINT32 ACPI_SYSTEM_XFACE
119 AcpiEvGpeXruptHandler (
120     void                    *Context)
121 {
122     ACPI_GPE_XRUPT_INFO     *GpeXruptList = Context;
123     UINT32                  InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED;
124
125
126     ACPI_FUNCTION_TRACE (EvGpeXruptHandler);
127
128
129     /*
130      * We are guaranteed by the ACPI CA initialization/shutdown code that
131      * if this interrupt handler is installed, ACPI is enabled.
132      */
133
134     /* GPEs: Check for and dispatch any GPEs that have occurred */
135
136     InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
137
138     return_UINT32 (InterruptHandled);
139 }
140
141
142 /******************************************************************************
143  *
144  * FUNCTION:    AcpiEvInstallSciHandler
145  *
146  * PARAMETERS:  none
147  *
148  * RETURN:      Status
149  *
150  * DESCRIPTION: Installs SCI handler.
151  *
152  ******************************************************************************/
153
154 UINT32
155 AcpiEvInstallSciHandler (
156     void)
157 {
158     UINT32                  Status = AE_OK;
159
160
161     ACPI_FUNCTION_TRACE (EvInstallSciHandler);
162
163
164     Status = AcpiOsInstallInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,
165                 AcpiEvSciXruptHandler, AcpiGbl_GpeXruptListHead);
166     return_ACPI_STATUS (Status);
167 }
168
169
170 /******************************************************************************
171  *
172  * FUNCTION:    AcpiEvRemoveSciHandler
173  *
174  * PARAMETERS:  none
175  *
176  * RETURN:      E_OK if handler uninstalled OK, E_ERROR if handler was not
177  *              installed to begin with
178  *
179  * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
180  *              taken.
181  *
182  * Note:  It doesn't seem important to disable all events or set the event
183  *        enable registers to their original values. The OS should disable
184  *        the SCI interrupt level when the handler is removed, so no more
185  *        events will come in.
186  *
187  ******************************************************************************/
188
189 ACPI_STATUS
190 AcpiEvRemoveSciHandler (
191     void)
192 {
193     ACPI_STATUS             Status;
194
195
196     ACPI_FUNCTION_TRACE (EvRemoveSciHandler);
197
198
199     /* Just let the OS remove the handler and disable the level */
200
201     Status = AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,
202                 AcpiEvSciXruptHandler);
203
204     return_ACPI_STATUS (Status);
205 }
206
207