utxface.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: utxface - External interfaces for "global" ACPI functions
  4.  *              $Revision: 82 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acevents.h"
  26. #include "achware.h"
  27. #include "acnamesp.h"
  28. #include "acinterp.h"
  29. #include "amlcode.h"
  30. #include "acdebug.h"
  31. #include "acexcep.h"
  32. #define _COMPONENT          ACPI_UTILITIES
  33.  MODULE_NAME         ("utxface")
  34. /*******************************************************************************
  35.  *
  36.  * FUNCTION:    Acpi_initialize_subsystem
  37.  *
  38.  * PARAMETERS:  None
  39.  *
  40.  * RETURN:      Status
  41.  *
  42.  * DESCRIPTION: Initializes all global variables.  This is the first function
  43.  *              called, so any early initialization belongs here.
  44.  *
  45.  ******************************************************************************/
  46. acpi_status
  47. acpi_initialize_subsystem (
  48. void)
  49. {
  50. acpi_status             status;
  51. FUNCTION_TRACE ("Acpi_initialize_subsystem");
  52. DEBUG_EXEC(acpi_ut_init_stack_ptr_trace ());
  53. /* Initialize all globals used by the subsystem */
  54. acpi_ut_init_globals ();
  55. /* Initialize the OS-Dependent layer */
  56. status = acpi_os_initialize ();
  57. if (ACPI_FAILURE (status)) {
  58. REPORT_ERROR (("OSD failed to initialize, %sn",
  59. acpi_format_exception (status)));
  60. return_ACPI_STATUS (status);
  61. }
  62. /* Create the default mutex objects */
  63. status = acpi_ut_mutex_initialize ();
  64. if (ACPI_FAILURE (status)) {
  65. REPORT_ERROR (("Global mutex creation failure, %sn",
  66. acpi_format_exception (status)));
  67. return_ACPI_STATUS (status);
  68. }
  69. /*
  70.  * Initialize the namespace manager and
  71.  * the root of the namespace tree
  72.  */
  73. status = acpi_ns_root_initialize ();
  74. if (ACPI_FAILURE (status)) {
  75. REPORT_ERROR (("Namespace initialization failure, %sn",
  76. acpi_format_exception (status)));
  77. return_ACPI_STATUS (status);
  78. }
  79. /* If configured, initialize the AML debugger */
  80. DEBUGGER_EXEC (acpi_db_initialize ());
  81. return_ACPI_STATUS (status);
  82. }
  83. /*******************************************************************************
  84.  *
  85.  * FUNCTION:    Acpi_enable_subsystem
  86.  *
  87.  * PARAMETERS:  Flags           - Init/enable Options
  88.  *
  89.  * RETURN:      Status
  90.  *
  91.  * DESCRIPTION: Completes the subsystem initialization including hardware.
  92.  *              Puts system into ACPI mode if it isn't already.
  93.  *
  94.  ******************************************************************************/
  95. acpi_status
  96. acpi_enable_subsystem (
  97. u32                     flags)
  98. {
  99. acpi_status             status = AE_OK;
  100. FUNCTION_TRACE ("Acpi_enable_subsystem");
  101. /* Sanity check the FADT for valid values */
  102. status = acpi_ut_validate_fadt ();
  103. if (ACPI_FAILURE (status)) {
  104. return_ACPI_STATUS (status);
  105. }
  106. /*
  107.  * Install the default Op_region handlers. These are
  108.  * installed unless other handlers have already been
  109.  * installed via the Install_address_space_handler interface
  110.  */
  111. if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
  112. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing default address space handlersn"));
  113. status = acpi_ev_install_default_address_space_handlers ();
  114. if (ACPI_FAILURE (status)) {
  115. return_ACPI_STATUS (status);
  116. }
  117. }
  118. /*
  119.  * We must initialize the hardware before we can enable ACPI.
  120.  */
  121. if (!(flags & ACPI_NO_HARDWARE_INIT)) {
  122. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI hardwaren"));
  123. status = acpi_hw_initialize ();
  124. if (ACPI_FAILURE (status)) {
  125. return_ACPI_STATUS (status);
  126. }
  127. }
  128. /*
  129.  * Enable ACPI on this platform
  130.  */
  131. if (!(flags & ACPI_NO_ACPI_ENABLE)) {
  132. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI moden"));
  133. status = acpi_enable ();
  134. if (ACPI_FAILURE (status)) {
  135. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Acpi_enable failed.n"));
  136. return_ACPI_STATUS (status);
  137. }
  138. }
  139. /*
  140.  * Note:
  141.  * We must have the hardware AND events initialized before we can execute
  142.  * ANY control methods SAFELY.  Any control method can require ACPI hardware
  143.  * support, so the hardware MUST be initialized before execution!
  144.  */
  145. if (!(flags & ACPI_NO_EVENT_INIT)) {
  146. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI eventsn"));
  147. status = acpi_ev_initialize ();
  148. if (ACPI_FAILURE (status)) {
  149. return_ACPI_STATUS (status);
  150. }
  151. }
  152. /*
  153.  * Initialize all device objects in the namespace
  154.  * This runs the _STA and _INI methods.
  155.  */
  156. if (!(flags & ACPI_NO_DEVICE_INIT)) {
  157. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI Devicesn"));
  158. status = acpi_ns_initialize_devices ();
  159. if (ACPI_FAILURE (status)) {
  160. return_ACPI_STATUS (status);
  161. }
  162. }
  163. /*
  164.  * Initialize the objects that remain uninitialized.  This
  165.  * runs the executable AML that is part of the declaration of Op_regions
  166.  * and Fields.
  167.  */
  168. if (!(flags & ACPI_NO_OBJECT_INIT)) {
  169. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI Objectsn"));
  170. status = acpi_ns_initialize_objects ();
  171. if (ACPI_FAILURE (status)) {
  172. return_ACPI_STATUS (status);
  173. }
  174. }
  175. acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK;
  176. return_ACPI_STATUS (status);
  177. }
  178. /*******************************************************************************
  179.  *
  180.  * FUNCTION:    Acpi_terminate
  181.  *
  182.  * PARAMETERS:  None
  183.  *
  184.  * RETURN:      Status
  185.  *
  186.  * DESCRIPTION: Shutdown the ACPI subsystem.  Release all resources.
  187.  *
  188.  ******************************************************************************/
  189. acpi_status
  190. acpi_terminate (void)
  191. {
  192. FUNCTION_TRACE ("Acpi_terminate");
  193. /* Terminate the AML Debugger if present */
  194. DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE);
  195. /* TBD: [Investigate] This is no longer needed?*/
  196. /*    Acpi_ut_release_mutex (ACPI_MTX_DEBUG_CMD_READY); */
  197. /* Shutdown and free all resources */
  198. acpi_ut_subsystem_shutdown ();
  199. /* Free the mutex objects */
  200. acpi_ut_mutex_terminate ();
  201. #ifdef ENABLE_DEBUGGER
  202. /* Shut down the debugger */
  203. acpi_db_terminate ();
  204. #endif
  205. /* Now we can shutdown the OS-dependent layer */
  206. acpi_os_terminate ();
  207. return_ACPI_STATUS (AE_OK);
  208. }
  209. /*****************************************************************************
  210.  *
  211.  * FUNCTION:    Acpi_subsystem_status
  212.  *
  213.  * PARAMETERS:  None
  214.  *
  215.  * RETURN:      Status of the ACPI subsystem
  216.  *
  217.  * DESCRIPTION: Other drivers that use the ACPI subsystem should call this
  218.  *              before making any other calls, to ensure the subsystem initial-
  219.  *              ized successfully.
  220.  *
  221.  ****************************************************************************/
  222. acpi_status
  223. acpi_subsystem_status (void)
  224. {
  225. if (acpi_gbl_startup_flags & ACPI_INITIALIZED_OK) {
  226. return (AE_OK);
  227. }
  228. else {
  229. return (AE_ERROR);
  230. }
  231. }
  232. /******************************************************************************
  233.  *
  234.  * FUNCTION:    Acpi_get_system_info
  235.  *
  236.  * PARAMETERS:  Out_buffer      - a pointer to a buffer to receive the
  237.  *                                resources for the device
  238.  *              Buffer_length   - the number of bytes available in the buffer
  239.  *
  240.  * RETURN:      Status          - the status of the call
  241.  *
  242.  * DESCRIPTION: This function is called to get information about the current
  243.  *              state of the ACPI subsystem.  It will return system information
  244.  *              in the Out_buffer.
  245.  *
  246.  *              If the function fails an appropriate status will be returned
  247.  *              and the value of Out_buffer is undefined.
  248.  *
  249.  ******************************************************************************/
  250. acpi_status
  251. acpi_get_system_info (
  252. acpi_buffer             *out_buffer)
  253. {
  254. acpi_system_info        *info_ptr;
  255. u32                     i;
  256. FUNCTION_TRACE ("Acpi_get_system_info");
  257. /*
  258.  *  Must have a valid buffer
  259.  */
  260. if ((!out_buffer)         ||
  261. (!out_buffer->pointer)) {
  262. return_ACPI_STATUS (AE_BAD_PARAMETER);
  263. }
  264. if (out_buffer->length < sizeof (acpi_system_info)) {
  265. /*
  266.  *  Caller's buffer is too small
  267.  */
  268. out_buffer->length = sizeof (acpi_system_info);
  269. return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
  270. }
  271. /*
  272.  *  Set return length and get data
  273.  */
  274. out_buffer->length = sizeof (acpi_system_info);
  275. info_ptr = (acpi_system_info *) out_buffer->pointer;
  276. info_ptr->acpi_ca_version   = ACPI_CA_VERSION;
  277. /* System flags (ACPI capabilities) */
  278. info_ptr->flags             = acpi_gbl_system_flags;
  279. /* Timer resolution - 24 or 32 bits  */
  280. if (!acpi_gbl_FADT) {
  281. info_ptr->timer_resolution = 0;
  282. }
  283. else if (acpi_gbl_FADT->tmr_val_ext == 0) {
  284. info_ptr->timer_resolution = 24;
  285. }
  286. else {
  287. info_ptr->timer_resolution = 32;
  288. }
  289. /* Clear the reserved fields */
  290. info_ptr->reserved1         = 0;
  291. info_ptr->reserved2         = 0;
  292. /* Current debug levels */
  293. info_ptr->debug_layer       = acpi_dbg_layer;
  294. info_ptr->debug_level       = acpi_dbg_level;
  295. /* Current status of the ACPI tables, per table type */
  296. info_ptr->num_table_types = NUM_ACPI_TABLES;
  297. for (i = 0; i < NUM_ACPI_TABLES; i++) {
  298. info_ptr->table_info[i].count = acpi_gbl_acpi_tables[i].count;
  299. }
  300. return_ACPI_STATUS (AE_OK);
  301. }