]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/acpi/utilities/utxface.c
ACPICA 20050617-0624 from Bob Moore <robert.moore@intel.com>
[karo-tx-linux.git] / drivers / acpi / utilities / utxface.c
1 /******************************************************************************
2  *
3  * Module Name: utxface - External interfaces for "global" ACPI functions
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2005, R. Byron Moore
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 #include <linux/module.h>
45
46 #include <acpi/acpi.h>
47 #include <acpi/acevents.h>
48 #include <acpi/acnamesp.h>
49 #include <acpi/acdebug.h>
50
51 #define _COMPONENT          ACPI_UTILITIES
52          ACPI_MODULE_NAME    ("utxface")
53
54
55 /*******************************************************************************
56  *
57  * FUNCTION:    acpi_initialize_subsystem
58  *
59  * PARAMETERS:  None
60  *
61  * RETURN:      Status
62  *
63  * DESCRIPTION: Initializes all global variables.  This is the first function
64  *              called, so any early initialization belongs here.
65  *
66  ******************************************************************************/
67
68 acpi_status
69 acpi_initialize_subsystem (
70         void)
71 {
72         acpi_status                     status;
73
74
75         ACPI_FUNCTION_TRACE ("acpi_initialize_subsystem");
76
77
78         ACPI_DEBUG_EXEC (acpi_ut_init_stack_ptr_trace ());
79
80         /* Initialize the OS-Dependent layer */
81
82         status = acpi_os_initialize ();
83         if (ACPI_FAILURE (status)) {
84                 ACPI_REPORT_ERROR (("OSD failed to initialize, %s\n",
85                         acpi_format_exception (status)));
86                 return_ACPI_STATUS (status);
87         }
88
89         /* Initialize all globals used by the subsystem */
90
91         acpi_ut_init_globals ();
92
93         /* Create the default mutex objects */
94
95         status = acpi_ut_mutex_initialize ();
96         if (ACPI_FAILURE (status)) {
97                 ACPI_REPORT_ERROR (("Global mutex creation failure, %s\n",
98                         acpi_format_exception (status)));
99                 return_ACPI_STATUS (status);
100         }
101
102         /*
103          * Initialize the namespace manager and
104          * the root of the namespace tree
105          */
106         status = acpi_ns_root_initialize ();
107         if (ACPI_FAILURE (status)) {
108                 ACPI_REPORT_ERROR (("Namespace initialization failure, %s\n",
109                         acpi_format_exception (status)));
110                 return_ACPI_STATUS (status);
111         }
112
113         /* If configured, initialize the AML debugger */
114
115         ACPI_DEBUGGER_EXEC (status = acpi_db_initialize ());
116
117         return_ACPI_STATUS (status);
118 }
119
120
121 /*******************************************************************************
122  *
123  * FUNCTION:    acpi_enable_subsystem
124  *
125  * PARAMETERS:  Flags           - Init/enable Options
126  *
127  * RETURN:      Status
128  *
129  * DESCRIPTION: Completes the subsystem initialization including hardware.
130  *              Puts system into ACPI mode if it isn't already.
131  *
132  ******************************************************************************/
133
134 acpi_status
135 acpi_enable_subsystem (
136         u32                             flags)
137 {
138         acpi_status                     status = AE_OK;
139
140
141         ACPI_FUNCTION_TRACE ("acpi_enable_subsystem");
142
143
144         /*
145          * We must initialize the hardware before we can enable ACPI.
146          * The values from the FADT are validated here.
147          */
148         if (!(flags & ACPI_NO_HARDWARE_INIT)) {
149                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
150                         "[Init] Initializing ACPI hardware\n"));
151
152                 status = acpi_hw_initialize ();
153                 if (ACPI_FAILURE (status)) {
154                         return_ACPI_STATUS (status);
155                 }
156         }
157
158         /* Enable ACPI mode */
159
160         if (!(flags & ACPI_NO_ACPI_ENABLE)) {
161                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n"));
162
163                 acpi_gbl_original_mode = acpi_hw_get_mode();
164
165                 status = acpi_enable ();
166                 if (ACPI_FAILURE (status)) {
167                         ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "acpi_enable failed.\n"));
168                         return_ACPI_STATUS (status);
169                 }
170         }
171
172         /*
173          * Install the default op_region handlers. These are installed unless
174          * other handlers have already been installed via the
175          * install_address_space_handler interface.
176          */
177         if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
178                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
179                         "[Init] Installing default address space handlers\n"));
180
181                 status = acpi_ev_install_region_handlers ();
182                 if (ACPI_FAILURE (status)) {
183                         return_ACPI_STATUS (status);
184                 }
185         }
186
187         /*
188          * Initialize ACPI Event handling (Fixed and General Purpose)
189          *
190          * NOTE: We must have the hardware AND events initialized before we can
191          * execute ANY control methods SAFELY.  Any control method can require
192          * ACPI hardware support, so the hardware MUST be initialized before
193          * execution!
194          */
195         if (!(flags & ACPI_NO_EVENT_INIT)) {
196                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
197                         "[Init] Initializing ACPI events\n"));
198
199                 status = acpi_ev_initialize_events ();
200                 if (ACPI_FAILURE (status)) {
201                         return_ACPI_STATUS (status);
202                 }
203         }
204
205         /* Install the SCI handler and Global Lock handler */
206
207         if (!(flags & ACPI_NO_HANDLER_INIT)) {
208                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
209                         "[Init] Installing SCI/GL handlers\n"));
210
211                 status = acpi_ev_install_xrupt_handlers ();
212                 if (ACPI_FAILURE (status)) {
213                         return_ACPI_STATUS (status);
214                 }
215         }
216
217         return_ACPI_STATUS (status);
218 }
219
220 /*******************************************************************************
221  *
222  * FUNCTION:    acpi_initialize_objects
223  *
224  * PARAMETERS:  Flags           - Init/enable Options
225  *
226  * RETURN:      Status
227  *
228  * DESCRIPTION: Completes namespace initialization by initializing device
229  *              objects and executing AML code for Regions, buffers, etc.
230  *
231  ******************************************************************************/
232
233 acpi_status
234 acpi_initialize_objects (
235         u32                             flags)
236 {
237         acpi_status                     status = AE_OK;
238
239
240         ACPI_FUNCTION_TRACE ("acpi_initialize_objects");
241
242
243         /*
244          * Run all _REG methods
245          *
246          * NOTE: Any objects accessed
247          * by the _REG methods will be automatically initialized, even if they
248          * contain executable AML (see call to acpi_ns_initialize_objects below).
249          */
250         if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
251                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
252                         "[Init] Executing _REG op_region methods\n"));
253
254                 status = acpi_ev_initialize_op_regions ();
255                 if (ACPI_FAILURE (status)) {
256                         return_ACPI_STATUS (status);
257                 }
258         }
259
260         /*
261          * Initialize the objects that remain uninitialized.  This
262          * runs the executable AML that may be part of the declaration of these
263          * objects: operation_regions, buffer_fields, Buffers, and Packages.
264          */
265         if (!(flags & ACPI_NO_OBJECT_INIT)) {
266                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
267                         "[Init] Completing Initialization of ACPI Objects\n"));
268
269                 status = acpi_ns_initialize_objects ();
270                 if (ACPI_FAILURE (status)) {
271                         return_ACPI_STATUS (status);
272                 }
273         }
274
275         /*
276          * Initialize all device objects in the namespace
277          * This runs the _STA and _INI methods.
278          */
279         if (!(flags & ACPI_NO_DEVICE_INIT)) {
280                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
281                         "[Init] Initializing ACPI Devices\n"));
282
283                 status = acpi_ns_initialize_devices ();
284                 if (ACPI_FAILURE (status)) {
285                         return_ACPI_STATUS (status);
286                 }
287         }
288
289         /*
290          * Empty the caches (delete the cached objects) on the assumption that
291          * the table load filled them up more than they will be at runtime --
292          * thus wasting non-paged memory.
293          */
294         status = acpi_purge_cached_objects ();
295
296         acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK;
297         return_ACPI_STATUS (status);
298 }
299
300
301 /*******************************************************************************
302  *
303  * FUNCTION:    acpi_terminate
304  *
305  * PARAMETERS:  None
306  *
307  * RETURN:      Status
308  *
309  * DESCRIPTION: Shutdown the ACPI subsystem.  Release all resources.
310  *
311  ******************************************************************************/
312
313 acpi_status
314 acpi_terminate (
315         void)
316 {
317         acpi_status                 status;
318
319
320         ACPI_FUNCTION_TRACE ("acpi_terminate");
321
322
323         /* Terminate the AML Debugger if present */
324
325         ACPI_DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE);
326
327         /* Shutdown and free all resources */
328
329         acpi_ut_subsystem_shutdown ();
330
331
332         /* Free the mutex objects */
333
334         acpi_ut_mutex_terminate ();
335
336
337 #ifdef ACPI_DEBUGGER
338
339         /* Shut down the debugger */
340
341         acpi_db_terminate ();
342 #endif
343
344         /* Now we can shutdown the OS-dependent layer */
345
346         status = acpi_os_terminate ();
347         return_ACPI_STATUS (status);
348 }
349
350
351 #ifdef ACPI_FUTURE_USAGE
352 /*******************************************************************************
353  *
354  * FUNCTION:    acpi_subsystem_status
355  *
356  * PARAMETERS:  None
357  *
358  * RETURN:      Status of the ACPI subsystem
359  *
360  * DESCRIPTION: Other drivers that use the ACPI subsystem should call this
361  *              before making any other calls, to ensure the subsystem
362  *              initialized successfully.
363  *
364  ******************************************************************************/
365
366 acpi_status
367 acpi_subsystem_status (
368         void)
369 {
370
371         if (acpi_gbl_startup_flags & ACPI_INITIALIZED_OK) {
372                 return (AE_OK);
373         }
374         else {
375                 return (AE_ERROR);
376         }
377 }
378
379
380 /*******************************************************************************
381  *
382  * FUNCTION:    acpi_get_system_info
383  *
384  * PARAMETERS:  out_buffer      - A buffer to receive the resources for the
385  *                                device
386  *
387  * RETURN:      Status          - the status of the call
388  *
389  * DESCRIPTION: This function is called to get information about the current
390  *              state of the ACPI subsystem.  It will return system information
391  *              in the out_buffer.
392  *
393  *              If the function fails an appropriate status will be returned
394  *              and the value of out_buffer is undefined.
395  *
396  ******************************************************************************/
397
398 acpi_status
399 acpi_get_system_info (
400         struct acpi_buffer              *out_buffer)
401 {
402         struct acpi_system_info         *info_ptr;
403         acpi_status                     status;
404         u32                             i;
405
406
407         ACPI_FUNCTION_TRACE ("acpi_get_system_info");
408
409
410         /* Parameter validation */
411
412         status = acpi_ut_validate_buffer (out_buffer);
413         if (ACPI_FAILURE (status)) {
414                 return_ACPI_STATUS (status);
415         }
416
417         /* Validate/Allocate/Clear caller buffer */
418
419         status = acpi_ut_initialize_buffer (out_buffer, sizeof (struct acpi_system_info));
420         if (ACPI_FAILURE (status)) {
421                 return_ACPI_STATUS (status);
422         }
423
424         /*
425          * Populate the return buffer
426          */
427         info_ptr = (struct acpi_system_info *) out_buffer->pointer;
428
429         info_ptr->acpi_ca_version   = ACPI_CA_VERSION;
430
431         /* System flags (ACPI capabilities) */
432
433         info_ptr->flags             = ACPI_SYS_MODE_ACPI;
434
435         /* Timer resolution - 24 or 32 bits  */
436
437         if (!acpi_gbl_FADT) {
438                 info_ptr->timer_resolution = 0;
439         }
440         else if (acpi_gbl_FADT->tmr_val_ext == 0) {
441                 info_ptr->timer_resolution = 24;
442         }
443         else {
444                 info_ptr->timer_resolution = 32;
445         }
446
447         /* Clear the reserved fields */
448
449         info_ptr->reserved1         = 0;
450         info_ptr->reserved2         = 0;
451
452         /* Current debug levels */
453
454         info_ptr->debug_layer       = acpi_dbg_layer;
455         info_ptr->debug_level       = acpi_dbg_level;
456
457         /* Current status of the ACPI tables, per table type */
458
459         info_ptr->num_table_types = NUM_ACPI_TABLE_TYPES;
460         for (i = 0; i < NUM_ACPI_TABLE_TYPES; i++) {
461                 info_ptr->table_info[i].count = acpi_gbl_table_lists[i].count;
462         }
463
464         return_ACPI_STATUS (AE_OK);
465 }
466 EXPORT_SYMBOL(acpi_get_system_info);
467
468
469 /*****************************************************************************
470  *
471  * FUNCTION:    acpi_install_initialization_handler
472  *
473  * PARAMETERS:  Handler             - Callback procedure
474  *              Function            - Not (currently) used, see below
475  *
476  * RETURN:      Status
477  *
478  * DESCRIPTION: Install an initialization handler
479  *
480  * TBD: When a second function is added, must save the Function also.
481  *
482  ****************************************************************************/
483
484 acpi_status
485 acpi_install_initialization_handler (
486         acpi_init_handler               handler,
487         u32                             function)
488 {
489
490         if (!handler) {
491                 return (AE_BAD_PARAMETER);
492         }
493
494         if (acpi_gbl_init_handler) {
495                 return (AE_ALREADY_EXISTS);
496         }
497
498         acpi_gbl_init_handler = handler;
499         return AE_OK;
500 }
501
502 #endif  /*  ACPI_FUTURE_USAGE  */
503
504 /*****************************************************************************
505  *
506  * FUNCTION:    acpi_purge_cached_objects
507  *
508  * PARAMETERS:  None
509  *
510  * RETURN:      Status
511  *
512  * DESCRIPTION: Empty all caches (delete the cached objects)
513  *
514  ****************************************************************************/
515
516 acpi_status
517 acpi_purge_cached_objects (
518         void)
519 {
520         ACPI_FUNCTION_TRACE ("acpi_purge_cached_objects");
521
522         (void) acpi_os_purge_cache (acpi_gbl_state_cache);
523         (void) acpi_os_purge_cache (acpi_gbl_operand_cache);
524         (void) acpi_os_purge_cache (acpi_gbl_ps_node_cache);
525         (void) acpi_os_purge_cache (acpi_gbl_ps_node_ext_cache);
526         return_ACPI_STATUS (AE_OK);
527 }