xref: /onnv-gate/usr/src/uts/intel/io/acpica/tables/tbinstal.c (revision 7851:e828bbb1689c)
13446Smrj /******************************************************************************
23446Smrj  *
33446Smrj  * Module Name: tbinstal - ACPI table installation and removal
4*7851SDana.Myers@Sun.COM  *              $Revision: 1.94 $
53446Smrj  *
63446Smrj  *****************************************************************************/
73446Smrj 
83446Smrj /******************************************************************************
93446Smrj  *
103446Smrj  * 1. Copyright Notice
113446Smrj  *
12*7851SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
133446Smrj  * All rights reserved.
143446Smrj  *
153446Smrj  * 2. License
163446Smrj  *
173446Smrj  * 2.1. This is your license from Intel Corp. under its intellectual property
183446Smrj  * rights.  You may have additional license terms from the party that provided
193446Smrj  * you this software, covering your right to use that party's intellectual
203446Smrj  * property rights.
213446Smrj  *
223446Smrj  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
233446Smrj  * copy of the source code appearing in this file ("Covered Code") an
243446Smrj  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
253446Smrj  * base code distributed originally by Intel ("Original Intel Code") to copy,
263446Smrj  * make derivatives, distribute, use and display any portion of the Covered
273446Smrj  * Code in any form, with the right to sublicense such rights; and
283446Smrj  *
293446Smrj  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
303446Smrj  * license (with the right to sublicense), under only those claims of Intel
313446Smrj  * patents that are infringed by the Original Intel Code, to make, use, sell,
323446Smrj  * offer to sell, and import the Covered Code and derivative works thereof
333446Smrj  * solely to the minimum extent necessary to exercise the above copyright
343446Smrj  * license, and in no event shall the patent license extend to any additions
353446Smrj  * to or modifications of the Original Intel Code.  No other license or right
363446Smrj  * is granted directly or by implication, estoppel or otherwise;
373446Smrj  *
383446Smrj  * The above copyright and patent license is granted only if the following
393446Smrj  * conditions are met:
403446Smrj  *
413446Smrj  * 3. Conditions
423446Smrj  *
433446Smrj  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
443446Smrj  * Redistribution of source code of any substantial portion of the Covered
453446Smrj  * Code or modification with rights to further distribute source must include
463446Smrj  * the above Copyright Notice, the above License, this list of Conditions,
473446Smrj  * and the following Disclaimer and Export Compliance provision.  In addition,
483446Smrj  * Licensee must cause all Covered Code to which Licensee contributes to
493446Smrj  * contain a file documenting the changes Licensee made to create that Covered
503446Smrj  * Code and the date of any change.  Licensee must include in that file the
513446Smrj  * documentation of any changes made by any predecessor Licensee.  Licensee
523446Smrj  * must include a prominent statement that the modification is derived,
533446Smrj  * directly or indirectly, from Original Intel Code.
543446Smrj  *
553446Smrj  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
563446Smrj  * Redistribution of source code of any substantial portion of the Covered
573446Smrj  * Code or modification without rights to further distribute source must
583446Smrj  * include the following Disclaimer and Export Compliance provision in the
593446Smrj  * documentation and/or other materials provided with distribution.  In
603446Smrj  * addition, Licensee may not authorize further sublicense of source of any
613446Smrj  * portion of the Covered Code, and must include terms to the effect that the
623446Smrj  * license from Licensee to its licensee is limited to the intellectual
633446Smrj  * property embodied in the software Licensee provides to its licensee, and
643446Smrj  * not to intellectual property embodied in modifications its licensee may
653446Smrj  * make.
663446Smrj  *
673446Smrj  * 3.3. Redistribution of Executable. Redistribution in executable form of any
683446Smrj  * substantial portion of the Covered Code or modification must reproduce the
693446Smrj  * above Copyright Notice, and the following Disclaimer and Export Compliance
703446Smrj  * provision in the documentation and/or other materials provided with the
713446Smrj  * distribution.
723446Smrj  *
733446Smrj  * 3.4. Intel retains all right, title, and interest in and to the Original
743446Smrj  * Intel Code.
753446Smrj  *
763446Smrj  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
773446Smrj  * Intel shall be used in advertising or otherwise to promote the sale, use or
783446Smrj  * other dealings in products derived from or relating to the Covered Code
793446Smrj  * without prior written authorization from Intel.
803446Smrj  *
813446Smrj  * 4. Disclaimer and Export Compliance
823446Smrj  *
833446Smrj  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
843446Smrj  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
853446Smrj  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
863446Smrj  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
873446Smrj  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
883446Smrj  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
893446Smrj  * PARTICULAR PURPOSE.
903446Smrj  *
913446Smrj  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
923446Smrj  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
933446Smrj  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
943446Smrj  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
953446Smrj  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
963446Smrj  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
973446Smrj  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
983446Smrj  * LIMITED REMEDY.
993446Smrj  *
1003446Smrj  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1013446Smrj  * software or system incorporating such software without first obtaining any
1023446Smrj  * required license or other approval from the U. S. Department of Commerce or
1033446Smrj  * any other agency or department of the United States Government.  In the
1043446Smrj  * event Licensee exports any such software from the United States or
1053446Smrj  * re-exports any such software from a foreign destination, Licensee shall
1063446Smrj  * ensure that the distribution and export/re-export of the software is in
1073446Smrj  * compliance with all laws, regulations, orders, or other restrictions of the
1083446Smrj  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1093446Smrj  * any of its subsidiaries will export/re-export any technical data, process,
1103446Smrj  * software, or service, directly or indirectly, to any country for which the
1113446Smrj  * United States government or any agency thereof requires an export license,
1123446Smrj  * other governmental approval, or letter of assurance, without first obtaining
1133446Smrj  * such license, approval or letter.
1143446Smrj  *
1153446Smrj  *****************************************************************************/
1163446Smrj 
1173446Smrj 
1183446Smrj #define __TBINSTAL_C__
1193446Smrj 
1203446Smrj #include "acpi.h"
121*7851SDana.Myers@Sun.COM #include "acnamesp.h"
1223446Smrj #include "actables.h"
1233446Smrj 
1243446Smrj 
1253446Smrj #define _COMPONENT          ACPI_TABLES
1263446Smrj         ACPI_MODULE_NAME    ("tbinstal")
1273446Smrj 
1283446Smrj 
129*7851SDana.Myers@Sun.COM /******************************************************************************
1303446Smrj  *
131*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbVerifyTable
1323446Smrj  *
133*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableDesc           - table
1343446Smrj  *
1353446Smrj  * RETURN:      Status
1363446Smrj  *
137*7851SDana.Myers@Sun.COM  * DESCRIPTION: this function is called to verify and map table
1383446Smrj  *
139*7851SDana.Myers@Sun.COM  *****************************************************************************/
1403446Smrj 
141*7851SDana.Myers@Sun.COM ACPI_STATUS
142*7851SDana.Myers@Sun.COM AcpiTbVerifyTable (
143*7851SDana.Myers@Sun.COM     ACPI_TABLE_DESC         *TableDesc)
1443446Smrj {
145*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
1463446Smrj 
1473446Smrj 
148*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (TbVerifyTable);
1493446Smrj 
1503446Smrj 
151*7851SDana.Myers@Sun.COM     /* Map the table if necessary */
1523446Smrj 
153*7851SDana.Myers@Sun.COM     if (!TableDesc->Pointer)
1543446Smrj     {
155*7851SDana.Myers@Sun.COM         if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) ==
156*7851SDana.Myers@Sun.COM             ACPI_TABLE_ORIGIN_MAPPED)
1573446Smrj         {
158*7851SDana.Myers@Sun.COM             TableDesc->Pointer = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
1593446Smrj         }
1603446Smrj 
161*7851SDana.Myers@Sun.COM         if (!TableDesc->Pointer)
1623446Smrj         {
163*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_NO_MEMORY);
1643446Smrj         }
1653446Smrj     }
1663446Smrj 
167*7851SDana.Myers@Sun.COM     /* FACS is the odd table, has no standard ACPI header and no checksum */
1683446Smrj 
169*7851SDana.Myers@Sun.COM     if (!ACPI_COMPARE_NAME (&TableDesc->Signature, ACPI_SIG_FACS))
170*7851SDana.Myers@Sun.COM     {
171*7851SDana.Myers@Sun.COM         /* Always calculate checksum, ignore bad checksum if requested */
172*7851SDana.Myers@Sun.COM 
173*7851SDana.Myers@Sun.COM         Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
174*7851SDana.Myers@Sun.COM     }
175*7851SDana.Myers@Sun.COM 
176*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
1773446Smrj }
1783446Smrj 
1793446Smrj 
1803446Smrj /*******************************************************************************
1813446Smrj  *
182*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbAddTable
1833446Smrj  *
184*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableDesc           - Table descriptor
185*7851SDana.Myers@Sun.COM  *              TableIndex          - Where the table index is returned
1863446Smrj  *
1873446Smrj  * RETURN:      Status
1883446Smrj  *
189*7851SDana.Myers@Sun.COM  * DESCRIPTION: This function is called to add the ACPI table
1903446Smrj  *
1913446Smrj  ******************************************************************************/
1923446Smrj 
1933446Smrj ACPI_STATUS
194*7851SDana.Myers@Sun.COM AcpiTbAddTable (
195*7851SDana.Myers@Sun.COM     ACPI_TABLE_DESC         *TableDesc,
196*7851SDana.Myers@Sun.COM     UINT32                  *TableIndex)
1973446Smrj {
198*7851SDana.Myers@Sun.COM     UINT32                  i;
199*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
2003446Smrj 
2013446Smrj 
202*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (TbAddTable);
2033446Smrj 
2043446Smrj 
205*7851SDana.Myers@Sun.COM     if (!TableDesc->Pointer)
2063446Smrj     {
207*7851SDana.Myers@Sun.COM         Status = AcpiTbVerifyTable (TableDesc);
208*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status) || !TableDesc->Pointer)
209*7851SDana.Myers@Sun.COM         {
210*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (Status);
211*7851SDana.Myers@Sun.COM         }
2123446Smrj     }
2133446Smrj 
2143446Smrj     /*
215*7851SDana.Myers@Sun.COM      * Originally, we checked the table signature for "SSDT" or "PSDT" here.
216*7851SDana.Myers@Sun.COM      * Next, we added support for OEMx tables, signature "OEM".
217*7851SDana.Myers@Sun.COM      * Valid tables were encountered with a null signature, so we've just
218*7851SDana.Myers@Sun.COM      * given up on validating the signature, since it seems to be a waste
219*7851SDana.Myers@Sun.COM      * of code. The original code was removed (05/2008).
2203446Smrj      */
221*7851SDana.Myers@Sun.COM 
222*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
223*7851SDana.Myers@Sun.COM 
224*7851SDana.Myers@Sun.COM     /* Check if table is already registered */
225*7851SDana.Myers@Sun.COM 
226*7851SDana.Myers@Sun.COM     for (i = 0; i < AcpiGbl_RootTableList.Count; ++i)
2273446Smrj     {
228*7851SDana.Myers@Sun.COM         if (!AcpiGbl_RootTableList.Tables[i].Pointer)
229*7851SDana.Myers@Sun.COM         {
230*7851SDana.Myers@Sun.COM             Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]);
231*7851SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status) || !AcpiGbl_RootTableList.Tables[i].Pointer)
232*7851SDana.Myers@Sun.COM             {
233*7851SDana.Myers@Sun.COM                 continue;
234*7851SDana.Myers@Sun.COM             }
235*7851SDana.Myers@Sun.COM         }
236*7851SDana.Myers@Sun.COM 
237*7851SDana.Myers@Sun.COM         /*
238*7851SDana.Myers@Sun.COM          * Check for a table match on the entire table length,
239*7851SDana.Myers@Sun.COM          * not just the header.
240*7851SDana.Myers@Sun.COM          */
241*7851SDana.Myers@Sun.COM         if (TableDesc->Length != AcpiGbl_RootTableList.Tables[i].Length)
242*7851SDana.Myers@Sun.COM         {
243*7851SDana.Myers@Sun.COM             continue;
244*7851SDana.Myers@Sun.COM         }
245*7851SDana.Myers@Sun.COM 
246*7851SDana.Myers@Sun.COM         if (ACPI_MEMCMP (TableDesc->Pointer,
247*7851SDana.Myers@Sun.COM                 AcpiGbl_RootTableList.Tables[i].Pointer,
248*7851SDana.Myers@Sun.COM                 AcpiGbl_RootTableList.Tables[i].Length))
249*7851SDana.Myers@Sun.COM         {
250*7851SDana.Myers@Sun.COM             continue;
251*7851SDana.Myers@Sun.COM         }
252*7851SDana.Myers@Sun.COM 
253*7851SDana.Myers@Sun.COM         /*
254*7851SDana.Myers@Sun.COM          * Note: the current mechanism does not unregister a table if it is
255*7851SDana.Myers@Sun.COM          * dynamically unloaded. The related namespace entries are deleted,
256*7851SDana.Myers@Sun.COM          * but the table remains in the root table list.
257*7851SDana.Myers@Sun.COM          *
258*7851SDana.Myers@Sun.COM          * The assumption here is that the number of different tables that
259*7851SDana.Myers@Sun.COM          * will be loaded is actually small, and there is minimal overhead
260*7851SDana.Myers@Sun.COM          * in just keeping the table in case it is needed again.
261*7851SDana.Myers@Sun.COM          *
262*7851SDana.Myers@Sun.COM          * If this assumption changes in the future (perhaps on large
263*7851SDana.Myers@Sun.COM          * machines with many table load/unload operations), tables will
264*7851SDana.Myers@Sun.COM          * need to be unregistered when they are unloaded, and slots in the
265*7851SDana.Myers@Sun.COM          * root table list should be reused when empty.
266*7851SDana.Myers@Sun.COM          */
267*7851SDana.Myers@Sun.COM 
268*7851SDana.Myers@Sun.COM         /*
269*7851SDana.Myers@Sun.COM          * Table is already registered.
270*7851SDana.Myers@Sun.COM          * We can delete the table that was passed as a parameter.
271*7851SDana.Myers@Sun.COM          */
272*7851SDana.Myers@Sun.COM         AcpiTbDeleteTable (TableDesc);
273*7851SDana.Myers@Sun.COM         *TableIndex = i;
274*7851SDana.Myers@Sun.COM 
275*7851SDana.Myers@Sun.COM         if (AcpiGbl_RootTableList.Tables[i].Flags & ACPI_TABLE_IS_LOADED)
276*7851SDana.Myers@Sun.COM         {
277*7851SDana.Myers@Sun.COM             /* Table is still loaded, this is an error */
278*7851SDana.Myers@Sun.COM 
279*7851SDana.Myers@Sun.COM             Status = AE_ALREADY_EXISTS;
280*7851SDana.Myers@Sun.COM             goto Release;
281*7851SDana.Myers@Sun.COM         }
282*7851SDana.Myers@Sun.COM         else
283*7851SDana.Myers@Sun.COM         {
284*7851SDana.Myers@Sun.COM             /* Table was unloaded, allow it to be reloaded */
285*7851SDana.Myers@Sun.COM 
286*7851SDana.Myers@Sun.COM             TableDesc->Pointer = AcpiGbl_RootTableList.Tables[i].Pointer;
287*7851SDana.Myers@Sun.COM             TableDesc->Address = AcpiGbl_RootTableList.Tables[i].Address;
288*7851SDana.Myers@Sun.COM             Status = AE_OK;
289*7851SDana.Myers@Sun.COM             goto PrintHeader;
290*7851SDana.Myers@Sun.COM         }
2913446Smrj     }
2923446Smrj 
293*7851SDana.Myers@Sun.COM     /* Add the table to the global root table list */
2943446Smrj 
295*7851SDana.Myers@Sun.COM     Status = AcpiTbStoreTable (TableDesc->Address, TableDesc->Pointer,
296*7851SDana.Myers@Sun.COM                 TableDesc->Length, TableDesc->Flags, TableIndex);
2973446Smrj     if (ACPI_FAILURE (Status))
2983446Smrj     {
299*7851SDana.Myers@Sun.COM         goto Release;
3003446Smrj     }
3013446Smrj 
302*7851SDana.Myers@Sun.COM PrintHeader:
303*7851SDana.Myers@Sun.COM     AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
3043446Smrj 
305*7851SDana.Myers@Sun.COM Release:
3063446Smrj     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
3073446Smrj     return_ACPI_STATUS (Status);
3083446Smrj }
3093446Smrj 
3103446Smrj 
3113446Smrj /*******************************************************************************
3123446Smrj  *
313*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbResizeRootTableList
3143446Smrj  *
315*7851SDana.Myers@Sun.COM  * PARAMETERS:  None
3163446Smrj  *
3173446Smrj  * RETURN:      Status
3183446Smrj  *
319*7851SDana.Myers@Sun.COM  * DESCRIPTION: Expand the size of global table array
3203446Smrj  *
3213446Smrj  ******************************************************************************/
3223446Smrj 
3233446Smrj ACPI_STATUS
324*7851SDana.Myers@Sun.COM AcpiTbResizeRootTableList (
325*7851SDana.Myers@Sun.COM     void)
3263446Smrj {
327*7851SDana.Myers@Sun.COM     ACPI_TABLE_DESC         *Tables;
328*7851SDana.Myers@Sun.COM 
329*7851SDana.Myers@Sun.COM 
330*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (TbResizeRootTableList);
3313446Smrj 
3323446Smrj 
333*7851SDana.Myers@Sun.COM     /* AllowResize flag is a parameter to AcpiInitializeTables */
3343446Smrj 
335*7851SDana.Myers@Sun.COM     if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
336*7851SDana.Myers@Sun.COM     {
337*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
338*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_SUPPORT);
339*7851SDana.Myers@Sun.COM     }
3403446Smrj 
341*7851SDana.Myers@Sun.COM     /* Increase the Table Array size */
3423446Smrj 
343*7851SDana.Myers@Sun.COM     Tables = ACPI_ALLOCATE_ZEROED (
344*7851SDana.Myers@Sun.COM         ((ACPI_SIZE) AcpiGbl_RootTableList.Size + ACPI_ROOT_TABLE_SIZE_INCREMENT)
345*7851SDana.Myers@Sun.COM         * sizeof (ACPI_TABLE_DESC));
346*7851SDana.Myers@Sun.COM     if (!Tables)
3473446Smrj     {
348*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
349*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NO_MEMORY);
350*7851SDana.Myers@Sun.COM     }
351*7851SDana.Myers@Sun.COM 
352*7851SDana.Myers@Sun.COM     /* Copy and free the previous table array */
353*7851SDana.Myers@Sun.COM 
354*7851SDana.Myers@Sun.COM     if (AcpiGbl_RootTableList.Tables)
355*7851SDana.Myers@Sun.COM     {
356*7851SDana.Myers@Sun.COM         ACPI_MEMCPY (Tables, AcpiGbl_RootTableList.Tables,
357*7851SDana.Myers@Sun.COM             (ACPI_SIZE) AcpiGbl_RootTableList.Size * sizeof (ACPI_TABLE_DESC));
358*7851SDana.Myers@Sun.COM 
359*7851SDana.Myers@Sun.COM         if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
360*7851SDana.Myers@Sun.COM         {
361*7851SDana.Myers@Sun.COM             ACPI_FREE (AcpiGbl_RootTableList.Tables);
362*7851SDana.Myers@Sun.COM         }
3633446Smrj     }
3643446Smrj 
365*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Tables = Tables;
366*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Size += ACPI_ROOT_TABLE_SIZE_INCREMENT;
367*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Flags |= (UINT8) ACPI_ROOT_ORIGIN_ALLOCATED;
368*7851SDana.Myers@Sun.COM 
369*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (AE_OK);
370*7851SDana.Myers@Sun.COM }
371*7851SDana.Myers@Sun.COM 
372*7851SDana.Myers@Sun.COM 
373*7851SDana.Myers@Sun.COM /*******************************************************************************
374*7851SDana.Myers@Sun.COM  *
375*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbStoreTable
376*7851SDana.Myers@Sun.COM  *
377*7851SDana.Myers@Sun.COM  * PARAMETERS:  Address             - Table address
378*7851SDana.Myers@Sun.COM  *              Table               - Table header
379*7851SDana.Myers@Sun.COM  *              Length              - Table length
380*7851SDana.Myers@Sun.COM  *              Flags               - flags
381*7851SDana.Myers@Sun.COM  *
382*7851SDana.Myers@Sun.COM  * RETURN:      Status and table index.
383*7851SDana.Myers@Sun.COM  *
384*7851SDana.Myers@Sun.COM  * DESCRIPTION: Add an ACPI table to the global table list
385*7851SDana.Myers@Sun.COM  *
386*7851SDana.Myers@Sun.COM  ******************************************************************************/
387*7851SDana.Myers@Sun.COM 
388*7851SDana.Myers@Sun.COM ACPI_STATUS
389*7851SDana.Myers@Sun.COM AcpiTbStoreTable (
390*7851SDana.Myers@Sun.COM     ACPI_PHYSICAL_ADDRESS   Address,
391*7851SDana.Myers@Sun.COM     ACPI_TABLE_HEADER       *Table,
392*7851SDana.Myers@Sun.COM     UINT32                  Length,
393*7851SDana.Myers@Sun.COM     UINT8                   Flags,
394*7851SDana.Myers@Sun.COM     UINT32                  *TableIndex)
395*7851SDana.Myers@Sun.COM {
396*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
397*7851SDana.Myers@Sun.COM 
398*7851SDana.Myers@Sun.COM 
399*7851SDana.Myers@Sun.COM     /* Ensure that there is room for the table in the Root Table List */
400*7851SDana.Myers@Sun.COM 
401*7851SDana.Myers@Sun.COM     if (AcpiGbl_RootTableList.Count >= AcpiGbl_RootTableList.Size)
4023446Smrj     {
403*7851SDana.Myers@Sun.COM         Status = AcpiTbResizeRootTableList();
404*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
405*7851SDana.Myers@Sun.COM         {
406*7851SDana.Myers@Sun.COM             return (Status);
407*7851SDana.Myers@Sun.COM         }
4083446Smrj     }
4093446Smrj 
410*7851SDana.Myers@Sun.COM     /* Initialize added table */
411*7851SDana.Myers@Sun.COM 
412*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Address = Address;
413*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Pointer = Table;
414*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Length = Length;
415*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].OwnerId = 0;
416*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Flags = Flags;
4173446Smrj 
418*7851SDana.Myers@Sun.COM     ACPI_MOVE_32_TO_32 (
419*7851SDana.Myers@Sun.COM         &(AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Signature),
420*7851SDana.Myers@Sun.COM         Table->Signature);
4213446Smrj 
422*7851SDana.Myers@Sun.COM     *TableIndex = AcpiGbl_RootTableList.Count;
423*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Count++;
424*7851SDana.Myers@Sun.COM     return (Status);
4253446Smrj }
4263446Smrj 
4273446Smrj 
4283446Smrj /*******************************************************************************
4293446Smrj  *
430*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbDeleteTable
431*7851SDana.Myers@Sun.COM  *
432*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableIndex          - Table index
433*7851SDana.Myers@Sun.COM  *
434*7851SDana.Myers@Sun.COM  * RETURN:      None
435*7851SDana.Myers@Sun.COM  *
436*7851SDana.Myers@Sun.COM  * DESCRIPTION: Delete one internal ACPI table
437*7851SDana.Myers@Sun.COM  *
438*7851SDana.Myers@Sun.COM  ******************************************************************************/
439*7851SDana.Myers@Sun.COM 
440*7851SDana.Myers@Sun.COM void
441*7851SDana.Myers@Sun.COM AcpiTbDeleteTable (
442*7851SDana.Myers@Sun.COM     ACPI_TABLE_DESC         *TableDesc)
443*7851SDana.Myers@Sun.COM {
444*7851SDana.Myers@Sun.COM 
445*7851SDana.Myers@Sun.COM     /* Table must be mapped or allocated */
446*7851SDana.Myers@Sun.COM 
447*7851SDana.Myers@Sun.COM     if (!TableDesc->Pointer)
448*7851SDana.Myers@Sun.COM     {
449*7851SDana.Myers@Sun.COM         return;
450*7851SDana.Myers@Sun.COM     }
451*7851SDana.Myers@Sun.COM 
452*7851SDana.Myers@Sun.COM     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
453*7851SDana.Myers@Sun.COM     {
454*7851SDana.Myers@Sun.COM     case ACPI_TABLE_ORIGIN_MAPPED:
455*7851SDana.Myers@Sun.COM         AcpiOsUnmapMemory (TableDesc->Pointer, TableDesc->Length);
456*7851SDana.Myers@Sun.COM         break;
457*7851SDana.Myers@Sun.COM 
458*7851SDana.Myers@Sun.COM     case ACPI_TABLE_ORIGIN_ALLOCATED:
459*7851SDana.Myers@Sun.COM         ACPI_FREE (TableDesc->Pointer);
460*7851SDana.Myers@Sun.COM         break;
461*7851SDana.Myers@Sun.COM 
462*7851SDana.Myers@Sun.COM     default:
463*7851SDana.Myers@Sun.COM         break;
464*7851SDana.Myers@Sun.COM     }
465*7851SDana.Myers@Sun.COM 
466*7851SDana.Myers@Sun.COM     TableDesc->Pointer = NULL;
467*7851SDana.Myers@Sun.COM }
468*7851SDana.Myers@Sun.COM 
469*7851SDana.Myers@Sun.COM 
470*7851SDana.Myers@Sun.COM /*******************************************************************************
471*7851SDana.Myers@Sun.COM  *
472*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbTerminate
473*7851SDana.Myers@Sun.COM  *
474*7851SDana.Myers@Sun.COM  * PARAMETERS:  None
475*7851SDana.Myers@Sun.COM  *
476*7851SDana.Myers@Sun.COM  * RETURN:      None
477*7851SDana.Myers@Sun.COM  *
478*7851SDana.Myers@Sun.COM  * DESCRIPTION: Delete all internal ACPI tables
4793446Smrj  *
480*7851SDana.Myers@Sun.COM  ******************************************************************************/
481*7851SDana.Myers@Sun.COM 
482*7851SDana.Myers@Sun.COM void
483*7851SDana.Myers@Sun.COM AcpiTbTerminate (
484*7851SDana.Myers@Sun.COM     void)
485*7851SDana.Myers@Sun.COM {
486*7851SDana.Myers@Sun.COM     UINT32                  i;
487*7851SDana.Myers@Sun.COM 
488*7851SDana.Myers@Sun.COM 
489*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (TbTerminate);
490*7851SDana.Myers@Sun.COM 
491*7851SDana.Myers@Sun.COM 
492*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
493*7851SDana.Myers@Sun.COM 
494*7851SDana.Myers@Sun.COM     /* Delete the individual tables */
495*7851SDana.Myers@Sun.COM 
496*7851SDana.Myers@Sun.COM     for (i = 0; i < AcpiGbl_RootTableList.Count; i++)
497*7851SDana.Myers@Sun.COM     {
498*7851SDana.Myers@Sun.COM         AcpiTbDeleteTable (&AcpiGbl_RootTableList.Tables[i]);
499*7851SDana.Myers@Sun.COM     }
500*7851SDana.Myers@Sun.COM 
501*7851SDana.Myers@Sun.COM     /*
502*7851SDana.Myers@Sun.COM      * Delete the root table array if allocated locally. Array cannot be
503*7851SDana.Myers@Sun.COM      * mapped, so we don't need to check for that flag.
504*7851SDana.Myers@Sun.COM      */
505*7851SDana.Myers@Sun.COM     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
506*7851SDana.Myers@Sun.COM     {
507*7851SDana.Myers@Sun.COM         ACPI_FREE (AcpiGbl_RootTableList.Tables);
508*7851SDana.Myers@Sun.COM     }
509*7851SDana.Myers@Sun.COM 
510*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Tables = NULL;
511*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Flags = 0;
512*7851SDana.Myers@Sun.COM     AcpiGbl_RootTableList.Count = 0;
513*7851SDana.Myers@Sun.COM 
514*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
515*7851SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
516*7851SDana.Myers@Sun.COM }
517*7851SDana.Myers@Sun.COM 
518*7851SDana.Myers@Sun.COM 
519*7851SDana.Myers@Sun.COM /*******************************************************************************
5203446Smrj  *
521*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbDeleteNamespaceByOwner
522*7851SDana.Myers@Sun.COM  *
523*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableIndex          - Table index
524*7851SDana.Myers@Sun.COM  *
525*7851SDana.Myers@Sun.COM  * RETURN:      None
526*7851SDana.Myers@Sun.COM  *
527*7851SDana.Myers@Sun.COM  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
5283446Smrj  *
529*7851SDana.Myers@Sun.COM  ******************************************************************************/
530*7851SDana.Myers@Sun.COM 
531*7851SDana.Myers@Sun.COM void
532*7851SDana.Myers@Sun.COM AcpiTbDeleteNamespaceByOwner (
533*7851SDana.Myers@Sun.COM     UINT32                  TableIndex)
534*7851SDana.Myers@Sun.COM {
535*7851SDana.Myers@Sun.COM     ACPI_OWNER_ID           OwnerId;
536*7851SDana.Myers@Sun.COM 
537*7851SDana.Myers@Sun.COM 
538*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
539*7851SDana.Myers@Sun.COM     if (TableIndex < AcpiGbl_RootTableList.Count)
540*7851SDana.Myers@Sun.COM     {
541*7851SDana.Myers@Sun.COM         OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
542*7851SDana.Myers@Sun.COM     }
543*7851SDana.Myers@Sun.COM     else
544*7851SDana.Myers@Sun.COM     {
545*7851SDana.Myers@Sun.COM         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
546*7851SDana.Myers@Sun.COM         return;
547*7851SDana.Myers@Sun.COM     }
548*7851SDana.Myers@Sun.COM 
549*7851SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
550*7851SDana.Myers@Sun.COM     AcpiNsDeleteNamespaceByOwner (OwnerId);
551*7851SDana.Myers@Sun.COM }
552*7851SDana.Myers@Sun.COM 
553*7851SDana.Myers@Sun.COM 
554*7851SDana.Myers@Sun.COM /*******************************************************************************
555*7851SDana.Myers@Sun.COM  *
556*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbAllocateOwnerId
557*7851SDana.Myers@Sun.COM  *
558*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableIndex          - Table index
559*7851SDana.Myers@Sun.COM  *
560*7851SDana.Myers@Sun.COM  * RETURN:      Status
561*7851SDana.Myers@Sun.COM  *
562*7851SDana.Myers@Sun.COM  * DESCRIPTION: Allocates OwnerId in TableDesc
5633446Smrj  *
5643446Smrj  ******************************************************************************/
5653446Smrj 
5663446Smrj ACPI_STATUS
567*7851SDana.Myers@Sun.COM AcpiTbAllocateOwnerId (
568*7851SDana.Myers@Sun.COM     UINT32                  TableIndex)
5693446Smrj {
570*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_BAD_PARAMETER;
5713446Smrj 
5723446Smrj 
573*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
574*7851SDana.Myers@Sun.COM 
5753446Smrj 
576*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
577*7851SDana.Myers@Sun.COM     if (TableIndex < AcpiGbl_RootTableList.Count)
5783446Smrj     {
579*7851SDana.Myers@Sun.COM         Status = AcpiUtAllocateOwnerId
580*7851SDana.Myers@Sun.COM                     (&(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
5813446Smrj     }
5823446Smrj 
583*7851SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
5843446Smrj     return_ACPI_STATUS (Status);
5853446Smrj }
5863446Smrj 
5873446Smrj 
5883446Smrj /*******************************************************************************
5893446Smrj  *
590*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbReleaseOwnerId
5913446Smrj  *
592*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableIndex          - Table index
5933446Smrj  *
594*7851SDana.Myers@Sun.COM  * RETURN:      Status
5953446Smrj  *
596*7851SDana.Myers@Sun.COM  * DESCRIPTION: Releases OwnerId in TableDesc
5973446Smrj  *
5983446Smrj  ******************************************************************************/
5993446Smrj 
600*7851SDana.Myers@Sun.COM ACPI_STATUS
601*7851SDana.Myers@Sun.COM AcpiTbReleaseOwnerId (
602*7851SDana.Myers@Sun.COM     UINT32                  TableIndex)
6033446Smrj {
604*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_BAD_PARAMETER;
605*7851SDana.Myers@Sun.COM 
606*7851SDana.Myers@Sun.COM 
607*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
6083446Smrj 
6093446Smrj 
610*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
611*7851SDana.Myers@Sun.COM     if (TableIndex < AcpiGbl_RootTableList.Count)
6123446Smrj     {
613*7851SDana.Myers@Sun.COM         AcpiUtReleaseOwnerId (&(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
614*7851SDana.Myers@Sun.COM         Status = AE_OK;
6153446Smrj     }
616*7851SDana.Myers@Sun.COM 
617*7851SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
618*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
6193446Smrj }
6203446Smrj 
6213446Smrj 
6223446Smrj /*******************************************************************************
6233446Smrj  *
624*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbGetOwnerId
6253446Smrj  *
626*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableIndex          - Table index
627*7851SDana.Myers@Sun.COM  *              OwnerId             - Where the table OwnerId is returned
6283446Smrj  *
629*7851SDana.Myers@Sun.COM  * RETURN:      Status
630*7851SDana.Myers@Sun.COM  *
631*7851SDana.Myers@Sun.COM  * DESCRIPTION: returns OwnerId for the ACPI table
6323446Smrj  *
6333446Smrj  ******************************************************************************/
6343446Smrj 
635*7851SDana.Myers@Sun.COM ACPI_STATUS
636*7851SDana.Myers@Sun.COM AcpiTbGetOwnerId (
637*7851SDana.Myers@Sun.COM     UINT32                  TableIndex,
638*7851SDana.Myers@Sun.COM     ACPI_OWNER_ID           *OwnerId)
6393446Smrj {
640*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_BAD_PARAMETER;
6413446Smrj 
6423446Smrj 
643*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (TbGetOwnerId);
6443446Smrj 
6453446Smrj 
646*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
647*7851SDana.Myers@Sun.COM     if (TableIndex < AcpiGbl_RootTableList.Count)
6483446Smrj     {
649*7851SDana.Myers@Sun.COM         *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
650*7851SDana.Myers@Sun.COM         Status = AE_OK;
6513446Smrj     }
6523446Smrj 
6533446Smrj     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
654*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
6553446Smrj }
6563446Smrj 
6573446Smrj 
6583446Smrj /*******************************************************************************
6593446Smrj  *
660*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbIsTableLoaded
6613446Smrj  *
662*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableIndex          - Table index
6633446Smrj  *
664*7851SDana.Myers@Sun.COM  * RETURN:      Table Loaded Flag
6653446Smrj  *
6663446Smrj  ******************************************************************************/
6673446Smrj 
668*7851SDana.Myers@Sun.COM BOOLEAN
669*7851SDana.Myers@Sun.COM AcpiTbIsTableLoaded (
670*7851SDana.Myers@Sun.COM     UINT32                  TableIndex)
6713446Smrj {
672*7851SDana.Myers@Sun.COM     BOOLEAN                 IsLoaded = FALSE;
6733446Smrj 
6743446Smrj 
675*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
676*7851SDana.Myers@Sun.COM     if (TableIndex < AcpiGbl_RootTableList.Count)
6773446Smrj     {
678*7851SDana.Myers@Sun.COM         IsLoaded = (BOOLEAN)
679*7851SDana.Myers@Sun.COM             (AcpiGbl_RootTableList.Tables[TableIndex].Flags & ACPI_TABLE_IS_LOADED);
6803446Smrj     }
6813446Smrj 
682*7851SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
683*7851SDana.Myers@Sun.COM     return (IsLoaded);
6843446Smrj }
6853446Smrj 
6863446Smrj 
6873446Smrj /*******************************************************************************
6883446Smrj  *
689*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiTbSetTableLoadedFlag
6903446Smrj  *
691*7851SDana.Myers@Sun.COM  * PARAMETERS:  TableIndex          - Table index
692*7851SDana.Myers@Sun.COM  *              IsLoaded            - TRUE if table is loaded, FALSE otherwise
6933446Smrj  *
694*7851SDana.Myers@Sun.COM  * RETURN:      None
695*7851SDana.Myers@Sun.COM  *
696*7851SDana.Myers@Sun.COM  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
6973446Smrj  *
6983446Smrj  ******************************************************************************/
6993446Smrj 
700*7851SDana.Myers@Sun.COM void
701*7851SDana.Myers@Sun.COM AcpiTbSetTableLoadedFlag (
702*7851SDana.Myers@Sun.COM     UINT32                  TableIndex,
703*7851SDana.Myers@Sun.COM     BOOLEAN                 IsLoaded)
7043446Smrj {
7053446Smrj 
706*7851SDana.Myers@Sun.COM     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
707*7851SDana.Myers@Sun.COM     if (TableIndex < AcpiGbl_RootTableList.Count)
7083446Smrj     {
709*7851SDana.Myers@Sun.COM         if (IsLoaded)
710*7851SDana.Myers@Sun.COM         {
711*7851SDana.Myers@Sun.COM             AcpiGbl_RootTableList.Tables[TableIndex].Flags |= ACPI_TABLE_IS_LOADED;
712*7851SDana.Myers@Sun.COM         }
713*7851SDana.Myers@Sun.COM         else
714*7851SDana.Myers@Sun.COM         {
715*7851SDana.Myers@Sun.COM             AcpiGbl_RootTableList.Tables[TableIndex].Flags &= ~ACPI_TABLE_IS_LOADED;
716*7851SDana.Myers@Sun.COM         }
7173446Smrj     }
7183446Smrj 
719*7851SDana.Myers@Sun.COM     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
7203446Smrj }
7213446Smrj 
722