xref: /titanic_52/usr/src/uts/intel/io/acpica/tables/tbdata.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
1*385cc6b4SJerry Jelinek /******************************************************************************
2*385cc6b4SJerry Jelinek  *
3*385cc6b4SJerry Jelinek  * Module Name: tbdata - Table manager data structure functions
4*385cc6b4SJerry Jelinek  *
5*385cc6b4SJerry Jelinek  *****************************************************************************/
6*385cc6b4SJerry Jelinek 
7*385cc6b4SJerry Jelinek /*
8*385cc6b4SJerry Jelinek  * Copyright (C) 2000 - 2016, Intel Corp.
9*385cc6b4SJerry Jelinek  * All rights reserved.
10*385cc6b4SJerry Jelinek  *
11*385cc6b4SJerry Jelinek  * Redistribution and use in source and binary forms, with or without
12*385cc6b4SJerry Jelinek  * modification, are permitted provided that the following conditions
13*385cc6b4SJerry Jelinek  * are met:
14*385cc6b4SJerry Jelinek  * 1. Redistributions of source code must retain the above copyright
15*385cc6b4SJerry Jelinek  *    notice, this list of conditions, and the following disclaimer,
16*385cc6b4SJerry Jelinek  *    without modification.
17*385cc6b4SJerry Jelinek  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*385cc6b4SJerry Jelinek  *    substantially similar to the "NO WARRANTY" disclaimer below
19*385cc6b4SJerry Jelinek  *    ("Disclaimer") and any redistribution must be conditioned upon
20*385cc6b4SJerry Jelinek  *    including a substantially similar Disclaimer requirement for further
21*385cc6b4SJerry Jelinek  *    binary redistribution.
22*385cc6b4SJerry Jelinek  * 3. Neither the names of the above-listed copyright holders nor the names
23*385cc6b4SJerry Jelinek  *    of any contributors may be used to endorse or promote products derived
24*385cc6b4SJerry Jelinek  *    from this software without specific prior written permission.
25*385cc6b4SJerry Jelinek  *
26*385cc6b4SJerry Jelinek  * Alternatively, this software may be distributed under the terms of the
27*385cc6b4SJerry Jelinek  * GNU General Public License ("GPL") version 2 as published by the Free
28*385cc6b4SJerry Jelinek  * Software Foundation.
29*385cc6b4SJerry Jelinek  *
30*385cc6b4SJerry Jelinek  * NO WARRANTY
31*385cc6b4SJerry Jelinek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*385cc6b4SJerry Jelinek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*385cc6b4SJerry Jelinek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*385cc6b4SJerry Jelinek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*385cc6b4SJerry Jelinek  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*385cc6b4SJerry Jelinek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*385cc6b4SJerry Jelinek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*385cc6b4SJerry Jelinek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*385cc6b4SJerry Jelinek  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*385cc6b4SJerry Jelinek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*385cc6b4SJerry Jelinek  * POSSIBILITY OF SUCH DAMAGES.
42*385cc6b4SJerry Jelinek  */
43*385cc6b4SJerry Jelinek 
44*385cc6b4SJerry Jelinek #include "acpi.h"
45*385cc6b4SJerry Jelinek #include "accommon.h"
46*385cc6b4SJerry Jelinek #include "acnamesp.h"
47*385cc6b4SJerry Jelinek #include "actables.h"
48*385cc6b4SJerry Jelinek 
49*385cc6b4SJerry Jelinek #define _COMPONENT          ACPI_TABLES
50*385cc6b4SJerry Jelinek         ACPI_MODULE_NAME    ("tbdata")
51*385cc6b4SJerry Jelinek 
52*385cc6b4SJerry Jelinek 
53*385cc6b4SJerry Jelinek /*******************************************************************************
54*385cc6b4SJerry Jelinek  *
55*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbInitTableDescriptor
56*385cc6b4SJerry Jelinek  *
57*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc               - Table descriptor
58*385cc6b4SJerry Jelinek  *              Address                 - Physical address of the table
59*385cc6b4SJerry Jelinek  *              Flags                   - Allocation flags of the table
60*385cc6b4SJerry Jelinek  *              Table                   - Pointer to the table
61*385cc6b4SJerry Jelinek  *
62*385cc6b4SJerry Jelinek  * RETURN:      None
63*385cc6b4SJerry Jelinek  *
64*385cc6b4SJerry Jelinek  * DESCRIPTION: Initialize a new table descriptor
65*385cc6b4SJerry Jelinek  *
66*385cc6b4SJerry Jelinek  ******************************************************************************/
67*385cc6b4SJerry Jelinek 
68*385cc6b4SJerry Jelinek void
69*385cc6b4SJerry Jelinek AcpiTbInitTableDescriptor (
70*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc,
71*385cc6b4SJerry Jelinek     ACPI_PHYSICAL_ADDRESS   Address,
72*385cc6b4SJerry Jelinek     UINT8                   Flags,
73*385cc6b4SJerry Jelinek     ACPI_TABLE_HEADER       *Table)
74*385cc6b4SJerry Jelinek {
75*385cc6b4SJerry Jelinek 
76*385cc6b4SJerry Jelinek     /*
77*385cc6b4SJerry Jelinek      * Initialize the table descriptor. Set the pointer to NULL, since the
78*385cc6b4SJerry Jelinek      * table is not fully mapped at this time.
79*385cc6b4SJerry Jelinek      */
80*385cc6b4SJerry Jelinek     memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC));
81*385cc6b4SJerry Jelinek     TableDesc->Address = Address;
82*385cc6b4SJerry Jelinek     TableDesc->Length = Table->Length;
83*385cc6b4SJerry Jelinek     TableDesc->Flags = Flags;
84*385cc6b4SJerry Jelinek     ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
85*385cc6b4SJerry Jelinek }
86*385cc6b4SJerry Jelinek 
87*385cc6b4SJerry Jelinek 
88*385cc6b4SJerry Jelinek /*******************************************************************************
89*385cc6b4SJerry Jelinek  *
90*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbAcquireTable
91*385cc6b4SJerry Jelinek  *
92*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc           - Table descriptor
93*385cc6b4SJerry Jelinek  *              TablePtr            - Where table is returned
94*385cc6b4SJerry Jelinek  *              TableLength         - Where table length is returned
95*385cc6b4SJerry Jelinek  *              TableFlags          - Where table allocation flags are returned
96*385cc6b4SJerry Jelinek  *
97*385cc6b4SJerry Jelinek  * RETURN:      Status
98*385cc6b4SJerry Jelinek  *
99*385cc6b4SJerry Jelinek  * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
100*385cc6b4SJerry Jelinek  *              maintained in the AcpiGbl_RootTableList.
101*385cc6b4SJerry Jelinek  *
102*385cc6b4SJerry Jelinek  ******************************************************************************/
103*385cc6b4SJerry Jelinek 
104*385cc6b4SJerry Jelinek ACPI_STATUS
105*385cc6b4SJerry Jelinek AcpiTbAcquireTable (
106*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc,
107*385cc6b4SJerry Jelinek     ACPI_TABLE_HEADER       **TablePtr,
108*385cc6b4SJerry Jelinek     UINT32                  *TableLength,
109*385cc6b4SJerry Jelinek     UINT8                   *TableFlags)
110*385cc6b4SJerry Jelinek {
111*385cc6b4SJerry Jelinek     ACPI_TABLE_HEADER       *Table = NULL;
112*385cc6b4SJerry Jelinek 
113*385cc6b4SJerry Jelinek 
114*385cc6b4SJerry Jelinek     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
115*385cc6b4SJerry Jelinek     {
116*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
117*385cc6b4SJerry Jelinek 
118*385cc6b4SJerry Jelinek         Table = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
119*385cc6b4SJerry Jelinek         break;
120*385cc6b4SJerry Jelinek 
121*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
122*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
123*385cc6b4SJerry Jelinek 
124*385cc6b4SJerry Jelinek         Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
125*385cc6b4SJerry Jelinek             ACPI_PHYSADDR_TO_PTR (TableDesc->Address));
126*385cc6b4SJerry Jelinek         break;
127*385cc6b4SJerry Jelinek 
128*385cc6b4SJerry Jelinek     default:
129*385cc6b4SJerry Jelinek 
130*385cc6b4SJerry Jelinek         break;
131*385cc6b4SJerry Jelinek     }
132*385cc6b4SJerry Jelinek 
133*385cc6b4SJerry Jelinek     /* Table is not valid yet */
134*385cc6b4SJerry Jelinek 
135*385cc6b4SJerry Jelinek     if (!Table)
136*385cc6b4SJerry Jelinek     {
137*385cc6b4SJerry Jelinek         return (AE_NO_MEMORY);
138*385cc6b4SJerry Jelinek     }
139*385cc6b4SJerry Jelinek 
140*385cc6b4SJerry Jelinek     /* Fill the return values */
141*385cc6b4SJerry Jelinek 
142*385cc6b4SJerry Jelinek     *TablePtr = Table;
143*385cc6b4SJerry Jelinek     *TableLength = TableDesc->Length;
144*385cc6b4SJerry Jelinek     *TableFlags = TableDesc->Flags;
145*385cc6b4SJerry Jelinek     return (AE_OK);
146*385cc6b4SJerry Jelinek }
147*385cc6b4SJerry Jelinek 
148*385cc6b4SJerry Jelinek 
149*385cc6b4SJerry Jelinek /*******************************************************************************
150*385cc6b4SJerry Jelinek  *
151*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbReleaseTable
152*385cc6b4SJerry Jelinek  *
153*385cc6b4SJerry Jelinek  * PARAMETERS:  Table               - Pointer for the table
154*385cc6b4SJerry Jelinek  *              TableLength         - Length for the table
155*385cc6b4SJerry Jelinek  *              TableFlags          - Allocation flags for the table
156*385cc6b4SJerry Jelinek  *
157*385cc6b4SJerry Jelinek  * RETURN:      None
158*385cc6b4SJerry Jelinek  *
159*385cc6b4SJerry Jelinek  * DESCRIPTION: Release a table. The inverse of AcpiTbAcquireTable().
160*385cc6b4SJerry Jelinek  *
161*385cc6b4SJerry Jelinek  ******************************************************************************/
162*385cc6b4SJerry Jelinek 
163*385cc6b4SJerry Jelinek void
164*385cc6b4SJerry Jelinek AcpiTbReleaseTable (
165*385cc6b4SJerry Jelinek     ACPI_TABLE_HEADER       *Table,
166*385cc6b4SJerry Jelinek     UINT32                  TableLength,
167*385cc6b4SJerry Jelinek     UINT8                   TableFlags)
168*385cc6b4SJerry Jelinek {
169*385cc6b4SJerry Jelinek 
170*385cc6b4SJerry Jelinek     switch (TableFlags & ACPI_TABLE_ORIGIN_MASK)
171*385cc6b4SJerry Jelinek     {
172*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
173*385cc6b4SJerry Jelinek 
174*385cc6b4SJerry Jelinek         AcpiOsUnmapMemory (Table, TableLength);
175*385cc6b4SJerry Jelinek         break;
176*385cc6b4SJerry Jelinek 
177*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
178*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
179*385cc6b4SJerry Jelinek     default:
180*385cc6b4SJerry Jelinek 
181*385cc6b4SJerry Jelinek         break;
182*385cc6b4SJerry Jelinek     }
183*385cc6b4SJerry Jelinek }
184*385cc6b4SJerry Jelinek 
185*385cc6b4SJerry Jelinek 
186*385cc6b4SJerry Jelinek /*******************************************************************************
187*385cc6b4SJerry Jelinek  *
188*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbAcquireTempTable
189*385cc6b4SJerry Jelinek  *
190*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc           - Table descriptor to be acquired
191*385cc6b4SJerry Jelinek  *              Address             - Address of the table
192*385cc6b4SJerry Jelinek  *              Flags               - Allocation flags of the table
193*385cc6b4SJerry Jelinek  *
194*385cc6b4SJerry Jelinek  * RETURN:      Status
195*385cc6b4SJerry Jelinek  *
196*385cc6b4SJerry Jelinek  * DESCRIPTION: This function validates the table header to obtain the length
197*385cc6b4SJerry Jelinek  *              of a table and fills the table descriptor to make its state as
198*385cc6b4SJerry Jelinek  *              "INSTALLED". Such a table descriptor is only used for verified
199*385cc6b4SJerry Jelinek  *              installation.
200*385cc6b4SJerry Jelinek  *
201*385cc6b4SJerry Jelinek  ******************************************************************************/
202*385cc6b4SJerry Jelinek 
203*385cc6b4SJerry Jelinek ACPI_STATUS
204*385cc6b4SJerry Jelinek AcpiTbAcquireTempTable (
205*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc,
206*385cc6b4SJerry Jelinek     ACPI_PHYSICAL_ADDRESS   Address,
207*385cc6b4SJerry Jelinek     UINT8                   Flags)
208*385cc6b4SJerry Jelinek {
209*385cc6b4SJerry Jelinek     ACPI_TABLE_HEADER       *TableHeader;
210*385cc6b4SJerry Jelinek 
211*385cc6b4SJerry Jelinek 
212*385cc6b4SJerry Jelinek     switch (Flags & ACPI_TABLE_ORIGIN_MASK)
213*385cc6b4SJerry Jelinek     {
214*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
215*385cc6b4SJerry Jelinek 
216*385cc6b4SJerry Jelinek         /* Get the length of the full table from the header */
217*385cc6b4SJerry Jelinek 
218*385cc6b4SJerry Jelinek         TableHeader = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
219*385cc6b4SJerry Jelinek         if (!TableHeader)
220*385cc6b4SJerry Jelinek         {
221*385cc6b4SJerry Jelinek             return (AE_NO_MEMORY);
222*385cc6b4SJerry Jelinek         }
223*385cc6b4SJerry Jelinek 
224*385cc6b4SJerry Jelinek         AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
225*385cc6b4SJerry Jelinek         AcpiOsUnmapMemory (TableHeader, sizeof (ACPI_TABLE_HEADER));
226*385cc6b4SJerry Jelinek         return (AE_OK);
227*385cc6b4SJerry Jelinek 
228*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
229*385cc6b4SJerry Jelinek     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
230*385cc6b4SJerry Jelinek 
231*385cc6b4SJerry Jelinek         TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
232*385cc6b4SJerry Jelinek             ACPI_PHYSADDR_TO_PTR (Address));
233*385cc6b4SJerry Jelinek         if (!TableHeader)
234*385cc6b4SJerry Jelinek         {
235*385cc6b4SJerry Jelinek             return (AE_NO_MEMORY);
236*385cc6b4SJerry Jelinek         }
237*385cc6b4SJerry Jelinek 
238*385cc6b4SJerry Jelinek         AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
239*385cc6b4SJerry Jelinek         return (AE_OK);
240*385cc6b4SJerry Jelinek 
241*385cc6b4SJerry Jelinek     default:
242*385cc6b4SJerry Jelinek 
243*385cc6b4SJerry Jelinek         break;
244*385cc6b4SJerry Jelinek     }
245*385cc6b4SJerry Jelinek 
246*385cc6b4SJerry Jelinek     /* Table is not valid yet */
247*385cc6b4SJerry Jelinek 
248*385cc6b4SJerry Jelinek     return (AE_NO_MEMORY);
249*385cc6b4SJerry Jelinek }
250*385cc6b4SJerry Jelinek 
251*385cc6b4SJerry Jelinek 
252*385cc6b4SJerry Jelinek /*******************************************************************************
253*385cc6b4SJerry Jelinek  *
254*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbReleaseTempTable
255*385cc6b4SJerry Jelinek  *
256*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc           - Table descriptor to be released
257*385cc6b4SJerry Jelinek  *
258*385cc6b4SJerry Jelinek  * RETURN:      Status
259*385cc6b4SJerry Jelinek  *
260*385cc6b4SJerry Jelinek  * DESCRIPTION: The inverse of AcpiTbAcquireTempTable().
261*385cc6b4SJerry Jelinek  *
262*385cc6b4SJerry Jelinek  *****************************************************************************/
263*385cc6b4SJerry Jelinek 
264*385cc6b4SJerry Jelinek void
265*385cc6b4SJerry Jelinek AcpiTbReleaseTempTable (
266*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc)
267*385cc6b4SJerry Jelinek {
268*385cc6b4SJerry Jelinek 
269*385cc6b4SJerry Jelinek     /*
270*385cc6b4SJerry Jelinek      * Note that the .Address is maintained by the callers of
271*385cc6b4SJerry Jelinek      * AcpiTbAcquireTempTable(), thus do not invoke AcpiTbUninstallTable()
272*385cc6b4SJerry Jelinek      * where .Address will be freed.
273*385cc6b4SJerry Jelinek      */
274*385cc6b4SJerry Jelinek     AcpiTbInvalidateTable (TableDesc);
275*385cc6b4SJerry Jelinek }
276*385cc6b4SJerry Jelinek 
277*385cc6b4SJerry Jelinek 
278*385cc6b4SJerry Jelinek /******************************************************************************
279*385cc6b4SJerry Jelinek  *
280*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbValidateTable
281*385cc6b4SJerry Jelinek  *
282*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc           - Table descriptor
283*385cc6b4SJerry Jelinek  *
284*385cc6b4SJerry Jelinek  * RETURN:      Status
285*385cc6b4SJerry Jelinek  *
286*385cc6b4SJerry Jelinek  * DESCRIPTION: This function is called to validate the table, the returned
287*385cc6b4SJerry Jelinek  *              table descriptor is in "VALIDATED" state.
288*385cc6b4SJerry Jelinek  *
289*385cc6b4SJerry Jelinek  *****************************************************************************/
290*385cc6b4SJerry Jelinek 
291*385cc6b4SJerry Jelinek ACPI_STATUS
292*385cc6b4SJerry Jelinek AcpiTbValidateTable (
293*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc)
294*385cc6b4SJerry Jelinek {
295*385cc6b4SJerry Jelinek     ACPI_STATUS             Status = AE_OK;
296*385cc6b4SJerry Jelinek 
297*385cc6b4SJerry Jelinek 
298*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbValidateTable);
299*385cc6b4SJerry Jelinek 
300*385cc6b4SJerry Jelinek 
301*385cc6b4SJerry Jelinek     /* Validate the table if necessary */
302*385cc6b4SJerry Jelinek 
303*385cc6b4SJerry Jelinek     if (!TableDesc->Pointer)
304*385cc6b4SJerry Jelinek     {
305*385cc6b4SJerry Jelinek         Status = AcpiTbAcquireTable (TableDesc, &TableDesc->Pointer,
306*385cc6b4SJerry Jelinek             &TableDesc->Length, &TableDesc->Flags);
307*385cc6b4SJerry Jelinek         if (!TableDesc->Pointer)
308*385cc6b4SJerry Jelinek         {
309*385cc6b4SJerry Jelinek             Status = AE_NO_MEMORY;
310*385cc6b4SJerry Jelinek         }
311*385cc6b4SJerry Jelinek     }
312*385cc6b4SJerry Jelinek 
313*385cc6b4SJerry Jelinek     return_ACPI_STATUS (Status);
314*385cc6b4SJerry Jelinek }
315*385cc6b4SJerry Jelinek 
316*385cc6b4SJerry Jelinek 
317*385cc6b4SJerry Jelinek /*******************************************************************************
318*385cc6b4SJerry Jelinek  *
319*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbInvalidateTable
320*385cc6b4SJerry Jelinek  *
321*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc           - Table descriptor
322*385cc6b4SJerry Jelinek  *
323*385cc6b4SJerry Jelinek  * RETURN:      None
324*385cc6b4SJerry Jelinek  *
325*385cc6b4SJerry Jelinek  * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
326*385cc6b4SJerry Jelinek  *              AcpiTbValidateTable().
327*385cc6b4SJerry Jelinek  *
328*385cc6b4SJerry Jelinek  ******************************************************************************/
329*385cc6b4SJerry Jelinek 
330*385cc6b4SJerry Jelinek void
331*385cc6b4SJerry Jelinek AcpiTbInvalidateTable (
332*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc)
333*385cc6b4SJerry Jelinek {
334*385cc6b4SJerry Jelinek 
335*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbInvalidateTable);
336*385cc6b4SJerry Jelinek 
337*385cc6b4SJerry Jelinek 
338*385cc6b4SJerry Jelinek     /* Table must be validated */
339*385cc6b4SJerry Jelinek 
340*385cc6b4SJerry Jelinek     if (!TableDesc->Pointer)
341*385cc6b4SJerry Jelinek     {
342*385cc6b4SJerry Jelinek         return_VOID;
343*385cc6b4SJerry Jelinek     }
344*385cc6b4SJerry Jelinek 
345*385cc6b4SJerry Jelinek     AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length,
346*385cc6b4SJerry Jelinek         TableDesc->Flags);
347*385cc6b4SJerry Jelinek     TableDesc->Pointer = NULL;
348*385cc6b4SJerry Jelinek 
349*385cc6b4SJerry Jelinek     return_VOID;
350*385cc6b4SJerry Jelinek }
351*385cc6b4SJerry Jelinek 
352*385cc6b4SJerry Jelinek 
353*385cc6b4SJerry Jelinek /******************************************************************************
354*385cc6b4SJerry Jelinek  *
355*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbValidateTempTable
356*385cc6b4SJerry Jelinek  *
357*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc           - Table descriptor
358*385cc6b4SJerry Jelinek  *
359*385cc6b4SJerry Jelinek  * RETURN:      Status
360*385cc6b4SJerry Jelinek  *
361*385cc6b4SJerry Jelinek  * DESCRIPTION: This function is called to validate the table, the returned
362*385cc6b4SJerry Jelinek  *              table descriptor is in "VALIDATED" state.
363*385cc6b4SJerry Jelinek  *
364*385cc6b4SJerry Jelinek  *****************************************************************************/
365*385cc6b4SJerry Jelinek 
366*385cc6b4SJerry Jelinek ACPI_STATUS
367*385cc6b4SJerry Jelinek AcpiTbValidateTempTable (
368*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc)
369*385cc6b4SJerry Jelinek {
370*385cc6b4SJerry Jelinek 
371*385cc6b4SJerry Jelinek     if (!TableDesc->Pointer && !AcpiGbl_VerifyTableChecksum)
372*385cc6b4SJerry Jelinek     {
373*385cc6b4SJerry Jelinek         /*
374*385cc6b4SJerry Jelinek          * Only validates the header of the table.
375*385cc6b4SJerry Jelinek          * Note that Length contains the size of the mapping after invoking
376*385cc6b4SJerry Jelinek          * this work around, this value is required by
377*385cc6b4SJerry Jelinek          * AcpiTbReleaseTempTable().
378*385cc6b4SJerry Jelinek          * We can do this because in AcpiInitTableDescriptor(), the Length
379*385cc6b4SJerry Jelinek          * field of the installed descriptor is filled with the actual
380*385cc6b4SJerry Jelinek          * table length obtaining from the table header.
381*385cc6b4SJerry Jelinek          */
382*385cc6b4SJerry Jelinek         TableDesc->Length = sizeof (ACPI_TABLE_HEADER);
383*385cc6b4SJerry Jelinek     }
384*385cc6b4SJerry Jelinek 
385*385cc6b4SJerry Jelinek     return (AcpiTbValidateTable (TableDesc));
386*385cc6b4SJerry Jelinek }
387*385cc6b4SJerry Jelinek 
388*385cc6b4SJerry Jelinek 
389*385cc6b4SJerry Jelinek /******************************************************************************
390*385cc6b4SJerry Jelinek  *
391*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbVerifyTempTable
392*385cc6b4SJerry Jelinek  *
393*385cc6b4SJerry Jelinek  * PARAMETERS:  TableDesc           - Table descriptor
394*385cc6b4SJerry Jelinek  *              Signature           - Table signature to verify
395*385cc6b4SJerry Jelinek  *
396*385cc6b4SJerry Jelinek  * RETURN:      Status
397*385cc6b4SJerry Jelinek  *
398*385cc6b4SJerry Jelinek  * DESCRIPTION: This function is called to validate and verify the table, the
399*385cc6b4SJerry Jelinek  *              returned table descriptor is in "VALIDATED" state.
400*385cc6b4SJerry Jelinek  *
401*385cc6b4SJerry Jelinek  *****************************************************************************/
402*385cc6b4SJerry Jelinek 
403*385cc6b4SJerry Jelinek ACPI_STATUS
404*385cc6b4SJerry Jelinek AcpiTbVerifyTempTable (
405*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *TableDesc,
406*385cc6b4SJerry Jelinek     char                    *Signature)
407*385cc6b4SJerry Jelinek {
408*385cc6b4SJerry Jelinek     ACPI_STATUS             Status = AE_OK;
409*385cc6b4SJerry Jelinek 
410*385cc6b4SJerry Jelinek 
411*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbVerifyTempTable);
412*385cc6b4SJerry Jelinek 
413*385cc6b4SJerry Jelinek 
414*385cc6b4SJerry Jelinek     /* Validate the table */
415*385cc6b4SJerry Jelinek 
416*385cc6b4SJerry Jelinek     Status = AcpiTbValidateTempTable (TableDesc);
417*385cc6b4SJerry Jelinek     if (ACPI_FAILURE (Status))
418*385cc6b4SJerry Jelinek     {
419*385cc6b4SJerry Jelinek         return_ACPI_STATUS (AE_NO_MEMORY);
420*385cc6b4SJerry Jelinek     }
421*385cc6b4SJerry Jelinek 
422*385cc6b4SJerry Jelinek     /* If a particular signature is expected (DSDT/FACS), it must match */
423*385cc6b4SJerry Jelinek 
424*385cc6b4SJerry Jelinek     if (Signature &&
425*385cc6b4SJerry Jelinek         !ACPI_COMPARE_NAME (&TableDesc->Signature, Signature))
426*385cc6b4SJerry Jelinek     {
427*385cc6b4SJerry Jelinek         ACPI_BIOS_ERROR ((AE_INFO,
428*385cc6b4SJerry Jelinek             "Invalid signature 0x%X for ACPI table, expected [%s]",
429*385cc6b4SJerry Jelinek             TableDesc->Signature.Integer, Signature));
430*385cc6b4SJerry Jelinek         Status = AE_BAD_SIGNATURE;
431*385cc6b4SJerry Jelinek         goto InvalidateAndExit;
432*385cc6b4SJerry Jelinek     }
433*385cc6b4SJerry Jelinek 
434*385cc6b4SJerry Jelinek     /* Verify the checksum */
435*385cc6b4SJerry Jelinek 
436*385cc6b4SJerry Jelinek     if (AcpiGbl_VerifyTableChecksum)
437*385cc6b4SJerry Jelinek     {
438*385cc6b4SJerry Jelinek         Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
439*385cc6b4SJerry Jelinek         if (ACPI_FAILURE (Status))
440*385cc6b4SJerry Jelinek         {
441*385cc6b4SJerry Jelinek             ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
442*385cc6b4SJerry Jelinek                 "%4.4s 0x%8.8X%8.8X"
443*385cc6b4SJerry Jelinek                 " Attempted table install failed",
444*385cc6b4SJerry Jelinek                 AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
445*385cc6b4SJerry Jelinek                     TableDesc->Signature.Ascii : "????",
446*385cc6b4SJerry Jelinek                 ACPI_FORMAT_UINT64 (TableDesc->Address)));
447*385cc6b4SJerry Jelinek 
448*385cc6b4SJerry Jelinek             goto InvalidateAndExit;
449*385cc6b4SJerry Jelinek         }
450*385cc6b4SJerry Jelinek     }
451*385cc6b4SJerry Jelinek 
452*385cc6b4SJerry Jelinek     return_ACPI_STATUS (AE_OK);
453*385cc6b4SJerry Jelinek 
454*385cc6b4SJerry Jelinek InvalidateAndExit:
455*385cc6b4SJerry Jelinek     AcpiTbInvalidateTable (TableDesc);
456*385cc6b4SJerry Jelinek     return_ACPI_STATUS (Status);
457*385cc6b4SJerry Jelinek }
458*385cc6b4SJerry Jelinek 
459*385cc6b4SJerry Jelinek 
460*385cc6b4SJerry Jelinek /*******************************************************************************
461*385cc6b4SJerry Jelinek  *
462*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbResizeRootTableList
463*385cc6b4SJerry Jelinek  *
464*385cc6b4SJerry Jelinek  * PARAMETERS:  None
465*385cc6b4SJerry Jelinek  *
466*385cc6b4SJerry Jelinek  * RETURN:      Status
467*385cc6b4SJerry Jelinek  *
468*385cc6b4SJerry Jelinek  * DESCRIPTION: Expand the size of global table array
469*385cc6b4SJerry Jelinek  *
470*385cc6b4SJerry Jelinek  ******************************************************************************/
471*385cc6b4SJerry Jelinek 
472*385cc6b4SJerry Jelinek ACPI_STATUS
473*385cc6b4SJerry Jelinek AcpiTbResizeRootTableList (
474*385cc6b4SJerry Jelinek     void)
475*385cc6b4SJerry Jelinek {
476*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         *Tables;
477*385cc6b4SJerry Jelinek     UINT32                  TableCount;
478*385cc6b4SJerry Jelinek 
479*385cc6b4SJerry Jelinek 
480*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbResizeRootTableList);
481*385cc6b4SJerry Jelinek 
482*385cc6b4SJerry Jelinek 
483*385cc6b4SJerry Jelinek     /* AllowResize flag is a parameter to AcpiInitializeTables */
484*385cc6b4SJerry Jelinek 
485*385cc6b4SJerry Jelinek     if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
486*385cc6b4SJerry Jelinek     {
487*385cc6b4SJerry Jelinek         ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
488*385cc6b4SJerry Jelinek         return_ACPI_STATUS (AE_SUPPORT);
489*385cc6b4SJerry Jelinek     }
490*385cc6b4SJerry Jelinek 
491*385cc6b4SJerry Jelinek     /* Increase the Table Array size */
492*385cc6b4SJerry Jelinek 
493*385cc6b4SJerry Jelinek     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
494*385cc6b4SJerry Jelinek     {
495*385cc6b4SJerry Jelinek         TableCount = AcpiGbl_RootTableList.MaxTableCount;
496*385cc6b4SJerry Jelinek     }
497*385cc6b4SJerry Jelinek     else
498*385cc6b4SJerry Jelinek     {
499*385cc6b4SJerry Jelinek         TableCount = AcpiGbl_RootTableList.CurrentTableCount;
500*385cc6b4SJerry Jelinek     }
501*385cc6b4SJerry Jelinek 
502*385cc6b4SJerry Jelinek     Tables = ACPI_ALLOCATE_ZEROED (
503*385cc6b4SJerry Jelinek         ((ACPI_SIZE) TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT) *
504*385cc6b4SJerry Jelinek         sizeof (ACPI_TABLE_DESC));
505*385cc6b4SJerry Jelinek     if (!Tables)
506*385cc6b4SJerry Jelinek     {
507*385cc6b4SJerry Jelinek         ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
508*385cc6b4SJerry Jelinek         return_ACPI_STATUS (AE_NO_MEMORY);
509*385cc6b4SJerry Jelinek     }
510*385cc6b4SJerry Jelinek 
511*385cc6b4SJerry Jelinek     /* Copy and free the previous table array */
512*385cc6b4SJerry Jelinek 
513*385cc6b4SJerry Jelinek     if (AcpiGbl_RootTableList.Tables)
514*385cc6b4SJerry Jelinek     {
515*385cc6b4SJerry Jelinek         memcpy (Tables, AcpiGbl_RootTableList.Tables,
516*385cc6b4SJerry Jelinek             (ACPI_SIZE) TableCount * sizeof (ACPI_TABLE_DESC));
517*385cc6b4SJerry Jelinek 
518*385cc6b4SJerry Jelinek         if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
519*385cc6b4SJerry Jelinek         {
520*385cc6b4SJerry Jelinek             ACPI_FREE (AcpiGbl_RootTableList.Tables);
521*385cc6b4SJerry Jelinek         }
522*385cc6b4SJerry Jelinek     }
523*385cc6b4SJerry Jelinek 
524*385cc6b4SJerry Jelinek     AcpiGbl_RootTableList.Tables = Tables;
525*385cc6b4SJerry Jelinek     AcpiGbl_RootTableList.MaxTableCount =
526*385cc6b4SJerry Jelinek         TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
527*385cc6b4SJerry Jelinek     AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
528*385cc6b4SJerry Jelinek 
529*385cc6b4SJerry Jelinek     return_ACPI_STATUS (AE_OK);
530*385cc6b4SJerry Jelinek }
531*385cc6b4SJerry Jelinek 
532*385cc6b4SJerry Jelinek 
533*385cc6b4SJerry Jelinek /*******************************************************************************
534*385cc6b4SJerry Jelinek  *
535*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbGetNextTableDescriptor
536*385cc6b4SJerry Jelinek  *
537*385cc6b4SJerry Jelinek  * PARAMETERS:  TableIndex          - Where table index is returned
538*385cc6b4SJerry Jelinek  *              TableDesc           - Where table descriptor is returned
539*385cc6b4SJerry Jelinek  *
540*385cc6b4SJerry Jelinek  * RETURN:      Status and table index/descriptor.
541*385cc6b4SJerry Jelinek  *
542*385cc6b4SJerry Jelinek  * DESCRIPTION: Allocate a new ACPI table entry to the global table list
543*385cc6b4SJerry Jelinek  *
544*385cc6b4SJerry Jelinek  ******************************************************************************/
545*385cc6b4SJerry Jelinek 
546*385cc6b4SJerry Jelinek ACPI_STATUS
547*385cc6b4SJerry Jelinek AcpiTbGetNextTableDescriptor (
548*385cc6b4SJerry Jelinek     UINT32                  *TableIndex,
549*385cc6b4SJerry Jelinek     ACPI_TABLE_DESC         **TableDesc)
550*385cc6b4SJerry Jelinek {
551*385cc6b4SJerry Jelinek     ACPI_STATUS             Status;
552*385cc6b4SJerry Jelinek     UINT32                  i;
553*385cc6b4SJerry Jelinek 
554*385cc6b4SJerry Jelinek 
555*385cc6b4SJerry Jelinek     /* Ensure that there is room for the table in the Root Table List */
556*385cc6b4SJerry Jelinek 
557*385cc6b4SJerry Jelinek     if (AcpiGbl_RootTableList.CurrentTableCount >=
558*385cc6b4SJerry Jelinek         AcpiGbl_RootTableList.MaxTableCount)
559*385cc6b4SJerry Jelinek     {
560*385cc6b4SJerry Jelinek         Status = AcpiTbResizeRootTableList();
561*385cc6b4SJerry Jelinek         if (ACPI_FAILURE (Status))
562*385cc6b4SJerry Jelinek         {
563*385cc6b4SJerry Jelinek             return (Status);
564*385cc6b4SJerry Jelinek         }
565*385cc6b4SJerry Jelinek     }
566*385cc6b4SJerry Jelinek 
567*385cc6b4SJerry Jelinek     i = AcpiGbl_RootTableList.CurrentTableCount;
568*385cc6b4SJerry Jelinek     AcpiGbl_RootTableList.CurrentTableCount++;
569*385cc6b4SJerry Jelinek 
570*385cc6b4SJerry Jelinek     if (TableIndex)
571*385cc6b4SJerry Jelinek     {
572*385cc6b4SJerry Jelinek         *TableIndex = i;
573*385cc6b4SJerry Jelinek     }
574*385cc6b4SJerry Jelinek     if (TableDesc)
575*385cc6b4SJerry Jelinek     {
576*385cc6b4SJerry Jelinek         *TableDesc = &AcpiGbl_RootTableList.Tables[i];
577*385cc6b4SJerry Jelinek     }
578*385cc6b4SJerry Jelinek 
579*385cc6b4SJerry Jelinek     return (AE_OK);
580*385cc6b4SJerry Jelinek }
581*385cc6b4SJerry Jelinek 
582*385cc6b4SJerry Jelinek 
583*385cc6b4SJerry Jelinek /*******************************************************************************
584*385cc6b4SJerry Jelinek  *
585*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbTerminate
586*385cc6b4SJerry Jelinek  *
587*385cc6b4SJerry Jelinek  * PARAMETERS:  None
588*385cc6b4SJerry Jelinek  *
589*385cc6b4SJerry Jelinek  * RETURN:      None
590*385cc6b4SJerry Jelinek  *
591*385cc6b4SJerry Jelinek  * DESCRIPTION: Delete all internal ACPI tables
592*385cc6b4SJerry Jelinek  *
593*385cc6b4SJerry Jelinek  ******************************************************************************/
594*385cc6b4SJerry Jelinek 
595*385cc6b4SJerry Jelinek void
596*385cc6b4SJerry Jelinek AcpiTbTerminate (
597*385cc6b4SJerry Jelinek     void)
598*385cc6b4SJerry Jelinek {
599*385cc6b4SJerry Jelinek     UINT32                  i;
600*385cc6b4SJerry Jelinek 
601*385cc6b4SJerry Jelinek 
602*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbTerminate);
603*385cc6b4SJerry Jelinek 
604*385cc6b4SJerry Jelinek 
605*385cc6b4SJerry Jelinek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
606*385cc6b4SJerry Jelinek 
607*385cc6b4SJerry Jelinek     /* Delete the individual tables */
608*385cc6b4SJerry Jelinek 
609*385cc6b4SJerry Jelinek     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
610*385cc6b4SJerry Jelinek     {
611*385cc6b4SJerry Jelinek         AcpiTbUninstallTable (&AcpiGbl_RootTableList.Tables[i]);
612*385cc6b4SJerry Jelinek     }
613*385cc6b4SJerry Jelinek 
614*385cc6b4SJerry Jelinek     /*
615*385cc6b4SJerry Jelinek      * Delete the root table array if allocated locally. Array cannot be
616*385cc6b4SJerry Jelinek      * mapped, so we don't need to check for that flag.
617*385cc6b4SJerry Jelinek      */
618*385cc6b4SJerry Jelinek     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
619*385cc6b4SJerry Jelinek     {
620*385cc6b4SJerry Jelinek         ACPI_FREE (AcpiGbl_RootTableList.Tables);
621*385cc6b4SJerry Jelinek     }
622*385cc6b4SJerry Jelinek 
623*385cc6b4SJerry Jelinek     AcpiGbl_RootTableList.Tables = NULL;
624*385cc6b4SJerry Jelinek     AcpiGbl_RootTableList.Flags = 0;
625*385cc6b4SJerry Jelinek     AcpiGbl_RootTableList.CurrentTableCount = 0;
626*385cc6b4SJerry Jelinek 
627*385cc6b4SJerry Jelinek     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
628*385cc6b4SJerry Jelinek 
629*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
630*385cc6b4SJerry Jelinek     return_VOID;
631*385cc6b4SJerry Jelinek }
632*385cc6b4SJerry Jelinek 
633*385cc6b4SJerry Jelinek 
634*385cc6b4SJerry Jelinek /*******************************************************************************
635*385cc6b4SJerry Jelinek  *
636*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbDeleteNamespaceByOwner
637*385cc6b4SJerry Jelinek  *
638*385cc6b4SJerry Jelinek  * PARAMETERS:  TableIndex          - Table index
639*385cc6b4SJerry Jelinek  *
640*385cc6b4SJerry Jelinek  * RETURN:      Status
641*385cc6b4SJerry Jelinek  *
642*385cc6b4SJerry Jelinek  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
643*385cc6b4SJerry Jelinek  *
644*385cc6b4SJerry Jelinek  ******************************************************************************/
645*385cc6b4SJerry Jelinek 
646*385cc6b4SJerry Jelinek ACPI_STATUS
647*385cc6b4SJerry Jelinek AcpiTbDeleteNamespaceByOwner (
648*385cc6b4SJerry Jelinek     UINT32                  TableIndex)
649*385cc6b4SJerry Jelinek {
650*385cc6b4SJerry Jelinek     ACPI_OWNER_ID           OwnerId;
651*385cc6b4SJerry Jelinek     ACPI_STATUS             Status;
652*385cc6b4SJerry Jelinek 
653*385cc6b4SJerry Jelinek 
654*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
655*385cc6b4SJerry Jelinek 
656*385cc6b4SJerry Jelinek 
657*385cc6b4SJerry Jelinek     Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
658*385cc6b4SJerry Jelinek     if (ACPI_FAILURE (Status))
659*385cc6b4SJerry Jelinek     {
660*385cc6b4SJerry Jelinek         return_ACPI_STATUS (Status);
661*385cc6b4SJerry Jelinek     }
662*385cc6b4SJerry Jelinek 
663*385cc6b4SJerry Jelinek     if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
664*385cc6b4SJerry Jelinek     {
665*385cc6b4SJerry Jelinek         /* The table index does not exist */
666*385cc6b4SJerry Jelinek 
667*385cc6b4SJerry Jelinek         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
668*385cc6b4SJerry Jelinek         return_ACPI_STATUS (AE_NOT_EXIST);
669*385cc6b4SJerry Jelinek     }
670*385cc6b4SJerry Jelinek 
671*385cc6b4SJerry Jelinek     /* Get the owner ID for this table, used to delete namespace nodes */
672*385cc6b4SJerry Jelinek 
673*385cc6b4SJerry Jelinek     OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
674*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
675*385cc6b4SJerry Jelinek 
676*385cc6b4SJerry Jelinek     /*
677*385cc6b4SJerry Jelinek      * Need to acquire the namespace writer lock to prevent interference
678*385cc6b4SJerry Jelinek      * with any concurrent namespace walks. The interpreter must be
679*385cc6b4SJerry Jelinek      * released during the deletion since the acquisition of the deletion
680*385cc6b4SJerry Jelinek      * lock may block, and also since the execution of a namespace walk
681*385cc6b4SJerry Jelinek      * must be allowed to use the interpreter.
682*385cc6b4SJerry Jelinek      */
683*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
684*385cc6b4SJerry Jelinek     Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
685*385cc6b4SJerry Jelinek 
686*385cc6b4SJerry Jelinek     AcpiNsDeleteNamespaceByOwner (OwnerId);
687*385cc6b4SJerry Jelinek     if (ACPI_FAILURE (Status))
688*385cc6b4SJerry Jelinek     {
689*385cc6b4SJerry Jelinek         return_ACPI_STATUS (Status);
690*385cc6b4SJerry Jelinek     }
691*385cc6b4SJerry Jelinek 
692*385cc6b4SJerry Jelinek     AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
693*385cc6b4SJerry Jelinek 
694*385cc6b4SJerry Jelinek     Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
695*385cc6b4SJerry Jelinek     return_ACPI_STATUS (Status);
696*385cc6b4SJerry Jelinek }
697*385cc6b4SJerry Jelinek 
698*385cc6b4SJerry Jelinek 
699*385cc6b4SJerry Jelinek /*******************************************************************************
700*385cc6b4SJerry Jelinek  *
701*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbAllocateOwnerId
702*385cc6b4SJerry Jelinek  *
703*385cc6b4SJerry Jelinek  * PARAMETERS:  TableIndex          - Table index
704*385cc6b4SJerry Jelinek  *
705*385cc6b4SJerry Jelinek  * RETURN:      Status
706*385cc6b4SJerry Jelinek  *
707*385cc6b4SJerry Jelinek  * DESCRIPTION: Allocates OwnerId in TableDesc
708*385cc6b4SJerry Jelinek  *
709*385cc6b4SJerry Jelinek  ******************************************************************************/
710*385cc6b4SJerry Jelinek 
711*385cc6b4SJerry Jelinek ACPI_STATUS
712*385cc6b4SJerry Jelinek AcpiTbAllocateOwnerId (
713*385cc6b4SJerry Jelinek     UINT32                  TableIndex)
714*385cc6b4SJerry Jelinek {
715*385cc6b4SJerry Jelinek     ACPI_STATUS             Status = AE_BAD_PARAMETER;
716*385cc6b4SJerry Jelinek 
717*385cc6b4SJerry Jelinek 
718*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
719*385cc6b4SJerry Jelinek 
720*385cc6b4SJerry Jelinek 
721*385cc6b4SJerry Jelinek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
722*385cc6b4SJerry Jelinek     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
723*385cc6b4SJerry Jelinek     {
724*385cc6b4SJerry Jelinek         Status = AcpiUtAllocateOwnerId (
725*385cc6b4SJerry Jelinek             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
726*385cc6b4SJerry Jelinek     }
727*385cc6b4SJerry Jelinek 
728*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
729*385cc6b4SJerry Jelinek     return_ACPI_STATUS (Status);
730*385cc6b4SJerry Jelinek }
731*385cc6b4SJerry Jelinek 
732*385cc6b4SJerry Jelinek 
733*385cc6b4SJerry Jelinek /*******************************************************************************
734*385cc6b4SJerry Jelinek  *
735*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbReleaseOwnerId
736*385cc6b4SJerry Jelinek  *
737*385cc6b4SJerry Jelinek  * PARAMETERS:  TableIndex          - Table index
738*385cc6b4SJerry Jelinek  *
739*385cc6b4SJerry Jelinek  * RETURN:      Status
740*385cc6b4SJerry Jelinek  *
741*385cc6b4SJerry Jelinek  * DESCRIPTION: Releases OwnerId in TableDesc
742*385cc6b4SJerry Jelinek  *
743*385cc6b4SJerry Jelinek  ******************************************************************************/
744*385cc6b4SJerry Jelinek 
745*385cc6b4SJerry Jelinek ACPI_STATUS
746*385cc6b4SJerry Jelinek AcpiTbReleaseOwnerId (
747*385cc6b4SJerry Jelinek     UINT32                  TableIndex)
748*385cc6b4SJerry Jelinek {
749*385cc6b4SJerry Jelinek     ACPI_STATUS             Status = AE_BAD_PARAMETER;
750*385cc6b4SJerry Jelinek 
751*385cc6b4SJerry Jelinek 
752*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
753*385cc6b4SJerry Jelinek 
754*385cc6b4SJerry Jelinek 
755*385cc6b4SJerry Jelinek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
756*385cc6b4SJerry Jelinek     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
757*385cc6b4SJerry Jelinek     {
758*385cc6b4SJerry Jelinek         AcpiUtReleaseOwnerId (
759*385cc6b4SJerry Jelinek             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
760*385cc6b4SJerry Jelinek         Status = AE_OK;
761*385cc6b4SJerry Jelinek     }
762*385cc6b4SJerry Jelinek 
763*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
764*385cc6b4SJerry Jelinek     return_ACPI_STATUS (Status);
765*385cc6b4SJerry Jelinek }
766*385cc6b4SJerry Jelinek 
767*385cc6b4SJerry Jelinek 
768*385cc6b4SJerry Jelinek /*******************************************************************************
769*385cc6b4SJerry Jelinek  *
770*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbGetOwnerId
771*385cc6b4SJerry Jelinek  *
772*385cc6b4SJerry Jelinek  * PARAMETERS:  TableIndex          - Table index
773*385cc6b4SJerry Jelinek  *              OwnerId             - Where the table OwnerId is returned
774*385cc6b4SJerry Jelinek  *
775*385cc6b4SJerry Jelinek  * RETURN:      Status
776*385cc6b4SJerry Jelinek  *
777*385cc6b4SJerry Jelinek  * DESCRIPTION: returns OwnerId for the ACPI table
778*385cc6b4SJerry Jelinek  *
779*385cc6b4SJerry Jelinek  ******************************************************************************/
780*385cc6b4SJerry Jelinek 
781*385cc6b4SJerry Jelinek ACPI_STATUS
782*385cc6b4SJerry Jelinek AcpiTbGetOwnerId (
783*385cc6b4SJerry Jelinek     UINT32                  TableIndex,
784*385cc6b4SJerry Jelinek     ACPI_OWNER_ID           *OwnerId)
785*385cc6b4SJerry Jelinek {
786*385cc6b4SJerry Jelinek     ACPI_STATUS             Status = AE_BAD_PARAMETER;
787*385cc6b4SJerry Jelinek 
788*385cc6b4SJerry Jelinek 
789*385cc6b4SJerry Jelinek     ACPI_FUNCTION_TRACE (TbGetOwnerId);
790*385cc6b4SJerry Jelinek 
791*385cc6b4SJerry Jelinek 
792*385cc6b4SJerry Jelinek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
793*385cc6b4SJerry Jelinek     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
794*385cc6b4SJerry Jelinek     {
795*385cc6b4SJerry Jelinek         *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
796*385cc6b4SJerry Jelinek         Status = AE_OK;
797*385cc6b4SJerry Jelinek     }
798*385cc6b4SJerry Jelinek 
799*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
800*385cc6b4SJerry Jelinek     return_ACPI_STATUS (Status);
801*385cc6b4SJerry Jelinek }
802*385cc6b4SJerry Jelinek 
803*385cc6b4SJerry Jelinek 
804*385cc6b4SJerry Jelinek /*******************************************************************************
805*385cc6b4SJerry Jelinek  *
806*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbIsTableLoaded
807*385cc6b4SJerry Jelinek  *
808*385cc6b4SJerry Jelinek  * PARAMETERS:  TableIndex          - Index into the root table
809*385cc6b4SJerry Jelinek  *
810*385cc6b4SJerry Jelinek  * RETURN:      Table Loaded Flag
811*385cc6b4SJerry Jelinek  *
812*385cc6b4SJerry Jelinek  ******************************************************************************/
813*385cc6b4SJerry Jelinek 
814*385cc6b4SJerry Jelinek BOOLEAN
815*385cc6b4SJerry Jelinek AcpiTbIsTableLoaded (
816*385cc6b4SJerry Jelinek     UINT32                  TableIndex)
817*385cc6b4SJerry Jelinek {
818*385cc6b4SJerry Jelinek     BOOLEAN                 IsLoaded = FALSE;
819*385cc6b4SJerry Jelinek 
820*385cc6b4SJerry Jelinek 
821*385cc6b4SJerry Jelinek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
822*385cc6b4SJerry Jelinek     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
823*385cc6b4SJerry Jelinek     {
824*385cc6b4SJerry Jelinek         IsLoaded = (BOOLEAN)
825*385cc6b4SJerry Jelinek             (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
826*385cc6b4SJerry Jelinek             ACPI_TABLE_IS_LOADED);
827*385cc6b4SJerry Jelinek     }
828*385cc6b4SJerry Jelinek 
829*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
830*385cc6b4SJerry Jelinek     return (IsLoaded);
831*385cc6b4SJerry Jelinek }
832*385cc6b4SJerry Jelinek 
833*385cc6b4SJerry Jelinek 
834*385cc6b4SJerry Jelinek /*******************************************************************************
835*385cc6b4SJerry Jelinek  *
836*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiTbSetTableLoadedFlag
837*385cc6b4SJerry Jelinek  *
838*385cc6b4SJerry Jelinek  * PARAMETERS:  TableIndex          - Table index
839*385cc6b4SJerry Jelinek  *              IsLoaded            - TRUE if table is loaded, FALSE otherwise
840*385cc6b4SJerry Jelinek  *
841*385cc6b4SJerry Jelinek  * RETURN:      None
842*385cc6b4SJerry Jelinek  *
843*385cc6b4SJerry Jelinek  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
844*385cc6b4SJerry Jelinek  *
845*385cc6b4SJerry Jelinek  ******************************************************************************/
846*385cc6b4SJerry Jelinek 
847*385cc6b4SJerry Jelinek void
848*385cc6b4SJerry Jelinek AcpiTbSetTableLoadedFlag (
849*385cc6b4SJerry Jelinek     UINT32                  TableIndex,
850*385cc6b4SJerry Jelinek     BOOLEAN                 IsLoaded)
851*385cc6b4SJerry Jelinek {
852*385cc6b4SJerry Jelinek 
853*385cc6b4SJerry Jelinek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
854*385cc6b4SJerry Jelinek     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
855*385cc6b4SJerry Jelinek     {
856*385cc6b4SJerry Jelinek         if (IsLoaded)
857*385cc6b4SJerry Jelinek         {
858*385cc6b4SJerry Jelinek             AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
859*385cc6b4SJerry Jelinek                 ACPI_TABLE_IS_LOADED;
860*385cc6b4SJerry Jelinek         }
861*385cc6b4SJerry Jelinek         else
862*385cc6b4SJerry Jelinek         {
863*385cc6b4SJerry Jelinek             AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
864*385cc6b4SJerry Jelinek                 ~ACPI_TABLE_IS_LOADED;
865*385cc6b4SJerry Jelinek         }
866*385cc6b4SJerry Jelinek     }
867*385cc6b4SJerry Jelinek 
868*385cc6b4SJerry Jelinek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
869*385cc6b4SJerry Jelinek }
870