OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [acpi/] [utilities/] [utxface.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.