linux/drivers/acpi/acpica/tbdata.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Module Name: tbdata - Table manager data structure functions
   4 *
   5 *****************************************************************************/
   6
   7/*
   8 * Copyright (C) 2000 - 2017, Intel Corp.
   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 <acpi/acpi.h>
  45#include "accommon.h"
  46#include "acnamesp.h"
  47#include "actables.h"
  48#include "acevents.h"
  49
  50#define _COMPONENT          ACPI_TABLES
  51ACPI_MODULE_NAME("tbdata")
  52
  53/* Local prototypes */
  54static acpi_status
  55acpi_tb_check_duplication(struct acpi_table_desc *table_desc, u32 *table_index);
  56
  57static u8
  58acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index);
  59
  60/*******************************************************************************
  61 *
  62 * FUNCTION:    acpi_tb_compare_tables
  63 *
  64 * PARAMETERS:  table_desc          - Table 1 descriptor to be compared
  65 *              table_index         - Index of table 2 to be compared
  66 *
  67 * RETURN:      TRUE if both tables are identical.
  68 *
  69 * DESCRIPTION: This function compares a table with another table that has
  70 *              already been installed in the root table list.
  71 *
  72 ******************************************************************************/
  73
  74static u8
  75acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index)
  76{
  77        acpi_status status = AE_OK;
  78        u8 is_identical;
  79        struct acpi_table_header *table;
  80        u32 table_length;
  81        u8 table_flags;
  82
  83        status =
  84            acpi_tb_acquire_table(&acpi_gbl_root_table_list.tables[table_index],
  85                                  &table, &table_length, &table_flags);
  86        if (ACPI_FAILURE(status)) {
  87                return (FALSE);
  88        }
  89
  90        /*
  91         * Check for a table match on the entire table length,
  92         * not just the header.
  93         */
  94        is_identical = (u8)((table_desc->length != table_length ||
  95                             memcmp(table_desc->pointer, table, table_length)) ?
  96                            FALSE : TRUE);
  97
  98        /* Release the acquired table */
  99
 100        acpi_tb_release_table(table, table_length, table_flags);
 101        return (is_identical);
 102}
 103
 104/*******************************************************************************
 105 *
 106 * FUNCTION:    acpi_tb_init_table_descriptor
 107 *
 108 * PARAMETERS:  table_desc              - Table descriptor
 109 *              address                 - Physical address of the table
 110 *              flags                   - Allocation flags of the table
 111 *              table                   - Pointer to the table
 112 *
 113 * RETURN:      None
 114 *
 115 * DESCRIPTION: Initialize a new table descriptor
 116 *
 117 ******************************************************************************/
 118
 119void
 120acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc,
 121                              acpi_physical_address address,
 122                              u8 flags, struct acpi_table_header *table)
 123{
 124
 125        /*
 126         * Initialize the table descriptor. Set the pointer to NULL, since the
 127         * table is not fully mapped at this time.
 128         */
 129        memset(table_desc, 0, sizeof(struct acpi_table_desc));
 130        table_desc->address = address;
 131        table_desc->length = table->length;
 132        table_desc->flags = flags;
 133        ACPI_MOVE_32_TO_32(table_desc->signature.ascii, table->signature);
 134}
 135
 136/*******************************************************************************
 137 *
 138 * FUNCTION:    acpi_tb_acquire_table
 139 *
 140 * PARAMETERS:  table_desc          - Table descriptor
 141 *              table_ptr           - Where table is returned
 142 *              table_length        - Where table length is returned
 143 *              table_flags         - Where table allocation flags are returned
 144 *
 145 * RETURN:      Status
 146 *
 147 * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
 148 *              maintained in the acpi_gbl_root_table_list.
 149 *
 150 ******************************************************************************/
 151
 152acpi_status
 153acpi_tb_acquire_table(struct acpi_table_desc *table_desc,
 154                      struct acpi_table_header **table_ptr,
 155                      u32 *table_length, u8 *table_flags)
 156{
 157        struct acpi_table_header *table = NULL;
 158
 159        switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
 160        case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
 161
 162                table =
 163                    acpi_os_map_memory(table_desc->address, table_desc->length);
 164                break;
 165
 166        case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
 167        case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
 168
 169                table = ACPI_CAST_PTR(struct acpi_table_header,
 170                                      ACPI_PHYSADDR_TO_PTR(table_desc->
 171                                                           address));
 172                break;
 173
 174        default:
 175
 176                break;
 177        }
 178
 179        /* Table is not valid yet */
 180
 181        if (!table) {
 182                return (AE_NO_MEMORY);
 183        }
 184
 185        /* Fill the return values */
 186
 187        *table_ptr = table;
 188        *table_length = table_desc->length;
 189        *table_flags = table_desc->flags;
 190        return (AE_OK);
 191}
 192
 193/*******************************************************************************
 194 *
 195 * FUNCTION:    acpi_tb_release_table
 196 *
 197 * PARAMETERS:  table               - Pointer for the table
 198 *              table_length        - Length for the table
 199 *              table_flags         - Allocation flags for the table
 200 *
 201 * RETURN:      None
 202 *
 203 * DESCRIPTION: Release a table. The inverse of acpi_tb_acquire_table().
 204 *
 205 ******************************************************************************/
 206
 207void
 208acpi_tb_release_table(struct acpi_table_header *table,
 209                      u32 table_length, u8 table_flags)
 210{
 211
 212        switch (table_flags & ACPI_TABLE_ORIGIN_MASK) {
 213        case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
 214
 215                acpi_os_unmap_memory(table, table_length);
 216                break;
 217
 218        case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
 219        case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
 220        default:
 221
 222                break;
 223        }
 224}
 225
 226/*******************************************************************************
 227 *
 228 * FUNCTION:    acpi_tb_acquire_temp_table
 229 *
 230 * PARAMETERS:  table_desc          - Table descriptor to be acquired
 231 *              address             - Address of the table
 232 *              flags               - Allocation flags of the table
 233 *
 234 * RETURN:      Status
 235 *
 236 * DESCRIPTION: This function validates the table header to obtain the length
 237 *              of a table and fills the table descriptor to make its state as
 238 *              "INSTALLED". Such a table descriptor is only used for verified
 239 *              installation.
 240 *
 241 ******************************************************************************/
 242
 243acpi_status
 244acpi_tb_acquire_temp_table(struct acpi_table_desc *table_desc,
 245                           acpi_physical_address address, u8 flags)
 246{
 247        struct acpi_table_header *table_header;
 248
 249        switch (flags & ACPI_TABLE_ORIGIN_MASK) {
 250        case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
 251
 252                /* Get the length of the full table from the header */
 253
 254                table_header =
 255                    acpi_os_map_memory(address,
 256                                       sizeof(struct acpi_table_header));
 257                if (!table_header) {
 258                        return (AE_NO_MEMORY);
 259                }
 260
 261                acpi_tb_init_table_descriptor(table_desc, address, flags,
 262                                              table_header);
 263                acpi_os_unmap_memory(table_header,
 264                                     sizeof(struct acpi_table_header));
 265                return (AE_OK);
 266
 267        case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
 268        case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
 269
 270                table_header = ACPI_CAST_PTR(struct acpi_table_header,
 271                                             ACPI_PHYSADDR_TO_PTR(address));
 272                if (!table_header) {
 273                        return (AE_NO_MEMORY);
 274                }
 275
 276                acpi_tb_init_table_descriptor(table_desc, address, flags,
 277                                              table_header);
 278                return (AE_OK);
 279
 280        default:
 281
 282                break;
 283        }
 284
 285        /* Table is not valid yet */
 286
 287        return (AE_NO_MEMORY);
 288}
 289
 290/*******************************************************************************
 291 *
 292 * FUNCTION:    acpi_tb_release_temp_table
 293 *
 294 * PARAMETERS:  table_desc          - Table descriptor to be released
 295 *
 296 * RETURN:      Status
 297 *
 298 * DESCRIPTION: The inverse of acpi_tb_acquire_temp_table().
 299 *
 300 *****************************************************************************/
 301
 302void acpi_tb_release_temp_table(struct acpi_table_desc *table_desc)
 303{
 304
 305        /*
 306         * Note that the .Address is maintained by the callers of
 307         * acpi_tb_acquire_temp_table(), thus do not invoke acpi_tb_uninstall_table()
 308         * where .Address will be freed.
 309         */
 310        acpi_tb_invalidate_table(table_desc);
 311}
 312
 313/******************************************************************************
 314 *
 315 * FUNCTION:    acpi_tb_validate_table
 316 *
 317 * PARAMETERS:  table_desc          - Table descriptor
 318 *
 319 * RETURN:      Status
 320 *
 321 * DESCRIPTION: This function is called to validate the table, the returned
 322 *              table descriptor is in "VALIDATED" state.
 323 *
 324 *****************************************************************************/
 325
 326acpi_status acpi_tb_validate_table(struct acpi_table_desc *table_desc)
 327{
 328        acpi_status status = AE_OK;
 329
 330        ACPI_FUNCTION_TRACE(tb_validate_table);
 331
 332        /* Validate the table if necessary */
 333
 334        if (!table_desc->pointer) {
 335                status = acpi_tb_acquire_table(table_desc, &table_desc->pointer,
 336                                               &table_desc->length,
 337                                               &table_desc->flags);
 338                if (!table_desc->pointer) {
 339                        status = AE_NO_MEMORY;
 340                }
 341        }
 342
 343        return_ACPI_STATUS(status);
 344}
 345
 346/*******************************************************************************
 347 *
 348 * FUNCTION:    acpi_tb_invalidate_table
 349 *
 350 * PARAMETERS:  table_desc          - Table descriptor
 351 *
 352 * RETURN:      None
 353 *
 354 * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
 355 *              acpi_tb_validate_table().
 356 *
 357 ******************************************************************************/
 358
 359void acpi_tb_invalidate_table(struct acpi_table_desc *table_desc)
 360{
 361
 362        ACPI_FUNCTION_TRACE(tb_invalidate_table);
 363
 364        /* Table must be validated */
 365
 366        if (!table_desc->pointer) {
 367                return_VOID;
 368        }
 369
 370        acpi_tb_release_table(table_desc->pointer, table_desc->length,
 371                              table_desc->flags);
 372        table_desc->pointer = NULL;
 373
 374        return_VOID;
 375}
 376
 377/******************************************************************************
 378 *
 379 * FUNCTION:    acpi_tb_validate_temp_table
 380 *
 381 * PARAMETERS:  table_desc          - Table descriptor
 382 *
 383 * RETURN:      Status
 384 *
 385 * DESCRIPTION: This function is called to validate the table, the returned
 386 *              table descriptor is in "VALIDATED" state.
 387 *
 388 *****************************************************************************/
 389
 390acpi_status acpi_tb_validate_temp_table(struct acpi_table_desc *table_desc)
 391{
 392
 393        if (!table_desc->pointer && !acpi_gbl_enable_table_validation) {
 394                /*
 395                 * Only validates the header of the table.
 396                 * Note that Length contains the size of the mapping after invoking
 397                 * this work around, this value is required by
 398                 * acpi_tb_release_temp_table().
 399                 * We can do this because in acpi_init_table_descriptor(), the Length
 400                 * field of the installed descriptor is filled with the actual
 401                 * table length obtaining from the table header.
 402                 */
 403                table_desc->length = sizeof(struct acpi_table_header);
 404        }
 405
 406        return (acpi_tb_validate_table(table_desc));
 407}
 408
 409/*******************************************************************************
 410 *
 411 * FUNCTION:    acpi_tb_check_duplication
 412 *
 413 * PARAMETERS:  table_desc          - Table descriptor
 414 *              table_index         - Where the table index is returned
 415 *
 416 * RETURN:      Status
 417 *
 418 * DESCRIPTION: Avoid installing duplicated tables. However table override and
 419 *              user aided dynamic table load is allowed, thus comparing the
 420 *              address of the table is not sufficient, and checking the entire
 421 *              table content is required.
 422 *
 423 ******************************************************************************/
 424
 425static acpi_status
 426acpi_tb_check_duplication(struct acpi_table_desc *table_desc, u32 *table_index)
 427{
 428        u32 i;
 429
 430        ACPI_FUNCTION_TRACE(tb_check_duplication);
 431
 432        /* Check if table is already registered */
 433
 434        for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
 435
 436                /* Do not compare with unverified tables */
 437
 438                if (!
 439                    (acpi_gbl_root_table_list.tables[i].
 440                     flags & ACPI_TABLE_IS_VERIFIED)) {
 441                        continue;
 442                }
 443
 444                /*
 445                 * Check for a table match on the entire table length,
 446                 * not just the header.
 447                 */
 448                if (!acpi_tb_compare_tables(table_desc, i)) {
 449                        continue;
 450                }
 451
 452                /*
 453                 * Note: the current mechanism does not unregister a table if it is
 454                 * dynamically unloaded. The related namespace entries are deleted,
 455                 * but the table remains in the root table list.
 456                 *
 457                 * The assumption here is that the number of different tables that
 458                 * will be loaded is actually small, and there is minimal overhead
 459                 * in just keeping the table in case it is needed again.
 460                 *
 461                 * If this assumption changes in the future (perhaps on large
 462                 * machines with many table load/unload operations), tables will
 463                 * need to be unregistered when they are unloaded, and slots in the
 464                 * root table list should be reused when empty.
 465                 */
 466                if (acpi_gbl_root_table_list.tables[i].flags &
 467                    ACPI_TABLE_IS_LOADED) {
 468
 469                        /* Table is still loaded, this is an error */
 470
 471                        return_ACPI_STATUS(AE_ALREADY_EXISTS);
 472                } else {
 473                        *table_index = i;
 474                        return_ACPI_STATUS(AE_CTRL_TERMINATE);
 475                }
 476        }
 477
 478        /* Indicate no duplication to the caller */
 479
 480        return_ACPI_STATUS(AE_OK);
 481}
 482
 483/******************************************************************************
 484 *
 485 * FUNCTION:    acpi_tb_verify_temp_table
 486 *
 487 * PARAMETERS:  table_desc          - Table descriptor
 488 *              signature           - Table signature to verify
 489 *              table_index         - Where the table index is returned
 490 *
 491 * RETURN:      Status
 492 *
 493 * DESCRIPTION: This function is called to validate and verify the table, the
 494 *              returned table descriptor is in "VALIDATED" state.
 495 *              Note that 'TableIndex' is required to be set to !NULL to
 496 *              enable duplication check.
 497 *
 498 *****************************************************************************/
 499
 500acpi_status
 501acpi_tb_verify_temp_table(struct acpi_table_desc *table_desc,
 502                          char *signature, u32 *table_index)
 503{
 504        acpi_status status = AE_OK;
 505
 506        ACPI_FUNCTION_TRACE(tb_verify_temp_table);
 507
 508        /* Validate the table */
 509
 510        status = acpi_tb_validate_temp_table(table_desc);
 511        if (ACPI_FAILURE(status)) {
 512                return_ACPI_STATUS(AE_NO_MEMORY);
 513        }
 514
 515        /* If a particular signature is expected (DSDT/FACS), it must match */
 516
 517        if (signature && !ACPI_COMPARE_NAME(&table_desc->signature, signature)) {
 518                ACPI_BIOS_ERROR((AE_INFO,
 519                                 "Invalid signature 0x%X for ACPI table, expected [%s]",
 520                                 table_desc->signature.integer, signature));
 521                status = AE_BAD_SIGNATURE;
 522                goto invalidate_and_exit;
 523        }
 524
 525        if (acpi_gbl_enable_table_validation) {
 526
 527                /* Verify the checksum */
 528
 529                status =
 530                    acpi_tb_verify_checksum(table_desc->pointer,
 531                                            table_desc->length);
 532                if (ACPI_FAILURE(status)) {
 533                        ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
 534                                        "%4.4s 0x%8.8X%8.8X"
 535                                        " Attempted table install failed",
 536                                        acpi_ut_valid_nameseg(table_desc->
 537                                                              signature.
 538                                                              ascii) ?
 539                                        table_desc->signature.ascii : "????",
 540                                        ACPI_FORMAT_UINT64(table_desc->
 541                                                           address)));
 542
 543                        goto invalidate_and_exit;
 544                }
 545
 546                /* Avoid duplications */
 547
 548                if (table_index) {
 549                        status =
 550                            acpi_tb_check_duplication(table_desc, table_index);
 551                        if (ACPI_FAILURE(status)) {
 552                                if (status != AE_CTRL_TERMINATE) {
 553                                        ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
 554                                                        "%4.4s 0x%8.8X%8.8X"
 555                                                        " Table is duplicated",
 556                                                        acpi_ut_valid_nameseg
 557                                                        (table_desc->signature.
 558                                                         ascii) ? table_desc->
 559                                                        signature.
 560                                                        ascii : "????",
 561                                                        ACPI_FORMAT_UINT64
 562                                                        (table_desc->address)));
 563                                }
 564
 565                                goto invalidate_and_exit;
 566                        }
 567                }
 568
 569                table_desc->flags |= ACPI_TABLE_IS_VERIFIED;
 570        }
 571
 572        return_ACPI_STATUS(status);
 573
 574invalidate_and_exit:
 575        acpi_tb_invalidate_table(table_desc);
 576        return_ACPI_STATUS(status);
 577}
 578
 579/*******************************************************************************
 580 *
 581 * FUNCTION:    acpi_tb_resize_root_table_list
 582 *
 583 * PARAMETERS:  None
 584 *
 585 * RETURN:      Status
 586 *
 587 * DESCRIPTION: Expand the size of global table array
 588 *
 589 ******************************************************************************/
 590
 591acpi_status acpi_tb_resize_root_table_list(void)
 592{
 593        struct acpi_table_desc *tables;
 594        u32 table_count;
 595        u32 current_table_count, max_table_count;
 596        u32 i;
 597
 598        ACPI_FUNCTION_TRACE(tb_resize_root_table_list);
 599
 600        /* allow_resize flag is a parameter to acpi_initialize_tables */
 601
 602        if (!(acpi_gbl_root_table_list.flags & ACPI_ROOT_ALLOW_RESIZE)) {
 603                ACPI_ERROR((AE_INFO,
 604                            "Resize of Root Table Array is not allowed"));
 605                return_ACPI_STATUS(AE_SUPPORT);
 606        }
 607
 608        /* Increase the Table Array size */
 609
 610        if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
 611                table_count = acpi_gbl_root_table_list.max_table_count;
 612        } else {
 613                table_count = acpi_gbl_root_table_list.current_table_count;
 614        }
 615
 616        max_table_count = table_count + ACPI_ROOT_TABLE_SIZE_INCREMENT;
 617        tables = ACPI_ALLOCATE_ZEROED(((acpi_size)max_table_count) *
 618                                      sizeof(struct acpi_table_desc));
 619        if (!tables) {
 620                ACPI_ERROR((AE_INFO,
 621                            "Could not allocate new root table array"));
 622                return_ACPI_STATUS(AE_NO_MEMORY);
 623        }
 624
 625        /* Copy and free the previous table array */
 626
 627        current_table_count = 0;
 628        if (acpi_gbl_root_table_list.tables) {
 629                for (i = 0; i < table_count; i++) {
 630                        if (acpi_gbl_root_table_list.tables[i].address) {
 631                                memcpy(tables + current_table_count,
 632                                       acpi_gbl_root_table_list.tables + i,
 633                                       sizeof(struct acpi_table_desc));
 634                                current_table_count++;
 635                        }
 636                }
 637
 638                if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
 639                        ACPI_FREE(acpi_gbl_root_table_list.tables);
 640                }
 641        }
 642
 643        acpi_gbl_root_table_list.tables = tables;
 644        acpi_gbl_root_table_list.max_table_count = max_table_count;
 645        acpi_gbl_root_table_list.current_table_count = current_table_count;
 646        acpi_gbl_root_table_list.flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
 647
 648        return_ACPI_STATUS(AE_OK);
 649}
 650
 651/*******************************************************************************
 652 *
 653 * FUNCTION:    acpi_tb_get_next_table_descriptor
 654 *
 655 * PARAMETERS:  table_index         - Where table index is returned
 656 *              table_desc          - Where table descriptor is returned
 657 *
 658 * RETURN:      Status and table index/descriptor.
 659 *
 660 * DESCRIPTION: Allocate a new ACPI table entry to the global table list
 661 *
 662 ******************************************************************************/
 663
 664acpi_status
 665acpi_tb_get_next_table_descriptor(u32 *table_index,
 666                                  struct acpi_table_desc **table_desc)
 667{
 668        acpi_status status;
 669        u32 i;
 670
 671        /* Ensure that there is room for the table in the Root Table List */
 672
 673        if (acpi_gbl_root_table_list.current_table_count >=
 674            acpi_gbl_root_table_list.max_table_count) {
 675                status = acpi_tb_resize_root_table_list();
 676                if (ACPI_FAILURE(status)) {
 677                        return (status);
 678                }
 679        }
 680
 681        i = acpi_gbl_root_table_list.current_table_count;
 682        acpi_gbl_root_table_list.current_table_count++;
 683
 684        if (table_index) {
 685                *table_index = i;
 686        }
 687        if (table_desc) {
 688                *table_desc = &acpi_gbl_root_table_list.tables[i];
 689        }
 690
 691        return (AE_OK);
 692}
 693
 694/*******************************************************************************
 695 *
 696 * FUNCTION:    acpi_tb_terminate
 697 *
 698 * PARAMETERS:  None
 699 *
 700 * RETURN:      None
 701 *
 702 * DESCRIPTION: Delete all internal ACPI tables
 703 *
 704 ******************************************************************************/
 705
 706void acpi_tb_terminate(void)
 707{
 708        u32 i;
 709
 710        ACPI_FUNCTION_TRACE(tb_terminate);
 711
 712        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 713
 714        /* Delete the individual tables */
 715
 716        for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) {
 717                acpi_tb_uninstall_table(&acpi_gbl_root_table_list.tables[i]);
 718        }
 719
 720        /*
 721         * Delete the root table array if allocated locally. Array cannot be
 722         * mapped, so we don't need to check for that flag.
 723         */
 724        if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
 725                ACPI_FREE(acpi_gbl_root_table_list.tables);
 726        }
 727
 728        acpi_gbl_root_table_list.tables = NULL;
 729        acpi_gbl_root_table_list.flags = 0;
 730        acpi_gbl_root_table_list.current_table_count = 0;
 731
 732        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI Tables freed\n"));
 733
 734        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 735        return_VOID;
 736}
 737
 738/*******************************************************************************
 739 *
 740 * FUNCTION:    acpi_tb_delete_namespace_by_owner
 741 *
 742 * PARAMETERS:  table_index         - Table index
 743 *
 744 * RETURN:      Status
 745 *
 746 * DESCRIPTION: Delete all namespace objects created when this table was loaded.
 747 *
 748 ******************************************************************************/
 749
 750acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index)
 751{
 752        acpi_owner_id owner_id;
 753        acpi_status status;
 754
 755        ACPI_FUNCTION_TRACE(tb_delete_namespace_by_owner);
 756
 757        status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 758        if (ACPI_FAILURE(status)) {
 759                return_ACPI_STATUS(status);
 760        }
 761
 762        if (table_index >= acpi_gbl_root_table_list.current_table_count) {
 763
 764                /* The table index does not exist */
 765
 766                (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 767                return_ACPI_STATUS(AE_NOT_EXIST);
 768        }
 769
 770        /* Get the owner ID for this table, used to delete namespace nodes */
 771
 772        owner_id = acpi_gbl_root_table_list.tables[table_index].owner_id;
 773        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 774
 775        /*
 776         * Need to acquire the namespace writer lock to prevent interference
 777         * with any concurrent namespace walks. The interpreter must be
 778         * released during the deletion since the acquisition of the deletion
 779         * lock may block, and also since the execution of a namespace walk
 780         * must be allowed to use the interpreter.
 781         */
 782        status = acpi_ut_acquire_write_lock(&acpi_gbl_namespace_rw_lock);
 783        if (ACPI_FAILURE(status)) {
 784                return_ACPI_STATUS(status);
 785        }
 786        acpi_ns_delete_namespace_by_owner(owner_id);
 787        acpi_ut_release_write_lock(&acpi_gbl_namespace_rw_lock);
 788        return_ACPI_STATUS(status);
 789}
 790
 791/*******************************************************************************
 792 *
 793 * FUNCTION:    acpi_tb_allocate_owner_id
 794 *
 795 * PARAMETERS:  table_index         - Table index
 796 *
 797 * RETURN:      Status
 798 *
 799 * DESCRIPTION: Allocates owner_id in table_desc
 800 *
 801 ******************************************************************************/
 802
 803acpi_status acpi_tb_allocate_owner_id(u32 table_index)
 804{
 805        acpi_status status = AE_BAD_PARAMETER;
 806
 807        ACPI_FUNCTION_TRACE(tb_allocate_owner_id);
 808
 809        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 810        if (table_index < acpi_gbl_root_table_list.current_table_count) {
 811                status =
 812                    acpi_ut_allocate_owner_id(&
 813                                              (acpi_gbl_root_table_list.
 814                                               tables[table_index].owner_id));
 815        }
 816
 817        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 818        return_ACPI_STATUS(status);
 819}
 820
 821/*******************************************************************************
 822 *
 823 * FUNCTION:    acpi_tb_release_owner_id
 824 *
 825 * PARAMETERS:  table_index         - Table index
 826 *
 827 * RETURN:      Status
 828 *
 829 * DESCRIPTION: Releases owner_id in table_desc
 830 *
 831 ******************************************************************************/
 832
 833acpi_status acpi_tb_release_owner_id(u32 table_index)
 834{
 835        acpi_status status = AE_BAD_PARAMETER;
 836
 837        ACPI_FUNCTION_TRACE(tb_release_owner_id);
 838
 839        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 840        if (table_index < acpi_gbl_root_table_list.current_table_count) {
 841                acpi_ut_release_owner_id(&
 842                                         (acpi_gbl_root_table_list.
 843                                          tables[table_index].owner_id));
 844                status = AE_OK;
 845        }
 846
 847        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 848        return_ACPI_STATUS(status);
 849}
 850
 851/*******************************************************************************
 852 *
 853 * FUNCTION:    acpi_tb_get_owner_id
 854 *
 855 * PARAMETERS:  table_index         - Table index
 856 *              owner_id            - Where the table owner_id is returned
 857 *
 858 * RETURN:      Status
 859 *
 860 * DESCRIPTION: returns owner_id for the ACPI table
 861 *
 862 ******************************************************************************/
 863
 864acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id)
 865{
 866        acpi_status status = AE_BAD_PARAMETER;
 867
 868        ACPI_FUNCTION_TRACE(tb_get_owner_id);
 869
 870        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 871        if (table_index < acpi_gbl_root_table_list.current_table_count) {
 872                *owner_id =
 873                    acpi_gbl_root_table_list.tables[table_index].owner_id;
 874                status = AE_OK;
 875        }
 876
 877        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 878        return_ACPI_STATUS(status);
 879}
 880
 881/*******************************************************************************
 882 *
 883 * FUNCTION:    acpi_tb_is_table_loaded
 884 *
 885 * PARAMETERS:  table_index         - Index into the root table
 886 *
 887 * RETURN:      Table Loaded Flag
 888 *
 889 ******************************************************************************/
 890
 891u8 acpi_tb_is_table_loaded(u32 table_index)
 892{
 893        u8 is_loaded = FALSE;
 894
 895        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 896        if (table_index < acpi_gbl_root_table_list.current_table_count) {
 897                is_loaded = (u8)
 898                    (acpi_gbl_root_table_list.tables[table_index].flags &
 899                     ACPI_TABLE_IS_LOADED);
 900        }
 901
 902        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 903        return (is_loaded);
 904}
 905
 906/*******************************************************************************
 907 *
 908 * FUNCTION:    acpi_tb_set_table_loaded_flag
 909 *
 910 * PARAMETERS:  table_index         - Table index
 911 *              is_loaded           - TRUE if table is loaded, FALSE otherwise
 912 *
 913 * RETURN:      None
 914 *
 915 * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
 916 *
 917 ******************************************************************************/
 918
 919void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded)
 920{
 921
 922        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 923        if (table_index < acpi_gbl_root_table_list.current_table_count) {
 924                if (is_loaded) {
 925                        acpi_gbl_root_table_list.tables[table_index].flags |=
 926                            ACPI_TABLE_IS_LOADED;
 927                } else {
 928                        acpi_gbl_root_table_list.tables[table_index].flags &=
 929                            ~ACPI_TABLE_IS_LOADED;
 930                }
 931        }
 932
 933        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 934}
 935
 936/*******************************************************************************
 937 *
 938 * FUNCTION:    acpi_tb_load_table
 939 *
 940 * PARAMETERS:  table_index             - Table index
 941 *              parent_node             - Where table index is returned
 942 *
 943 * RETURN:      Status
 944 *
 945 * DESCRIPTION: Load an ACPI table
 946 *
 947 ******************************************************************************/
 948
 949acpi_status
 950acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node)
 951{
 952        struct acpi_table_header *table;
 953        acpi_status status;
 954        acpi_owner_id owner_id;
 955
 956        ACPI_FUNCTION_TRACE(tb_load_table);
 957
 958        /*
 959         * Note: Now table is "INSTALLED", it must be validated before
 960         * using.
 961         */
 962        status = acpi_get_table_by_index(table_index, &table);
 963        if (ACPI_FAILURE(status)) {
 964                return_ACPI_STATUS(status);
 965        }
 966
 967        status = acpi_ns_load_table(table_index, parent_node);
 968
 969        /* Execute any module-level code that was found in the table */
 970
 971        if (!acpi_gbl_parse_table_as_term_list
 972            && acpi_gbl_group_module_level_code) {
 973                acpi_ns_exec_module_code_list();
 974        }
 975
 976        /*
 977         * Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
 978         * responsible for discovering any new wake GPEs by running _PRW methods
 979         * that may have been loaded by this table.
 980         */
 981        status = acpi_tb_get_owner_id(table_index, &owner_id);
 982        if (ACPI_SUCCESS(status)) {
 983                acpi_ev_update_gpes(owner_id);
 984        }
 985
 986        /* Invoke table handler */
 987
 988        acpi_tb_notify_table(ACPI_TABLE_EVENT_LOAD, table);
 989        return_ACPI_STATUS(status);
 990}
 991
 992/*******************************************************************************
 993 *
 994 * FUNCTION:    acpi_tb_install_and_load_table
 995 *
 996 * PARAMETERS:  address                 - Physical address of the table
 997 *              flags                   - Allocation flags of the table
 998 *              override                - Whether override should be performed
 999 *              table_index             - Where table index is returned
1000 *
1001 * RETURN:      Status
1002 *
1003 * DESCRIPTION: Install and load an ACPI table
1004 *
1005 ******************************************************************************/
1006
1007acpi_status
1008acpi_tb_install_and_load_table(acpi_physical_address address,
1009                               u8 flags, u8 override, u32 *table_index)
1010{
1011        acpi_status status;
1012        u32 i;
1013
1014        ACPI_FUNCTION_TRACE(tb_install_and_load_table);
1015
1016        /* Install the table and load it into the namespace */
1017
1018        status = acpi_tb_install_standard_table(address, flags, TRUE,
1019                                                override, &i);
1020        if (ACPI_FAILURE(status)) {
1021                goto exit;
1022        }
1023
1024        status = acpi_tb_load_table(i, acpi_gbl_root_node);
1025
1026exit:
1027        *table_index = i;
1028        return_ACPI_STATUS(status);
1029}
1030
1031ACPI_EXPORT_SYMBOL(acpi_tb_install_and_load_table)
1032
1033/*******************************************************************************
1034 *
1035 * FUNCTION:    acpi_tb_unload_table
1036 *
1037 * PARAMETERS:  table_index             - Table index
1038 *
1039 * RETURN:      Status
1040 *
1041 * DESCRIPTION: Unload an ACPI table
1042 *
1043 ******************************************************************************/
1044
1045acpi_status acpi_tb_unload_table(u32 table_index)
1046{
1047        acpi_status status = AE_OK;
1048        struct acpi_table_header *table;
1049
1050        ACPI_FUNCTION_TRACE(tb_unload_table);
1051
1052        /* Ensure the table is still loaded */
1053
1054        if (!acpi_tb_is_table_loaded(table_index)) {
1055                return_ACPI_STATUS(AE_NOT_EXIST);
1056        }
1057
1058        /* Invoke table handler */
1059
1060        status = acpi_get_table_by_index(table_index, &table);
1061        if (ACPI_SUCCESS(status)) {
1062                acpi_tb_notify_table(ACPI_TABLE_EVENT_UNLOAD, table);
1063        }
1064
1065        /* Delete the portion of the namespace owned by this table */
1066
1067        status = acpi_tb_delete_namespace_by_owner(table_index);
1068        if (ACPI_FAILURE(status)) {
1069                return_ACPI_STATUS(status);
1070        }
1071
1072        (void)acpi_tb_release_owner_id(table_index);
1073        acpi_tb_set_table_loaded_flag(table_index, FALSE);
1074        return_ACPI_STATUS(status);
1075}
1076
1077ACPI_EXPORT_SYMBOL(acpi_tb_unload_table)
1078
1079/*******************************************************************************
1080 *
1081 * FUNCTION:    acpi_tb_notify_table
1082 *
1083 * PARAMETERS:  event               - Table event
1084 *              table               - Validated table pointer
1085 *
1086 * RETURN:      None
1087 *
1088 * DESCRIPTION: Notify a table event to the users.
1089 *
1090 ******************************************************************************/
1091
1092void acpi_tb_notify_table(u32 event, void *table)
1093{
1094        /* Invoke table handler if present */
1095
1096        if (acpi_gbl_table_handler) {
1097                (void)acpi_gbl_table_handler(event, table,
1098                                             acpi_gbl_table_handler_context);
1099        }
1100}
1101