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