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*58308fadSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2025, 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
AcpiTbCompareTables(ACPI_TABLE_DESC * TableDesc,UINT32 TableIndex)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
AcpiTbInitTableDescriptor(ACPI_TABLE_DESC * TableDesc,ACPI_PHYSICAL_ADDRESS Address,UINT8 Flags,ACPI_TABLE_HEADER * Table)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
AcpiTbAcquireTable(ACPI_TABLE_DESC * TableDesc,ACPI_TABLE_HEADER ** TablePtr,UINT32 * TableLength,UINT8 * TableFlags)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
AcpiTbReleaseTable(ACPI_TABLE_HEADER * Table,UINT32 TableLength,UINT8 TableFlags)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
AcpiTbAcquireTempTable(ACPI_TABLE_DESC * TableDesc,ACPI_PHYSICAL_ADDRESS Address,UINT8 Flags,ACPI_TABLE_HEADER * Table)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
AcpiTbReleaseTempTable(ACPI_TABLE_DESC * TableDesc)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
AcpiTbValidateTable(ACPI_TABLE_DESC * TableDesc)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
AcpiTbInvalidateTable(ACPI_TABLE_DESC * TableDesc)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
AcpiTbValidateTempTable(ACPI_TABLE_DESC * TableDesc)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
AcpiTbCheckDuplication(ACPI_TABLE_DESC * TableDesc,UINT32 * TableIndex)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
AcpiTbVerifyTempTable(ACPI_TABLE_DESC * TableDesc,char * Signature,UINT32 * TableIndex)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
AcpiTbResizeRootTableList(void)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
AcpiTbGetNextTableDescriptor(UINT32 * TableIndex,ACPI_TABLE_DESC ** TableDesc)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
AcpiTbTerminate(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
AcpiTbDeleteNamespaceByOwner(UINT32 TableIndex)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
AcpiTbAllocateOwnerId(UINT32 TableIndex)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
AcpiTbReleaseOwnerId(UINT32 TableIndex)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
AcpiTbGetOwnerId(UINT32 TableIndex,ACPI_OWNER_ID * OwnerId)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
AcpiTbIsTableLoaded(UINT32 TableIndex)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
AcpiTbSetTableLoadedFlag(UINT32 TableIndex,BOOLEAN IsLoaded)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
AcpiTbLoadTable(UINT32 TableIndex,ACPI_NAMESPACE_NODE * ParentNode)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
AcpiTbInstallAndLoadTable(ACPI_PHYSICAL_ADDRESS Address,UINT8 Flags,ACPI_TABLE_HEADER * Table,BOOLEAN Override,UINT32 * TableIndex)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
AcpiTbUnloadTable(UINT32 TableIndex)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
AcpiTbNotifyTable(UINT32 Event,void * Table)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