1a88e22b7SJung-uk Kim /****************************************************************************** 2a88e22b7SJung-uk Kim * 3a88e22b7SJung-uk Kim * Module Name: dttable.c - handling for specific ACPI tables 4a88e22b7SJung-uk Kim * 5a88e22b7SJung-uk Kim *****************************************************************************/ 6a88e22b7SJung-uk Kim 7d244b227SJung-uk Kim /* 8d244b227SJung-uk Kim * Copyright (C) 2000 - 2011, Intel Corp. 9a88e22b7SJung-uk Kim * All rights reserved. 10a88e22b7SJung-uk Kim * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 25a88e22b7SJung-uk Kim * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 29a88e22b7SJung-uk Kim * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 43a88e22b7SJung-uk Kim 44a88e22b7SJung-uk Kim #define __DTTABLE_C__ 45a88e22b7SJung-uk Kim 46a88e22b7SJung-uk Kim /* Compile all complex data tables */ 47a88e22b7SJung-uk Kim 48a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 49a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 50a88e22b7SJung-uk Kim 51a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 52a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dttable") 53a88e22b7SJung-uk Kim 54a88e22b7SJung-uk Kim 55a88e22b7SJung-uk Kim /* TBD: merge these into dmtbinfo.c? */ 56a88e22b7SJung-uk Kim 57a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO TableInfoAsfAddress[] = 58a88e22b7SJung-uk Kim { 59a88e22b7SJung-uk Kim {ACPI_DMT_BUFFER, 0, "Addresses", 0}, 60a88e22b7SJung-uk Kim {ACPI_DMT_EXIT, 0, NULL, 0} 61a88e22b7SJung-uk Kim }; 62a88e22b7SJung-uk Kim 63a88e22b7SJung-uk Kim static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] = 64a88e22b7SJung-uk Kim { 65a88e22b7SJung-uk Kim {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0}, 66a88e22b7SJung-uk Kim {ACPI_DMT_EXIT, 0, NULL, 0} 67a88e22b7SJung-uk Kim }; 68a88e22b7SJung-uk Kim 69a88e22b7SJung-uk Kim 70a88e22b7SJung-uk Kim /* TBD: move to acmacros.h */ 71a88e22b7SJung-uk Kim 72a88e22b7SJung-uk Kim #define ACPI_SUB_PTR(t, a, b) \ 73a88e22b7SJung-uk Kim ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b))) 74a88e22b7SJung-uk Kim 75a88e22b7SJung-uk Kim 76a88e22b7SJung-uk Kim /* Local prototypes */ 77a88e22b7SJung-uk Kim 78a88e22b7SJung-uk Kim static ACPI_STATUS 79a88e22b7SJung-uk Kim DtCompileTwoSubtables ( 80a88e22b7SJung-uk Kim void **List, 81a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo1, 82a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo2); 83a88e22b7SJung-uk Kim 84a88e22b7SJung-uk Kim 85a88e22b7SJung-uk Kim /****************************************************************************** 86a88e22b7SJung-uk Kim * 87a88e22b7SJung-uk Kim * FUNCTION: DtCompileTwoSubtables 88a88e22b7SJung-uk Kim * 89a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 90a88e22b7SJung-uk Kim * TableInfo1 - Info table 1 91a88e22b7SJung-uk Kim * TableInfo1 - Info table 2 92a88e22b7SJung-uk Kim * 93a88e22b7SJung-uk Kim * RETURN: Status 94a88e22b7SJung-uk Kim * 95a88e22b7SJung-uk Kim * DESCRIPTION: Compile tables with a header and one or more same subtables. 96a88e22b7SJung-uk Kim * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT 97a88e22b7SJung-uk Kim * 98a88e22b7SJung-uk Kim *****************************************************************************/ 99a88e22b7SJung-uk Kim 100a88e22b7SJung-uk Kim static ACPI_STATUS 101a88e22b7SJung-uk Kim DtCompileTwoSubtables ( 102a88e22b7SJung-uk Kim void **List, 103a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo1, 104a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *TableInfo2) 105a88e22b7SJung-uk Kim { 106a88e22b7SJung-uk Kim ACPI_STATUS Status; 107a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 108a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 109a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 110a88e22b7SJung-uk Kim 111a88e22b7SJung-uk Kim 112a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE); 113a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 114a88e22b7SJung-uk Kim { 115a88e22b7SJung-uk Kim return (Status); 116a88e22b7SJung-uk Kim } 117a88e22b7SJung-uk Kim 118a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 119a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 120a88e22b7SJung-uk Kim 121a88e22b7SJung-uk Kim while (*PFieldList) 122a88e22b7SJung-uk Kim { 123a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE); 124a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 125a88e22b7SJung-uk Kim { 126a88e22b7SJung-uk Kim return (Status); 127a88e22b7SJung-uk Kim } 128a88e22b7SJung-uk Kim 129a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 130a88e22b7SJung-uk Kim } 131a88e22b7SJung-uk Kim 132a88e22b7SJung-uk Kim return (AE_OK); 133a88e22b7SJung-uk Kim } 134a88e22b7SJung-uk Kim 135a88e22b7SJung-uk Kim 136a88e22b7SJung-uk Kim /****************************************************************************** 137a88e22b7SJung-uk Kim * 138a88e22b7SJung-uk Kim * FUNCTION: DtCompileFacs 139a88e22b7SJung-uk Kim * 140a88e22b7SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 141a88e22b7SJung-uk Kim * 142a88e22b7SJung-uk Kim * RETURN: Status 143a88e22b7SJung-uk Kim * 144a88e22b7SJung-uk Kim * DESCRIPTION: Compile FACS. 145a88e22b7SJung-uk Kim * 146a88e22b7SJung-uk Kim *****************************************************************************/ 147a88e22b7SJung-uk Kim 148a88e22b7SJung-uk Kim ACPI_STATUS 149a88e22b7SJung-uk Kim DtCompileFacs ( 150a88e22b7SJung-uk Kim DT_FIELD **PFieldList) 151a88e22b7SJung-uk Kim { 152a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 153a88e22b7SJung-uk Kim UINT8 *ReservedBuffer; 154a88e22b7SJung-uk Kim ACPI_STATUS Status; 155a88e22b7SJung-uk Kim UINT32 ReservedSize; 156a88e22b7SJung-uk Kim 157a88e22b7SJung-uk Kim 158a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs, 159a88e22b7SJung-uk Kim &Gbl_RootTable, TRUE); 160a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 161a88e22b7SJung-uk Kim { 162a88e22b7SJung-uk Kim return (Status); 163a88e22b7SJung-uk Kim } 164a88e22b7SJung-uk Kim 165a88e22b7SJung-uk Kim /* Large FACS reserved area at the end of the table */ 166a88e22b7SJung-uk Kim 167a88e22b7SJung-uk Kim ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1); 168a88e22b7SJung-uk Kim ReservedBuffer = UtLocalCalloc (ReservedSize); 169a88e22b7SJung-uk Kim 170a88e22b7SJung-uk Kim DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable); 171a88e22b7SJung-uk Kim 172a88e22b7SJung-uk Kim ACPI_FREE (ReservedBuffer); 173a88e22b7SJung-uk Kim DtInsertSubtable (Gbl_RootTable, Subtable); 174a88e22b7SJung-uk Kim return (AE_OK); 175a88e22b7SJung-uk Kim } 176a88e22b7SJung-uk Kim 177a88e22b7SJung-uk Kim 178a88e22b7SJung-uk Kim /****************************************************************************** 179a88e22b7SJung-uk Kim * 180a88e22b7SJung-uk Kim * FUNCTION: DtCompileRsdp 181a88e22b7SJung-uk Kim * 182a88e22b7SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 183a88e22b7SJung-uk Kim * 184a88e22b7SJung-uk Kim * RETURN: Status 185a88e22b7SJung-uk Kim * 186a88e22b7SJung-uk Kim * DESCRIPTION: Compile RSDP. 187a88e22b7SJung-uk Kim * 188a88e22b7SJung-uk Kim *****************************************************************************/ 189a88e22b7SJung-uk Kim 190a88e22b7SJung-uk Kim ACPI_STATUS 191a88e22b7SJung-uk Kim DtCompileRsdp ( 192a88e22b7SJung-uk Kim DT_FIELD **PFieldList) 193a88e22b7SJung-uk Kim { 194a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 195a88e22b7SJung-uk Kim ACPI_TABLE_RSDP *Rsdp; 196a88e22b7SJung-uk Kim ACPI_RSDP_EXTENSION *RsdpExtension; 197a88e22b7SJung-uk Kim ACPI_STATUS Status; 198a88e22b7SJung-uk Kim 199a88e22b7SJung-uk Kim 200a88e22b7SJung-uk Kim /* Compile the "common" RSDP (ACPI 1.0) */ 201a88e22b7SJung-uk Kim 202a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1, 203a88e22b7SJung-uk Kim &Gbl_RootTable, TRUE); 204a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 205a88e22b7SJung-uk Kim { 206a88e22b7SJung-uk Kim return (Status); 207a88e22b7SJung-uk Kim } 208a88e22b7SJung-uk Kim 209a88e22b7SJung-uk Kim Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer); 210a88e22b7SJung-uk Kim DtSetTableChecksum (&Rsdp->Checksum); 211a88e22b7SJung-uk Kim 212a88e22b7SJung-uk Kim if (Rsdp->Revision > 0) 213a88e22b7SJung-uk Kim { 214a88e22b7SJung-uk Kim /* Compile the "extended" part of the RSDP as a subtable */ 215a88e22b7SJung-uk Kim 216a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2, 217a88e22b7SJung-uk Kim &Subtable, TRUE); 218a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 219a88e22b7SJung-uk Kim { 220a88e22b7SJung-uk Kim return (Status); 221a88e22b7SJung-uk Kim } 222a88e22b7SJung-uk Kim 223a88e22b7SJung-uk Kim DtInsertSubtable (Gbl_RootTable, Subtable); 224a88e22b7SJung-uk Kim 225a88e22b7SJung-uk Kim /* Set length and extended checksum for entire RSDP */ 226a88e22b7SJung-uk Kim 227a88e22b7SJung-uk Kim RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer); 228a88e22b7SJung-uk Kim RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length; 229a88e22b7SJung-uk Kim DtSetTableChecksum (&RsdpExtension->ExtendedChecksum); 230a88e22b7SJung-uk Kim } 231a88e22b7SJung-uk Kim 232a88e22b7SJung-uk Kim return (AE_OK); 233a88e22b7SJung-uk Kim } 234a88e22b7SJung-uk Kim 235a88e22b7SJung-uk Kim 236a88e22b7SJung-uk Kim /****************************************************************************** 237a88e22b7SJung-uk Kim * 238a88e22b7SJung-uk Kim * FUNCTION: DtCompileAsf 239a88e22b7SJung-uk Kim * 240a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 241a88e22b7SJung-uk Kim * 242a88e22b7SJung-uk Kim * RETURN: Status 243a88e22b7SJung-uk Kim * 244a88e22b7SJung-uk Kim * DESCRIPTION: Compile ASF!. 245a88e22b7SJung-uk Kim * 246a88e22b7SJung-uk Kim *****************************************************************************/ 247a88e22b7SJung-uk Kim 248a88e22b7SJung-uk Kim ACPI_STATUS 249a88e22b7SJung-uk Kim DtCompileAsf ( 250a88e22b7SJung-uk Kim void **List) 251a88e22b7SJung-uk Kim { 252a88e22b7SJung-uk Kim ACPI_ASF_INFO *AsfTable; 253a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 254a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 255a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 256a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *DataInfoTable = NULL; 257a88e22b7SJung-uk Kim UINT32 DataCount = 0; 258a88e22b7SJung-uk Kim ACPI_STATUS Status; 259a88e22b7SJung-uk Kim UINT32 i; 260a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 261a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 262a88e22b7SJung-uk Kim 263a88e22b7SJung-uk Kim 264a88e22b7SJung-uk Kim while (*PFieldList) 265a88e22b7SJung-uk Kim { 266a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 267a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr, 268a88e22b7SJung-uk Kim &Subtable, TRUE); 269a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 270a88e22b7SJung-uk Kim { 271a88e22b7SJung-uk Kim return (Status); 272a88e22b7SJung-uk Kim } 273a88e22b7SJung-uk Kim 274a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 275a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 276a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 277a88e22b7SJung-uk Kim 278a88e22b7SJung-uk Kim AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer); 279a88e22b7SJung-uk Kim 280a88e22b7SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 281a88e22b7SJung-uk Kim { 282a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_INFO: 283a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf0; 284a88e22b7SJung-uk Kim break; 285a88e22b7SJung-uk Kim 286a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ALERT: 287a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf1; 288a88e22b7SJung-uk Kim break; 289a88e22b7SJung-uk Kim 290a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_CONTROL: 291a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf2; 292a88e22b7SJung-uk Kim break; 293a88e22b7SJung-uk Kim 294a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_BOOT: 295a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf3; 296a88e22b7SJung-uk Kim break; 297a88e22b7SJung-uk Kim 298a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 299a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoAsf4; 300a88e22b7SJung-uk Kim break; 301a88e22b7SJung-uk Kim 302a88e22b7SJung-uk Kim default: 303a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 304a88e22b7SJung-uk Kim return (AE_ERROR); 305a88e22b7SJung-uk Kim } 306a88e22b7SJung-uk Kim 307a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 308a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 309a88e22b7SJung-uk Kim { 310a88e22b7SJung-uk Kim return (Status); 311a88e22b7SJung-uk Kim } 312a88e22b7SJung-uk Kim 313a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 314a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 315a88e22b7SJung-uk Kim 316a88e22b7SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 317a88e22b7SJung-uk Kim { 318a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_INFO: 319a88e22b7SJung-uk Kim DataInfoTable = NULL; 320a88e22b7SJung-uk Kim break; 321a88e22b7SJung-uk Kim 322a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ALERT: 323a88e22b7SJung-uk Kim DataInfoTable = AcpiDmTableInfoAsf1a; 324a88e22b7SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, 325a88e22b7SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 326a88e22b7SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Alerts; 327a88e22b7SJung-uk Kim break; 328a88e22b7SJung-uk Kim 329a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_CONTROL: 330a88e22b7SJung-uk Kim DataInfoTable = AcpiDmTableInfoAsf2a; 331a88e22b7SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, 332a88e22b7SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 333a88e22b7SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Controls; 334a88e22b7SJung-uk Kim break; 335a88e22b7SJung-uk Kim 336a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_BOOT: 337a88e22b7SJung-uk Kim DataInfoTable = NULL; 338a88e22b7SJung-uk Kim break; 339a88e22b7SJung-uk Kim 340a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 341a88e22b7SJung-uk Kim DataInfoTable = TableInfoAsfAddress; 342a88e22b7SJung-uk Kim DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, 343a88e22b7SJung-uk Kim ACPI_SUB_PTR (UINT8, Subtable->Buffer, 344a88e22b7SJung-uk Kim sizeof (ACPI_ASF_HEADER)))->Devices; 345a88e22b7SJung-uk Kim break; 346a88e22b7SJung-uk Kim 347a88e22b7SJung-uk Kim default: 348a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 349a88e22b7SJung-uk Kim return (AE_ERROR); 350a88e22b7SJung-uk Kim } 351a88e22b7SJung-uk Kim 352a88e22b7SJung-uk Kim if (DataInfoTable) 353a88e22b7SJung-uk Kim { 354a88e22b7SJung-uk Kim switch (AsfTable->Header.Type & 0x7F) 355a88e22b7SJung-uk Kim { 356a88e22b7SJung-uk Kim case ACPI_ASF_TYPE_ADDRESS: 357a88e22b7SJung-uk Kim 358a88e22b7SJung-uk Kim while (DataCount > 0) 359a88e22b7SJung-uk Kim { 360a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, DataInfoTable, 361a88e22b7SJung-uk Kim &Subtable, TRUE); 362a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 363a88e22b7SJung-uk Kim { 364a88e22b7SJung-uk Kim return (Status); 365a88e22b7SJung-uk Kim } 366a88e22b7SJung-uk Kim 367a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 368a88e22b7SJung-uk Kim DataCount = DataCount - Subtable->Length; 369a88e22b7SJung-uk Kim } 370a88e22b7SJung-uk Kim break; 371a88e22b7SJung-uk Kim 372a88e22b7SJung-uk Kim default: 373a88e22b7SJung-uk Kim 374a88e22b7SJung-uk Kim for (i = 0; i < DataCount; i++) 375a88e22b7SJung-uk Kim { 376a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, DataInfoTable, 377a88e22b7SJung-uk Kim &Subtable, TRUE); 378a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 379a88e22b7SJung-uk Kim { 380a88e22b7SJung-uk Kim return (Status); 381a88e22b7SJung-uk Kim } 382a88e22b7SJung-uk Kim 383a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 384a88e22b7SJung-uk Kim } 385a88e22b7SJung-uk Kim break; 386a88e22b7SJung-uk Kim } 387a88e22b7SJung-uk Kim } 388a88e22b7SJung-uk Kim 389a88e22b7SJung-uk Kim DtPopSubtable (); 390a88e22b7SJung-uk Kim } 391a88e22b7SJung-uk Kim 392a88e22b7SJung-uk Kim return (AE_OK); 393a88e22b7SJung-uk Kim } 394a88e22b7SJung-uk Kim 395a88e22b7SJung-uk Kim 396a88e22b7SJung-uk Kim /****************************************************************************** 397a88e22b7SJung-uk Kim * 398a88e22b7SJung-uk Kim * FUNCTION: DtCompileCpep 399a88e22b7SJung-uk Kim * 400a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 401a88e22b7SJung-uk Kim * 402a88e22b7SJung-uk Kim * RETURN: Status 403a88e22b7SJung-uk Kim * 404a88e22b7SJung-uk Kim * DESCRIPTION: Compile CPEP. 405a88e22b7SJung-uk Kim * 406a88e22b7SJung-uk Kim *****************************************************************************/ 407a88e22b7SJung-uk Kim 408a88e22b7SJung-uk Kim ACPI_STATUS 409a88e22b7SJung-uk Kim DtCompileCpep ( 410a88e22b7SJung-uk Kim void **List) 411a88e22b7SJung-uk Kim { 412a88e22b7SJung-uk Kim ACPI_STATUS Status; 413a88e22b7SJung-uk Kim 414a88e22b7SJung-uk Kim 415a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 416a88e22b7SJung-uk Kim AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0); 417a88e22b7SJung-uk Kim return (Status); 418a88e22b7SJung-uk Kim } 419a88e22b7SJung-uk Kim 420a88e22b7SJung-uk Kim 421a88e22b7SJung-uk Kim /****************************************************************************** 422a88e22b7SJung-uk Kim * 423a88e22b7SJung-uk Kim * FUNCTION: DtCompileDmar 424a88e22b7SJung-uk Kim * 425a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 426a88e22b7SJung-uk Kim * 427a88e22b7SJung-uk Kim * RETURN: Status 428a88e22b7SJung-uk Kim * 429a88e22b7SJung-uk Kim * DESCRIPTION: Compile DMAR. 430a88e22b7SJung-uk Kim * 431a88e22b7SJung-uk Kim *****************************************************************************/ 432a88e22b7SJung-uk Kim 433a88e22b7SJung-uk Kim ACPI_STATUS 434a88e22b7SJung-uk Kim DtCompileDmar ( 435a88e22b7SJung-uk Kim void **List) 436a88e22b7SJung-uk Kim { 437a88e22b7SJung-uk Kim ACPI_STATUS Status; 438a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 439a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 440a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 441a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 442a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 443a88e22b7SJung-uk Kim ACPI_DMAR_HEADER *DmarHeader; 444a88e22b7SJung-uk Kim UINT8 *ReservedBuffer; 445a88e22b7SJung-uk Kim UINT32 ReservedSize; 446a88e22b7SJung-uk Kim 447a88e22b7SJung-uk Kim 448a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE); 449a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 450a88e22b7SJung-uk Kim { 451a88e22b7SJung-uk Kim return (Status); 452a88e22b7SJung-uk Kim } 453a88e22b7SJung-uk Kim 454a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 455a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 456a88e22b7SJung-uk Kim 457a88e22b7SJung-uk Kim /* DMAR Reserved area */ 458a88e22b7SJung-uk Kim 459a88e22b7SJung-uk Kim ReservedSize = (UINT32) sizeof (((ACPI_TABLE_DMAR *) NULL)->Reserved); 460a88e22b7SJung-uk Kim ReservedBuffer = UtLocalCalloc (ReservedSize); 461a88e22b7SJung-uk Kim 462a88e22b7SJung-uk Kim DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable); 463a88e22b7SJung-uk Kim 464a88e22b7SJung-uk Kim ACPI_FREE (ReservedBuffer); 465a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 466a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 467a88e22b7SJung-uk Kim 468a88e22b7SJung-uk Kim while (*PFieldList) 469a88e22b7SJung-uk Kim { 470a88e22b7SJung-uk Kim /* DMAR Header */ 471a88e22b7SJung-uk Kim 472a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 473a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr, 474a88e22b7SJung-uk Kim &Subtable, TRUE); 475a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 476a88e22b7SJung-uk Kim { 477a88e22b7SJung-uk Kim return (Status); 478a88e22b7SJung-uk Kim } 479a88e22b7SJung-uk Kim 480a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 481a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 482a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 483a88e22b7SJung-uk Kim 484a88e22b7SJung-uk Kim DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer); 485a88e22b7SJung-uk Kim 486a88e22b7SJung-uk Kim switch (DmarHeader->Type) 487a88e22b7SJung-uk Kim { 488a88e22b7SJung-uk Kim case ACPI_DMAR_TYPE_HARDWARE_UNIT: 489a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar0; 490a88e22b7SJung-uk Kim break; 491a88e22b7SJung-uk Kim case ACPI_DMAR_TYPE_RESERVED_MEMORY: 492a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar1; 493a88e22b7SJung-uk Kim break; 494a88e22b7SJung-uk Kim case ACPI_DMAR_TYPE_ATSR: 495a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar2; 496a88e22b7SJung-uk Kim break; 497a88e22b7SJung-uk Kim case ACPI_DMAR_HARDWARE_AFFINITY: 498a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoDmar3; 499a88e22b7SJung-uk Kim break; 500a88e22b7SJung-uk Kim default: 501a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR"); 502a88e22b7SJung-uk Kim return (AE_ERROR); 503a88e22b7SJung-uk Kim } 504a88e22b7SJung-uk Kim 505a88e22b7SJung-uk Kim /* DMAR Subtable */ 506a88e22b7SJung-uk Kim 507a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 508a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 509a88e22b7SJung-uk Kim { 510a88e22b7SJung-uk Kim return (Status); 511a88e22b7SJung-uk Kim } 512a88e22b7SJung-uk Kim 513a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 514a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 515a88e22b7SJung-uk Kim 516a88e22b7SJung-uk Kim /* Optional Device Scope subtables */ 517a88e22b7SJung-uk Kim 518a88e22b7SJung-uk Kim while (*PFieldList) 519a88e22b7SJung-uk Kim { 520a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope, 521a88e22b7SJung-uk Kim &Subtable, FALSE); 522a88e22b7SJung-uk Kim if (Status == AE_NOT_FOUND) 523a88e22b7SJung-uk Kim { 524a88e22b7SJung-uk Kim break; 525a88e22b7SJung-uk Kim } 526a88e22b7SJung-uk Kim 527a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 528a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 529a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 530a88e22b7SJung-uk Kim 531a88e22b7SJung-uk Kim /* Optional PCI Paths */ 532a88e22b7SJung-uk Kim 533a88e22b7SJung-uk Kim while (*PFieldList) 534a88e22b7SJung-uk Kim { 535a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, TableInfoDmarPciPath, 536a88e22b7SJung-uk Kim &Subtable, FALSE); 537a88e22b7SJung-uk Kim if (Status == AE_NOT_FOUND) 538a88e22b7SJung-uk Kim { 539a88e22b7SJung-uk Kim DtPopSubtable (); 540a88e22b7SJung-uk Kim break; 541a88e22b7SJung-uk Kim } 542a88e22b7SJung-uk Kim 543a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 544a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 545a88e22b7SJung-uk Kim } 546a88e22b7SJung-uk Kim } 547a88e22b7SJung-uk Kim 548a88e22b7SJung-uk Kim DtPopSubtable (); 549a88e22b7SJung-uk Kim } 550a88e22b7SJung-uk Kim 551a88e22b7SJung-uk Kim return (AE_OK); 552a88e22b7SJung-uk Kim } 553a88e22b7SJung-uk Kim 554a88e22b7SJung-uk Kim 555a88e22b7SJung-uk Kim /****************************************************************************** 556a88e22b7SJung-uk Kim * 557a88e22b7SJung-uk Kim * FUNCTION: DtCompileEinj 558a88e22b7SJung-uk Kim * 559a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 560a88e22b7SJung-uk Kim * 561a88e22b7SJung-uk Kim * RETURN: Status 562a88e22b7SJung-uk Kim * 563a88e22b7SJung-uk Kim * DESCRIPTION: Compile EINJ. 564a88e22b7SJung-uk Kim * 565a88e22b7SJung-uk Kim *****************************************************************************/ 566a88e22b7SJung-uk Kim 567a88e22b7SJung-uk Kim ACPI_STATUS 568a88e22b7SJung-uk Kim DtCompileEinj ( 569a88e22b7SJung-uk Kim void **List) 570a88e22b7SJung-uk Kim { 571a88e22b7SJung-uk Kim ACPI_STATUS Status; 572a88e22b7SJung-uk Kim 573a88e22b7SJung-uk Kim 574a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 575a88e22b7SJung-uk Kim AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0); 576a88e22b7SJung-uk Kim return (Status); 577a88e22b7SJung-uk Kim } 578a88e22b7SJung-uk Kim 579a88e22b7SJung-uk Kim 580a88e22b7SJung-uk Kim /****************************************************************************** 581a88e22b7SJung-uk Kim * 582a88e22b7SJung-uk Kim * FUNCTION: DtCompileErst 583a88e22b7SJung-uk Kim * 584a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 585a88e22b7SJung-uk Kim * 586a88e22b7SJung-uk Kim * RETURN: Status 587a88e22b7SJung-uk Kim * 588a88e22b7SJung-uk Kim * DESCRIPTION: Compile ERST. 589a88e22b7SJung-uk Kim * 590a88e22b7SJung-uk Kim *****************************************************************************/ 591a88e22b7SJung-uk Kim 592a88e22b7SJung-uk Kim ACPI_STATUS 593a88e22b7SJung-uk Kim DtCompileErst ( 594a88e22b7SJung-uk Kim void **List) 595a88e22b7SJung-uk Kim { 596a88e22b7SJung-uk Kim ACPI_STATUS Status; 597a88e22b7SJung-uk Kim 598a88e22b7SJung-uk Kim 599a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 600a88e22b7SJung-uk Kim AcpiDmTableInfoErst, AcpiDmTableInfoEinj0); 601a88e22b7SJung-uk Kim return (Status); 602a88e22b7SJung-uk Kim } 603a88e22b7SJung-uk Kim 604a88e22b7SJung-uk Kim 605a88e22b7SJung-uk Kim /****************************************************************************** 606a88e22b7SJung-uk Kim * 607a88e22b7SJung-uk Kim * FUNCTION: DtCompileFadt 608a88e22b7SJung-uk Kim * 609a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 610a88e22b7SJung-uk Kim * 611a88e22b7SJung-uk Kim * RETURN: Status 612a88e22b7SJung-uk Kim * 613a88e22b7SJung-uk Kim * DESCRIPTION: Compile FADT. 614a88e22b7SJung-uk Kim * 615a88e22b7SJung-uk Kim *****************************************************************************/ 616a88e22b7SJung-uk Kim 617a88e22b7SJung-uk Kim ACPI_STATUS 618a88e22b7SJung-uk Kim DtCompileFadt ( 619a88e22b7SJung-uk Kim void **List) 620a88e22b7SJung-uk Kim { 621a88e22b7SJung-uk Kim ACPI_STATUS Status; 622a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 623a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 624a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 625a88e22b7SJung-uk Kim ACPI_TABLE_HEADER *Table; 626a88e22b7SJung-uk Kim UINT8 Revision; 627a88e22b7SJung-uk Kim 628a88e22b7SJung-uk Kim 629a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1, 630a88e22b7SJung-uk Kim &Subtable, TRUE); 631a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 632a88e22b7SJung-uk Kim { 633a88e22b7SJung-uk Kim return (Status); 634a88e22b7SJung-uk Kim } 635a88e22b7SJung-uk Kim 636a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 637a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 638a88e22b7SJung-uk Kim 639a88e22b7SJung-uk Kim Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 640a88e22b7SJung-uk Kim Revision = Table->Revision; 641a88e22b7SJung-uk Kim 642a88e22b7SJung-uk Kim if (Revision == 2) 643a88e22b7SJung-uk Kim { 644a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2, 645a88e22b7SJung-uk Kim &Subtable, TRUE); 646a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 647a88e22b7SJung-uk Kim { 648a88e22b7SJung-uk Kim return (Status); 649a88e22b7SJung-uk Kim } 650a88e22b7SJung-uk Kim 651a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 652a88e22b7SJung-uk Kim } 653a88e22b7SJung-uk Kim else if (Revision >= 2) 654a88e22b7SJung-uk Kim { 655a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3, 656a88e22b7SJung-uk Kim &Subtable, TRUE); 657a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 658a88e22b7SJung-uk Kim { 659a88e22b7SJung-uk Kim return (Status); 660a88e22b7SJung-uk Kim } 661a88e22b7SJung-uk Kim 662a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 663*3f0275a0SJung-uk Kim 664*3f0275a0SJung-uk Kim if (Revision >= 5) 665*3f0275a0SJung-uk Kim { 666*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5, 667*3f0275a0SJung-uk Kim &Subtable, TRUE); 668*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 669*3f0275a0SJung-uk Kim { 670*3f0275a0SJung-uk Kim return (Status); 671*3f0275a0SJung-uk Kim } 672*3f0275a0SJung-uk Kim 673*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 674*3f0275a0SJung-uk Kim } 675*3f0275a0SJung-uk Kim } 676*3f0275a0SJung-uk Kim 677*3f0275a0SJung-uk Kim return (AE_OK); 678*3f0275a0SJung-uk Kim } 679*3f0275a0SJung-uk Kim 680*3f0275a0SJung-uk Kim 681*3f0275a0SJung-uk Kim /****************************************************************************** 682*3f0275a0SJung-uk Kim * 683*3f0275a0SJung-uk Kim * FUNCTION: DtCompileFpdt 684*3f0275a0SJung-uk Kim * 685*3f0275a0SJung-uk Kim * PARAMETERS: List - Current field list pointer 686*3f0275a0SJung-uk Kim * 687*3f0275a0SJung-uk Kim * RETURN: Status 688*3f0275a0SJung-uk Kim * 689*3f0275a0SJung-uk Kim * DESCRIPTION: Compile FPDT. 690*3f0275a0SJung-uk Kim * 691*3f0275a0SJung-uk Kim *****************************************************************************/ 692*3f0275a0SJung-uk Kim 693*3f0275a0SJung-uk Kim ACPI_STATUS 694*3f0275a0SJung-uk Kim DtCompileFpdt ( 695*3f0275a0SJung-uk Kim void **List) 696*3f0275a0SJung-uk Kim { 697*3f0275a0SJung-uk Kim ACPI_STATUS Status; 698*3f0275a0SJung-uk Kim ACPI_FPDT_HEADER *FpdtHeader; 699*3f0275a0SJung-uk Kim DT_SUBTABLE *Subtable; 700*3f0275a0SJung-uk Kim DT_SUBTABLE *ParentTable; 701*3f0275a0SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 702*3f0275a0SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 703*3f0275a0SJung-uk Kim DT_FIELD *SubtableStart; 704*3f0275a0SJung-uk Kim 705*3f0275a0SJung-uk Kim 706*3f0275a0SJung-uk Kim while (*PFieldList) 707*3f0275a0SJung-uk Kim { 708*3f0275a0SJung-uk Kim SubtableStart = *PFieldList; 709*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr, 710*3f0275a0SJung-uk Kim &Subtable, TRUE); 711*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 712*3f0275a0SJung-uk Kim { 713*3f0275a0SJung-uk Kim return (Status); 714*3f0275a0SJung-uk Kim } 715*3f0275a0SJung-uk Kim 716*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 717*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 718*3f0275a0SJung-uk Kim DtPushSubtable (Subtable); 719*3f0275a0SJung-uk Kim 720*3f0275a0SJung-uk Kim FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); 721*3f0275a0SJung-uk Kim 722*3f0275a0SJung-uk Kim switch (FpdtHeader->Type) 723*3f0275a0SJung-uk Kim { 724*3f0275a0SJung-uk Kim case ACPI_FPDT_TYPE_BOOT: 725*3f0275a0SJung-uk Kim InfoTable = AcpiDmTableInfoFpdt0; 726*3f0275a0SJung-uk Kim break; 727*3f0275a0SJung-uk Kim 728*3f0275a0SJung-uk Kim case ACPI_FPDT_TYPE_S3PERF: 729*3f0275a0SJung-uk Kim InfoTable = AcpiDmTableInfoFpdt1; 730*3f0275a0SJung-uk Kim break; 731*3f0275a0SJung-uk Kim 732*3f0275a0SJung-uk Kim default: 733*3f0275a0SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT"); 734*3f0275a0SJung-uk Kim return (AE_ERROR); 735*3f0275a0SJung-uk Kim break; 736*3f0275a0SJung-uk Kim } 737*3f0275a0SJung-uk Kim 738*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 739*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 740*3f0275a0SJung-uk Kim { 741*3f0275a0SJung-uk Kim return (Status); 742*3f0275a0SJung-uk Kim } 743*3f0275a0SJung-uk Kim 744*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 745*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 746*3f0275a0SJung-uk Kim DtPopSubtable (); 747a88e22b7SJung-uk Kim } 748a88e22b7SJung-uk Kim 749a88e22b7SJung-uk Kim return (AE_OK); 750a88e22b7SJung-uk Kim } 751a88e22b7SJung-uk Kim 752a88e22b7SJung-uk Kim 753a88e22b7SJung-uk Kim /****************************************************************************** 754a88e22b7SJung-uk Kim * 755a88e22b7SJung-uk Kim * FUNCTION: DtCompileHest 756a88e22b7SJung-uk Kim * 757a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 758a88e22b7SJung-uk Kim * 759a88e22b7SJung-uk Kim * RETURN: Status 760a88e22b7SJung-uk Kim * 761a88e22b7SJung-uk Kim * DESCRIPTION: Compile HEST. 762a88e22b7SJung-uk Kim * 763a88e22b7SJung-uk Kim *****************************************************************************/ 764a88e22b7SJung-uk Kim 765a88e22b7SJung-uk Kim ACPI_STATUS 766a88e22b7SJung-uk Kim DtCompileHest ( 767a88e22b7SJung-uk Kim void **List) 768a88e22b7SJung-uk Kim { 769a88e22b7SJung-uk Kim ACPI_STATUS Status; 770a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 771a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 772a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 773a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 774a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 775a88e22b7SJung-uk Kim UINT16 Type; 776a88e22b7SJung-uk Kim UINT32 BankCount; 777a88e22b7SJung-uk Kim 778a88e22b7SJung-uk Kim 779a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest, 780a88e22b7SJung-uk Kim &Subtable, TRUE); 781a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 782a88e22b7SJung-uk Kim { 783a88e22b7SJung-uk Kim return (Status); 784a88e22b7SJung-uk Kim } 785a88e22b7SJung-uk Kim 786a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 787a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 788a88e22b7SJung-uk Kim 789a88e22b7SJung-uk Kim while (*PFieldList) 790a88e22b7SJung-uk Kim { 791a88e22b7SJung-uk Kim /* Get subtable type */ 792a88e22b7SJung-uk Kim 793a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 794a88e22b7SJung-uk Kim DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 795a88e22b7SJung-uk Kim 796a88e22b7SJung-uk Kim switch (Type) 797a88e22b7SJung-uk Kim { 798a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CHECK: 799a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest0; 800a88e22b7SJung-uk Kim break; 801a88e22b7SJung-uk Kim 802a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 803a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest1; 804a88e22b7SJung-uk Kim break; 805a88e22b7SJung-uk Kim 806a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_NMI: 807a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest2; 808a88e22b7SJung-uk Kim break; 809a88e22b7SJung-uk Kim 810a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_AER_ROOT_PORT: 811a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest6; 812a88e22b7SJung-uk Kim break; 813a88e22b7SJung-uk Kim 814a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_AER_ENDPOINT: 815a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest7; 816a88e22b7SJung-uk Kim break; 817a88e22b7SJung-uk Kim 818a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_AER_BRIDGE: 819a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest8; 820a88e22b7SJung-uk Kim break; 821a88e22b7SJung-uk Kim 822a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_GENERIC_ERROR: 823a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoHest9; 824a88e22b7SJung-uk Kim break; 825a88e22b7SJung-uk Kim 826a88e22b7SJung-uk Kim default: 827a88e22b7SJung-uk Kim /* Cannot continue on unknown type */ 828a88e22b7SJung-uk Kim 829a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST"); 830a88e22b7SJung-uk Kim return (AE_ERROR); 831a88e22b7SJung-uk Kim } 832a88e22b7SJung-uk Kim 833a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 834a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 835a88e22b7SJung-uk Kim { 836a88e22b7SJung-uk Kim return (Status); 837a88e22b7SJung-uk Kim } 838a88e22b7SJung-uk Kim 839a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 840a88e22b7SJung-uk Kim 841a88e22b7SJung-uk Kim /* 842a88e22b7SJung-uk Kim * Additional subtable data - IA32 Error Bank(s) 843a88e22b7SJung-uk Kim */ 844a88e22b7SJung-uk Kim BankCount = 0; 845a88e22b7SJung-uk Kim switch (Type) 846a88e22b7SJung-uk Kim { 847a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CHECK: 848a88e22b7SJung-uk Kim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 849a88e22b7SJung-uk Kim Subtable->Buffer))->NumHardwareBanks; 850a88e22b7SJung-uk Kim break; 851a88e22b7SJung-uk Kim 852a88e22b7SJung-uk Kim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 853a88e22b7SJung-uk Kim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 854a88e22b7SJung-uk Kim Subtable->Buffer))->NumHardwareBanks; 855a88e22b7SJung-uk Kim break; 856a88e22b7SJung-uk Kim 857a88e22b7SJung-uk Kim default: 858a88e22b7SJung-uk Kim break; 859a88e22b7SJung-uk Kim } 860a88e22b7SJung-uk Kim 861a88e22b7SJung-uk Kim while (BankCount) 862a88e22b7SJung-uk Kim { 863a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank, 864a88e22b7SJung-uk Kim &Subtable, TRUE); 865a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 866a88e22b7SJung-uk Kim { 867a88e22b7SJung-uk Kim return (Status); 868a88e22b7SJung-uk Kim } 869a88e22b7SJung-uk Kim 870a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 871a88e22b7SJung-uk Kim BankCount--; 872a88e22b7SJung-uk Kim } 873a88e22b7SJung-uk Kim } 874a88e22b7SJung-uk Kim 875a88e22b7SJung-uk Kim return AE_OK; 876a88e22b7SJung-uk Kim } 877a88e22b7SJung-uk Kim 878a88e22b7SJung-uk Kim 879a88e22b7SJung-uk Kim /****************************************************************************** 880a88e22b7SJung-uk Kim * 881a88e22b7SJung-uk Kim * FUNCTION: DtCompileIvrs 882a88e22b7SJung-uk Kim * 883a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 884a88e22b7SJung-uk Kim * 885a88e22b7SJung-uk Kim * RETURN: Status 886a88e22b7SJung-uk Kim * 887a88e22b7SJung-uk Kim * DESCRIPTION: Compile IVRS. 888a88e22b7SJung-uk Kim * 889a88e22b7SJung-uk Kim *****************************************************************************/ 890a88e22b7SJung-uk Kim 891a88e22b7SJung-uk Kim ACPI_STATUS 892a88e22b7SJung-uk Kim DtCompileIvrs ( 893a88e22b7SJung-uk Kim void **List) 894a88e22b7SJung-uk Kim { 895a88e22b7SJung-uk Kim ACPI_STATUS Status; 896a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 897a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 898a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 899a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 900a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 901a88e22b7SJung-uk Kim ACPI_IVRS_HEADER *IvrsHeader; 902a88e22b7SJung-uk Kim UINT8 EntryType; 903a88e22b7SJung-uk Kim 904a88e22b7SJung-uk Kim 905a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs, 906a88e22b7SJung-uk Kim &Subtable, TRUE); 907a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 908a88e22b7SJung-uk Kim { 909a88e22b7SJung-uk Kim return (Status); 910a88e22b7SJung-uk Kim } 911a88e22b7SJung-uk Kim 912a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 913a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 914a88e22b7SJung-uk Kim 915a88e22b7SJung-uk Kim while (*PFieldList) 916a88e22b7SJung-uk Kim { 917a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 918a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr, 919a88e22b7SJung-uk Kim &Subtable, TRUE); 920a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 921a88e22b7SJung-uk Kim { 922a88e22b7SJung-uk Kim return (Status); 923a88e22b7SJung-uk Kim } 924a88e22b7SJung-uk Kim 925a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 926a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 927a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 928a88e22b7SJung-uk Kim 929a88e22b7SJung-uk Kim IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer); 930a88e22b7SJung-uk Kim 931a88e22b7SJung-uk Kim switch (IvrsHeader->Type) 932a88e22b7SJung-uk Kim { 933a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_HARDWARE: 934a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs0; 935a88e22b7SJung-uk Kim break; 936a88e22b7SJung-uk Kim 937a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY1: 938a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY2: 939a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_MEMORY3: 940a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs1; 941a88e22b7SJung-uk Kim break; 942a88e22b7SJung-uk Kim 943a88e22b7SJung-uk Kim default: 944a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS"); 945a88e22b7SJung-uk Kim return (AE_ERROR); 946a88e22b7SJung-uk Kim } 947a88e22b7SJung-uk Kim 948a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 949a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 950a88e22b7SJung-uk Kim { 951a88e22b7SJung-uk Kim return (Status); 952a88e22b7SJung-uk Kim } 953a88e22b7SJung-uk Kim 954a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 955a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 956a88e22b7SJung-uk Kim 957a88e22b7SJung-uk Kim if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE) 958a88e22b7SJung-uk Kim { 959a88e22b7SJung-uk Kim while (*PFieldList && 960a88e22b7SJung-uk Kim !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type")) 961a88e22b7SJung-uk Kim { 962a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 963a88e22b7SJung-uk Kim DtCompileInteger (&EntryType, *PFieldList, 1, 0); 964a88e22b7SJung-uk Kim 965a88e22b7SJung-uk Kim switch (EntryType) 966a88e22b7SJung-uk Kim { 967a88e22b7SJung-uk Kim /* 4-byte device entries */ 968a88e22b7SJung-uk Kim 969a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_PAD4: 970a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_ALL: 971a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_SELECT: 972a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_START: 973a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_END: 974a88e22b7SJung-uk Kim 975a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs4; 976a88e22b7SJung-uk Kim break; 977a88e22b7SJung-uk Kim 978a88e22b7SJung-uk Kim /* 8-byte entries, type A */ 979a88e22b7SJung-uk Kim 980a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_ALIAS_SELECT: 981a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_ALIAS_START: 982a88e22b7SJung-uk Kim 983a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8a; 984a88e22b7SJung-uk Kim break; 985a88e22b7SJung-uk Kim 986a88e22b7SJung-uk Kim /* 8-byte entries, type B */ 987a88e22b7SJung-uk Kim 988a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_PAD8: 989a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_EXT_SELECT: 990a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_EXT_START: 991a88e22b7SJung-uk Kim 992a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8b; 993a88e22b7SJung-uk Kim break; 994a88e22b7SJung-uk Kim 995a88e22b7SJung-uk Kim /* 8-byte entries, type C */ 996a88e22b7SJung-uk Kim 997a88e22b7SJung-uk Kim case ACPI_IVRS_TYPE_SPECIAL: 998a88e22b7SJung-uk Kim 999a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoIvrs8c; 1000a88e22b7SJung-uk Kim break; 1001a88e22b7SJung-uk Kim 1002a88e22b7SJung-uk Kim default: 1003a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, 1004a88e22b7SJung-uk Kim "IVRS Device Entry"); 1005a88e22b7SJung-uk Kim return (AE_ERROR); 1006a88e22b7SJung-uk Kim } 1007a88e22b7SJung-uk Kim 1008a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, 1009a88e22b7SJung-uk Kim &Subtable, TRUE); 1010a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1011a88e22b7SJung-uk Kim { 1012a88e22b7SJung-uk Kim return (Status); 1013a88e22b7SJung-uk Kim } 1014a88e22b7SJung-uk Kim 1015a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1016a88e22b7SJung-uk Kim } 1017a88e22b7SJung-uk Kim } 1018a88e22b7SJung-uk Kim 1019a88e22b7SJung-uk Kim DtPopSubtable (); 1020a88e22b7SJung-uk Kim } 1021a88e22b7SJung-uk Kim 1022a88e22b7SJung-uk Kim return (AE_OK); 1023a88e22b7SJung-uk Kim } 1024a88e22b7SJung-uk Kim 1025a88e22b7SJung-uk Kim 1026a88e22b7SJung-uk Kim /****************************************************************************** 1027a88e22b7SJung-uk Kim * 1028a88e22b7SJung-uk Kim * FUNCTION: DtCompileMadt 1029a88e22b7SJung-uk Kim * 1030a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1031a88e22b7SJung-uk Kim * 1032a88e22b7SJung-uk Kim * RETURN: Status 1033a88e22b7SJung-uk Kim * 1034a88e22b7SJung-uk Kim * DESCRIPTION: Compile MADT. 1035a88e22b7SJung-uk Kim * 1036a88e22b7SJung-uk Kim *****************************************************************************/ 1037a88e22b7SJung-uk Kim 1038a88e22b7SJung-uk Kim ACPI_STATUS 1039a88e22b7SJung-uk Kim DtCompileMadt ( 1040a88e22b7SJung-uk Kim void **List) 1041a88e22b7SJung-uk Kim { 1042a88e22b7SJung-uk Kim ACPI_STATUS Status; 1043a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1044a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1045a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1046a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 1047a88e22b7SJung-uk Kim ACPI_SUBTABLE_HEADER *MadtHeader; 1048a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1049a88e22b7SJung-uk Kim 1050a88e22b7SJung-uk Kim 1051a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt, 1052a88e22b7SJung-uk Kim &Subtable, TRUE); 1053a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1054a88e22b7SJung-uk Kim { 1055a88e22b7SJung-uk Kim return (Status); 1056a88e22b7SJung-uk Kim } 1057a88e22b7SJung-uk Kim 1058a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1059a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1060a88e22b7SJung-uk Kim 1061a88e22b7SJung-uk Kim while (*PFieldList) 1062a88e22b7SJung-uk Kim { 1063a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 1064a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr, 1065a88e22b7SJung-uk Kim &Subtable, TRUE); 1066a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1067a88e22b7SJung-uk Kim { 1068a88e22b7SJung-uk Kim return (Status); 1069a88e22b7SJung-uk Kim } 1070a88e22b7SJung-uk Kim 1071a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1072a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1073a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 1074a88e22b7SJung-uk Kim 1075a88e22b7SJung-uk Kim MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1076a88e22b7SJung-uk Kim 1077a88e22b7SJung-uk Kim switch (MadtHeader->Type) 1078a88e22b7SJung-uk Kim { 1079a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC: 1080a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt0; 1081a88e22b7SJung-uk Kim break; 1082a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_IO_APIC: 1083a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt1; 1084a88e22b7SJung-uk Kim break; 1085a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 1086a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt2; 1087a88e22b7SJung-uk Kim break; 1088a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_NMI_SOURCE: 1089a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt3; 1090a88e22b7SJung-uk Kim break; 1091a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 1092a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt4; 1093a88e22b7SJung-uk Kim break; 1094a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 1095a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt5; 1096a88e22b7SJung-uk Kim break; 1097a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_IO_SAPIC: 1098a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt6; 1099a88e22b7SJung-uk Kim break; 1100a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_SAPIC: 1101a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt7; 1102a88e22b7SJung-uk Kim break; 1103a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 1104a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt8; 1105a88e22b7SJung-uk Kim break; 1106a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_X2APIC: 1107a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt9; 1108a88e22b7SJung-uk Kim break; 1109a88e22b7SJung-uk Kim case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 1110a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoMadt10; 1111a88e22b7SJung-uk Kim break; 1112*3f0275a0SJung-uk Kim case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 1113*3f0275a0SJung-uk Kim InfoTable = AcpiDmTableInfoMadt11; 1114*3f0275a0SJung-uk Kim break; 1115*3f0275a0SJung-uk Kim case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 1116*3f0275a0SJung-uk Kim InfoTable = AcpiDmTableInfoMadt12; 1117*3f0275a0SJung-uk Kim break; 1118a88e22b7SJung-uk Kim default: 1119a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT"); 1120a88e22b7SJung-uk Kim return (AE_ERROR); 1121a88e22b7SJung-uk Kim } 1122a88e22b7SJung-uk Kim 1123a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1124a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1125a88e22b7SJung-uk Kim { 1126a88e22b7SJung-uk Kim return (Status); 1127a88e22b7SJung-uk Kim } 1128a88e22b7SJung-uk Kim 1129a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1130a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1131a88e22b7SJung-uk Kim DtPopSubtable (); 1132a88e22b7SJung-uk Kim } 1133a88e22b7SJung-uk Kim 1134a88e22b7SJung-uk Kim return (AE_OK); 1135a88e22b7SJung-uk Kim } 1136a88e22b7SJung-uk Kim 1137a88e22b7SJung-uk Kim 1138a88e22b7SJung-uk Kim /****************************************************************************** 1139a88e22b7SJung-uk Kim * 1140a88e22b7SJung-uk Kim * FUNCTION: DtCompileMcfg 1141a88e22b7SJung-uk Kim * 1142a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1143a88e22b7SJung-uk Kim * 1144a88e22b7SJung-uk Kim * RETURN: Status 1145a88e22b7SJung-uk Kim * 1146a88e22b7SJung-uk Kim * DESCRIPTION: Compile MCFG. 1147a88e22b7SJung-uk Kim * 1148a88e22b7SJung-uk Kim *****************************************************************************/ 1149a88e22b7SJung-uk Kim 1150a88e22b7SJung-uk Kim ACPI_STATUS 1151a88e22b7SJung-uk Kim DtCompileMcfg ( 1152a88e22b7SJung-uk Kim void **List) 1153a88e22b7SJung-uk Kim { 1154a88e22b7SJung-uk Kim ACPI_STATUS Status; 1155a88e22b7SJung-uk Kim 1156a88e22b7SJung-uk Kim 1157a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 1158a88e22b7SJung-uk Kim AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0); 1159a88e22b7SJung-uk Kim return (Status); 1160a88e22b7SJung-uk Kim } 1161a88e22b7SJung-uk Kim 1162a88e22b7SJung-uk Kim 1163a88e22b7SJung-uk Kim /****************************************************************************** 1164a88e22b7SJung-uk Kim * 1165*3f0275a0SJung-uk Kim * FUNCTION: DtCompileMpst 1166*3f0275a0SJung-uk Kim * 1167*3f0275a0SJung-uk Kim * PARAMETERS: List - Current field list pointer 1168*3f0275a0SJung-uk Kim * 1169*3f0275a0SJung-uk Kim * RETURN: Status 1170*3f0275a0SJung-uk Kim * 1171*3f0275a0SJung-uk Kim * DESCRIPTION: Compile MPST. 1172*3f0275a0SJung-uk Kim * 1173*3f0275a0SJung-uk Kim *****************************************************************************/ 1174*3f0275a0SJung-uk Kim 1175*3f0275a0SJung-uk Kim ACPI_STATUS 1176*3f0275a0SJung-uk Kim DtCompileMpst ( 1177*3f0275a0SJung-uk Kim void **List) 1178*3f0275a0SJung-uk Kim { 1179*3f0275a0SJung-uk Kim ACPI_STATUS Status; 1180*3f0275a0SJung-uk Kim DT_SUBTABLE *Subtable; 1181*3f0275a0SJung-uk Kim DT_SUBTABLE *ParentTable; 1182*3f0275a0SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1183*3f0275a0SJung-uk Kim ACPI_MPST_CHANNEL *MpstChannelInfo; 1184*3f0275a0SJung-uk Kim ACPI_MPST_POWER_NODE *MpstPowerNode; 1185*3f0275a0SJung-uk Kim ACPI_MPST_DATA_HDR *MpstDataHeader; 1186*3f0275a0SJung-uk Kim UINT16 SubtableCount; 1187*3f0275a0SJung-uk Kim UINT8 PowerStateCount; 1188*3f0275a0SJung-uk Kim UINT8 ComponentCount; 1189*3f0275a0SJung-uk Kim 1190*3f0275a0SJung-uk Kim 1191*3f0275a0SJung-uk Kim /* Main table */ 1192*3f0275a0SJung-uk Kim 1193*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE); 1194*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1195*3f0275a0SJung-uk Kim { 1196*3f0275a0SJung-uk Kim return (Status); 1197*3f0275a0SJung-uk Kim } 1198*3f0275a0SJung-uk Kim 1199*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1200*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1201*3f0275a0SJung-uk Kim DtPushSubtable (Subtable); 1202*3f0275a0SJung-uk Kim 1203*3f0275a0SJung-uk Kim MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer); 1204*3f0275a0SJung-uk Kim SubtableCount = MpstChannelInfo->PowerNodeCount; 1205*3f0275a0SJung-uk Kim 1206*3f0275a0SJung-uk Kim while (*PFieldList && SubtableCount) 1207*3f0275a0SJung-uk Kim { 1208*3f0275a0SJung-uk Kim /* Subtable: Memory Power Node(s) */ 1209*3f0275a0SJung-uk Kim 1210*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0, 1211*3f0275a0SJung-uk Kim &Subtable, TRUE); 1212*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1213*3f0275a0SJung-uk Kim { 1214*3f0275a0SJung-uk Kim return (Status); 1215*3f0275a0SJung-uk Kim } 1216*3f0275a0SJung-uk Kim 1217*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1218*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1219*3f0275a0SJung-uk Kim DtPushSubtable (Subtable); 1220*3f0275a0SJung-uk Kim 1221*3f0275a0SJung-uk Kim MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer); 1222*3f0275a0SJung-uk Kim PowerStateCount = MpstPowerNode->NumPowerStates; 1223*3f0275a0SJung-uk Kim ComponentCount = MpstPowerNode->NumPhysicalComponents; 1224*3f0275a0SJung-uk Kim 1225*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1226*3f0275a0SJung-uk Kim 1227*3f0275a0SJung-uk Kim /* Sub-subtables - Memory Power State Structure(s) */ 1228*3f0275a0SJung-uk Kim 1229*3f0275a0SJung-uk Kim while (*PFieldList && PowerStateCount) 1230*3f0275a0SJung-uk Kim { 1231*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A, 1232*3f0275a0SJung-uk Kim &Subtable, TRUE); 1233*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1234*3f0275a0SJung-uk Kim { 1235*3f0275a0SJung-uk Kim return (Status); 1236*3f0275a0SJung-uk Kim } 1237*3f0275a0SJung-uk Kim 1238*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1239*3f0275a0SJung-uk Kim PowerStateCount--; 1240*3f0275a0SJung-uk Kim } 1241*3f0275a0SJung-uk Kim 1242*3f0275a0SJung-uk Kim /* Sub-subtables - Physical Component ID Structure(s) */ 1243*3f0275a0SJung-uk Kim 1244*3f0275a0SJung-uk Kim while (*PFieldList && ComponentCount) 1245*3f0275a0SJung-uk Kim { 1246*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B, 1247*3f0275a0SJung-uk Kim &Subtable, TRUE); 1248*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1249*3f0275a0SJung-uk Kim { 1250*3f0275a0SJung-uk Kim return (Status); 1251*3f0275a0SJung-uk Kim } 1252*3f0275a0SJung-uk Kim 1253*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1254*3f0275a0SJung-uk Kim ComponentCount--; 1255*3f0275a0SJung-uk Kim } 1256*3f0275a0SJung-uk Kim 1257*3f0275a0SJung-uk Kim SubtableCount--; 1258*3f0275a0SJung-uk Kim DtPopSubtable (); 1259*3f0275a0SJung-uk Kim } 1260*3f0275a0SJung-uk Kim 1261*3f0275a0SJung-uk Kim /* Subtable: Count of Memory Power State Characteristic structures */ 1262*3f0275a0SJung-uk Kim 1263*3f0275a0SJung-uk Kim DtPopSubtable (); 1264*3f0275a0SJung-uk Kim 1265*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE); 1266*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1267*3f0275a0SJung-uk Kim { 1268*3f0275a0SJung-uk Kim return (Status); 1269*3f0275a0SJung-uk Kim } 1270*3f0275a0SJung-uk Kim 1271*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1272*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1273*3f0275a0SJung-uk Kim DtPushSubtable (Subtable); 1274*3f0275a0SJung-uk Kim 1275*3f0275a0SJung-uk Kim MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer); 1276*3f0275a0SJung-uk Kim SubtableCount = MpstDataHeader->CharacteristicsCount; 1277*3f0275a0SJung-uk Kim 1278*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1279*3f0275a0SJung-uk Kim 1280*3f0275a0SJung-uk Kim /* Subtable: Memory Power State Characteristics structure(s) */ 1281*3f0275a0SJung-uk Kim 1282*3f0275a0SJung-uk Kim while (*PFieldList && SubtableCount) 1283*3f0275a0SJung-uk Kim { 1284*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2, 1285*3f0275a0SJung-uk Kim &Subtable, TRUE); 1286*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1287*3f0275a0SJung-uk Kim { 1288*3f0275a0SJung-uk Kim return (Status); 1289*3f0275a0SJung-uk Kim } 1290*3f0275a0SJung-uk Kim 1291*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1292*3f0275a0SJung-uk Kim SubtableCount--; 1293*3f0275a0SJung-uk Kim } 1294*3f0275a0SJung-uk Kim 1295*3f0275a0SJung-uk Kim DtPopSubtable (); 1296*3f0275a0SJung-uk Kim return (AE_OK); 1297*3f0275a0SJung-uk Kim } 1298*3f0275a0SJung-uk Kim 1299*3f0275a0SJung-uk Kim 1300*3f0275a0SJung-uk Kim /****************************************************************************** 1301*3f0275a0SJung-uk Kim * 1302a88e22b7SJung-uk Kim * FUNCTION: DtCompileMsct 1303a88e22b7SJung-uk Kim * 1304a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1305a88e22b7SJung-uk Kim * 1306a88e22b7SJung-uk Kim * RETURN: Status 1307a88e22b7SJung-uk Kim * 1308a88e22b7SJung-uk Kim * DESCRIPTION: Compile MSCT. 1309a88e22b7SJung-uk Kim * 1310a88e22b7SJung-uk Kim *****************************************************************************/ 1311a88e22b7SJung-uk Kim 1312a88e22b7SJung-uk Kim ACPI_STATUS 1313a88e22b7SJung-uk Kim DtCompileMsct ( 1314a88e22b7SJung-uk Kim void **List) 1315a88e22b7SJung-uk Kim { 1316a88e22b7SJung-uk Kim ACPI_STATUS Status; 1317a88e22b7SJung-uk Kim 1318a88e22b7SJung-uk Kim 1319a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 1320a88e22b7SJung-uk Kim AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0); 1321a88e22b7SJung-uk Kim return (Status); 1322a88e22b7SJung-uk Kim } 1323a88e22b7SJung-uk Kim 1324a88e22b7SJung-uk Kim 1325a88e22b7SJung-uk Kim /****************************************************************************** 1326a88e22b7SJung-uk Kim * 1327*3f0275a0SJung-uk Kim * FUNCTION: DtCompilePmtt 1328*3f0275a0SJung-uk Kim * 1329*3f0275a0SJung-uk Kim * PARAMETERS: List - Current field list pointer 1330*3f0275a0SJung-uk Kim * 1331*3f0275a0SJung-uk Kim * RETURN: Status 1332*3f0275a0SJung-uk Kim * 1333*3f0275a0SJung-uk Kim * DESCRIPTION: Compile PMTT. 1334*3f0275a0SJung-uk Kim * 1335*3f0275a0SJung-uk Kim *****************************************************************************/ 1336*3f0275a0SJung-uk Kim 1337*3f0275a0SJung-uk Kim ACPI_STATUS 1338*3f0275a0SJung-uk Kim DtCompilePmtt ( 1339*3f0275a0SJung-uk Kim void **List) 1340*3f0275a0SJung-uk Kim { 1341*3f0275a0SJung-uk Kim ACPI_STATUS Status; 1342*3f0275a0SJung-uk Kim DT_SUBTABLE *Subtable; 1343*3f0275a0SJung-uk Kim DT_SUBTABLE *ParentTable; 1344*3f0275a0SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1345*3f0275a0SJung-uk Kim DT_FIELD *SubtableStart; 1346*3f0275a0SJung-uk Kim ACPI_PMTT_HEADER *PmttHeader; 1347*3f0275a0SJung-uk Kim ACPI_PMTT_CONTROLLER *PmttController; 1348*3f0275a0SJung-uk Kim UINT16 DomainCount; 1349*3f0275a0SJung-uk Kim UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET; 1350*3f0275a0SJung-uk Kim 1351*3f0275a0SJung-uk Kim 1352*3f0275a0SJung-uk Kim /* Main table */ 1353*3f0275a0SJung-uk Kim 1354*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE); 1355*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1356*3f0275a0SJung-uk Kim { 1357*3f0275a0SJung-uk Kim return (Status); 1358*3f0275a0SJung-uk Kim } 1359*3f0275a0SJung-uk Kim 1360*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1361*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1362*3f0275a0SJung-uk Kim DtPushSubtable (Subtable); 1363*3f0275a0SJung-uk Kim 1364*3f0275a0SJung-uk Kim while (*PFieldList) 1365*3f0275a0SJung-uk Kim { 1366*3f0275a0SJung-uk Kim SubtableStart = *PFieldList; 1367*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr, 1368*3f0275a0SJung-uk Kim &Subtable, TRUE); 1369*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1370*3f0275a0SJung-uk Kim { 1371*3f0275a0SJung-uk Kim return (Status); 1372*3f0275a0SJung-uk Kim } 1373*3f0275a0SJung-uk Kim 1374*3f0275a0SJung-uk Kim PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer); 1375*3f0275a0SJung-uk Kim while (PrevType >= PmttHeader->Type) 1376*3f0275a0SJung-uk Kim { 1377*3f0275a0SJung-uk Kim DtPopSubtable (); 1378*3f0275a0SJung-uk Kim 1379*3f0275a0SJung-uk Kim if (PrevType == ACPI_PMTT_TYPE_SOCKET) 1380*3f0275a0SJung-uk Kim { 1381*3f0275a0SJung-uk Kim break; 1382*3f0275a0SJung-uk Kim } 1383*3f0275a0SJung-uk Kim PrevType--; 1384*3f0275a0SJung-uk Kim } 1385*3f0275a0SJung-uk Kim PrevType = PmttHeader->Type; 1386*3f0275a0SJung-uk Kim 1387*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1388*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1389*3f0275a0SJung-uk Kim DtPushSubtable (Subtable); 1390*3f0275a0SJung-uk Kim 1391*3f0275a0SJung-uk Kim switch (PmttHeader->Type) 1392*3f0275a0SJung-uk Kim { 1393*3f0275a0SJung-uk Kim case ACPI_PMTT_TYPE_SOCKET: 1394*3f0275a0SJung-uk Kim 1395*3f0275a0SJung-uk Kim /* Subtable: Socket Structure */ 1396*3f0275a0SJung-uk Kim 1397*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0, 1398*3f0275a0SJung-uk Kim &Subtable, TRUE); 1399*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1400*3f0275a0SJung-uk Kim { 1401*3f0275a0SJung-uk Kim return (Status); 1402*3f0275a0SJung-uk Kim } 1403*3f0275a0SJung-uk Kim 1404*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1405*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1406*3f0275a0SJung-uk Kim break; 1407*3f0275a0SJung-uk Kim 1408*3f0275a0SJung-uk Kim case ACPI_PMTT_TYPE_CONTROLLER: 1409*3f0275a0SJung-uk Kim 1410*3f0275a0SJung-uk Kim /* Subtable: Memory Controller Structure */ 1411*3f0275a0SJung-uk Kim 1412*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1, 1413*3f0275a0SJung-uk Kim &Subtable, TRUE); 1414*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1415*3f0275a0SJung-uk Kim { 1416*3f0275a0SJung-uk Kim return (Status); 1417*3f0275a0SJung-uk Kim } 1418*3f0275a0SJung-uk Kim 1419*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1420*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1421*3f0275a0SJung-uk Kim 1422*3f0275a0SJung-uk Kim PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER, 1423*3f0275a0SJung-uk Kim (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER))); 1424*3f0275a0SJung-uk Kim DomainCount = PmttController->DomainCount; 1425*3f0275a0SJung-uk Kim 1426*3f0275a0SJung-uk Kim while (DomainCount) 1427*3f0275a0SJung-uk Kim { 1428*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a, 1429*3f0275a0SJung-uk Kim &Subtable, TRUE); 1430*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1431*3f0275a0SJung-uk Kim { 1432*3f0275a0SJung-uk Kim return (Status); 1433*3f0275a0SJung-uk Kim } 1434*3f0275a0SJung-uk Kim 1435*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1436*3f0275a0SJung-uk Kim DomainCount--; 1437*3f0275a0SJung-uk Kim } 1438*3f0275a0SJung-uk Kim break; 1439*3f0275a0SJung-uk Kim 1440*3f0275a0SJung-uk Kim case ACPI_PMTT_TYPE_DIMM: 1441*3f0275a0SJung-uk Kim 1442*3f0275a0SJung-uk Kim /* Subtable: Physical Component Structure */ 1443*3f0275a0SJung-uk Kim 1444*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2, 1445*3f0275a0SJung-uk Kim &Subtable, TRUE); 1446*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1447*3f0275a0SJung-uk Kim { 1448*3f0275a0SJung-uk Kim return (Status); 1449*3f0275a0SJung-uk Kim } 1450*3f0275a0SJung-uk Kim 1451*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1452*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1453*3f0275a0SJung-uk Kim break; 1454*3f0275a0SJung-uk Kim 1455*3f0275a0SJung-uk Kim default: 1456*3f0275a0SJung-uk Kim 1457*3f0275a0SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT"); 1458*3f0275a0SJung-uk Kim return (AE_ERROR); 1459*3f0275a0SJung-uk Kim } 1460*3f0275a0SJung-uk Kim } 1461*3f0275a0SJung-uk Kim 1462*3f0275a0SJung-uk Kim return (Status); 1463*3f0275a0SJung-uk Kim } 1464*3f0275a0SJung-uk Kim 1465*3f0275a0SJung-uk Kim 1466*3f0275a0SJung-uk Kim /****************************************************************************** 1467*3f0275a0SJung-uk Kim * 1468a88e22b7SJung-uk Kim * FUNCTION: DtCompileRsdt 1469a88e22b7SJung-uk Kim * 1470a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1471a88e22b7SJung-uk Kim * 1472a88e22b7SJung-uk Kim * RETURN: Status 1473a88e22b7SJung-uk Kim * 1474a88e22b7SJung-uk Kim * DESCRIPTION: Compile RSDT. 1475a88e22b7SJung-uk Kim * 1476a88e22b7SJung-uk Kim *****************************************************************************/ 1477a88e22b7SJung-uk Kim 1478a88e22b7SJung-uk Kim ACPI_STATUS 1479a88e22b7SJung-uk Kim DtCompileRsdt ( 1480a88e22b7SJung-uk Kim void **List) 1481a88e22b7SJung-uk Kim { 1482a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1483a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1484a88e22b7SJung-uk Kim DT_FIELD *FieldList = *(DT_FIELD **) List; 1485a88e22b7SJung-uk Kim UINT32 Address; 1486a88e22b7SJung-uk Kim 1487a88e22b7SJung-uk Kim 1488a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1489a88e22b7SJung-uk Kim 1490a88e22b7SJung-uk Kim while (FieldList) 1491a88e22b7SJung-uk Kim { 1492a88e22b7SJung-uk Kim DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO); 1493a88e22b7SJung-uk Kim 1494a88e22b7SJung-uk Kim DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable); 1495a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1496a88e22b7SJung-uk Kim FieldList = FieldList->Next; 1497a88e22b7SJung-uk Kim } 1498a88e22b7SJung-uk Kim 1499a88e22b7SJung-uk Kim return (AE_OK); 1500a88e22b7SJung-uk Kim } 1501a88e22b7SJung-uk Kim 1502a88e22b7SJung-uk Kim 1503a88e22b7SJung-uk Kim /****************************************************************************** 1504a88e22b7SJung-uk Kim * 1505*3f0275a0SJung-uk Kim * FUNCTION: DtCompileS3pt 1506*3f0275a0SJung-uk Kim * 1507*3f0275a0SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 1508*3f0275a0SJung-uk Kim * 1509*3f0275a0SJung-uk Kim * RETURN: Status 1510*3f0275a0SJung-uk Kim * 1511*3f0275a0SJung-uk Kim * DESCRIPTION: Compile S3PT (Pointed to by FPDT) 1512*3f0275a0SJung-uk Kim * 1513*3f0275a0SJung-uk Kim *****************************************************************************/ 1514*3f0275a0SJung-uk Kim 1515*3f0275a0SJung-uk Kim ACPI_STATUS 1516*3f0275a0SJung-uk Kim DtCompileS3pt ( 1517*3f0275a0SJung-uk Kim DT_FIELD **PFieldList) 1518*3f0275a0SJung-uk Kim { 1519*3f0275a0SJung-uk Kim ACPI_STATUS Status; 1520*3f0275a0SJung-uk Kim ACPI_S3PT_HEADER *S3ptHeader; 1521*3f0275a0SJung-uk Kim DT_SUBTABLE *Subtable; 1522*3f0275a0SJung-uk Kim DT_SUBTABLE *ParentTable; 1523*3f0275a0SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1524*3f0275a0SJung-uk Kim DT_FIELD *SubtableStart; 1525*3f0275a0SJung-uk Kim 1526*3f0275a0SJung-uk Kim 1527*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt, 1528*3f0275a0SJung-uk Kim &Gbl_RootTable, TRUE); 1529*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1530*3f0275a0SJung-uk Kim { 1531*3f0275a0SJung-uk Kim return (Status); 1532*3f0275a0SJung-uk Kim } 1533*3f0275a0SJung-uk Kim 1534*3f0275a0SJung-uk Kim DtPushSubtable (Gbl_RootTable); 1535*3f0275a0SJung-uk Kim 1536*3f0275a0SJung-uk Kim while (*PFieldList) 1537*3f0275a0SJung-uk Kim { 1538*3f0275a0SJung-uk Kim SubtableStart = *PFieldList; 1539*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr, 1540*3f0275a0SJung-uk Kim &Subtable, TRUE); 1541*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1542*3f0275a0SJung-uk Kim { 1543*3f0275a0SJung-uk Kim return (Status); 1544*3f0275a0SJung-uk Kim } 1545*3f0275a0SJung-uk Kim 1546*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1547*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1548*3f0275a0SJung-uk Kim DtPushSubtable (Subtable); 1549*3f0275a0SJung-uk Kim 1550*3f0275a0SJung-uk Kim S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer); 1551*3f0275a0SJung-uk Kim 1552*3f0275a0SJung-uk Kim switch (S3ptHeader->Type) 1553*3f0275a0SJung-uk Kim { 1554*3f0275a0SJung-uk Kim case ACPI_S3PT_TYPE_RESUME: 1555*3f0275a0SJung-uk Kim InfoTable = AcpiDmTableInfoS3pt0; 1556*3f0275a0SJung-uk Kim break; 1557*3f0275a0SJung-uk Kim 1558*3f0275a0SJung-uk Kim case ACPI_S3PT_TYPE_SUSPEND: 1559*3f0275a0SJung-uk Kim InfoTable = AcpiDmTableInfoS3pt1; 1560*3f0275a0SJung-uk Kim break; 1561*3f0275a0SJung-uk Kim 1562*3f0275a0SJung-uk Kim default: 1563*3f0275a0SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT"); 1564*3f0275a0SJung-uk Kim return (AE_ERROR); 1565*3f0275a0SJung-uk Kim } 1566*3f0275a0SJung-uk Kim 1567*3f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1568*3f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1569*3f0275a0SJung-uk Kim { 1570*3f0275a0SJung-uk Kim return (Status); 1571*3f0275a0SJung-uk Kim } 1572*3f0275a0SJung-uk Kim 1573*3f0275a0SJung-uk Kim ParentTable = DtPeekSubtable (); 1574*3f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1575*3f0275a0SJung-uk Kim DtPopSubtable (); 1576*3f0275a0SJung-uk Kim } 1577*3f0275a0SJung-uk Kim 1578*3f0275a0SJung-uk Kim return (AE_OK); 1579*3f0275a0SJung-uk Kim } 1580*3f0275a0SJung-uk Kim 1581*3f0275a0SJung-uk Kim 1582*3f0275a0SJung-uk Kim /****************************************************************************** 1583*3f0275a0SJung-uk Kim * 1584dcbce41eSJung-uk Kim * FUNCTION: DtCompileSlic 1585dcbce41eSJung-uk Kim * 1586dcbce41eSJung-uk Kim * PARAMETERS: List - Current field list pointer 1587dcbce41eSJung-uk Kim * 1588dcbce41eSJung-uk Kim * RETURN: Status 1589dcbce41eSJung-uk Kim * 1590dcbce41eSJung-uk Kim * DESCRIPTION: Compile SLIC. 1591dcbce41eSJung-uk Kim * 1592dcbce41eSJung-uk Kim *****************************************************************************/ 1593dcbce41eSJung-uk Kim 1594dcbce41eSJung-uk Kim ACPI_STATUS 1595dcbce41eSJung-uk Kim DtCompileSlic ( 1596dcbce41eSJung-uk Kim void **List) 1597dcbce41eSJung-uk Kim { 1598dcbce41eSJung-uk Kim ACPI_STATUS Status; 1599dcbce41eSJung-uk Kim DT_SUBTABLE *Subtable; 1600dcbce41eSJung-uk Kim DT_SUBTABLE *ParentTable; 1601dcbce41eSJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1602dcbce41eSJung-uk Kim DT_FIELD *SubtableStart; 1603dcbce41eSJung-uk Kim ACPI_SLIC_HEADER *SlicHeader; 1604dcbce41eSJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1605dcbce41eSJung-uk Kim 1606dcbce41eSJung-uk Kim 1607dcbce41eSJung-uk Kim while (*PFieldList) 1608dcbce41eSJung-uk Kim { 1609dcbce41eSJung-uk Kim SubtableStart = *PFieldList; 1610dcbce41eSJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr, 1611dcbce41eSJung-uk Kim &Subtable, TRUE); 1612dcbce41eSJung-uk Kim if (ACPI_FAILURE (Status)) 1613dcbce41eSJung-uk Kim { 1614dcbce41eSJung-uk Kim return (Status); 1615dcbce41eSJung-uk Kim } 1616dcbce41eSJung-uk Kim 1617dcbce41eSJung-uk Kim ParentTable = DtPeekSubtable (); 1618dcbce41eSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1619dcbce41eSJung-uk Kim DtPushSubtable (Subtable); 1620dcbce41eSJung-uk Kim 1621dcbce41eSJung-uk Kim SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer); 1622dcbce41eSJung-uk Kim 1623dcbce41eSJung-uk Kim switch (SlicHeader->Type) 1624dcbce41eSJung-uk Kim { 1625dcbce41eSJung-uk Kim case ACPI_SLIC_TYPE_PUBLIC_KEY: 1626dcbce41eSJung-uk Kim InfoTable = AcpiDmTableInfoSlic0; 1627dcbce41eSJung-uk Kim break; 1628dcbce41eSJung-uk Kim case ACPI_SLIC_TYPE_WINDOWS_MARKER: 1629dcbce41eSJung-uk Kim InfoTable = AcpiDmTableInfoSlic1; 1630dcbce41eSJung-uk Kim break; 1631dcbce41eSJung-uk Kim default: 1632dcbce41eSJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC"); 1633dcbce41eSJung-uk Kim return (AE_ERROR); 1634dcbce41eSJung-uk Kim } 1635dcbce41eSJung-uk Kim 1636dcbce41eSJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1637dcbce41eSJung-uk Kim if (ACPI_FAILURE (Status)) 1638dcbce41eSJung-uk Kim { 1639dcbce41eSJung-uk Kim return (Status); 1640dcbce41eSJung-uk Kim } 1641dcbce41eSJung-uk Kim 1642dcbce41eSJung-uk Kim ParentTable = DtPeekSubtable (); 1643dcbce41eSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1644dcbce41eSJung-uk Kim DtPopSubtable (); 1645dcbce41eSJung-uk Kim } 1646dcbce41eSJung-uk Kim 1647dcbce41eSJung-uk Kim return (AE_OK); 1648dcbce41eSJung-uk Kim } 1649dcbce41eSJung-uk Kim 1650dcbce41eSJung-uk Kim 1651dcbce41eSJung-uk Kim /****************************************************************************** 1652dcbce41eSJung-uk Kim * 1653a88e22b7SJung-uk Kim * FUNCTION: DtCompileSlit 1654a88e22b7SJung-uk Kim * 1655a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1656a88e22b7SJung-uk Kim * 1657a88e22b7SJung-uk Kim * RETURN: Status 1658a88e22b7SJung-uk Kim * 1659a88e22b7SJung-uk Kim * DESCRIPTION: Compile SLIT. 1660a88e22b7SJung-uk Kim * 1661a88e22b7SJung-uk Kim *****************************************************************************/ 1662a88e22b7SJung-uk Kim 1663a88e22b7SJung-uk Kim ACPI_STATUS 1664a88e22b7SJung-uk Kim DtCompileSlit ( 1665a88e22b7SJung-uk Kim void **List) 1666a88e22b7SJung-uk Kim { 1667a88e22b7SJung-uk Kim ACPI_STATUS Status; 1668a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1669a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1670a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1671a88e22b7SJung-uk Kim DT_FIELD *FieldList; 1672a88e22b7SJung-uk Kim UINT32 Localities; 1673a88e22b7SJung-uk Kim UINT8 *LocalityBuffer; 1674a88e22b7SJung-uk Kim 1675a88e22b7SJung-uk Kim 1676a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, 1677a88e22b7SJung-uk Kim &Subtable, TRUE); 1678a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1679a88e22b7SJung-uk Kim { 1680a88e22b7SJung-uk Kim return (Status); 1681a88e22b7SJung-uk Kim } 1682a88e22b7SJung-uk Kim 1683a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1684a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1685a88e22b7SJung-uk Kim 1686a88e22b7SJung-uk Kim Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); 1687a88e22b7SJung-uk Kim LocalityBuffer = UtLocalCalloc (Localities); 1688a88e22b7SJung-uk Kim 1689d052a1ccSJung-uk Kim /* Compile each locality buffer */ 1690d052a1ccSJung-uk Kim 1691a88e22b7SJung-uk Kim FieldList = *PFieldList; 1692a88e22b7SJung-uk Kim while (FieldList) 1693a88e22b7SJung-uk Kim { 1694d052a1ccSJung-uk Kim DtCompileBuffer (LocalityBuffer, 1695d052a1ccSJung-uk Kim FieldList->Value, FieldList, Localities); 1696a88e22b7SJung-uk Kim 1697a88e22b7SJung-uk Kim DtCreateSubtable (LocalityBuffer, Localities, &Subtable); 1698a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1699d052a1ccSJung-uk Kim FieldList = FieldList->Next; 1700a88e22b7SJung-uk Kim } 1701a88e22b7SJung-uk Kim 1702a88e22b7SJung-uk Kim ACPI_FREE (LocalityBuffer); 1703a88e22b7SJung-uk Kim return (AE_OK); 1704a88e22b7SJung-uk Kim } 1705a88e22b7SJung-uk Kim 1706a88e22b7SJung-uk Kim 1707a88e22b7SJung-uk Kim /****************************************************************************** 1708a88e22b7SJung-uk Kim * 1709a88e22b7SJung-uk Kim * FUNCTION: DtCompileSrat 1710a88e22b7SJung-uk Kim * 1711a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1712a88e22b7SJung-uk Kim * 1713a88e22b7SJung-uk Kim * RETURN: Status 1714a88e22b7SJung-uk Kim * 1715a88e22b7SJung-uk Kim * DESCRIPTION: Compile SRAT. 1716a88e22b7SJung-uk Kim * 1717a88e22b7SJung-uk Kim *****************************************************************************/ 1718a88e22b7SJung-uk Kim 1719a88e22b7SJung-uk Kim ACPI_STATUS 1720a88e22b7SJung-uk Kim DtCompileSrat ( 1721a88e22b7SJung-uk Kim void **List) 1722a88e22b7SJung-uk Kim { 1723a88e22b7SJung-uk Kim ACPI_STATUS Status; 1724a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1725a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1726a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1727a88e22b7SJung-uk Kim DT_FIELD *SubtableStart; 1728a88e22b7SJung-uk Kim ACPI_SUBTABLE_HEADER *SratHeader; 1729a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *InfoTable; 1730a88e22b7SJung-uk Kim 1731a88e22b7SJung-uk Kim 1732a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat, 1733a88e22b7SJung-uk Kim &Subtable, TRUE); 1734a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1735a88e22b7SJung-uk Kim { 1736a88e22b7SJung-uk Kim return (Status); 1737a88e22b7SJung-uk Kim } 1738a88e22b7SJung-uk Kim 1739a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1740a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1741a88e22b7SJung-uk Kim 1742a88e22b7SJung-uk Kim while (*PFieldList) 1743a88e22b7SJung-uk Kim { 1744a88e22b7SJung-uk Kim SubtableStart = *PFieldList; 1745a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr, 1746a88e22b7SJung-uk Kim &Subtable, TRUE); 1747a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1748a88e22b7SJung-uk Kim { 1749a88e22b7SJung-uk Kim return (Status); 1750a88e22b7SJung-uk Kim } 1751a88e22b7SJung-uk Kim 1752a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1753a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1754a88e22b7SJung-uk Kim DtPushSubtable (Subtable); 1755a88e22b7SJung-uk Kim 1756a88e22b7SJung-uk Kim SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1757a88e22b7SJung-uk Kim 1758a88e22b7SJung-uk Kim switch (SratHeader->Type) 1759a88e22b7SJung-uk Kim { 1760a88e22b7SJung-uk Kim case ACPI_SRAT_TYPE_CPU_AFFINITY: 1761a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoSrat0; 1762a88e22b7SJung-uk Kim break; 1763a88e22b7SJung-uk Kim case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 1764a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoSrat1; 1765a88e22b7SJung-uk Kim break; 1766a88e22b7SJung-uk Kim case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 1767a88e22b7SJung-uk Kim InfoTable = AcpiDmTableInfoSrat2; 1768a88e22b7SJung-uk Kim break; 1769a88e22b7SJung-uk Kim default: 1770a88e22b7SJung-uk Kim DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT"); 1771a88e22b7SJung-uk Kim return (AE_ERROR); 1772a88e22b7SJung-uk Kim } 1773a88e22b7SJung-uk Kim 1774a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); 1775a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 1776a88e22b7SJung-uk Kim { 1777a88e22b7SJung-uk Kim return (Status); 1778a88e22b7SJung-uk Kim } 1779a88e22b7SJung-uk Kim 1780a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1781a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1782a88e22b7SJung-uk Kim DtPopSubtable (); 1783a88e22b7SJung-uk Kim } 1784a88e22b7SJung-uk Kim 1785a88e22b7SJung-uk Kim return (AE_OK); 1786a88e22b7SJung-uk Kim } 1787a88e22b7SJung-uk Kim 1788a88e22b7SJung-uk Kim 1789a88e22b7SJung-uk Kim /****************************************************************************** 1790a88e22b7SJung-uk Kim * 17910b94ba42SJung-uk Kim * FUNCTION: DtGetGenericTableInfo 1792d244b227SJung-uk Kim * 1793d244b227SJung-uk Kim * PARAMETERS: Name - Generic type name 1794d244b227SJung-uk Kim * 1795d244b227SJung-uk Kim * RETURN: Info entry 1796d244b227SJung-uk Kim * 1797d244b227SJung-uk Kim * DESCRIPTION: Obtain table info for a generic name entry 1798d244b227SJung-uk Kim * 1799d244b227SJung-uk Kim *****************************************************************************/ 1800d244b227SJung-uk Kim 18010b94ba42SJung-uk Kim ACPI_DMTABLE_INFO * 18020b94ba42SJung-uk Kim DtGetGenericTableInfo ( 1803d244b227SJung-uk Kim char *Name) 1804d244b227SJung-uk Kim { 1805d244b227SJung-uk Kim ACPI_DMTABLE_INFO *Info; 1806d244b227SJung-uk Kim UINT32 i; 1807d244b227SJung-uk Kim 1808d244b227SJung-uk Kim 1809d244b227SJung-uk Kim if (!Name) 1810d244b227SJung-uk Kim { 1811d244b227SJung-uk Kim return (NULL); 1812d244b227SJung-uk Kim } 1813d244b227SJung-uk Kim 1814d244b227SJung-uk Kim /* Search info table for name match */ 1815d244b227SJung-uk Kim 1816d244b227SJung-uk Kim for (i = 0; ; i++) 1817d244b227SJung-uk Kim { 1818d244b227SJung-uk Kim Info = AcpiDmTableInfoGeneric[i]; 1819d244b227SJung-uk Kim if (Info->Opcode == ACPI_DMT_EXIT) 1820d244b227SJung-uk Kim { 1821d244b227SJung-uk Kim Info = NULL; 1822d244b227SJung-uk Kim break; 1823d244b227SJung-uk Kim } 1824d244b227SJung-uk Kim 1825d244b227SJung-uk Kim if (!ACPI_STRCMP (Name, Info->Name)) 1826d244b227SJung-uk Kim { 1827d244b227SJung-uk Kim break; 1828d244b227SJung-uk Kim } 1829d244b227SJung-uk Kim } 1830d244b227SJung-uk Kim 1831d244b227SJung-uk Kim return (Info); 1832d244b227SJung-uk Kim } 1833d244b227SJung-uk Kim 1834d244b227SJung-uk Kim 1835d244b227SJung-uk Kim /****************************************************************************** 1836d244b227SJung-uk Kim * 1837d244b227SJung-uk Kim * FUNCTION: DtCompileUefi 1838d244b227SJung-uk Kim * 1839d244b227SJung-uk Kim * PARAMETERS: List - Current field list pointer 1840d244b227SJung-uk Kim * 1841d244b227SJung-uk Kim * RETURN: Status 1842d244b227SJung-uk Kim * 1843d244b227SJung-uk Kim * DESCRIPTION: Compile UEFI. 1844d244b227SJung-uk Kim * 1845d244b227SJung-uk Kim *****************************************************************************/ 1846d244b227SJung-uk Kim 1847d244b227SJung-uk Kim ACPI_STATUS 1848d244b227SJung-uk Kim DtCompileUefi ( 1849d244b227SJung-uk Kim void **List) 1850d244b227SJung-uk Kim { 1851d244b227SJung-uk Kim ACPI_STATUS Status; 1852d244b227SJung-uk Kim DT_SUBTABLE *Subtable; 1853d244b227SJung-uk Kim DT_SUBTABLE *ParentTable; 1854d244b227SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1855d244b227SJung-uk Kim UINT16 *DataOffset; 1856d244b227SJung-uk Kim 1857d244b227SJung-uk Kim 18580b94ba42SJung-uk Kim /* Compile the predefined portion of the UEFI table */ 18590b94ba42SJung-uk Kim 1860d244b227SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi, 1861d244b227SJung-uk Kim &Subtable, TRUE); 1862d244b227SJung-uk Kim if (ACPI_FAILURE (Status)) 1863d244b227SJung-uk Kim { 1864d244b227SJung-uk Kim return (Status); 1865d244b227SJung-uk Kim } 1866d244b227SJung-uk Kim 1867d244b227SJung-uk Kim DataOffset = (UINT16 *) (Subtable->Buffer + 16); 1868d244b227SJung-uk Kim *DataOffset = sizeof (ACPI_TABLE_UEFI); 1869d244b227SJung-uk Kim 1870d244b227SJung-uk Kim ParentTable = DtPeekSubtable (); 1871d244b227SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1872d244b227SJung-uk Kim 18730b94ba42SJung-uk Kim /* 18740b94ba42SJung-uk Kim * Compile the "generic" portion of the UEFI table. This 18750b94ba42SJung-uk Kim * part of the table is not predefined and any of the generic 18760b94ba42SJung-uk Kim * operators may be used. 18770b94ba42SJung-uk Kim */ 18780b94ba42SJung-uk Kim 1879d052a1ccSJung-uk Kim DtCompileGeneric ((void **) PFieldList); 1880d244b227SJung-uk Kim 1881d244b227SJung-uk Kim return (AE_OK); 1882d244b227SJung-uk Kim } 1883d244b227SJung-uk Kim 1884d244b227SJung-uk Kim 1885d244b227SJung-uk Kim /****************************************************************************** 1886d244b227SJung-uk Kim * 1887a88e22b7SJung-uk Kim * FUNCTION: DtCompileWdat 1888a88e22b7SJung-uk Kim * 1889a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1890a88e22b7SJung-uk Kim * 1891a88e22b7SJung-uk Kim * RETURN: Status 1892a88e22b7SJung-uk Kim * 1893a88e22b7SJung-uk Kim * DESCRIPTION: Compile WDAT. 1894a88e22b7SJung-uk Kim * 1895a88e22b7SJung-uk Kim *****************************************************************************/ 1896a88e22b7SJung-uk Kim 1897a88e22b7SJung-uk Kim ACPI_STATUS 1898a88e22b7SJung-uk Kim DtCompileWdat ( 1899a88e22b7SJung-uk Kim void **List) 1900a88e22b7SJung-uk Kim { 1901a88e22b7SJung-uk Kim ACPI_STATUS Status; 1902a88e22b7SJung-uk Kim 1903a88e22b7SJung-uk Kim 1904a88e22b7SJung-uk Kim Status = DtCompileTwoSubtables (List, 1905a88e22b7SJung-uk Kim AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0); 1906a88e22b7SJung-uk Kim return (Status); 1907a88e22b7SJung-uk Kim } 1908a88e22b7SJung-uk Kim 1909a88e22b7SJung-uk Kim 1910a88e22b7SJung-uk Kim /****************************************************************************** 1911a88e22b7SJung-uk Kim * 1912a88e22b7SJung-uk Kim * FUNCTION: DtCompileXsdt 1913a88e22b7SJung-uk Kim * 1914a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 1915a88e22b7SJung-uk Kim * 1916a88e22b7SJung-uk Kim * RETURN: Status 1917a88e22b7SJung-uk Kim * 1918a88e22b7SJung-uk Kim * DESCRIPTION: Compile XSDT. 1919a88e22b7SJung-uk Kim * 1920a88e22b7SJung-uk Kim *****************************************************************************/ 1921a88e22b7SJung-uk Kim 1922a88e22b7SJung-uk Kim ACPI_STATUS 1923a88e22b7SJung-uk Kim DtCompileXsdt ( 1924a88e22b7SJung-uk Kim void **List) 1925a88e22b7SJung-uk Kim { 1926a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 1927a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 1928a88e22b7SJung-uk Kim DT_FIELD *FieldList = *(DT_FIELD **) List; 1929a88e22b7SJung-uk Kim UINT64 Address; 1930a88e22b7SJung-uk Kim 1931a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 1932a88e22b7SJung-uk Kim 1933a88e22b7SJung-uk Kim while (FieldList) 1934a88e22b7SJung-uk Kim { 1935a88e22b7SJung-uk Kim DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO); 1936a88e22b7SJung-uk Kim 1937a88e22b7SJung-uk Kim DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable); 1938a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1939a88e22b7SJung-uk Kim FieldList = FieldList->Next; 1940a88e22b7SJung-uk Kim } 1941a88e22b7SJung-uk Kim 1942a88e22b7SJung-uk Kim return (AE_OK); 1943a88e22b7SJung-uk Kim } 1944d052a1ccSJung-uk Kim 1945d052a1ccSJung-uk Kim 1946d052a1ccSJung-uk Kim /****************************************************************************** 1947d052a1ccSJung-uk Kim * 1948d052a1ccSJung-uk Kim * FUNCTION: DtCompileGeneric 1949d052a1ccSJung-uk Kim * 1950d052a1ccSJung-uk Kim * PARAMETERS: List - Current field list pointer 1951d052a1ccSJung-uk Kim * 1952d052a1ccSJung-uk Kim * RETURN: Status 1953d052a1ccSJung-uk Kim * 1954d052a1ccSJung-uk Kim * DESCRIPTION: Compile generic unknown table. 1955d052a1ccSJung-uk Kim * 1956d052a1ccSJung-uk Kim *****************************************************************************/ 1957d052a1ccSJung-uk Kim 1958d052a1ccSJung-uk Kim ACPI_STATUS 1959d052a1ccSJung-uk Kim DtCompileGeneric ( 1960d052a1ccSJung-uk Kim void **List) 1961d052a1ccSJung-uk Kim { 1962d052a1ccSJung-uk Kim ACPI_STATUS Status; 1963d052a1ccSJung-uk Kim DT_SUBTABLE *Subtable; 1964d052a1ccSJung-uk Kim DT_SUBTABLE *ParentTable; 1965d052a1ccSJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 1966d052a1ccSJung-uk Kim ACPI_DMTABLE_INFO *Info; 1967d052a1ccSJung-uk Kim 1968d052a1ccSJung-uk Kim 1969d052a1ccSJung-uk Kim ParentTable = DtPeekSubtable (); 1970d052a1ccSJung-uk Kim 1971d052a1ccSJung-uk Kim /* 1972d052a1ccSJung-uk Kim * Compile the "generic" portion of the table. This 1973d052a1ccSJung-uk Kim * part of the table is not predefined and any of the generic 1974d052a1ccSJung-uk Kim * operators may be used. 1975d052a1ccSJung-uk Kim */ 1976d052a1ccSJung-uk Kim 1977d052a1ccSJung-uk Kim /* Find any and all labels in the entire generic portion */ 1978d052a1ccSJung-uk Kim 1979d052a1ccSJung-uk Kim DtDetectAllLabels (*PFieldList); 1980d052a1ccSJung-uk Kim 1981d052a1ccSJung-uk Kim /* Now we can actually compile the parse tree */ 1982d052a1ccSJung-uk Kim 1983d052a1ccSJung-uk Kim while (*PFieldList) 1984d052a1ccSJung-uk Kim { 1985d052a1ccSJung-uk Kim Info = DtGetGenericTableInfo ((*PFieldList)->Name); 1986d052a1ccSJung-uk Kim if (!Info) 1987d052a1ccSJung-uk Kim { 1988d052a1ccSJung-uk Kim sprintf (MsgBuffer, "Generic data type \"%s\" not found", 1989d052a1ccSJung-uk Kim (*PFieldList)->Name); 1990d052a1ccSJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 1991d052a1ccSJung-uk Kim (*PFieldList), MsgBuffer); 1992d052a1ccSJung-uk Kim 1993d052a1ccSJung-uk Kim *PFieldList = (*PFieldList)->Next; 1994d052a1ccSJung-uk Kim continue; 1995d052a1ccSJung-uk Kim } 1996d052a1ccSJung-uk Kim 1997d052a1ccSJung-uk Kim Status = DtCompileTable (PFieldList, Info, 1998d052a1ccSJung-uk Kim &Subtable, TRUE); 1999d052a1ccSJung-uk Kim if (ACPI_SUCCESS (Status)) 2000d052a1ccSJung-uk Kim { 2001d052a1ccSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 2002d052a1ccSJung-uk Kim } 2003d052a1ccSJung-uk Kim else 2004d052a1ccSJung-uk Kim { 2005d052a1ccSJung-uk Kim *PFieldList = (*PFieldList)->Next; 2006d052a1ccSJung-uk Kim 2007d052a1ccSJung-uk Kim if (Status == AE_NOT_FOUND) 2008d052a1ccSJung-uk Kim { 2009d052a1ccSJung-uk Kim sprintf (MsgBuffer, "Generic data type \"%s\" not found", 2010d052a1ccSJung-uk Kim (*PFieldList)->Name); 2011d052a1ccSJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 2012d052a1ccSJung-uk Kim (*PFieldList), MsgBuffer); 2013d052a1ccSJung-uk Kim } 2014d052a1ccSJung-uk Kim } 2015d052a1ccSJung-uk Kim } 2016d052a1ccSJung-uk Kim 2017d052a1ccSJung-uk Kim return (AE_OK); 2018d052a1ccSJung-uk Kim } 2019