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