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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: tbinstal - ACPI table installation and removal
  4.  *              $Revision: 45 $
  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 "actables.h"
  27. #define _COMPONENT          ACPI_TABLES
  28.  MODULE_NAME         ("tbinstal")
  29. /*******************************************************************************
  30.  *
  31.  * FUNCTION:    Acpi_tb_install_table
  32.  *
  33.  * PARAMETERS:  Table_ptr           - Input buffer pointer, optional
  34.  *              Table_info          - Return value from Acpi_tb_get_table
  35.  *
  36.  * RETURN:      Status
  37.  *
  38.  * DESCRIPTION: Load and validate all tables other than the RSDT.  The RSDT must
  39.  *              already be loaded and validated.
  40.  *              Install the table into the global data structs.
  41.  *
  42.  ******************************************************************************/
  43. acpi_status
  44. acpi_tb_install_table (
  45. acpi_table_header       *table_ptr,
  46. acpi_table_desc         *table_info)
  47. {
  48. acpi_status             status;
  49. FUNCTION_TRACE ("Tb_install_table");
  50. /*
  51.  * Check the table signature and make sure it is recognized
  52.  * Also checks the header checksum
  53.  */
  54. status = acpi_tb_recognize_table (table_ptr, table_info);
  55. if (ACPI_FAILURE (status)) {
  56. return_ACPI_STATUS (status);
  57. }
  58. /* Lock tables while installing */
  59. acpi_ut_acquire_mutex (ACPI_MTX_TABLES);
  60. /* Install the table into the global data structure */
  61. status = acpi_tb_init_table_descriptor (table_info->type, table_info);
  62. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s located at %pn",
  63. acpi_gbl_acpi_table_data[table_info->type].name, table_info->pointer));
  64. acpi_ut_release_mutex (ACPI_MTX_TABLES);
  65. return_ACPI_STATUS (status);
  66. }
  67. /*******************************************************************************
  68.  *
  69.  * FUNCTION:    Acpi_tb_recognize_table
  70.  *
  71.  * PARAMETERS:  Table_ptr           - Input buffer pointer, optional
  72.  *              Table_info          - Return value from Acpi_tb_get_table
  73.  *
  74.  * RETURN:      Status
  75.  *
  76.  * DESCRIPTION: Check a table signature for a match against known table types
  77.  *
  78.  * NOTE:  All table pointers are validated as follows:
  79.  *          1) Table pointer must point to valid physical memory
  80.  *          2) Signature must be 4 ASCII chars, even if we don't recognize the
  81.  *             name
  82.  *          3) Table must be readable for length specified in the header
  83.  *          4) Table checksum must be valid (with the exception of the FACS
  84.  *             which has no checksum for some odd reason)
  85.  *
  86.  ******************************************************************************/
  87. acpi_status
  88. acpi_tb_recognize_table (
  89. acpi_table_header       *table_ptr,
  90. acpi_table_desc         *table_info)
  91. {
  92. acpi_table_header       *table_header;
  93. acpi_status             status;
  94. acpi_table_type         table_type = 0;
  95. u32                     i;
  96. FUNCTION_TRACE ("Tb_recognize_table");
  97. /* Ensure that we have a valid table pointer */
  98. table_header = (acpi_table_header *) table_info->pointer;
  99. if (!table_header) {
  100. return_ACPI_STATUS (AE_BAD_PARAMETER);
  101. }
  102. /*
  103.  * Search for a signature match among the known table types
  104.  * Start at index one -> Skip the RSDP
  105.  */
  106. status = AE_SUPPORT;
  107. for (i = 1; i < NUM_ACPI_TABLES; i++) {
  108. if (!STRNCMP (table_header->signature,
  109.   acpi_gbl_acpi_table_data[i].signature,
  110.   acpi_gbl_acpi_table_data[i].sig_length)) {
  111. /*
  112.  * Found a signature match, get the pertinent info from the
  113.  * Table_data structure
  114.  */
  115. table_type      = i;
  116. status          = acpi_gbl_acpi_table_data[i].status;
  117. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Found %4.4sn",
  118. (char*)acpi_gbl_acpi_table_data[i].signature));
  119. break;
  120. }
  121. }
  122. /* Return the table type and length via the info struct */
  123. table_info->type    = (u8) table_type;
  124. table_info->length  = table_header->length;
  125. /*
  126.  * Validate checksum for _most_ tables,
  127.  * even the ones whose signature we don't recognize
  128.  */
  129. if (table_type != ACPI_TABLE_FACS) {
  130. /* But don't abort if the checksum is wrong */
  131. /* TBD: [Future] make this a configuration option? */
  132. acpi_tb_verify_table_checksum (table_header);
  133. }
  134. /*
  135.  * An AE_SUPPORT means that the table was not recognized.
  136.  * We basically ignore this;  just print a debug message
  137.  */
  138. if (status == AE_SUPPORT) {
  139. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  140. "Unsupported table %s (Type %X) was found and discardedn",
  141. acpi_gbl_acpi_table_data[table_type].name, table_type));
  142. }
  143. return_ACPI_STATUS (status);
  144. }
  145. /*******************************************************************************
  146.  *
  147.  * FUNCTION:    Acpi_tb_init_table_descriptor
  148.  *
  149.  * PARAMETERS:  Table_type          - The type of the table
  150.  *              Table_info          - A table info struct
  151.  *
  152.  * RETURN:      None.
  153.  *
  154.  * DESCRIPTION: Install a table into the global data structs.
  155.  *
  156.  ******************************************************************************/
  157. acpi_status
  158. acpi_tb_init_table_descriptor (
  159. acpi_table_type         table_type,
  160. acpi_table_desc         *table_info)
  161. {
  162. acpi_table_desc         *list_head;
  163. acpi_table_desc         *table_desc;
  164. FUNCTION_TRACE_U32 ("Tb_init_table_descriptor", table_type);
  165. /*
  166.  * Install the table into the global data structure
  167.  */
  168. list_head   = &acpi_gbl_acpi_tables[table_type];
  169. table_desc  = list_head;
  170. /*
  171.  * Two major types of tables:  1) Only one instance is allowed.  This
  172.  * includes most ACPI tables such as the DSDT.  2) Multiple instances of
  173.  * the table are allowed.  This includes SSDT and PSDTs.
  174.  */
  175. if (IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags)) {
  176. /*
  177.  * Only one table allowed, and a table has alread been installed
  178.  *  at this location, so return an error.
  179.  */
  180. if (list_head->pointer) {
  181. return_ACPI_STATUS (AE_EXIST);
  182. }
  183. table_desc->count = 1;
  184. }
  185. else {
  186. /*
  187.  * Multiple tables allowed for this table type, we must link
  188.  * the new table in to the list of tables of this type.
  189.  */
  190. if (list_head->pointer) {
  191. table_desc = ACPI_MEM_CALLOCATE (sizeof (acpi_table_desc));
  192. if (!table_desc) {
  193. return_ACPI_STATUS (AE_NO_MEMORY);
  194. }
  195. list_head->count++;
  196. /* Update the original previous */
  197. list_head->prev->next = table_desc;
  198. /* Update new entry */
  199. table_desc->prev = list_head->prev;
  200. table_desc->next = list_head;
  201. /* Update list head */
  202. list_head->prev = table_desc;
  203. }
  204. else {
  205. table_desc->count = 1;
  206. }
  207. }
  208. /* Common initialization of the table descriptor */
  209. table_desc->pointer             = table_info->pointer;
  210. table_desc->base_pointer        = table_info->base_pointer;
  211. table_desc->length              = table_info->length;
  212. table_desc->allocation          = table_info->allocation;
  213. table_desc->aml_start           = (u8 *) (table_desc->pointer + 1),
  214. table_desc->aml_length          = (u32) (table_desc->length -
  215.  (u32) sizeof (acpi_table_header));
  216. table_desc->table_id            = acpi_ut_allocate_owner_id (OWNER_TYPE_TABLE);
  217. table_desc->loaded_into_namespace = FALSE;
  218. /*
  219.  * Set the appropriate global pointer (if there is one) to point to the
  220.  * newly installed table
  221.  */
  222. if (acpi_gbl_acpi_table_data[table_type].global_ptr) {
  223. *(acpi_gbl_acpi_table_data[table_type].global_ptr) = table_info->pointer;
  224. }
  225. /* Return Data */
  226. table_info->table_id        = table_desc->table_id;
  227. table_info->installed_desc  = table_desc;
  228. return_ACPI_STATUS (AE_OK);
  229. }
  230. /*******************************************************************************
  231.  *
  232.  * FUNCTION:    Acpi_tb_delete_acpi_tables
  233.  *
  234.  * PARAMETERS:  None.
  235.  *
  236.  * RETURN:      None.
  237.  *
  238.  * DESCRIPTION: Delete all internal ACPI tables
  239.  *
  240.  ******************************************************************************/
  241. void
  242. acpi_tb_delete_acpi_tables (void)
  243. {
  244. acpi_table_type             type;
  245. /*
  246.  * Free memory allocated for ACPI tables
  247.  * Memory can either be mapped or allocated
  248.  */
  249. for (type = 0; type < NUM_ACPI_TABLES; type++) {
  250. acpi_tb_delete_acpi_table (type);
  251. }
  252. }
  253. /*******************************************************************************
  254.  *
  255.  * FUNCTION:    Acpi_tb_delete_acpi_table
  256.  *
  257.  * PARAMETERS:  Type                - The table type to be deleted
  258.  *
  259.  * RETURN:      None.
  260.  *
  261.  * DESCRIPTION: Delete an internal ACPI table
  262.  *              Locks the ACPI table mutex
  263.  *
  264.  ******************************************************************************/
  265. void
  266. acpi_tb_delete_acpi_table (
  267. acpi_table_type             type)
  268. {
  269. FUNCTION_TRACE_U32 ("Tb_delete_acpi_table", type);
  270. if (type > ACPI_TABLE_MAX) {
  271. return_VOID;
  272. }
  273. acpi_ut_acquire_mutex (ACPI_MTX_TABLES);
  274. /* Free the table */
  275. acpi_tb_free_acpi_tables_of_type (&acpi_gbl_acpi_tables[type]);
  276. /* Clear the appropriate "typed" global table pointer */
  277. switch (type) {
  278. case ACPI_TABLE_RSDP:
  279. acpi_gbl_RSDP = NULL;
  280. break;
  281. case ACPI_TABLE_DSDT:
  282. acpi_gbl_DSDT = NULL;
  283. break;
  284. case ACPI_TABLE_FADT:
  285. acpi_gbl_FADT = NULL;
  286. break;
  287. case ACPI_TABLE_FACS:
  288. acpi_gbl_FACS = NULL;
  289. break;
  290. case ACPI_TABLE_XSDT:
  291. acpi_gbl_XSDT = NULL;
  292. break;
  293. case ACPI_TABLE_SSDT:
  294. case ACPI_TABLE_PSDT:
  295. default:
  296. break;
  297. }
  298. acpi_ut_release_mutex (ACPI_MTX_TABLES);
  299. return_VOID;
  300. }
  301. /*******************************************************************************
  302.  *
  303.  * FUNCTION:    Acpi_tb_free_acpi_tables_of_type
  304.  *
  305.  * PARAMETERS:  Table_info          - A table info struct
  306.  *
  307.  * RETURN:      None.
  308.  *
  309.  * DESCRIPTION: Free the memory associated with an internal ACPI table
  310.  *              Table mutex should be locked.
  311.  *
  312.  ******************************************************************************/
  313. void
  314. acpi_tb_free_acpi_tables_of_type (
  315. acpi_table_desc         *list_head)
  316. {
  317. acpi_table_desc         *table_desc;
  318. u32                     count;
  319. u32                     i;
  320. FUNCTION_TRACE_PTR ("Tb_free_acpi_tables_of_type", list_head);
  321. /* Get the head of the list */
  322. table_desc  = list_head;
  323. count       = list_head->count;
  324. /*
  325.  * Walk the entire list, deleting both the allocated tables
  326.  * and the table descriptors
  327.  */
  328. for (i = 0; i < count; i++) {
  329. table_desc = acpi_tb_uninstall_table (table_desc);
  330. }
  331. return_VOID;
  332. }
  333. /*******************************************************************************
  334.  *
  335.  * FUNCTION:    Acpi_tb_delete_single_table
  336.  *
  337.  * PARAMETERS:  Table_info          - A table info struct
  338.  *
  339.  * RETURN:      None.
  340.  *
  341.  * DESCRIPTION: Low-level free for a single ACPI table.  Handles cases where
  342.  *              the table was allocated a buffer or was mapped.
  343.  *
  344.  ******************************************************************************/
  345. void
  346. acpi_tb_delete_single_table (
  347. acpi_table_desc         *table_desc)
  348. {
  349. if (!table_desc) {
  350. return;
  351. }
  352. if (table_desc->pointer) {
  353. /* Valid table, determine type of memory allocation */
  354. switch (table_desc->allocation) {
  355. case ACPI_MEM_NOT_ALLOCATED:
  356. break;
  357. case ACPI_MEM_ALLOCATED:
  358. ACPI_MEM_FREE (table_desc->base_pointer);
  359. break;
  360. case ACPI_MEM_MAPPED:
  361. acpi_os_unmap_memory (table_desc->base_pointer, table_desc->length);
  362. break;
  363. }
  364. }
  365. }
  366. /*******************************************************************************
  367.  *
  368.  * FUNCTION:    Acpi_tb_uninstall_table
  369.  *
  370.  * PARAMETERS:  Table_info          - A table info struct
  371.  *
  372.  * RETURN:      None.
  373.  *
  374.  * DESCRIPTION: Free the memory associated with an internal ACPI table that
  375.  *              is either installed or has never been installed.
  376.  *              Table mutex should be locked.
  377.  *
  378.  ******************************************************************************/
  379. acpi_table_desc *
  380. acpi_tb_uninstall_table (
  381. acpi_table_desc         *table_desc)
  382. {
  383. acpi_table_desc         *next_desc;
  384. FUNCTION_TRACE_PTR ("Tb_delete_single_table", table_desc);
  385. if (!table_desc) {
  386. return_PTR (NULL);
  387. }
  388. /* Unlink the descriptor */
  389. if (table_desc->prev) {
  390. table_desc->prev->next = table_desc->next;
  391. }
  392. if (table_desc->next) {
  393. table_desc->next->prev = table_desc->prev;
  394. }
  395. /* Free the memory allocated for the table itself */
  396. acpi_tb_delete_single_table (table_desc);
  397. /* Free the table descriptor (Don't delete the list head, tho) */
  398. if ((table_desc->prev) == (table_desc->next)) {
  399. next_desc = NULL;
  400. /* Clear the list head */
  401. table_desc->pointer  = NULL;
  402. table_desc->length   = 0;
  403. table_desc->count    = 0;
  404. }
  405. else {
  406. /* Free the table descriptor */
  407. next_desc = table_desc->next;
  408. ACPI_MEM_FREE (table_desc);
  409. }
  410. return_PTR (next_desc);
  411. }