utinit.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: utinit - Common ACPI subsystem initialization
  4.  *              $Revision: 102 $
  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 "achware.h"
  26. #include "acnamesp.h"
  27. #include "acevents.h"
  28. #include "acparser.h"
  29. #include "acdispat.h"
  30. #define _COMPONENT          ACPI_UTILITIES
  31.  MODULE_NAME         ("utinit")
  32. #define ACPI_OFFSET(d,o)    ((u32) &(((d *)0)->o))
  33. #define ACPI_FADT_OFFSET(o) ACPI_OFFSET (FADT_DESCRIPTOR, o)
  34. /*******************************************************************************
  35.  *
  36.  * FUNCTION:    Acpi_ut_fadt_register_error
  37.  *
  38.  * PARAMETERS:  *Register_name          - Pointer to string identifying register
  39.  *              Value                   - Actual register contents value
  40.  *              Acpi_test_spec_section  - TDS section containing assertion
  41.  *              Acpi_assertion          - Assertion number being tested
  42.  *
  43.  * RETURN:      AE_BAD_VALUE
  44.  *
  45.  * DESCRIPTION: Display failure message and link failure to TDS assertion
  46.  *
  47.  ******************************************************************************/
  48. static acpi_status
  49. acpi_ut_fadt_register_error (
  50. NATIVE_CHAR             *register_name,
  51. u32                     value,
  52. u32                     offset)
  53. {
  54. REPORT_ERROR (
  55. ("Invalid FADT value %s=%lX at offset %lX FADT=%pn",
  56. register_name, value, offset, acpi_gbl_FADT));
  57. return (AE_BAD_VALUE);
  58. }
  59. /******************************************************************************
  60.  *
  61.  * FUNCTION:    Acpi_ut_validate_fadt
  62.  *
  63.  * PARAMETERS:  None
  64.  *
  65.  * RETURN:      Status
  66.  *
  67.  * DESCRIPTION: Validate various ACPI registers in the FADT
  68.  *
  69.  ******************************************************************************/
  70. acpi_status
  71. acpi_ut_validate_fadt (
  72. void)
  73. {
  74. acpi_status                 status = AE_OK;
  75. /*
  76.  * Verify Fixed ACPI Description Table fields,
  77.  * but don't abort on any problems, just display error
  78.  */
  79. if (acpi_gbl_FADT->pm1_evt_len < 4) {
  80. status = acpi_ut_fadt_register_error ("PM1_EVT_LEN",
  81.   (u32) acpi_gbl_FADT->pm1_evt_len,
  82.   ACPI_FADT_OFFSET (pm1_evt_len));
  83. }
  84. if (!acpi_gbl_FADT->pm1_cnt_len) {
  85. status = acpi_ut_fadt_register_error ("PM1_CNT_LEN", 0,
  86.   ACPI_FADT_OFFSET (pm1_cnt_len));
  87. }
  88. if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_evt_blk.address)) {
  89. status = acpi_ut_fadt_register_error ("X_PM1a_EVT_BLK", 0,
  90.   ACPI_FADT_OFFSET (Xpm1a_evt_blk.address));
  91. }
  92. if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_cnt_blk.address)) {
  93. status = acpi_ut_fadt_register_error ("X_PM1a_CNT_BLK", 0,
  94.   ACPI_FADT_OFFSET (Xpm1a_cnt_blk.address));
  95. }
  96. if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address)) {
  97. status = acpi_ut_fadt_register_error ("X_PM_TMR_BLK", 0,
  98.   ACPI_FADT_OFFSET (Xpm_tmr_blk.address));
  99. }
  100. if ((ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm2_cnt_blk.address) &&
  101. !acpi_gbl_FADT->pm2_cnt_len)) {
  102. status = acpi_ut_fadt_register_error ("PM2_CNT_LEN",
  103.   (u32) acpi_gbl_FADT->pm2_cnt_len,
  104.   ACPI_FADT_OFFSET (pm2_cnt_len));
  105. }
  106. if (acpi_gbl_FADT->pm_tm_len < 4) {
  107. status = acpi_ut_fadt_register_error ("PM_TM_LEN",
  108.   (u32) acpi_gbl_FADT->pm_tm_len,
  109.   ACPI_FADT_OFFSET (pm_tm_len));
  110. }
  111. /* length of GPE blocks must be a multiple of 2 */
  112. if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) &&
  113. (acpi_gbl_FADT->gpe0blk_len & 1)) {
  114. status = acpi_ut_fadt_register_error ("(x)GPE0_BLK_LEN",
  115.   (u32) acpi_gbl_FADT->gpe0blk_len,
  116.   ACPI_FADT_OFFSET (gpe0blk_len));
  117. }
  118. if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) &&
  119. (acpi_gbl_FADT->gpe1_blk_len & 1)) {
  120. status = acpi_ut_fadt_register_error ("(x)GPE1_BLK_LEN",
  121.   (u32) acpi_gbl_FADT->gpe1_blk_len,
  122.   ACPI_FADT_OFFSET (gpe1_blk_len));
  123. }
  124. return (status);
  125. }
  126. /******************************************************************************
  127.  *
  128.  * FUNCTION:    Acpi_ut_terminate
  129.  *
  130.  * PARAMETERS:  none
  131.  *
  132.  * RETURN:      none
  133.  *
  134.  * DESCRIPTION: free memory allocated for table storage.
  135.  *
  136.  ******************************************************************************/
  137. void
  138. acpi_ut_terminate (void)
  139. {
  140. FUNCTION_TRACE ("Ut_terminate");
  141. /* Free global tables, etc. */
  142. if (acpi_gbl_gpe0enable_register_save) {
  143. ACPI_MEM_FREE (acpi_gbl_gpe0enable_register_save);
  144. }
  145. if (acpi_gbl_gpe1_enable_register_save) {
  146. ACPI_MEM_FREE (acpi_gbl_gpe1_enable_register_save);
  147. }
  148. return_VOID;
  149. }
  150. /*******************************************************************************
  151.  *
  152.  * FUNCTION:    Acpi_ut_subsystem_shutdown
  153.  *
  154.  * PARAMETERS:  none
  155.  *
  156.  * RETURN:      none
  157.  *
  158.  * DESCRIPTION: Shutdown the various subsystems.  Don't delete the mutex
  159.  *              objects here -- because the AML debugger may be still running.
  160.  *
  161.  ******************************************************************************/
  162. acpi_status
  163. acpi_ut_subsystem_shutdown (void)
  164. {
  165. FUNCTION_TRACE ("Ut_subsystem_shutdown");
  166. /* Just exit if subsystem is already shutdown */
  167. if (acpi_gbl_shutdown) {
  168. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "ACPI Subsystem is already terminatedn"));
  169. return_ACPI_STATUS (AE_OK);
  170. }
  171. /* Subsystem appears active, go ahead and shut it down */
  172. acpi_gbl_shutdown = TRUE;
  173. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem...n"));
  174. /* Close the Namespace */
  175. acpi_ns_terminate ();
  176. /* Close the Acpi_event Handling */
  177. acpi_ev_terminate ();
  178. /* Close the globals */
  179. acpi_ut_terminate ();
  180. /* Flush the local cache(s) */
  181. acpi_ut_delete_generic_state_cache ();
  182. acpi_ut_delete_object_cache ();
  183. acpi_ds_delete_walk_state_cache ();
  184. /* Close the Parser */
  185. /* TBD: [Restructure] Acpi_ps_terminate () */
  186. acpi_ps_delete_parse_cache ();
  187. /* Debug only - display leftover memory allocation, if any */
  188. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  189. acpi_ut_dump_allocations (ACPI_UINT32_MAX, NULL);
  190. #endif
  191. return_ACPI_STATUS (AE_OK);
  192. }