Subversion Repositories Kolibri OS

Rev

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

  1. /******************************************************************************
  2.  *
  3.  * Module Name: tbinstal - ACPI table installation and removal
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /******************************************************************************
  8.  *
  9.  * 1. Copyright Notice
  10.  *
  11.  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
  12.  * All rights reserved.
  13.  *
  14.  * 2. License
  15.  *
  16.  * 2.1. This is your license from Intel Corp. under its intellectual property
  17.  * rights.  You may have additional license terms from the party that provided
  18.  * you this software, covering your right to use that party's intellectual
  19.  * property rights.
  20.  *
  21.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  22.  * copy of the source code appearing in this file ("Covered Code") an
  23.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  24.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  25.  * make derivatives, distribute, use and display any portion of the Covered
  26.  * Code in any form, with the right to sublicense such rights; and
  27.  *
  28.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  29.  * license (with the right to sublicense), under only those claims of Intel
  30.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  31.  * offer to sell, and import the Covered Code and derivative works thereof
  32.  * solely to the minimum extent necessary to exercise the above copyright
  33.  * license, and in no event shall the patent license extend to any additions
  34.  * to or modifications of the Original Intel Code.  No other license or right
  35.  * is granted directly or by implication, estoppel or otherwise;
  36.  *
  37.  * The above copyright and patent license is granted only if the following
  38.  * conditions are met:
  39.  *
  40.  * 3. Conditions
  41.  *
  42.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  43.  * Redistribution of source code of any substantial portion of the Covered
  44.  * Code or modification with rights to further distribute source must include
  45.  * the above Copyright Notice, the above License, this list of Conditions,
  46.  * and the following Disclaimer and Export Compliance provision.  In addition,
  47.  * Licensee must cause all Covered Code to which Licensee contributes to
  48.  * contain a file documenting the changes Licensee made to create that Covered
  49.  * Code and the date of any change.  Licensee must include in that file the
  50.  * documentation of any changes made by any predecessor Licensee.  Licensee
  51.  * must include a prominent statement that the modification is derived,
  52.  * directly or indirectly, from Original Intel Code.
  53.  *
  54.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  55.  * Redistribution of source code of any substantial portion of the Covered
  56.  * Code or modification without rights to further distribute source must
  57.  * include the following Disclaimer and Export Compliance provision in the
  58.  * documentation and/or other materials provided with distribution.  In
  59.  * addition, Licensee may not authorize further sublicense of source of any
  60.  * portion of the Covered Code, and must include terms to the effect that the
  61.  * license from Licensee to its licensee is limited to the intellectual
  62.  * property embodied in the software Licensee provides to its licensee, and
  63.  * not to intellectual property embodied in modifications its licensee may
  64.  * make.
  65.  *
  66.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  67.  * substantial portion of the Covered Code or modification must reproduce the
  68.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  69.  * provision in the documentation and/or other materials provided with the
  70.  * distribution.
  71.  *
  72.  * 3.4. Intel retains all right, title, and interest in and to the Original
  73.  * Intel Code.
  74.  *
  75.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  76.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  77.  * other dealings in products derived from or relating to the Covered Code
  78.  * without prior written authorization from Intel.
  79.  *
  80.  * 4. Disclaimer and Export Compliance
  81.  *
  82.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  83.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  84.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  85.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  86.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  87.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  88.  * PARTICULAR PURPOSE.
  89.  *
  90.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  91.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  92.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  93.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  94.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  95.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  96.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  97.  * LIMITED REMEDY.
  98.  *
  99.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100.  * software or system incorporating such software without first obtaining any
  101.  * required license or other approval from the U. S. Department of Commerce or
  102.  * any other agency or department of the United States Government.  In the
  103.  * event Licensee exports any such software from the United States or
  104.  * re-exports any such software from a foreign destination, Licensee shall
  105.  * ensure that the distribution and export/re-export of the software is in
  106.  * compliance with all laws, regulations, orders, or other restrictions of the
  107.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108.  * any of its subsidiaries will export/re-export any technical data, process,
  109.  * software, or service, directly or indirectly, to any country for which the
  110.  * United States government or any agency thereof requires an export license,
  111.  * other governmental approval, or letter of assurance, without first obtaining
  112.  * such license, approval or letter.
  113.  *
  114.  *****************************************************************************/
  115.  
  116.  
  117. #define __TBINSTAL_C__
  118.  
  119. #include "acpi.h"
  120. #include "accommon.h"
  121. #include "acnamesp.h"
  122. #include "actables.h"
  123.  
  124.  
  125. #define _COMPONENT          ACPI_TABLES
  126.         ACPI_MODULE_NAME    ("tbinstal")
  127.  
  128.  
  129. /******************************************************************************
  130.  *
  131.  * FUNCTION:    AcpiTbVerifyTable
  132.  *
  133.  * PARAMETERS:  TableDesc           - table
  134.  *
  135.  * RETURN:      Status
  136.  *
  137.  * DESCRIPTION: this function is called to verify and map table
  138.  *
  139.  *****************************************************************************/
  140.  
  141. ACPI_STATUS
  142. AcpiTbVerifyTable (
  143.     ACPI_TABLE_DESC         *TableDesc)
  144. {
  145.     ACPI_STATUS             Status = AE_OK;
  146.  
  147.  
  148.     ACPI_FUNCTION_TRACE (TbVerifyTable);
  149.  
  150.  
  151.     /* Map the table if necessary */
  152.  
  153.     if (!TableDesc->Pointer)
  154.     {
  155.         if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) ==
  156.             ACPI_TABLE_ORIGIN_MAPPED)
  157.         {
  158.             TableDesc->Pointer = AcpiOsMapMemory (
  159.                 TableDesc->Address, TableDesc->Length);
  160.         }
  161.  
  162.         if (!TableDesc->Pointer)
  163.         {
  164.             return_ACPI_STATUS (AE_NO_MEMORY);
  165.         }
  166.     }
  167.  
  168.     /* FACS is the odd table, has no standard ACPI header and no checksum */
  169.  
  170.     if (!ACPI_COMPARE_NAME (&TableDesc->Signature, ACPI_SIG_FACS))
  171.     {
  172.         /* Always calculate checksum, ignore bad checksum if requested */
  173.  
  174.         Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
  175.     }
  176.  
  177.     return_ACPI_STATUS (Status);
  178. }
  179.  
  180.  
  181. /*******************************************************************************
  182.  *
  183.  * FUNCTION:    AcpiTbAddTable
  184.  *
  185.  * PARAMETERS:  TableDesc           - Table descriptor
  186.  *              TableIndex          - Where the table index is returned
  187.  *
  188.  * RETURN:      Status
  189.  *
  190.  * DESCRIPTION: This function is called to add an ACPI table. It is used to
  191.  *              dynamically load tables via the Load and LoadTable AML
  192.  *              operators.
  193.  *
  194.  ******************************************************************************/
  195.  
  196. ACPI_STATUS
  197. AcpiTbAddTable (
  198.     ACPI_TABLE_DESC         *TableDesc,
  199.     UINT32                  *TableIndex)
  200. {
  201.     UINT32                  i;
  202.     ACPI_STATUS             Status = AE_OK;
  203.     ACPI_TABLE_HEADER       *OverrideTable = NULL;
  204.  
  205.  
  206.     ACPI_FUNCTION_TRACE (TbAddTable);
  207.  
  208.  
  209.     if (!TableDesc->Pointer)
  210.     {
  211.         Status = AcpiTbVerifyTable (TableDesc);
  212.         if (ACPI_FAILURE (Status) || !TableDesc->Pointer)
  213.         {
  214.             return_ACPI_STATUS (Status);
  215.         }
  216.     }
  217.  
  218.     /*
  219.      * Originally, we checked the table signature for "SSDT" or "PSDT" here.
  220.      * Next, we added support for OEMx tables, signature "OEM".
  221.      * Valid tables were encountered with a null signature, so we've just
  222.      * given up on validating the signature, since it seems to be a waste
  223.      * of code. The original code was removed (05/2008).
  224.      */
  225.  
  226.     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  227.  
  228.     /* Check if table is already registered */
  229.  
  230.     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
  231.     {
  232.         if (!AcpiGbl_RootTableList.Tables[i].Pointer)
  233.         {
  234.             Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]);
  235.             if (ACPI_FAILURE (Status) ||
  236.                 !AcpiGbl_RootTableList.Tables[i].Pointer)
  237.             {
  238.                 continue;
  239.             }
  240.         }
  241.  
  242.         /*
  243.          * Check for a table match on the entire table length,
  244.          * not just the header.
  245.          */
  246.         if (TableDesc->Length != AcpiGbl_RootTableList.Tables[i].Length)
  247.         {
  248.             continue;
  249.         }
  250.  
  251.         if (ACPI_MEMCMP (TableDesc->Pointer,
  252.                 AcpiGbl_RootTableList.Tables[i].Pointer,
  253.                 AcpiGbl_RootTableList.Tables[i].Length))
  254.         {
  255.             continue;
  256.         }
  257.  
  258.         /*
  259.          * Note: the current mechanism does not unregister a table if it is
  260.          * dynamically unloaded. The related namespace entries are deleted,
  261.          * but the table remains in the root table list.
  262.          *
  263.          * The assumption here is that the number of different tables that
  264.          * will be loaded is actually small, and there is minimal overhead
  265.          * in just keeping the table in case it is needed again.
  266.          *
  267.          * If this assumption changes in the future (perhaps on large
  268.          * machines with many table load/unload operations), tables will
  269.          * need to be unregistered when they are unloaded, and slots in the
  270.          * root table list should be reused when empty.
  271.          */
  272.  
  273.         /*
  274.          * Table is already registered.
  275.          * We can delete the table that was passed as a parameter.
  276.          */
  277.         AcpiTbDeleteTable (TableDesc);
  278.         *TableIndex = i;
  279.  
  280.         if (AcpiGbl_RootTableList.Tables[i].Flags & ACPI_TABLE_IS_LOADED)
  281.         {
  282.             /* Table is still loaded, this is an error */
  283.  
  284.             Status = AE_ALREADY_EXISTS;
  285.             goto Release;
  286.         }
  287.         else
  288.         {
  289.             /* Table was unloaded, allow it to be reloaded */
  290.  
  291.             TableDesc->Pointer = AcpiGbl_RootTableList.Tables[i].Pointer;
  292.             TableDesc->Address = AcpiGbl_RootTableList.Tables[i].Address;
  293.             Status = AE_OK;
  294.             goto PrintHeader;
  295.         }
  296.     }
  297.  
  298.     /*
  299.      * ACPI Table Override:
  300.      * Allow the host to override dynamically loaded tables.
  301.      */
  302.     Status = AcpiOsTableOverride (TableDesc->Pointer, &OverrideTable);
  303.     if (ACPI_SUCCESS (Status) && OverrideTable)
  304.     {
  305.         ACPI_INFO ((AE_INFO,
  306.             "%4.4s @ 0x%p Table override, replaced with:",
  307.             TableDesc->Pointer->Signature,
  308.             ACPI_CAST_PTR (void, TableDesc->Address)));
  309.  
  310.         /* We can delete the table that was passed as a parameter */
  311.  
  312.         AcpiTbDeleteTable (TableDesc);
  313.  
  314.         /* Setup descriptor for the new table */
  315.  
  316.         TableDesc->Address = ACPI_PTR_TO_PHYSADDR (OverrideTable);
  317.         TableDesc->Pointer = OverrideTable;
  318.         TableDesc->Length = OverrideTable->Length;
  319.         TableDesc->Flags = ACPI_TABLE_ORIGIN_OVERRIDE;
  320.     }
  321.  
  322.     /* Add the table to the global root table list */
  323.  
  324.     Status = AcpiTbStoreTable (TableDesc->Address, TableDesc->Pointer,
  325.                 TableDesc->Length, TableDesc->Flags, TableIndex);
  326.     if (ACPI_FAILURE (Status))
  327.     {
  328.         goto Release;
  329.     }
  330.  
  331. PrintHeader:
  332.     AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
  333.  
  334. Release:
  335.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  336.     return_ACPI_STATUS (Status);
  337. }
  338.  
  339.  
  340. /*******************************************************************************
  341.  *
  342.  * FUNCTION:    AcpiTbResizeRootTableList
  343.  *
  344.  * PARAMETERS:  None
  345.  *
  346.  * RETURN:      Status
  347.  *
  348.  * DESCRIPTION: Expand the size of global table array
  349.  *
  350.  ******************************************************************************/
  351.  
  352. ACPI_STATUS
  353. AcpiTbResizeRootTableList (
  354.     void)
  355. {
  356.     ACPI_TABLE_DESC         *Tables;
  357.  
  358.  
  359.     ACPI_FUNCTION_TRACE (TbResizeRootTableList);
  360.  
  361.  
  362.     /* AllowResize flag is a parameter to AcpiInitializeTables */
  363.  
  364.     if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
  365.     {
  366.         ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
  367.         return_ACPI_STATUS (AE_SUPPORT);
  368.     }
  369.  
  370.     /* Increase the Table Array size */
  371.  
  372.     Tables = ACPI_ALLOCATE_ZEROED (
  373.         ((ACPI_SIZE) AcpiGbl_RootTableList.MaxTableCount +
  374.             ACPI_ROOT_TABLE_SIZE_INCREMENT) *
  375.         sizeof (ACPI_TABLE_DESC));
  376.     if (!Tables)
  377.     {
  378.         ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
  379.         return_ACPI_STATUS (AE_NO_MEMORY);
  380.     }
  381.  
  382.     /* Copy and free the previous table array */
  383.  
  384.     if (AcpiGbl_RootTableList.Tables)
  385.     {
  386.         ACPI_MEMCPY (Tables, AcpiGbl_RootTableList.Tables,
  387.             (ACPI_SIZE) AcpiGbl_RootTableList.MaxTableCount * sizeof (ACPI_TABLE_DESC));
  388.  
  389.         if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
  390.         {
  391.             ACPI_FREE (AcpiGbl_RootTableList.Tables);
  392.         }
  393.     }
  394.  
  395.     AcpiGbl_RootTableList.Tables = Tables;
  396.     AcpiGbl_RootTableList.MaxTableCount += ACPI_ROOT_TABLE_SIZE_INCREMENT;
  397.     AcpiGbl_RootTableList.Flags |= (UINT8) ACPI_ROOT_ORIGIN_ALLOCATED;
  398.  
  399.     return_ACPI_STATUS (AE_OK);
  400. }
  401.  
  402.  
  403. /*******************************************************************************
  404.  *
  405.  * FUNCTION:    AcpiTbStoreTable
  406.  *
  407.  * PARAMETERS:  Address             - Table address
  408.  *              Table               - Table header
  409.  *              Length              - Table length
  410.  *              Flags               - flags
  411.  *
  412.  * RETURN:      Status and table index.
  413.  *
  414.  * DESCRIPTION: Add an ACPI table to the global table list
  415.  *
  416.  ******************************************************************************/
  417.  
  418. ACPI_STATUS
  419. AcpiTbStoreTable (
  420.     ACPI_PHYSICAL_ADDRESS   Address,
  421.     ACPI_TABLE_HEADER       *Table,
  422.     UINT32                  Length,
  423.     UINT8                   Flags,
  424.     UINT32                  *TableIndex)
  425. {
  426.     ACPI_STATUS             Status;
  427.     ACPI_TABLE_DESC         *NewTable;
  428.  
  429.  
  430.     /* Ensure that there is room for the table in the Root Table List */
  431.  
  432.     if (AcpiGbl_RootTableList.CurrentTableCount >=
  433.         AcpiGbl_RootTableList.MaxTableCount)
  434.     {
  435.         Status = AcpiTbResizeRootTableList();
  436.         if (ACPI_FAILURE (Status))
  437.         {
  438.             return (Status);
  439.         }
  440.     }
  441.  
  442.     NewTable = &AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.CurrentTableCount];
  443.  
  444.     /* Initialize added table */
  445.  
  446.     NewTable->Address = Address;
  447.     NewTable->Pointer = Table;
  448.     NewTable->Length = Length;
  449.     NewTable->OwnerId = 0;
  450.     NewTable->Flags = Flags;
  451.  
  452.     ACPI_MOVE_32_TO_32 (&NewTable->Signature, Table->Signature);
  453.  
  454.     *TableIndex = AcpiGbl_RootTableList.CurrentTableCount;
  455.     AcpiGbl_RootTableList.CurrentTableCount++;
  456.     return (AE_OK);
  457. }
  458.  
  459.  
  460. /*******************************************************************************
  461.  *
  462.  * FUNCTION:    AcpiTbDeleteTable
  463.  *
  464.  * PARAMETERS:  TableIndex          - Table index
  465.  *
  466.  * RETURN:      None
  467.  *
  468.  * DESCRIPTION: Delete one internal ACPI table
  469.  *
  470.  ******************************************************************************/
  471.  
  472. void
  473. AcpiTbDeleteTable (
  474.     ACPI_TABLE_DESC         *TableDesc)
  475. {
  476.  
  477.     /* Table must be mapped or allocated */
  478.  
  479.     if (!TableDesc->Pointer)
  480.     {
  481.         return;
  482.     }
  483.  
  484.     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
  485.     {
  486.     case ACPI_TABLE_ORIGIN_MAPPED:
  487.         AcpiOsUnmapMemory (TableDesc->Pointer, TableDesc->Length);
  488.         break;
  489.  
  490.     case ACPI_TABLE_ORIGIN_ALLOCATED:
  491.         ACPI_FREE (TableDesc->Pointer);
  492.         break;
  493.  
  494.     default:
  495.         break;
  496.     }
  497.  
  498.     TableDesc->Pointer = NULL;
  499. }
  500.  
  501.  
  502. /*******************************************************************************
  503.  *
  504.  * FUNCTION:    AcpiTbTerminate
  505.  *
  506.  * PARAMETERS:  None
  507.  *
  508.  * RETURN:      None
  509.  *
  510.  * DESCRIPTION: Delete all internal ACPI tables
  511.  *
  512.  ******************************************************************************/
  513.  
  514. void
  515. AcpiTbTerminate (
  516.     void)
  517. {
  518.     UINT32                  i;
  519.  
  520.  
  521.     ACPI_FUNCTION_TRACE (TbTerminate);
  522.  
  523.  
  524.     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  525.  
  526.     /* Delete the individual tables */
  527.  
  528.     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
  529.     {
  530.         AcpiTbDeleteTable (&AcpiGbl_RootTableList.Tables[i]);
  531.     }
  532.  
  533.     /*
  534.      * Delete the root table array if allocated locally. Array cannot be
  535.      * mapped, so we don't need to check for that flag.
  536.      */
  537.     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
  538.     {
  539.         ACPI_FREE (AcpiGbl_RootTableList.Tables);
  540.     }
  541.  
  542.     AcpiGbl_RootTableList.Tables = NULL;
  543.     AcpiGbl_RootTableList.Flags = 0;
  544.     AcpiGbl_RootTableList.CurrentTableCount = 0;
  545.  
  546.     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
  547.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  548. }
  549.  
  550.  
  551. /*******************************************************************************
  552.  *
  553.  * FUNCTION:    AcpiTbDeleteNamespaceByOwner
  554.  *
  555.  * PARAMETERS:  TableIndex          - Table index
  556.  *
  557.  * RETURN:      Status
  558.  *
  559.  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
  560.  *
  561.  ******************************************************************************/
  562.  
  563. ACPI_STATUS
  564. AcpiTbDeleteNamespaceByOwner (
  565.     UINT32                  TableIndex)
  566. {
  567.     ACPI_OWNER_ID           OwnerId;
  568.     ACPI_STATUS             Status;
  569.  
  570.  
  571.     ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
  572.  
  573.  
  574.     Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  575.     if (ACPI_FAILURE (Status))
  576.     {
  577.         return_ACPI_STATUS (Status);
  578.     }
  579.  
  580.     if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
  581.     {
  582.         /* The table index does not exist */
  583.  
  584.         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  585.         return_ACPI_STATUS (AE_NOT_EXIST);
  586.     }
  587.  
  588.     /* Get the owner ID for this table, used to delete namespace nodes */
  589.  
  590.     OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
  591.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  592.  
  593.     /*
  594.      * Need to acquire the namespace writer lock to prevent interference
  595.      * with any concurrent namespace walks. The interpreter must be
  596.      * released during the deletion since the acquisition of the deletion
  597.      * lock may block, and also since the execution of a namespace walk
  598.      * must be allowed to use the interpreter.
  599.      */
  600.     (void) AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
  601.     Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
  602.  
  603.     AcpiNsDeleteNamespaceByOwner (OwnerId);
  604.     if (ACPI_FAILURE (Status))
  605.     {
  606.         return_ACPI_STATUS (Status);
  607.     }
  608.  
  609.     AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
  610.  
  611.     Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
  612.     return_ACPI_STATUS (Status);
  613. }
  614.  
  615.  
  616. /*******************************************************************************
  617.  *
  618.  * FUNCTION:    AcpiTbAllocateOwnerId
  619.  *
  620.  * PARAMETERS:  TableIndex          - Table index
  621.  *
  622.  * RETURN:      Status
  623.  *
  624.  * DESCRIPTION: Allocates OwnerId in TableDesc
  625.  *
  626.  ******************************************************************************/
  627.  
  628. ACPI_STATUS
  629. AcpiTbAllocateOwnerId (
  630.     UINT32                  TableIndex)
  631. {
  632.     ACPI_STATUS             Status = AE_BAD_PARAMETER;
  633.  
  634.  
  635.     ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
  636.  
  637.  
  638.     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  639.     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
  640.     {
  641.         Status = AcpiUtAllocateOwnerId
  642.                     (&(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
  643.     }
  644.  
  645.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  646.     return_ACPI_STATUS (Status);
  647. }
  648.  
  649.  
  650. /*******************************************************************************
  651.  *
  652.  * FUNCTION:    AcpiTbReleaseOwnerId
  653.  *
  654.  * PARAMETERS:  TableIndex          - Table index
  655.  *
  656.  * RETURN:      Status
  657.  *
  658.  * DESCRIPTION: Releases OwnerId in TableDesc
  659.  *
  660.  ******************************************************************************/
  661.  
  662. ACPI_STATUS
  663. AcpiTbReleaseOwnerId (
  664.     UINT32                  TableIndex)
  665. {
  666.     ACPI_STATUS             Status = AE_BAD_PARAMETER;
  667.  
  668.  
  669.     ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
  670.  
  671.  
  672.     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  673.     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
  674.     {
  675.         AcpiUtReleaseOwnerId (
  676.             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
  677.         Status = AE_OK;
  678.     }
  679.  
  680.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  681.     return_ACPI_STATUS (Status);
  682. }
  683.  
  684.  
  685. /*******************************************************************************
  686.  *
  687.  * FUNCTION:    AcpiTbGetOwnerId
  688.  *
  689.  * PARAMETERS:  TableIndex          - Table index
  690.  *              OwnerId             - Where the table OwnerId is returned
  691.  *
  692.  * RETURN:      Status
  693.  *
  694.  * DESCRIPTION: returns OwnerId for the ACPI table
  695.  *
  696.  ******************************************************************************/
  697.  
  698. ACPI_STATUS
  699. AcpiTbGetOwnerId (
  700.     UINT32                  TableIndex,
  701.     ACPI_OWNER_ID           *OwnerId)
  702. {
  703.     ACPI_STATUS             Status = AE_BAD_PARAMETER;
  704.  
  705.  
  706.     ACPI_FUNCTION_TRACE (TbGetOwnerId);
  707.  
  708.  
  709.     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  710.     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
  711.     {
  712.         *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
  713.         Status = AE_OK;
  714.     }
  715.  
  716.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  717.     return_ACPI_STATUS (Status);
  718. }
  719.  
  720.  
  721. /*******************************************************************************
  722.  *
  723.  * FUNCTION:    AcpiTbIsTableLoaded
  724.  *
  725.  * PARAMETERS:  TableIndex          - Table index
  726.  *
  727.  * RETURN:      Table Loaded Flag
  728.  *
  729.  ******************************************************************************/
  730.  
  731. BOOLEAN
  732. AcpiTbIsTableLoaded (
  733.     UINT32                  TableIndex)
  734. {
  735.     BOOLEAN                 IsLoaded = FALSE;
  736.  
  737.  
  738.     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  739.     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
  740.     {
  741.         IsLoaded = (BOOLEAN)
  742.             (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
  743.             ACPI_TABLE_IS_LOADED);
  744.     }
  745.  
  746.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  747.     return (IsLoaded);
  748. }
  749.  
  750.  
  751. /*******************************************************************************
  752.  *
  753.  * FUNCTION:    AcpiTbSetTableLoadedFlag
  754.  *
  755.  * PARAMETERS:  TableIndex          - Table index
  756.  *              IsLoaded            - TRUE if table is loaded, FALSE otherwise
  757.  *
  758.  * RETURN:      None
  759.  *
  760.  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
  761.  *
  762.  ******************************************************************************/
  763.  
  764. void
  765. AcpiTbSetTableLoadedFlag (
  766.     UINT32                  TableIndex,
  767.     BOOLEAN                 IsLoaded)
  768. {
  769.  
  770.     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
  771.     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
  772.     {
  773.         if (IsLoaded)
  774.         {
  775.             AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
  776.                 ACPI_TABLE_IS_LOADED;
  777.         }
  778.         else
  779.         {
  780.             AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
  781.                 ~ACPI_TABLE_IS_LOADED;
  782.         }
  783.     }
  784.  
  785.     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
  786. }
  787.  
  788.