1 1.1 christos /****************************************************************************** 2 1.1 christos * 3 1.1 christos * Module Name: dttable2.c - handling for specific ACPI tables 4 1.1 christos * 5 1.1 christos *****************************************************************************/ 6 1.1 christos 7 1.1.1.19 christos /****************************************************************************** 8 1.1.1.19 christos * 9 1.1.1.19 christos * 1. Copyright Notice 10 1.1.1.19 christos * 11 1.1.1.20 christos * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 12 1.1 christos * All rights reserved. 13 1.1 christos * 14 1.1.1.19 christos * 2. License 15 1.1.1.19 christos * 16 1.1.1.19 christos * 2.1. This is your license from Intel Corp. under its intellectual property 17 1.1.1.19 christos * rights. You may have additional license terms from the party that provided 18 1.1.1.19 christos * you this software, covering your right to use that party's intellectual 19 1.1.1.19 christos * property rights. 20 1.1.1.19 christos * 21 1.1.1.19 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 1.1.1.19 christos * copy of the source code appearing in this file ("Covered Code") an 23 1.1.1.19 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 1.1.1.19 christos * base code distributed originally by Intel ("Original Intel Code") to copy, 25 1.1.1.19 christos * make derivatives, distribute, use and display any portion of the Covered 26 1.1.1.19 christos * Code in any form, with the right to sublicense such rights; and 27 1.1.1.19 christos * 28 1.1.1.19 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 1.1.1.19 christos * license (with the right to sublicense), under only those claims of Intel 30 1.1.1.19 christos * patents that are infringed by the Original Intel Code, to make, use, sell, 31 1.1.1.19 christos * offer to sell, and import the Covered Code and derivative works thereof 32 1.1.1.19 christos * solely to the minimum extent necessary to exercise the above copyright 33 1.1.1.19 christos * license, and in no event shall the patent license extend to any additions 34 1.1.1.19 christos * to or modifications of the Original Intel Code. No other license or right 35 1.1.1.19 christos * is granted directly or by implication, estoppel or otherwise; 36 1.1.1.19 christos * 37 1.1.1.19 christos * The above copyright and patent license is granted only if the following 38 1.1.1.19 christos * conditions are met: 39 1.1.1.19 christos * 40 1.1.1.19 christos * 3. Conditions 41 1.1.1.19 christos * 42 1.1.1.19 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 1.1.1.19 christos * Redistribution of source code of any substantial portion of the Covered 44 1.1.1.19 christos * Code or modification with rights to further distribute source must include 45 1.1.1.19 christos * the above Copyright Notice, the above License, this list of Conditions, 46 1.1.1.19 christos * and the following Disclaimer and Export Compliance provision. In addition, 47 1.1.1.19 christos * Licensee must cause all Covered Code to which Licensee contributes to 48 1.1.1.19 christos * contain a file documenting the changes Licensee made to create that Covered 49 1.1.1.19 christos * Code and the date of any change. Licensee must include in that file the 50 1.1.1.19 christos * documentation of any changes made by any predecessor Licensee. Licensee 51 1.1.1.19 christos * must include a prominent statement that the modification is derived, 52 1.1.1.19 christos * directly or indirectly, from Original Intel Code. 53 1.1.1.19 christos * 54 1.1.1.19 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 1.1.1.19 christos * Redistribution of source code of any substantial portion of the Covered 56 1.1.1.19 christos * Code or modification without rights to further distribute source must 57 1.1.1.19 christos * include the following Disclaimer and Export Compliance provision in the 58 1.1.1.19 christos * documentation and/or other materials provided with distribution. In 59 1.1.1.19 christos * addition, Licensee may not authorize further sublicense of source of any 60 1.1.1.19 christos * portion of the Covered Code, and must include terms to the effect that the 61 1.1.1.19 christos * license from Licensee to its licensee is limited to the intellectual 62 1.1.1.19 christos * property embodied in the software Licensee provides to its licensee, and 63 1.1.1.19 christos * not to intellectual property embodied in modifications its licensee may 64 1.1.1.19 christos * make. 65 1.1.1.19 christos * 66 1.1.1.19 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 1.1.1.19 christos * substantial portion of the Covered Code or modification must reproduce the 68 1.1.1.19 christos * above Copyright Notice, and the following Disclaimer and Export Compliance 69 1.1.1.19 christos * provision in the documentation and/or other materials provided with the 70 1.1.1.19 christos * distribution. 71 1.1.1.19 christos * 72 1.1.1.19 christos * 3.4. Intel retains all right, title, and interest in and to the Original 73 1.1.1.19 christos * Intel Code. 74 1.1.1.19 christos * 75 1.1.1.19 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 1.1.1.19 christos * Intel shall be used in advertising or otherwise to promote the sale, use or 77 1.1.1.19 christos * other dealings in products derived from or relating to the Covered Code 78 1.1.1.19 christos * without prior written authorization from Intel. 79 1.1.1.19 christos * 80 1.1.1.19 christos * 4. Disclaimer and Export Compliance 81 1.1.1.19 christos * 82 1.1.1.19 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 1.1.1.19 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 1.1.1.19 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 1.1.1.19 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 1.1.1.19 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 1.1.1.19 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 1.1.1.19 christos * PARTICULAR PURPOSE. 89 1.1.1.19 christos * 90 1.1.1.19 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 1.1.1.19 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 1.1.1.19 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 1.1.1.19 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 1.1.1.19 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 1.1.1.19 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 1.1.1.19 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 1.1.1.19 christos * LIMITED REMEDY. 98 1.1.1.19 christos * 99 1.1.1.19 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 1.1.1.19 christos * software or system incorporating such software without first obtaining any 101 1.1.1.19 christos * required license or other approval from the U. S. Department of Commerce or 102 1.1.1.19 christos * any other agency or department of the United States Government. In the 103 1.1.1.19 christos * event Licensee exports any such software from the United States or 104 1.1.1.19 christos * re-exports any such software from a foreign destination, Licensee shall 105 1.1.1.19 christos * ensure that the distribution and export/re-export of the software is in 106 1.1.1.19 christos * compliance with all laws, regulations, orders, or other restrictions of the 107 1.1.1.19 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 1.1.1.19 christos * any of its subsidiaries will export/re-export any technical data, process, 109 1.1.1.19 christos * software, or service, directly or indirectly, to any country for which the 110 1.1.1.19 christos * United States government or any agency thereof requires an export license, 111 1.1.1.19 christos * other governmental approval, or letter of assurance, without first obtaining 112 1.1.1.19 christos * such license, approval or letter. 113 1.1.1.19 christos * 114 1.1.1.19 christos ***************************************************************************** 115 1.1.1.19 christos * 116 1.1.1.19 christos * Alternatively, you may choose to be licensed under the terms of the 117 1.1.1.19 christos * following license: 118 1.1.1.19 christos * 119 1.1 christos * Redistribution and use in source and binary forms, with or without 120 1.1 christos * modification, are permitted provided that the following conditions 121 1.1 christos * are met: 122 1.1 christos * 1. Redistributions of source code must retain the above copyright 123 1.1 christos * notice, this list of conditions, and the following disclaimer, 124 1.1 christos * without modification. 125 1.1 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 1.1 christos * substantially similar to the "NO WARRANTY" disclaimer below 127 1.1 christos * ("Disclaimer") and any redistribution must be conditioned upon 128 1.1 christos * including a substantially similar Disclaimer requirement for further 129 1.1 christos * binary redistribution. 130 1.1 christos * 3. Neither the names of the above-listed copyright holders nor the names 131 1.1 christos * of any contributors may be used to endorse or promote products derived 132 1.1 christos * from this software without specific prior written permission. 133 1.1 christos * 134 1.1 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 1.1 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 1.1.1.11 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 1.1 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 1.1.1.19 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 1.1.1.19 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 1.1.1.19 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 1.1.1.19 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 1.1.1.19 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 1.1.1.19 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 1.1.1.19 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 1.1.1.19 christos * 146 1.1.1.19 christos * Alternatively, you may choose to be licensed under the terms of the 147 1.1.1.19 christos * GNU General Public License ("GPL") version 2 as published by the Free 148 1.1.1.19 christos * Software Foundation. 149 1.1.1.19 christos * 150 1.1.1.19 christos *****************************************************************************/ 151 1.1 christos 152 1.1 christos /* Compile all complex data tables, signatures starting with L-Z */ 153 1.1 christos 154 1.1 christos #include "aslcompiler.h" 155 1.1 christos 156 1.1 christos #define _COMPONENT DT_COMPILER 157 1.1 christos ACPI_MODULE_NAME ("dttable2") 158 1.1 christos 159 1.1 christos 160 1.1 christos /****************************************************************************** 161 1.1 christos * 162 1.1 christos * FUNCTION: DtCompileLpit 163 1.1 christos * 164 1.1 christos * PARAMETERS: List - Current field list pointer 165 1.1 christos * 166 1.1 christos * RETURN: Status 167 1.1 christos * 168 1.1 christos * DESCRIPTION: Compile LPIT. 169 1.1 christos * 170 1.1 christos *****************************************************************************/ 171 1.1 christos 172 1.1 christos ACPI_STATUS 173 1.1 christos DtCompileLpit ( 174 1.1 christos void **List) 175 1.1 christos { 176 1.1 christos ACPI_STATUS Status; 177 1.1 christos DT_SUBTABLE *Subtable; 178 1.1 christos DT_SUBTABLE *ParentTable; 179 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 180 1.1 christos DT_FIELD *SubtableStart; 181 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 182 1.1 christos ACPI_LPIT_HEADER *LpitHeader; 183 1.1 christos 184 1.1 christos 185 1.1 christos /* Note: Main table consists only of the standard ACPI table header */ 186 1.1 christos 187 1.1 christos while (*PFieldList) 188 1.1 christos { 189 1.1 christos SubtableStart = *PFieldList; 190 1.1 christos 191 1.1 christos /* LPIT Subtable header */ 192 1.1 christos 193 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr, 194 1.1.1.6 christos &Subtable); 195 1.1 christos if (ACPI_FAILURE (Status)) 196 1.1 christos { 197 1.1 christos return (Status); 198 1.1 christos } 199 1.1 christos 200 1.1 christos ParentTable = DtPeekSubtable (); 201 1.1 christos DtInsertSubtable (ParentTable, Subtable); 202 1.1 christos DtPushSubtable (Subtable); 203 1.1 christos 204 1.1 christos LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer); 205 1.1 christos 206 1.1 christos switch (LpitHeader->Type) 207 1.1 christos { 208 1.1 christos case ACPI_LPIT_TYPE_NATIVE_CSTATE: 209 1.1 christos 210 1.1 christos InfoTable = AcpiDmTableInfoLpit0; 211 1.1 christos break; 212 1.1 christos 213 1.1 christos default: 214 1.1 christos 215 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT"); 216 1.1 christos return (AE_ERROR); 217 1.1 christos } 218 1.1 christos 219 1.1 christos /* LPIT Subtable */ 220 1.1 christos 221 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 222 1.1 christos if (ACPI_FAILURE (Status)) 223 1.1 christos { 224 1.1 christos return (Status); 225 1.1 christos } 226 1.1 christos 227 1.1 christos ParentTable = DtPeekSubtable (); 228 1.1 christos DtInsertSubtable (ParentTable, Subtable); 229 1.1 christos DtPopSubtable (); 230 1.1 christos } 231 1.1 christos 232 1.1 christos return (AE_OK); 233 1.1 christos } 234 1.1 christos 235 1.1 christos 236 1.1 christos /****************************************************************************** 237 1.1 christos * 238 1.1 christos * FUNCTION: DtCompileMadt 239 1.1 christos * 240 1.1 christos * PARAMETERS: List - Current field list pointer 241 1.1 christos * 242 1.1 christos * RETURN: Status 243 1.1 christos * 244 1.1 christos * DESCRIPTION: Compile MADT. 245 1.1 christos * 246 1.1 christos *****************************************************************************/ 247 1.1 christos 248 1.1 christos ACPI_STATUS 249 1.1 christos DtCompileMadt ( 250 1.1 christos void **List) 251 1.1 christos { 252 1.1 christos ACPI_STATUS Status; 253 1.1 christos DT_SUBTABLE *Subtable; 254 1.1 christos DT_SUBTABLE *ParentTable; 255 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 256 1.1 christos DT_FIELD *SubtableStart; 257 1.1.1.18 christos ACPI_TABLE_HEADER *Table; 258 1.1 christos ACPI_SUBTABLE_HEADER *MadtHeader; 259 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 260 1.1.1.18 christos UINT8 Revision; 261 1.1 christos 262 1.1 christos 263 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt, 264 1.1.1.6 christos &Subtable); 265 1.1 christos if (ACPI_FAILURE (Status)) 266 1.1 christos { 267 1.1 christos return (Status); 268 1.1 christos } 269 1.1 christos 270 1.1 christos ParentTable = DtPeekSubtable (); 271 1.1 christos DtInsertSubtable (ParentTable, Subtable); 272 1.1 christos 273 1.1.1.18 christos Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 274 1.1.1.18 christos Revision = Table->Revision; 275 1.1.1.18 christos 276 1.1 christos while (*PFieldList) 277 1.1 christos { 278 1.1 christos SubtableStart = *PFieldList; 279 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr, 280 1.1.1.6 christos &Subtable); 281 1.1 christos if (ACPI_FAILURE (Status)) 282 1.1 christos { 283 1.1 christos return (Status); 284 1.1 christos } 285 1.1 christos 286 1.1 christos ParentTable = DtPeekSubtable (); 287 1.1 christos DtInsertSubtable (ParentTable, Subtable); 288 1.1 christos DtPushSubtable (Subtable); 289 1.1 christos 290 1.1 christos MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 291 1.1 christos 292 1.1 christos switch (MadtHeader->Type) 293 1.1 christos { 294 1.1 christos case ACPI_MADT_TYPE_LOCAL_APIC: 295 1.1 christos 296 1.1 christos InfoTable = AcpiDmTableInfoMadt0; 297 1.1 christos break; 298 1.1 christos 299 1.1 christos case ACPI_MADT_TYPE_IO_APIC: 300 1.1 christos 301 1.1 christos InfoTable = AcpiDmTableInfoMadt1; 302 1.1 christos break; 303 1.1 christos 304 1.1 christos case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 305 1.1 christos 306 1.1 christos InfoTable = AcpiDmTableInfoMadt2; 307 1.1 christos break; 308 1.1 christos 309 1.1 christos case ACPI_MADT_TYPE_NMI_SOURCE: 310 1.1 christos 311 1.1 christos InfoTable = AcpiDmTableInfoMadt3; 312 1.1 christos break; 313 1.1 christos 314 1.1 christos case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 315 1.1 christos 316 1.1 christos InfoTable = AcpiDmTableInfoMadt4; 317 1.1 christos break; 318 1.1 christos 319 1.1 christos case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 320 1.1 christos 321 1.1 christos InfoTable = AcpiDmTableInfoMadt5; 322 1.1 christos break; 323 1.1 christos 324 1.1 christos case ACPI_MADT_TYPE_IO_SAPIC: 325 1.1 christos 326 1.1 christos InfoTable = AcpiDmTableInfoMadt6; 327 1.1 christos break; 328 1.1 christos 329 1.1 christos case ACPI_MADT_TYPE_LOCAL_SAPIC: 330 1.1 christos 331 1.1 christos InfoTable = AcpiDmTableInfoMadt7; 332 1.1 christos break; 333 1.1 christos 334 1.1 christos case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 335 1.1 christos 336 1.1 christos InfoTable = AcpiDmTableInfoMadt8; 337 1.1 christos break; 338 1.1 christos 339 1.1 christos case ACPI_MADT_TYPE_LOCAL_X2APIC: 340 1.1 christos 341 1.1 christos InfoTable = AcpiDmTableInfoMadt9; 342 1.1 christos break; 343 1.1 christos 344 1.1 christos case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 345 1.1 christos 346 1.1 christos InfoTable = AcpiDmTableInfoMadt10; 347 1.1 christos break; 348 1.1 christos 349 1.1 christos case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 350 1.1 christos 351 1.1.1.18 christos if (Revision > 6) 352 1.1.1.18 christos InfoTable = AcpiDmTableInfoMadt11b; 353 1.1.1.18 christos else if (Revision == 6) 354 1.1.1.18 christos InfoTable = AcpiDmTableInfoMadt11a; 355 1.1.1.18 christos else 356 1.1.1.18 christos InfoTable = AcpiDmTableInfoMadt11; 357 1.1 christos break; 358 1.1 christos 359 1.1 christos case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 360 1.1 christos 361 1.1 christos InfoTable = AcpiDmTableInfoMadt12; 362 1.1 christos break; 363 1.1 christos 364 1.1 christos case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 365 1.1 christos 366 1.1 christos InfoTable = AcpiDmTableInfoMadt13; 367 1.1 christos break; 368 1.1 christos 369 1.1 christos case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 370 1.1 christos 371 1.1.1.18 christos InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a 372 1.1.1.18 christos : AcpiDmTableInfoMadt14; 373 1.1 christos break; 374 1.1 christos 375 1.1 christos case ACPI_MADT_TYPE_GENERIC_TRANSLATOR: 376 1.1 christos 377 1.1.1.18 christos InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a 378 1.1.1.18 christos : AcpiDmTableInfoMadt15; 379 1.1.1.18 christos 380 1.1 christos break; 381 1.1 christos 382 1.1.1.11 christos case ACPI_MADT_TYPE_MULTIPROC_WAKEUP: 383 1.1.1.11 christos 384 1.1.1.11 christos InfoTable = AcpiDmTableInfoMadt16; 385 1.1.1.11 christos break; 386 1.1.1.11 christos 387 1.1.1.17 christos case ACPI_MADT_TYPE_CORE_PIC: 388 1.1.1.17 christos 389 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt17; 390 1.1.1.17 christos break; 391 1.1.1.17 christos 392 1.1.1.17 christos case ACPI_MADT_TYPE_LIO_PIC: 393 1.1.1.17 christos 394 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt18; 395 1.1.1.17 christos break; 396 1.1.1.17 christos 397 1.1.1.17 christos case ACPI_MADT_TYPE_HT_PIC: 398 1.1.1.17 christos 399 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt19; 400 1.1.1.17 christos break; 401 1.1.1.17 christos 402 1.1.1.17 christos case ACPI_MADT_TYPE_EIO_PIC: 403 1.1.1.17 christos 404 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt20; 405 1.1.1.17 christos break; 406 1.1.1.17 christos 407 1.1.1.17 christos case ACPI_MADT_TYPE_MSI_PIC: 408 1.1.1.17 christos 409 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt21; 410 1.1.1.17 christos break; 411 1.1.1.17 christos 412 1.1.1.17 christos case ACPI_MADT_TYPE_BIO_PIC: 413 1.1.1.17 christos 414 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt22; 415 1.1.1.17 christos break; 416 1.1.1.17 christos 417 1.1.1.17 christos case ACPI_MADT_TYPE_LPC_PIC: 418 1.1.1.17 christos 419 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt23; 420 1.1.1.17 christos break; 421 1.1.1.17 christos 422 1.1.1.17 christos case ACPI_MADT_TYPE_RINTC: 423 1.1.1.17 christos 424 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt24; 425 1.1.1.17 christos break; 426 1.1.1.17 christos 427 1.1.1.17 christos case ACPI_MADT_TYPE_IMSIC: 428 1.1.1.17 christos 429 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt25; 430 1.1.1.17 christos break; 431 1.1.1.17 christos 432 1.1.1.17 christos case ACPI_MADT_TYPE_APLIC: 433 1.1.1.17 christos 434 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt26; 435 1.1.1.17 christos break; 436 1.1.1.17 christos 437 1.1.1.17 christos case ACPI_MADT_TYPE_PLIC: 438 1.1.1.17 christos 439 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt27; 440 1.1.1.17 christos break; 441 1.1.1.17 christos 442 1.1 christos default: 443 1.1 christos 444 1.1.1.15 christos if (MadtHeader->Type >= ACPI_MADT_TYPE_OEM_RESERVED) 445 1.1.1.15 christos { 446 1.1.1.17 christos InfoTable = AcpiDmTableInfoMadt128; 447 1.1.1.15 christos } 448 1.1.1.15 christos else 449 1.1.1.15 christos { 450 1.1.1.15 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT"); 451 1.1.1.15 christos return (AE_ERROR); 452 1.1.1.15 christos } 453 1.1.1.15 christos 454 1.1.1.15 christos break; 455 1.1 christos } 456 1.1 christos 457 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 458 1.1 christos if (ACPI_FAILURE (Status)) 459 1.1 christos { 460 1.1 christos return (Status); 461 1.1 christos } 462 1.1 christos 463 1.1 christos ParentTable = DtPeekSubtable (); 464 1.1 christos DtInsertSubtable (ParentTable, Subtable); 465 1.1 christos DtPopSubtable (); 466 1.1 christos } 467 1.1 christos 468 1.1 christos return (AE_OK); 469 1.1 christos } 470 1.1 christos 471 1.1 christos 472 1.1 christos /****************************************************************************** 473 1.1 christos * 474 1.1 christos * FUNCTION: DtCompileMcfg 475 1.1 christos * 476 1.1 christos * PARAMETERS: List - Current field list pointer 477 1.1 christos * 478 1.1 christos * RETURN: Status 479 1.1 christos * 480 1.1 christos * DESCRIPTION: Compile MCFG. 481 1.1 christos * 482 1.1 christos *****************************************************************************/ 483 1.1 christos 484 1.1 christos ACPI_STATUS 485 1.1 christos DtCompileMcfg ( 486 1.1 christos void **List) 487 1.1 christos { 488 1.1 christos ACPI_STATUS Status; 489 1.1 christos 490 1.1 christos 491 1.1 christos Status = DtCompileTwoSubtables (List, 492 1.1 christos AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0); 493 1.1 christos return (Status); 494 1.1 christos } 495 1.1 christos 496 1.1.1.17 christos /****************************************************************************** 497 1.1.1.17 christos * 498 1.1.1.17 christos * FUNCTION: DtCompileMpam 499 1.1.1.17 christos * 500 1.1.1.17 christos * PARAMETERS: List - Current field list pointer 501 1.1.1.17 christos * 502 1.1.1.17 christos * RETURN: Status 503 1.1.1.17 christos * 504 1.1.1.17 christos * DESCRIPTION: Compile MPAM. 505 1.1.1.17 christos * 506 1.1.1.17 christos *****************************************************************************/ 507 1.1.1.17 christos 508 1.1.1.17 christos ACPI_STATUS 509 1.1.1.17 christos DtCompileMpam ( 510 1.1.1.17 christos void **List) 511 1.1.1.17 christos { 512 1.1.1.17 christos ACPI_STATUS Status; 513 1.1.1.17 christos DT_SUBTABLE *ParentTable; 514 1.1.1.17 christos DT_SUBTABLE *Subtable; 515 1.1.1.17 christos DT_FIELD *SubtableStart; 516 1.1.1.17 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 517 1.1.1.17 christos ACPI_MPAM_MSC_NODE *MpamMscNode; 518 1.1.1.17 christos ACPI_MPAM_RESOURCE_NODE *MpamResourceNode; 519 1.1.1.17 christos UINT32 FuncDepsCount; 520 1.1.1.17 christos UINT32 RisLength; 521 1.1.1.17 christos ACPI_DMTABLE_INFO *InfoTable; 522 1.1.1.17 christos 523 1.1.1.17 christos ParentTable = DtPeekSubtable (); 524 1.1.1.17 christos 525 1.1.1.17 christos while (*PFieldList) 526 1.1.1.17 christos { 527 1.1.1.17 christos SubtableStart = *PFieldList; 528 1.1.1.17 christos 529 1.1.1.17 christos /* Main MSC Node table */ 530 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam0, 531 1.1.1.17 christos &Subtable); 532 1.1.1.17 christos if (ACPI_FAILURE (Status)) 533 1.1.1.17 christos { 534 1.1.1.17 christos return (Status); 535 1.1.1.17 christos } 536 1.1.1.17 christos 537 1.1.1.17 christos MpamMscNode = ACPI_CAST_PTR (ACPI_MPAM_MSC_NODE, Subtable->Buffer); 538 1.1.1.17 christos 539 1.1.1.17 christos ParentTable = DtPeekSubtable (); 540 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 541 1.1.1.17 christos DtPushSubtable (Subtable); 542 1.1.1.17 christos 543 1.1.1.17 christos ParentTable = DtPeekSubtable (); 544 1.1.1.17 christos 545 1.1.1.17 christos /* 546 1.1.1.17 christos * RIS(es) per MSC node have variable lengths depending on how many RISes there and 547 1.1.1.17 christos * any how many functional dependencies per RIS. Calculate it in order 548 1.1.1.17 christos * to properly set the overall MSC length. 549 1.1.1.17 christos */ 550 1.1.1.17 christos RisLength = 0; 551 1.1.1.17 christos 552 1.1.1.17 christos /* Iterate over RIS subtables per MSC node */ 553 1.1.1.18 christos for (UINT32 ris = 0; ris < MpamMscNode->NumResourceNodes; ris++) 554 1.1.1.17 christos { 555 1.1.1.17 christos /* Compile RIS subtable */ 556 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1, 557 1.1.1.17 christos &Subtable); 558 1.1.1.17 christos if (ACPI_FAILURE (Status)) 559 1.1.1.17 christos { 560 1.1.1.17 christos return (Status); 561 1.1.1.17 christos } 562 1.1.1.17 christos 563 1.1.1.17 christos MpamResourceNode = ACPI_CAST_PTR (ACPI_MPAM_RESOURCE_NODE, Subtable->Buffer); 564 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 565 1.1.1.17 christos DtPushSubtable (Subtable); 566 1.1.1.17 christos 567 1.1.1.17 christos ParentTable = DtPeekSubtable (); 568 1.1.1.17 christos 569 1.1.1.17 christos switch (MpamResourceNode->LocatorType) 570 1.1.1.17 christos { 571 1.1.1.17 christos case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE: 572 1.1.1.17 christos InfoTable = AcpiDmTableInfoMpam1A; 573 1.1.1.17 christos break; 574 1.1.1.17 christos case ACPI_MPAM_LOCATION_TYPE_MEMORY: 575 1.1.1.17 christos InfoTable = AcpiDmTableInfoMpam1B; 576 1.1.1.17 christos break; 577 1.1.1.17 christos case ACPI_MPAM_LOCATION_TYPE_SMMU: 578 1.1.1.17 christos InfoTable = AcpiDmTableInfoMpam1C; 579 1.1.1.17 christos break; 580 1.1.1.17 christos case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE: 581 1.1.1.17 christos InfoTable = AcpiDmTableInfoMpam1D; 582 1.1.1.17 christos break; 583 1.1.1.17 christos case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE: 584 1.1.1.17 christos InfoTable = AcpiDmTableInfoMpam1E; 585 1.1.1.17 christos break; 586 1.1.1.17 christos case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT: 587 1.1.1.17 christos InfoTable = AcpiDmTableInfoMpam1F; 588 1.1.1.17 christos break; 589 1.1.1.17 christos case ACPI_MPAM_LOCATION_TYPE_UNKNOWN: 590 1.1.1.17 christos InfoTable = AcpiDmTableInfoMpam1G; 591 1.1.1.17 christos default: 592 1.1.1.17 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "Resource Locator Type"); 593 1.1.1.17 christos return (AE_ERROR); 594 1.1.1.17 christos } 595 1.1.1.17 christos 596 1.1.1.17 christos /* Compile Resource Locator Table */ 597 1.1.1.17 christos Status = DtCompileTable (PFieldList, InfoTable, 598 1.1.1.17 christos &Subtable); 599 1.1.1.17 christos 600 1.1.1.17 christos if (ACPI_FAILURE (Status)) 601 1.1.1.17 christos { 602 1.1.1.17 christos return (Status); 603 1.1.1.17 christos } 604 1.1.1.17 christos 605 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 606 1.1.1.17 christos 607 1.1.1.17 christos /* Compile the number of functional dependencies per RIS */ 608 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1Deps, 609 1.1.1.17 christos &Subtable); 610 1.1.1.17 christos 611 1.1.1.17 christos if (ACPI_FAILURE (Status)) 612 1.1.1.17 christos { 613 1.1.1.17 christos return (Status); 614 1.1.1.17 christos } 615 1.1.1.17 christos 616 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 617 1.1.1.17 christos FuncDepsCount = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); 618 1.1.1.17 christos 619 1.1.1.17 christos RisLength += sizeof(ACPI_MPAM_RESOURCE_NODE) + 620 1.1.1.17 christos FuncDepsCount * sizeof(ACPI_MPAM_FUNC_DEPS); 621 1.1.1.17 christos 622 1.1.1.17 christos /* Iterate over functional dependencies per RIS */ 623 1.1.1.17 christos for (UINT32 funcDep = 0; funcDep < FuncDepsCount; funcDep++) 624 1.1.1.17 christos { 625 1.1.1.17 christos /* Compiler functional dependencies table */ 626 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam2, 627 1.1.1.17 christos &Subtable); 628 1.1.1.17 christos 629 1.1.1.17 christos if (ACPI_FAILURE (Status)) 630 1.1.1.17 christos { 631 1.1.1.17 christos return (Status); 632 1.1.1.17 christos } 633 1.1.1.17 christos 634 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 635 1.1.1.17 christos } 636 1.1.1.17 christos 637 1.1.1.17 christos DtPopSubtable (); 638 1.1.1.17 christos } 639 1.1.1.17 christos 640 1.1.1.17 christos /* Check if the length of the MSC is correct and override with the correct length */ 641 1.1.1.17 christos if (MpamMscNode->Length != sizeof(ACPI_MPAM_MSC_NODE) + RisLength) 642 1.1.1.17 christos { 643 1.1.1.17 christos MpamMscNode->Length = (UINT16) (sizeof(ACPI_MPAM_MSC_NODE) + RisLength); 644 1.1.1.17 christos DbgPrint (ASL_DEBUG_OUTPUT, "Overriding MSC->Length: %X\n", MpamMscNode->Length); 645 1.1.1.17 christos } 646 1.1.1.17 christos 647 1.1.1.17 christos DtPopSubtable (); 648 1.1.1.17 christos } 649 1.1.1.17 christos 650 1.1.1.17 christos return (AE_OK); 651 1.1.1.17 christos } 652 1.1.1.17 christos 653 1.1 christos 654 1.1 christos /****************************************************************************** 655 1.1 christos * 656 1.1 christos * FUNCTION: DtCompileMpst 657 1.1 christos * 658 1.1 christos * PARAMETERS: List - Current field list pointer 659 1.1 christos * 660 1.1 christos * RETURN: Status 661 1.1 christos * 662 1.1 christos * DESCRIPTION: Compile MPST. 663 1.1 christos * 664 1.1 christos *****************************************************************************/ 665 1.1 christos 666 1.1 christos ACPI_STATUS 667 1.1 christos DtCompileMpst ( 668 1.1 christos void **List) 669 1.1 christos { 670 1.1 christos ACPI_STATUS Status; 671 1.1 christos DT_SUBTABLE *Subtable; 672 1.1 christos DT_SUBTABLE *ParentTable; 673 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 674 1.1 christos ACPI_MPST_CHANNEL *MpstChannelInfo; 675 1.1 christos ACPI_MPST_POWER_NODE *MpstPowerNode; 676 1.1 christos ACPI_MPST_DATA_HDR *MpstDataHeader; 677 1.1 christos UINT16 SubtableCount; 678 1.1 christos UINT32 PowerStateCount; 679 1.1 christos UINT32 ComponentCount; 680 1.1 christos 681 1.1 christos 682 1.1 christos /* Main table */ 683 1.1 christos 684 1.1.1.6 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable); 685 1.1 christos if (ACPI_FAILURE (Status)) 686 1.1 christos { 687 1.1 christos return (Status); 688 1.1 christos } 689 1.1 christos 690 1.1 christos ParentTable = DtPeekSubtable (); 691 1.1 christos DtInsertSubtable (ParentTable, Subtable); 692 1.1 christos DtPushSubtable (Subtable); 693 1.1 christos 694 1.1 christos MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer); 695 1.1 christos SubtableCount = MpstChannelInfo->PowerNodeCount; 696 1.1 christos 697 1.1 christos while (*PFieldList && SubtableCount) 698 1.1 christos { 699 1.1 christos /* Subtable: Memory Power Node(s) */ 700 1.1 christos 701 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0, 702 1.1.1.6 christos &Subtable); 703 1.1 christos if (ACPI_FAILURE (Status)) 704 1.1 christos { 705 1.1 christos return (Status); 706 1.1 christos } 707 1.1 christos 708 1.1 christos ParentTable = DtPeekSubtable (); 709 1.1 christos DtInsertSubtable (ParentTable, Subtable); 710 1.1 christos DtPushSubtable (Subtable); 711 1.1 christos 712 1.1 christos MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer); 713 1.1 christos PowerStateCount = MpstPowerNode->NumPowerStates; 714 1.1 christos ComponentCount = MpstPowerNode->NumPhysicalComponents; 715 1.1 christos 716 1.1 christos ParentTable = DtPeekSubtable (); 717 1.1 christos 718 1.1 christos /* Sub-subtables - Memory Power State Structure(s) */ 719 1.1 christos 720 1.1 christos while (*PFieldList && PowerStateCount) 721 1.1 christos { 722 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A, 723 1.1.1.6 christos &Subtable); 724 1.1 christos if (ACPI_FAILURE (Status)) 725 1.1 christos { 726 1.1 christos return (Status); 727 1.1 christos } 728 1.1 christos 729 1.1 christos DtInsertSubtable (ParentTable, Subtable); 730 1.1 christos PowerStateCount--; 731 1.1 christos } 732 1.1 christos 733 1.1 christos /* Sub-subtables - Physical Component ID Structure(s) */ 734 1.1 christos 735 1.1 christos while (*PFieldList && ComponentCount) 736 1.1 christos { 737 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B, 738 1.1.1.6 christos &Subtable); 739 1.1 christos if (ACPI_FAILURE (Status)) 740 1.1 christos { 741 1.1 christos return (Status); 742 1.1 christos } 743 1.1 christos 744 1.1 christos DtInsertSubtable (ParentTable, Subtable); 745 1.1 christos ComponentCount--; 746 1.1 christos } 747 1.1 christos 748 1.1 christos SubtableCount--; 749 1.1 christos DtPopSubtable (); 750 1.1 christos } 751 1.1 christos 752 1.1 christos /* Subtable: Count of Memory Power State Characteristic structures */ 753 1.1 christos 754 1.1 christos DtPopSubtable (); 755 1.1 christos 756 1.1.1.6 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable); 757 1.1 christos if (ACPI_FAILURE (Status)) 758 1.1 christos { 759 1.1 christos return (Status); 760 1.1 christos } 761 1.1 christos 762 1.1 christos ParentTable = DtPeekSubtable (); 763 1.1 christos DtInsertSubtable (ParentTable, Subtable); 764 1.1 christos DtPushSubtable (Subtable); 765 1.1 christos 766 1.1 christos MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer); 767 1.1 christos SubtableCount = MpstDataHeader->CharacteristicsCount; 768 1.1 christos 769 1.1 christos ParentTable = DtPeekSubtable (); 770 1.1 christos 771 1.1 christos /* Subtable: Memory Power State Characteristics structure(s) */ 772 1.1 christos 773 1.1 christos while (*PFieldList && SubtableCount) 774 1.1 christos { 775 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2, 776 1.1.1.6 christos &Subtable); 777 1.1 christos if (ACPI_FAILURE (Status)) 778 1.1 christos { 779 1.1 christos return (Status); 780 1.1 christos } 781 1.1 christos 782 1.1 christos DtInsertSubtable (ParentTable, Subtable); 783 1.1 christos SubtableCount--; 784 1.1 christos } 785 1.1 christos 786 1.1 christos DtPopSubtable (); 787 1.1 christos return (AE_OK); 788 1.1 christos } 789 1.1 christos 790 1.1 christos 791 1.1 christos /****************************************************************************** 792 1.1 christos * 793 1.1.1.20 christos * FUNCTION: DtCompileMrrm 794 1.1.1.20 christos * 795 1.1.1.20 christos * PARAMETERS: List - Current field list pointer 796 1.1.1.20 christos * 797 1.1.1.20 christos * RETURN: Status 798 1.1.1.20 christos * 799 1.1.1.20 christos * DESCRIPTION: Compile MRRM. 800 1.1.1.20 christos * 801 1.1.1.20 christos *****************************************************************************/ 802 1.1.1.20 christos 803 1.1.1.20 christos ACPI_STATUS 804 1.1.1.20 christos DtCompileMrrm ( 805 1.1.1.20 christos void **List) 806 1.1.1.20 christos { 807 1.1.1.20 christos ACPI_STATUS Status; 808 1.1.1.20 christos DT_SUBTABLE *Subtable; 809 1.1.1.20 christos DT_SUBTABLE *ParentTable; 810 1.1.1.20 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 811 1.1.1.20 christos 812 1.1.1.20 christos /* Main table */ 813 1.1.1.20 christos 814 1.1.1.20 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMrrm, 815 1.1.1.20 christos &Subtable); 816 1.1.1.20 christos if (ACPI_FAILURE (Status)) 817 1.1.1.20 christos { 818 1.1.1.20 christos return (Status); 819 1.1.1.20 christos } 820 1.1.1.20 christos 821 1.1.1.20 christos ParentTable = DtPeekSubtable (); 822 1.1.1.20 christos DtInsertSubtable (ParentTable, Subtable); 823 1.1.1.20 christos 824 1.1.1.20 christos /* Subtables (all are same type) */ 825 1.1.1.20 christos 826 1.1.1.20 christos while (*PFieldList) 827 1.1.1.20 christos { 828 1.1.1.20 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoMrrm0, 829 1.1.1.20 christos &Subtable); 830 1.1.1.20 christos if (ACPI_FAILURE (Status)) 831 1.1.1.20 christos { 832 1.1.1.20 christos return (Status); 833 1.1.1.20 christos } 834 1.1.1.20 christos 835 1.1.1.20 christos DtInsertSubtable (ParentTable, Subtable); 836 1.1.1.20 christos } 837 1.1.1.20 christos 838 1.1.1.20 christos return (AE_OK); 839 1.1.1.20 christos } 840 1.1.1.20 christos 841 1.1.1.20 christos 842 1.1.1.20 christos /****************************************************************************** 843 1.1.1.20 christos * 844 1.1 christos * FUNCTION: DtCompileMsct 845 1.1 christos * 846 1.1 christos * PARAMETERS: List - Current field list pointer 847 1.1 christos * 848 1.1 christos * RETURN: Status 849 1.1 christos * 850 1.1 christos * DESCRIPTION: Compile MSCT. 851 1.1 christos * 852 1.1 christos *****************************************************************************/ 853 1.1 christos 854 1.1 christos ACPI_STATUS 855 1.1 christos DtCompileMsct ( 856 1.1 christos void **List) 857 1.1 christos { 858 1.1 christos ACPI_STATUS Status; 859 1.1 christos 860 1.1 christos 861 1.1 christos Status = DtCompileTwoSubtables (List, 862 1.1 christos AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0); 863 1.1 christos return (Status); 864 1.1 christos } 865 1.1 christos 866 1.1 christos 867 1.1 christos /****************************************************************************** 868 1.1 christos * 869 1.1 christos * FUNCTION: DtCompileNfit 870 1.1 christos * 871 1.1 christos * PARAMETERS: List - Current field list pointer 872 1.1 christos * 873 1.1 christos * RETURN: Status 874 1.1 christos * 875 1.1 christos * DESCRIPTION: Compile NFIT. 876 1.1 christos * 877 1.1 christos *****************************************************************************/ 878 1.1 christos 879 1.1 christos ACPI_STATUS 880 1.1 christos DtCompileNfit ( 881 1.1 christos void **List) 882 1.1 christos { 883 1.1 christos ACPI_STATUS Status; 884 1.1 christos DT_SUBTABLE *Subtable; 885 1.1 christos DT_SUBTABLE *ParentTable; 886 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 887 1.1 christos DT_FIELD *SubtableStart; 888 1.1 christos ACPI_NFIT_HEADER *NfitHeader; 889 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 890 1.1 christos UINT32 Count; 891 1.1 christos ACPI_NFIT_INTERLEAVE *Interleave = NULL; 892 1.1 christos ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; 893 1.1 christos 894 1.1 christos 895 1.1 christos /* Main table */ 896 1.1 christos 897 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit, 898 1.1.1.6 christos &Subtable); 899 1.1 christos if (ACPI_FAILURE (Status)) 900 1.1 christos { 901 1.1 christos return (Status); 902 1.1 christos } 903 1.1 christos 904 1.1 christos ParentTable = DtPeekSubtable (); 905 1.1 christos DtInsertSubtable (ParentTable, Subtable); 906 1.1 christos DtPushSubtable (Subtable); 907 1.1 christos 908 1.1 christos /* Subtables */ 909 1.1 christos 910 1.1 christos while (*PFieldList) 911 1.1 christos { 912 1.1 christos SubtableStart = *PFieldList; 913 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr, 914 1.1.1.6 christos &Subtable); 915 1.1 christos if (ACPI_FAILURE (Status)) 916 1.1 christos { 917 1.1 christos return (Status); 918 1.1 christos } 919 1.1 christos 920 1.1 christos ParentTable = DtPeekSubtable (); 921 1.1 christos DtInsertSubtable (ParentTable, Subtable); 922 1.1 christos DtPushSubtable (Subtable); 923 1.1 christos 924 1.1 christos NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer); 925 1.1 christos 926 1.1 christos switch (NfitHeader->Type) 927 1.1 christos { 928 1.1 christos case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 929 1.1 christos 930 1.1 christos InfoTable = AcpiDmTableInfoNfit0; 931 1.1 christos break; 932 1.1 christos 933 1.1 christos case ACPI_NFIT_TYPE_MEMORY_MAP: 934 1.1 christos 935 1.1 christos InfoTable = AcpiDmTableInfoNfit1; 936 1.1 christos break; 937 1.1 christos 938 1.1 christos case ACPI_NFIT_TYPE_INTERLEAVE: 939 1.1 christos 940 1.1 christos Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer); 941 1.1 christos InfoTable = AcpiDmTableInfoNfit2; 942 1.1 christos break; 943 1.1 christos 944 1.1 christos case ACPI_NFIT_TYPE_SMBIOS: 945 1.1 christos 946 1.1 christos InfoTable = AcpiDmTableInfoNfit3; 947 1.1 christos break; 948 1.1 christos 949 1.1 christos case ACPI_NFIT_TYPE_CONTROL_REGION: 950 1.1 christos 951 1.1 christos InfoTable = AcpiDmTableInfoNfit4; 952 1.1 christos break; 953 1.1 christos 954 1.1 christos case ACPI_NFIT_TYPE_DATA_REGION: 955 1.1 christos 956 1.1 christos InfoTable = AcpiDmTableInfoNfit5; 957 1.1 christos break; 958 1.1 christos 959 1.1 christos case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 960 1.1 christos 961 1.1 christos Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer); 962 1.1 christos InfoTable = AcpiDmTableInfoNfit6; 963 1.1 christos break; 964 1.1 christos 965 1.1.1.5 christos case ACPI_NFIT_TYPE_CAPABILITIES: 966 1.1.1.5 christos 967 1.1.1.5 christos InfoTable = AcpiDmTableInfoNfit7; 968 1.1.1.5 christos break; 969 1.1.1.5 christos 970 1.1 christos default: 971 1.1 christos 972 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT"); 973 1.1 christos return (AE_ERROR); 974 1.1 christos } 975 1.1 christos 976 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 977 1.1 christos if (ACPI_FAILURE (Status)) 978 1.1 christos { 979 1.1 christos return (Status); 980 1.1 christos } 981 1.1 christos 982 1.1 christos ParentTable = DtPeekSubtable (); 983 1.1 christos DtInsertSubtable (ParentTable, Subtable); 984 1.1 christos DtPopSubtable (); 985 1.1 christos 986 1.1 christos switch (NfitHeader->Type) 987 1.1 christos { 988 1.1 christos case ACPI_NFIT_TYPE_INTERLEAVE: 989 1.1 christos 990 1.1 christos Count = 0; 991 1.1 christos DtPushSubtable (Subtable); 992 1.1 christos while (*PFieldList) 993 1.1 christos { 994 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a, 995 1.1.1.6 christos &Subtable); 996 1.1 christos if (ACPI_FAILURE (Status)) 997 1.1 christos { 998 1.1 christos return (Status); 999 1.1 christos } 1000 1.1 christos 1001 1.1 christos if (!Subtable) 1002 1.1 christos { 1003 1.1 christos DtPopSubtable (); 1004 1.1 christos break; 1005 1.1 christos } 1006 1.1 christos 1007 1.1 christos ParentTable = DtPeekSubtable (); 1008 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1009 1.1 christos Count++; 1010 1.1 christos } 1011 1.1 christos 1012 1.1 christos Interleave->LineCount = Count; 1013 1.1 christos break; 1014 1.1 christos 1015 1.1 christos case ACPI_NFIT_TYPE_SMBIOS: 1016 1.1 christos 1017 1.1 christos if (*PFieldList) 1018 1.1 christos { 1019 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a, 1020 1.1.1.6 christos &Subtable); 1021 1.1 christos if (ACPI_FAILURE (Status)) 1022 1.1 christos { 1023 1.1 christos return (Status); 1024 1.1 christos } 1025 1.1 christos 1026 1.1 christos if (Subtable) 1027 1.1 christos { 1028 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1029 1.1 christos } 1030 1.1 christos } 1031 1.1 christos break; 1032 1.1 christos 1033 1.1 christos case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 1034 1.1 christos 1035 1.1 christos Count = 0; 1036 1.1 christos DtPushSubtable (Subtable); 1037 1.1 christos while (*PFieldList) 1038 1.1 christos { 1039 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a, 1040 1.1.1.6 christos &Subtable); 1041 1.1 christos if (ACPI_FAILURE (Status)) 1042 1.1 christos { 1043 1.1 christos return (Status); 1044 1.1 christos } 1045 1.1 christos 1046 1.1 christos if (!Subtable) 1047 1.1 christos { 1048 1.1 christos DtPopSubtable (); 1049 1.1 christos break; 1050 1.1 christos } 1051 1.1 christos 1052 1.1 christos ParentTable = DtPeekSubtable (); 1053 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1054 1.1 christos Count++; 1055 1.1 christos } 1056 1.1 christos 1057 1.1 christos Hint->HintCount = (UINT16) Count; 1058 1.1 christos break; 1059 1.1 christos 1060 1.1 christos default: 1061 1.1 christos break; 1062 1.1 christos } 1063 1.1 christos } 1064 1.1 christos 1065 1.1 christos return (AE_OK); 1066 1.1 christos } 1067 1.1 christos 1068 1.1 christos 1069 1.1 christos /****************************************************************************** 1070 1.1 christos * 1071 1.1 christos * FUNCTION: DtCompilePcct 1072 1.1 christos * 1073 1.1 christos * PARAMETERS: List - Current field list pointer 1074 1.1 christos * 1075 1.1 christos * RETURN: Status 1076 1.1 christos * 1077 1.1 christos * DESCRIPTION: Compile PCCT. 1078 1.1 christos * 1079 1.1 christos *****************************************************************************/ 1080 1.1 christos 1081 1.1 christos ACPI_STATUS 1082 1.1 christos DtCompilePcct ( 1083 1.1 christos void **List) 1084 1.1 christos { 1085 1.1 christos ACPI_STATUS Status; 1086 1.1 christos DT_SUBTABLE *Subtable; 1087 1.1 christos DT_SUBTABLE *ParentTable; 1088 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1089 1.1 christos DT_FIELD *SubtableStart; 1090 1.1 christos ACPI_SUBTABLE_HEADER *PcctHeader; 1091 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 1092 1.1 christos 1093 1.1 christos 1094 1.1 christos /* Main table */ 1095 1.1 christos 1096 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct, 1097 1.1.1.6 christos &Subtable); 1098 1.1 christos if (ACPI_FAILURE (Status)) 1099 1.1 christos { 1100 1.1 christos return (Status); 1101 1.1 christos } 1102 1.1 christos 1103 1.1 christos ParentTable = DtPeekSubtable (); 1104 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1105 1.1 christos 1106 1.1 christos /* Subtables */ 1107 1.1 christos 1108 1.1 christos while (*PFieldList) 1109 1.1 christos { 1110 1.1 christos SubtableStart = *PFieldList; 1111 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr, 1112 1.1.1.6 christos &Subtable); 1113 1.1 christos if (ACPI_FAILURE (Status)) 1114 1.1 christos { 1115 1.1 christos return (Status); 1116 1.1 christos } 1117 1.1 christos 1118 1.1 christos ParentTable = DtPeekSubtable (); 1119 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1120 1.1 christos DtPushSubtable (Subtable); 1121 1.1 christos 1122 1.1 christos PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1123 1.1 christos 1124 1.1 christos switch (PcctHeader->Type) 1125 1.1 christos { 1126 1.1 christos case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 1127 1.1 christos 1128 1.1 christos InfoTable = AcpiDmTableInfoPcct0; 1129 1.1 christos break; 1130 1.1 christos 1131 1.1 christos case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 1132 1.1 christos 1133 1.1 christos InfoTable = AcpiDmTableInfoPcct1; 1134 1.1 christos break; 1135 1.1 christos 1136 1.1.1.2 christos case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2: 1137 1.1.1.2 christos 1138 1.1.1.2 christos InfoTable = AcpiDmTableInfoPcct2; 1139 1.1.1.2 christos break; 1140 1.1.1.2 christos 1141 1.1.1.4 christos case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE: 1142 1.1.1.4 christos 1143 1.1.1.4 christos InfoTable = AcpiDmTableInfoPcct3; 1144 1.1.1.4 christos break; 1145 1.1.1.4 christos 1146 1.1.1.4 christos case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE: 1147 1.1.1.4 christos 1148 1.1.1.4 christos InfoTable = AcpiDmTableInfoPcct4; 1149 1.1.1.4 christos break; 1150 1.1.1.4 christos 1151 1.1.1.11 christos case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE: 1152 1.1.1.11 christos 1153 1.1.1.11 christos InfoTable = AcpiDmTableInfoPcct5; 1154 1.1.1.11 christos break; 1155 1.1.1.11 christos 1156 1.1 christos default: 1157 1.1 christos 1158 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT"); 1159 1.1 christos return (AE_ERROR); 1160 1.1 christos } 1161 1.1 christos 1162 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1163 1.1 christos if (ACPI_FAILURE (Status)) 1164 1.1 christos { 1165 1.1 christos return (Status); 1166 1.1 christos } 1167 1.1 christos 1168 1.1 christos ParentTable = DtPeekSubtable (); 1169 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1170 1.1 christos DtPopSubtable (); 1171 1.1 christos } 1172 1.1 christos 1173 1.1 christos return (AE_OK); 1174 1.1 christos } 1175 1.1 christos 1176 1.1 christos 1177 1.1 christos /****************************************************************************** 1178 1.1 christos * 1179 1.1.1.5 christos * FUNCTION: DtCompilePdtt 1180 1.1.1.5 christos * 1181 1.1.1.5 christos * PARAMETERS: List - Current field list pointer 1182 1.1.1.5 christos * 1183 1.1.1.5 christos * RETURN: Status 1184 1.1.1.5 christos * 1185 1.1.1.5 christos * DESCRIPTION: Compile PDTT. 1186 1.1.1.5 christos * 1187 1.1.1.5 christos *****************************************************************************/ 1188 1.1.1.5 christos 1189 1.1.1.5 christos ACPI_STATUS 1190 1.1.1.5 christos DtCompilePdtt ( 1191 1.1.1.5 christos void **List) 1192 1.1.1.5 christos { 1193 1.1.1.5 christos ACPI_STATUS Status; 1194 1.1.1.5 christos DT_SUBTABLE *Subtable; 1195 1.1.1.5 christos DT_SUBTABLE *ParentTable; 1196 1.1.1.5 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1197 1.1.1.5 christos ACPI_TABLE_PDTT *PdttHeader; 1198 1.1.1.5 christos UINT32 Count = 0; 1199 1.1.1.5 christos 1200 1.1.1.5 christos 1201 1.1.1.5 christos /* Main table */ 1202 1.1.1.5 christos 1203 1.1.1.6 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable); 1204 1.1.1.5 christos if (ACPI_FAILURE (Status)) 1205 1.1.1.5 christos { 1206 1.1.1.5 christos return (Status); 1207 1.1.1.5 christos } 1208 1.1.1.5 christos 1209 1.1.1.5 christos ParentTable = DtPeekSubtable (); 1210 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 1211 1.1.1.5 christos 1212 1.1.1.5 christos PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer); 1213 1.1.1.5 christos PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT); 1214 1.1.1.5 christos 1215 1.1.1.5 christos /* There is only one type of subtable at this time, no need to decode */ 1216 1.1.1.5 christos 1217 1.1.1.5 christos while (*PFieldList) 1218 1.1.1.5 christos { 1219 1.1.1.5 christos /* List of subchannel IDs, each 2 bytes */ 1220 1.1.1.5 christos 1221 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0, 1222 1.1.1.6 christos &Subtable); 1223 1.1.1.5 christos if (ACPI_FAILURE (Status)) 1224 1.1.1.5 christos { 1225 1.1.1.5 christos return (Status); 1226 1.1.1.5 christos } 1227 1.1.1.5 christos 1228 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 1229 1.1.1.5 christos Count++; 1230 1.1.1.5 christos } 1231 1.1.1.5 christos 1232 1.1.1.5 christos PdttHeader->TriggerCount = (UINT8) Count; 1233 1.1.1.5 christos return (AE_OK); 1234 1.1.1.5 christos } 1235 1.1.1.5 christos 1236 1.1.1.5 christos 1237 1.1.1.5 christos /****************************************************************************** 1238 1.1.1.5 christos * 1239 1.1.1.11 christos * FUNCTION: DtCompilePhat 1240 1.1.1.11 christos * 1241 1.1.1.11 christos * PARAMETERS: List - Current field list pointer 1242 1.1.1.11 christos * 1243 1.1.1.11 christos * RETURN: Status 1244 1.1.1.11 christos * 1245 1.1.1.11 christos * DESCRIPTION: Compile Phat. 1246 1.1.1.11 christos * 1247 1.1.1.11 christos *****************************************************************************/ 1248 1.1.1.11 christos 1249 1.1.1.11 christos ACPI_STATUS 1250 1.1.1.11 christos DtCompilePhat ( 1251 1.1.1.11 christos void **List) 1252 1.1.1.11 christos { 1253 1.1.1.11 christos ACPI_STATUS Status = AE_OK; 1254 1.1.1.11 christos DT_SUBTABLE *Subtable; 1255 1.1.1.11 christos DT_SUBTABLE *ParentTable; 1256 1.1.1.11 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1257 1.1.1.11 christos ACPI_PHAT_HEADER *PhatHeader; 1258 1.1.1.11 christos ACPI_DMTABLE_INFO *Info; 1259 1.1.1.11 christos ACPI_PHAT_VERSION_DATA *VersionData; 1260 1.1.1.16 christos UINT32 DeviceDataLength; 1261 1.1.1.11 christos UINT32 RecordCount; 1262 1.1.1.16 christos DT_FIELD *DataOffsetField; 1263 1.1.1.16 christos DT_FIELD *DevicePathField; 1264 1.1.1.16 christos UINT32 TableOffset = 0; 1265 1.1.1.16 christos UINT32 DataOffsetValue; 1266 1.1.1.16 christos UINT32 i; 1267 1.1.1.11 christos 1268 1.1.1.11 christos 1269 1.1.1.16 christos /* The table consists of subtables */ 1270 1.1.1.11 christos 1271 1.1.1.11 christos while (*PFieldList) 1272 1.1.1.11 christos { 1273 1.1.1.16 christos /* Compile the common subtable header */ 1274 1.1.1.16 christos 1275 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable); 1276 1.1.1.11 christos if (ACPI_FAILURE (Status)) 1277 1.1.1.11 christos { 1278 1.1.1.11 christos return (Status); 1279 1.1.1.11 christos } 1280 1.1.1.11 christos 1281 1.1.1.16 christos TableOffset += Subtable->Length; 1282 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "0 Subtable->Length: %X\n", Subtable->Length); 1283 1.1.1.16 christos 1284 1.1.1.11 christos ParentTable = DtPeekSubtable (); 1285 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 1286 1.1.1.11 christos DtPushSubtable (Subtable); 1287 1.1.1.11 christos 1288 1.1.1.11 christos PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer); 1289 1.1.1.11 christos 1290 1.1.1.11 christos switch (PhatHeader->Type) 1291 1.1.1.11 christos { 1292 1.1.1.11 christos case ACPI_PHAT_TYPE_FW_VERSION_DATA: 1293 1.1.1.11 christos 1294 1.1.1.16 christos /* Compile the middle portion of the Firmware Version Data */ 1295 1.1.1.16 christos 1296 1.1.1.11 christos Info = AcpiDmTableInfoPhat0; 1297 1.1.1.11 christos PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA); 1298 1.1.1.16 christos DataOffsetField = NULL; 1299 1.1.1.11 christos break; 1300 1.1.1.11 christos 1301 1.1.1.11 christos case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 1302 1.1.1.11 christos 1303 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "1 Offset: %X, Name: \"%s\" Length: %X\n", 1304 1.1.1.16 christos (*PFieldList)->TableOffset, (*PFieldList)->Name, Subtable->Length); 1305 1.1.1.16 christos 1306 1.1.1.16 christos DataOffsetField = *PFieldList; 1307 1.1.1.16 christos 1308 1.1.1.16 christos /* Walk the field list to get to the "Device-specific data Offset" field */ 1309 1.1.1.16 christos 1310 1.1.1.16 christos TableOffset = sizeof (ACPI_PHAT_HEALTH_DATA); 1311 1.1.1.16 christos for (i = 0; i < 3; i++) 1312 1.1.1.16 christos { 1313 1.1.1.16 christos DataOffsetField = DataOffsetField->Next; 1314 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "2 Offset: %X, Name: \"%s\" Length: %X Value: %s:\n", 1315 1.1.1.16 christos TableOffset, DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value); 1316 1.1.1.16 christos } 1317 1.1.1.16 christos 1318 1.1.1.16 christos /* Convert DataOffsetField->Value (a char * string) to an integer value */ 1319 1.1.1.16 christos 1320 1.1.1.16 christos sscanf (DataOffsetField->Value, "%X", &DataOffsetValue); 1321 1.1.1.16 christos 1322 1.1.1.16 christos /* 1323 1.1.1.16 christos * Get the next field (Device Path): 1324 1.1.1.16 christos * DataOffsetField points to "Device-Specific Offset", next field is 1325 1.1.1.16 christos * "Device Path". 1326 1.1.1.16 christos */ 1327 1.1.1.16 christos DevicePathField = DataOffsetField->Next; 1328 1.1.1.16 christos 1329 1.1.1.16 christos /* Compute the size of the input ASCII string as a unicode string (*2 + 2) */ 1330 1.1.1.16 christos 1331 1.1.1.16 christos DevicePathField->StringLength = (strlen ((const char *) DevicePathField->Value) * 2) + 2; 1332 1.1.1.16 christos TableOffset += DevicePathField->StringLength; 1333 1.1.1.16 christos 1334 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "3 Offset: %X, Length: %X devicepathLength: %X\n", 1335 1.1.1.16 christos TableOffset, Subtable->Length, DevicePathField->StringLength); 1336 1.1.1.16 christos 1337 1.1.1.16 christos /* Set the DataOffsetField to the current TableOffset */ 1338 1.1.1.16 christos /* Must set the DataOffsetField here (not later) */ 1339 1.1.1.16 christos 1340 1.1.1.16 christos if (DataOffsetValue != 0) 1341 1.1.1.16 christos { 1342 1.1.1.16 christos snprintf (DataOffsetField->Value, Subtable->Length, "%X", TableOffset); 1343 1.1.1.16 christos } 1344 1.1.1.16 christos 1345 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "4 Offset: %X, Length: %X\n", TableOffset, Subtable->Length); 1346 1.1.1.16 christos 1347 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "5 TableOffset: %X, DataOffsetField->StringLength: " 1348 1.1.1.16 christos "%X DevicePathField Length: %X DevicePathField->Value: %s, DataOffsetField->Value: %s DataOffsetField->ByteOffset %X\n", 1349 1.1.1.16 christos TableOffset, DataOffsetField->StringLength, DevicePathField->StringLength, 1350 1.1.1.16 christos DevicePathField->Value, DataOffsetField->Value, DataOffsetField->ByteOffset); 1351 1.1.1.16 christos 1352 1.1.1.16 christos /* Compile the middle portion of the Health Data Record */ 1353 1.1.1.16 christos 1354 1.1.1.11 christos Info = AcpiDmTableInfoPhat1; 1355 1.1.1.11 christos PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA); 1356 1.1.1.11 christos break; 1357 1.1.1.11 christos 1358 1.1.1.11 christos default: 1359 1.1.1.11 christos 1360 1.1.1.11 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); 1361 1.1.1.11 christos return (AE_ERROR); 1362 1.1.1.11 christos } 1363 1.1.1.11 christos 1364 1.1.1.16 christos /* Compile either the Version Data or the Health Data */ 1365 1.1.1.16 christos 1366 1.1.1.11 christos Status = DtCompileTable (PFieldList, Info, &Subtable); 1367 1.1.1.11 christos if (ACPI_FAILURE (Status)) 1368 1.1.1.11 christos { 1369 1.1.1.11 christos return (Status); 1370 1.1.1.11 christos } 1371 1.1.1.11 christos 1372 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "6 Offset: %X, Name: \"%s\" SubtableLength: %X\n", 1373 1.1.1.16 christos TableOffset /* - StartTableOffset*/, (*PFieldList)->Name, Subtable->Length); 1374 1.1.1.16 christos 1375 1.1.1.11 christos ParentTable = DtPeekSubtable (); 1376 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 1377 1.1.1.11 christos 1378 1.1.1.11 christos switch (PhatHeader->Type) 1379 1.1.1.11 christos { 1380 1.1.1.11 christos case ACPI_PHAT_TYPE_FW_VERSION_DATA: 1381 1.1.1.11 christos 1382 1.1.1.11 christos VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, 1383 1.1.1.11 christos (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); 1384 1.1.1.11 christos RecordCount = VersionData->ElementCount; 1385 1.1.1.11 christos 1386 1.1.1.16 christos /* Compile all of the Version Elements */ 1387 1.1.1.16 christos 1388 1.1.1.11 christos while (RecordCount) 1389 1.1.1.11 christos { 1390 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a, 1391 1.1.1.11 christos &Subtable); 1392 1.1.1.11 christos if (ACPI_FAILURE (Status)) 1393 1.1.1.11 christos { 1394 1.1.1.11 christos return (Status); 1395 1.1.1.11 christos } 1396 1.1.1.16 christos 1397 1.1.1.11 christos ParentTable = DtPeekSubtable (); 1398 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 1399 1.1.1.11 christos 1400 1.1.1.16 christos TableOffset += Subtable->Length; 1401 1.1.1.11 christos RecordCount--; 1402 1.1.1.11 christos PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT); 1403 1.1.1.11 christos } 1404 1.1.1.16 christos 1405 1.1.1.16 christos DtPopSubtable (); 1406 1.1.1.11 christos break; 1407 1.1.1.11 christos 1408 1.1.1.11 christos case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 1409 1.1.1.11 christos 1410 1.1.1.16 christos /* Compile the Device Path */ 1411 1.1.1.16 christos 1412 1.1.1.16 christos DeviceDataLength = Subtable->Length; 1413 1.1.1.16 christos TableOffset += Subtable->Length; 1414 1.1.1.16 christos 1415 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "7 Device Path Length: %X FieldName: \"%s\" FieldLength: " 1416 1.1.1.16 christos "%s FieldValue: %s SubtableLength: %X TableOffset: %X\n", DeviceDataLength, 1417 1.1.1.16 christos (*PFieldList)->Name, DataOffsetField->Value, (*PFieldList)->Value, 1418 1.1.1.16 christos Subtable->Length, TableOffset); 1419 1.1.1.11 christos 1420 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable); 1421 1.1.1.11 christos if (ACPI_FAILURE (Status)) 1422 1.1.1.11 christos { 1423 1.1.1.11 christos return (Status); 1424 1.1.1.11 christos } 1425 1.1.1.11 christos ParentTable = DtPeekSubtable (); 1426 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 1427 1.1.1.11 christos 1428 1.1.1.16 christos /* *PFieldList will be null if previous field was at the end-of-ParseTree (EOF) */ 1429 1.1.1.16 christos 1430 1.1.1.16 christos if (!*PFieldList) 1431 1.1.1.16 christos { 1432 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "8 Exit on end-of-ParseTree\n"); 1433 1.1.1.16 christos return (AE_OK); 1434 1.1.1.16 christos } 1435 1.1.1.16 christos 1436 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "9 Device Data Length: %X FieldName: \"%s" 1437 1.1.1.16 christos " TableOffset: %X FieldLength: %X Field Value: %s SubtableLength: %X\n", 1438 1.1.1.16 christos DeviceDataLength, (*PFieldList)->Name, TableOffset, 1439 1.1.1.16 christos (*PFieldList)->StringLength, (*PFieldList)->Value, Subtable->Length); 1440 1.1.1.16 christos 1441 1.1.1.11 christos PhatHeader->Length += (UINT16) Subtable->Length; 1442 1.1.1.11 christos 1443 1.1.1.16 christos /* Convert DataOffsetField->Value (a hex char * string) to an integer value */ 1444 1.1.1.11 christos 1445 1.1.1.16 christos sscanf (DataOffsetField->Value, "%X", &DataOffsetValue); 1446 1.1.1.16 christos 1447 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "10 Device-Specific Offset: %X Table Offset: %X\n", 1448 1.1.1.16 christos DataOffsetValue, TableOffset); 1449 1.1.1.16 christos if (DataOffsetValue != 0) 1450 1.1.1.11 christos { 1451 1.1.1.16 christos /* Compile Device-Specific Data - only if the Data Offset is non-zero */ 1452 1.1.1.16 christos 1453 1.1.1.16 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable); 1454 1.1.1.16 christos if (ACPI_FAILURE (Status)) 1455 1.1.1.16 christos { 1456 1.1.1.16 christos return (Status); 1457 1.1.1.16 christos } 1458 1.1.1.16 christos 1459 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "11 Subtable: %p Table Offset: %X\n", 1460 1.1.1.16 christos Subtable, TableOffset); 1461 1.1.1.16 christos if (Subtable) 1462 1.1.1.16 christos { 1463 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "12 Device Specific Offset: " 1464 1.1.1.16 christos "%X FieldName \"%s\" SubtableLength %X\n", 1465 1.1.1.16 christos DeviceDataLength, DataOffsetField->Name, Subtable->Length); 1466 1.1.1.16 christos 1467 1.1.1.16 christos DeviceDataLength += Subtable->Length; 1468 1.1.1.16 christos 1469 1.1.1.16 christos ParentTable = DtPeekSubtable (); 1470 1.1.1.16 christos DtInsertSubtable (ParentTable, Subtable); 1471 1.1.1.16 christos 1472 1.1.1.16 christos PhatHeader->Length += (UINT16) Subtable->Length; 1473 1.1.1.16 christos } 1474 1.1.1.11 christos } 1475 1.1.1.11 christos 1476 1.1.1.16 christos DtPopSubtable (); 1477 1.1.1.11 christos 1478 1.1.1.16 christos DbgPrint (ASL_DEBUG_OUTPUT, "13 FieldName: \"%s\" FieldLength: %X Field Value: %s\n", 1479 1.1.1.16 christos DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value); 1480 1.1.1.11 christos break; 1481 1.1.1.11 christos 1482 1.1.1.11 christos default: 1483 1.1.1.11 christos 1484 1.1.1.11 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); 1485 1.1.1.11 christos return (AE_ERROR); 1486 1.1.1.11 christos } 1487 1.1.1.11 christos } 1488 1.1.1.11 christos 1489 1.1.1.11 christos return (Status); 1490 1.1.1.11 christos } 1491 1.1.1.11 christos 1492 1.1.1.11 christos 1493 1.1.1.11 christos /****************************************************************************** 1494 1.1.1.11 christos * 1495 1.1 christos * FUNCTION: DtCompilePmtt 1496 1.1 christos * 1497 1.1 christos * PARAMETERS: List - Current field list pointer 1498 1.1 christos * 1499 1.1 christos * RETURN: Status 1500 1.1 christos * 1501 1.1 christos * DESCRIPTION: Compile PMTT. 1502 1.1 christos * 1503 1.1 christos *****************************************************************************/ 1504 1.1 christos 1505 1.1 christos ACPI_STATUS 1506 1.1 christos DtCompilePmtt ( 1507 1.1 christos void **List) 1508 1.1 christos { 1509 1.1 christos ACPI_STATUS Status; 1510 1.1 christos DT_SUBTABLE *Subtable; 1511 1.1 christos DT_SUBTABLE *ParentTable; 1512 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1513 1.1 christos DT_FIELD *SubtableStart; 1514 1.1.1.11 christos UINT16 Type; 1515 1.1 christos 1516 1.1 christos 1517 1.1 christos /* Main table */ 1518 1.1 christos 1519 1.1.1.6 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable); 1520 1.1 christos if (ACPI_FAILURE (Status)) 1521 1.1 christos { 1522 1.1 christos return (Status); 1523 1.1 christos } 1524 1.1 christos 1525 1.1 christos ParentTable = DtPeekSubtable (); 1526 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1527 1.1 christos DtPushSubtable (Subtable); 1528 1.1 christos 1529 1.1.1.11 christos /* Subtables */ 1530 1.1.1.11 christos 1531 1.1 christos while (*PFieldList) 1532 1.1 christos { 1533 1.1 christos SubtableStart = *PFieldList; 1534 1.1.1.11 christos DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 1535 1.1 christos 1536 1.1.1.11 christos switch (Type) 1537 1.1 christos { 1538 1.1 christos case ACPI_PMTT_TYPE_SOCKET: 1539 1.1 christos 1540 1.1 christos /* Subtable: Socket Structure */ 1541 1.1 christos 1542 1.1.1.11 christos DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n"); 1543 1.1.1.11 christos 1544 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0, 1545 1.1.1.6 christos &Subtable); 1546 1.1 christos if (ACPI_FAILURE (Status)) 1547 1.1 christos { 1548 1.1 christos return (Status); 1549 1.1 christos } 1550 1.1 christos 1551 1.1 christos break; 1552 1.1 christos 1553 1.1 christos case ACPI_PMTT_TYPE_CONTROLLER: 1554 1.1 christos 1555 1.1 christos /* Subtable: Memory Controller Structure */ 1556 1.1 christos 1557 1.1.1.11 christos DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n"); 1558 1.1.1.11 christos 1559 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1, 1560 1.1.1.6 christos &Subtable); 1561 1.1 christos if (ACPI_FAILURE (Status)) 1562 1.1 christos { 1563 1.1 christos return (Status); 1564 1.1 christos } 1565 1.1 christos 1566 1.1.1.11 christos break; 1567 1.1 christos 1568 1.1.1.11 christos case ACPI_PMTT_TYPE_DIMM: 1569 1.1 christos 1570 1.1.1.11 christos /* Subtable: Physical Component (DIMM) Structure */ 1571 1.1 christos 1572 1.1.1.11 christos DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n"); 1573 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2, 1574 1.1.1.11 christos &Subtable); 1575 1.1.1.11 christos if (ACPI_FAILURE (Status)) 1576 1.1.1.11 christos { 1577 1.1.1.11 christos return (Status); 1578 1.1 christos } 1579 1.1.1.11 christos 1580 1.1 christos break; 1581 1.1 christos 1582 1.1.1.11 christos case ACPI_PMTT_TYPE_VENDOR: 1583 1.1 christos 1584 1.1.1.11 christos /* Subtable: Vendor-specific Structure */ 1585 1.1 christos 1586 1.1.1.11 christos DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n"); 1587 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor, 1588 1.1.1.6 christos &Subtable); 1589 1.1 christos if (ACPI_FAILURE (Status)) 1590 1.1 christos { 1591 1.1 christos return (Status); 1592 1.1 christos } 1593 1.1 christos 1594 1.1 christos break; 1595 1.1 christos 1596 1.1 christos default: 1597 1.1 christos 1598 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT"); 1599 1.1 christos return (AE_ERROR); 1600 1.1 christos } 1601 1.1.1.11 christos 1602 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 1603 1.1 christos } 1604 1.1 christos 1605 1.1 christos return (Status); 1606 1.1 christos } 1607 1.1 christos 1608 1.1 christos 1609 1.1 christos /****************************************************************************** 1610 1.1 christos * 1611 1.1.1.4 christos * FUNCTION: DtCompilePptt 1612 1.1.1.4 christos * 1613 1.1.1.4 christos * PARAMETERS: List - Current field list pointer 1614 1.1.1.4 christos * 1615 1.1.1.4 christos * RETURN: Status 1616 1.1.1.4 christos * 1617 1.1.1.4 christos * DESCRIPTION: Compile PPTT. 1618 1.1.1.4 christos * 1619 1.1.1.4 christos *****************************************************************************/ 1620 1.1.1.4 christos 1621 1.1.1.4 christos ACPI_STATUS 1622 1.1.1.4 christos DtCompilePptt ( 1623 1.1.1.4 christos void **List) 1624 1.1.1.4 christos { 1625 1.1.1.4 christos ACPI_STATUS Status; 1626 1.1.1.4 christos ACPI_SUBTABLE_HEADER *PpttHeader; 1627 1.1.1.4 christos ACPI_PPTT_PROCESSOR *PpttProcessor = NULL; 1628 1.1.1.4 christos DT_SUBTABLE *Subtable; 1629 1.1.1.4 christos DT_SUBTABLE *ParentTable; 1630 1.1.1.4 christos ACPI_DMTABLE_INFO *InfoTable; 1631 1.1.1.4 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1632 1.1.1.4 christos DT_FIELD *SubtableStart; 1633 1.1.1.11 christos ACPI_TABLE_HEADER *PpttAcpiHeader; 1634 1.1.1.4 christos 1635 1.1.1.4 christos 1636 1.1.1.4 christos ParentTable = DtPeekSubtable (); 1637 1.1.1.4 christos while (*PFieldList) 1638 1.1.1.4 christos { 1639 1.1.1.4 christos SubtableStart = *PFieldList; 1640 1.1.1.4 christos 1641 1.1.1.4 christos /* Compile PPTT subtable header */ 1642 1.1.1.4 christos 1643 1.1.1.4 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr, 1644 1.1.1.6 christos &Subtable); 1645 1.1.1.4 christos if (ACPI_FAILURE (Status)) 1646 1.1.1.4 christos { 1647 1.1.1.4 christos return (Status); 1648 1.1.1.4 christos } 1649 1.1.1.4 christos DtInsertSubtable (ParentTable, Subtable); 1650 1.1.1.4 christos PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 1651 1.1.1.4 christos PpttHeader->Length = (UINT8)(Subtable->Length); 1652 1.1.1.4 christos 1653 1.1.1.4 christos switch (PpttHeader->Type) 1654 1.1.1.4 christos { 1655 1.1.1.4 christos case ACPI_PPTT_TYPE_PROCESSOR: 1656 1.1.1.4 christos 1657 1.1.1.4 christos InfoTable = AcpiDmTableInfoPptt0; 1658 1.1.1.4 christos break; 1659 1.1.1.4 christos 1660 1.1.1.4 christos case ACPI_PPTT_TYPE_CACHE: 1661 1.1.1.4 christos 1662 1.1.1.4 christos InfoTable = AcpiDmTableInfoPptt1; 1663 1.1.1.4 christos break; 1664 1.1.1.4 christos 1665 1.1.1.4 christos case ACPI_PPTT_TYPE_ID: 1666 1.1.1.4 christos 1667 1.1.1.4 christos InfoTable = AcpiDmTableInfoPptt2; 1668 1.1.1.4 christos break; 1669 1.1.1.4 christos 1670 1.1.1.4 christos default: 1671 1.1.1.4 christos 1672 1.1.1.4 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT"); 1673 1.1.1.4 christos return (AE_ERROR); 1674 1.1.1.4 christos } 1675 1.1.1.4 christos 1676 1.1.1.4 christos /* Compile PPTT subtable body */ 1677 1.1.1.4 christos 1678 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1679 1.1.1.4 christos if (ACPI_FAILURE (Status)) 1680 1.1.1.4 christos { 1681 1.1.1.4 christos return (Status); 1682 1.1.1.4 christos } 1683 1.1.1.4 christos DtInsertSubtable (ParentTable, Subtable); 1684 1.1.1.4 christos PpttHeader->Length += (UINT8)(Subtable->Length); 1685 1.1.1.4 christos 1686 1.1.1.17 christos /* Compile PPTT subtable additional */ 1687 1.1.1.4 christos 1688 1.1.1.4 christos switch (PpttHeader->Type) 1689 1.1.1.4 christos { 1690 1.1.1.4 christos case ACPI_PPTT_TYPE_PROCESSOR: 1691 1.1.1.4 christos 1692 1.1.1.4 christos PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR, 1693 1.1.1.4 christos Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER)); 1694 1.1.1.4 christos if (PpttProcessor) 1695 1.1.1.4 christos { 1696 1.1.1.4 christos /* Compile initiator proximity domain list */ 1697 1.1.1.4 christos 1698 1.1.1.4 christos PpttProcessor->NumberOfPrivResources = 0; 1699 1.1.1.4 christos while (*PFieldList) 1700 1.1.1.4 christos { 1701 1.1.1.4 christos Status = DtCompileTable (PFieldList, 1702 1.1.1.6 christos AcpiDmTableInfoPptt0a, &Subtable); 1703 1.1.1.4 christos if (ACPI_FAILURE (Status)) 1704 1.1.1.4 christos { 1705 1.1.1.4 christos return (Status); 1706 1.1.1.4 christos } 1707 1.1.1.4 christos if (!Subtable) 1708 1.1.1.4 christos { 1709 1.1.1.4 christos break; 1710 1.1.1.4 christos } 1711 1.1.1.4 christos 1712 1.1.1.4 christos DtInsertSubtable (ParentTable, Subtable); 1713 1.1.1.4 christos PpttHeader->Length += (UINT8)(Subtable->Length); 1714 1.1.1.4 christos PpttProcessor->NumberOfPrivResources++; 1715 1.1.1.4 christos } 1716 1.1.1.4 christos } 1717 1.1.1.4 christos break; 1718 1.1.1.4 christos 1719 1.1.1.11 christos case ACPI_PPTT_TYPE_CACHE: 1720 1.1.1.11 christos 1721 1.1.1.11 christos PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, 1722 1.1.1.11 christos AslGbl_RootTable->Buffer); 1723 1.1.1.11 christos if (PpttAcpiHeader->Revision < 3) 1724 1.1.1.11 christos { 1725 1.1.1.11 christos break; 1726 1.1.1.11 christos } 1727 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a, 1728 1.1.1.11 christos &Subtable); 1729 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 1730 1.1.1.11 christos PpttHeader->Length += (UINT8)(Subtable->Length); 1731 1.1.1.11 christos break; 1732 1.1.1.11 christos 1733 1.1.1.4 christos default: 1734 1.1.1.4 christos 1735 1.1.1.4 christos break; 1736 1.1.1.4 christos } 1737 1.1.1.4 christos } 1738 1.1.1.4 christos 1739 1.1.1.4 christos return (AE_OK); 1740 1.1.1.4 christos } 1741 1.1.1.4 christos 1742 1.1.1.4 christos 1743 1.1.1.4 christos /****************************************************************************** 1744 1.1.1.4 christos * 1745 1.1.1.12 christos * FUNCTION: DtCompilePrmt 1746 1.1.1.12 christos * 1747 1.1.1.12 christos * PARAMETERS: List - Current field list pointer 1748 1.1.1.12 christos * 1749 1.1.1.12 christos * RETURN: Status 1750 1.1.1.12 christos * 1751 1.1.1.12 christos * DESCRIPTION: Compile PRMT. 1752 1.1.1.12 christos * 1753 1.1.1.12 christos *****************************************************************************/ 1754 1.1.1.12 christos 1755 1.1.1.12 christos ACPI_STATUS 1756 1.1.1.12 christos DtCompilePrmt ( 1757 1.1.1.12 christos void **List) 1758 1.1.1.12 christos { 1759 1.1.1.12 christos ACPI_STATUS Status; 1760 1.1.1.12 christos ACPI_TABLE_PRMT_HEADER *PrmtHeader; 1761 1.1.1.12 christos ACPI_PRMT_MODULE_INFO *PrmtModuleInfo; 1762 1.1.1.12 christos DT_SUBTABLE *Subtable; 1763 1.1.1.12 christos DT_SUBTABLE *ParentTable; 1764 1.1.1.12 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1765 1.1.1.12 christos UINT32 i, j; 1766 1.1.1.12 christos 1767 1.1.1.12 christos ParentTable = DtPeekSubtable (); 1768 1.1.1.12 christos 1769 1.1.1.12 christos /* Compile PRMT subtable header */ 1770 1.1.1.12 christos 1771 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr, 1772 1.1.1.12 christos &Subtable); 1773 1.1.1.12 christos if (ACPI_FAILURE (Status)) 1774 1.1.1.12 christos { 1775 1.1.1.12 christos return (Status); 1776 1.1.1.12 christos } 1777 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 1778 1.1.1.12 christos PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer); 1779 1.1.1.12 christos 1780 1.1.1.12 christos for (i = 0; i < PrmtHeader->ModuleInfoCount; i++) 1781 1.1.1.12 christos { 1782 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule, 1783 1.1.1.12 christos &Subtable); 1784 1.1.1.12 christos if (ACPI_FAILURE (Status)) 1785 1.1.1.12 christos { 1786 1.1.1.12 christos return (Status); 1787 1.1.1.12 christos } 1788 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 1789 1.1.1.12 christos PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer); 1790 1.1.1.12 christos 1791 1.1.1.12 christos for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++) 1792 1.1.1.12 christos { 1793 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler, 1794 1.1.1.12 christos &Subtable); 1795 1.1.1.12 christos if (ACPI_FAILURE (Status)) 1796 1.1.1.12 christos { 1797 1.1.1.12 christos return (Status); 1798 1.1.1.12 christos } 1799 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 1800 1.1.1.12 christos } 1801 1.1.1.12 christos } 1802 1.1.1.12 christos 1803 1.1.1.12 christos return (AE_OK); 1804 1.1.1.12 christos } 1805 1.1.1.12 christos 1806 1.1.1.12 christos 1807 1.1.1.12 christos /****************************************************************************** 1808 1.1.1.12 christos * 1809 1.1.1.18 christos * FUNCTION: DtCompileRas2 1810 1.1.1.18 christos * 1811 1.1.1.18 christos * PARAMETERS: List - Current field list pointer 1812 1.1.1.18 christos * 1813 1.1.1.18 christos * RETURN: Status 1814 1.1.1.18 christos * 1815 1.1.1.18 christos * DESCRIPTION: Compile RAS2. 1816 1.1.1.18 christos * 1817 1.1.1.18 christos *****************************************************************************/ 1818 1.1.1.18 christos 1819 1.1.1.18 christos ACPI_STATUS 1820 1.1.1.18 christos DtCompileRas2 ( 1821 1.1.1.18 christos void **List) 1822 1.1.1.18 christos { 1823 1.1.1.18 christos ACPI_STATUS Status; 1824 1.1.1.18 christos DT_SUBTABLE *Subtable; 1825 1.1.1.18 christos DT_SUBTABLE *ParentTable; 1826 1.1.1.18 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1827 1.1.1.18 christos ACPI_TABLE_RAS2 *Ras2Header; 1828 1.1.1.18 christos UINT32 Count = 0; 1829 1.1.1.18 christos 1830 1.1.1.18 christos 1831 1.1.1.18 christos /* Main table */ 1832 1.1.1.18 christos 1833 1.1.1.18 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2, &Subtable); 1834 1.1.1.18 christos if (ACPI_FAILURE (Status)) 1835 1.1.1.18 christos { 1836 1.1.1.18 christos return (Status); 1837 1.1.1.18 christos } 1838 1.1.1.18 christos 1839 1.1.1.18 christos ParentTable = DtPeekSubtable (); 1840 1.1.1.18 christos DtInsertSubtable (ParentTable, Subtable); 1841 1.1.1.18 christos 1842 1.1.1.18 christos Ras2Header = ACPI_CAST_PTR (ACPI_TABLE_RAS2, ParentTable->Buffer); 1843 1.1.1.18 christos 1844 1.1.1.18 christos /* There is only one type of subtable at this time, no need to decode */ 1845 1.1.1.18 christos 1846 1.1.1.18 christos while (*PFieldList) 1847 1.1.1.18 christos { 1848 1.1.1.18 christos /* List of RAS2 PCC descriptors, each 8 bytes */ 1849 1.1.1.18 christos 1850 1.1.1.18 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2PccDesc, 1851 1.1.1.18 christos &Subtable); 1852 1.1.1.18 christos if (ACPI_FAILURE (Status)) 1853 1.1.1.18 christos { 1854 1.1.1.18 christos return (Status); 1855 1.1.1.18 christos } 1856 1.1.1.18 christos 1857 1.1.1.18 christos DtInsertSubtable (ParentTable, Subtable); 1858 1.1.1.18 christos Count++; 1859 1.1.1.18 christos } 1860 1.1.1.18 christos 1861 1.1.1.18 christos Ras2Header->NumPccDescs = (UINT8) Count; 1862 1.1.1.18 christos return (AE_OK); 1863 1.1.1.18 christos } 1864 1.1.1.18 christos 1865 1.1.1.18 christos 1866 1.1.1.18 christos /****************************************************************************** 1867 1.1.1.18 christos * 1868 1.1.1.12 christos * FUNCTION: DtCompileRgrt 1869 1.1.1.12 christos * 1870 1.1.1.12 christos * PARAMETERS: List - Current field list pointer 1871 1.1.1.12 christos * 1872 1.1.1.12 christos * RETURN: Status 1873 1.1.1.12 christos * 1874 1.1.1.12 christos * DESCRIPTION: Compile RGRT. 1875 1.1.1.12 christos * 1876 1.1.1.12 christos *****************************************************************************/ 1877 1.1.1.12 christos 1878 1.1.1.12 christos ACPI_STATUS 1879 1.1.1.12 christos DtCompileRgrt ( 1880 1.1.1.12 christos void **List) 1881 1.1.1.12 christos { 1882 1.1.1.12 christos ACPI_STATUS Status; 1883 1.1.1.12 christos DT_SUBTABLE *Subtable; 1884 1.1.1.12 christos DT_SUBTABLE *ParentTable; 1885 1.1.1.12 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1886 1.1.1.12 christos 1887 1.1.1.12 christos 1888 1.1.1.12 christos /* Compile the main table */ 1889 1.1.1.12 christos 1890 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt, 1891 1.1.1.12 christos &Subtable); 1892 1.1.1.12 christos if (ACPI_FAILURE (Status)) 1893 1.1.1.12 christos { 1894 1.1.1.12 christos return (Status); 1895 1.1.1.12 christos } 1896 1.1.1.12 christos 1897 1.1.1.12 christos ParentTable = DtPeekSubtable (); 1898 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 1899 1.1.1.12 christos 1900 1.1.1.12 christos /* Compile the "Subtable" -- actually just the binary (PNG) image */ 1901 1.1.1.12 christos 1902 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0, 1903 1.1.1.12 christos &Subtable); 1904 1.1.1.12 christos if (ACPI_FAILURE (Status)) 1905 1.1.1.12 christos { 1906 1.1.1.12 christos return (Status); 1907 1.1.1.12 christos } 1908 1.1.1.12 christos 1909 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 1910 1.1.1.12 christos return (AE_OK); 1911 1.1.1.12 christos } 1912 1.1.1.12 christos 1913 1.1.1.12 christos 1914 1.1.1.12 christos /****************************************************************************** 1915 1.1.1.12 christos * 1916 1.1.1.17 christos * FUNCTION: DtCompileRhct 1917 1.1.1.17 christos * 1918 1.1.1.17 christos * PARAMETERS: List - Current field list pointer 1919 1.1.1.17 christos * 1920 1.1.1.17 christos * RETURN: Status 1921 1.1.1.17 christos * 1922 1.1.1.17 christos * DESCRIPTION: Compile RHCT. 1923 1.1.1.17 christos * 1924 1.1.1.17 christos *****************************************************************************/ 1925 1.1.1.17 christos 1926 1.1.1.17 christos ACPI_STATUS 1927 1.1.1.17 christos DtCompileRhct ( 1928 1.1.1.17 christos void **List) 1929 1.1.1.17 christos { 1930 1.1.1.17 christos ACPI_STATUS Status; 1931 1.1.1.17 christos ACPI_RHCT_NODE_HEADER *RhctHeader; 1932 1.1.1.20 christos ACPI_RHCT_HART_INFO *RhctHartInfo; 1933 1.1.1.17 christos DT_SUBTABLE *Subtable; 1934 1.1.1.17 christos DT_SUBTABLE *ParentTable; 1935 1.1.1.17 christos ACPI_DMTABLE_INFO *InfoTable; 1936 1.1.1.17 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1937 1.1.1.17 christos DT_FIELD *SubtableStart; 1938 1.1.1.20 christos ACPI_TABLE_RHCT *Table; 1939 1.1.1.20 christos BOOLEAN FirstNode = TRUE; 1940 1.1.1.17 christos 1941 1.1.1.17 christos 1942 1.1.1.17 christos /* Compile the main table */ 1943 1.1.1.17 christos 1944 1.1.1.20 christos ParentTable = DtPeekSubtable (); 1945 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhct, 1946 1.1.1.17 christos &Subtable); 1947 1.1.1.17 christos if (ACPI_FAILURE (Status)) 1948 1.1.1.17 christos { 1949 1.1.1.17 christos return (Status); 1950 1.1.1.17 christos } 1951 1.1.1.20 christos DtInsertSubtable (ParentTable, Subtable); 1952 1.1.1.20 christos Table = ACPI_CAST_PTR (ACPI_TABLE_RHCT, ParentTable->Buffer); 1953 1.1.1.20 christos Table->NodeCount = 0; 1954 1.1.1.20 christos Table->NodeOffset = sizeof (ACPI_TABLE_RHCT); 1955 1.1.1.17 christos 1956 1.1.1.17 christos while (*PFieldList) 1957 1.1.1.17 christos { 1958 1.1.1.17 christos SubtableStart = *PFieldList; 1959 1.1.1.17 christos 1960 1.1.1.17 christos /* Compile RHCT subtable header */ 1961 1.1.1.17 christos 1962 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhctNodeHdr, 1963 1.1.1.17 christos &Subtable); 1964 1.1.1.17 christos if (ACPI_FAILURE (Status)) 1965 1.1.1.17 christos { 1966 1.1.1.17 christos return (Status); 1967 1.1.1.17 christos } 1968 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 1969 1.1.1.17 christos RhctHeader = ACPI_CAST_PTR (ACPI_RHCT_NODE_HEADER, Subtable->Buffer); 1970 1.1.1.20 christos 1971 1.1.1.20 christos DtPushSubtable (Subtable); 1972 1.1.1.20 christos ParentTable = DtPeekSubtable (); 1973 1.1.1.20 christos Table->NodeCount++; 1974 1.1.1.17 christos 1975 1.1.1.17 christos switch (RhctHeader->Type) 1976 1.1.1.17 christos { 1977 1.1.1.17 christos case ACPI_RHCT_NODE_TYPE_ISA_STRING: 1978 1.1.1.17 christos 1979 1.1.1.17 christos InfoTable = AcpiDmTableInfoRhctIsa1; 1980 1.1.1.17 christos break; 1981 1.1.1.17 christos 1982 1.1.1.17 christos case ACPI_RHCT_NODE_TYPE_HART_INFO: 1983 1.1.1.17 christos 1984 1.1.1.17 christos InfoTable = AcpiDmTableInfoRhctHartInfo1; 1985 1.1.1.17 christos break; 1986 1.1.1.17 christos 1987 1.1.1.17 christos case ACPI_RHCT_NODE_TYPE_CMO: 1988 1.1.1.17 christos 1989 1.1.1.17 christos InfoTable = AcpiDmTableInfoRhctCmo1; 1990 1.1.1.17 christos break; 1991 1.1.1.17 christos 1992 1.1.1.17 christos case ACPI_RHCT_NODE_TYPE_MMU: 1993 1.1.1.17 christos 1994 1.1.1.17 christos InfoTable = AcpiDmTableInfoRhctMmu1; 1995 1.1.1.17 christos break; 1996 1.1.1.17 christos 1997 1.1.1.17 christos default: 1998 1.1.1.17 christos 1999 1.1.1.17 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "RHCT"); 2000 1.1.1.17 christos return (AE_ERROR); 2001 1.1.1.17 christos } 2002 1.1.1.17 christos 2003 1.1.1.17 christos /* Compile RHCT subtable body */ 2004 1.1.1.17 christos 2005 1.1.1.17 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2006 1.1.1.17 christos if (ACPI_FAILURE (Status)) 2007 1.1.1.17 christos { 2008 1.1.1.17 christos return (Status); 2009 1.1.1.17 christos } 2010 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 2011 1.1.1.20 christos if (FirstNode) 2012 1.1.1.20 christos { 2013 1.1.1.20 christos Table->NodeOffset = ACPI_PTR_DIFF(ParentTable->Buffer, Table); 2014 1.1.1.20 christos FirstNode = FALSE; 2015 1.1.1.20 christos } 2016 1.1.1.17 christos 2017 1.1.1.17 christos /* Compile RHCT subtable additionals */ 2018 1.1.1.17 christos 2019 1.1.1.17 christos switch (RhctHeader->Type) 2020 1.1.1.17 christos { 2021 1.1.1.20 christos case ACPI_RHCT_NODE_TYPE_ISA_STRING: 2022 1.1.1.17 christos 2023 1.1.1.20 christos /* 2024 1.1.1.20 christos * Padding - Variable-length data 2025 1.1.1.20 christos * Optionally allows the padding of the ISA string to be used 2026 1.1.1.20 christos * for filling this field. 2027 1.1.1.20 christos */ 2028 1.1.1.20 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhctIsaPad, 2029 1.1.1.20 christos &Subtable); 2030 1.1.1.20 christos if (ACPI_FAILURE (Status)) 2031 1.1.1.20 christos { 2032 1.1.1.20 christos return (Status); 2033 1.1.1.20 christos } 2034 1.1.1.20 christos if (Subtable) 2035 1.1.1.17 christos { 2036 1.1.1.20 christos DtInsertSubtable (ParentTable, Subtable); 2037 1.1.1.20 christos } 2038 1.1.1.20 christos break; 2039 1.1.1.17 christos 2040 1.1.1.20 christos case ACPI_RHCT_NODE_TYPE_HART_INFO: 2041 1.1.1.17 christos 2042 1.1.1.20 christos RhctHartInfo = ACPI_CAST_PTR (ACPI_RHCT_HART_INFO, 2043 1.1.1.20 christos Subtable->Buffer); 2044 1.1.1.20 christos RhctHartInfo->NumOffsets = 0; 2045 1.1.1.20 christos while (*PFieldList) 2046 1.1.1.20 christos { 2047 1.1.1.20 christos Status = DtCompileTable (PFieldList, 2048 1.1.1.20 christos AcpiDmTableInfoRhctHartInfo2, &Subtable); 2049 1.1.1.20 christos if (ACPI_FAILURE (Status)) 2050 1.1.1.20 christos { 2051 1.1.1.20 christos return (Status); 2052 1.1.1.17 christos } 2053 1.1.1.20 christos if (!Subtable) 2054 1.1.1.20 christos { 2055 1.1.1.20 christos break; 2056 1.1.1.20 christos } 2057 1.1.1.20 christos DtInsertSubtable (ParentTable, Subtable); 2058 1.1.1.20 christos RhctHartInfo->NumOffsets++; 2059 1.1.1.17 christos } 2060 1.1.1.17 christos break; 2061 1.1.1.17 christos 2062 1.1.1.17 christos default: 2063 1.1.1.17 christos 2064 1.1.1.17 christos break; 2065 1.1.1.17 christos } 2066 1.1.1.20 christos 2067 1.1.1.20 christos DtPopSubtable (); 2068 1.1.1.20 christos ParentTable = DtPeekSubtable (); 2069 1.1.1.17 christos } 2070 1.1.1.17 christos 2071 1.1.1.17 christos return (AE_OK); 2072 1.1.1.17 christos } 2073 1.1.1.17 christos 2074 1.1.1.17 christos 2075 1.1.1.17 christos /****************************************************************************** 2076 1.1.1.17 christos * 2077 1.1 christos * FUNCTION: DtCompileRsdt 2078 1.1 christos * 2079 1.1 christos * PARAMETERS: List - Current field list pointer 2080 1.1 christos * 2081 1.1 christos * RETURN: Status 2082 1.1 christos * 2083 1.1 christos * DESCRIPTION: Compile RSDT. 2084 1.1 christos * 2085 1.1 christos *****************************************************************************/ 2086 1.1 christos 2087 1.1 christos ACPI_STATUS 2088 1.1 christos DtCompileRsdt ( 2089 1.1 christos void **List) 2090 1.1 christos { 2091 1.1 christos DT_SUBTABLE *Subtable; 2092 1.1 christos DT_SUBTABLE *ParentTable; 2093 1.1 christos DT_FIELD *FieldList = *(DT_FIELD **) List; 2094 1.1 christos UINT32 Address; 2095 1.1 christos 2096 1.1 christos 2097 1.1 christos ParentTable = DtPeekSubtable (); 2098 1.1 christos 2099 1.1 christos while (FieldList) 2100 1.1 christos { 2101 1.1 christos DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO); 2102 1.1 christos 2103 1.1 christos DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable); 2104 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2105 1.1 christos FieldList = FieldList->Next; 2106 1.1 christos } 2107 1.1 christos 2108 1.1 christos return (AE_OK); 2109 1.1 christos } 2110 1.1 christos 2111 1.1 christos 2112 1.1 christos /****************************************************************************** 2113 1.1 christos * 2114 1.1 christos * FUNCTION: DtCompileS3pt 2115 1.1 christos * 2116 1.1 christos * PARAMETERS: PFieldList - Current field list pointer 2117 1.1 christos * 2118 1.1 christos * RETURN: Status 2119 1.1 christos * 2120 1.1 christos * DESCRIPTION: Compile S3PT (Pointed to by FPDT) 2121 1.1 christos * 2122 1.1 christos *****************************************************************************/ 2123 1.1 christos 2124 1.1 christos ACPI_STATUS 2125 1.1 christos DtCompileS3pt ( 2126 1.1 christos DT_FIELD **PFieldList) 2127 1.1 christos { 2128 1.1 christos ACPI_STATUS Status; 2129 1.1.1.2 christos ACPI_FPDT_HEADER *S3ptHeader; 2130 1.1 christos DT_SUBTABLE *Subtable; 2131 1.1 christos DT_SUBTABLE *ParentTable; 2132 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 2133 1.1 christos DT_FIELD *SubtableStart; 2134 1.1 christos 2135 1.1 christos 2136 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt, 2137 1.1.1.7 christos &AslGbl_RootTable); 2138 1.1 christos if (ACPI_FAILURE (Status)) 2139 1.1 christos { 2140 1.1 christos return (Status); 2141 1.1 christos } 2142 1.1 christos 2143 1.1.1.7 christos DtPushSubtable (AslGbl_RootTable); 2144 1.1 christos 2145 1.1 christos while (*PFieldList) 2146 1.1 christos { 2147 1.1 christos SubtableStart = *PFieldList; 2148 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr, 2149 1.1.1.6 christos &Subtable); 2150 1.1 christos if (ACPI_FAILURE (Status)) 2151 1.1 christos { 2152 1.1 christos return (Status); 2153 1.1 christos } 2154 1.1 christos 2155 1.1 christos ParentTable = DtPeekSubtable (); 2156 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2157 1.1 christos DtPushSubtable (Subtable); 2158 1.1 christos 2159 1.1.1.2 christos S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); 2160 1.1 christos 2161 1.1 christos switch (S3ptHeader->Type) 2162 1.1 christos { 2163 1.1 christos case ACPI_S3PT_TYPE_RESUME: 2164 1.1 christos 2165 1.1 christos InfoTable = AcpiDmTableInfoS3pt0; 2166 1.1 christos break; 2167 1.1 christos 2168 1.1 christos case ACPI_S3PT_TYPE_SUSPEND: 2169 1.1 christos 2170 1.1 christos InfoTable = AcpiDmTableInfoS3pt1; 2171 1.1 christos break; 2172 1.1 christos 2173 1.1 christos default: 2174 1.1 christos 2175 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT"); 2176 1.1 christos return (AE_ERROR); 2177 1.1 christos } 2178 1.1 christos 2179 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2180 1.1 christos if (ACPI_FAILURE (Status)) 2181 1.1 christos { 2182 1.1 christos return (Status); 2183 1.1 christos } 2184 1.1 christos 2185 1.1 christos ParentTable = DtPeekSubtable (); 2186 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2187 1.1 christos DtPopSubtable (); 2188 1.1 christos } 2189 1.1 christos 2190 1.1 christos return (AE_OK); 2191 1.1 christos } 2192 1.1 christos 2193 1.1 christos 2194 1.1 christos /****************************************************************************** 2195 1.1 christos * 2196 1.1.1.5 christos * FUNCTION: DtCompileSdev 2197 1.1.1.5 christos * 2198 1.1.1.5 christos * PARAMETERS: List - Current field list pointer 2199 1.1.1.5 christos * 2200 1.1.1.5 christos * RETURN: Status 2201 1.1.1.5 christos * 2202 1.1.1.5 christos * DESCRIPTION: Compile SDEV. 2203 1.1.1.5 christos * 2204 1.1.1.5 christos *****************************************************************************/ 2205 1.1.1.5 christos 2206 1.1.1.5 christos ACPI_STATUS 2207 1.1.1.5 christos DtCompileSdev ( 2208 1.1.1.5 christos void **List) 2209 1.1.1.5 christos { 2210 1.1.1.11 christos ACPI_STATUS Status; 2211 1.1.1.11 christos ACPI_SDEV_HEADER *SdevHeader; 2212 1.1.1.11 christos ACPI_SDEV_HEADER *SecureComponentHeader; 2213 1.1.1.11 christos DT_SUBTABLE *Subtable; 2214 1.1.1.11 christos DT_SUBTABLE *ParentTable; 2215 1.1.1.11 christos ACPI_DMTABLE_INFO *InfoTable; 2216 1.1.1.11 christos ACPI_DMTABLE_INFO *SecureComponentInfoTable = NULL; 2217 1.1.1.11 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2218 1.1.1.11 christos DT_FIELD *SubtableStart; 2219 1.1.1.11 christos ACPI_SDEV_PCIE *Pcie = NULL; 2220 1.1.1.11 christos ACPI_SDEV_NAMESPACE *Namesp = NULL; 2221 1.1.1.11 christos UINT32 EntryCount; 2222 1.1.1.11 christos ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL; 2223 1.1.1.11 christos UINT16 ComponentLength = 0; 2224 1.1.1.5 christos 2225 1.1.1.5 christos 2226 1.1.1.5 christos /* Subtables */ 2227 1.1.1.5 christos 2228 1.1.1.5 christos while (*PFieldList) 2229 1.1.1.5 christos { 2230 1.1.1.5 christos /* Compile common SDEV subtable header */ 2231 1.1.1.5 christos 2232 1.1.1.5 christos SubtableStart = *PFieldList; 2233 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr, 2234 1.1.1.6 christos &Subtable); 2235 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2236 1.1.1.5 christos { 2237 1.1.1.5 christos return (Status); 2238 1.1.1.5 christos } 2239 1.1.1.5 christos 2240 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2241 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2242 1.1.1.5 christos DtPushSubtable (Subtable); 2243 1.1.1.5 christos 2244 1.1.1.5 christos SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); 2245 1.1.1.5 christos SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER)); 2246 1.1.1.5 christos 2247 1.1.1.5 christos switch (SdevHeader->Type) 2248 1.1.1.5 christos { 2249 1.1.1.5 christos case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 2250 1.1.1.5 christos 2251 1.1.1.5 christos InfoTable = AcpiDmTableInfoSdev0; 2252 1.1.1.5 christos Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer); 2253 1.1.1.11 christos SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT, 2254 1.1.1.11 christos ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE))); 2255 1.1.1.5 christos break; 2256 1.1.1.5 christos 2257 1.1.1.5 christos case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 2258 1.1.1.5 christos 2259 1.1.1.5 christos InfoTable = AcpiDmTableInfoSdev1; 2260 1.1.1.5 christos Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer); 2261 1.1.1.5 christos break; 2262 1.1.1.5 christos 2263 1.1.1.5 christos default: 2264 1.1.1.5 christos 2265 1.1.1.5 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); 2266 1.1.1.5 christos return (AE_ERROR); 2267 1.1.1.5 christos } 2268 1.1.1.5 christos 2269 1.1.1.5 christos /* Compile SDEV subtable body */ 2270 1.1.1.5 christos 2271 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2272 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2273 1.1.1.5 christos { 2274 1.1.1.5 christos return (Status); 2275 1.1.1.5 christos } 2276 1.1.1.5 christos 2277 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2278 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2279 1.1.1.5 christos 2280 1.1.1.5 christos /* Optional data fields are appended to the main subtable body */ 2281 1.1.1.5 christos 2282 1.1.1.5 christos switch (SdevHeader->Type) 2283 1.1.1.5 christos { 2284 1.1.1.5 christos case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 2285 1.1.1.5 christos 2286 1.1.1.11 christos /* 2287 1.1.1.11 christos * Device Id Offset will be be calculated differently depending on 2288 1.1.1.11 christos * the presence of secure access components. 2289 1.1.1.11 christos */ 2290 1.1.1.11 christos Namesp->DeviceIdOffset = 0; 2291 1.1.1.11 christos ComponentLength = 0; 2292 1.1.1.11 christos 2293 1.1.1.11 christos /* If the secure access component exists, get the structures */ 2294 1.1.1.11 christos 2295 1.1.1.11 christos if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT) 2296 1.1.1.11 christos { 2297 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b, 2298 1.1.1.11 christos &Subtable); 2299 1.1.1.11 christos if (ACPI_FAILURE (Status)) 2300 1.1.1.11 christos { 2301 1.1.1.11 christos return (Status); 2302 1.1.1.11 christos } 2303 1.1.1.11 christos ParentTable = DtPeekSubtable (); 2304 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 2305 1.1.1.11 christos 2306 1.1.1.11 christos Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT); 2307 1.1.1.11 christos 2308 1.1.1.11 christos /* Compile a secure access component header */ 2309 1.1.1.11 christos 2310 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr, 2311 1.1.1.11 christos &Subtable); 2312 1.1.1.11 christos if (ACPI_FAILURE (Status)) 2313 1.1.1.11 christos { 2314 1.1.1.11 christos return (Status); 2315 1.1.1.11 christos } 2316 1.1.1.11 christos ParentTable = DtPeekSubtable (); 2317 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 2318 1.1.1.11 christos 2319 1.1.1.11 christos /* Compile the secure access component */ 2320 1.1.1.11 christos 2321 1.1.1.11 christos SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); 2322 1.1.1.11 christos switch (SecureComponentHeader->Type) 2323 1.1.1.11 christos { 2324 1.1.1.11 christos case ACPI_SDEV_TYPE_ID_COMPONENT: 2325 1.1.1.11 christos 2326 1.1.1.11 christos SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId; 2327 1.1.1.11 christos Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT); 2328 1.1.1.11 christos ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT); 2329 1.1.1.11 christos break; 2330 1.1.1.11 christos 2331 1.1.1.11 christos case ACPI_SDEV_TYPE_MEM_COMPONENT: 2332 1.1.1.11 christos 2333 1.1.1.11 christos SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem; 2334 1.1.1.11 christos Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT); 2335 1.1.1.11 christos ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT); 2336 1.1.1.11 christos break; 2337 1.1.1.11 christos 2338 1.1.1.11 christos default: 2339 1.1.1.11 christos 2340 1.1.1.11 christos /* Any other secure component types are undefined */ 2341 1.1.1.11 christos 2342 1.1.1.11 christos return (AE_ERROR); 2343 1.1.1.11 christos } 2344 1.1.1.11 christos 2345 1.1.1.11 christos Status = DtCompileTable (PFieldList, SecureComponentInfoTable, 2346 1.1.1.11 christos &Subtable); 2347 1.1.1.11 christos if (ACPI_FAILURE (Status)) 2348 1.1.1.11 christos { 2349 1.1.1.11 christos return (Status); 2350 1.1.1.11 christos } 2351 1.1.1.11 christos ParentTable = DtPeekSubtable (); 2352 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 2353 1.1.1.11 christos 2354 1.1.1.11 christos SecureComponent->SecureComponentOffset = 2355 1.1.1.11 christos sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT); 2356 1.1.1.11 christos SecureComponent->SecureComponentLength = ComponentLength; 2357 1.1.1.11 christos 2358 1.1.1.11 christos 2359 1.1.1.11 christos /* 2360 1.1.1.11 christos * Add the secure component to the subtable to be added for the 2361 1.1.1.11 christos * the namespace subtable's length 2362 1.1.1.11 christos */ 2363 1.1.1.11 christos ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT); 2364 1.1.1.11 christos } 2365 1.1.1.11 christos 2366 1.1.1.5 christos /* Append DeviceId namespace string */ 2367 1.1.1.5 christos 2368 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a, 2369 1.1.1.6 christos &Subtable); 2370 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2371 1.1.1.5 christos { 2372 1.1.1.5 christos return (Status); 2373 1.1.1.5 christos } 2374 1.1.1.5 christos 2375 1.1.1.5 christos if (!Subtable) 2376 1.1.1.5 christos { 2377 1.1.1.5 christos break; 2378 1.1.1.5 christos } 2379 1.1.1.5 christos 2380 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2381 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2382 1.1.1.5 christos 2383 1.1.1.11 christos Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE); 2384 1.1.1.11 christos 2385 1.1.1.5 christos Namesp->DeviceIdLength = (UINT16) Subtable->Length; 2386 1.1.1.5 christos 2387 1.1.1.5 christos /* Append Vendor data */ 2388 1.1.1.5 christos 2389 1.1.1.5 christos Namesp->VendorDataLength = 0; 2390 1.1.1.5 christos Namesp->VendorDataOffset = 0; 2391 1.1.1.5 christos 2392 1.1.1.5 christos if (*PFieldList) 2393 1.1.1.5 christos { 2394 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, 2395 1.1.1.6 christos &Subtable); 2396 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2397 1.1.1.5 christos { 2398 1.1.1.5 christos return (Status); 2399 1.1.1.5 christos } 2400 1.1.1.5 christos 2401 1.1.1.5 christos if (Subtable) 2402 1.1.1.5 christos { 2403 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2404 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2405 1.1.1.5 christos 2406 1.1.1.5 christos Namesp->VendorDataOffset = 2407 1.1.1.5 christos Namesp->DeviceIdOffset + Namesp->DeviceIdLength; 2408 1.1.1.5 christos Namesp->VendorDataLength = 2409 1.1.1.5 christos (UINT16) Subtable->Length; 2410 1.1.1.9 christos 2411 1.1.1.9 christos /* Final size of entire namespace structure */ 2412 1.1.1.9 christos 2413 1.1.1.9 christos SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) + 2414 1.1.1.11 christos Subtable->Length + Namesp->DeviceIdLength) + ComponentLength; 2415 1.1.1.5 christos } 2416 1.1.1.5 christos } 2417 1.1.1.5 christos 2418 1.1.1.5 christos break; 2419 1.1.1.5 christos 2420 1.1.1.5 christos case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 2421 1.1.1.5 christos 2422 1.1.1.5 christos /* Append the PCIe path info first */ 2423 1.1.1.5 christos 2424 1.1.1.5 christos EntryCount = 0; 2425 1.1.1.5 christos while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device")) 2426 1.1.1.5 christos { 2427 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a, 2428 1.1.1.6 christos &Subtable); 2429 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2430 1.1.1.5 christos { 2431 1.1.1.5 christos return (Status); 2432 1.1.1.5 christos } 2433 1.1.1.5 christos 2434 1.1.1.5 christos if (!Subtable) 2435 1.1.1.5 christos { 2436 1.1.1.5 christos DtPopSubtable (); 2437 1.1.1.5 christos break; 2438 1.1.1.5 christos } 2439 1.1.1.5 christos 2440 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2441 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2442 1.1.1.5 christos EntryCount++; 2443 1.1.1.5 christos } 2444 1.1.1.5 christos 2445 1.1.1.5 christos /* Path offset will point immediately after the main subtable */ 2446 1.1.1.5 christos 2447 1.1.1.5 christos Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE); 2448 1.1.1.5 christos Pcie->PathLength = (UINT16) 2449 1.1.1.5 christos (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH)); 2450 1.1.1.5 christos 2451 1.1.1.5 christos /* Append the Vendor Data last */ 2452 1.1.1.5 christos 2453 1.1.1.5 christos Pcie->VendorDataLength = 0; 2454 1.1.1.5 christos Pcie->VendorDataOffset = 0; 2455 1.1.1.5 christos 2456 1.1.1.5 christos if (*PFieldList) 2457 1.1.1.5 christos { 2458 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, 2459 1.1.1.6 christos &Subtable); 2460 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2461 1.1.1.5 christos { 2462 1.1.1.5 christos return (Status); 2463 1.1.1.5 christos } 2464 1.1.1.5 christos 2465 1.1.1.5 christos if (Subtable) 2466 1.1.1.5 christos { 2467 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2468 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2469 1.1.1.5 christos 2470 1.1.1.5 christos Pcie->VendorDataOffset = 2471 1.1.1.5 christos Pcie->PathOffset + Pcie->PathLength; 2472 1.1.1.5 christos Pcie->VendorDataLength = (UINT16) 2473 1.1.1.5 christos Subtable->Length; 2474 1.1.1.5 christos } 2475 1.1.1.5 christos } 2476 1.1.1.5 christos 2477 1.1.1.5 christos SdevHeader->Length = 2478 1.1.1.5 christos sizeof (ACPI_SDEV_PCIE) + 2479 1.1.1.5 christos Pcie->PathLength + Pcie->VendorDataLength; 2480 1.1.1.5 christos break; 2481 1.1.1.5 christos 2482 1.1.1.5 christos default: 2483 1.1.1.5 christos 2484 1.1.1.5 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); 2485 1.1.1.5 christos return (AE_ERROR); 2486 1.1.1.5 christos } 2487 1.1.1.5 christos 2488 1.1.1.5 christos DtPopSubtable (); 2489 1.1.1.5 christos } 2490 1.1.1.5 christos 2491 1.1.1.5 christos return (AE_OK); 2492 1.1.1.5 christos } 2493 1.1.1.5 christos 2494 1.1.1.5 christos 2495 1.1.1.5 christos /****************************************************************************** 2496 1.1.1.5 christos * 2497 1.1 christos * FUNCTION: DtCompileSlic 2498 1.1 christos * 2499 1.1 christos * PARAMETERS: List - Current field list pointer 2500 1.1 christos * 2501 1.1 christos * RETURN: Status 2502 1.1 christos * 2503 1.1 christos * DESCRIPTION: Compile SLIC. 2504 1.1 christos * 2505 1.1 christos *****************************************************************************/ 2506 1.1 christos 2507 1.1 christos ACPI_STATUS 2508 1.1 christos DtCompileSlic ( 2509 1.1 christos void **List) 2510 1.1 christos { 2511 1.1 christos ACPI_STATUS Status; 2512 1.1 christos DT_SUBTABLE *Subtable; 2513 1.1 christos DT_SUBTABLE *ParentTable; 2514 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2515 1.1 christos 2516 1.1 christos 2517 1.1 christos while (*PFieldList) 2518 1.1 christos { 2519 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic, 2520 1.1.1.6 christos &Subtable); 2521 1.1 christos if (ACPI_FAILURE (Status)) 2522 1.1 christos { 2523 1.1 christos return (Status); 2524 1.1 christos } 2525 1.1 christos 2526 1.1 christos ParentTable = DtPeekSubtable (); 2527 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2528 1.1 christos DtPushSubtable (Subtable); 2529 1.1 christos DtPopSubtable (); 2530 1.1 christos } 2531 1.1 christos 2532 1.1 christos return (AE_OK); 2533 1.1 christos } 2534 1.1 christos 2535 1.1 christos 2536 1.1 christos /****************************************************************************** 2537 1.1 christos * 2538 1.1 christos * FUNCTION: DtCompileSlit 2539 1.1 christos * 2540 1.1 christos * PARAMETERS: List - Current field list pointer 2541 1.1 christos * 2542 1.1 christos * RETURN: Status 2543 1.1 christos * 2544 1.1 christos * DESCRIPTION: Compile SLIT. 2545 1.1 christos * 2546 1.1 christos *****************************************************************************/ 2547 1.1 christos 2548 1.1 christos ACPI_STATUS 2549 1.1 christos DtCompileSlit ( 2550 1.1 christos void **List) 2551 1.1 christos { 2552 1.1 christos ACPI_STATUS Status; 2553 1.1 christos DT_SUBTABLE *Subtable; 2554 1.1 christos DT_SUBTABLE *ParentTable; 2555 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2556 1.1 christos DT_FIELD *FieldList; 2557 1.1.1.9 christos DT_FIELD *EndOfFieldList = NULL; 2558 1.1 christos UINT32 Localities; 2559 1.1.1.9 christos UINT32 LocalityListLength; 2560 1.1 christos UINT8 *LocalityBuffer; 2561 1.1 christos 2562 1.1 christos 2563 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, 2564 1.1.1.6 christos &Subtable); 2565 1.1 christos if (ACPI_FAILURE (Status)) 2566 1.1 christos { 2567 1.1 christos return (Status); 2568 1.1 christos } 2569 1.1 christos 2570 1.1 christos ParentTable = DtPeekSubtable (); 2571 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2572 1.1 christos 2573 1.1 christos Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); 2574 1.1 christos LocalityBuffer = UtLocalCalloc (Localities); 2575 1.1.1.9 christos LocalityListLength = 0; 2576 1.1 christos 2577 1.1 christos /* Compile each locality buffer */ 2578 1.1 christos 2579 1.1 christos FieldList = *PFieldList; 2580 1.1 christos while (FieldList) 2581 1.1 christos { 2582 1.1 christos DtCompileBuffer (LocalityBuffer, 2583 1.1 christos FieldList->Value, FieldList, Localities); 2584 1.1 christos 2585 1.1.1.9 christos LocalityListLength++; 2586 1.1 christos DtCreateSubtable (LocalityBuffer, Localities, &Subtable); 2587 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2588 1.1.1.9 christos EndOfFieldList = FieldList; 2589 1.1 christos FieldList = FieldList->Next; 2590 1.1 christos } 2591 1.1 christos 2592 1.1.1.9 christos if (LocalityListLength != Localities) 2593 1.1.1.9 christos { 2594 1.1.1.9 christos sprintf(AslGbl_MsgBuffer, 2595 1.1.1.9 christos "Found %u entries, must match LocalityCount: %u", 2596 1.1.1.9 christos LocalityListLength, Localities); 2597 1.1.1.9 christos DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer); 2598 1.1.1.9 christos ACPI_FREE (LocalityBuffer); 2599 1.1.1.9 christos return (AE_LIMIT); 2600 1.1.1.9 christos } 2601 1.1.1.9 christos 2602 1.1 christos ACPI_FREE (LocalityBuffer); 2603 1.1 christos return (AE_OK); 2604 1.1 christos } 2605 1.1 christos 2606 1.1 christos 2607 1.1 christos /****************************************************************************** 2608 1.1 christos * 2609 1.1 christos * FUNCTION: DtCompileSrat 2610 1.1 christos * 2611 1.1 christos * PARAMETERS: List - Current field list pointer 2612 1.1 christos * 2613 1.1 christos * RETURN: Status 2614 1.1 christos * 2615 1.1 christos * DESCRIPTION: Compile SRAT. 2616 1.1 christos * 2617 1.1 christos *****************************************************************************/ 2618 1.1 christos 2619 1.1 christos ACPI_STATUS 2620 1.1 christos DtCompileSrat ( 2621 1.1 christos void **List) 2622 1.1 christos { 2623 1.1 christos ACPI_STATUS Status; 2624 1.1 christos DT_SUBTABLE *Subtable; 2625 1.1 christos DT_SUBTABLE *ParentTable; 2626 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2627 1.1 christos DT_FIELD *SubtableStart; 2628 1.1 christos ACPI_SUBTABLE_HEADER *SratHeader; 2629 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 2630 1.1 christos 2631 1.1 christos 2632 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat, 2633 1.1.1.6 christos &Subtable); 2634 1.1 christos if (ACPI_FAILURE (Status)) 2635 1.1 christos { 2636 1.1 christos return (Status); 2637 1.1 christos } 2638 1.1 christos 2639 1.1 christos ParentTable = DtPeekSubtable (); 2640 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2641 1.1 christos 2642 1.1 christos while (*PFieldList) 2643 1.1 christos { 2644 1.1 christos SubtableStart = *PFieldList; 2645 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr, 2646 1.1.1.6 christos &Subtable); 2647 1.1 christos if (ACPI_FAILURE (Status)) 2648 1.1 christos { 2649 1.1 christos return (Status); 2650 1.1 christos } 2651 1.1 christos 2652 1.1 christos ParentTable = DtPeekSubtable (); 2653 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2654 1.1 christos DtPushSubtable (Subtable); 2655 1.1 christos 2656 1.1 christos SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 2657 1.1 christos 2658 1.1 christos switch (SratHeader->Type) 2659 1.1 christos { 2660 1.1 christos case ACPI_SRAT_TYPE_CPU_AFFINITY: 2661 1.1 christos 2662 1.1 christos InfoTable = AcpiDmTableInfoSrat0; 2663 1.1 christos break; 2664 1.1 christos 2665 1.1 christos case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 2666 1.1 christos 2667 1.1 christos InfoTable = AcpiDmTableInfoSrat1; 2668 1.1 christos break; 2669 1.1 christos 2670 1.1 christos case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 2671 1.1 christos 2672 1.1 christos InfoTable = AcpiDmTableInfoSrat2; 2673 1.1 christos break; 2674 1.1 christos 2675 1.1 christos case ACPI_SRAT_TYPE_GICC_AFFINITY: 2676 1.1 christos 2677 1.1 christos InfoTable = AcpiDmTableInfoSrat3; 2678 1.1 christos break; 2679 1.1 christos 2680 1.1.1.4 christos case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY: 2681 1.1.1.4 christos 2682 1.1.1.4 christos InfoTable = AcpiDmTableInfoSrat4; 2683 1.1.1.4 christos break; 2684 1.1.1.4 christos 2685 1.1.1.8 christos case ACPI_SRAT_TYPE_GENERIC_AFFINITY: 2686 1.1.1.8 christos 2687 1.1.1.8 christos InfoTable = AcpiDmTableInfoSrat5; 2688 1.1.1.8 christos break; 2689 1.1.1.8 christos 2690 1.1.1.13 christos case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY: 2691 1.1.1.13 christos 2692 1.1.1.13 christos InfoTable = AcpiDmTableInfoSrat6; 2693 1.1.1.13 christos break; 2694 1.1.1.13 christos 2695 1.1.1.18 christos case ACPI_SRAT_TYPE_RINTC_AFFINITY: 2696 1.1.1.18 christos 2697 1.1.1.18 christos InfoTable = AcpiDmTableInfoSrat7; 2698 1.1.1.18 christos break; 2699 1.1.1.18 christos 2700 1.1 christos default: 2701 1.1 christos 2702 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT"); 2703 1.1 christos return (AE_ERROR); 2704 1.1 christos } 2705 1.1 christos 2706 1.1.1.6 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2707 1.1 christos if (ACPI_FAILURE (Status)) 2708 1.1 christos { 2709 1.1 christos return (Status); 2710 1.1 christos } 2711 1.1 christos 2712 1.1 christos ParentTable = DtPeekSubtable (); 2713 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2714 1.1 christos DtPopSubtable (); 2715 1.1 christos } 2716 1.1 christos 2717 1.1 christos return (AE_OK); 2718 1.1 christos } 2719 1.1 christos 2720 1.1 christos 2721 1.1 christos /****************************************************************************** 2722 1.1 christos * 2723 1.1 christos * FUNCTION: DtCompileStao 2724 1.1 christos * 2725 1.1 christos * PARAMETERS: PFieldList - Current field list pointer 2726 1.1 christos * 2727 1.1 christos * RETURN: Status 2728 1.1 christos * 2729 1.1 christos * DESCRIPTION: Compile STAO. 2730 1.1 christos * 2731 1.1 christos *****************************************************************************/ 2732 1.1 christos 2733 1.1 christos ACPI_STATUS 2734 1.1 christos DtCompileStao ( 2735 1.1 christos void **List) 2736 1.1 christos { 2737 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2738 1.1 christos DT_SUBTABLE *Subtable; 2739 1.1 christos DT_SUBTABLE *ParentTable; 2740 1.1 christos ACPI_STATUS Status; 2741 1.1 christos 2742 1.1 christos 2743 1.1 christos /* Compile the main table */ 2744 1.1 christos 2745 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao, 2746 1.1.1.6 christos &Subtable); 2747 1.1 christos if (ACPI_FAILURE (Status)) 2748 1.1 christos { 2749 1.1 christos return (Status); 2750 1.1 christos } 2751 1.1 christos 2752 1.1 christos ParentTable = DtPeekSubtable (); 2753 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2754 1.1 christos 2755 1.1 christos /* Compile each ASCII namestring as a subtable */ 2756 1.1 christos 2757 1.1 christos while (*PFieldList) 2758 1.1 christos { 2759 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr, 2760 1.1.1.6 christos &Subtable); 2761 1.1 christos if (ACPI_FAILURE (Status)) 2762 1.1 christos { 2763 1.1 christos return (Status); 2764 1.1 christos } 2765 1.1 christos 2766 1.1 christos ParentTable = DtPeekSubtable (); 2767 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2768 1.1 christos } 2769 1.1 christos 2770 1.1 christos return (AE_OK); 2771 1.1 christos } 2772 1.1 christos 2773 1.1 christos 2774 1.1.1.12 christos /****************************************************************************** 2775 1.1.1.12 christos * 2776 1.1.1.12 christos * FUNCTION: DtCompileSvkl 2777 1.1.1.12 christos * 2778 1.1.1.12 christos * PARAMETERS: PFieldList - Current field list pointer 2779 1.1.1.12 christos * 2780 1.1.1.12 christos * RETURN: Status 2781 1.1.1.12 christos * 2782 1.1.1.12 christos * DESCRIPTION: Compile SVKL. 2783 1.1.1.12 christos * 2784 1.1.1.12 christos * NOTES: SVKL is essentially a flat table, with a small main table and 2785 1.1.1.12 christos * a variable number of a single type of subtable. 2786 1.1.1.12 christos * 2787 1.1.1.12 christos *****************************************************************************/ 2788 1.1.1.12 christos 2789 1.1.1.12 christos ACPI_STATUS 2790 1.1.1.12 christos DtCompileSvkl ( 2791 1.1.1.12 christos void **List) 2792 1.1.1.12 christos { 2793 1.1.1.12 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2794 1.1.1.12 christos DT_SUBTABLE *Subtable; 2795 1.1.1.12 christos DT_SUBTABLE *ParentTable; 2796 1.1.1.12 christos ACPI_STATUS Status; 2797 1.1.1.12 christos 2798 1.1.1.12 christos 2799 1.1.1.12 christos /* Compile the main table */ 2800 1.1.1.12 christos 2801 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl, 2802 1.1.1.12 christos &Subtable); 2803 1.1.1.12 christos if (ACPI_FAILURE (Status)) 2804 1.1.1.12 christos { 2805 1.1.1.12 christos return (Status); 2806 1.1.1.12 christos } 2807 1.1.1.12 christos 2808 1.1.1.12 christos ParentTable = DtPeekSubtable (); 2809 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 2810 1.1.1.12 christos 2811 1.1.1.12 christos /* Compile each subtable */ 2812 1.1.1.12 christos 2813 1.1.1.12 christos while (*PFieldList) 2814 1.1.1.12 christos { 2815 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0, 2816 1.1.1.12 christos &Subtable); 2817 1.1.1.12 christos if (ACPI_FAILURE (Status)) 2818 1.1.1.12 christos { 2819 1.1.1.12 christos return (Status); 2820 1.1.1.12 christos } 2821 1.1.1.12 christos 2822 1.1.1.12 christos ParentTable = DtPeekSubtable (); 2823 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 2824 1.1.1.12 christos } 2825 1.1.1.12 christos 2826 1.1.1.12 christos return (AE_OK); 2827 1.1.1.12 christos } 2828 1.1.1.12 christos 2829 1.1.1.12 christos 2830 1.1 christos /****************************************************************************** 2831 1.1 christos * 2832 1.1 christos * FUNCTION: DtCompileTcpa 2833 1.1 christos * 2834 1.1 christos * PARAMETERS: PFieldList - Current field list pointer 2835 1.1 christos * 2836 1.1 christos * RETURN: Status 2837 1.1 christos * 2838 1.1 christos * DESCRIPTION: Compile TCPA. 2839 1.1 christos * 2840 1.1 christos *****************************************************************************/ 2841 1.1 christos 2842 1.1 christos ACPI_STATUS 2843 1.1 christos DtCompileTcpa ( 2844 1.1 christos void **List) 2845 1.1 christos { 2846 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2847 1.1 christos DT_SUBTABLE *Subtable; 2848 1.1 christos ACPI_TABLE_TCPA_HDR *TcpaHeader; 2849 1.1 christos DT_SUBTABLE *ParentTable; 2850 1.1 christos ACPI_STATUS Status; 2851 1.1 christos 2852 1.1 christos 2853 1.1 christos /* Compile the main table */ 2854 1.1 christos 2855 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr, 2856 1.1.1.6 christos &Subtable); 2857 1.1 christos if (ACPI_FAILURE (Status)) 2858 1.1 christos { 2859 1.1 christos return (Status); 2860 1.1 christos } 2861 1.1 christos 2862 1.1 christos ParentTable = DtPeekSubtable (); 2863 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2864 1.1 christos 2865 1.1 christos /* 2866 1.1 christos * Examine the PlatformClass field to determine the table type. 2867 1.1 christos * Either a client or server table. Only one. 2868 1.1 christos */ 2869 1.1 christos TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer); 2870 1.1 christos 2871 1.1 christos switch (TcpaHeader->PlatformClass) 2872 1.1 christos { 2873 1.1 christos case ACPI_TCPA_CLIENT_TABLE: 2874 1.1 christos 2875 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient, 2876 1.1.1.6 christos &Subtable); 2877 1.1 christos break; 2878 1.1 christos 2879 1.1 christos case ACPI_TCPA_SERVER_TABLE: 2880 1.1 christos 2881 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer, 2882 1.1.1.6 christos &Subtable); 2883 1.1 christos break; 2884 1.1 christos 2885 1.1 christos default: 2886 1.1 christos 2887 1.1 christos AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n", 2888 1.1 christos TcpaHeader->PlatformClass); 2889 1.1 christos Status = AE_ERROR; 2890 1.1 christos break; 2891 1.1 christos } 2892 1.1 christos 2893 1.1 christos ParentTable = DtPeekSubtable (); 2894 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2895 1.1 christos return (Status); 2896 1.1 christos } 2897 1.1 christos 2898 1.1 christos 2899 1.1 christos /****************************************************************************** 2900 1.1 christos * 2901 1.1.1.7 christos * FUNCTION: DtCompileTpm2Rev3 2902 1.1.1.7 christos * 2903 1.1.1.7 christos * PARAMETERS: PFieldList - Current field list pointer 2904 1.1.1.7 christos * 2905 1.1.1.7 christos * RETURN: Status 2906 1.1.1.7 christos * 2907 1.1.1.7 christos * DESCRIPTION: Compile TPM2 revision 3 2908 1.1.1.7 christos * 2909 1.1.1.7 christos *****************************************************************************/ 2910 1.1.1.7 christos static ACPI_STATUS 2911 1.1.1.7 christos DtCompileTpm2Rev3 ( 2912 1.1.1.7 christos void **List) 2913 1.1.1.7 christos { 2914 1.1.1.7 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2915 1.1.1.7 christos DT_SUBTABLE *Subtable; 2916 1.1.1.7 christos ACPI_TABLE_TPM23 *Tpm23Header; 2917 1.1.1.7 christos DT_SUBTABLE *ParentTable; 2918 1.1.1.7 christos ACPI_STATUS Status = AE_OK; 2919 1.1.1.7 christos 2920 1.1.1.7 christos 2921 1.1.1.7 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23, 2922 1.1.1.7 christos &Subtable); 2923 1.1.1.7 christos 2924 1.1.1.7 christos ParentTable = DtPeekSubtable (); 2925 1.1.1.7 christos DtInsertSubtable (ParentTable, Subtable); 2926 1.1.1.7 christos Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer); 2927 1.1.1.7 christos 2928 1.1.1.7 christos /* Subtable type depends on the StartMethod */ 2929 1.1.1.7 christos 2930 1.1.1.7 christos switch (Tpm23Header->StartMethod) 2931 1.1.1.7 christos { 2932 1.1.1.7 christos case ACPI_TPM23_ACPI_START_METHOD: 2933 1.1.1.7 christos 2934 1.1.1.7 christos /* Subtable specific to to ARM_SMC */ 2935 1.1.1.7 christos 2936 1.1.1.7 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a, 2937 1.1.1.7 christos &Subtable); 2938 1.1.1.7 christos if (ACPI_FAILURE (Status)) 2939 1.1.1.7 christos { 2940 1.1.1.7 christos return (Status); 2941 1.1.1.7 christos } 2942 1.1.1.7 christos 2943 1.1.1.7 christos ParentTable = DtPeekSubtable (); 2944 1.1.1.7 christos DtInsertSubtable (ParentTable, Subtable); 2945 1.1.1.7 christos break; 2946 1.1.1.7 christos 2947 1.1.1.7 christos default: 2948 1.1.1.7 christos break; 2949 1.1.1.7 christos } 2950 1.1.1.7 christos 2951 1.1.1.7 christos return (Status); 2952 1.1.1.7 christos } 2953 1.1.1.7 christos 2954 1.1.1.7 christos 2955 1.1.1.7 christos /****************************************************************************** 2956 1.1.1.7 christos * 2957 1.1.1.5 christos * FUNCTION: DtCompileTpm2 2958 1.1.1.5 christos * 2959 1.1.1.5 christos * PARAMETERS: PFieldList - Current field list pointer 2960 1.1.1.5 christos * 2961 1.1.1.5 christos * RETURN: Status 2962 1.1.1.5 christos * 2963 1.1.1.5 christos * DESCRIPTION: Compile TPM2. 2964 1.1.1.5 christos * 2965 1.1.1.5 christos *****************************************************************************/ 2966 1.1.1.5 christos 2967 1.1.1.5 christos ACPI_STATUS 2968 1.1.1.5 christos DtCompileTpm2 ( 2969 1.1.1.5 christos void **List) 2970 1.1.1.5 christos { 2971 1.1.1.5 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2972 1.1.1.5 christos DT_SUBTABLE *Subtable; 2973 1.1.1.5 christos ACPI_TABLE_TPM2 *Tpm2Header; 2974 1.1.1.5 christos DT_SUBTABLE *ParentTable; 2975 1.1.1.5 christos ACPI_STATUS Status = AE_OK; 2976 1.1.1.7 christos ACPI_TABLE_HEADER *Header; 2977 1.1.1.5 christos 2978 1.1.1.5 christos 2979 1.1.1.7 christos ParentTable = DtPeekSubtable (); 2980 1.1.1.7 christos 2981 1.1.1.7 christos Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 2982 1.1.1.7 christos 2983 1.1.1.7 christos if (Header->Revision == 3) 2984 1.1.1.7 christos { 2985 1.1.1.7 christos return (DtCompileTpm2Rev3 (List)); 2986 1.1.1.7 christos } 2987 1.1.1.7 christos 2988 1.1.1.5 christos /* Compile the main table */ 2989 1.1.1.5 christos 2990 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2, 2991 1.1.1.6 christos &Subtable); 2992 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2993 1.1.1.5 christos { 2994 1.1.1.5 christos return (Status); 2995 1.1.1.5 christos } 2996 1.1.1.5 christos 2997 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2998 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2999 1.1.1.5 christos 3000 1.1.1.5 christos Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer); 3001 1.1.1.5 christos 3002 1.1.1.5 christos /* Method parameters */ 3003 1.1.1.5 christos /* Optional: Log area minimum length */ 3004 1.1.1.5 christos /* Optional: Log area start address */ 3005 1.1.1.5 christos /* TBD: Optional fields above not fully implemented (not optional at this time) */ 3006 1.1.1.5 christos 3007 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a, 3008 1.1.1.6 christos &Subtable); 3009 1.1.1.5 christos if (ACPI_FAILURE (Status)) 3010 1.1.1.5 christos { 3011 1.1.1.5 christos return (Status); 3012 1.1.1.5 christos } 3013 1.1.1.5 christos 3014 1.1.1.5 christos ParentTable = DtPeekSubtable (); 3015 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 3016 1.1.1.5 christos 3017 1.1.1.5 christos 3018 1.1.1.5 christos /* Subtable type depends on the StartMethod */ 3019 1.1.1.5 christos 3020 1.1.1.5 christos switch (Tpm2Header->StartMethod) 3021 1.1.1.5 christos { 3022 1.1.1.5 christos case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC: 3023 1.1.1.5 christos 3024 1.1.1.5 christos /* Subtable specific to to ARM_SMC */ 3025 1.1.1.5 christos 3026 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211, 3027 1.1.1.6 christos &Subtable); 3028 1.1.1.5 christos if (ACPI_FAILURE (Status)) 3029 1.1.1.5 christos { 3030 1.1.1.5 christos return (Status); 3031 1.1.1.5 christos } 3032 1.1.1.5 christos 3033 1.1.1.5 christos ParentTable = DtPeekSubtable (); 3034 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 3035 1.1.1.5 christos break; 3036 1.1.1.5 christos 3037 1.1.1.5 christos case ACPI_TPM2_START_METHOD: 3038 1.1.1.5 christos case ACPI_TPM2_MEMORY_MAPPED: 3039 1.1.1.5 christos case ACPI_TPM2_COMMAND_BUFFER: 3040 1.1.1.5 christos case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD: 3041 1.1.1.5 christos break; 3042 1.1.1.5 christos 3043 1.1.1.5 christos case ACPI_TPM2_RESERVED1: 3044 1.1.1.5 christos case ACPI_TPM2_RESERVED3: 3045 1.1.1.5 christos case ACPI_TPM2_RESERVED4: 3046 1.1.1.5 christos case ACPI_TPM2_RESERVED5: 3047 1.1.1.5 christos case ACPI_TPM2_RESERVED9: 3048 1.1.1.5 christos case ACPI_TPM2_RESERVED10: 3049 1.1.1.5 christos 3050 1.1.1.5 christos AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n", 3051 1.1.1.5 christos Tpm2Header->StartMethod); 3052 1.1.1.5 christos Status = AE_ERROR; 3053 1.1.1.5 christos break; 3054 1.1.1.5 christos 3055 1.1.1.5 christos case ACPI_TPM2_NOT_ALLOWED: 3056 1.1.1.5 christos default: 3057 1.1.1.5 christos 3058 1.1.1.5 christos AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n", 3059 1.1.1.5 christos Tpm2Header->StartMethod); 3060 1.1.1.5 christos Status = AE_ERROR; 3061 1.1.1.5 christos break; 3062 1.1.1.5 christos } 3063 1.1.1.5 christos 3064 1.1.1.5 christos return (Status); 3065 1.1.1.5 christos } 3066 1.1.1.5 christos 3067 1.1.1.5 christos 3068 1.1.1.5 christos /****************************************************************************** 3069 1.1.1.5 christos * 3070 1.1 christos * FUNCTION: DtGetGenericTableInfo 3071 1.1 christos * 3072 1.1 christos * PARAMETERS: Name - Generic type name 3073 1.1 christos * 3074 1.1 christos * RETURN: Info entry 3075 1.1 christos * 3076 1.1 christos * DESCRIPTION: Obtain table info for a generic name entry 3077 1.1 christos * 3078 1.1 christos *****************************************************************************/ 3079 1.1 christos 3080 1.1 christos ACPI_DMTABLE_INFO * 3081 1.1 christos DtGetGenericTableInfo ( 3082 1.1 christos char *Name) 3083 1.1 christos { 3084 1.1 christos ACPI_DMTABLE_INFO *Info; 3085 1.1 christos UINT32 i; 3086 1.1 christos 3087 1.1 christos 3088 1.1 christos if (!Name) 3089 1.1 christos { 3090 1.1 christos return (NULL); 3091 1.1 christos } 3092 1.1 christos 3093 1.1 christos /* Search info table for name match */ 3094 1.1 christos 3095 1.1 christos for (i = 0; ; i++) 3096 1.1 christos { 3097 1.1 christos Info = AcpiDmTableInfoGeneric[i]; 3098 1.1 christos if (Info->Opcode == ACPI_DMT_EXIT) 3099 1.1 christos { 3100 1.1 christos Info = NULL; 3101 1.1 christos break; 3102 1.1 christos } 3103 1.1 christos 3104 1.1 christos /* Use caseless compare for generic keywords */ 3105 1.1 christos 3106 1.1 christos if (!AcpiUtStricmp (Name, Info->Name)) 3107 1.1 christos { 3108 1.1 christos break; 3109 1.1 christos } 3110 1.1 christos } 3111 1.1 christos 3112 1.1 christos return (Info); 3113 1.1 christos } 3114 1.1 christos 3115 1.1 christos 3116 1.1 christos /****************************************************************************** 3117 1.1 christos * 3118 1.1 christos * FUNCTION: DtCompileUefi 3119 1.1 christos * 3120 1.1 christos * PARAMETERS: List - Current field list pointer 3121 1.1 christos * 3122 1.1 christos * RETURN: Status 3123 1.1 christos * 3124 1.1 christos * DESCRIPTION: Compile UEFI. 3125 1.1 christos * 3126 1.1 christos *****************************************************************************/ 3127 1.1 christos 3128 1.1 christos ACPI_STATUS 3129 1.1 christos DtCompileUefi ( 3130 1.1 christos void **List) 3131 1.1 christos { 3132 1.1 christos ACPI_STATUS Status; 3133 1.1 christos DT_SUBTABLE *Subtable; 3134 1.1 christos DT_SUBTABLE *ParentTable; 3135 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 3136 1.1 christos UINT16 *DataOffset; 3137 1.1 christos 3138 1.1 christos 3139 1.1 christos /* Compile the predefined portion of the UEFI table */ 3140 1.1 christos 3141 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi, 3142 1.1.1.6 christos &Subtable); 3143 1.1 christos if (ACPI_FAILURE (Status)) 3144 1.1 christos { 3145 1.1 christos return (Status); 3146 1.1 christos } 3147 1.1 christos 3148 1.1 christos DataOffset = (UINT16 *) (Subtable->Buffer + 16); 3149 1.1 christos *DataOffset = sizeof (ACPI_TABLE_UEFI); 3150 1.1 christos 3151 1.1 christos ParentTable = DtPeekSubtable (); 3152 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3153 1.1 christos 3154 1.1 christos /* 3155 1.1 christos * Compile the "generic" portion of the UEFI table. This 3156 1.1 christos * part of the table is not predefined and any of the generic 3157 1.1 christos * operators may be used. 3158 1.1 christos */ 3159 1.1 christos DtCompileGeneric ((void **) PFieldList, NULL, NULL); 3160 1.1 christos return (AE_OK); 3161 1.1 christos } 3162 1.1 christos 3163 1.1 christos 3164 1.1 christos /****************************************************************************** 3165 1.1 christos * 3166 1.1.1.11 christos * FUNCTION: DtCompileViot 3167 1.1 christos * 3168 1.1 christos * PARAMETERS: List - Current field list pointer 3169 1.1 christos * 3170 1.1 christos * RETURN: Status 3171 1.1 christos * 3172 1.1.1.11 christos * DESCRIPTION: Compile VIOT. 3173 1.1 christos * 3174 1.1 christos *****************************************************************************/ 3175 1.1 christos 3176 1.1 christos ACPI_STATUS 3177 1.1.1.11 christos DtCompileViot ( 3178 1.1 christos void **List) 3179 1.1 christos { 3180 1.1 christos ACPI_STATUS Status; 3181 1.1.1.11 christos DT_SUBTABLE *Subtable; 3182 1.1.1.11 christos DT_SUBTABLE *ParentTable; 3183 1.1.1.11 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 3184 1.1.1.11 christos DT_FIELD *SubtableStart; 3185 1.1.1.11 christos ACPI_TABLE_VIOT *Viot; 3186 1.1.1.11 christos ACPI_VIOT_HEADER *ViotHeader; 3187 1.1.1.11 christos ACPI_DMTABLE_INFO *InfoTable; 3188 1.1.1.11 christos UINT16 NodeCount; 3189 1.1 christos 3190 1.1.1.11 christos ParentTable = DtPeekSubtable (); 3191 1.1 christos 3192 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable); 3193 1.1.1.11 christos if (ACPI_FAILURE (Status)) 3194 1.1.1.11 christos { 3195 1.1.1.11 christos return (Status); 3196 1.1.1.11 christos } 3197 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 3198 1.1.1.11 christos 3199 1.1.1.11 christos /* 3200 1.1.1.11 christos * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 3201 1.1.1.11 christos * should be taken to avoid accessing ACPI_TABLE_HEADER fields. 3202 1.1.1.11 christos */ 3203 1.1.1.11 christos Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer, 3204 1.1.1.11 christos sizeof (ACPI_TABLE_HEADER)); 3205 1.1.1.11 christos 3206 1.1.1.11 christos Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT); 3207 1.1.1.11 christos 3208 1.1.1.11 christos NodeCount = 0; 3209 1.1.1.11 christos while (*PFieldList) { 3210 1.1.1.11 christos SubtableStart = *PFieldList; 3211 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader, 3212 1.1.1.11 christos &Subtable); 3213 1.1.1.11 christos if (ACPI_FAILURE (Status)) 3214 1.1.1.11 christos { 3215 1.1.1.11 christos return (Status); 3216 1.1.1.11 christos } 3217 1.1.1.11 christos 3218 1.1.1.11 christos ParentTable = DtPeekSubtable (); 3219 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 3220 1.1.1.11 christos DtPushSubtable (Subtable); 3221 1.1.1.11 christos 3222 1.1.1.11 christos ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer); 3223 1.1.1.11 christos 3224 1.1.1.11 christos switch (ViotHeader->Type) 3225 1.1.1.11 christos { 3226 1.1.1.11 christos case ACPI_VIOT_NODE_PCI_RANGE: 3227 1.1.1.11 christos 3228 1.1.1.11 christos InfoTable = AcpiDmTableInfoViot1; 3229 1.1.1.11 christos break; 3230 1.1.1.11 christos 3231 1.1.1.11 christos case ACPI_VIOT_NODE_MMIO: 3232 1.1.1.11 christos 3233 1.1.1.11 christos InfoTable = AcpiDmTableInfoViot2; 3234 1.1.1.11 christos break; 3235 1.1.1.11 christos 3236 1.1.1.11 christos case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI: 3237 1.1.1.11 christos 3238 1.1.1.11 christos InfoTable = AcpiDmTableInfoViot3; 3239 1.1.1.11 christos break; 3240 1.1.1.11 christos 3241 1.1.1.11 christos case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO: 3242 1.1.1.11 christos 3243 1.1.1.11 christos InfoTable = AcpiDmTableInfoViot4; 3244 1.1.1.11 christos break; 3245 1.1.1.11 christos 3246 1.1.1.11 christos default: 3247 1.1.1.11 christos 3248 1.1.1.11 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT"); 3249 1.1.1.11 christos return (AE_ERROR); 3250 1.1.1.11 christos } 3251 1.1.1.11 christos 3252 1.1.1.11 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 3253 1.1.1.11 christos if (ACPI_FAILURE (Status)) 3254 1.1.1.11 christos { 3255 1.1.1.11 christos return (Status); 3256 1.1.1.11 christos } 3257 1.1.1.11 christos 3258 1.1.1.11 christos ParentTable = DtPeekSubtable (); 3259 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 3260 1.1.1.11 christos DtPopSubtable (); 3261 1.1.1.11 christos NodeCount++; 3262 1.1.1.11 christos } 3263 1.1.1.11 christos 3264 1.1.1.11 christos Viot->NodeCount = NodeCount; 3265 1.1.1.11 christos return (AE_OK); 3266 1.1 christos } 3267 1.1 christos 3268 1.1 christos 3269 1.1 christos /****************************************************************************** 3270 1.1 christos * 3271 1.1 christos * FUNCTION: DtCompileWdat 3272 1.1 christos * 3273 1.1 christos * PARAMETERS: List - Current field list pointer 3274 1.1 christos * 3275 1.1 christos * RETURN: Status 3276 1.1 christos * 3277 1.1 christos * DESCRIPTION: Compile WDAT. 3278 1.1 christos * 3279 1.1 christos *****************************************************************************/ 3280 1.1 christos 3281 1.1 christos ACPI_STATUS 3282 1.1 christos DtCompileWdat ( 3283 1.1 christos void **List) 3284 1.1 christos { 3285 1.1 christos ACPI_STATUS Status; 3286 1.1 christos 3287 1.1 christos 3288 1.1 christos Status = DtCompileTwoSubtables (List, 3289 1.1 christos AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0); 3290 1.1 christos return (Status); 3291 1.1 christos } 3292 1.1 christos 3293 1.1 christos 3294 1.1 christos /****************************************************************************** 3295 1.1 christos * 3296 1.1 christos * FUNCTION: DtCompileWpbt 3297 1.1 christos * 3298 1.1 christos * PARAMETERS: List - Current field list pointer 3299 1.1 christos * 3300 1.1 christos * RETURN: Status 3301 1.1 christos * 3302 1.1 christos * DESCRIPTION: Compile WPBT. 3303 1.1 christos * 3304 1.1 christos *****************************************************************************/ 3305 1.1 christos 3306 1.1 christos ACPI_STATUS 3307 1.1 christos DtCompileWpbt ( 3308 1.1 christos void **List) 3309 1.1 christos { 3310 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 3311 1.1 christos DT_SUBTABLE *Subtable; 3312 1.1 christos DT_SUBTABLE *ParentTable; 3313 1.1 christos ACPI_TABLE_WPBT *Table; 3314 1.1 christos ACPI_STATUS Status; 3315 1.1 christos 3316 1.1 christos 3317 1.1 christos /* Compile the main table */ 3318 1.1 christos 3319 1.1.1.13 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable); 3320 1.1 christos if (ACPI_FAILURE (Status)) 3321 1.1 christos { 3322 1.1 christos return (Status); 3323 1.1 christos } 3324 1.1 christos 3325 1.1 christos ParentTable = DtPeekSubtable (); 3326 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3327 1.1.1.13 christos Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer); 3328 1.1.1.13 christos 3329 1.1.1.13 christos /* 3330 1.1.1.13 christos * Exit now if there are no arguments specified. This is indicated by: 3331 1.1.1.13 christos * The "Command-line Arguments" field has not been specified (if specified, 3332 1.1.1.13 christos * it will be the last field in the field list -- after the main table). 3333 1.1.1.13 christos * Set the Argument Length in the main table to zero. 3334 1.1.1.13 christos */ 3335 1.1.1.13 christos if (!*PFieldList) 3336 1.1.1.13 christos { 3337 1.1.1.13 christos Table->ArgumentsLength = 0; 3338 1.1.1.13 christos return (AE_OK); 3339 1.1.1.13 christos } 3340 1.1 christos 3341 1.1 christos /* Compile the argument list subtable */ 3342 1.1 christos 3343 1.1.1.13 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable); 3344 1.1 christos if (ACPI_FAILURE (Status)) 3345 1.1 christos { 3346 1.1 christos return (Status); 3347 1.1 christos } 3348 1.1 christos 3349 1.1 christos /* Extract the length of the Arguments buffer, insert into main table */ 3350 1.1 christos 3351 1.1.1.13 christos Table->ArgumentsLength = (UINT16) Subtable->TotalLength; 3352 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3353 1.1 christos return (AE_OK); 3354 1.1 christos } 3355 1.1 christos 3356 1.1 christos 3357 1.1 christos /****************************************************************************** 3358 1.1 christos * 3359 1.1 christos * FUNCTION: DtCompileXsdt 3360 1.1 christos * 3361 1.1 christos * PARAMETERS: List - Current field list pointer 3362 1.1 christos * 3363 1.1 christos * RETURN: Status 3364 1.1 christos * 3365 1.1 christos * DESCRIPTION: Compile XSDT. 3366 1.1 christos * 3367 1.1 christos *****************************************************************************/ 3368 1.1 christos 3369 1.1 christos ACPI_STATUS 3370 1.1 christos DtCompileXsdt ( 3371 1.1 christos void **List) 3372 1.1 christos { 3373 1.1 christos DT_SUBTABLE *Subtable; 3374 1.1 christos DT_SUBTABLE *ParentTable; 3375 1.1 christos DT_FIELD *FieldList = *(DT_FIELD **) List; 3376 1.1 christos UINT64 Address; 3377 1.1 christos 3378 1.1 christos 3379 1.1 christos ParentTable = DtPeekSubtable (); 3380 1.1 christos 3381 1.1 christos while (FieldList) 3382 1.1 christos { 3383 1.1 christos DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO); 3384 1.1 christos 3385 1.1 christos DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable); 3386 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3387 1.1 christos FieldList = FieldList->Next; 3388 1.1 christos } 3389 1.1 christos 3390 1.1 christos return (AE_OK); 3391 1.1 christos } 3392 1.1 christos 3393 1.1 christos 3394 1.1 christos /****************************************************************************** 3395 1.1 christos * 3396 1.1 christos * FUNCTION: DtCompileGeneric 3397 1.1 christos * 3398 1.1 christos * PARAMETERS: List - Current field list pointer 3399 1.1 christos * Name - Field name to end generic compiling 3400 1.1 christos * Length - Compiled table length to return 3401 1.1 christos * 3402 1.1 christos * RETURN: Status 3403 1.1 christos * 3404 1.1 christos * DESCRIPTION: Compile generic unknown table. 3405 1.1 christos * 3406 1.1 christos *****************************************************************************/ 3407 1.1 christos 3408 1.1 christos ACPI_STATUS 3409 1.1 christos DtCompileGeneric ( 3410 1.1 christos void **List, 3411 1.1 christos char *Name, 3412 1.1 christos UINT32 *Length) 3413 1.1 christos { 3414 1.1 christos ACPI_STATUS Status; 3415 1.1 christos DT_SUBTABLE *Subtable; 3416 1.1 christos DT_SUBTABLE *ParentTable; 3417 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 3418 1.1 christos ACPI_DMTABLE_INFO *Info; 3419 1.1 christos 3420 1.1 christos 3421 1.1 christos ParentTable = DtPeekSubtable (); 3422 1.1 christos 3423 1.1 christos /* 3424 1.1 christos * Compile the "generic" portion of the table. This 3425 1.1 christos * part of the table is not predefined and any of the generic 3426 1.1 christos * operators may be used. 3427 1.1 christos */ 3428 1.1 christos 3429 1.1 christos /* Find any and all labels in the entire generic portion */ 3430 1.1 christos 3431 1.1 christos DtDetectAllLabels (*PFieldList); 3432 1.1 christos 3433 1.1 christos /* Now we can actually compile the parse tree */ 3434 1.1 christos 3435 1.1 christos if (Length && *Length) 3436 1.1 christos { 3437 1.1 christos *Length = 0; 3438 1.1 christos } 3439 1.1 christos while (*PFieldList) 3440 1.1 christos { 3441 1.1 christos if (Name && !strcmp ((*PFieldList)->Name, Name)) 3442 1.1 christos { 3443 1.1 christos break; 3444 1.1 christos } 3445 1.1 christos 3446 1.1 christos Info = DtGetGenericTableInfo ((*PFieldList)->Name); 3447 1.1 christos if (!Info) 3448 1.1 christos { 3449 1.1.1.7 christos sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found", 3450 1.1 christos (*PFieldList)->Name); 3451 1.1 christos DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 3452 1.1.1.7 christos (*PFieldList), AslGbl_MsgBuffer); 3453 1.1 christos 3454 1.1 christos *PFieldList = (*PFieldList)->Next; 3455 1.1 christos continue; 3456 1.1 christos } 3457 1.1 christos 3458 1.1 christos Status = DtCompileTable (PFieldList, Info, 3459 1.1.1.6 christos &Subtable); 3460 1.1 christos if (ACPI_SUCCESS (Status)) 3461 1.1 christos { 3462 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3463 1.1 christos if (Length) 3464 1.1 christos { 3465 1.1 christos *Length += Subtable->Length; 3466 1.1 christos } 3467 1.1 christos } 3468 1.1 christos else 3469 1.1 christos { 3470 1.1 christos *PFieldList = (*PFieldList)->Next; 3471 1.1 christos 3472 1.1 christos if (Status == AE_NOT_FOUND) 3473 1.1 christos { 3474 1.1.1.7 christos sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found", 3475 1.1 christos (*PFieldList)->Name); 3476 1.1 christos DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME, 3477 1.1.1.7 christos (*PFieldList), AslGbl_MsgBuffer); 3478 1.1 christos } 3479 1.1 christos } 3480 1.1 christos } 3481 1.1 christos 3482 1.1 christos return (AE_OK); 3483 1.1 christos } 3484