xref: /titanic_50/usr/src/uts/intel/io/acpica/events/evxfevnt.c (revision 49f9b365248ee858ee91baa36eab27c5200f6dca)
1 /******************************************************************************
2  *
3  * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2011, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 
45 #define __EVXFEVNT_C__
46 
47 #include "acpi.h"
48 #include "accommon.h"
49 #include "actables.h"
50 
51 #define _COMPONENT          ACPI_EVENTS
52         ACPI_MODULE_NAME    ("evxfevnt")
53 
54 
55 /*******************************************************************************
56  *
57  * FUNCTION:    AcpiEnable
58  *
59  * PARAMETERS:  None
60  *
61  * RETURN:      Status
62  *
63  * DESCRIPTION: Transfers the system into ACPI mode.
64  *
65  ******************************************************************************/
66 
67 ACPI_STATUS
68 AcpiEnable (
69     void)
70 {
71     ACPI_STATUS             Status = AE_OK;
72 
73 
74     ACPI_FUNCTION_TRACE (AcpiEnable);
75 
76 
77     /* ACPI tables must be present */
78 
79     if (!AcpiTbTablesLoaded ())
80     {
81         return_ACPI_STATUS (AE_NO_ACPI_TABLES);
82     }
83 
84     /* Check current mode */
85 
86     if (AcpiHwGetMode() == ACPI_SYS_MODE_ACPI)
87     {
88         ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "System is already in ACPI mode\n"));
89     }
90     else
91     {
92         /* Transition to ACPI mode */
93 
94         Status = AcpiHwSetMode (ACPI_SYS_MODE_ACPI);
95         if (ACPI_FAILURE (Status))
96         {
97             ACPI_ERROR ((AE_INFO, "Could not transition to ACPI mode"));
98             return_ACPI_STATUS (Status);
99         }
100 
101         ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
102             "Transition to ACPI mode successful\n"));
103     }
104 
105     return_ACPI_STATUS (Status);
106 }
107 
108 ACPI_EXPORT_SYMBOL (AcpiEnable)
109 
110 
111 /*******************************************************************************
112  *
113  * FUNCTION:    AcpiDisable
114  *
115  * PARAMETERS:  None
116  *
117  * RETURN:      Status
118  *
119  * DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.
120  *
121  ******************************************************************************/
122 
123 ACPI_STATUS
124 AcpiDisable (
125     void)
126 {
127     ACPI_STATUS             Status = AE_OK;
128 
129 
130     ACPI_FUNCTION_TRACE (AcpiDisable);
131 
132 
133     if (AcpiHwGetMode() == ACPI_SYS_MODE_LEGACY)
134     {
135         ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
136             "System is already in legacy (non-ACPI) mode\n"));
137     }
138     else
139     {
140         /* Transition to LEGACY mode */
141 
142         Status = AcpiHwSetMode (ACPI_SYS_MODE_LEGACY);
143 
144         if (ACPI_FAILURE (Status))
145         {
146             ACPI_ERROR ((AE_INFO,
147                 "Could not exit ACPI mode to legacy mode"));
148             return_ACPI_STATUS (Status);
149         }
150 
151         ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI mode disabled\n"));
152     }
153 
154     return_ACPI_STATUS (Status);
155 }
156 
157 ACPI_EXPORT_SYMBOL (AcpiDisable)
158 
159 
160 /*******************************************************************************
161  *
162  * FUNCTION:    AcpiEnableEvent
163  *
164  * PARAMETERS:  Event           - The fixed eventto be enabled
165  *              Flags           - Reserved
166  *
167  * RETURN:      Status
168  *
169  * DESCRIPTION: Enable an ACPI event (fixed)
170  *
171  ******************************************************************************/
172 
173 ACPI_STATUS
174 AcpiEnableEvent (
175     UINT32                  Event,
176     UINT32                  Flags)
177 {
178     ACPI_STATUS             Status = AE_OK;
179     UINT32                  Value;
180 
181 
182     ACPI_FUNCTION_TRACE (AcpiEnableEvent);
183 
184 
185     /* Decode the Fixed Event */
186 
187     if (Event > ACPI_EVENT_MAX)
188     {
189         return_ACPI_STATUS (AE_BAD_PARAMETER);
190     }
191 
192     /*
193      * Enable the requested fixed event (by writing a one to the enable
194      * register bit)
195      */
196     Status = AcpiWriteBitRegister (
197                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
198                 ACPI_ENABLE_EVENT);
199     if (ACPI_FAILURE (Status))
200     {
201         return_ACPI_STATUS (Status);
202     }
203 
204     /* Make sure that the hardware responded */
205 
206     Status = AcpiReadBitRegister (
207                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value);
208     if (ACPI_FAILURE (Status))
209     {
210         return_ACPI_STATUS (Status);
211     }
212 
213     if (Value != 1)
214     {
215         ACPI_ERROR ((AE_INFO,
216             "Could not enable %s event", AcpiUtGetEventName (Event)));
217         return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
218     }
219 
220     return_ACPI_STATUS (Status);
221 }
222 
223 ACPI_EXPORT_SYMBOL (AcpiEnableEvent)
224 
225 
226 /*******************************************************************************
227  *
228  * FUNCTION:    AcpiDisableEvent
229  *
230  * PARAMETERS:  Event           - The fixed event to be disabled
231  *              Flags           - Reserved
232  *
233  * RETURN:      Status
234  *
235  * DESCRIPTION: Disable an ACPI event (fixed)
236  *
237  ******************************************************************************/
238 
239 ACPI_STATUS
240 AcpiDisableEvent (
241     UINT32                  Event,
242     UINT32                  Flags)
243 {
244     ACPI_STATUS             Status = AE_OK;
245     UINT32                  Value;
246 
247 
248     ACPI_FUNCTION_TRACE (AcpiDisableEvent);
249 
250 
251     /* Decode the Fixed Event */
252 
253     if (Event > ACPI_EVENT_MAX)
254     {
255         return_ACPI_STATUS (AE_BAD_PARAMETER);
256     }
257 
258     /*
259      * Disable the requested fixed event (by writing a zero to the enable
260      * register bit)
261      */
262     Status = AcpiWriteBitRegister (
263                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
264                 ACPI_DISABLE_EVENT);
265     if (ACPI_FAILURE (Status))
266     {
267         return_ACPI_STATUS (Status);
268     }
269 
270     Status = AcpiReadBitRegister (
271                 AcpiGbl_FixedEventInfo[Event].EnableRegisterId, &Value);
272     if (ACPI_FAILURE (Status))
273     {
274         return_ACPI_STATUS (Status);
275     }
276 
277     if (Value != 0)
278     {
279         ACPI_ERROR ((AE_INFO,
280             "Could not disable %s events", AcpiUtGetEventName (Event)));
281         return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
282     }
283 
284     return_ACPI_STATUS (Status);
285 }
286 
287 ACPI_EXPORT_SYMBOL (AcpiDisableEvent)
288 
289 
290 /*******************************************************************************
291  *
292  * FUNCTION:    AcpiClearEvent
293  *
294  * PARAMETERS:  Event           - The fixed event to be cleared
295  *
296  * RETURN:      Status
297  *
298  * DESCRIPTION: Clear an ACPI event (fixed)
299  *
300  ******************************************************************************/
301 
302 ACPI_STATUS
303 AcpiClearEvent (
304     UINT32                  Event)
305 {
306     ACPI_STATUS             Status = AE_OK;
307 
308 
309     ACPI_FUNCTION_TRACE (AcpiClearEvent);
310 
311 
312     /* Decode the Fixed Event */
313 
314     if (Event > ACPI_EVENT_MAX)
315     {
316         return_ACPI_STATUS (AE_BAD_PARAMETER);
317     }
318 
319     /*
320      * Clear the requested fixed event (By writing a one to the status
321      * register bit)
322      */
323     Status = AcpiWriteBitRegister (
324                 AcpiGbl_FixedEventInfo[Event].StatusRegisterId,
325                 ACPI_CLEAR_STATUS);
326 
327     return_ACPI_STATUS (Status);
328 }
329 
330 ACPI_EXPORT_SYMBOL (AcpiClearEvent)
331 
332 
333 /*******************************************************************************
334  *
335  * FUNCTION:    AcpiGetEventStatus
336  *
337  * PARAMETERS:  Event           - The fixed event
338  *              EventStatus     - Where the current status of the event will
339  *                                be returned
340  *
341  * RETURN:      Status
342  *
343  * DESCRIPTION: Obtains and returns the current status of the event
344  *
345  ******************************************************************************/
346 
347 ACPI_STATUS
348 AcpiGetEventStatus (
349     UINT32                  Event,
350     ACPI_EVENT_STATUS       *EventStatus)
351 {
352     ACPI_STATUS             Status = AE_OK;
353 
354 
355     ACPI_FUNCTION_TRACE (AcpiGetEventStatus);
356 
357 
358     if (!EventStatus)
359     {
360         return_ACPI_STATUS (AE_BAD_PARAMETER);
361     }
362 
363     /* Decode the Fixed Event */
364 
365     if (Event > ACPI_EVENT_MAX)
366     {
367         return_ACPI_STATUS (AE_BAD_PARAMETER);
368     }
369 
370     /* Get the status of the requested fixed event */
371 
372     Status = AcpiReadBitRegister (
373                 AcpiGbl_FixedEventInfo[Event].StatusRegisterId, EventStatus);
374 
375     return_ACPI_STATUS (Status);
376 }
377 
378 ACPI_EXPORT_SYMBOL (AcpiGetEventStatus)
379 
380 
381