Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: tbdata - Table manager data structure functions
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /*
  8.  * Copyright (C) 2000 - 2015, 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.  
  49. #define _COMPONENT          ACPI_TABLES
  50. ACPI_MODULE_NAME("tbdata")
  51.  
  52. /*******************************************************************************
  53.  *
  54.  * FUNCTION:    acpi_tb_init_table_descriptor
  55.  *
  56.  * PARAMETERS:  table_desc              - Table descriptor
  57.  *              address                 - Physical address of the table
  58.  *              flags                   - Allocation flags of the table
  59.  *              table                   - Pointer to the table
  60.  *
  61.  * RETURN:      None
  62.  *
  63.  * DESCRIPTION: Initialize a new table descriptor
  64.  *
  65.  ******************************************************************************/
  66. void
  67. acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc,
  68.                               acpi_physical_address address,
  69.                               u8 flags, struct acpi_table_header *table)
  70. {
  71.  
  72.         /*
  73.          * Initialize the table descriptor. Set the pointer to NULL, since the
  74.          * table is not fully mapped at this time.
  75.          */
  76.         memset(table_desc, 0, sizeof(struct acpi_table_desc));
  77.         table_desc->address = address;
  78.         table_desc->length = table->length;
  79.         table_desc->flags = flags;
  80.         ACPI_MOVE_32_TO_32(table_desc->signature.ascii, table->signature);
  81. }
  82.  
  83. /*******************************************************************************
  84.  *
  85.  * FUNCTION:    acpi_tb_acquire_table
  86.  *
  87.  * PARAMETERS:  table_desc          - Table descriptor
  88.  *              table_ptr           - Where table is returned
  89.  *              table_length        - Where table length is returned
  90.  *              table_flags         - Where table allocation flags are returned
  91.  *
  92.  * RETURN:      Status
  93.  *
  94.  * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
  95.  *              maintained in the acpi_gbl_root_table_list.
  96.  *
  97.  ******************************************************************************/
  98.  
  99. acpi_status
  100. acpi_tb_acquire_table(struct acpi_table_desc *table_desc,
  101.                       struct acpi_table_header **table_ptr,
  102.                       u32 *table_length, u8 *table_flags)
  103. {
  104.         struct acpi_table_header *table = NULL;
  105.  
  106.         switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
  107.         case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
  108.  
  109.                 table =
  110.                     acpi_os_map_memory(table_desc->address, table_desc->length);
  111.                 break;
  112.  
  113.         case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
  114.         case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
  115.  
  116.                 table = ACPI_CAST_PTR(struct acpi_table_header,
  117.                                       ACPI_PHYSADDR_TO_PTR(table_desc->
  118.                                                            address));
  119.                 break;
  120.  
  121.         default:
  122.  
  123.                 break;
  124.         }
  125.  
  126.         /* Table is not valid yet */
  127.  
  128.         if (!table) {
  129.                 return (AE_NO_MEMORY);
  130.         }
  131.  
  132.         /* Fill the return values */
  133.  
  134.         *table_ptr = table;
  135.         *table_length = table_desc->length;
  136.         *table_flags = table_desc->flags;
  137.         return (AE_OK);
  138. }
  139.  
  140. /*******************************************************************************
  141.  *
  142.  * FUNCTION:    acpi_tb_release_table
  143.  *
  144.  * PARAMETERS:  table               - Pointer for the table
  145.  *              table_length        - Length for the table
  146.  *              table_flags         - Allocation flags for the table
  147.  *
  148.  * RETURN:      None
  149.  *
  150.  * DESCRIPTION: Release a table. The inverse of acpi_tb_acquire_table().
  151.  *
  152.  ******************************************************************************/
  153.  
  154. void
  155. acpi_tb_release_table(struct acpi_table_header *table,
  156.                       u32 table_length, u8 table_flags)
  157. {
  158.  
  159.         switch (table_flags & ACPI_TABLE_ORIGIN_MASK) {
  160.         case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
  161.  
  162.                 acpi_os_unmap_memory(table, table_length);
  163.                 break;
  164.  
  165.         case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
  166.         case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
  167.         default:
  168.  
  169.                 break;
  170.         }
  171. }
  172.  
  173. /*******************************************************************************
  174.  *
  175.  * FUNCTION:    acpi_tb_acquire_temp_table
  176.  *
  177.  * PARAMETERS:  table_desc          - Table descriptor to be acquired
  178.  *              address             - Address of the table
  179.  *              flags               - Allocation flags of the table
  180.  *
  181.  * RETURN:      Status
  182.  *
  183.  * DESCRIPTION: This function validates the table header to obtain the length
  184.  *              of a table and fills the table descriptor to make its state as
  185.  *              "INSTALLED". Such a table descriptor is only used for verified
  186.  *              installation.
  187.  *
  188.  ******************************************************************************/
  189.  
  190. acpi_status
  191. acpi_tb_acquire_temp_table(struct acpi_table_desc *table_desc,
  192.                            acpi_physical_address address, u8 flags)
  193. {
  194.         struct acpi_table_header *table_header;
  195.  
  196.         switch (flags & ACPI_TABLE_ORIGIN_MASK) {
  197.         case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
  198.  
  199.                 /* Get the length of the full table from the header */
  200.  
  201.                 table_header =
  202.                     acpi_os_map_memory(address,
  203.                                        sizeof(struct acpi_table_header));
  204.                 if (!table_header) {
  205.                         return (AE_NO_MEMORY);
  206.                 }
  207.  
  208.                 acpi_tb_init_table_descriptor(table_desc, address, flags,
  209.                                               table_header);
  210.                 acpi_os_unmap_memory(table_header,
  211.                                      sizeof(struct acpi_table_header));
  212.                 return (AE_OK);
  213.  
  214.         case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
  215.         case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
  216.  
  217.                 table_header = ACPI_CAST_PTR(struct acpi_table_header,
  218.                                              ACPI_PHYSADDR_TO_PTR(address));
  219.                 if (!table_header) {
  220.                         return (AE_NO_MEMORY);
  221.                 }
  222.  
  223.                 acpi_tb_init_table_descriptor(table_desc, address, flags,
  224.                                               table_header);
  225.                 return (AE_OK);
  226.  
  227.         default:
  228.  
  229.                 break;
  230.         }
  231.  
  232.         /* Table is not valid yet */
  233.  
  234.         return (AE_NO_MEMORY);
  235. }
  236.  
  237. /*******************************************************************************
  238.  *
  239.  * FUNCTION:    acpi_tb_release_temp_table
  240.  *
  241.  * PARAMETERS:  table_desc          - Table descriptor to be released
  242.  *
  243.  * RETURN:      Status
  244.  *
  245.  * DESCRIPTION: The inverse of acpi_tb_acquire_temp_table().
  246.  *
  247.  *****************************************************************************/
  248.  
  249. void acpi_tb_release_temp_table(struct acpi_table_desc *table_desc)
  250. {
  251.  
  252.         /*
  253.          * Note that the .Address is maintained by the callers of
  254.          * acpi_tb_acquire_temp_table(), thus do not invoke acpi_tb_uninstall_table()
  255.          * where .Address will be freed.
  256.          */
  257.         acpi_tb_invalidate_table(table_desc);
  258. }
  259.  
  260. /******************************************************************************
  261.  *
  262.  * FUNCTION:    acpi_tb_validate_table
  263.  *
  264.  * PARAMETERS:  table_desc          - Table descriptor
  265.  *
  266.  * RETURN:      Status
  267.  *
  268.  * DESCRIPTION: This function is called to validate the table, the returned
  269.  *              table descriptor is in "VALIDATED" state.
  270.  *
  271.  *****************************************************************************/
  272.  
  273. acpi_status acpi_tb_validate_table(struct acpi_table_desc *table_desc)
  274. {
  275.         acpi_status status = AE_OK;
  276.  
  277.         ACPI_FUNCTION_TRACE(tb_validate_table);
  278.  
  279.         /* Validate the table if necessary */
  280.  
  281.         if (!table_desc->pointer) {
  282.                 status = acpi_tb_acquire_table(table_desc, &table_desc->pointer,
  283.                                                &table_desc->length,
  284.                                                &table_desc->flags);
  285.                 if (!table_desc->pointer) {
  286.                         status = AE_NO_MEMORY;
  287.                 }
  288.         }
  289.  
  290.         return_ACPI_STATUS(status);
  291. }
  292.  
  293. /*******************************************************************************
  294.  *
  295.  * FUNCTION:    acpi_tb_invalidate_table
  296.  *
  297.  * PARAMETERS:  table_desc          - Table descriptor
  298.  *
  299.  * RETURN:      None
  300.  *
  301.  * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
  302.  *              acpi_tb_validate_table().
  303.  *
  304.  ******************************************************************************/
  305.  
  306. void acpi_tb_invalidate_table(struct acpi_table_desc *table_desc)
  307. {
  308.  
  309.         ACPI_FUNCTION_TRACE(tb_invalidate_table);
  310.  
  311.         /* Table must be validated */
  312.  
  313.         if (!table_desc->pointer) {
  314.                 return_VOID;
  315.         }
  316.  
  317.         acpi_tb_release_table(table_desc->pointer, table_desc->length,
  318.                               table_desc->flags);
  319.         table_desc->pointer = NULL;
  320.  
  321.         return_VOID;
  322. }
  323.  
  324. /******************************************************************************
  325.  *
  326.  * FUNCTION:    acpi_tb_validate_temp_table
  327.  *
  328.  * PARAMETERS:  table_desc          - Table descriptor
  329.  *
  330.  * RETURN:      Status
  331.  *
  332.  * DESCRIPTION: This function is called to validate the table, the returned
  333.  *              table descriptor is in "VALIDATED" state.
  334.  *
  335.  *****************************************************************************/
  336.  
  337. acpi_status acpi_tb_validate_temp_table(struct acpi_table_desc *table_desc)
  338. {
  339.  
  340.         if (!table_desc->pointer && !acpi_gbl_verify_table_checksum) {
  341.                 /*
  342.                  * Only validates the header of the table.
  343.                  * Note that Length contains the size of the mapping after invoking
  344.                  * this work around, this value is required by
  345.                  * acpi_tb_release_temp_table().
  346.                  * We can do this because in acpi_init_table_descriptor(), the Length
  347.                  * field of the installed descriptor is filled with the actual
  348.                  * table length obtaining from the table header.
  349.                  */
  350.                 table_desc->length = sizeof(struct acpi_table_header);
  351.         }
  352.  
  353.         return (acpi_tb_validate_table(table_desc));
  354. }
  355.  
  356. /******************************************************************************
  357.  *
  358.  * FUNCTION:    acpi_tb_verify_temp_table
  359.  *
  360.  * PARAMETERS:  table_desc          - Table descriptor
  361.  *              signature           - Table signature to verify
  362.  *
  363.  * RETURN:      Status
  364.  *
  365.  * DESCRIPTION: This function is called to validate and verify the table, the
  366.  *              returned table descriptor is in "VALIDATED" state.
  367.  *
  368.  *****************************************************************************/
  369.  
  370. acpi_status
  371. acpi_tb_verify_temp_table(struct acpi_table_desc * table_desc, char *signature)
  372. {
  373.         acpi_status status = AE_OK;
  374.  
  375.         ACPI_FUNCTION_TRACE(tb_verify_temp_table);
  376.  
  377.         /* Validate the table */
  378.  
  379.         status = acpi_tb_validate_temp_table(table_desc);
  380.         if (ACPI_FAILURE(status)) {
  381.                 return_ACPI_STATUS(AE_NO_MEMORY);
  382.         }
  383.  
  384.         /* If a particular signature is expected (DSDT/FACS), it must match */
  385.  
  386.         if (signature && !ACPI_COMPARE_NAME(&table_desc->signature, signature)) {
  387.                 ACPI_BIOS_ERROR((AE_INFO,
  388.                                  "Invalid signature 0x%X for ACPI table, expected [%s]",
  389.                                  table_desc->signature.integer, signature));
  390.                 status = AE_BAD_SIGNATURE;
  391.                 goto invalidate_and_exit;
  392.         }
  393.  
  394.         /* Verify the checksum */
  395.  
  396.         if (acpi_gbl_verify_table_checksum) {
  397.                 status =
  398.                     acpi_tb_verify_checksum(table_desc->pointer,
  399.                                             table_desc->length);
  400.                 if (ACPI_FAILURE(status)) {
  401.                         ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
  402.                                         "%4.4s 0x%8.8X%8.8X"
  403.                                         " Attempted table install failed",
  404.                                         acpi_ut_valid_acpi_name(table_desc->
  405.                                                                 signature.
  406.                                                                 ascii) ?
  407.                                         table_desc->signature.ascii : "????",
  408.                                         ACPI_FORMAT_UINT64(table_desc->
  409.                                                            address)));
  410.                         goto invalidate_and_exit;
  411.                 }
  412.         }
  413.  
  414.         return_ACPI_STATUS(AE_OK);
  415.  
  416. invalidate_and_exit:
  417.         acpi_tb_invalidate_table(table_desc);
  418.         return_ACPI_STATUS(status);
  419. }
  420.  
  421. /*******************************************************************************
  422.  *
  423.  * FUNCTION:    acpi_tb_resize_root_table_list
  424.  *
  425.  * PARAMETERS:  None
  426.  *
  427.  * RETURN:      Status
  428.  *
  429.  * DESCRIPTION: Expand the size of global table array
  430.  *
  431.  ******************************************************************************/
  432.  
  433. acpi_status acpi_tb_resize_root_table_list(void)
  434. {
  435.         struct acpi_table_desc *tables;
  436.         u32 table_count;
  437.  
  438.         ACPI_FUNCTION_TRACE(tb_resize_root_table_list);
  439.  
  440.         /* allow_resize flag is a parameter to acpi_initialize_tables */
  441.  
  442.         if (!(acpi_gbl_root_table_list.flags & ACPI_ROOT_ALLOW_RESIZE)) {
  443.                 ACPI_ERROR((AE_INFO,
  444.                             "Resize of Root Table Array is not allowed"));
  445.                 return_ACPI_STATUS(AE_SUPPORT);
  446.         }
  447.  
  448.         /* Increase the Table Array size */
  449.  
  450.         if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
  451.                 table_count = acpi_gbl_root_table_list.max_table_count;
  452.         } else {
  453.                 table_count = acpi_gbl_root_table_list.current_table_count;
  454.         }
  455.  
  456.         tables = ACPI_ALLOCATE_ZEROED(((acpi_size) table_count +
  457.                                        ACPI_ROOT_TABLE_SIZE_INCREMENT) *
  458.                                       sizeof(struct acpi_table_desc));
  459.         if (!tables) {
  460.                 ACPI_ERROR((AE_INFO,
  461.                             "Could not allocate new root table array"));
  462.                 return_ACPI_STATUS(AE_NO_MEMORY);
  463.         }
  464.  
  465.         /* Copy and free the previous table array */
  466.  
  467.         if (acpi_gbl_root_table_list.tables) {
  468.                 memcpy(tables, acpi_gbl_root_table_list.tables,
  469.                        (acpi_size) table_count *
  470.                        sizeof(struct acpi_table_desc));
  471.  
  472.                 if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
  473.                         ACPI_FREE(acpi_gbl_root_table_list.tables);
  474.                 }
  475.         }
  476.  
  477.         acpi_gbl_root_table_list.tables = tables;
  478.         acpi_gbl_root_table_list.max_table_count =
  479.             table_count + ACPI_ROOT_TABLE_SIZE_INCREMENT;
  480.         acpi_gbl_root_table_list.flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
  481.  
  482.         return_ACPI_STATUS(AE_OK);
  483. }
  484.  
  485. /*******************************************************************************
  486.  *
  487.  * FUNCTION:    acpi_tb_get_next_table_descriptor
  488.  *
  489.  * PARAMETERS:  table_index         - Where table index is returned
  490.  *              table_desc          - Where table descriptor is returned
  491.  *
  492.  * RETURN:      Status and table index/descriptor.
  493.  *
  494.  * DESCRIPTION: Allocate a new ACPI table entry to the global table list
  495.  *
  496.  ******************************************************************************/
  497.  
  498. acpi_status
  499. acpi_tb_get_next_table_descriptor(u32 *table_index,
  500.                                   struct acpi_table_desc **table_desc)
  501. {
  502.         acpi_status status;
  503.         u32 i;
  504.  
  505.         /* Ensure that there is room for the table in the Root Table List */
  506.  
  507.         if (acpi_gbl_root_table_list.current_table_count >=
  508.             acpi_gbl_root_table_list.max_table_count) {
  509.                 status = acpi_tb_resize_root_table_list();
  510.                 if (ACPI_FAILURE(status)) {
  511.                         return (status);
  512.                 }
  513.         }
  514.  
  515.         i = acpi_gbl_root_table_list.current_table_count;
  516.         acpi_gbl_root_table_list.current_table_count++;
  517.  
  518.         if (table_index) {
  519.                 *table_index = i;
  520.         }
  521.         if (table_desc) {
  522.                 *table_desc = &acpi_gbl_root_table_list.tables[i];
  523.         }
  524.  
  525.         return (AE_OK);
  526. }
  527.  
  528. /*******************************************************************************
  529.  *
  530.  * FUNCTION:    acpi_tb_terminate
  531.  *
  532.  * PARAMETERS:  None
  533.  *
  534.  * RETURN:      None
  535.  *
  536.  * DESCRIPTION: Delete all internal ACPI tables
  537.  *
  538.  ******************************************************************************/
  539.  
  540. void acpi_tb_terminate(void)
  541. {
  542.         u32 i;
  543.  
  544.         ACPI_FUNCTION_TRACE(tb_terminate);
  545.  
  546.         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
  547.  
  548.         /* Delete the individual tables */
  549.  
  550.         for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) {
  551.                 acpi_tb_uninstall_table(&acpi_gbl_root_table_list.tables[i]);
  552.         }
  553.  
  554.         /*
  555.          * Delete the root table array if allocated locally. Array cannot be
  556.          * mapped, so we don't need to check for that flag.
  557.          */
  558.         if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
  559.                 ACPI_FREE(acpi_gbl_root_table_list.tables);
  560.         }
  561.  
  562.         acpi_gbl_root_table_list.tables = NULL;
  563.         acpi_gbl_root_table_list.flags = 0;
  564.         acpi_gbl_root_table_list.current_table_count = 0;
  565.  
  566.         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI Tables freed\n"));
  567.  
  568.         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  569.         return_VOID;
  570. }
  571.  
  572. /*******************************************************************************
  573.  *
  574.  * FUNCTION:    acpi_tb_delete_namespace_by_owner
  575.  *
  576.  * PARAMETERS:  table_index         - Table index
  577.  *
  578.  * RETURN:      Status
  579.  *
  580.  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
  581.  *
  582.  ******************************************************************************/
  583.  
  584. acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index)
  585. {
  586.         acpi_owner_id owner_id;
  587.         acpi_status status;
  588.  
  589.         ACPI_FUNCTION_TRACE(tb_delete_namespace_by_owner);
  590.  
  591.         status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
  592.         if (ACPI_FAILURE(status)) {
  593.                 return_ACPI_STATUS(status);
  594.         }
  595.  
  596.         if (table_index >= acpi_gbl_root_table_list.current_table_count) {
  597.  
  598.                 /* The table index does not exist */
  599.  
  600.                 (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  601.                 return_ACPI_STATUS(AE_NOT_EXIST);
  602.         }
  603.  
  604.         /* Get the owner ID for this table, used to delete namespace nodes */
  605.  
  606.         owner_id = acpi_gbl_root_table_list.tables[table_index].owner_id;
  607.         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  608.  
  609.         /*
  610.          * Need to acquire the namespace writer lock to prevent interference
  611.          * with any concurrent namespace walks. The interpreter must be
  612.          * released during the deletion since the acquisition of the deletion
  613.          * lock may block, and also since the execution of a namespace walk
  614.          * must be allowed to use the interpreter.
  615.          */
  616.         (void)acpi_ut_release_mutex(ACPI_MTX_INTERPRETER);
  617.         status = acpi_ut_acquire_write_lock(&acpi_gbl_namespace_rw_lock);
  618.  
  619.         acpi_ns_delete_namespace_by_owner(owner_id);
  620.         if (ACPI_FAILURE(status)) {
  621.                 return_ACPI_STATUS(status);
  622.         }
  623.  
  624.         acpi_ut_release_write_lock(&acpi_gbl_namespace_rw_lock);
  625.  
  626.         status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
  627.         return_ACPI_STATUS(status);
  628. }
  629.  
  630. /*******************************************************************************
  631.  *
  632.  * FUNCTION:    acpi_tb_allocate_owner_id
  633.  *
  634.  * PARAMETERS:  table_index         - Table index
  635.  *
  636.  * RETURN:      Status
  637.  *
  638.  * DESCRIPTION: Allocates owner_id in table_desc
  639.  *
  640.  ******************************************************************************/
  641.  
  642. acpi_status acpi_tb_allocate_owner_id(u32 table_index)
  643. {
  644.         acpi_status status = AE_BAD_PARAMETER;
  645.  
  646.         ACPI_FUNCTION_TRACE(tb_allocate_owner_id);
  647.  
  648.         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
  649.         if (table_index < acpi_gbl_root_table_list.current_table_count) {
  650.                 status =
  651.                     acpi_ut_allocate_owner_id(&
  652.                                               (acpi_gbl_root_table_list.
  653.                                                tables[table_index].owner_id));
  654.         }
  655.  
  656.         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  657.         return_ACPI_STATUS(status);
  658. }
  659.  
  660. /*******************************************************************************
  661.  *
  662.  * FUNCTION:    acpi_tb_release_owner_id
  663.  *
  664.  * PARAMETERS:  table_index         - Table index
  665.  *
  666.  * RETURN:      Status
  667.  *
  668.  * DESCRIPTION: Releases owner_id in table_desc
  669.  *
  670.  ******************************************************************************/
  671.  
  672. acpi_status acpi_tb_release_owner_id(u32 table_index)
  673. {
  674.         acpi_status status = AE_BAD_PARAMETER;
  675.  
  676.         ACPI_FUNCTION_TRACE(tb_release_owner_id);
  677.  
  678.         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
  679.         if (table_index < acpi_gbl_root_table_list.current_table_count) {
  680.                 acpi_ut_release_owner_id(&
  681.                                          (acpi_gbl_root_table_list.
  682.                                           tables[table_index].owner_id));
  683.                 status = AE_OK;
  684.         }
  685.  
  686.         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  687.         return_ACPI_STATUS(status);
  688. }
  689.  
  690. /*******************************************************************************
  691.  *
  692.  * FUNCTION:    acpi_tb_get_owner_id
  693.  *
  694.  * PARAMETERS:  table_index         - Table index
  695.  *              owner_id            - Where the table owner_id is returned
  696.  *
  697.  * RETURN:      Status
  698.  *
  699.  * DESCRIPTION: returns owner_id for the ACPI table
  700.  *
  701.  ******************************************************************************/
  702.  
  703. acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id * owner_id)
  704. {
  705.         acpi_status status = AE_BAD_PARAMETER;
  706.  
  707.         ACPI_FUNCTION_TRACE(tb_get_owner_id);
  708.  
  709.         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
  710.         if (table_index < acpi_gbl_root_table_list.current_table_count) {
  711.                 *owner_id =
  712.                     acpi_gbl_root_table_list.tables[table_index].owner_id;
  713.                 status = AE_OK;
  714.         }
  715.  
  716.         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  717.         return_ACPI_STATUS(status);
  718. }
  719.  
  720. /*******************************************************************************
  721.  *
  722.  * FUNCTION:    acpi_tb_is_table_loaded
  723.  *
  724.  * PARAMETERS:  table_index         - Index into the root table
  725.  *
  726.  * RETURN:      Table Loaded Flag
  727.  *
  728.  ******************************************************************************/
  729.  
  730. u8 acpi_tb_is_table_loaded(u32 table_index)
  731. {
  732.         u8 is_loaded = FALSE;
  733.  
  734.         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
  735.         if (table_index < acpi_gbl_root_table_list.current_table_count) {
  736.                 is_loaded = (u8)
  737.                     (acpi_gbl_root_table_list.tables[table_index].flags &
  738.                      ACPI_TABLE_IS_LOADED);
  739.         }
  740.  
  741.         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  742.         return (is_loaded);
  743. }
  744.  
  745. /*******************************************************************************
  746.  *
  747.  * FUNCTION:    acpi_tb_set_table_loaded_flag
  748.  *
  749.  * PARAMETERS:  table_index         - Table index
  750.  *              is_loaded           - TRUE if table is loaded, FALSE otherwise
  751.  *
  752.  * RETURN:      None
  753.  *
  754.  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
  755.  *
  756.  ******************************************************************************/
  757.  
  758. void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded)
  759. {
  760.  
  761.         (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
  762.         if (table_index < acpi_gbl_root_table_list.current_table_count) {
  763.                 if (is_loaded) {
  764.                         acpi_gbl_root_table_list.tables[table_index].flags |=
  765.                             ACPI_TABLE_IS_LOADED;
  766.                 } else {
  767.                         acpi_gbl_root_table_list.tables[table_index].flags &=
  768.                             ~ACPI_TABLE_IS_LOADED;
  769.                 }
  770.         }
  771.  
  772.         (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
  773. }
  774.