1 /******************************************************************************
 
   3  * Module Name: tbxface - Public interfaces to the ACPI subsystem
 
   4  *                         ACPI table oriented interfaces
 
   6  *****************************************************************************/
 
   9  * Copyright (C) 2000 - 2008, Intel Corp.
 
  10  * All rights reserved.
 
  12  * Redistribution and use in source and binary forms, with or without
 
  13  * modification, are permitted provided that the following conditions
 
  15  * 1. Redistributions of source code must retain the above copyright
 
  16  *    notice, this list of conditions, and the following disclaimer,
 
  17  *    without modification.
 
  18  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 
  19  *    substantially similar to the "NO WARRANTY" disclaimer below
 
  20  *    ("Disclaimer") and any redistribution must be conditioned upon
 
  21  *    including a substantially similar Disclaimer requirement for further
 
  22  *    binary redistribution.
 
  23  * 3. Neither the names of the above-listed copyright holders nor the names
 
  24  *    of any contributors may be used to endorse or promote products derived
 
  25  *    from this software without specific prior written permission.
 
  27  * Alternatively, this software may be distributed under the terms of the
 
  28  * GNU General Public License ("GPL") version 2 as published by the Free
 
  29  * Software Foundation.
 
  32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
  33  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
  34  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 
  35  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 
  36  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
  37  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
  38  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
  39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
  40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 
  41  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
  42  * POSSIBILITY OF SUCH DAMAGES.
 
  45 #include <acpi/acpi.h>
 
  50 #define _COMPONENT          ACPI_TABLES
 
  51 ACPI_MODULE_NAME("tbxface")
 
  53 /* Local prototypes */
 
  54 static acpi_status acpi_tb_load_namespace(void);
 
  56 static int no_auto_ssdt;
 
  58 /*******************************************************************************
 
  60  * FUNCTION:    acpi_allocate_root_table
 
  62  * PARAMETERS:  initial_table_count - Size of initial_table_array, in number of
 
  63  *                                    struct acpi_table_desc structures
 
  67  * DESCRIPTION: Allocate a root table array. Used by i_aSL compiler and
 
  68  *              acpi_initialize_tables.
 
  70  ******************************************************************************/
 
  72 acpi_status acpi_allocate_root_table(u32 initial_table_count)
 
  75         acpi_gbl_root_table_list.size = initial_table_count;
 
  76         acpi_gbl_root_table_list.flags = ACPI_ROOT_ALLOW_RESIZE;
 
  78         return (acpi_tb_resize_root_table_list());
 
  81 /*******************************************************************************
 
  83  * FUNCTION:    acpi_initialize_tables
 
  85  * PARAMETERS:  initial_table_array - Pointer to an array of pre-allocated
 
  86  *                                    struct acpi_table_desc structures. If NULL, the
 
  87  *                                    array is dynamically allocated.
 
  88  *              initial_table_count - Size of initial_table_array, in number of
 
  89  *                                    struct acpi_table_desc structures
 
  90  *              allow_realloc       - Flag to tell Table Manager if resize of
 
  91  *                                    pre-allocated array is allowed. Ignored
 
  92  *                                    if initial_table_array is NULL.
 
  96  * DESCRIPTION: Initialize the table manager, get the RSDP and RSDT/XSDT.
 
  98  * NOTE:        Allows static allocation of the initial table array in order
 
  99  *              to avoid the use of dynamic memory in confined environments
 
 100  *              such as the kernel boot sequence where it may not be available.
 
 102  *              If the host OS memory managers are initialized, use NULL for
 
 103  *              initial_table_array, and the table will be dynamically allocated.
 
 105  ******************************************************************************/
 
 108 acpi_initialize_tables(struct acpi_table_desc * initial_table_array,
 
 109                        u32 initial_table_count, u8 allow_resize)
 
 111         acpi_physical_address rsdp_address;
 
 114         ACPI_FUNCTION_TRACE(acpi_initialize_tables);
 
 117          * Set up the Root Table Array
 
 118          * Allocate the table array if requested
 
 120         if (!initial_table_array) {
 
 121                 status = acpi_allocate_root_table(initial_table_count);
 
 122                 if (ACPI_FAILURE(status)) {
 
 123                         return_ACPI_STATUS(status);
 
 126                 /* Root Table Array has been statically allocated by the host */
 
 128                 ACPI_MEMSET(initial_table_array, 0,
 
 129                             (acpi_size) initial_table_count *
 
 130                             sizeof(struct acpi_table_desc));
 
 132                 acpi_gbl_root_table_list.tables = initial_table_array;
 
 133                 acpi_gbl_root_table_list.size = initial_table_count;
 
 134                 acpi_gbl_root_table_list.flags = ACPI_ROOT_ORIGIN_UNKNOWN;
 
 136                         acpi_gbl_root_table_list.flags |=
 
 137                             ACPI_ROOT_ALLOW_RESIZE;
 
 141         /* Get the address of the RSDP */
 
 143         rsdp_address = acpi_os_get_root_pointer();
 
 145                 return_ACPI_STATUS(AE_NOT_FOUND);
 
 149          * Get the root table (RSDT or XSDT) and extract all entries to the local
 
 150          * Root Table Array. This array contains the information of the RSDT/XSDT
 
 151          * in a common, more useable format.
 
 154             acpi_tb_parse_root_table(rsdp_address, ACPI_TABLE_ORIGIN_MAPPED);
 
 155         return_ACPI_STATUS(status);
 
 158 /*******************************************************************************
 
 160  * FUNCTION:    acpi_reallocate_root_table
 
 166  * DESCRIPTION: Reallocate Root Table List into dynamic memory. Copies the
 
 167  *              root list from the previously provided scratch area. Should
 
 168  *              be called once dynamic memory allocation is available in the
 
 171  ******************************************************************************/
 
 172 acpi_status acpi_reallocate_root_table(void)
 
 174         struct acpi_table_desc *tables;
 
 177         ACPI_FUNCTION_TRACE(acpi_reallocate_root_table);
 
 180          * Only reallocate the root table if the host provided a static buffer
 
 181          * for the table array in the call to acpi_initialize_tables.
 
 183         if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
 
 184                 return_ACPI_STATUS(AE_SUPPORT);
 
 187         new_size = ((acpi_size) acpi_gbl_root_table_list.count +
 
 188                     ACPI_ROOT_TABLE_SIZE_INCREMENT) *
 
 189             sizeof(struct acpi_table_desc);
 
 191         /* Create new array and copy the old array */
 
 193         tables = ACPI_ALLOCATE_ZEROED(new_size);
 
 195                 return_ACPI_STATUS(AE_NO_MEMORY);
 
 198         ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, new_size);
 
 200         acpi_gbl_root_table_list.size = acpi_gbl_root_table_list.count;
 
 201         acpi_gbl_root_table_list.tables = tables;
 
 202         acpi_gbl_root_table_list.flags =
 
 203             ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE;
 
 205         return_ACPI_STATUS(AE_OK);
 
 208 /*******************************************************************************
 
 210  * FUNCTION:    acpi_load_table
 
 212  * PARAMETERS:  table_ptr       - pointer to a buffer containing the entire
 
 217  * DESCRIPTION: This function is called to load a table from the caller's
 
 218  *              buffer. The buffer must contain an entire ACPI Table including
 
 219  *              a valid header. The header fields will be verified, and if it
 
 220  *              is determined that the table is invalid, the call will fail.
 
 222  ******************************************************************************/
 
 223 acpi_status acpi_load_table(struct acpi_table_header *table_ptr)
 
 227         struct acpi_table_desc table_desc;
 
 230                 return AE_BAD_PARAMETER;
 
 232         ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
 
 233         table_desc.pointer = table_ptr;
 
 234         table_desc.length = table_ptr->length;
 
 235         table_desc.flags = ACPI_TABLE_ORIGIN_UNKNOWN;
 
 238          * Install the new table into the local data structures
 
 240         status = acpi_tb_add_table(&table_desc, &table_index);
 
 241         if (ACPI_FAILURE(status)) {
 
 244         status = acpi_ns_load_table(table_index, acpi_gbl_root_node);
 
 248 ACPI_EXPORT_SYMBOL(acpi_load_table)
 
 250 /******************************************************************************
 
 252  * FUNCTION:    acpi_get_table_header
 
 254  * PARAMETERS:  Signature           - ACPI signature of needed table
 
 255  *              Instance            - Which instance (for SSDTs)
 
 256  *              out_table_header    - The pointer to the table header to fill
 
 258  * RETURN:      Status and pointer to mapped table header
 
 260  * DESCRIPTION: Finds an ACPI table header.
 
 262  * NOTE:        Caller is responsible in unmapping the header with
 
 263  *              acpi_os_unmap_memory
 
 265  *****************************************************************************/
 
 267 acpi_get_table_header(char *signature,
 
 268                       u32 instance, struct acpi_table_header *out_table_header)
 
 272         struct acpi_table_header *header;
 
 274         /* Parameter validation */
 
 276         if (!signature || !out_table_header) {
 
 277                 return (AE_BAD_PARAMETER);
 
 281          * Walk the root table list
 
 283         for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) {
 
 284                 if (!ACPI_COMPARE_NAME
 
 285                     (&(acpi_gbl_root_table_list.tables[i].signature),
 
 290                 if (++j < instance) {
 
 294                 if (!acpi_gbl_root_table_list.tables[i].pointer) {
 
 295                         if ((acpi_gbl_root_table_list.tables[i].
 
 296                              flags & ACPI_TABLE_ORIGIN_MASK) ==
 
 297                             ACPI_TABLE_ORIGIN_MAPPED) {
 
 299                                     acpi_os_map_memory(acpi_gbl_root_table_list.
 
 306                                 ACPI_MEMCPY(out_table_header, header,
 
 307                                             sizeof(struct acpi_table_header));
 
 308                                 acpi_os_unmap_memory(header,
 
 315                         ACPI_MEMCPY(out_table_header,
 
 316                                     acpi_gbl_root_table_list.tables[i].pointer,
 
 317                                     sizeof(struct acpi_table_header));
 
 322         return (AE_NOT_FOUND);
 
 325 ACPI_EXPORT_SYMBOL(acpi_get_table_header)
 
 327 /******************************************************************************
 
 329  * FUNCTION:    acpi_unload_table_id
 
 331  * PARAMETERS:  id            - Owner ID of the table to be removed.
 
 335  * DESCRIPTION: This routine is used to force the unload of a table (by id)
 
 337  ******************************************************************************/
 
 338 acpi_status acpi_unload_table_id(acpi_owner_id id)
 
 341         acpi_status status = AE_NOT_EXIST;
 
 343         ACPI_FUNCTION_TRACE(acpi_unload_table_id);
 
 345         /* Find table in the global table list */
 
 346         for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
 
 347                 if (id != acpi_gbl_root_table_list.tables[i].owner_id) {
 
 351                  * Delete all namespace objects owned by this table. Note that these
 
 352                  * objects can appear anywhere in the namespace by virtue of the AML
 
 353                  * "Scope" operator. Thus, we need to track ownership by an ID, not
 
 354                  * simply a position within the hierarchy
 
 356                 acpi_tb_delete_namespace_by_owner(i);
 
 357                 status = acpi_tb_release_owner_id(i);
 
 358                 acpi_tb_set_table_loaded_flag(i, FALSE);
 
 361         return_ACPI_STATUS(status);
 
 364 ACPI_EXPORT_SYMBOL(acpi_unload_table_id)
 
 366 /*******************************************************************************
 
 368  * FUNCTION:    acpi_get_table
 
 370  * PARAMETERS:  Signature           - ACPI signature of needed table
 
 371  *              Instance            - Which instance (for SSDTs)
 
 372  *              out_table           - Where the pointer to the table is returned
 
 374  * RETURN:      Status and pointer to table
 
 376  * DESCRIPTION: Finds and verifies an ACPI table.
 
 378  *****************************************************************************/
 
 380 acpi_get_table(char *signature,
 
 381                u32 instance, struct acpi_table_header **out_table)
 
 387         /* Parameter validation */
 
 389         if (!signature || !out_table) {
 
 390                 return (AE_BAD_PARAMETER);
 
 394          * Walk the root table list
 
 396         for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) {
 
 397                 if (!ACPI_COMPARE_NAME
 
 398                     (&(acpi_gbl_root_table_list.tables[i].signature),
 
 403                 if (++j < instance) {
 
 408                     acpi_tb_verify_table(&acpi_gbl_root_table_list.tables[i]);
 
 409                 if (ACPI_SUCCESS(status)) {
 
 410                         *out_table = acpi_gbl_root_table_list.tables[i].pointer;
 
 413                 if (!acpi_gbl_permanent_mmap) {
 
 414                         acpi_gbl_root_table_list.tables[i].pointer = NULL;
 
 420         return (AE_NOT_FOUND);
 
 423 ACPI_EXPORT_SYMBOL(acpi_get_table)
 
 425 /*******************************************************************************
 
 427  * FUNCTION:    acpi_get_table_by_index
 
 429  * PARAMETERS:  table_index         - Table index
 
 430  *              Table               - Where the pointer to the table is returned
 
 432  * RETURN:      Status and pointer to the table
 
 434  * DESCRIPTION: Obtain a table by an index into the global table list.
 
 436  ******************************************************************************/
 
 438 acpi_get_table_by_index(u32 table_index, struct acpi_table_header **table)
 
 442         ACPI_FUNCTION_TRACE(acpi_get_table_by_index);
 
 444         /* Parameter validation */
 
 447                 return_ACPI_STATUS(AE_BAD_PARAMETER);
 
 450         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 
 454         if (table_index >= acpi_gbl_root_table_list.count) {
 
 455                 (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 
 456                 return_ACPI_STATUS(AE_BAD_PARAMETER);
 
 459         if (!acpi_gbl_root_table_list.tables[table_index].pointer) {
 
 461                 /* Table is not mapped, map it */
 
 464                     acpi_tb_verify_table(&acpi_gbl_root_table_list.
 
 465                                          tables[table_index]);
 
 466                 if (ACPI_FAILURE(status)) {
 
 467                         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 
 468                         return_ACPI_STATUS(status);
 
 472         *table = acpi_gbl_root_table_list.tables[table_index].pointer;
 
 473         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 
 474         return_ACPI_STATUS(AE_OK);
 
 477 ACPI_EXPORT_SYMBOL(acpi_get_table_by_index)
 
 479 /*******************************************************************************
 
 481  * FUNCTION:    acpi_tb_load_namespace
 
 487  * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
 
 490  ******************************************************************************/
 
 491 static acpi_status acpi_tb_load_namespace(void)
 
 494         struct acpi_table_header *table;
 
 497         ACPI_FUNCTION_TRACE(tb_load_namespace);
 
 499         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 
 502          * Load the namespace. The DSDT is required, but any SSDT and PSDT tables
 
 505         if (!acpi_gbl_root_table_list.count ||
 
 507                                (acpi_gbl_root_table_list.
 
 508                                 tables[ACPI_TABLE_INDEX_DSDT].signature),
 
 511             ACPI_FAILURE(acpi_tb_verify_table
 
 512                          (&acpi_gbl_root_table_list.
 
 513                           tables[ACPI_TABLE_INDEX_DSDT]))) {
 
 514                 status = AE_NO_ACPI_TABLES;
 
 515                 goto unlock_and_exit;
 
 522             acpi_os_table_override(acpi_gbl_root_table_list.
 
 523                                    tables[ACPI_TABLE_INDEX_DSDT].pointer,
 
 525         if (ACPI_SUCCESS(status) && table) {
 
 527                  * DSDT table has been found
 
 529                 acpi_tb_delete_table(&acpi_gbl_root_table_list.
 
 530                                      tables[ACPI_TABLE_INDEX_DSDT]);
 
 531                 acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].pointer =
 
 533                 acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].length =
 
 535                 acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].flags =
 
 536                     ACPI_TABLE_ORIGIN_UNKNOWN;
 
 538                 ACPI_INFO((AE_INFO, "Table DSDT replaced by host OS"));
 
 539                 acpi_tb_print_table_header(0, table);
 
 541                 if (no_auto_ssdt == 0) {
 
 542                         printk(KERN_WARNING "ACPI: DSDT override uses original SSDTs unless \"acpi_no_auto_ssdt\"\n");
 
 547             acpi_tb_verify_table(&acpi_gbl_root_table_list.
 
 548                                  tables[ACPI_TABLE_INDEX_DSDT]);
 
 549         if (ACPI_FAILURE(status)) {
 
 551                 /* A valid DSDT is required */
 
 553                 status = AE_NO_ACPI_TABLES;
 
 554                 goto unlock_and_exit;
 
 557         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 
 560          * Load and parse tables.
 
 562         status = acpi_ns_load_table(ACPI_TABLE_INDEX_DSDT, acpi_gbl_root_node);
 
 563         if (ACPI_FAILURE(status)) {
 
 564                 return_ACPI_STATUS(status);
 
 568          * Load any SSDT or PSDT tables. Note: Loop leaves tables locked
 
 570         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 
 571         for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
 
 572                 if ((!ACPI_COMPARE_NAME
 
 573                      (&(acpi_gbl_root_table_list.tables[i].signature),
 
 577                                         (acpi_gbl_root_table_list.tables[i].
 
 578                                          signature), ACPI_SIG_PSDT))
 
 580                     ACPI_FAILURE(acpi_tb_verify_table
 
 581                                  (&acpi_gbl_root_table_list.tables[i]))) {
 
 586                         printk(KERN_WARNING "ACPI: SSDT ignored due to \"acpi_no_auto_ssdt\"\n");
 
 590                 /* Ignore errors while loading tables, get as many as possible */
 
 592                 (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 
 593                 (void)acpi_ns_load_table(i, acpi_gbl_root_node);
 
 594                 (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 
 597         ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
 
 600         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 
 601         return_ACPI_STATUS(status);
 
 604 /*******************************************************************************
 
 606  * FUNCTION:    acpi_load_tables
 
 612  * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
 
 614  ******************************************************************************/
 
 616 acpi_status acpi_load_tables(void)
 
 620         ACPI_FUNCTION_TRACE(acpi_load_tables);
 
 623          * Load the namespace from the tables
 
 625         status = acpi_tb_load_namespace();
 
 626         if (ACPI_FAILURE(status)) {
 
 627                 ACPI_EXCEPTION((AE_INFO, status,
 
 628                                 "While loading namespace from ACPI tables"));
 
 631         return_ACPI_STATUS(status);
 
 634 ACPI_EXPORT_SYMBOL(acpi_load_tables)
 
 637 /*******************************************************************************
 
 639  * FUNCTION:    acpi_install_table_handler
 
 641  * PARAMETERS:  Handler         - Table event handler
 
 642  *              Context         - Value passed to the handler on each event
 
 646  * DESCRIPTION: Install table event handler
 
 648  ******************************************************************************/
 
 650 acpi_install_table_handler(acpi_tbl_handler handler, void *context)
 
 654         ACPI_FUNCTION_TRACE(acpi_install_table_handler);
 
 657                 return_ACPI_STATUS(AE_BAD_PARAMETER);
 
 660         status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
 
 661         if (ACPI_FAILURE(status)) {
 
 662                 return_ACPI_STATUS(status);
 
 665         /* Don't allow more than one handler */
 
 667         if (acpi_gbl_table_handler) {
 
 668                 status = AE_ALREADY_EXISTS;
 
 672         /* Install the handler */
 
 674         acpi_gbl_table_handler = handler;
 
 675         acpi_gbl_table_handler_context = context;
 
 678         (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
 
 679         return_ACPI_STATUS(status);
 
 682 ACPI_EXPORT_SYMBOL(acpi_install_table_handler)
 
 684 /*******************************************************************************
 
 686  * FUNCTION:    acpi_remove_table_handler
 
 688  * PARAMETERS:  Handler         - Table event handler that was installed
 
 693  * DESCRIPTION: Remove table event handler
 
 695  ******************************************************************************/
 
 696 acpi_status acpi_remove_table_handler(acpi_tbl_handler handler)
 
 700         ACPI_FUNCTION_TRACE(acpi_remove_table_handler);
 
 702         status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
 
 703         if (ACPI_FAILURE(status)) {
 
 704                 return_ACPI_STATUS(status);
 
 707         /* Make sure that the installed handler is the same */
 
 709         if (!handler || handler != acpi_gbl_table_handler) {
 
 710                 status = AE_BAD_PARAMETER;
 
 714         /* Remove the handler */
 
 716         acpi_gbl_table_handler = NULL;
 
 719         (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
 
 720         return_ACPI_STATUS(status);
 
 723 ACPI_EXPORT_SYMBOL(acpi_remove_table_handler)
 
 726 static int __init acpi_no_auto_ssdt_setup(char *s) {
 
 728         printk(KERN_NOTICE "ACPI: SSDT auto-load disabled\n");
 
 735 __setup("acpi_no_auto_ssdt", acpi_no_auto_ssdt_setup);