1d4972a9cSSascha Wildner /******************************************************************************
2d4972a9cSSascha Wildner *
3d4972a9cSSascha Wildner * Module Name: tbdata - Table manager data structure functions
4d4972a9cSSascha Wildner *
5d4972a9cSSascha Wildner *****************************************************************************/
6d4972a9cSSascha Wildner
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner *
9b4315fc7SSascha Wildner * 1. Copyright Notice
10b4315fc7SSascha Wildner *
11383048acSSascha Wildner * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
12d4972a9cSSascha Wildner * All rights reserved.
13d4972a9cSSascha Wildner *
14b4315fc7SSascha Wildner * 2. License
15b4315fc7SSascha Wildner *
16b4315fc7SSascha Wildner * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner * property rights.
20b4315fc7SSascha Wildner *
21b4315fc7SSascha Wildner * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner *
28b4315fc7SSascha Wildner * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner *
37b4315fc7SSascha Wildner * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner * conditions are met:
39b4315fc7SSascha Wildner *
40b4315fc7SSascha Wildner * 3. Conditions
41b4315fc7SSascha Wildner *
42b4315fc7SSascha Wildner * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner *
54b4315fc7SSascha Wildner * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner * make.
65b4315fc7SSascha Wildner *
66b4315fc7SSascha Wildner * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner * distribution.
71b4315fc7SSascha Wildner *
72b4315fc7SSascha Wildner * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner * Intel Code.
74b4315fc7SSascha Wildner *
75b4315fc7SSascha Wildner * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner * without prior written authorization from Intel.
79b4315fc7SSascha Wildner *
80b4315fc7SSascha Wildner * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner *
82b4315fc7SSascha Wildner * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner *
90b4315fc7SSascha Wildner * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner * LIMITED REMEDY.
98b4315fc7SSascha Wildner *
99b4315fc7SSascha Wildner * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner * such license, approval or letter.
113b4315fc7SSascha Wildner *
114b4315fc7SSascha Wildner *****************************************************************************
115b4315fc7SSascha Wildner *
116b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner * following license:
118b4315fc7SSascha Wildner *
119d4972a9cSSascha Wildner * Redistribution and use in source and binary forms, with or without
120d4972a9cSSascha Wildner * modification, are permitted provided that the following conditions
121d4972a9cSSascha Wildner * are met:
122d4972a9cSSascha Wildner * 1. Redistributions of source code must retain the above copyright
123d4972a9cSSascha Wildner * notice, this list of conditions, and the following disclaimer,
124d4972a9cSSascha Wildner * without modification.
125d4972a9cSSascha Wildner * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d4972a9cSSascha Wildner * substantially similar to the "NO WARRANTY" disclaimer below
127d4972a9cSSascha Wildner * ("Disclaimer") and any redistribution must be conditioned upon
128d4972a9cSSascha Wildner * including a substantially similar Disclaimer requirement for further
129d4972a9cSSascha Wildner * binary redistribution.
130d4972a9cSSascha Wildner * 3. Neither the names of the above-listed copyright holders nor the names
131d4972a9cSSascha Wildner * of any contributors may be used to endorse or promote products derived
132d4972a9cSSascha Wildner * from this software without specific prior written permission.
133d4972a9cSSascha Wildner *
134b4315fc7SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner *
146b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the
147d4972a9cSSascha Wildner * GNU General Public License ("GPL") version 2 as published by the Free
148d4972a9cSSascha Wildner * Software Foundation.
149d4972a9cSSascha Wildner *
150b4315fc7SSascha Wildner *****************************************************************************/
151d4972a9cSSascha Wildner
152d4972a9cSSascha Wildner #include "acpi.h"
153d4972a9cSSascha Wildner #include "accommon.h"
154d4972a9cSSascha Wildner #include "acnamesp.h"
155d4972a9cSSascha Wildner #include "actables.h"
156e5e174adSSascha Wildner #include "acevents.h"
157d4972a9cSSascha Wildner
158d4972a9cSSascha Wildner #define _COMPONENT ACPI_TABLES
159d4972a9cSSascha Wildner ACPI_MODULE_NAME ("tbdata")
160d4972a9cSSascha Wildner
1611093ca81SSascha Wildner /* Local prototypes */
1621093ca81SSascha Wildner
1631093ca81SSascha Wildner static ACPI_STATUS
1641093ca81SSascha Wildner AcpiTbCheckDuplication (
1651093ca81SSascha Wildner ACPI_TABLE_DESC *TableDesc,
1661093ca81SSascha Wildner UINT32 *TableIndex);
1671093ca81SSascha Wildner
1681093ca81SSascha Wildner static BOOLEAN
1691093ca81SSascha Wildner AcpiTbCompareTables (
1701093ca81SSascha Wildner ACPI_TABLE_DESC *TableDesc,
1711093ca81SSascha Wildner UINT32 TableIndex);
1721093ca81SSascha Wildner
1731093ca81SSascha Wildner
1741093ca81SSascha Wildner /*******************************************************************************
1751093ca81SSascha Wildner *
1761093ca81SSascha Wildner * FUNCTION: AcpiTbCompareTables
1771093ca81SSascha Wildner *
1781093ca81SSascha Wildner * PARAMETERS: TableDesc - Table 1 descriptor to be compared
1791093ca81SSascha Wildner * TableIndex - Index of table 2 to be compared
1801093ca81SSascha Wildner *
1811093ca81SSascha Wildner * RETURN: TRUE if both tables are identical.
1821093ca81SSascha Wildner *
1831093ca81SSascha Wildner * DESCRIPTION: This function compares a table with another table that has
1841093ca81SSascha Wildner * already been installed in the root table list.
1851093ca81SSascha Wildner *
1861093ca81SSascha Wildner ******************************************************************************/
1871093ca81SSascha Wildner
1881093ca81SSascha Wildner static BOOLEAN
AcpiTbCompareTables(ACPI_TABLE_DESC * TableDesc,UINT32 TableIndex)1891093ca81SSascha Wildner AcpiTbCompareTables (
1901093ca81SSascha Wildner ACPI_TABLE_DESC *TableDesc,
1911093ca81SSascha Wildner UINT32 TableIndex)
1921093ca81SSascha Wildner {
1931093ca81SSascha Wildner ACPI_STATUS Status = AE_OK;
1941093ca81SSascha Wildner BOOLEAN IsIdentical;
1951093ca81SSascha Wildner ACPI_TABLE_HEADER *Table;
1961093ca81SSascha Wildner UINT32 TableLength;
1971093ca81SSascha Wildner UINT8 TableFlags;
1981093ca81SSascha Wildner
1991093ca81SSascha Wildner
2001093ca81SSascha Wildner Status = AcpiTbAcquireTable (&AcpiGbl_RootTableList.Tables[TableIndex],
2011093ca81SSascha Wildner &Table, &TableLength, &TableFlags);
2021093ca81SSascha Wildner if (ACPI_FAILURE (Status))
2031093ca81SSascha Wildner {
2041093ca81SSascha Wildner return (FALSE);
2051093ca81SSascha Wildner }
2061093ca81SSascha Wildner
2071093ca81SSascha Wildner /*
2081093ca81SSascha Wildner * Check for a table match on the entire table length,
2091093ca81SSascha Wildner * not just the header.
2101093ca81SSascha Wildner */
2111093ca81SSascha Wildner IsIdentical = (BOOLEAN)((TableDesc->Length != TableLength ||
2121093ca81SSascha Wildner memcmp (TableDesc->Pointer, Table, TableLength)) ?
2131093ca81SSascha Wildner FALSE : TRUE);
2141093ca81SSascha Wildner
2151093ca81SSascha Wildner /* Release the acquired table */
2161093ca81SSascha Wildner
2171093ca81SSascha Wildner AcpiTbReleaseTable (Table, TableLength, TableFlags);
2181093ca81SSascha Wildner return (IsIdentical);
2191093ca81SSascha Wildner }
2201093ca81SSascha Wildner
221d4972a9cSSascha Wildner
222d4972a9cSSascha Wildner /*******************************************************************************
223d4972a9cSSascha Wildner *
224d4972a9cSSascha Wildner * FUNCTION: AcpiTbInitTableDescriptor
225d4972a9cSSascha Wildner *
226d4972a9cSSascha Wildner * PARAMETERS: TableDesc - Table descriptor
227d4972a9cSSascha Wildner * Address - Physical address of the table
228d4972a9cSSascha Wildner * Flags - Allocation flags of the table
229d4972a9cSSascha Wildner * Table - Pointer to the table
230d4972a9cSSascha Wildner *
231d4972a9cSSascha Wildner * RETURN: None
232d4972a9cSSascha Wildner *
233d4972a9cSSascha Wildner * DESCRIPTION: Initialize a new table descriptor
234d4972a9cSSascha Wildner *
235d4972a9cSSascha Wildner ******************************************************************************/
236d4972a9cSSascha Wildner
237d4972a9cSSascha Wildner void
AcpiTbInitTableDescriptor(ACPI_TABLE_DESC * TableDesc,ACPI_PHYSICAL_ADDRESS Address,UINT8 Flags,ACPI_TABLE_HEADER * Table)238d4972a9cSSascha Wildner AcpiTbInitTableDescriptor (
239d4972a9cSSascha Wildner ACPI_TABLE_DESC *TableDesc,
240d4972a9cSSascha Wildner ACPI_PHYSICAL_ADDRESS Address,
241d4972a9cSSascha Wildner UINT8 Flags,
242d4972a9cSSascha Wildner ACPI_TABLE_HEADER *Table)
243d4972a9cSSascha Wildner {
244d4972a9cSSascha Wildner
245d4972a9cSSascha Wildner /*
246*aab122a6SSascha Wildner * Initialize the table descriptor. Set the pointer to NULL for external
247*aab122a6SSascha Wildner * tables, since the table is not fully mapped at this time.
248d4972a9cSSascha Wildner */
24925ca8c79SSascha Wildner memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC));
250d4972a9cSSascha Wildner TableDesc->Address = Address;
251d4972a9cSSascha Wildner TableDesc->Length = Table->Length;
252d4972a9cSSascha Wildner TableDesc->Flags = Flags;
253d4972a9cSSascha Wildner ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
254*aab122a6SSascha Wildner
255*aab122a6SSascha Wildner switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
256*aab122a6SSascha Wildner {
257*aab122a6SSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
258*aab122a6SSascha Wildner case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
259*aab122a6SSascha Wildner
260*aab122a6SSascha Wildner TableDesc->Pointer = Table;
261*aab122a6SSascha Wildner break;
262*aab122a6SSascha Wildner
263*aab122a6SSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
264*aab122a6SSascha Wildner default:
265*aab122a6SSascha Wildner
266*aab122a6SSascha Wildner break;
267*aab122a6SSascha Wildner }
268d4972a9cSSascha Wildner }
269d4972a9cSSascha Wildner
270d4972a9cSSascha Wildner
271d4972a9cSSascha Wildner /*******************************************************************************
272d4972a9cSSascha Wildner *
273d4972a9cSSascha Wildner * FUNCTION: AcpiTbAcquireTable
274d4972a9cSSascha Wildner *
275d4972a9cSSascha Wildner * PARAMETERS: TableDesc - Table descriptor
276d4972a9cSSascha Wildner * TablePtr - Where table is returned
277d4972a9cSSascha Wildner * TableLength - Where table length is returned
278d4972a9cSSascha Wildner * TableFlags - Where table allocation flags are returned
279d4972a9cSSascha Wildner *
280d4972a9cSSascha Wildner * RETURN: Status
281d4972a9cSSascha Wildner *
282d4972a9cSSascha Wildner * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
283d4972a9cSSascha Wildner * maintained in the AcpiGbl_RootTableList.
284d4972a9cSSascha Wildner *
285d4972a9cSSascha Wildner ******************************************************************************/
286d4972a9cSSascha Wildner
287d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbAcquireTable(ACPI_TABLE_DESC * TableDesc,ACPI_TABLE_HEADER ** TablePtr,UINT32 * TableLength,UINT8 * TableFlags)288d4972a9cSSascha Wildner AcpiTbAcquireTable (
289d4972a9cSSascha Wildner ACPI_TABLE_DESC *TableDesc,
290d4972a9cSSascha Wildner ACPI_TABLE_HEADER **TablePtr,
291d4972a9cSSascha Wildner UINT32 *TableLength,
292d4972a9cSSascha Wildner UINT8 *TableFlags)
293d4972a9cSSascha Wildner {
294d4972a9cSSascha Wildner ACPI_TABLE_HEADER *Table = NULL;
295d4972a9cSSascha Wildner
296d4972a9cSSascha Wildner
297d4972a9cSSascha Wildner switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
298d4972a9cSSascha Wildner {
299d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
300d4972a9cSSascha Wildner
301d4972a9cSSascha Wildner Table = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
302d4972a9cSSascha Wildner break;
303d4972a9cSSascha Wildner
304d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
305d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
306d4972a9cSSascha Wildner
307*aab122a6SSascha Wildner Table = TableDesc->Pointer;
308d4972a9cSSascha Wildner break;
309d4972a9cSSascha Wildner
310d4972a9cSSascha Wildner default:
311d4972a9cSSascha Wildner
312d4972a9cSSascha Wildner break;
313d4972a9cSSascha Wildner }
314d4972a9cSSascha Wildner
315d4972a9cSSascha Wildner /* Table is not valid yet */
316d4972a9cSSascha Wildner
317d4972a9cSSascha Wildner if (!Table)
318d4972a9cSSascha Wildner {
319d4972a9cSSascha Wildner return (AE_NO_MEMORY);
320d4972a9cSSascha Wildner }
321d4972a9cSSascha Wildner
322d4972a9cSSascha Wildner /* Fill the return values */
323d4972a9cSSascha Wildner
324d4972a9cSSascha Wildner *TablePtr = Table;
325d4972a9cSSascha Wildner *TableLength = TableDesc->Length;
326d4972a9cSSascha Wildner *TableFlags = TableDesc->Flags;
327d4972a9cSSascha Wildner return (AE_OK);
328d4972a9cSSascha Wildner }
329d4972a9cSSascha Wildner
330d4972a9cSSascha Wildner
331d4972a9cSSascha Wildner /*******************************************************************************
332d4972a9cSSascha Wildner *
333d4972a9cSSascha Wildner * FUNCTION: AcpiTbReleaseTable
334d4972a9cSSascha Wildner *
335d4972a9cSSascha Wildner * PARAMETERS: Table - Pointer for the table
336d4972a9cSSascha Wildner * TableLength - Length for the table
337d4972a9cSSascha Wildner * TableFlags - Allocation flags for the table
338d4972a9cSSascha Wildner *
339d4972a9cSSascha Wildner * RETURN: None
340d4972a9cSSascha Wildner *
341d4972a9cSSascha Wildner * DESCRIPTION: Release a table. The inverse of AcpiTbAcquireTable().
342d4972a9cSSascha Wildner *
343d4972a9cSSascha Wildner ******************************************************************************/
344d4972a9cSSascha Wildner
345d4972a9cSSascha Wildner void
AcpiTbReleaseTable(ACPI_TABLE_HEADER * Table,UINT32 TableLength,UINT8 TableFlags)346d4972a9cSSascha Wildner AcpiTbReleaseTable (
347d4972a9cSSascha Wildner ACPI_TABLE_HEADER *Table,
348d4972a9cSSascha Wildner UINT32 TableLength,
349d4972a9cSSascha Wildner UINT8 TableFlags)
350d4972a9cSSascha Wildner {
351d4972a9cSSascha Wildner
352d4972a9cSSascha Wildner switch (TableFlags & ACPI_TABLE_ORIGIN_MASK)
353d4972a9cSSascha Wildner {
354d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
355d4972a9cSSascha Wildner
356d4972a9cSSascha Wildner AcpiOsUnmapMemory (Table, TableLength);
357d4972a9cSSascha Wildner break;
358d4972a9cSSascha Wildner
359d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
360d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
361d4972a9cSSascha Wildner default:
362d4972a9cSSascha Wildner
363d4972a9cSSascha Wildner break;
364d4972a9cSSascha Wildner }
365d4972a9cSSascha Wildner }
366d4972a9cSSascha Wildner
367d4972a9cSSascha Wildner
368d4972a9cSSascha Wildner /*******************************************************************************
369d4972a9cSSascha Wildner *
370d4972a9cSSascha Wildner * FUNCTION: AcpiTbAcquireTempTable
371d4972a9cSSascha Wildner *
372d4972a9cSSascha Wildner * PARAMETERS: TableDesc - Table descriptor to be acquired
373d4972a9cSSascha Wildner * Address - Address of the table
374d4972a9cSSascha Wildner * Flags - Allocation flags of the table
375*aab122a6SSascha Wildner * Table - Pointer to the table (required for virtual
376*aab122a6SSascha Wildner * origins, optional for physical)
377d4972a9cSSascha Wildner *
378d4972a9cSSascha Wildner * RETURN: Status
379d4972a9cSSascha Wildner *
380d4972a9cSSascha Wildner * DESCRIPTION: This function validates the table header to obtain the length
381d4972a9cSSascha Wildner * of a table and fills the table descriptor to make its state as
382d4972a9cSSascha Wildner * "INSTALLED". Such a table descriptor is only used for verified
383d4972a9cSSascha Wildner * installation.
384d4972a9cSSascha Wildner *
385d4972a9cSSascha Wildner ******************************************************************************/
386d4972a9cSSascha Wildner
387d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbAcquireTempTable(ACPI_TABLE_DESC * TableDesc,ACPI_PHYSICAL_ADDRESS Address,UINT8 Flags,ACPI_TABLE_HEADER * Table)388d4972a9cSSascha Wildner AcpiTbAcquireTempTable (
389d4972a9cSSascha Wildner ACPI_TABLE_DESC *TableDesc,
390d4972a9cSSascha Wildner ACPI_PHYSICAL_ADDRESS Address,
391*aab122a6SSascha Wildner UINT8 Flags,
392*aab122a6SSascha Wildner ACPI_TABLE_HEADER *Table)
393d4972a9cSSascha Wildner {
394*aab122a6SSascha Wildner BOOLEAN MappedTable = FALSE;
395d4972a9cSSascha Wildner
396d4972a9cSSascha Wildner
397d4972a9cSSascha Wildner switch (Flags & ACPI_TABLE_ORIGIN_MASK)
398d4972a9cSSascha Wildner {
399d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
400d4972a9cSSascha Wildner
401d4972a9cSSascha Wildner /* Get the length of the full table from the header */
402d4972a9cSSascha Wildner
403*aab122a6SSascha Wildner if (!Table)
404*aab122a6SSascha Wildner {
405*aab122a6SSascha Wildner Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
406*aab122a6SSascha Wildner if (!Table)
407d4972a9cSSascha Wildner {
408d4972a9cSSascha Wildner return (AE_NO_MEMORY);
409d4972a9cSSascha Wildner }
410d4972a9cSSascha Wildner
411*aab122a6SSascha Wildner MappedTable = TRUE;
412*aab122a6SSascha Wildner }
413*aab122a6SSascha Wildner
414*aab122a6SSascha Wildner break;
415d4972a9cSSascha Wildner
416d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
417d4972a9cSSascha Wildner case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
418d4972a9cSSascha Wildner
419*aab122a6SSascha Wildner if (!Table)
420d4972a9cSSascha Wildner {
421*aab122a6SSascha Wildner return (AE_BAD_PARAMETER);
422d4972a9cSSascha Wildner }
423d4972a9cSSascha Wildner
424d4972a9cSSascha Wildner break;
425*aab122a6SSascha Wildner
426*aab122a6SSascha Wildner default:
427d4972a9cSSascha Wildner
428d4972a9cSSascha Wildner /* Table is not valid yet */
429d4972a9cSSascha Wildner
430d4972a9cSSascha Wildner return (AE_NO_MEMORY);
431d4972a9cSSascha Wildner }
432d4972a9cSSascha Wildner
433*aab122a6SSascha Wildner AcpiTbInitTableDescriptor (TableDesc, Address, Flags, Table);
434*aab122a6SSascha Wildner if (MappedTable)
435*aab122a6SSascha Wildner {
436*aab122a6SSascha Wildner AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER));
437*aab122a6SSascha Wildner }
438*aab122a6SSascha Wildner
439*aab122a6SSascha Wildner return (AE_OK);
440*aab122a6SSascha Wildner }
441*aab122a6SSascha Wildner
442d4972a9cSSascha Wildner
443d4972a9cSSascha Wildner /*******************************************************************************
444d4972a9cSSascha Wildner *
445d4972a9cSSascha Wildner * FUNCTION: AcpiTbReleaseTempTable
446d4972a9cSSascha Wildner *
447d4972a9cSSascha Wildner * PARAMETERS: TableDesc - Table descriptor to be released
448d4972a9cSSascha Wildner *
449d4972a9cSSascha Wildner * RETURN: Status
450d4972a9cSSascha Wildner *
451d4972a9cSSascha Wildner * DESCRIPTION: The inverse of AcpiTbAcquireTempTable().
452d4972a9cSSascha Wildner *
453d4972a9cSSascha Wildner *****************************************************************************/
454d4972a9cSSascha Wildner
455d4972a9cSSascha Wildner void
AcpiTbReleaseTempTable(ACPI_TABLE_DESC * TableDesc)456d4972a9cSSascha Wildner AcpiTbReleaseTempTable (
457d4972a9cSSascha Wildner ACPI_TABLE_DESC *TableDesc)
458d4972a9cSSascha Wildner {
459d4972a9cSSascha Wildner
460d4972a9cSSascha Wildner /*
461d4972a9cSSascha Wildner * Note that the .Address is maintained by the callers of
462d4972a9cSSascha Wildner * AcpiTbAcquireTempTable(), thus do not invoke AcpiTbUninstallTable()
463d4972a9cSSascha Wildner * where .Address will be freed.
464d4972a9cSSascha Wildner */
465d4972a9cSSascha Wildner AcpiTbInvalidateTable (TableDesc);
466d4972a9cSSascha Wildner }
467d4972a9cSSascha Wildner
468d4972a9cSSascha Wildner
469d4972a9cSSascha Wildner /******************************************************************************
470d4972a9cSSascha Wildner *
471d4972a9cSSascha Wildner * FUNCTION: AcpiTbValidateTable
472d4972a9cSSascha Wildner *
473d4972a9cSSascha Wildner * PARAMETERS: TableDesc - Table descriptor
474d4972a9cSSascha Wildner *
475d4972a9cSSascha Wildner * RETURN: Status
476d4972a9cSSascha Wildner *
477d4972a9cSSascha Wildner * DESCRIPTION: This function is called to validate the table, the returned
478d4972a9cSSascha Wildner * table descriptor is in "VALIDATED" state.
479d4972a9cSSascha Wildner *
480d4972a9cSSascha Wildner *****************************************************************************/
481d4972a9cSSascha Wildner
482d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbValidateTable(ACPI_TABLE_DESC * TableDesc)483d4972a9cSSascha Wildner AcpiTbValidateTable (
484d4972a9cSSascha Wildner ACPI_TABLE_DESC *TableDesc)
485d4972a9cSSascha Wildner {
486d4972a9cSSascha Wildner ACPI_STATUS Status = AE_OK;
487d4972a9cSSascha Wildner
488d4972a9cSSascha Wildner
489d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbValidateTable);
490d4972a9cSSascha Wildner
491d4972a9cSSascha Wildner
492d4972a9cSSascha Wildner /* Validate the table if necessary */
493d4972a9cSSascha Wildner
494d4972a9cSSascha Wildner if (!TableDesc->Pointer)
495d4972a9cSSascha Wildner {
496d4972a9cSSascha Wildner Status = AcpiTbAcquireTable (TableDesc, &TableDesc->Pointer,
497d4972a9cSSascha Wildner &TableDesc->Length, &TableDesc->Flags);
498d4972a9cSSascha Wildner if (!TableDesc->Pointer)
499d4972a9cSSascha Wildner {
500d4972a9cSSascha Wildner Status = AE_NO_MEMORY;
501d4972a9cSSascha Wildner }
502d4972a9cSSascha Wildner }
503d4972a9cSSascha Wildner
504d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
505d4972a9cSSascha Wildner }
506d4972a9cSSascha Wildner
507d4972a9cSSascha Wildner
508d4972a9cSSascha Wildner /*******************************************************************************
509d4972a9cSSascha Wildner *
510d4972a9cSSascha Wildner * FUNCTION: AcpiTbInvalidateTable
511d4972a9cSSascha Wildner *
512d4972a9cSSascha Wildner * PARAMETERS: TableDesc - Table descriptor
513d4972a9cSSascha Wildner *
514d4972a9cSSascha Wildner * RETURN: None
515d4972a9cSSascha Wildner *
516d4972a9cSSascha Wildner * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
517d4972a9cSSascha Wildner * AcpiTbValidateTable().
518d4972a9cSSascha Wildner *
519d4972a9cSSascha Wildner ******************************************************************************/
520d4972a9cSSascha Wildner
521d4972a9cSSascha Wildner void
AcpiTbInvalidateTable(ACPI_TABLE_DESC * TableDesc)522d4972a9cSSascha Wildner AcpiTbInvalidateTable (
523d4972a9cSSascha Wildner ACPI_TABLE_DESC *TableDesc)
524d4972a9cSSascha Wildner {
525d4972a9cSSascha Wildner
526d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbInvalidateTable);
527d4972a9cSSascha Wildner
528d4972a9cSSascha Wildner
529d4972a9cSSascha Wildner /* Table must be validated */
530d4972a9cSSascha Wildner
531d4972a9cSSascha Wildner if (!TableDesc->Pointer)
532d4972a9cSSascha Wildner {
533d4972a9cSSascha Wildner return_VOID;
534d4972a9cSSascha Wildner }
535d4972a9cSSascha Wildner
536d4972a9cSSascha Wildner AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length,
537d4972a9cSSascha Wildner TableDesc->Flags);
538*aab122a6SSascha Wildner
539*aab122a6SSascha Wildner switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
540*aab122a6SSascha Wildner {
541*aab122a6SSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
542*aab122a6SSascha Wildner
543d4972a9cSSascha Wildner TableDesc->Pointer = NULL;
544*aab122a6SSascha Wildner break;
545*aab122a6SSascha Wildner
546*aab122a6SSascha Wildner case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
547*aab122a6SSascha Wildner case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
548*aab122a6SSascha Wildner default:
549*aab122a6SSascha Wildner
550*aab122a6SSascha Wildner break;
551*aab122a6SSascha Wildner }
552d4972a9cSSascha Wildner
553d4972a9cSSascha Wildner return_VOID;
554d4972a9cSSascha Wildner }
555d4972a9cSSascha Wildner
556d4972a9cSSascha Wildner
557d4972a9cSSascha Wildner /******************************************************************************
558d4972a9cSSascha Wildner *
5595f39c7e7SSascha Wildner * FUNCTION: AcpiTbValidateTempTable
5605f39c7e7SSascha Wildner *
5615f39c7e7SSascha Wildner * PARAMETERS: TableDesc - Table descriptor
5625f39c7e7SSascha Wildner *
5635f39c7e7SSascha Wildner * RETURN: Status
5645f39c7e7SSascha Wildner *
5655f39c7e7SSascha Wildner * DESCRIPTION: This function is called to validate the table, the returned
5665f39c7e7SSascha Wildner * table descriptor is in "VALIDATED" state.
5675f39c7e7SSascha Wildner *
5685f39c7e7SSascha Wildner *****************************************************************************/
5695f39c7e7SSascha Wildner
5705f39c7e7SSascha Wildner ACPI_STATUS
AcpiTbValidateTempTable(ACPI_TABLE_DESC * TableDesc)5715f39c7e7SSascha Wildner AcpiTbValidateTempTable (
5725f39c7e7SSascha Wildner ACPI_TABLE_DESC *TableDesc)
5735f39c7e7SSascha Wildner {
5745f39c7e7SSascha Wildner
5751093ca81SSascha Wildner if (!TableDesc->Pointer && !AcpiGbl_EnableTableValidation)
5765f39c7e7SSascha Wildner {
5775f39c7e7SSascha Wildner /*
5785f39c7e7SSascha Wildner * Only validates the header of the table.
5795f39c7e7SSascha Wildner * Note that Length contains the size of the mapping after invoking
5805f39c7e7SSascha Wildner * this work around, this value is required by
5815f39c7e7SSascha Wildner * AcpiTbReleaseTempTable().
5825f39c7e7SSascha Wildner * We can do this because in AcpiInitTableDescriptor(), the Length
5835f39c7e7SSascha Wildner * field of the installed descriptor is filled with the actual
5845f39c7e7SSascha Wildner * table length obtaining from the table header.
5855f39c7e7SSascha Wildner */
5865f39c7e7SSascha Wildner TableDesc->Length = sizeof (ACPI_TABLE_HEADER);
5875f39c7e7SSascha Wildner }
5885f39c7e7SSascha Wildner
5895f39c7e7SSascha Wildner return (AcpiTbValidateTable (TableDesc));
5905f39c7e7SSascha Wildner }
5915f39c7e7SSascha Wildner
5925f39c7e7SSascha Wildner
5931093ca81SSascha Wildner /*******************************************************************************
5941093ca81SSascha Wildner *
5951093ca81SSascha Wildner * FUNCTION: AcpiTbCheckDuplication
5961093ca81SSascha Wildner *
5971093ca81SSascha Wildner * PARAMETERS: TableDesc - Table descriptor
5981093ca81SSascha Wildner * TableIndex - Where the table index is returned
5991093ca81SSascha Wildner *
6001093ca81SSascha Wildner * RETURN: Status
6011093ca81SSascha Wildner *
6021093ca81SSascha Wildner * DESCRIPTION: Avoid installing duplicated tables. However table override and
6031093ca81SSascha Wildner * user aided dynamic table load is allowed, thus comparing the
6041093ca81SSascha Wildner * address of the table is not sufficient, and checking the entire
6051093ca81SSascha Wildner * table content is required.
6061093ca81SSascha Wildner *
6071093ca81SSascha Wildner ******************************************************************************/
6081093ca81SSascha Wildner
6091093ca81SSascha Wildner static ACPI_STATUS
AcpiTbCheckDuplication(ACPI_TABLE_DESC * TableDesc,UINT32 * TableIndex)6101093ca81SSascha Wildner AcpiTbCheckDuplication (
6111093ca81SSascha Wildner ACPI_TABLE_DESC *TableDesc,
6121093ca81SSascha Wildner UINT32 *TableIndex)
6131093ca81SSascha Wildner {
6141093ca81SSascha Wildner UINT32 i;
6151093ca81SSascha Wildner
6161093ca81SSascha Wildner
6171093ca81SSascha Wildner ACPI_FUNCTION_TRACE (TbCheckDuplication);
6181093ca81SSascha Wildner
6191093ca81SSascha Wildner
6201093ca81SSascha Wildner /* Check if table is already registered */
6211093ca81SSascha Wildner
6221093ca81SSascha Wildner for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
6231093ca81SSascha Wildner {
6241093ca81SSascha Wildner /* Do not compare with unverified tables */
6251093ca81SSascha Wildner
6261093ca81SSascha Wildner if (!(AcpiGbl_RootTableList.Tables[i].Flags & ACPI_TABLE_IS_VERIFIED))
6271093ca81SSascha Wildner {
6281093ca81SSascha Wildner continue;
6291093ca81SSascha Wildner }
6301093ca81SSascha Wildner
6311093ca81SSascha Wildner /*
6321093ca81SSascha Wildner * Check for a table match on the entire table length,
6331093ca81SSascha Wildner * not just the header.
6341093ca81SSascha Wildner */
6351093ca81SSascha Wildner if (!AcpiTbCompareTables (TableDesc, i))
6361093ca81SSascha Wildner {
6371093ca81SSascha Wildner continue;
6381093ca81SSascha Wildner }
6391093ca81SSascha Wildner
6401093ca81SSascha Wildner /*
6411093ca81SSascha Wildner * Note: the current mechanism does not unregister a table if it is
6421093ca81SSascha Wildner * dynamically unloaded. The related namespace entries are deleted,
6431093ca81SSascha Wildner * but the table remains in the root table list.
6441093ca81SSascha Wildner *
6451093ca81SSascha Wildner * The assumption here is that the number of different tables that
6461093ca81SSascha Wildner * will be loaded is actually small, and there is minimal overhead
6471093ca81SSascha Wildner * in just keeping the table in case it is needed again.
6481093ca81SSascha Wildner *
6491093ca81SSascha Wildner * If this assumption changes in the future (perhaps on large
6501093ca81SSascha Wildner * machines with many table load/unload operations), tables will
6511093ca81SSascha Wildner * need to be unregistered when they are unloaded, and slots in the
6521093ca81SSascha Wildner * root table list should be reused when empty.
6531093ca81SSascha Wildner */
6541093ca81SSascha Wildner if (AcpiGbl_RootTableList.Tables[i].Flags &
6551093ca81SSascha Wildner ACPI_TABLE_IS_LOADED)
6561093ca81SSascha Wildner {
6571093ca81SSascha Wildner /* Table is still loaded, this is an error */
6581093ca81SSascha Wildner
6591093ca81SSascha Wildner return_ACPI_STATUS (AE_ALREADY_EXISTS);
6601093ca81SSascha Wildner }
6611093ca81SSascha Wildner else
6621093ca81SSascha Wildner {
6631093ca81SSascha Wildner *TableIndex = i;
6641093ca81SSascha Wildner return_ACPI_STATUS (AE_CTRL_TERMINATE);
6651093ca81SSascha Wildner }
6661093ca81SSascha Wildner }
6671093ca81SSascha Wildner
6681093ca81SSascha Wildner /* Indicate no duplication to the caller */
6691093ca81SSascha Wildner
6701093ca81SSascha Wildner return_ACPI_STATUS (AE_OK);
6711093ca81SSascha Wildner }
6721093ca81SSascha Wildner
6731093ca81SSascha Wildner
6745f39c7e7SSascha Wildner /******************************************************************************
6755f39c7e7SSascha Wildner *
6765f39c7e7SSascha Wildner * FUNCTION: AcpiTbVerifyTempTable
677d4972a9cSSascha Wildner *
678d4972a9cSSascha Wildner * PARAMETERS: TableDesc - Table descriptor
679d4972a9cSSascha Wildner * Signature - Table signature to verify
6801093ca81SSascha Wildner * TableIndex - Where the table index is returned
681d4972a9cSSascha Wildner *
682d4972a9cSSascha Wildner * RETURN: Status
683d4972a9cSSascha Wildner *
684d4972a9cSSascha Wildner * DESCRIPTION: This function is called to validate and verify the table, the
685d4972a9cSSascha Wildner * returned table descriptor is in "VALIDATED" state.
6863c639e0cSSascha Wildner * Note that 'TableIndex' is required to be set to !NULL to
6873c639e0cSSascha Wildner * enable duplication check.
688d4972a9cSSascha Wildner *
689d4972a9cSSascha Wildner *****************************************************************************/
690d4972a9cSSascha Wildner
691d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbVerifyTempTable(ACPI_TABLE_DESC * TableDesc,char * Signature,UINT32 * TableIndex)6925f39c7e7SSascha Wildner AcpiTbVerifyTempTable (
693d4972a9cSSascha Wildner ACPI_TABLE_DESC *TableDesc,
6941093ca81SSascha Wildner char *Signature,
6951093ca81SSascha Wildner UINT32 *TableIndex)
696d4972a9cSSascha Wildner {
697d4972a9cSSascha Wildner ACPI_STATUS Status = AE_OK;
698d4972a9cSSascha Wildner
699d4972a9cSSascha Wildner
7005f39c7e7SSascha Wildner ACPI_FUNCTION_TRACE (TbVerifyTempTable);
701d4972a9cSSascha Wildner
702d4972a9cSSascha Wildner
703d4972a9cSSascha Wildner /* Validate the table */
704d4972a9cSSascha Wildner
7055f39c7e7SSascha Wildner Status = AcpiTbValidateTempTable (TableDesc);
706d4972a9cSSascha Wildner if (ACPI_FAILURE (Status))
707d4972a9cSSascha Wildner {
708d4972a9cSSascha Wildner return_ACPI_STATUS (AE_NO_MEMORY);
709d4972a9cSSascha Wildner }
710d4972a9cSSascha Wildner
711d4972a9cSSascha Wildner /* If a particular signature is expected (DSDT/FACS), it must match */
712d4972a9cSSascha Wildner
713d4972a9cSSascha Wildner if (Signature &&
714c1776041SSascha Wildner !ACPI_COMPARE_NAMESEG (&TableDesc->Signature, Signature))
715d4972a9cSSascha Wildner {
716d4972a9cSSascha Wildner ACPI_BIOS_ERROR ((AE_INFO,
717d4972a9cSSascha Wildner "Invalid signature 0x%X for ACPI table, expected [%s]",
718d4972a9cSSascha Wildner TableDesc->Signature.Integer, Signature));
719d4972a9cSSascha Wildner Status = AE_BAD_SIGNATURE;
720d4972a9cSSascha Wildner goto InvalidateAndExit;
721d4972a9cSSascha Wildner }
722d4972a9cSSascha Wildner
7231093ca81SSascha Wildner if (AcpiGbl_EnableTableValidation)
7241093ca81SSascha Wildner {
725d4972a9cSSascha Wildner /* Verify the checksum */
726d4972a9cSSascha Wildner
727d4972a9cSSascha Wildner Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
728d4972a9cSSascha Wildner if (ACPI_FAILURE (Status))
729d4972a9cSSascha Wildner {
730d4972a9cSSascha Wildner ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
7315943f66cSSascha Wildner "%4.4s 0x%8.8X%8.8X"
732d4972a9cSSascha Wildner " Attempted table install failed",
7330d27ae55SSascha Wildner AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
734d4972a9cSSascha Wildner TableDesc->Signature.Ascii : "????",
7355943f66cSSascha Wildner ACPI_FORMAT_UINT64 (TableDesc->Address)));
736820c5b08SSascha Wildner
737d4972a9cSSascha Wildner goto InvalidateAndExit;
738d4972a9cSSascha Wildner }
7391093ca81SSascha Wildner
7401093ca81SSascha Wildner /* Avoid duplications */
7411093ca81SSascha Wildner
7421093ca81SSascha Wildner if (TableIndex)
7431093ca81SSascha Wildner {
7441093ca81SSascha Wildner Status = AcpiTbCheckDuplication (TableDesc, TableIndex);
7451093ca81SSascha Wildner if (ACPI_FAILURE (Status))
7461093ca81SSascha Wildner {
7471093ca81SSascha Wildner if (Status != AE_CTRL_TERMINATE)
7481093ca81SSascha Wildner {
7492afeb59bSSascha Wildner ACPI_EXCEPTION ((AE_INFO, Status,
7501093ca81SSascha Wildner "%4.4s 0x%8.8X%8.8X"
7512afeb59bSSascha Wildner " Table is already loaded",
7521093ca81SSascha Wildner AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
7531093ca81SSascha Wildner TableDesc->Signature.Ascii : "????",
7541093ca81SSascha Wildner ACPI_FORMAT_UINT64 (TableDesc->Address)));
7555f39c7e7SSascha Wildner }
756d4972a9cSSascha Wildner
7571093ca81SSascha Wildner goto InvalidateAndExit;
7581093ca81SSascha Wildner }
7591093ca81SSascha Wildner }
7601093ca81SSascha Wildner
7611093ca81SSascha Wildner TableDesc->Flags |= ACPI_TABLE_IS_VERIFIED;
7621093ca81SSascha Wildner }
7631093ca81SSascha Wildner
7641093ca81SSascha Wildner return_ACPI_STATUS (Status);
765d4972a9cSSascha Wildner
766d4972a9cSSascha Wildner InvalidateAndExit:
767d4972a9cSSascha Wildner AcpiTbInvalidateTable (TableDesc);
768d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
769d4972a9cSSascha Wildner }
770d4972a9cSSascha Wildner
771d4972a9cSSascha Wildner
772d4972a9cSSascha Wildner /*******************************************************************************
773d4972a9cSSascha Wildner *
774d4972a9cSSascha Wildner * FUNCTION: AcpiTbResizeRootTableList
775d4972a9cSSascha Wildner *
776d4972a9cSSascha Wildner * PARAMETERS: None
777d4972a9cSSascha Wildner *
778d4972a9cSSascha Wildner * RETURN: Status
779d4972a9cSSascha Wildner *
780d4972a9cSSascha Wildner * DESCRIPTION: Expand the size of global table array
781d4972a9cSSascha Wildner *
782d4972a9cSSascha Wildner ******************************************************************************/
783d4972a9cSSascha Wildner
784d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbResizeRootTableList(void)785d4972a9cSSascha Wildner AcpiTbResizeRootTableList (
786d4972a9cSSascha Wildner void)
787d4972a9cSSascha Wildner {
788d4972a9cSSascha Wildner ACPI_TABLE_DESC *Tables;
789d4972a9cSSascha Wildner UINT32 TableCount;
7901093ca81SSascha Wildner UINT32 CurrentTableCount, MaxTableCount;
7911093ca81SSascha Wildner UINT32 i;
792d4972a9cSSascha Wildner
793d4972a9cSSascha Wildner
794d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbResizeRootTableList);
795d4972a9cSSascha Wildner
796d4972a9cSSascha Wildner
797d4972a9cSSascha Wildner /* AllowResize flag is a parameter to AcpiInitializeTables */
798d4972a9cSSascha Wildner
799d4972a9cSSascha Wildner if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
800d4972a9cSSascha Wildner {
801d4972a9cSSascha Wildner ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
802d4972a9cSSascha Wildner return_ACPI_STATUS (AE_SUPPORT);
803d4972a9cSSascha Wildner }
804d4972a9cSSascha Wildner
805d4972a9cSSascha Wildner /* Increase the Table Array size */
806d4972a9cSSascha Wildner
807d4972a9cSSascha Wildner if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
808d4972a9cSSascha Wildner {
809d4972a9cSSascha Wildner TableCount = AcpiGbl_RootTableList.MaxTableCount;
810d4972a9cSSascha Wildner }
811d4972a9cSSascha Wildner else
812d4972a9cSSascha Wildner {
813d4972a9cSSascha Wildner TableCount = AcpiGbl_RootTableList.CurrentTableCount;
814d4972a9cSSascha Wildner }
815d4972a9cSSascha Wildner
8161093ca81SSascha Wildner MaxTableCount = TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
817d4972a9cSSascha Wildner Tables = ACPI_ALLOCATE_ZEROED (
8181093ca81SSascha Wildner ((ACPI_SIZE) MaxTableCount) * sizeof (ACPI_TABLE_DESC));
819d4972a9cSSascha Wildner if (!Tables)
820d4972a9cSSascha Wildner {
821d4972a9cSSascha Wildner ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
822d4972a9cSSascha Wildner return_ACPI_STATUS (AE_NO_MEMORY);
823d4972a9cSSascha Wildner }
824d4972a9cSSascha Wildner
825d4972a9cSSascha Wildner /* Copy and free the previous table array */
826d4972a9cSSascha Wildner
8271093ca81SSascha Wildner CurrentTableCount = 0;
828d4972a9cSSascha Wildner if (AcpiGbl_RootTableList.Tables)
829d4972a9cSSascha Wildner {
8301093ca81SSascha Wildner for (i = 0; i < TableCount; i++)
8311093ca81SSascha Wildner {
8321093ca81SSascha Wildner if (AcpiGbl_RootTableList.Tables[i].Address)
8331093ca81SSascha Wildner {
8341093ca81SSascha Wildner memcpy (Tables + CurrentTableCount,
8351093ca81SSascha Wildner AcpiGbl_RootTableList.Tables + i,
8361093ca81SSascha Wildner sizeof (ACPI_TABLE_DESC));
8371093ca81SSascha Wildner CurrentTableCount++;
8381093ca81SSascha Wildner }
8391093ca81SSascha Wildner }
840d4972a9cSSascha Wildner
841d4972a9cSSascha Wildner if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
842d4972a9cSSascha Wildner {
843d4972a9cSSascha Wildner ACPI_FREE (AcpiGbl_RootTableList.Tables);
844d4972a9cSSascha Wildner }
845d4972a9cSSascha Wildner }
846d4972a9cSSascha Wildner
847d4972a9cSSascha Wildner AcpiGbl_RootTableList.Tables = Tables;
8481093ca81SSascha Wildner AcpiGbl_RootTableList.MaxTableCount = MaxTableCount;
8491093ca81SSascha Wildner AcpiGbl_RootTableList.CurrentTableCount = CurrentTableCount;
850d4972a9cSSascha Wildner AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
851d4972a9cSSascha Wildner
852d4972a9cSSascha Wildner return_ACPI_STATUS (AE_OK);
853d4972a9cSSascha Wildner }
854d4972a9cSSascha Wildner
855d4972a9cSSascha Wildner
856d4972a9cSSascha Wildner /*******************************************************************************
857d4972a9cSSascha Wildner *
8585943f66cSSascha Wildner * FUNCTION: AcpiTbGetNextTableDescriptor
859d4972a9cSSascha Wildner *
860d4972a9cSSascha Wildner * PARAMETERS: TableIndex - Where table index is returned
8615943f66cSSascha Wildner * TableDesc - Where table descriptor is returned
862d4972a9cSSascha Wildner *
8635943f66cSSascha Wildner * RETURN: Status and table index/descriptor.
864d4972a9cSSascha Wildner *
865d4972a9cSSascha Wildner * DESCRIPTION: Allocate a new ACPI table entry to the global table list
866d4972a9cSSascha Wildner *
867d4972a9cSSascha Wildner ******************************************************************************/
868d4972a9cSSascha Wildner
869d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbGetNextTableDescriptor(UINT32 * TableIndex,ACPI_TABLE_DESC ** TableDesc)8705943f66cSSascha Wildner AcpiTbGetNextTableDescriptor (
8715943f66cSSascha Wildner UINT32 *TableIndex,
8725943f66cSSascha Wildner ACPI_TABLE_DESC **TableDesc)
873d4972a9cSSascha Wildner {
874d4972a9cSSascha Wildner ACPI_STATUS Status;
8755943f66cSSascha Wildner UINT32 i;
876d4972a9cSSascha Wildner
877d4972a9cSSascha Wildner
878d4972a9cSSascha Wildner /* Ensure that there is room for the table in the Root Table List */
879d4972a9cSSascha Wildner
880d4972a9cSSascha Wildner if (AcpiGbl_RootTableList.CurrentTableCount >=
881d4972a9cSSascha Wildner AcpiGbl_RootTableList.MaxTableCount)
882d4972a9cSSascha Wildner {
883d4972a9cSSascha Wildner Status = AcpiTbResizeRootTableList();
884d4972a9cSSascha Wildner if (ACPI_FAILURE (Status))
885d4972a9cSSascha Wildner {
886d4972a9cSSascha Wildner return (Status);
887d4972a9cSSascha Wildner }
888d4972a9cSSascha Wildner }
889d4972a9cSSascha Wildner
8905943f66cSSascha Wildner i = AcpiGbl_RootTableList.CurrentTableCount;
891d4972a9cSSascha Wildner AcpiGbl_RootTableList.CurrentTableCount++;
8925943f66cSSascha Wildner
8935943f66cSSascha Wildner if (TableIndex)
8945943f66cSSascha Wildner {
8955943f66cSSascha Wildner *TableIndex = i;
8965943f66cSSascha Wildner }
8975943f66cSSascha Wildner if (TableDesc)
8985943f66cSSascha Wildner {
8995943f66cSSascha Wildner *TableDesc = &AcpiGbl_RootTableList.Tables[i];
9005943f66cSSascha Wildner }
9015943f66cSSascha Wildner
902d4972a9cSSascha Wildner return (AE_OK);
903d4972a9cSSascha Wildner }
904d4972a9cSSascha Wildner
905d4972a9cSSascha Wildner
906d4972a9cSSascha Wildner /*******************************************************************************
907d4972a9cSSascha Wildner *
908d4972a9cSSascha Wildner * FUNCTION: AcpiTbTerminate
909d4972a9cSSascha Wildner *
910d4972a9cSSascha Wildner * PARAMETERS: None
911d4972a9cSSascha Wildner *
912d4972a9cSSascha Wildner * RETURN: None
913d4972a9cSSascha Wildner *
914d4972a9cSSascha Wildner * DESCRIPTION: Delete all internal ACPI tables
915d4972a9cSSascha Wildner *
916d4972a9cSSascha Wildner ******************************************************************************/
917d4972a9cSSascha Wildner
918d4972a9cSSascha Wildner void
AcpiTbTerminate(void)919d4972a9cSSascha Wildner AcpiTbTerminate (
920d4972a9cSSascha Wildner void)
921d4972a9cSSascha Wildner {
922d4972a9cSSascha Wildner UINT32 i;
923d4972a9cSSascha Wildner
924d4972a9cSSascha Wildner
925d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbTerminate);
926d4972a9cSSascha Wildner
927d4972a9cSSascha Wildner
928d4972a9cSSascha Wildner (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
929d4972a9cSSascha Wildner
930d4972a9cSSascha Wildner /* Delete the individual tables */
931d4972a9cSSascha Wildner
932d4972a9cSSascha Wildner for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
933d4972a9cSSascha Wildner {
934d4972a9cSSascha Wildner AcpiTbUninstallTable (&AcpiGbl_RootTableList.Tables[i]);
935d4972a9cSSascha Wildner }
936d4972a9cSSascha Wildner
937d4972a9cSSascha Wildner /*
938d4972a9cSSascha Wildner * Delete the root table array if allocated locally. Array cannot be
939d4972a9cSSascha Wildner * mapped, so we don't need to check for that flag.
940d4972a9cSSascha Wildner */
941d4972a9cSSascha Wildner if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
942d4972a9cSSascha Wildner {
943d4972a9cSSascha Wildner ACPI_FREE (AcpiGbl_RootTableList.Tables);
944d4972a9cSSascha Wildner }
945d4972a9cSSascha Wildner
946d4972a9cSSascha Wildner AcpiGbl_RootTableList.Tables = NULL;
947d4972a9cSSascha Wildner AcpiGbl_RootTableList.Flags = 0;
948d4972a9cSSascha Wildner AcpiGbl_RootTableList.CurrentTableCount = 0;
949d4972a9cSSascha Wildner
950d4972a9cSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
951d4972a9cSSascha Wildner
952d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
953d4972a9cSSascha Wildner return_VOID;
954d4972a9cSSascha Wildner }
955d4972a9cSSascha Wildner
956d4972a9cSSascha Wildner
957d4972a9cSSascha Wildner /*******************************************************************************
958d4972a9cSSascha Wildner *
959d4972a9cSSascha Wildner * FUNCTION: AcpiTbDeleteNamespaceByOwner
960d4972a9cSSascha Wildner *
961d4972a9cSSascha Wildner * PARAMETERS: TableIndex - Table index
962d4972a9cSSascha Wildner *
963d4972a9cSSascha Wildner * RETURN: Status
964d4972a9cSSascha Wildner *
965d4972a9cSSascha Wildner * DESCRIPTION: Delete all namespace objects created when this table was loaded.
966d4972a9cSSascha Wildner *
967d4972a9cSSascha Wildner ******************************************************************************/
968d4972a9cSSascha Wildner
969d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbDeleteNamespaceByOwner(UINT32 TableIndex)970d4972a9cSSascha Wildner AcpiTbDeleteNamespaceByOwner (
971d4972a9cSSascha Wildner UINT32 TableIndex)
972d4972a9cSSascha Wildner {
973d4972a9cSSascha Wildner ACPI_OWNER_ID OwnerId;
974d4972a9cSSascha Wildner ACPI_STATUS Status;
975d4972a9cSSascha Wildner
976d4972a9cSSascha Wildner
977d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
978d4972a9cSSascha Wildner
979d4972a9cSSascha Wildner
980d4972a9cSSascha Wildner Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
981d4972a9cSSascha Wildner if (ACPI_FAILURE (Status))
982d4972a9cSSascha Wildner {
983d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
984d4972a9cSSascha Wildner }
985d4972a9cSSascha Wildner
986d4972a9cSSascha Wildner if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
987d4972a9cSSascha Wildner {
988d4972a9cSSascha Wildner /* The table index does not exist */
989d4972a9cSSascha Wildner
990d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
991d4972a9cSSascha Wildner return_ACPI_STATUS (AE_NOT_EXIST);
992d4972a9cSSascha Wildner }
993d4972a9cSSascha Wildner
994d4972a9cSSascha Wildner /* Get the owner ID for this table, used to delete namespace nodes */
995d4972a9cSSascha Wildner
996d4972a9cSSascha Wildner OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
997d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
998d4972a9cSSascha Wildner
999d4972a9cSSascha Wildner /*
1000d4972a9cSSascha Wildner * Need to acquire the namespace writer lock to prevent interference
1001d4972a9cSSascha Wildner * with any concurrent namespace walks. The interpreter must be
1002d4972a9cSSascha Wildner * released during the deletion since the acquisition of the deletion
1003d4972a9cSSascha Wildner * lock may block, and also since the execution of a namespace walk
1004d4972a9cSSascha Wildner * must be allowed to use the interpreter.
1005d4972a9cSSascha Wildner */
1006d4972a9cSSascha Wildner Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
1007d4972a9cSSascha Wildner if (ACPI_FAILURE (Status))
1008d4972a9cSSascha Wildner {
1009d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
1010d4972a9cSSascha Wildner }
1011e5412f1eSSascha Wildner
101296f24602SSascha Wildner AcpiNsDeleteNamespaceByOwner (OwnerId);
1013d4972a9cSSascha Wildner AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
1014d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
1015d4972a9cSSascha Wildner }
1016d4972a9cSSascha Wildner
1017d4972a9cSSascha Wildner
1018d4972a9cSSascha Wildner /*******************************************************************************
1019d4972a9cSSascha Wildner *
1020d4972a9cSSascha Wildner * FUNCTION: AcpiTbAllocateOwnerId
1021d4972a9cSSascha Wildner *
1022d4972a9cSSascha Wildner * PARAMETERS: TableIndex - Table index
1023d4972a9cSSascha Wildner *
1024d4972a9cSSascha Wildner * RETURN: Status
1025d4972a9cSSascha Wildner *
1026d4972a9cSSascha Wildner * DESCRIPTION: Allocates OwnerId in TableDesc
1027d4972a9cSSascha Wildner *
1028d4972a9cSSascha Wildner ******************************************************************************/
1029d4972a9cSSascha Wildner
1030d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbAllocateOwnerId(UINT32 TableIndex)1031d4972a9cSSascha Wildner AcpiTbAllocateOwnerId (
1032d4972a9cSSascha Wildner UINT32 TableIndex)
1033d4972a9cSSascha Wildner {
1034d4972a9cSSascha Wildner ACPI_STATUS Status = AE_BAD_PARAMETER;
1035d4972a9cSSascha Wildner
1036d4972a9cSSascha Wildner
1037d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
1038d4972a9cSSascha Wildner
1039d4972a9cSSascha Wildner
1040d4972a9cSSascha Wildner (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1041d4972a9cSSascha Wildner if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1042d4972a9cSSascha Wildner {
1043d4972a9cSSascha Wildner Status = AcpiUtAllocateOwnerId (
1044d4972a9cSSascha Wildner &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
1045d4972a9cSSascha Wildner }
1046d4972a9cSSascha Wildner
1047d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1048d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
1049d4972a9cSSascha Wildner }
1050d4972a9cSSascha Wildner
1051d4972a9cSSascha Wildner
1052d4972a9cSSascha Wildner /*******************************************************************************
1053d4972a9cSSascha Wildner *
1054d4972a9cSSascha Wildner * FUNCTION: AcpiTbReleaseOwnerId
1055d4972a9cSSascha Wildner *
1056d4972a9cSSascha Wildner * PARAMETERS: TableIndex - Table index
1057d4972a9cSSascha Wildner *
1058d4972a9cSSascha Wildner * RETURN: Status
1059d4972a9cSSascha Wildner *
1060d4972a9cSSascha Wildner * DESCRIPTION: Releases OwnerId in TableDesc
1061d4972a9cSSascha Wildner *
1062d4972a9cSSascha Wildner ******************************************************************************/
1063d4972a9cSSascha Wildner
1064d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbReleaseOwnerId(UINT32 TableIndex)1065d4972a9cSSascha Wildner AcpiTbReleaseOwnerId (
1066d4972a9cSSascha Wildner UINT32 TableIndex)
1067d4972a9cSSascha Wildner {
1068d4972a9cSSascha Wildner ACPI_STATUS Status = AE_BAD_PARAMETER;
1069d4972a9cSSascha Wildner
1070d4972a9cSSascha Wildner
1071d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
1072d4972a9cSSascha Wildner
1073d4972a9cSSascha Wildner
1074d4972a9cSSascha Wildner (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1075d4972a9cSSascha Wildner if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1076d4972a9cSSascha Wildner {
1077d4972a9cSSascha Wildner AcpiUtReleaseOwnerId (
1078d4972a9cSSascha Wildner &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
1079d4972a9cSSascha Wildner Status = AE_OK;
1080d4972a9cSSascha Wildner }
1081d4972a9cSSascha Wildner
1082d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1083d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
1084d4972a9cSSascha Wildner }
1085d4972a9cSSascha Wildner
1086d4972a9cSSascha Wildner
1087d4972a9cSSascha Wildner /*******************************************************************************
1088d4972a9cSSascha Wildner *
1089d4972a9cSSascha Wildner * FUNCTION: AcpiTbGetOwnerId
1090d4972a9cSSascha Wildner *
1091d4972a9cSSascha Wildner * PARAMETERS: TableIndex - Table index
1092d4972a9cSSascha Wildner * OwnerId - Where the table OwnerId is returned
1093d4972a9cSSascha Wildner *
1094d4972a9cSSascha Wildner * RETURN: Status
1095d4972a9cSSascha Wildner *
1096d4972a9cSSascha Wildner * DESCRIPTION: returns OwnerId for the ACPI table
1097d4972a9cSSascha Wildner *
1098d4972a9cSSascha Wildner ******************************************************************************/
1099d4972a9cSSascha Wildner
1100d4972a9cSSascha Wildner ACPI_STATUS
AcpiTbGetOwnerId(UINT32 TableIndex,ACPI_OWNER_ID * OwnerId)1101d4972a9cSSascha Wildner AcpiTbGetOwnerId (
1102d4972a9cSSascha Wildner UINT32 TableIndex,
1103d4972a9cSSascha Wildner ACPI_OWNER_ID *OwnerId)
1104d4972a9cSSascha Wildner {
1105d4972a9cSSascha Wildner ACPI_STATUS Status = AE_BAD_PARAMETER;
1106d4972a9cSSascha Wildner
1107d4972a9cSSascha Wildner
1108d4972a9cSSascha Wildner ACPI_FUNCTION_TRACE (TbGetOwnerId);
1109d4972a9cSSascha Wildner
1110d4972a9cSSascha Wildner
1111d4972a9cSSascha Wildner (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1112d4972a9cSSascha Wildner if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1113d4972a9cSSascha Wildner {
1114d4972a9cSSascha Wildner *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
1115d4972a9cSSascha Wildner Status = AE_OK;
1116d4972a9cSSascha Wildner }
1117d4972a9cSSascha Wildner
1118d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1119d4972a9cSSascha Wildner return_ACPI_STATUS (Status);
1120d4972a9cSSascha Wildner }
1121d4972a9cSSascha Wildner
1122d4972a9cSSascha Wildner
1123d4972a9cSSascha Wildner /*******************************************************************************
1124d4972a9cSSascha Wildner *
1125d4972a9cSSascha Wildner * FUNCTION: AcpiTbIsTableLoaded
1126d4972a9cSSascha Wildner *
1127d4972a9cSSascha Wildner * PARAMETERS: TableIndex - Index into the root table
1128d4972a9cSSascha Wildner *
1129d4972a9cSSascha Wildner * RETURN: Table Loaded Flag
1130d4972a9cSSascha Wildner *
1131d4972a9cSSascha Wildner ******************************************************************************/
1132d4972a9cSSascha Wildner
1133d4972a9cSSascha Wildner BOOLEAN
AcpiTbIsTableLoaded(UINT32 TableIndex)1134d4972a9cSSascha Wildner AcpiTbIsTableLoaded (
1135d4972a9cSSascha Wildner UINT32 TableIndex)
1136d4972a9cSSascha Wildner {
1137d4972a9cSSascha Wildner BOOLEAN IsLoaded = FALSE;
1138d4972a9cSSascha Wildner
1139d4972a9cSSascha Wildner
1140d4972a9cSSascha Wildner (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1141d4972a9cSSascha Wildner if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1142d4972a9cSSascha Wildner {
1143d4972a9cSSascha Wildner IsLoaded = (BOOLEAN)
1144d4972a9cSSascha Wildner (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
1145d4972a9cSSascha Wildner ACPI_TABLE_IS_LOADED);
1146d4972a9cSSascha Wildner }
1147d4972a9cSSascha Wildner
1148d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1149d4972a9cSSascha Wildner return (IsLoaded);
1150d4972a9cSSascha Wildner }
1151d4972a9cSSascha Wildner
1152d4972a9cSSascha Wildner
1153d4972a9cSSascha Wildner /*******************************************************************************
1154d4972a9cSSascha Wildner *
1155d4972a9cSSascha Wildner * FUNCTION: AcpiTbSetTableLoadedFlag
1156d4972a9cSSascha Wildner *
1157d4972a9cSSascha Wildner * PARAMETERS: TableIndex - Table index
1158d4972a9cSSascha Wildner * IsLoaded - TRUE if table is loaded, FALSE otherwise
1159d4972a9cSSascha Wildner *
1160d4972a9cSSascha Wildner * RETURN: None
1161d4972a9cSSascha Wildner *
1162d4972a9cSSascha Wildner * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
1163d4972a9cSSascha Wildner *
1164d4972a9cSSascha Wildner ******************************************************************************/
1165d4972a9cSSascha Wildner
1166d4972a9cSSascha Wildner void
AcpiTbSetTableLoadedFlag(UINT32 TableIndex,BOOLEAN IsLoaded)1167d4972a9cSSascha Wildner AcpiTbSetTableLoadedFlag (
1168d4972a9cSSascha Wildner UINT32 TableIndex,
1169d4972a9cSSascha Wildner BOOLEAN IsLoaded)
1170d4972a9cSSascha Wildner {
1171d4972a9cSSascha Wildner
1172d4972a9cSSascha Wildner (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1173d4972a9cSSascha Wildner if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
1174d4972a9cSSascha Wildner {
1175d4972a9cSSascha Wildner if (IsLoaded)
1176d4972a9cSSascha Wildner {
1177d4972a9cSSascha Wildner AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
1178d4972a9cSSascha Wildner ACPI_TABLE_IS_LOADED;
1179d4972a9cSSascha Wildner }
1180d4972a9cSSascha Wildner else
1181d4972a9cSSascha Wildner {
1182d4972a9cSSascha Wildner AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
1183d4972a9cSSascha Wildner ~ACPI_TABLE_IS_LOADED;
1184d4972a9cSSascha Wildner }
1185d4972a9cSSascha Wildner }
1186d4972a9cSSascha Wildner
1187d4972a9cSSascha Wildner (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1188d4972a9cSSascha Wildner }
1189e5e174adSSascha Wildner
1190e5e174adSSascha Wildner
1191e5e174adSSascha Wildner /*******************************************************************************
1192e5e174adSSascha Wildner *
1193e5e174adSSascha Wildner * FUNCTION: AcpiTbLoadTable
1194e5e174adSSascha Wildner *
1195e5e174adSSascha Wildner * PARAMETERS: TableIndex - Table index
1196e5e174adSSascha Wildner * ParentNode - Where table index is returned
1197e5e174adSSascha Wildner *
1198e5e174adSSascha Wildner * RETURN: Status
1199e5e174adSSascha Wildner *
1200e5e174adSSascha Wildner * DESCRIPTION: Load an ACPI table
1201e5e174adSSascha Wildner *
1202e5e174adSSascha Wildner ******************************************************************************/
1203e5e174adSSascha Wildner
1204e5e174adSSascha Wildner ACPI_STATUS
AcpiTbLoadTable(UINT32 TableIndex,ACPI_NAMESPACE_NODE * ParentNode)1205e5e174adSSascha Wildner AcpiTbLoadTable (
1206e5e174adSSascha Wildner UINT32 TableIndex,
1207e5e174adSSascha Wildner ACPI_NAMESPACE_NODE *ParentNode)
1208e5e174adSSascha Wildner {
1209e5e174adSSascha Wildner ACPI_TABLE_HEADER *Table;
1210e5e174adSSascha Wildner ACPI_STATUS Status;
1211e5e174adSSascha Wildner ACPI_OWNER_ID OwnerId;
1212e5e174adSSascha Wildner
1213e5e174adSSascha Wildner
1214e5e174adSSascha Wildner ACPI_FUNCTION_TRACE (TbLoadTable);
1215e5e174adSSascha Wildner
1216e5e174adSSascha Wildner
1217e5e174adSSascha Wildner /*
1218e5e174adSSascha Wildner * Note: Now table is "INSTALLED", it must be validated before
1219e5e174adSSascha Wildner * using.
1220e5e174adSSascha Wildner */
1221e5e174adSSascha Wildner Status = AcpiGetTableByIndex (TableIndex, &Table);
1222e5e174adSSascha Wildner if (ACPI_FAILURE (Status))
1223e5e174adSSascha Wildner {
1224e5e174adSSascha Wildner return_ACPI_STATUS (Status);
1225e5e174adSSascha Wildner }
1226e5e174adSSascha Wildner
1227e5e174adSSascha Wildner Status = AcpiNsLoadTable (TableIndex, ParentNode);
1228e5412f1eSSascha Wildner if (ACPI_FAILURE (Status))
1229e5412f1eSSascha Wildner {
1230e5412f1eSSascha Wildner return_ACPI_STATUS (Status);
1231e5412f1eSSascha Wildner }
1232e5e174adSSascha Wildner
12337bcb6cafSSascha Wildner /*
1234e5e174adSSascha Wildner * Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
1235e5e174adSSascha Wildner * responsible for discovering any new wake GPEs by running _PRW methods
1236e5e174adSSascha Wildner * that may have been loaded by this table.
1237e5e174adSSascha Wildner */
1238e5e174adSSascha Wildner Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
1239e5e174adSSascha Wildner if (ACPI_SUCCESS (Status))
1240e5e174adSSascha Wildner {
1241e5e174adSSascha Wildner AcpiEvUpdateGpes (OwnerId);
1242e5e174adSSascha Wildner }
1243e5e174adSSascha Wildner
12441093ca81SSascha Wildner /* Invoke table handler */
1245e5e174adSSascha Wildner
12461093ca81SSascha Wildner AcpiTbNotifyTable (ACPI_TABLE_EVENT_LOAD, Table);
1247e5e174adSSascha Wildner return_ACPI_STATUS (Status);
1248e5e174adSSascha Wildner }
1249e5e174adSSascha Wildner
1250e5e174adSSascha Wildner
1251e5e174adSSascha Wildner /*******************************************************************************
1252e5e174adSSascha Wildner *
1253e5e174adSSascha Wildner * FUNCTION: AcpiTbInstallAndLoadTable
1254e5e174adSSascha Wildner *
1255a96e04f2SSascha Wildner * PARAMETERS: Address - Physical address of the table
1256e5e174adSSascha Wildner * Flags - Allocation flags of the table
1257*aab122a6SSascha Wildner * Table - Pointer to the table (required for
1258*aab122a6SSascha Wildner * virtual origins, optional for
1259*aab122a6SSascha Wildner * physical)
1260a96e04f2SSascha Wildner * Override - Whether override should be performed
1261e5e174adSSascha Wildner * TableIndex - Where table index is returned
1262e5e174adSSascha Wildner *
1263e5e174adSSascha Wildner * RETURN: Status
1264e5e174adSSascha Wildner *
1265e5e174adSSascha Wildner * DESCRIPTION: Install and load an ACPI table
1266e5e174adSSascha Wildner *
1267e5e174adSSascha Wildner ******************************************************************************/
1268e5e174adSSascha Wildner
1269e5e174adSSascha Wildner ACPI_STATUS
AcpiTbInstallAndLoadTable(ACPI_PHYSICAL_ADDRESS Address,UINT8 Flags,ACPI_TABLE_HEADER * Table,BOOLEAN Override,UINT32 * TableIndex)1270e5e174adSSascha Wildner AcpiTbInstallAndLoadTable (
1271e5e174adSSascha Wildner ACPI_PHYSICAL_ADDRESS Address,
1272e5e174adSSascha Wildner UINT8 Flags,
1273*aab122a6SSascha Wildner ACPI_TABLE_HEADER *Table,
1274e5e174adSSascha Wildner BOOLEAN Override,
1275e5e174adSSascha Wildner UINT32 *TableIndex)
1276e5e174adSSascha Wildner {
1277e5e174adSSascha Wildner ACPI_STATUS Status;
1278e5e174adSSascha Wildner UINT32 i;
1279e5e174adSSascha Wildner
1280e5e174adSSascha Wildner
1281a96e04f2SSascha Wildner ACPI_FUNCTION_TRACE (TbInstallAndLoadTable);
1282e5e174adSSascha Wildner
1283e5e174adSSascha Wildner
1284e5e174adSSascha Wildner /* Install the table and load it into the namespace */
1285e5e174adSSascha Wildner
1286*aab122a6SSascha Wildner Status = AcpiTbInstallStandardTable (Address, Flags, Table, TRUE,
1287e5e174adSSascha Wildner Override, &i);
1288e5e174adSSascha Wildner if (ACPI_FAILURE (Status))
1289e5e174adSSascha Wildner {
12901093ca81SSascha Wildner goto Exit;
1291e5e174adSSascha Wildner }
1292e5e174adSSascha Wildner
1293a96e04f2SSascha Wildner Status = AcpiTbLoadTable (i, AcpiGbl_RootNode);
1294e5e174adSSascha Wildner
12951093ca81SSascha Wildner Exit:
1296a96e04f2SSascha Wildner *TableIndex = i;
1297a96e04f2SSascha Wildner return_ACPI_STATUS (Status);
1298e5e174adSSascha Wildner }
1299e5e174adSSascha Wildner
1300a96e04f2SSascha Wildner
1301a96e04f2SSascha Wildner /*******************************************************************************
1302a96e04f2SSascha Wildner *
1303a96e04f2SSascha Wildner * FUNCTION: AcpiTbUnloadTable
1304a96e04f2SSascha Wildner *
1305a96e04f2SSascha Wildner * PARAMETERS: TableIndex - Table index
1306a96e04f2SSascha Wildner *
1307a96e04f2SSascha Wildner * RETURN: Status
1308a96e04f2SSascha Wildner *
1309a96e04f2SSascha Wildner * DESCRIPTION: Unload an ACPI table
1310a96e04f2SSascha Wildner *
1311a96e04f2SSascha Wildner ******************************************************************************/
1312a96e04f2SSascha Wildner
1313a96e04f2SSascha Wildner ACPI_STATUS
AcpiTbUnloadTable(UINT32 TableIndex)1314a96e04f2SSascha Wildner AcpiTbUnloadTable (
1315a96e04f2SSascha Wildner UINT32 TableIndex)
1316e5e174adSSascha Wildner {
1317a96e04f2SSascha Wildner ACPI_STATUS Status = AE_OK;
1318a96e04f2SSascha Wildner ACPI_TABLE_HEADER *Table;
1319a96e04f2SSascha Wildner
1320a96e04f2SSascha Wildner
1321a96e04f2SSascha Wildner ACPI_FUNCTION_TRACE (TbUnloadTable);
1322a96e04f2SSascha Wildner
1323a96e04f2SSascha Wildner
1324a96e04f2SSascha Wildner /* Ensure the table is still loaded */
1325a96e04f2SSascha Wildner
1326a96e04f2SSascha Wildner if (!AcpiTbIsTableLoaded (TableIndex))
1327a96e04f2SSascha Wildner {
1328a96e04f2SSascha Wildner return_ACPI_STATUS (AE_NOT_EXIST);
1329e5e174adSSascha Wildner }
1330e5e174adSSascha Wildner
13311093ca81SSascha Wildner /* Invoke table handler */
1332e5e174adSSascha Wildner
1333a96e04f2SSascha Wildner Status = AcpiGetTableByIndex (TableIndex, &Table);
1334a96e04f2SSascha Wildner if (ACPI_SUCCESS (Status))
1335a96e04f2SSascha Wildner {
13361093ca81SSascha Wildner AcpiTbNotifyTable (ACPI_TABLE_EVENT_UNLOAD, Table);
1337a96e04f2SSascha Wildner }
1338e5e174adSSascha Wildner
1339a96e04f2SSascha Wildner /* Delete the portion of the namespace owned by this table */
1340a96e04f2SSascha Wildner
1341a96e04f2SSascha Wildner Status = AcpiTbDeleteNamespaceByOwner (TableIndex);
1342a96e04f2SSascha Wildner if (ACPI_FAILURE (Status))
1343a96e04f2SSascha Wildner {
1344a96e04f2SSascha Wildner return_ACPI_STATUS (Status);
1345a96e04f2SSascha Wildner }
1346a96e04f2SSascha Wildner
1347a96e04f2SSascha Wildner (void) AcpiTbReleaseOwnerId (TableIndex);
1348a96e04f2SSascha Wildner AcpiTbSetTableLoadedFlag (TableIndex, FALSE);
1349e5e174adSSascha Wildner return_ACPI_STATUS (Status);
1350e5e174adSSascha Wildner }
13511093ca81SSascha Wildner
13521093ca81SSascha Wildner
13531093ca81SSascha Wildner /*******************************************************************************
13541093ca81SSascha Wildner *
13551093ca81SSascha Wildner * FUNCTION: AcpiTbNotifyTable
13561093ca81SSascha Wildner *
13571093ca81SSascha Wildner * PARAMETERS: Event - Table event
13581093ca81SSascha Wildner * Table - Validated table pointer
13591093ca81SSascha Wildner *
13601093ca81SSascha Wildner * RETURN: None
13611093ca81SSascha Wildner *
13621093ca81SSascha Wildner * DESCRIPTION: Notify a table event to the users.
13631093ca81SSascha Wildner *
13641093ca81SSascha Wildner ******************************************************************************/
13651093ca81SSascha Wildner
13661093ca81SSascha Wildner void
AcpiTbNotifyTable(UINT32 Event,void * Table)13671093ca81SSascha Wildner AcpiTbNotifyTable (
13681093ca81SSascha Wildner UINT32 Event,
13691093ca81SSascha Wildner void *Table)
13701093ca81SSascha Wildner {
13711093ca81SSascha Wildner /* Invoke table handler if present */
13721093ca81SSascha Wildner
13731093ca81SSascha Wildner if (AcpiGbl_TableHandler)
13741093ca81SSascha Wildner {
13751093ca81SSascha Wildner (void) AcpiGbl_TableHandler (Event, Table,
13761093ca81SSascha Wildner AcpiGbl_TableHandlerContext);
13771093ca81SSascha Wildner }
13781093ca81SSascha Wildner }
1379