Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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