xref: /freebsd-src/sys/contrib/dev/acpica/components/tables/tbdata.c (revision 804fe2660352e090f4481f2c1d646b508859e79a)
1313a0c13SJung-uk Kim /******************************************************************************
2313a0c13SJung-uk Kim  *
3313a0c13SJung-uk Kim  * Module Name: tbdata - Table manager data structure functions
4313a0c13SJung-uk Kim  *
5313a0c13SJung-uk Kim  *****************************************************************************/
6313a0c13SJung-uk Kim 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
11*804fe266SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
12313a0c13SJung-uk Kim  * All rights reserved.
13313a0c13SJung-uk Kim  *
140d84335fSJung-uk Kim  * 2. License
150d84335fSJung-uk Kim  *
160d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim  * property rights.
200d84335fSJung-uk Kim  *
210d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim  *
280d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim  *
370d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim  * conditions are met:
390d84335fSJung-uk Kim  *
400d84335fSJung-uk Kim  * 3. Conditions
410d84335fSJung-uk Kim  *
420d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim  *
540d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim  * make.
650d84335fSJung-uk Kim  *
660d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim  * distribution.
710d84335fSJung-uk Kim  *
720d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim  * Intel Code.
740d84335fSJung-uk Kim  *
750d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim  * without prior written authorization from Intel.
790d84335fSJung-uk Kim  *
800d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim  *
820d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim  *
900d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim  * LIMITED REMEDY.
980d84335fSJung-uk Kim  *
990d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim  * such license, approval or letter.
1130d84335fSJung-uk Kim  *
1140d84335fSJung-uk Kim  *****************************************************************************
1150d84335fSJung-uk Kim  *
1160d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim  * following license:
1180d84335fSJung-uk Kim  *
119313a0c13SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120313a0c13SJung-uk Kim  * modification, are permitted provided that the following conditions
121313a0c13SJung-uk Kim  * are met:
122313a0c13SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123313a0c13SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124313a0c13SJung-uk Kim  *    without modification.
125313a0c13SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126313a0c13SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127313a0c13SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128313a0c13SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129313a0c13SJung-uk Kim  *    binary redistribution.
130313a0c13SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131313a0c13SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132313a0c13SJung-uk Kim  *    from this software without specific prior written permission.
133313a0c13SJung-uk Kim  *
1340d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim  *
1460d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
147313a0c13SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148313a0c13SJung-uk Kim  * Software Foundation.
149313a0c13SJung-uk Kim  *
1500d84335fSJung-uk Kim  *****************************************************************************/
151313a0c13SJung-uk Kim 
152313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
153313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
154313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
155313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
156493deb39SJung-uk Kim #include <contrib/dev/acpica/include/acevents.h>
157313a0c13SJung-uk Kim 
158313a0c13SJung-uk Kim #define _COMPONENT          ACPI_TABLES
159313a0c13SJung-uk Kim         ACPI_MODULE_NAME    ("tbdata")
160313a0c13SJung-uk Kim 
1615f9b24faSJung-uk Kim /* Local prototypes */
1625f9b24faSJung-uk Kim 
1635f9b24faSJung-uk Kim static ACPI_STATUS
1645f9b24faSJung-uk Kim AcpiTbCheckDuplication (
1655f9b24faSJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
1665f9b24faSJung-uk Kim     UINT32                  *TableIndex);
1675f9b24faSJung-uk Kim 
1685f9b24faSJung-uk Kim static BOOLEAN
1695f9b24faSJung-uk Kim AcpiTbCompareTables (
1705f9b24faSJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
1715f9b24faSJung-uk Kim     UINT32                  TableIndex);
1725f9b24faSJung-uk Kim 
1735f9b24faSJung-uk Kim 
1745f9b24faSJung-uk Kim /*******************************************************************************
1755f9b24faSJung-uk Kim  *
1765f9b24faSJung-uk Kim  * FUNCTION:    AcpiTbCompareTables
1775f9b24faSJung-uk Kim  *
1785f9b24faSJung-uk Kim  * PARAMETERS:  TableDesc           - Table 1 descriptor to be compared
1795f9b24faSJung-uk Kim  *              TableIndex          - Index of table 2 to be compared
1805f9b24faSJung-uk Kim  *
1815f9b24faSJung-uk Kim  * RETURN:      TRUE if both tables are identical.
1825f9b24faSJung-uk Kim  *
1835f9b24faSJung-uk Kim  * DESCRIPTION: This function compares a table with another table that has
1845f9b24faSJung-uk Kim  *              already been installed in the root table list.
1855f9b24faSJung-uk Kim  *
1865f9b24faSJung-uk Kim  ******************************************************************************/
1875f9b24faSJung-uk Kim 
1885f9b24faSJung-uk Kim static BOOLEAN
1895f9b24faSJung-uk Kim AcpiTbCompareTables (
1905f9b24faSJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
1915f9b24faSJung-uk Kim     UINT32                  TableIndex)
1925f9b24faSJung-uk Kim {
1935f9b24faSJung-uk Kim     ACPI_STATUS             Status = AE_OK;
1945f9b24faSJung-uk Kim     BOOLEAN                 IsIdentical;
1955f9b24faSJung-uk Kim     ACPI_TABLE_HEADER       *Table;
1965f9b24faSJung-uk Kim     UINT32                  TableLength;
1975f9b24faSJung-uk Kim     UINT8                   TableFlags;
1985f9b24faSJung-uk Kim 
1995f9b24faSJung-uk Kim 
2005f9b24faSJung-uk Kim     Status = AcpiTbAcquireTable (&AcpiGbl_RootTableList.Tables[TableIndex],
2015f9b24faSJung-uk Kim         &Table, &TableLength, &TableFlags);
2025f9b24faSJung-uk Kim     if (ACPI_FAILURE (Status))
2035f9b24faSJung-uk Kim     {
2045f9b24faSJung-uk Kim         return (FALSE);
2055f9b24faSJung-uk Kim     }
2065f9b24faSJung-uk Kim 
2075f9b24faSJung-uk Kim     /*
2085f9b24faSJung-uk Kim      * Check for a table match on the entire table length,
2095f9b24faSJung-uk Kim      * not just the header.
2105f9b24faSJung-uk Kim      */
2115f9b24faSJung-uk Kim     IsIdentical = (BOOLEAN)((TableDesc->Length != TableLength ||
2125f9b24faSJung-uk Kim         memcmp (TableDesc->Pointer, Table, TableLength)) ?
2135f9b24faSJung-uk Kim         FALSE : TRUE);
2145f9b24faSJung-uk Kim 
2155f9b24faSJung-uk Kim     /* Release the acquired table */
2165f9b24faSJung-uk Kim 
2175f9b24faSJung-uk Kim     AcpiTbReleaseTable (Table, TableLength, TableFlags);
2185f9b24faSJung-uk Kim     return (IsIdentical);
2195f9b24faSJung-uk Kim }
2205f9b24faSJung-uk Kim 
221313a0c13SJung-uk Kim 
222313a0c13SJung-uk Kim /*******************************************************************************
223313a0c13SJung-uk Kim  *
224313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbInitTableDescriptor
225313a0c13SJung-uk Kim  *
226313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc               - Table descriptor
227313a0c13SJung-uk Kim  *              Address                 - Physical address of the table
228313a0c13SJung-uk Kim  *              Flags                   - Allocation flags of the table
229313a0c13SJung-uk Kim  *              Table                   - Pointer to the table
230313a0c13SJung-uk Kim  *
231313a0c13SJung-uk Kim  * RETURN:      None
232313a0c13SJung-uk Kim  *
233313a0c13SJung-uk Kim  * DESCRIPTION: Initialize a new table descriptor
234313a0c13SJung-uk Kim  *
235313a0c13SJung-uk Kim  ******************************************************************************/
236313a0c13SJung-uk Kim 
237313a0c13SJung-uk Kim void
238313a0c13SJung-uk Kim AcpiTbInitTableDescriptor (
239313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
240313a0c13SJung-uk Kim     ACPI_PHYSICAL_ADDRESS   Address,
241313a0c13SJung-uk Kim     UINT8                   Flags,
242313a0c13SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
243313a0c13SJung-uk Kim {
244313a0c13SJung-uk Kim 
245313a0c13SJung-uk Kim     /*
246ab71bbb7SJung-uk Kim      * Initialize the table descriptor. Set the pointer to NULL for external
247ab71bbb7SJung-uk Kim      * tables, since the table is not fully mapped at this time.
248313a0c13SJung-uk Kim      */
2495ef50723SJung-uk Kim     memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC));
250313a0c13SJung-uk Kim     TableDesc->Address = Address;
251313a0c13SJung-uk Kim     TableDesc->Length = Table->Length;
252313a0c13SJung-uk Kim     TableDesc->Flags = Flags;
253313a0c13SJung-uk Kim     ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
254ab71bbb7SJung-uk Kim 
255ab71bbb7SJung-uk Kim     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
256ab71bbb7SJung-uk Kim     {
257ab71bbb7SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
258ab71bbb7SJung-uk Kim     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
259ab71bbb7SJung-uk Kim 
260ab71bbb7SJung-uk Kim         TableDesc->Pointer = Table;
261ab71bbb7SJung-uk Kim         break;
262ab71bbb7SJung-uk Kim 
263ab71bbb7SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
264ab71bbb7SJung-uk Kim     default:
265ab71bbb7SJung-uk Kim 
266ab71bbb7SJung-uk Kim         break;
267ab71bbb7SJung-uk Kim     }
268313a0c13SJung-uk Kim }
269313a0c13SJung-uk Kim 
270313a0c13SJung-uk Kim 
271313a0c13SJung-uk Kim /*******************************************************************************
272313a0c13SJung-uk Kim  *
273313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbAcquireTable
274313a0c13SJung-uk Kim  *
275313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor
276313a0c13SJung-uk Kim  *              TablePtr            - Where table is returned
277313a0c13SJung-uk Kim  *              TableLength         - Where table length is returned
278313a0c13SJung-uk Kim  *              TableFlags          - Where table allocation flags are returned
279313a0c13SJung-uk Kim  *
280313a0c13SJung-uk Kim  * RETURN:      Status
281313a0c13SJung-uk Kim  *
282313a0c13SJung-uk Kim  * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
283313a0c13SJung-uk Kim  *              maintained in the AcpiGbl_RootTableList.
284313a0c13SJung-uk Kim  *
285313a0c13SJung-uk Kim  ******************************************************************************/
286313a0c13SJung-uk Kim 
287313a0c13SJung-uk Kim ACPI_STATUS
288313a0c13SJung-uk Kim AcpiTbAcquireTable (
289313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
290313a0c13SJung-uk Kim     ACPI_TABLE_HEADER       **TablePtr,
291313a0c13SJung-uk Kim     UINT32                  *TableLength,
292313a0c13SJung-uk Kim     UINT8                   *TableFlags)
293313a0c13SJung-uk Kim {
294313a0c13SJung-uk Kim     ACPI_TABLE_HEADER       *Table = NULL;
295313a0c13SJung-uk Kim 
296313a0c13SJung-uk Kim 
297313a0c13SJung-uk Kim     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
298313a0c13SJung-uk Kim     {
299313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
300313a0c13SJung-uk Kim 
301313a0c13SJung-uk Kim         Table = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
302313a0c13SJung-uk Kim         break;
303313a0c13SJung-uk Kim 
304313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
305313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
306313a0c13SJung-uk Kim 
307ab71bbb7SJung-uk Kim         Table = TableDesc->Pointer;
308313a0c13SJung-uk Kim         break;
309313a0c13SJung-uk Kim 
310313a0c13SJung-uk Kim     default:
311313a0c13SJung-uk Kim 
312313a0c13SJung-uk Kim         break;
313313a0c13SJung-uk Kim     }
314313a0c13SJung-uk Kim 
315313a0c13SJung-uk Kim     /* Table is not valid yet */
316313a0c13SJung-uk Kim 
317313a0c13SJung-uk Kim     if (!Table)
318313a0c13SJung-uk Kim     {
319313a0c13SJung-uk Kim         return (AE_NO_MEMORY);
320313a0c13SJung-uk Kim     }
321313a0c13SJung-uk Kim 
322313a0c13SJung-uk Kim     /* Fill the return values */
323313a0c13SJung-uk Kim 
324313a0c13SJung-uk Kim     *TablePtr = Table;
325313a0c13SJung-uk Kim     *TableLength = TableDesc->Length;
326313a0c13SJung-uk Kim     *TableFlags = TableDesc->Flags;
327313a0c13SJung-uk Kim     return (AE_OK);
328313a0c13SJung-uk Kim }
329313a0c13SJung-uk Kim 
330313a0c13SJung-uk Kim 
331313a0c13SJung-uk Kim /*******************************************************************************
332313a0c13SJung-uk Kim  *
333313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbReleaseTable
334313a0c13SJung-uk Kim  *
335313a0c13SJung-uk Kim  * PARAMETERS:  Table               - Pointer for the table
336313a0c13SJung-uk Kim  *              TableLength         - Length for the table
337313a0c13SJung-uk Kim  *              TableFlags          - Allocation flags for the table
338313a0c13SJung-uk Kim  *
339313a0c13SJung-uk Kim  * RETURN:      None
340313a0c13SJung-uk Kim  *
341313a0c13SJung-uk Kim  * DESCRIPTION: Release a table. The inverse of AcpiTbAcquireTable().
342313a0c13SJung-uk Kim  *
343313a0c13SJung-uk Kim  ******************************************************************************/
344313a0c13SJung-uk Kim 
345313a0c13SJung-uk Kim void
346313a0c13SJung-uk Kim AcpiTbReleaseTable (
347313a0c13SJung-uk Kim     ACPI_TABLE_HEADER       *Table,
348313a0c13SJung-uk Kim     UINT32                  TableLength,
349313a0c13SJung-uk Kim     UINT8                   TableFlags)
350313a0c13SJung-uk Kim {
351313a0c13SJung-uk Kim 
352313a0c13SJung-uk Kim     switch (TableFlags & ACPI_TABLE_ORIGIN_MASK)
353313a0c13SJung-uk Kim     {
354313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
355313a0c13SJung-uk Kim 
356313a0c13SJung-uk Kim         AcpiOsUnmapMemory (Table, TableLength);
357313a0c13SJung-uk Kim         break;
358313a0c13SJung-uk Kim 
359313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
360313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
361313a0c13SJung-uk Kim     default:
362313a0c13SJung-uk Kim 
363313a0c13SJung-uk Kim         break;
364313a0c13SJung-uk Kim     }
365313a0c13SJung-uk Kim }
366313a0c13SJung-uk Kim 
367313a0c13SJung-uk Kim 
368313a0c13SJung-uk Kim /*******************************************************************************
369313a0c13SJung-uk Kim  *
370313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbAcquireTempTable
371313a0c13SJung-uk Kim  *
372313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor to be acquired
373313a0c13SJung-uk Kim  *              Address             - Address of the table
374313a0c13SJung-uk Kim  *              Flags               - Allocation flags of the table
375ab71bbb7SJung-uk Kim  *              Table               - Pointer to the table (required for virtual
376ab71bbb7SJung-uk Kim  *                                    origins, optional for physical)
377313a0c13SJung-uk Kim  *
378313a0c13SJung-uk Kim  * RETURN:      Status
379313a0c13SJung-uk Kim  *
380313a0c13SJung-uk Kim  * DESCRIPTION: This function validates the table header to obtain the length
381313a0c13SJung-uk Kim  *              of a table and fills the table descriptor to make its state as
382313a0c13SJung-uk Kim  *              "INSTALLED". Such a table descriptor is only used for verified
383313a0c13SJung-uk Kim  *              installation.
384313a0c13SJung-uk Kim  *
385313a0c13SJung-uk Kim  ******************************************************************************/
386313a0c13SJung-uk Kim 
387313a0c13SJung-uk Kim ACPI_STATUS
388313a0c13SJung-uk Kim AcpiTbAcquireTempTable (
389313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
390313a0c13SJung-uk Kim     ACPI_PHYSICAL_ADDRESS   Address,
391ab71bbb7SJung-uk Kim     UINT8                   Flags,
392ab71bbb7SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
393313a0c13SJung-uk Kim {
394ab71bbb7SJung-uk Kim     BOOLEAN                 MappedTable = FALSE;
395313a0c13SJung-uk Kim 
396313a0c13SJung-uk Kim 
397313a0c13SJung-uk Kim     switch (Flags & ACPI_TABLE_ORIGIN_MASK)
398313a0c13SJung-uk Kim     {
399313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
400313a0c13SJung-uk Kim 
401313a0c13SJung-uk Kim         /* Get the length of the full table from the header */
402313a0c13SJung-uk Kim 
403ab71bbb7SJung-uk Kim         if (!Table)
404ab71bbb7SJung-uk Kim         {
405ab71bbb7SJung-uk Kim             Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
406ab71bbb7SJung-uk Kim             if (!Table)
407313a0c13SJung-uk Kim             {
408313a0c13SJung-uk Kim                 return (AE_NO_MEMORY);
409313a0c13SJung-uk Kim             }
410313a0c13SJung-uk Kim 
411ab71bbb7SJung-uk Kim             MappedTable = TRUE;
412ab71bbb7SJung-uk Kim         }
413ab71bbb7SJung-uk Kim 
414ab71bbb7SJung-uk Kim         break;
415313a0c13SJung-uk Kim 
416313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
417313a0c13SJung-uk Kim     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
418313a0c13SJung-uk Kim 
419ab71bbb7SJung-uk Kim         if (!Table)
420313a0c13SJung-uk Kim         {
421ab71bbb7SJung-uk Kim             return (AE_BAD_PARAMETER);
422313a0c13SJung-uk Kim         }
423313a0c13SJung-uk Kim 
424313a0c13SJung-uk Kim         break;
425ab71bbb7SJung-uk Kim 
426ab71bbb7SJung-uk Kim     default:
427313a0c13SJung-uk Kim 
428313a0c13SJung-uk Kim         /* Table is not valid yet */
429313a0c13SJung-uk Kim 
430313a0c13SJung-uk Kim         return (AE_NO_MEMORY);
431313a0c13SJung-uk Kim     }
432313a0c13SJung-uk Kim 
433ab71bbb7SJung-uk Kim     AcpiTbInitTableDescriptor (TableDesc, Address, Flags, Table);
434ab71bbb7SJung-uk Kim     if (MappedTable)
435ab71bbb7SJung-uk Kim     {
436ab71bbb7SJung-uk Kim         AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER));
437ab71bbb7SJung-uk Kim     }
438ab71bbb7SJung-uk Kim 
439ab71bbb7SJung-uk Kim     return (AE_OK);
440ab71bbb7SJung-uk Kim }
441ab71bbb7SJung-uk Kim 
442313a0c13SJung-uk Kim 
443313a0c13SJung-uk Kim /*******************************************************************************
444313a0c13SJung-uk Kim  *
445313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbReleaseTempTable
446313a0c13SJung-uk Kim  *
447313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor to be released
448313a0c13SJung-uk Kim  *
449313a0c13SJung-uk Kim  * RETURN:      Status
450313a0c13SJung-uk Kim  *
451313a0c13SJung-uk Kim  * DESCRIPTION: The inverse of AcpiTbAcquireTempTable().
452313a0c13SJung-uk Kim  *
453313a0c13SJung-uk Kim  *****************************************************************************/
454313a0c13SJung-uk Kim 
455313a0c13SJung-uk Kim void
456313a0c13SJung-uk Kim AcpiTbReleaseTempTable (
457313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc)
458313a0c13SJung-uk Kim {
459313a0c13SJung-uk Kim 
460313a0c13SJung-uk Kim     /*
461313a0c13SJung-uk Kim      * Note that the .Address is maintained by the callers of
462313a0c13SJung-uk Kim      * AcpiTbAcquireTempTable(), thus do not invoke AcpiTbUninstallTable()
463313a0c13SJung-uk Kim      * where .Address will be freed.
464313a0c13SJung-uk Kim      */
465313a0c13SJung-uk Kim     AcpiTbInvalidateTable (TableDesc);
466313a0c13SJung-uk Kim }
467313a0c13SJung-uk Kim 
468313a0c13SJung-uk Kim 
469313a0c13SJung-uk Kim /******************************************************************************
470313a0c13SJung-uk Kim  *
471313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbValidateTable
472313a0c13SJung-uk Kim  *
473313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor
474313a0c13SJung-uk Kim  *
475313a0c13SJung-uk Kim  * RETURN:      Status
476313a0c13SJung-uk Kim  *
477313a0c13SJung-uk Kim  * DESCRIPTION: This function is called to validate the table, the returned
478313a0c13SJung-uk Kim  *              table descriptor is in "VALIDATED" state.
479313a0c13SJung-uk Kim  *
480313a0c13SJung-uk Kim  *****************************************************************************/
481313a0c13SJung-uk Kim 
482313a0c13SJung-uk Kim ACPI_STATUS
483313a0c13SJung-uk Kim AcpiTbValidateTable (
484313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc)
485313a0c13SJung-uk Kim {
486313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
487313a0c13SJung-uk Kim 
488313a0c13SJung-uk Kim 
489313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbValidateTable);
490313a0c13SJung-uk Kim 
491313a0c13SJung-uk Kim 
492313a0c13SJung-uk Kim     /* Validate the table if necessary */
493313a0c13SJung-uk Kim 
494313a0c13SJung-uk Kim     if (!TableDesc->Pointer)
495313a0c13SJung-uk Kim     {
496313a0c13SJung-uk Kim         Status = AcpiTbAcquireTable (TableDesc, &TableDesc->Pointer,
497313a0c13SJung-uk Kim             &TableDesc->Length, &TableDesc->Flags);
498313a0c13SJung-uk Kim         if (!TableDesc->Pointer)
499313a0c13SJung-uk Kim         {
500313a0c13SJung-uk Kim             Status = AE_NO_MEMORY;
501313a0c13SJung-uk Kim         }
502313a0c13SJung-uk Kim     }
503313a0c13SJung-uk Kim 
504313a0c13SJung-uk Kim     return_ACPI_STATUS (Status);
505313a0c13SJung-uk Kim }
506313a0c13SJung-uk Kim 
507313a0c13SJung-uk Kim 
508313a0c13SJung-uk Kim /*******************************************************************************
509313a0c13SJung-uk Kim  *
510313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbInvalidateTable
511313a0c13SJung-uk Kim  *
512313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor
513313a0c13SJung-uk Kim  *
514313a0c13SJung-uk Kim  * RETURN:      None
515313a0c13SJung-uk Kim  *
516313a0c13SJung-uk Kim  * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
517313a0c13SJung-uk Kim  *              AcpiTbValidateTable().
518313a0c13SJung-uk Kim  *
519313a0c13SJung-uk Kim  ******************************************************************************/
520313a0c13SJung-uk Kim 
521313a0c13SJung-uk Kim void
522313a0c13SJung-uk Kim AcpiTbInvalidateTable (
523313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc)
524313a0c13SJung-uk Kim {
525313a0c13SJung-uk Kim 
526313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbInvalidateTable);
527313a0c13SJung-uk Kim 
528313a0c13SJung-uk Kim 
529313a0c13SJung-uk Kim     /* Table must be validated */
530313a0c13SJung-uk Kim 
531313a0c13SJung-uk Kim     if (!TableDesc->Pointer)
532313a0c13SJung-uk Kim     {
533313a0c13SJung-uk Kim         return_VOID;
534313a0c13SJung-uk Kim     }
535313a0c13SJung-uk Kim 
536313a0c13SJung-uk Kim     AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length,
537313a0c13SJung-uk Kim         TableDesc->Flags);
538ab71bbb7SJung-uk Kim 
539ab71bbb7SJung-uk Kim     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
540ab71bbb7SJung-uk Kim     {
541ab71bbb7SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
542ab71bbb7SJung-uk Kim 
543313a0c13SJung-uk Kim         TableDesc->Pointer = NULL;
544ab71bbb7SJung-uk Kim         break;
545ab71bbb7SJung-uk Kim 
546ab71bbb7SJung-uk Kim     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
547ab71bbb7SJung-uk Kim     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
548ab71bbb7SJung-uk Kim     default:
549ab71bbb7SJung-uk Kim 
550ab71bbb7SJung-uk Kim         break;
551ab71bbb7SJung-uk Kim     }
552313a0c13SJung-uk Kim 
553313a0c13SJung-uk Kim     return_VOID;
554313a0c13SJung-uk Kim }
555313a0c13SJung-uk Kim 
556313a0c13SJung-uk Kim 
557313a0c13SJung-uk Kim /******************************************************************************
558313a0c13SJung-uk Kim  *
559313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbValidateTempTable
560313a0c13SJung-uk Kim  *
561313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor
562313a0c13SJung-uk Kim  *
563313a0c13SJung-uk Kim  * RETURN:      Status
564313a0c13SJung-uk Kim  *
565313a0c13SJung-uk Kim  * DESCRIPTION: This function is called to validate the table, the returned
566313a0c13SJung-uk Kim  *              table descriptor is in "VALIDATED" state.
567313a0c13SJung-uk Kim  *
568313a0c13SJung-uk Kim  *****************************************************************************/
569313a0c13SJung-uk Kim 
570313a0c13SJung-uk Kim ACPI_STATUS
571313a0c13SJung-uk Kim AcpiTbValidateTempTable (
572313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc)
573313a0c13SJung-uk Kim {
574313a0c13SJung-uk Kim 
5755f9b24faSJung-uk Kim     if (!TableDesc->Pointer && !AcpiGbl_EnableTableValidation)
576313a0c13SJung-uk Kim     {
577313a0c13SJung-uk Kim         /*
578313a0c13SJung-uk Kim          * Only validates the header of the table.
579313a0c13SJung-uk Kim          * Note that Length contains the size of the mapping after invoking
580313a0c13SJung-uk Kim          * this work around, this value is required by
581313a0c13SJung-uk Kim          * AcpiTbReleaseTempTable().
582313a0c13SJung-uk Kim          * We can do this because in AcpiInitTableDescriptor(), the Length
583313a0c13SJung-uk Kim          * field of the installed descriptor is filled with the actual
584313a0c13SJung-uk Kim          * table length obtaining from the table header.
585313a0c13SJung-uk Kim          */
586313a0c13SJung-uk Kim         TableDesc->Length = sizeof (ACPI_TABLE_HEADER);
587313a0c13SJung-uk Kim     }
588313a0c13SJung-uk Kim 
589313a0c13SJung-uk Kim     return (AcpiTbValidateTable (TableDesc));
590313a0c13SJung-uk Kim }
591313a0c13SJung-uk Kim 
592313a0c13SJung-uk Kim 
5935f9b24faSJung-uk Kim /*******************************************************************************
5945f9b24faSJung-uk Kim  *
5955f9b24faSJung-uk Kim  * FUNCTION:    AcpiTbCheckDuplication
5965f9b24faSJung-uk Kim  *
5975f9b24faSJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor
5985f9b24faSJung-uk Kim  *              TableIndex          - Where the table index is returned
5995f9b24faSJung-uk Kim  *
6005f9b24faSJung-uk Kim  * RETURN:      Status
6015f9b24faSJung-uk Kim  *
6025f9b24faSJung-uk Kim  * DESCRIPTION: Avoid installing duplicated tables. However table override and
6035f9b24faSJung-uk Kim  *              user aided dynamic table load is allowed, thus comparing the
6045f9b24faSJung-uk Kim  *              address of the table is not sufficient, and checking the entire
6055f9b24faSJung-uk Kim  *              table content is required.
6065f9b24faSJung-uk Kim  *
6075f9b24faSJung-uk Kim  ******************************************************************************/
6085f9b24faSJung-uk Kim 
6095f9b24faSJung-uk Kim static ACPI_STATUS
6105f9b24faSJung-uk Kim AcpiTbCheckDuplication (
6115f9b24faSJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
6125f9b24faSJung-uk Kim     UINT32                  *TableIndex)
6135f9b24faSJung-uk Kim {
6145f9b24faSJung-uk Kim     UINT32                  i;
6155f9b24faSJung-uk Kim 
6165f9b24faSJung-uk Kim 
6175f9b24faSJung-uk Kim     ACPI_FUNCTION_TRACE (TbCheckDuplication);
6185f9b24faSJung-uk Kim 
6195f9b24faSJung-uk Kim 
6205f9b24faSJung-uk Kim     /* Check if table is already registered */
6215f9b24faSJung-uk Kim 
6225f9b24faSJung-uk Kim     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
6235f9b24faSJung-uk Kim     {
6245f9b24faSJung-uk Kim         /* Do not compare with unverified tables */
6255f9b24faSJung-uk Kim 
6265f9b24faSJung-uk Kim         if (!(AcpiGbl_RootTableList.Tables[i].Flags & ACPI_TABLE_IS_VERIFIED))
6275f9b24faSJung-uk Kim         {
6285f9b24faSJung-uk Kim             continue;
6295f9b24faSJung-uk Kim         }
6305f9b24faSJung-uk Kim 
6315f9b24faSJung-uk Kim         /*
6325f9b24faSJung-uk Kim          * Check for a table match on the entire table length,
6335f9b24faSJung-uk Kim          * not just the header.
6345f9b24faSJung-uk Kim          */
6355f9b24faSJung-uk Kim         if (!AcpiTbCompareTables (TableDesc, i))
6365f9b24faSJung-uk Kim         {
6375f9b24faSJung-uk Kim             continue;
6385f9b24faSJung-uk Kim         }
6395f9b24faSJung-uk Kim 
6405f9b24faSJung-uk Kim         /*
6415f9b24faSJung-uk Kim          * Note: the current mechanism does not unregister a table if it is
6425f9b24faSJung-uk Kim          * dynamically unloaded. The related namespace entries are deleted,
6435f9b24faSJung-uk Kim          * but the table remains in the root table list.
6445f9b24faSJung-uk Kim          *
6455f9b24faSJung-uk Kim          * The assumption here is that the number of different tables that
6465f9b24faSJung-uk Kim          * will be loaded is actually small, and there is minimal overhead
6475f9b24faSJung-uk Kim          * in just keeping the table in case it is needed again.
6485f9b24faSJung-uk Kim          *
6495f9b24faSJung-uk Kim          * If this assumption changes in the future (perhaps on large
6505f9b24faSJung-uk Kim          * machines with many table load/unload operations), tables will
6515f9b24faSJung-uk Kim          * need to be unregistered when they are unloaded, and slots in the
6525f9b24faSJung-uk Kim          * root table list should be reused when empty.
6535f9b24faSJung-uk Kim          */
6545f9b24faSJung-uk Kim         if (AcpiGbl_RootTableList.Tables[i].Flags &
6555f9b24faSJung-uk Kim             ACPI_TABLE_IS_LOADED)
6565f9b24faSJung-uk Kim         {
6575f9b24faSJung-uk Kim             /* Table is still loaded, this is an error */
6585f9b24faSJung-uk Kim 
6595f9b24faSJung-uk Kim             return_ACPI_STATUS (AE_ALREADY_EXISTS);
6605f9b24faSJung-uk Kim         }
6615f9b24faSJung-uk Kim         else
6625f9b24faSJung-uk Kim         {
6635f9b24faSJung-uk Kim             *TableIndex = i;
6645f9b24faSJung-uk Kim             return_ACPI_STATUS (AE_CTRL_TERMINATE);
6655f9b24faSJung-uk Kim         }
6665f9b24faSJung-uk Kim     }
6675f9b24faSJung-uk Kim 
6685f9b24faSJung-uk Kim     /* Indicate no duplication to the caller */
6695f9b24faSJung-uk Kim 
6705f9b24faSJung-uk Kim     return_ACPI_STATUS (AE_OK);
6715f9b24faSJung-uk Kim }
6725f9b24faSJung-uk Kim 
6735f9b24faSJung-uk Kim 
674313a0c13SJung-uk Kim /******************************************************************************
675313a0c13SJung-uk Kim  *
676313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbVerifyTempTable
677313a0c13SJung-uk Kim  *
678313a0c13SJung-uk Kim  * PARAMETERS:  TableDesc           - Table descriptor
679313a0c13SJung-uk Kim  *              Signature           - Table signature to verify
6805f9b24faSJung-uk Kim  *              TableIndex          - Where the table index is returned
681313a0c13SJung-uk Kim  *
682313a0c13SJung-uk Kim  * RETURN:      Status
683313a0c13SJung-uk Kim  *
684313a0c13SJung-uk Kim  * DESCRIPTION: This function is called to validate and verify the table, the
685313a0c13SJung-uk Kim  *              returned table descriptor is in "VALIDATED" state.
6865f9b24faSJung-uk Kim  *              Note that 'TableIndex' is required to be set to !NULL to
6875f9b24faSJung-uk Kim  *              enable duplication check.
688313a0c13SJung-uk Kim  *
689313a0c13SJung-uk Kim  *****************************************************************************/
690313a0c13SJung-uk Kim 
691313a0c13SJung-uk Kim ACPI_STATUS
692313a0c13SJung-uk Kim AcpiTbVerifyTempTable (
693313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc,
6945f9b24faSJung-uk Kim     char                    *Signature,
6955f9b24faSJung-uk Kim     UINT32                  *TableIndex)
696313a0c13SJung-uk Kim {
697313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
698313a0c13SJung-uk Kim 
699313a0c13SJung-uk Kim 
700313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbVerifyTempTable);
701313a0c13SJung-uk Kim 
702313a0c13SJung-uk Kim 
703313a0c13SJung-uk Kim     /* Validate the table */
704313a0c13SJung-uk Kim 
705313a0c13SJung-uk Kim     Status = AcpiTbValidateTempTable (TableDesc);
706313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
707313a0c13SJung-uk Kim     {
708313a0c13SJung-uk Kim         return_ACPI_STATUS (AE_NO_MEMORY);
709313a0c13SJung-uk Kim     }
710313a0c13SJung-uk Kim 
711313a0c13SJung-uk Kim     /* If a particular signature is expected (DSDT/FACS), it must match */
712313a0c13SJung-uk Kim 
713313a0c13SJung-uk Kim     if (Signature &&
714278f0de6SJung-uk Kim         !ACPI_COMPARE_NAMESEG (&TableDesc->Signature, Signature))
715313a0c13SJung-uk Kim     {
716313a0c13SJung-uk Kim         ACPI_BIOS_ERROR ((AE_INFO,
717313a0c13SJung-uk Kim             "Invalid signature 0x%X for ACPI table, expected [%s]",
718313a0c13SJung-uk Kim             TableDesc->Signature.Integer, Signature));
719313a0c13SJung-uk Kim         Status = AE_BAD_SIGNATURE;
720313a0c13SJung-uk Kim         goto InvalidateAndExit;
721313a0c13SJung-uk Kim     }
722313a0c13SJung-uk Kim 
7235f9b24faSJung-uk Kim     if (AcpiGbl_EnableTableValidation)
7245f9b24faSJung-uk Kim     {
725313a0c13SJung-uk Kim         /* Verify the checksum */
726313a0c13SJung-uk Kim 
7279a4bc520SJung-uk Kim         Status = AcpiUtVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
728313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
729313a0c13SJung-uk Kim         {
730313a0c13SJung-uk Kim             ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
7317cf3e94aSJung-uk Kim                 "%4.4s 0x%8.8X%8.8X"
732313a0c13SJung-uk Kim                 " Attempted table install failed",
733f8146b88SJung-uk Kim                 AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
734313a0c13SJung-uk Kim                     TableDesc->Signature.Ascii : "????",
7357cf3e94aSJung-uk Kim                 ACPI_FORMAT_UINT64 (TableDesc->Address)));
736f8146b88SJung-uk Kim 
737313a0c13SJung-uk Kim             goto InvalidateAndExit;
738313a0c13SJung-uk Kim         }
7395f9b24faSJung-uk Kim 
7405f9b24faSJung-uk Kim         /* Avoid duplications */
7415f9b24faSJung-uk Kim 
7425f9b24faSJung-uk Kim         if (TableIndex)
7435f9b24faSJung-uk Kim         {
7445f9b24faSJung-uk Kim             Status = AcpiTbCheckDuplication (TableDesc, TableIndex);
7455f9b24faSJung-uk Kim             if (ACPI_FAILURE (Status))
7465f9b24faSJung-uk Kim             {
7475f9b24faSJung-uk Kim                 if (Status != AE_CTRL_TERMINATE)
7485f9b24faSJung-uk Kim                 {
74951f42badSJung-uk Kim                     ACPI_EXCEPTION ((AE_INFO, Status,
7505f9b24faSJung-uk Kim                         "%4.4s 0x%8.8X%8.8X"
75151f42badSJung-uk Kim                         " Table is already loaded",
7525f9b24faSJung-uk Kim                         AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
7535f9b24faSJung-uk Kim                             TableDesc->Signature.Ascii : "????",
7545f9b24faSJung-uk Kim                         ACPI_FORMAT_UINT64 (TableDesc->Address)));
755313a0c13SJung-uk Kim                 }
756313a0c13SJung-uk Kim 
7575f9b24faSJung-uk Kim                 goto InvalidateAndExit;
7585f9b24faSJung-uk Kim             }
7595f9b24faSJung-uk Kim         }
7605f9b24faSJung-uk Kim 
7615f9b24faSJung-uk Kim         TableDesc->Flags |= ACPI_TABLE_IS_VERIFIED;
7625f9b24faSJung-uk Kim     }
7635f9b24faSJung-uk Kim 
7645f9b24faSJung-uk Kim     return_ACPI_STATUS (Status);
765313a0c13SJung-uk Kim 
766313a0c13SJung-uk Kim InvalidateAndExit:
767313a0c13SJung-uk Kim     AcpiTbInvalidateTable (TableDesc);
768313a0c13SJung-uk Kim     return_ACPI_STATUS (Status);
769313a0c13SJung-uk Kim }
770313a0c13SJung-uk Kim 
771313a0c13SJung-uk Kim 
772313a0c13SJung-uk Kim /*******************************************************************************
773313a0c13SJung-uk Kim  *
774313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbResizeRootTableList
775313a0c13SJung-uk Kim  *
776313a0c13SJung-uk Kim  * PARAMETERS:  None
777313a0c13SJung-uk Kim  *
778313a0c13SJung-uk Kim  * RETURN:      Status
779313a0c13SJung-uk Kim  *
780313a0c13SJung-uk Kim  * DESCRIPTION: Expand the size of global table array
781313a0c13SJung-uk Kim  *
782313a0c13SJung-uk Kim  ******************************************************************************/
783313a0c13SJung-uk Kim 
784313a0c13SJung-uk Kim ACPI_STATUS
785313a0c13SJung-uk Kim AcpiTbResizeRootTableList (
786313a0c13SJung-uk Kim     void)
787313a0c13SJung-uk Kim {
788313a0c13SJung-uk Kim     ACPI_TABLE_DESC         *Tables;
789313a0c13SJung-uk Kim     UINT32                  TableCount;
7905f9b24faSJung-uk Kim     UINT32                  CurrentTableCount, MaxTableCount;
7915f9b24faSJung-uk Kim     UINT32                  i;
792313a0c13SJung-uk Kim 
793313a0c13SJung-uk Kim 
794313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbResizeRootTableList);
795313a0c13SJung-uk Kim 
796313a0c13SJung-uk Kim 
797313a0c13SJung-uk Kim     /* AllowResize flag is a parameter to AcpiInitializeTables */
798313a0c13SJung-uk Kim 
799313a0c13SJung-uk Kim     if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
800313a0c13SJung-uk Kim     {
801313a0c13SJung-uk Kim         ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
802313a0c13SJung-uk Kim         return_ACPI_STATUS (AE_SUPPORT);
803313a0c13SJung-uk Kim     }
804313a0c13SJung-uk Kim 
805313a0c13SJung-uk Kim     /* Increase the Table Array size */
806313a0c13SJung-uk Kim 
807313a0c13SJung-uk Kim     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
808313a0c13SJung-uk Kim     {
809313a0c13SJung-uk Kim         TableCount = AcpiGbl_RootTableList.MaxTableCount;
810313a0c13SJung-uk Kim     }
811313a0c13SJung-uk Kim     else
812313a0c13SJung-uk Kim     {
813313a0c13SJung-uk Kim         TableCount = AcpiGbl_RootTableList.CurrentTableCount;
814313a0c13SJung-uk Kim     }
815313a0c13SJung-uk Kim 
8165f9b24faSJung-uk Kim     MaxTableCount = TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
817313a0c13SJung-uk Kim     Tables = ACPI_ALLOCATE_ZEROED (
8185f9b24faSJung-uk Kim         ((ACPI_SIZE) MaxTableCount) * sizeof (ACPI_TABLE_DESC));
819313a0c13SJung-uk Kim     if (!Tables)
820313a0c13SJung-uk Kim     {
821313a0c13SJung-uk Kim         ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
822313a0c13SJung-uk Kim         return_ACPI_STATUS (AE_NO_MEMORY);
823313a0c13SJung-uk Kim     }
824313a0c13SJung-uk Kim 
825313a0c13SJung-uk Kim     /* Copy and free the previous table array */
826313a0c13SJung-uk Kim 
8275f9b24faSJung-uk Kim     CurrentTableCount = 0;
828313a0c13SJung-uk Kim     if (AcpiGbl_RootTableList.Tables)
829313a0c13SJung-uk Kim     {
8305f9b24faSJung-uk Kim         for (i = 0; i < TableCount; i++)
8315f9b24faSJung-uk Kim         {
8325f9b24faSJung-uk Kim             if (AcpiGbl_RootTableList.Tables[i].Address)
8335f9b24faSJung-uk Kim             {
8345f9b24faSJung-uk Kim                 memcpy (Tables + CurrentTableCount,
8355f9b24faSJung-uk Kim                     AcpiGbl_RootTableList.Tables + i,
8365f9b24faSJung-uk Kim                     sizeof (ACPI_TABLE_DESC));
8375f9b24faSJung-uk Kim                 CurrentTableCount++;
8385f9b24faSJung-uk Kim             }
8395f9b24faSJung-uk Kim         }
840313a0c13SJung-uk Kim 
841313a0c13SJung-uk Kim         if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
842313a0c13SJung-uk Kim         {
843313a0c13SJung-uk Kim             ACPI_FREE (AcpiGbl_RootTableList.Tables);
844313a0c13SJung-uk Kim         }
845313a0c13SJung-uk Kim     }
846313a0c13SJung-uk Kim 
847313a0c13SJung-uk Kim     AcpiGbl_RootTableList.Tables = Tables;
8485f9b24faSJung-uk Kim     AcpiGbl_RootTableList.MaxTableCount = MaxTableCount;
8495f9b24faSJung-uk Kim     AcpiGbl_RootTableList.CurrentTableCount = CurrentTableCount;
850313a0c13SJung-uk Kim     AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
851313a0c13SJung-uk Kim 
852313a0c13SJung-uk Kim     return_ACPI_STATUS (AE_OK);
853313a0c13SJung-uk Kim }
854313a0c13SJung-uk Kim 
855313a0c13SJung-uk Kim 
856313a0c13SJung-uk Kim /*******************************************************************************
857313a0c13SJung-uk Kim  *
8587cf3e94aSJung-uk Kim  * FUNCTION:    AcpiTbGetNextTableDescriptor
859313a0c13SJung-uk Kim  *
860313a0c13SJung-uk Kim  * PARAMETERS:  TableIndex          - Where table index is returned
8617cf3e94aSJung-uk Kim  *              TableDesc           - Where table descriptor is returned
862313a0c13SJung-uk Kim  *
8637cf3e94aSJung-uk Kim  * RETURN:      Status and table index/descriptor.
864313a0c13SJung-uk Kim  *
865313a0c13SJung-uk Kim  * DESCRIPTION: Allocate a new ACPI table entry to the global table list
866313a0c13SJung-uk Kim  *
867313a0c13SJung-uk Kim  ******************************************************************************/
868313a0c13SJung-uk Kim 
869313a0c13SJung-uk Kim ACPI_STATUS
8707cf3e94aSJung-uk Kim AcpiTbGetNextTableDescriptor (
8717cf3e94aSJung-uk Kim     UINT32                  *TableIndex,
8727cf3e94aSJung-uk Kim     ACPI_TABLE_DESC         **TableDesc)
873313a0c13SJung-uk Kim {
874313a0c13SJung-uk Kim     ACPI_STATUS             Status;
8757cf3e94aSJung-uk Kim     UINT32                  i;
876313a0c13SJung-uk Kim 
877313a0c13SJung-uk Kim 
878313a0c13SJung-uk Kim     /* Ensure that there is room for the table in the Root Table List */
879313a0c13SJung-uk Kim 
880313a0c13SJung-uk Kim     if (AcpiGbl_RootTableList.CurrentTableCount >=
881313a0c13SJung-uk Kim         AcpiGbl_RootTableList.MaxTableCount)
882313a0c13SJung-uk Kim     {
883313a0c13SJung-uk Kim         Status = AcpiTbResizeRootTableList();
884313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
885313a0c13SJung-uk Kim         {
886313a0c13SJung-uk Kim             return (Status);
887313a0c13SJung-uk Kim         }
888313a0c13SJung-uk Kim     }
889313a0c13SJung-uk Kim 
8907cf3e94aSJung-uk Kim     i = AcpiGbl_RootTableList.CurrentTableCount;
891313a0c13SJung-uk Kim     AcpiGbl_RootTableList.CurrentTableCount++;
8927cf3e94aSJung-uk Kim 
8937cf3e94aSJung-uk Kim     if (TableIndex)
8947cf3e94aSJung-uk Kim     {
8957cf3e94aSJung-uk Kim         *TableIndex = i;
8967cf3e94aSJung-uk Kim     }
8977cf3e94aSJung-uk Kim     if (TableDesc)
8987cf3e94aSJung-uk Kim     {
8997cf3e94aSJung-uk Kim         *TableDesc = &AcpiGbl_RootTableList.Tables[i];
9007cf3e94aSJung-uk Kim     }
9017cf3e94aSJung-uk Kim 
902313a0c13SJung-uk Kim     return (AE_OK);
903313a0c13SJung-uk Kim }
904313a0c13SJung-uk Kim 
905313a0c13SJung-uk Kim 
906313a0c13SJung-uk Kim /*******************************************************************************
907313a0c13SJung-uk Kim  *
908313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbTerminate
909313a0c13SJung-uk Kim  *
910313a0c13SJung-uk Kim  * PARAMETERS:  None
911313a0c13SJung-uk Kim  *
912313a0c13SJung-uk Kim  * RETURN:      None
913313a0c13SJung-uk Kim  *
914313a0c13SJung-uk Kim  * DESCRIPTION: Delete all internal ACPI tables
915313a0c13SJung-uk Kim  *
916313a0c13SJung-uk Kim  ******************************************************************************/
917313a0c13SJung-uk Kim 
918313a0c13SJung-uk Kim void
919313a0c13SJung-uk Kim AcpiTbTerminate (
920313a0c13SJung-uk Kim     void)
921313a0c13SJung-uk Kim {
922313a0c13SJung-uk Kim     UINT32                  i;
923313a0c13SJung-uk Kim 
924313a0c13SJung-uk Kim 
925313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbTerminate);
926313a0c13SJung-uk Kim 
927313a0c13SJung-uk Kim 
928313a0c13SJung-uk Kim     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
929313a0c13SJung-uk Kim 
930313a0c13SJung-uk Kim     /* Delete the individual tables */
931313a0c13SJung-uk Kim 
932313a0c13SJung-uk Kim     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
933313a0c13SJung-uk Kim     {
934313a0c13SJung-uk Kim         AcpiTbUninstallTable (&AcpiGbl_RootTableList.Tables[i]);
935313a0c13SJung-uk Kim     }
936313a0c13SJung-uk Kim 
937313a0c13SJung-uk Kim     /*
938313a0c13SJung-uk Kim      * Delete the root table array if allocated locally. Array cannot be
939313a0c13SJung-uk Kim      * mapped, so we don't need to check for that flag.
940313a0c13SJung-uk Kim      */
941313a0c13SJung-uk Kim     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
942313a0c13SJung-uk Kim     {
943313a0c13SJung-uk Kim         ACPI_FREE (AcpiGbl_RootTableList.Tables);
944313a0c13SJung-uk Kim     }
945313a0c13SJung-uk Kim 
946313a0c13SJung-uk Kim     AcpiGbl_RootTableList.Tables = NULL;
947313a0c13SJung-uk Kim     AcpiGbl_RootTableList.Flags = 0;
948313a0c13SJung-uk Kim     AcpiGbl_RootTableList.CurrentTableCount = 0;
949313a0c13SJung-uk Kim 
950313a0c13SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
951313a0c13SJung-uk Kim 
952313a0c13SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
953313a0c13SJung-uk Kim     return_VOID;
954313a0c13SJung-uk Kim }
955313a0c13SJung-uk Kim 
956313a0c13SJung-uk Kim 
957313a0c13SJung-uk Kim /*******************************************************************************
958313a0c13SJung-uk Kim  *
959313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbDeleteNamespaceByOwner
960313a0c13SJung-uk Kim  *
961313a0c13SJung-uk Kim  * PARAMETERS:  TableIndex          - Table index
962313a0c13SJung-uk Kim  *
963313a0c13SJung-uk Kim  * RETURN:      Status
964313a0c13SJung-uk Kim  *
965313a0c13SJung-uk Kim  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
966313a0c13SJung-uk Kim  *
967313a0c13SJung-uk Kim  ******************************************************************************/
968313a0c13SJung-uk Kim 
969313a0c13SJung-uk Kim ACPI_STATUS
970313a0c13SJung-uk Kim AcpiTbDeleteNamespaceByOwner (
971313a0c13SJung-uk Kim     UINT32                  TableIndex)
972313a0c13SJung-uk Kim {
973313a0c13SJung-uk Kim     ACPI_OWNER_ID           OwnerId;
974313a0c13SJung-uk Kim     ACPI_STATUS             Status;
975313a0c13SJung-uk Kim 
976313a0c13SJung-uk Kim 
977313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
978313a0c13SJung-uk Kim 
979313a0c13SJung-uk Kim 
980313a0c13SJung-uk Kim     Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
981313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
982313a0c13SJung-uk Kim     {
983313a0c13SJung-uk Kim         return_ACPI_STATUS (Status);
984313a0c13SJung-uk Kim     }
985313a0c13SJung-uk Kim 
986313a0c13SJung-uk Kim     if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
987313a0c13SJung-uk Kim     {
988313a0c13SJung-uk Kim         /* The table index does not exist */
989313a0c13SJung-uk Kim 
990313a0c13SJung-uk Kim         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
991313a0c13SJung-uk Kim         return_ACPI_STATUS (AE_NOT_EXIST);
992313a0c13SJung-uk Kim     }
993313a0c13SJung-uk Kim 
994313a0c13SJung-uk Kim     /* Get the owner ID for this table, used to delete namespace nodes */
995313a0c13SJung-uk Kim 
996313a0c13SJung-uk Kim     OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
997313a0c13SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
998313a0c13SJung-uk Kim 
999313a0c13SJung-uk Kim     /*
1000313a0c13SJung-uk Kim      * Need to acquire the namespace writer lock to prevent interference
1001313a0c13SJung-uk Kim      * with any concurrent namespace walks. The interpreter must be
1002313a0c13SJung-uk Kim      * released during the deletion since the acquisition of the deletion
1003313a0c13SJung-uk Kim      * lock may block, and also since the execution of a namespace walk
1004313a0c13SJung-uk Kim      * must be allowed to use the interpreter.
1005313a0c13SJung-uk Kim      */
1006313a0c13SJung-uk Kim     Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
1007313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
1008313a0c13SJung-uk Kim     {
1009313a0c13SJung-uk Kim         return_ACPI_STATUS (Status);
1010313a0c13SJung-uk Kim     }
1011a009b7dcSJung-uk Kim 
1012493deb39SJung-uk Kim     AcpiNsDeleteNamespaceByOwner (OwnerId);
1013313a0c13SJung-uk Kim     AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
1014313a0c13SJung-uk Kim     return_ACPI_STATUS (Status);
1015313a0c13SJung-uk Kim }
1016313a0c13SJung-uk Kim 
1017313a0c13SJung-uk Kim 
1018313a0c13SJung-uk Kim /*******************************************************************************
1019313a0c13SJung-uk Kim  *
1020313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbAllocateOwnerId
1021313a0c13SJung-uk Kim  *
1022313a0c13SJung-uk Kim  * PARAMETERS:  TableIndex          - Table index
1023313a0c13SJung-uk Kim  *
1024313a0c13SJung-uk Kim  * RETURN:      Status
1025313a0c13SJung-uk Kim  *
1026313a0c13SJung-uk Kim  * DESCRIPTION: Allocates OwnerId in TableDesc
1027313a0c13SJung-uk Kim  *
1028313a0c13SJung-uk Kim  ******************************************************************************/
1029313a0c13SJung-uk Kim 
1030313a0c13SJung-uk Kim ACPI_STATUS
1031313a0c13SJung-uk Kim AcpiTbAllocateOwnerId (
1032313a0c13SJung-uk Kim     UINT32                  TableIndex)
1033313a0c13SJung-uk Kim {
1034313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_BAD_PARAMETER;
1035313a0c13SJung-uk Kim 
1036313a0c13SJung-uk Kim 
1037313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
1038313a0c13SJung-uk Kim 
1039313a0c13SJung-uk Kim 
1040313a0c13SJung-uk Kim     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1041313a0c13SJung-uk Kim     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1042313a0c13SJung-uk Kim     {
1043313a0c13SJung-uk Kim         Status = AcpiUtAllocateOwnerId (
1044313a0c13SJung-uk Kim             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
1045313a0c13SJung-uk Kim     }
1046313a0c13SJung-uk Kim 
1047313a0c13SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1048313a0c13SJung-uk Kim     return_ACPI_STATUS (Status);
1049313a0c13SJung-uk Kim }
1050313a0c13SJung-uk Kim 
1051313a0c13SJung-uk Kim 
1052313a0c13SJung-uk Kim /*******************************************************************************
1053313a0c13SJung-uk Kim  *
1054313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbReleaseOwnerId
1055313a0c13SJung-uk Kim  *
1056313a0c13SJung-uk Kim  * PARAMETERS:  TableIndex          - Table index
1057313a0c13SJung-uk Kim  *
1058313a0c13SJung-uk Kim  * RETURN:      Status
1059313a0c13SJung-uk Kim  *
1060313a0c13SJung-uk Kim  * DESCRIPTION: Releases OwnerId in TableDesc
1061313a0c13SJung-uk Kim  *
1062313a0c13SJung-uk Kim  ******************************************************************************/
1063313a0c13SJung-uk Kim 
1064313a0c13SJung-uk Kim ACPI_STATUS
1065313a0c13SJung-uk Kim AcpiTbReleaseOwnerId (
1066313a0c13SJung-uk Kim     UINT32                  TableIndex)
1067313a0c13SJung-uk Kim {
1068313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_BAD_PARAMETER;
1069313a0c13SJung-uk Kim 
1070313a0c13SJung-uk Kim 
1071313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
1072313a0c13SJung-uk Kim 
1073313a0c13SJung-uk Kim 
1074313a0c13SJung-uk Kim     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1075313a0c13SJung-uk Kim     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1076313a0c13SJung-uk Kim     {
1077313a0c13SJung-uk Kim         AcpiUtReleaseOwnerId (
1078313a0c13SJung-uk Kim             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
1079313a0c13SJung-uk Kim         Status = AE_OK;
1080313a0c13SJung-uk Kim     }
1081313a0c13SJung-uk Kim 
1082313a0c13SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1083313a0c13SJung-uk Kim     return_ACPI_STATUS (Status);
1084313a0c13SJung-uk Kim }
1085313a0c13SJung-uk Kim 
1086313a0c13SJung-uk Kim 
1087313a0c13SJung-uk Kim /*******************************************************************************
1088313a0c13SJung-uk Kim  *
1089313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbGetOwnerId
1090313a0c13SJung-uk Kim  *
1091313a0c13SJung-uk Kim  * PARAMETERS:  TableIndex          - Table index
1092313a0c13SJung-uk Kim  *              OwnerId             - Where the table OwnerId is returned
1093313a0c13SJung-uk Kim  *
1094313a0c13SJung-uk Kim  * RETURN:      Status
1095313a0c13SJung-uk Kim  *
1096313a0c13SJung-uk Kim  * DESCRIPTION: returns OwnerId for the ACPI table
1097313a0c13SJung-uk Kim  *
1098313a0c13SJung-uk Kim  ******************************************************************************/
1099313a0c13SJung-uk Kim 
1100313a0c13SJung-uk Kim ACPI_STATUS
1101313a0c13SJung-uk Kim AcpiTbGetOwnerId (
1102313a0c13SJung-uk Kim     UINT32                  TableIndex,
1103313a0c13SJung-uk Kim     ACPI_OWNER_ID           *OwnerId)
1104313a0c13SJung-uk Kim {
1105313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_BAD_PARAMETER;
1106313a0c13SJung-uk Kim 
1107313a0c13SJung-uk Kim 
1108313a0c13SJung-uk Kim     ACPI_FUNCTION_TRACE (TbGetOwnerId);
1109313a0c13SJung-uk Kim 
1110313a0c13SJung-uk Kim 
1111313a0c13SJung-uk Kim     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1112313a0c13SJung-uk Kim     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1113313a0c13SJung-uk Kim     {
1114313a0c13SJung-uk Kim         *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
1115313a0c13SJung-uk Kim         Status = AE_OK;
1116313a0c13SJung-uk Kim     }
1117313a0c13SJung-uk Kim 
1118313a0c13SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1119313a0c13SJung-uk Kim     return_ACPI_STATUS (Status);
1120313a0c13SJung-uk Kim }
1121313a0c13SJung-uk Kim 
1122313a0c13SJung-uk Kim 
1123313a0c13SJung-uk Kim /*******************************************************************************
1124313a0c13SJung-uk Kim  *
1125313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbIsTableLoaded
1126313a0c13SJung-uk Kim  *
1127313a0c13SJung-uk Kim  * PARAMETERS:  TableIndex          - Index into the root table
1128313a0c13SJung-uk Kim  *
1129313a0c13SJung-uk Kim  * RETURN:      Table Loaded Flag
1130313a0c13SJung-uk Kim  *
1131313a0c13SJung-uk Kim  ******************************************************************************/
1132313a0c13SJung-uk Kim 
1133313a0c13SJung-uk Kim BOOLEAN
1134313a0c13SJung-uk Kim AcpiTbIsTableLoaded (
1135313a0c13SJung-uk Kim     UINT32                  TableIndex)
1136313a0c13SJung-uk Kim {
1137313a0c13SJung-uk Kim     BOOLEAN                 IsLoaded = FALSE;
1138313a0c13SJung-uk Kim 
1139313a0c13SJung-uk Kim 
1140313a0c13SJung-uk Kim     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1141313a0c13SJung-uk Kim     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1142313a0c13SJung-uk Kim     {
1143313a0c13SJung-uk Kim         IsLoaded = (BOOLEAN)
1144313a0c13SJung-uk Kim             (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
1145313a0c13SJung-uk Kim             ACPI_TABLE_IS_LOADED);
1146313a0c13SJung-uk Kim     }
1147313a0c13SJung-uk Kim 
1148313a0c13SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1149313a0c13SJung-uk Kim     return (IsLoaded);
1150313a0c13SJung-uk Kim }
1151313a0c13SJung-uk Kim 
1152313a0c13SJung-uk Kim 
1153313a0c13SJung-uk Kim /*******************************************************************************
1154313a0c13SJung-uk Kim  *
1155313a0c13SJung-uk Kim  * FUNCTION:    AcpiTbSetTableLoadedFlag
1156313a0c13SJung-uk Kim  *
1157313a0c13SJung-uk Kim  * PARAMETERS:  TableIndex          - Table index
1158313a0c13SJung-uk Kim  *              IsLoaded            - TRUE if table is loaded, FALSE otherwise
1159313a0c13SJung-uk Kim  *
1160313a0c13SJung-uk Kim  * RETURN:      None
1161313a0c13SJung-uk Kim  *
1162313a0c13SJung-uk Kim  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
1163313a0c13SJung-uk Kim  *
1164313a0c13SJung-uk Kim  ******************************************************************************/
1165313a0c13SJung-uk Kim 
1166313a0c13SJung-uk Kim void
1167313a0c13SJung-uk Kim AcpiTbSetTableLoadedFlag (
1168313a0c13SJung-uk Kim     UINT32                  TableIndex,
1169313a0c13SJung-uk Kim     BOOLEAN                 IsLoaded)
1170313a0c13SJung-uk Kim {
1171313a0c13SJung-uk Kim 
1172313a0c13SJung-uk Kim     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1173313a0c13SJung-uk Kim     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1174313a0c13SJung-uk Kim     {
1175313a0c13SJung-uk Kim         if (IsLoaded)
1176313a0c13SJung-uk Kim         {
1177313a0c13SJung-uk Kim             AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
1178313a0c13SJung-uk Kim                 ACPI_TABLE_IS_LOADED;
1179313a0c13SJung-uk Kim         }
1180313a0c13SJung-uk Kim         else
1181313a0c13SJung-uk Kim         {
1182313a0c13SJung-uk Kim             AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
1183313a0c13SJung-uk Kim                 ~ACPI_TABLE_IS_LOADED;
1184313a0c13SJung-uk Kim         }
1185313a0c13SJung-uk Kim     }
1186313a0c13SJung-uk Kim 
1187313a0c13SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1188313a0c13SJung-uk Kim }
1189493deb39SJung-uk Kim 
1190493deb39SJung-uk Kim 
1191493deb39SJung-uk Kim /*******************************************************************************
1192493deb39SJung-uk Kim  *
1193493deb39SJung-uk Kim  * FUNCTION:    AcpiTbLoadTable
1194493deb39SJung-uk Kim  *
1195493deb39SJung-uk Kim  * PARAMETERS:  TableIndex              - Table index
1196493deb39SJung-uk Kim  *              ParentNode              - Where table index is returned
1197493deb39SJung-uk Kim  *
1198493deb39SJung-uk Kim  * RETURN:      Status
1199493deb39SJung-uk Kim  *
1200493deb39SJung-uk Kim  * DESCRIPTION: Load an ACPI table
1201493deb39SJung-uk Kim  *
1202493deb39SJung-uk Kim  ******************************************************************************/
1203493deb39SJung-uk Kim 
1204493deb39SJung-uk Kim ACPI_STATUS
1205493deb39SJung-uk Kim AcpiTbLoadTable (
1206493deb39SJung-uk Kim     UINT32                  TableIndex,
1207493deb39SJung-uk Kim     ACPI_NAMESPACE_NODE     *ParentNode)
1208493deb39SJung-uk Kim {
1209493deb39SJung-uk Kim     ACPI_TABLE_HEADER       *Table;
1210493deb39SJung-uk Kim     ACPI_STATUS             Status;
1211493deb39SJung-uk Kim     ACPI_OWNER_ID           OwnerId;
1212493deb39SJung-uk Kim 
1213493deb39SJung-uk Kim 
1214493deb39SJung-uk Kim     ACPI_FUNCTION_TRACE (TbLoadTable);
1215493deb39SJung-uk Kim 
1216493deb39SJung-uk Kim 
1217493deb39SJung-uk Kim     /*
1218493deb39SJung-uk Kim      * Note: Now table is "INSTALLED", it must be validated before
1219493deb39SJung-uk Kim      * using.
1220493deb39SJung-uk Kim      */
1221493deb39SJung-uk Kim     Status = AcpiGetTableByIndex (TableIndex, &Table);
1222493deb39SJung-uk Kim     if (ACPI_FAILURE (Status))
1223493deb39SJung-uk Kim     {
1224493deb39SJung-uk Kim         return_ACPI_STATUS (Status);
1225493deb39SJung-uk Kim     }
1226493deb39SJung-uk Kim 
1227493deb39SJung-uk Kim     Status = AcpiNsLoadTable (TableIndex, ParentNode);
1228a009b7dcSJung-uk Kim     if (ACPI_FAILURE (Status))
1229a009b7dcSJung-uk Kim     {
1230a009b7dcSJung-uk Kim         return_ACPI_STATUS (Status);
1231a009b7dcSJung-uk Kim     }
1232493deb39SJung-uk Kim 
12338438a7a8SJung-uk Kim     /*
1234493deb39SJung-uk Kim      * Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
1235493deb39SJung-uk Kim      * responsible for discovering any new wake GPEs by running _PRW methods
1236493deb39SJung-uk Kim      * that may have been loaded by this table.
1237493deb39SJung-uk Kim      */
1238493deb39SJung-uk Kim     Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
1239493deb39SJung-uk Kim     if (ACPI_SUCCESS (Status))
1240493deb39SJung-uk Kim     {
1241493deb39SJung-uk Kim         AcpiEvUpdateGpes (OwnerId);
1242493deb39SJung-uk Kim     }
1243493deb39SJung-uk Kim 
12445f9b24faSJung-uk Kim     /* Invoke table handler */
1245493deb39SJung-uk Kim 
12465f9b24faSJung-uk Kim     AcpiTbNotifyTable (ACPI_TABLE_EVENT_LOAD, Table);
1247493deb39SJung-uk Kim     return_ACPI_STATUS (Status);
1248493deb39SJung-uk Kim }
1249493deb39SJung-uk Kim 
1250493deb39SJung-uk Kim 
1251493deb39SJung-uk Kim /*******************************************************************************
1252493deb39SJung-uk Kim  *
1253493deb39SJung-uk Kim  * FUNCTION:    AcpiTbInstallAndLoadTable
1254493deb39SJung-uk Kim  *
12551cc50d6bSJung-uk Kim  * PARAMETERS:  Address                 - Physical address of the table
1256493deb39SJung-uk Kim  *              Flags                   - Allocation flags of the table
1257ab71bbb7SJung-uk Kim  *              Table                   - Pointer to the table (required for
1258ab71bbb7SJung-uk Kim  *                                        virtual origins, optional for
1259ab71bbb7SJung-uk Kim  *                                        physical)
12601cc50d6bSJung-uk Kim  *              Override                - Whether override should be performed
1261493deb39SJung-uk Kim  *              TableIndex              - Where table index is returned
1262493deb39SJung-uk Kim  *
1263493deb39SJung-uk Kim  * RETURN:      Status
1264493deb39SJung-uk Kim  *
1265493deb39SJung-uk Kim  * DESCRIPTION: Install and load an ACPI table
1266493deb39SJung-uk Kim  *
1267493deb39SJung-uk Kim  ******************************************************************************/
1268493deb39SJung-uk Kim 
1269493deb39SJung-uk Kim ACPI_STATUS
1270493deb39SJung-uk Kim AcpiTbInstallAndLoadTable (
1271493deb39SJung-uk Kim     ACPI_PHYSICAL_ADDRESS   Address,
1272493deb39SJung-uk Kim     UINT8                   Flags,
1273ab71bbb7SJung-uk Kim     ACPI_TABLE_HEADER       *Table,
1274493deb39SJung-uk Kim     BOOLEAN                 Override,
1275493deb39SJung-uk Kim     UINT32                  *TableIndex)
1276493deb39SJung-uk Kim {
1277493deb39SJung-uk Kim     ACPI_STATUS             Status;
1278493deb39SJung-uk Kim     UINT32                  i;
1279493deb39SJung-uk Kim 
1280493deb39SJung-uk Kim 
12811cc50d6bSJung-uk Kim     ACPI_FUNCTION_TRACE (TbInstallAndLoadTable);
1282493deb39SJung-uk Kim 
1283493deb39SJung-uk Kim 
1284493deb39SJung-uk Kim     /* Install the table and load it into the namespace */
1285493deb39SJung-uk Kim 
1286ab71bbb7SJung-uk Kim     Status = AcpiTbInstallStandardTable (Address, Flags, Table, TRUE,
1287493deb39SJung-uk Kim         Override, &i);
1288493deb39SJung-uk Kim     if (ACPI_FAILURE (Status))
1289493deb39SJung-uk Kim     {
12905f9b24faSJung-uk Kim         goto Exit;
1291493deb39SJung-uk Kim     }
1292493deb39SJung-uk Kim 
12931cc50d6bSJung-uk Kim     Status = AcpiTbLoadTable (i, AcpiGbl_RootNode);
1294493deb39SJung-uk Kim 
12955f9b24faSJung-uk Kim Exit:
12961cc50d6bSJung-uk Kim     *TableIndex = i;
12971cc50d6bSJung-uk Kim     return_ACPI_STATUS (Status);
1298493deb39SJung-uk Kim }
1299493deb39SJung-uk Kim 
13001cc50d6bSJung-uk Kim 
13011cc50d6bSJung-uk Kim /*******************************************************************************
13021cc50d6bSJung-uk Kim  *
13031cc50d6bSJung-uk Kim  * FUNCTION:    AcpiTbUnloadTable
13041cc50d6bSJung-uk Kim  *
13051cc50d6bSJung-uk Kim  * PARAMETERS:  TableIndex              - Table index
13061cc50d6bSJung-uk Kim  *
13071cc50d6bSJung-uk Kim  * RETURN:      Status
13081cc50d6bSJung-uk Kim  *
13091cc50d6bSJung-uk Kim  * DESCRIPTION: Unload an ACPI table
13101cc50d6bSJung-uk Kim  *
13111cc50d6bSJung-uk Kim  ******************************************************************************/
13121cc50d6bSJung-uk Kim 
13131cc50d6bSJung-uk Kim ACPI_STATUS
13141cc50d6bSJung-uk Kim AcpiTbUnloadTable (
13151cc50d6bSJung-uk Kim     UINT32                  TableIndex)
1316493deb39SJung-uk Kim {
13171cc50d6bSJung-uk Kim     ACPI_STATUS             Status = AE_OK;
13181cc50d6bSJung-uk Kim     ACPI_TABLE_HEADER       *Table;
13191cc50d6bSJung-uk Kim 
13201cc50d6bSJung-uk Kim 
13211cc50d6bSJung-uk Kim     ACPI_FUNCTION_TRACE (TbUnloadTable);
13221cc50d6bSJung-uk Kim 
13231cc50d6bSJung-uk Kim 
13241cc50d6bSJung-uk Kim     /* Ensure the table is still loaded */
13251cc50d6bSJung-uk Kim 
13261cc50d6bSJung-uk Kim     if (!AcpiTbIsTableLoaded (TableIndex))
13271cc50d6bSJung-uk Kim     {
13281cc50d6bSJung-uk Kim         return_ACPI_STATUS (AE_NOT_EXIST);
1329493deb39SJung-uk Kim     }
1330493deb39SJung-uk Kim 
13315f9b24faSJung-uk Kim     /* Invoke table handler */
1332493deb39SJung-uk Kim 
13331cc50d6bSJung-uk Kim     Status = AcpiGetTableByIndex (TableIndex, &Table);
13341cc50d6bSJung-uk Kim     if (ACPI_SUCCESS (Status))
13351cc50d6bSJung-uk Kim     {
13365f9b24faSJung-uk Kim         AcpiTbNotifyTable (ACPI_TABLE_EVENT_UNLOAD, Table);
13371cc50d6bSJung-uk Kim     }
1338493deb39SJung-uk Kim 
13391cc50d6bSJung-uk Kim     /* Delete the portion of the namespace owned by this table */
13401cc50d6bSJung-uk Kim 
13411cc50d6bSJung-uk Kim     Status = AcpiTbDeleteNamespaceByOwner (TableIndex);
13421cc50d6bSJung-uk Kim     if (ACPI_FAILURE (Status))
13431cc50d6bSJung-uk Kim     {
13441cc50d6bSJung-uk Kim         return_ACPI_STATUS (Status);
13451cc50d6bSJung-uk Kim     }
13461cc50d6bSJung-uk Kim 
13471cc50d6bSJung-uk Kim     (void) AcpiTbReleaseOwnerId (TableIndex);
13481cc50d6bSJung-uk Kim     AcpiTbSetTableLoadedFlag (TableIndex, FALSE);
1349493deb39SJung-uk Kim     return_ACPI_STATUS (Status);
1350493deb39SJung-uk Kim }
13515f9b24faSJung-uk Kim 
13525f9b24faSJung-uk Kim 
13535f9b24faSJung-uk Kim /*******************************************************************************
13545f9b24faSJung-uk Kim  *
13555f9b24faSJung-uk Kim  * FUNCTION:    AcpiTbNotifyTable
13565f9b24faSJung-uk Kim  *
13575f9b24faSJung-uk Kim  * PARAMETERS:  Event               - Table event
13585f9b24faSJung-uk Kim  *              Table               - Validated table pointer
13595f9b24faSJung-uk Kim  *
13605f9b24faSJung-uk Kim  * RETURN:      None
13615f9b24faSJung-uk Kim  *
13625f9b24faSJung-uk Kim  * DESCRIPTION: Notify a table event to the users.
13635f9b24faSJung-uk Kim  *
13645f9b24faSJung-uk Kim  ******************************************************************************/
13655f9b24faSJung-uk Kim 
13665f9b24faSJung-uk Kim void
13675f9b24faSJung-uk Kim AcpiTbNotifyTable (
13685f9b24faSJung-uk Kim     UINT32                          Event,
13695f9b24faSJung-uk Kim     void                            *Table)
13705f9b24faSJung-uk Kim {
13715f9b24faSJung-uk Kim     /* Invoke table handler if present */
13725f9b24faSJung-uk Kim 
13735f9b24faSJung-uk Kim     if (AcpiGbl_TableHandler)
13745f9b24faSJung-uk Kim     {
13755f9b24faSJung-uk Kim         (void) AcpiGbl_TableHandler (Event, Table,
13765f9b24faSJung-uk Kim             AcpiGbl_TableHandlerContext);
13775f9b24faSJung-uk Kim     }
13785f9b24faSJung-uk Kim }
1379