1 1.1 christos /****************************************************************************** 2 1.1 christos * 3 1.1 christos * Module Name: dttable1.c - handling for specific ACPI tables 4 1.1 christos * 5 1.1 christos *****************************************************************************/ 6 1.1 christos 7 1.1.1.18 christos /****************************************************************************** 8 1.1.1.18 christos * 9 1.1.1.18 christos * 1. Copyright Notice 10 1.1.1.18 christos * 11 1.1.1.19 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.18 christos * 2. License 15 1.1.1.18 christos * 16 1.1.1.18 christos * 2.1. This is your license from Intel Corp. under its intellectual property 17 1.1.1.18 christos * rights. You may have additional license terms from the party that provided 18 1.1.1.18 christos * you this software, covering your right to use that party's intellectual 19 1.1.1.18 christos * property rights. 20 1.1.1.18 christos * 21 1.1.1.18 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 1.1.1.18 christos * copy of the source code appearing in this file ("Covered Code") an 23 1.1.1.18 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 1.1.1.18 christos * base code distributed originally by Intel ("Original Intel Code") to copy, 25 1.1.1.18 christos * make derivatives, distribute, use and display any portion of the Covered 26 1.1.1.18 christos * Code in any form, with the right to sublicense such rights; and 27 1.1.1.18 christos * 28 1.1.1.18 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 1.1.1.18 christos * license (with the right to sublicense), under only those claims of Intel 30 1.1.1.18 christos * patents that are infringed by the Original Intel Code, to make, use, sell, 31 1.1.1.18 christos * offer to sell, and import the Covered Code and derivative works thereof 32 1.1.1.18 christos * solely to the minimum extent necessary to exercise the above copyright 33 1.1.1.18 christos * license, and in no event shall the patent license extend to any additions 34 1.1.1.18 christos * to or modifications of the Original Intel Code. No other license or right 35 1.1.1.18 christos * is granted directly or by implication, estoppel or otherwise; 36 1.1.1.18 christos * 37 1.1.1.18 christos * The above copyright and patent license is granted only if the following 38 1.1.1.18 christos * conditions are met: 39 1.1.1.18 christos * 40 1.1.1.18 christos * 3. Conditions 41 1.1.1.18 christos * 42 1.1.1.18 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 1.1.1.18 christos * Redistribution of source code of any substantial portion of the Covered 44 1.1.1.18 christos * Code or modification with rights to further distribute source must include 45 1.1.1.18 christos * the above Copyright Notice, the above License, this list of Conditions, 46 1.1.1.18 christos * and the following Disclaimer and Export Compliance provision. In addition, 47 1.1.1.18 christos * Licensee must cause all Covered Code to which Licensee contributes to 48 1.1.1.18 christos * contain a file documenting the changes Licensee made to create that Covered 49 1.1.1.18 christos * Code and the date of any change. Licensee must include in that file the 50 1.1.1.18 christos * documentation of any changes made by any predecessor Licensee. Licensee 51 1.1.1.18 christos * must include a prominent statement that the modification is derived, 52 1.1.1.18 christos * directly or indirectly, from Original Intel Code. 53 1.1.1.18 christos * 54 1.1.1.18 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 1.1.1.18 christos * Redistribution of source code of any substantial portion of the Covered 56 1.1.1.18 christos * Code or modification without rights to further distribute source must 57 1.1.1.18 christos * include the following Disclaimer and Export Compliance provision in the 58 1.1.1.18 christos * documentation and/or other materials provided with distribution. In 59 1.1.1.18 christos * addition, Licensee may not authorize further sublicense of source of any 60 1.1.1.18 christos * portion of the Covered Code, and must include terms to the effect that the 61 1.1.1.18 christos * license from Licensee to its licensee is limited to the intellectual 62 1.1.1.18 christos * property embodied in the software Licensee provides to its licensee, and 63 1.1.1.18 christos * not to intellectual property embodied in modifications its licensee may 64 1.1.1.18 christos * make. 65 1.1.1.18 christos * 66 1.1.1.18 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 1.1.1.18 christos * substantial portion of the Covered Code or modification must reproduce the 68 1.1.1.18 christos * above Copyright Notice, and the following Disclaimer and Export Compliance 69 1.1.1.18 christos * provision in the documentation and/or other materials provided with the 70 1.1.1.18 christos * distribution. 71 1.1.1.18 christos * 72 1.1.1.18 christos * 3.4. Intel retains all right, title, and interest in and to the Original 73 1.1.1.18 christos * Intel Code. 74 1.1.1.18 christos * 75 1.1.1.18 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 1.1.1.18 christos * Intel shall be used in advertising or otherwise to promote the sale, use or 77 1.1.1.18 christos * other dealings in products derived from or relating to the Covered Code 78 1.1.1.18 christos * without prior written authorization from Intel. 79 1.1.1.18 christos * 80 1.1.1.18 christos * 4. Disclaimer and Export Compliance 81 1.1.1.18 christos * 82 1.1.1.18 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 1.1.1.18 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 1.1.1.18 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 1.1.1.18 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 1.1.1.18 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 1.1.1.18 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 1.1.1.18 christos * PARTICULAR PURPOSE. 89 1.1.1.18 christos * 90 1.1.1.18 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 1.1.1.18 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 1.1.1.18 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 1.1.1.18 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 1.1.1.18 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 1.1.1.18 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 1.1.1.18 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 1.1.1.18 christos * LIMITED REMEDY. 98 1.1.1.18 christos * 99 1.1.1.18 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 1.1.1.18 christos * software or system incorporating such software without first obtaining any 101 1.1.1.18 christos * required license or other approval from the U. S. Department of Commerce or 102 1.1.1.18 christos * any other agency or department of the United States Government. In the 103 1.1.1.18 christos * event Licensee exports any such software from the United States or 104 1.1.1.18 christos * re-exports any such software from a foreign destination, Licensee shall 105 1.1.1.18 christos * ensure that the distribution and export/re-export of the software is in 106 1.1.1.18 christos * compliance with all laws, regulations, orders, or other restrictions of the 107 1.1.1.18 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 1.1.1.18 christos * any of its subsidiaries will export/re-export any technical data, process, 109 1.1.1.18 christos * software, or service, directly or indirectly, to any country for which the 110 1.1.1.18 christos * United States government or any agency thereof requires an export license, 111 1.1.1.18 christos * other governmental approval, or letter of assurance, without first obtaining 112 1.1.1.18 christos * such license, approval or letter. 113 1.1.1.18 christos * 114 1.1.1.18 christos ***************************************************************************** 115 1.1.1.18 christos * 116 1.1.1.18 christos * Alternatively, you may choose to be licensed under the terms of the 117 1.1.1.18 christos * following license: 118 1.1.1.18 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.18 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 1.1.1.18 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 1.1.1.18 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 1.1.1.18 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 1.1.1.18 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 1.1.1.18 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 1.1.1.18 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 1.1.1.18 christos * 146 1.1.1.18 christos * Alternatively, you may choose to be licensed under the terms of the 147 1.1.1.18 christos * GNU General Public License ("GPL") version 2 as published by the Free 148 1.1.1.18 christos * Software Foundation. 149 1.1.1.18 christos * 150 1.1.1.18 christos *****************************************************************************/ 151 1.1 christos 152 1.1 christos /* Compile all complex data tables, signatures starting with A-I */ 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 ("dttable1") 158 1.1 christos 159 1.1 christos 160 1.1 christos static ACPI_DMTABLE_INFO TableInfoAsfAddress[] = 161 1.1 christos { 162 1.1 christos {ACPI_DMT_BUFFER, 0, "Addresses", 0}, 163 1.1 christos {ACPI_DMT_EXIT, 0, NULL, 0} 164 1.1 christos }; 165 1.1 christos 166 1.1 christos static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] = 167 1.1 christos { 168 1.1 christos {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0}, 169 1.1 christos {ACPI_DMT_EXIT, 0, NULL, 0} 170 1.1 christos }; 171 1.1 christos 172 1.1 christos 173 1.1 christos /****************************************************************************** 174 1.1 christos * 175 1.1.1.13 christos * FUNCTION: DtCompileAest 176 1.1.1.13 christos * 177 1.1.1.13 christos * PARAMETERS: List - Current field list pointer 178 1.1.1.13 christos * 179 1.1.1.13 christos * RETURN: Status 180 1.1.1.13 christos * 181 1.1.1.13 christos * DESCRIPTION: Compile AEST. 182 1.1.1.13 christos * 183 1.1.1.13 christos * NOTE: Assumes the following table structure: 184 1.1.1.13 christos * For all AEST Error Nodes: 185 1.1.1.13 christos * 1) An AEST Error Node, followed immediately by: 186 1.1.1.13 christos * 2) Any node-specific data 187 1.1.1.13 christos * 3) An Interface Structure (one) 188 1.1.1.13 christos * 4) A list (array) of Interrupt Structures, the count as specified 189 1.1.1.13 christos * in the NodeInterruptCount field of the Error Node header. 190 1.1.1.13 christos * 191 1.1.1.13 christos * AEST - ARM Error Source table. Conforms to: 192 1.1.1.13 christos * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020 193 1.1.1.13 christos * 194 1.1.1.13 christos *****************************************************************************/ 195 1.1.1.13 christos 196 1.1.1.13 christos ACPI_STATUS 197 1.1.1.13 christos DtCompileAest ( 198 1.1.1.13 christos void **List) 199 1.1.1.13 christos { 200 1.1.1.13 christos ACPI_AEST_HEADER *ErrorNodeHeader; 201 1.1.1.13 christos ACPI_AEST_PROCESSOR *AestProcessor; 202 1.1.1.13 christos DT_SUBTABLE *Subtable; 203 1.1.1.13 christos DT_SUBTABLE *ParentTable; 204 1.1.1.13 christos ACPI_DMTABLE_INFO *InfoTable; 205 1.1.1.13 christos ACPI_STATUS Status; 206 1.1.1.13 christos UINT32 i; 207 1.1.1.13 christos UINT32 Offset; 208 1.1.1.13 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 209 1.1.1.17 christos ACPI_AEST_NODE_INTERFACE_HEADER *AestNodeHeader; 210 1.1.1.17 christos UINT8 Revision; 211 1.1.1.17 christos ACPI_TABLE_HEADER *Header; 212 1.1.1.13 christos 213 1.1.1.17 christos ParentTable = DtPeekSubtable (); 214 1.1.1.17 christos 215 1.1.1.17 christos Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 216 1.1.1.17 christos Revision = Header->Revision; 217 1.1.1.13 christos 218 1.1.1.13 christos while (*PFieldList) 219 1.1.1.13 christos { 220 1.1.1.13 christos /* Compile the common error node header */ 221 1.1.1.13 christos 222 1.1.1.13 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoAestHdr, 223 1.1.1.13 christos &Subtable); 224 1.1.1.13 christos if (ACPI_FAILURE (Status)) 225 1.1.1.13 christos { 226 1.1.1.13 christos return (Status); 227 1.1.1.13 christos } 228 1.1.1.13 christos 229 1.1.1.13 christos ParentTable = DtPeekSubtable (); 230 1.1.1.13 christos DtInsertSubtable (ParentTable, Subtable); 231 1.1.1.13 christos 232 1.1.1.13 christos /* Everything past the error node header will be a subtable */ 233 1.1.1.13 christos 234 1.1.1.13 christos DtPushSubtable (Subtable); 235 1.1.1.13 christos 236 1.1.1.13 christos /* 237 1.1.1.13 christos * Compile the node-specific structure (Based on the error 238 1.1.1.13 christos * node header Type field) 239 1.1.1.13 christos */ 240 1.1.1.13 christos ErrorNodeHeader = ACPI_CAST_PTR (ACPI_AEST_HEADER, Subtable->Buffer); 241 1.1.1.13 christos 242 1.1.1.13 christos /* Point past the common error node header */ 243 1.1.1.13 christos 244 1.1.1.13 christos Offset = sizeof (ACPI_AEST_HEADER); 245 1.1.1.13 christos ErrorNodeHeader->NodeSpecificOffset = Offset; 246 1.1.1.13 christos 247 1.1.1.13 christos /* Decode the error node type */ 248 1.1.1.13 christos 249 1.1.1.13 christos switch (ErrorNodeHeader->Type) 250 1.1.1.13 christos { 251 1.1.1.13 christos case ACPI_AEST_PROCESSOR_ERROR_NODE: 252 1.1.1.13 christos 253 1.1.1.13 christos InfoTable = AcpiDmTableInfoAestProcError; 254 1.1.1.13 christos break; 255 1.1.1.13 christos 256 1.1.1.13 christos case ACPI_AEST_MEMORY_ERROR_NODE: 257 1.1.1.13 christos 258 1.1.1.13 christos InfoTable = AcpiDmTableInfoAestMemError; 259 1.1.1.13 christos break; 260 1.1.1.13 christos 261 1.1.1.13 christos case ACPI_AEST_SMMU_ERROR_NODE: 262 1.1.1.13 christos 263 1.1.1.13 christos InfoTable = AcpiDmTableInfoAestSmmuError; 264 1.1.1.13 christos break; 265 1.1.1.13 christos 266 1.1.1.13 christos case ACPI_AEST_VENDOR_ERROR_NODE: 267 1.1.1.17 christos switch (Revision) 268 1.1.1.17 christos { 269 1.1.1.17 christos case 1: 270 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestVendorError; 271 1.1.1.17 christos break; 272 1.1.1.13 christos 273 1.1.1.17 christos case 2: 274 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestVendorV2Error; 275 1.1.1.17 christos break; 276 1.1.1.17 christos 277 1.1.1.17 christos default: 278 1.1.1.17 christos AcpiOsPrintf ("Unknown AEST Vendor Error Revision: %X\n", 279 1.1.1.17 christos Revision); 280 1.1.1.17 christos return (AE_ERROR); 281 1.1.1.17 christos } 282 1.1.1.13 christos break; 283 1.1.1.13 christos 284 1.1.1.13 christos case ACPI_AEST_GIC_ERROR_NODE: 285 1.1.1.13 christos 286 1.1.1.13 christos InfoTable = AcpiDmTableInfoAestGicError; 287 1.1.1.13 christos break; 288 1.1.1.13 christos 289 1.1.1.17 christos case ACPI_AEST_PCIE_ERROR_NODE: 290 1.1.1.17 christos 291 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestPCIeError; 292 1.1.1.17 christos break; 293 1.1.1.17 christos 294 1.1.1.17 christos case ACPI_AEST_PROXY_ERROR_NODE: 295 1.1.1.17 christos 296 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestProxyError; 297 1.1.1.17 christos break; 298 1.1.1.17 christos 299 1.1.1.13 christos /* Error case below */ 300 1.1.1.13 christos default: 301 1.1.1.13 christos AcpiOsPrintf ("Unknown AEST Subtable Type: %X\n", 302 1.1.1.13 christos ErrorNodeHeader->Type); 303 1.1.1.13 christos return (AE_ERROR); 304 1.1.1.13 christos } 305 1.1.1.13 christos 306 1.1.1.13 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 307 1.1.1.13 christos if (ACPI_FAILURE (Status)) 308 1.1.1.13 christos { 309 1.1.1.13 christos return (Status); 310 1.1.1.13 christos } 311 1.1.1.13 christos 312 1.1.1.13 christos /* Point past the node-specific structure */ 313 1.1.1.13 christos 314 1.1.1.13 christos Offset += Subtable->Length; 315 1.1.1.13 christos ErrorNodeHeader->NodeInterfaceOffset = Offset; 316 1.1.1.13 christos 317 1.1.1.13 christos ParentTable = DtPeekSubtable (); 318 1.1.1.13 christos DtInsertSubtable (ParentTable, Subtable); 319 1.1.1.13 christos 320 1.1.1.13 christos /* Compile any additional node-specific substructures */ 321 1.1.1.13 christos 322 1.1.1.13 christos if (ErrorNodeHeader->Type == ACPI_AEST_PROCESSOR_ERROR_NODE) 323 1.1.1.13 christos { 324 1.1.1.13 christos /* 325 1.1.1.13 christos * Special handling for PROCESSOR_ERROR_NODE subtables 326 1.1.1.13 christos * (to handle the Resource Substructure via the ResourceType 327 1.1.1.13 christos * field). 328 1.1.1.13 christos */ 329 1.1.1.13 christos AestProcessor = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, 330 1.1.1.13 christos Subtable->Buffer); 331 1.1.1.13 christos 332 1.1.1.13 christos switch (AestProcessor->ResourceType) 333 1.1.1.13 christos { 334 1.1.1.13 christos case ACPI_AEST_CACHE_RESOURCE: 335 1.1.1.13 christos 336 1.1.1.13 christos InfoTable = AcpiDmTableInfoAestCacheRsrc; 337 1.1.1.13 christos break; 338 1.1.1.13 christos 339 1.1.1.13 christos case ACPI_AEST_TLB_RESOURCE: 340 1.1.1.13 christos 341 1.1.1.13 christos InfoTable = AcpiDmTableInfoAestTlbRsrc; 342 1.1.1.13 christos break; 343 1.1.1.13 christos 344 1.1.1.13 christos case ACPI_AEST_GENERIC_RESOURCE: 345 1.1.1.13 christos 346 1.1.1.13 christos InfoTable = AcpiDmTableInfoAestGenRsrc; 347 1.1.1.13 christos AcpiOsPrintf ("Generic Resource Type (%X) is not supported at this time\n", 348 1.1.1.13 christos AestProcessor->ResourceType); 349 1.1.1.13 christos return (AE_ERROR); 350 1.1.1.13 christos 351 1.1.1.13 christos /* Error case below */ 352 1.1.1.13 christos default: 353 1.1.1.13 christos AcpiOsPrintf ("Unknown AEST Processor Resource Type: %X\n", 354 1.1.1.13 christos AestProcessor->ResourceType); 355 1.1.1.13 christos return (AE_ERROR); 356 1.1.1.13 christos } 357 1.1.1.13 christos 358 1.1.1.13 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 359 1.1.1.13 christos if (ACPI_FAILURE (Status)) 360 1.1.1.13 christos { 361 1.1.1.13 christos return (Status); 362 1.1.1.13 christos } 363 1.1.1.13 christos 364 1.1.1.13 christos /* Point past the resource substructure subtable */ 365 1.1.1.13 christos 366 1.1.1.13 christos Offset += Subtable->Length; 367 1.1.1.13 christos ErrorNodeHeader->NodeInterfaceOffset = Offset; 368 1.1.1.13 christos 369 1.1.1.13 christos ParentTable = DtPeekSubtable (); 370 1.1.1.13 christos DtInsertSubtable (ParentTable, Subtable); 371 1.1.1.13 christos } 372 1.1.1.13 christos 373 1.1.1.13 christos /* Compile the (required) node interface structure */ 374 1.1.1.17 christos if (Revision == 1) 375 1.1.1.17 christos { 376 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestXface; 377 1.1.1.17 christos } 378 1.1.1.17 christos else if (Revision == 2) 379 1.1.1.17 christos { 380 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoAestXfaceHeader, 381 1.1.1.17 christos &Subtable); 382 1.1.1.17 christos if (ACPI_FAILURE (Status)) 383 1.1.1.17 christos { 384 1.1.1.17 christos return (Status); 385 1.1.1.17 christos } 386 1.1.1.13 christos 387 1.1.1.17 christos ParentTable = DtPeekSubtable (); 388 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); 389 1.1.1.17 christos 390 1.1.1.17 christos Offset += Subtable->Length; 391 1.1.1.17 christos 392 1.1.1.17 christos AestNodeHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER, 393 1.1.1.17 christos Subtable->Buffer); 394 1.1.1.17 christos 395 1.1.1.17 christos switch (AestNodeHeader->GroupFormat) 396 1.1.1.17 christos { 397 1.1.1.17 christos case ACPI_AEST_NODE_GROUP_FORMAT_4K: 398 1.1.1.17 christos 399 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestXface4k; 400 1.1.1.17 christos break; 401 1.1.1.17 christos 402 1.1.1.17 christos case ACPI_AEST_NODE_GROUP_FORMAT_16K: 403 1.1.1.17 christos 404 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestXface16k; 405 1.1.1.17 christos break; 406 1.1.1.17 christos 407 1.1.1.17 christos case ACPI_AEST_NODE_GROUP_FORMAT_64K: 408 1.1.1.17 christos 409 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestXface64k; 410 1.1.1.17 christos break; 411 1.1.1.17 christos 412 1.1.1.17 christos /* Error case below */ 413 1.1.1.17 christos default: 414 1.1.1.17 christos AcpiOsPrintf ("Unknown AEST Interface Group Format: %X\n", 415 1.1.1.17 christos AestNodeHeader->GroupFormat); 416 1.1.1.17 christos return (AE_ERROR); 417 1.1.1.17 christos } 418 1.1.1.17 christos } 419 1.1.1.17 christos else 420 1.1.1.17 christos { 421 1.1.1.17 christos AcpiOsPrintf ("Unknown AEST Revision: %X\n", Revision); 422 1.1.1.17 christos } 423 1.1.1.17 christos 424 1.1.1.17 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 425 1.1.1.13 christos if (ACPI_FAILURE (Status)) 426 1.1.1.13 christos { 427 1.1.1.13 christos return (Status); 428 1.1.1.13 christos } 429 1.1.1.13 christos 430 1.1.1.13 christos ErrorNodeHeader->NodeInterruptOffset = 0; 431 1.1.1.13 christos ParentTable = DtPeekSubtable (); 432 1.1.1.13 christos DtInsertSubtable (ParentTable, Subtable); 433 1.1.1.13 christos 434 1.1.1.13 christos /* Compile each of the node interrupt structures */ 435 1.1.1.13 christos 436 1.1.1.13 christos if (ErrorNodeHeader->NodeInterruptCount) 437 1.1.1.13 christos { 438 1.1.1.13 christos /* Point to the first interrupt structure */ 439 1.1.1.13 christos 440 1.1.1.13 christos Offset += Subtable->Length; 441 1.1.1.13 christos ErrorNodeHeader->NodeInterruptOffset = Offset; 442 1.1.1.13 christos } 443 1.1.1.13 christos 444 1.1.1.13 christos /* Compile each of the interrupt structures */ 445 1.1.1.13 christos 446 1.1.1.13 christos for (i = 0; i < ErrorNodeHeader->NodeInterruptCount; i++) 447 1.1.1.13 christos { 448 1.1.1.17 christos switch (Revision) { 449 1.1.1.17 christos case 1: 450 1.1.1.17 christos 451 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestXrupt; 452 1.1.1.17 christos break; 453 1.1.1.17 christos 454 1.1.1.17 christos case 2: 455 1.1.1.17 christos 456 1.1.1.17 christos InfoTable = AcpiDmTableInfoAestXruptV2; 457 1.1.1.17 christos break; 458 1.1.1.17 christos 459 1.1.1.17 christos default: 460 1.1.1.17 christos AcpiOsPrintf ("Unknown AEST Revision: %X\n", Revision); 461 1.1.1.17 christos return (AE_ERROR); 462 1.1.1.17 christos } 463 1.1.1.17 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 464 1.1.1.13 christos if (ACPI_FAILURE (Status)) 465 1.1.1.13 christos { 466 1.1.1.13 christos return (Status); 467 1.1.1.13 christos } 468 1.1.1.13 christos 469 1.1.1.13 christos ParentTable = DtPeekSubtable (); 470 1.1.1.13 christos DtInsertSubtable (ParentTable, Subtable); 471 1.1.1.13 christos } 472 1.1.1.13 christos 473 1.1.1.13 christos /* Prepare for the next AEST Error node */ 474 1.1.1.13 christos 475 1.1.1.13 christos DtPopSubtable (); 476 1.1.1.13 christos } 477 1.1.1.13 christos 478 1.1.1.13 christos return (AE_OK); 479 1.1.1.13 christos } 480 1.1.1.13 christos 481 1.1.1.13 christos 482 1.1.1.13 christos /****************************************************************************** 483 1.1.1.13 christos * 484 1.1.1.14 christos * FUNCTION: DtCompileApmt 485 1.1.1.14 christos * 486 1.1.1.14 christos * PARAMETERS: List - Current field list pointer 487 1.1.1.14 christos * 488 1.1.1.14 christos * RETURN: Status 489 1.1.1.14 christos * 490 1.1.1.14 christos * DESCRIPTION: Compile APMT. 491 1.1.1.14 christos * 492 1.1.1.14 christos *****************************************************************************/ 493 1.1.1.14 christos 494 1.1.1.14 christos ACPI_STATUS 495 1.1.1.14 christos DtCompileApmt ( 496 1.1.1.14 christos void **List) 497 1.1.1.14 christos { 498 1.1.1.14 christos ACPI_STATUS Status; 499 1.1.1.14 christos ACPI_TABLE_HEADER *Header; 500 1.1.1.14 christos ACPI_APMT_NODE *ApmtNode; 501 1.1.1.14 christos ACPI_APMT_NODE *PeerApmtNode; 502 1.1.1.14 christos DT_SUBTABLE *Subtable; 503 1.1.1.14 christos DT_SUBTABLE *PeerSubtable; 504 1.1.1.14 christos DT_SUBTABLE *ParentTable; 505 1.1.1.14 christos DT_FIELD **PFieldList = (DT_FIELD**)List; 506 1.1.1.14 christos DT_FIELD *SubtableStart; 507 1.1.1.14 christos UINT32 CurLength; 508 1.1.1.14 christos char MsgBuffer[64] = ""; 509 1.1.1.14 christos 510 1.1.1.14 christos ParentTable = DtPeekSubtable(); 511 1.1.1.14 christos 512 1.1.1.14 christos Header = ACPI_CAST_PTR(ACPI_TABLE_HEADER, ParentTable->Buffer); 513 1.1.1.14 christos 514 1.1.1.14 christos CurLength = sizeof(ACPI_TABLE_HEADER); 515 1.1.1.14 christos 516 1.1.1.14 christos /* Walk the parse tree */ 517 1.1.1.14 christos 518 1.1.1.14 christos while (*PFieldList) 519 1.1.1.14 christos { 520 1.1.1.14 christos /* APMT Node Subtable */ 521 1.1.1.14 christos 522 1.1.1.14 christos SubtableStart = *PFieldList; 523 1.1.1.14 christos 524 1.1.1.14 christos Status = DtCompileTable(PFieldList, AcpiDmTableInfoApmtNode, &Subtable); 525 1.1.1.14 christos 526 1.1.1.14 christos if (ACPI_FAILURE(Status)) 527 1.1.1.14 christos { 528 1.1.1.14 christos return (Status); 529 1.1.1.14 christos } 530 1.1.1.14 christos 531 1.1.1.14 christos ApmtNode = ACPI_CAST_PTR(ACPI_APMT_NODE, Subtable->Buffer); 532 1.1.1.14 christos 533 1.1.1.14 christos if (ApmtNode->Length != sizeof(ACPI_APMT_NODE)) 534 1.1.1.14 christos { 535 1.1.1.14 christos DtFatal(ASL_MSG_INVALID_LENGTH, SubtableStart, "APMT"); 536 1.1.1.14 christos return (AE_ERROR); 537 1.1.1.14 christos } 538 1.1.1.14 christos 539 1.1.1.14 christos if (ApmtNode->Type >= ACPI_APMT_NODE_TYPE_COUNT) 540 1.1.1.14 christos { 541 1.1.1.14 christos snprintf(MsgBuffer, 64, "Node Type : 0x%X", ApmtNode->Type); 542 1.1.1.14 christos DtFatal(ASL_MSG_INVALID_TYPE, SubtableStart, MsgBuffer); 543 1.1.1.14 christos return (AE_ERROR); 544 1.1.1.14 christos } 545 1.1.1.14 christos 546 1.1.1.14 christos PeerSubtable = DtGetNextSubtable(ParentTable, NULL); 547 1.1.1.14 christos 548 1.1.1.14 christos /* Validate the node id needs to be unique. */ 549 1.1.1.14 christos while(PeerSubtable) 550 1.1.1.14 christos { 551 1.1.1.14 christos PeerApmtNode = ACPI_CAST_PTR(ACPI_APMT_NODE, PeerSubtable->Buffer); 552 1.1.1.14 christos if (PeerApmtNode->Id == ApmtNode->Id) 553 1.1.1.14 christos { 554 1.1.1.14 christos snprintf(MsgBuffer, 64, "Node Id : 0x%X existed", ApmtNode->Id); 555 1.1.1.14 christos DtFatal(ASL_MSG_DUPLICATE_ITEM, SubtableStart, MsgBuffer); 556 1.1.1.14 christos return (AE_ERROR); 557 1.1.1.14 christos } 558 1.1.1.14 christos 559 1.1.1.14 christos PeerSubtable = DtGetNextSubtable(ParentTable, PeerSubtable); 560 1.1.1.14 christos } 561 1.1.1.14 christos 562 1.1.1.14 christos CurLength += ApmtNode->Length; 563 1.1.1.14 christos 564 1.1.1.14 christos DtInsertSubtable(ParentTable, Subtable); 565 1.1.1.14 christos } 566 1.1.1.14 christos 567 1.1.1.14 christos if (Header->Length != CurLength) 568 1.1.1.14 christos { 569 1.1.1.14 christos snprintf(MsgBuffer, 64, " - APMT Length : %u (expected: %u)", 570 1.1.1.14 christos Header->Length, CurLength); 571 1.1.1.14 christos DtFatal(ASL_MSG_INVALID_LENGTH, NULL, MsgBuffer); 572 1.1.1.14 christos return (AE_ERROR); 573 1.1.1.14 christos } 574 1.1.1.14 christos 575 1.1.1.14 christos return (AE_OK); 576 1.1.1.14 christos } 577 1.1.1.14 christos 578 1.1.1.14 christos /****************************************************************************** 579 1.1.1.14 christos * 580 1.1 christos * FUNCTION: DtCompileAsf 581 1.1 christos * 582 1.1 christos * PARAMETERS: List - Current field list pointer 583 1.1 christos * 584 1.1 christos * RETURN: Status 585 1.1 christos * 586 1.1 christos * DESCRIPTION: Compile ASF!. 587 1.1 christos * 588 1.1 christos *****************************************************************************/ 589 1.1 christos 590 1.1 christos ACPI_STATUS 591 1.1 christos DtCompileAsf ( 592 1.1 christos void **List) 593 1.1 christos { 594 1.1 christos ACPI_ASF_INFO *AsfTable; 595 1.1 christos DT_SUBTABLE *Subtable; 596 1.1 christos DT_SUBTABLE *ParentTable; 597 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 598 1.1 christos ACPI_DMTABLE_INFO *DataInfoTable = NULL; 599 1.1 christos UINT32 DataCount = 0; 600 1.1 christos ACPI_STATUS Status; 601 1.1 christos UINT32 i; 602 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 603 1.1 christos DT_FIELD *SubtableStart; 604 1.1 christos 605 1.1 christos 606 1.1 christos while (*PFieldList) 607 1.1 christos { 608 1.1 christos SubtableStart = *PFieldList; 609 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr, 610 1.1.1.7 christos &Subtable); 611 1.1 christos if (ACPI_FAILURE (Status)) 612 1.1 christos { 613 1.1 christos return (Status); 614 1.1 christos } 615 1.1 christos 616 1.1 christos ParentTable = DtPeekSubtable (); 617 1.1 christos DtInsertSubtable (ParentTable, Subtable); 618 1.1 christos DtPushSubtable (Subtable); 619 1.1 christos 620 1.1 christos AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer); 621 1.1 christos 622 1.1 christos switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 623 1.1 christos { 624 1.1 christos case ACPI_ASF_TYPE_INFO: 625 1.1 christos 626 1.1 christos InfoTable = AcpiDmTableInfoAsf0; 627 1.1 christos break; 628 1.1 christos 629 1.1 christos case ACPI_ASF_TYPE_ALERT: 630 1.1 christos 631 1.1 christos InfoTable = AcpiDmTableInfoAsf1; 632 1.1 christos break; 633 1.1 christos 634 1.1 christos case ACPI_ASF_TYPE_CONTROL: 635 1.1 christos 636 1.1 christos InfoTable = AcpiDmTableInfoAsf2; 637 1.1 christos break; 638 1.1 christos 639 1.1 christos case ACPI_ASF_TYPE_BOOT: 640 1.1 christos 641 1.1 christos InfoTable = AcpiDmTableInfoAsf3; 642 1.1 christos break; 643 1.1 christos 644 1.1 christos case ACPI_ASF_TYPE_ADDRESS: 645 1.1 christos 646 1.1 christos InfoTable = AcpiDmTableInfoAsf4; 647 1.1 christos break; 648 1.1 christos 649 1.1 christos default: 650 1.1 christos 651 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 652 1.1 christos return (AE_ERROR); 653 1.1 christos } 654 1.1 christos 655 1.1.1.7 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 656 1.1 christos if (ACPI_FAILURE (Status)) 657 1.1 christos { 658 1.1 christos return (Status); 659 1.1 christos } 660 1.1 christos 661 1.1 christos ParentTable = DtPeekSubtable (); 662 1.1 christos DtInsertSubtable (ParentTable, Subtable); 663 1.1 christos 664 1.1 christos switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ 665 1.1 christos { 666 1.1 christos case ACPI_ASF_TYPE_INFO: 667 1.1 christos 668 1.1 christos DataInfoTable = NULL; 669 1.1 christos break; 670 1.1 christos 671 1.1 christos case ACPI_ASF_TYPE_ALERT: 672 1.1 christos 673 1.1 christos DataInfoTable = AcpiDmTableInfoAsf1a; 674 1.1 christos DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, 675 1.1 christos ACPI_SUB_PTR (UINT8, Subtable->Buffer, 676 1.1 christos sizeof (ACPI_ASF_HEADER)))->Alerts; 677 1.1 christos break; 678 1.1 christos 679 1.1 christos case ACPI_ASF_TYPE_CONTROL: 680 1.1 christos 681 1.1 christos DataInfoTable = AcpiDmTableInfoAsf2a; 682 1.1 christos DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, 683 1.1 christos ACPI_SUB_PTR (UINT8, Subtable->Buffer, 684 1.1 christos sizeof (ACPI_ASF_HEADER)))->Controls; 685 1.1 christos break; 686 1.1 christos 687 1.1 christos case ACPI_ASF_TYPE_BOOT: 688 1.1 christos 689 1.1 christos DataInfoTable = NULL; 690 1.1 christos break; 691 1.1 christos 692 1.1 christos case ACPI_ASF_TYPE_ADDRESS: 693 1.1 christos 694 1.1 christos DataInfoTable = TableInfoAsfAddress; 695 1.1 christos DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, 696 1.1 christos ACPI_SUB_PTR (UINT8, Subtable->Buffer, 697 1.1 christos sizeof (ACPI_ASF_HEADER)))->Devices; 698 1.1 christos break; 699 1.1 christos 700 1.1 christos default: 701 1.1 christos 702 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); 703 1.1 christos return (AE_ERROR); 704 1.1 christos } 705 1.1 christos 706 1.1 christos if (DataInfoTable) 707 1.1 christos { 708 1.1 christos switch (AsfTable->Header.Type & 0x7F) 709 1.1 christos { 710 1.1 christos case ACPI_ASF_TYPE_ADDRESS: 711 1.1 christos 712 1.1 christos while (DataCount > 0) 713 1.1 christos { 714 1.1 christos Status = DtCompileTable (PFieldList, DataInfoTable, 715 1.1.1.7 christos &Subtable); 716 1.1 christos if (ACPI_FAILURE (Status)) 717 1.1 christos { 718 1.1 christos return (Status); 719 1.1 christos } 720 1.1 christos 721 1.1 christos DtInsertSubtable (ParentTable, Subtable); 722 1.1 christos DataCount = DataCount - Subtable->Length; 723 1.1 christos } 724 1.1 christos break; 725 1.1 christos 726 1.1 christos default: 727 1.1 christos 728 1.1 christos for (i = 0; i < DataCount; i++) 729 1.1 christos { 730 1.1 christos Status = DtCompileTable (PFieldList, DataInfoTable, 731 1.1.1.7 christos &Subtable); 732 1.1 christos if (ACPI_FAILURE (Status)) 733 1.1 christos { 734 1.1 christos return (Status); 735 1.1 christos } 736 1.1 christos 737 1.1 christos DtInsertSubtable (ParentTable, Subtable); 738 1.1 christos } 739 1.1 christos break; 740 1.1 christos } 741 1.1 christos } 742 1.1 christos 743 1.1 christos DtPopSubtable (); 744 1.1 christos } 745 1.1 christos 746 1.1 christos return (AE_OK); 747 1.1 christos } 748 1.1 christos 749 1.1.1.16 christos /****************************************************************************** 750 1.1.1.16 christos * 751 1.1.1.16 christos * FUNCTION: DtCompileAspt 752 1.1.1.16 christos * 753 1.1.1.16 christos * PARAMETERS: List - Current field list pointer 754 1.1.1.16 christos * 755 1.1.1.16 christos * RETURN: Status 756 1.1.1.16 christos * 757 1.1.1.16 christos * DESCRIPTION: Compile ASPT. 758 1.1.1.16 christos * 759 1.1.1.16 christos *****************************************************************************/ 760 1.1.1.16 christos 761 1.1.1.16 christos ACPI_STATUS 762 1.1.1.16 christos DtCompileAspt ( 763 1.1.1.16 christos void **List) 764 1.1.1.16 christos { 765 1.1.1.16 christos ACPI_ASPT_HEADER *AsptTable; 766 1.1.1.16 christos DT_SUBTABLE *Subtable; 767 1.1.1.16 christos DT_SUBTABLE *ParentTable; 768 1.1.1.16 christos ACPI_DMTABLE_INFO *InfoTable; 769 1.1.1.16 christos ACPI_STATUS Status; 770 1.1.1.16 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 771 1.1.1.16 christos DT_FIELD *SubtableStart; 772 1.1.1.16 christos 773 1.1.1.16 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoAspt, &Subtable); 774 1.1.1.16 christos if (ACPI_FAILURE (Status)) 775 1.1.1.16 christos { 776 1.1.1.16 christos return (Status); 777 1.1.1.16 christos } 778 1.1.1.16 christos 779 1.1.1.16 christos ParentTable = DtPeekSubtable (); 780 1.1.1.16 christos DtInsertSubtable (ParentTable, Subtable); 781 1.1.1.16 christos 782 1.1.1.16 christos while (*PFieldList) 783 1.1.1.16 christos { 784 1.1.1.16 christos SubtableStart = *PFieldList; 785 1.1.1.16 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsptHdr, 786 1.1.1.16 christos &Subtable); 787 1.1.1.16 christos if (ACPI_FAILURE (Status)) 788 1.1.1.16 christos { 789 1.1.1.16 christos return (Status); 790 1.1.1.16 christos } 791 1.1.1.16 christos 792 1.1.1.16 christos ParentTable = DtPeekSubtable (); 793 1.1.1.16 christos DtInsertSubtable (ParentTable, Subtable); 794 1.1.1.16 christos DtPushSubtable (Subtable); 795 1.1.1.16 christos 796 1.1.1.16 christos AsptTable = ACPI_CAST_PTR (ACPI_ASPT_HEADER, Subtable->Buffer); 797 1.1.1.16 christos 798 1.1.1.16 christos switch (AsptTable->Type) /* Mask off top bit */ 799 1.1.1.16 christos { 800 1.1.1.16 christos case ACPI_ASPT_TYPE_GLOBAL_REGS: 801 1.1.1.16 christos 802 1.1.1.16 christos InfoTable = AcpiDmTableInfoAspt0; 803 1.1.1.16 christos break; 804 1.1.1.16 christos 805 1.1.1.16 christos case ACPI_ASPT_TYPE_SEV_MBOX_REGS: 806 1.1.1.16 christos 807 1.1.1.16 christos InfoTable = AcpiDmTableInfoAspt1; 808 1.1.1.16 christos break; 809 1.1.1.16 christos 810 1.1.1.16 christos case ACPI_ASPT_TYPE_ACPI_MBOX_REGS: 811 1.1.1.16 christos 812 1.1.1.16 christos InfoTable = AcpiDmTableInfoAspt2; 813 1.1.1.16 christos break; 814 1.1.1.16 christos 815 1.1.1.16 christos default: 816 1.1.1.16 christos 817 1.1.1.16 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASPT"); 818 1.1.1.16 christos return (AE_ERROR); 819 1.1.1.16 christos } 820 1.1.1.16 christos 821 1.1.1.16 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 822 1.1.1.16 christos if (ACPI_FAILURE (Status)) 823 1.1.1.16 christos { 824 1.1.1.16 christos return (Status); 825 1.1.1.16 christos } 826 1.1.1.16 christos ParentTable = DtPeekSubtable (); 827 1.1.1.16 christos DtInsertSubtable (ParentTable, Subtable); 828 1.1.1.16 christos DtPopSubtable (); 829 1.1.1.16 christos } 830 1.1.1.16 christos 831 1.1.1.16 christos return (AE_OK); 832 1.1.1.16 christos } 833 1.1.1.16 christos 834 1.1 christos 835 1.1 christos /****************************************************************************** 836 1.1 christos * 837 1.1.1.15 christos * FUNCTION: DtCompileCdat 838 1.1.1.15 christos * 839 1.1.1.15 christos * PARAMETERS: List - Current field list pointer 840 1.1.1.15 christos * 841 1.1.1.15 christos * RETURN: Status 842 1.1.1.15 christos * 843 1.1.1.15 christos * DESCRIPTION: Compile CDAT. 844 1.1.1.15 christos * 845 1.1.1.15 christos *****************************************************************************/ 846 1.1.1.15 christos 847 1.1.1.15 christos ACPI_STATUS 848 1.1.1.15 christos DtCompileCdat ( 849 1.1.1.15 christos void **List) 850 1.1.1.15 christos { 851 1.1.1.15 christos ACPI_STATUS Status = AE_OK; 852 1.1.1.15 christos DT_SUBTABLE *Subtable; 853 1.1.1.15 christos DT_SUBTABLE *ParentTable; 854 1.1.1.15 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 855 1.1.1.15 christos ACPI_CDAT_HEADER *CdatHeader; 856 1.1.1.15 christos ACPI_DMTABLE_INFO *InfoTable = NULL; 857 1.1.1.15 christos DT_FIELD *SubtableStart; 858 1.1.1.15 christos 859 1.1.1.15 christos 860 1.1.1.15 christos /* Walk the parse tree. 861 1.1.1.15 christos * 862 1.1.1.15 christos * Note: Main table consists of only the CDAT table header 863 1.1.1.15 christos * (This is not the standard ACPI table header, however)-- 864 1.1.1.15 christos * Followed by some number of subtables. 865 1.1.1.15 christos */ 866 1.1.1.15 christos while (*PFieldList) 867 1.1.1.15 christos { 868 1.1.1.15 christos SubtableStart = *PFieldList; 869 1.1.1.15 christos 870 1.1.1.15 christos /* Compile the expected CDAT Subtable header */ 871 1.1.1.15 christos 872 1.1.1.15 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatHeader, 873 1.1.1.15 christos &Subtable); 874 1.1.1.15 christos if (ACPI_FAILURE (Status)) 875 1.1.1.15 christos { 876 1.1.1.15 christos return (Status); 877 1.1.1.15 christos } 878 1.1.1.15 christos 879 1.1.1.15 christos ParentTable = DtPeekSubtable (); 880 1.1.1.15 christos DtInsertSubtable (ParentTable, Subtable); 881 1.1.1.15 christos DtPushSubtable (Subtable); 882 1.1.1.15 christos 883 1.1.1.15 christos CdatHeader = ACPI_CAST_PTR (ACPI_CDAT_HEADER, Subtable->Buffer); 884 1.1.1.15 christos 885 1.1.1.15 christos /* Decode the subtable by type */ 886 1.1.1.15 christos 887 1.1.1.15 christos switch (CdatHeader->Type) 888 1.1.1.15 christos { 889 1.1.1.15 christos case ACPI_CDAT_TYPE_DSMAS: 890 1.1.1.15 christos InfoTable = AcpiDmTableInfoCdat0; 891 1.1.1.15 christos break; 892 1.1.1.15 christos 893 1.1.1.15 christos case ACPI_CDAT_TYPE_DSLBIS: 894 1.1.1.15 christos InfoTable = AcpiDmTableInfoCdat1; 895 1.1.1.15 christos break; 896 1.1.1.15 christos 897 1.1.1.15 christos case ACPI_CDAT_TYPE_DSMSCIS: 898 1.1.1.15 christos InfoTable = AcpiDmTableInfoCdat2; 899 1.1.1.15 christos break; 900 1.1.1.15 christos 901 1.1.1.15 christos case ACPI_CDAT_TYPE_DSIS: 902 1.1.1.15 christos InfoTable = AcpiDmTableInfoCdat3; 903 1.1.1.15 christos break; 904 1.1.1.15 christos 905 1.1.1.15 christos case ACPI_CDAT_TYPE_DSEMTS: 906 1.1.1.15 christos InfoTable = AcpiDmTableInfoCdat4; 907 1.1.1.15 christos break; 908 1.1.1.15 christos 909 1.1.1.15 christos case ACPI_CDAT_TYPE_SSLBIS: 910 1.1.1.15 christos InfoTable = AcpiDmTableInfoCdat5; 911 1.1.1.15 christos break; 912 1.1.1.15 christos 913 1.1.1.15 christos default: 914 1.1.1.15 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CDAT"); 915 1.1.1.15 christos } 916 1.1.1.15 christos 917 1.1.1.15 christos /* Compile the CDAT subtable */ 918 1.1.1.15 christos 919 1.1.1.15 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 920 1.1.1.15 christos if (ACPI_FAILURE (Status)) 921 1.1.1.15 christos { 922 1.1.1.15 christos return (Status); 923 1.1.1.15 christos } 924 1.1.1.15 christos 925 1.1.1.15 christos ParentTable = DtPeekSubtable (); 926 1.1.1.15 christos DtInsertSubtable (ParentTable, Subtable); 927 1.1.1.15 christos 928 1.1.1.15 christos switch (CdatHeader->Type) 929 1.1.1.15 christos { 930 1.1.1.15 christos /* Multiple entries supported for this type */ 931 1.1.1.15 christos 932 1.1.1.15 christos case ACPI_CDAT_TYPE_SSLBIS: 933 1.1.1.15 christos 934 1.1.1.15 christos /* 935 1.1.1.15 christos * Check for multiple SSLBEs 936 1.1.1.15 christos */ 937 1.1.1.15 christos while (*PFieldList && !AcpiUtStricmp ((*PFieldList)->Name, "Port X ID")) 938 1.1.1.15 christos { 939 1.1.1.15 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatEntries, &Subtable); 940 1.1.1.15 christos if (ACPI_FAILURE (Status)) 941 1.1.1.15 christos { 942 1.1.1.15 christos return (Status); 943 1.1.1.15 christos } 944 1.1.1.15 christos ParentTable = DtPeekSubtable (); 945 1.1.1.15 christos DtInsertSubtable (ParentTable, Subtable); 946 1.1.1.15 christos } 947 1.1.1.15 christos break; 948 1.1.1.15 christos 949 1.1.1.15 christos default: 950 1.1.1.15 christos break; 951 1.1.1.15 christos } 952 1.1.1.15 christos 953 1.1.1.15 christos /* Pop off the CDAT Subtable header subtree */ 954 1.1.1.15 christos 955 1.1.1.15 christos DtPopSubtable (); 956 1.1.1.15 christos } 957 1.1.1.15 christos 958 1.1.1.15 christos return (AE_OK); 959 1.1.1.15 christos } 960 1.1.1.15 christos 961 1.1.1.15 christos 962 1.1.1.15 christos /****************************************************************************** 963 1.1.1.15 christos * 964 1.1.1.11 christos * FUNCTION: DtCompileCedt 965 1.1.1.11 christos * 966 1.1.1.11 christos * PARAMETERS: List - Current field list pointer 967 1.1.1.11 christos * 968 1.1.1.11 christos * RETURN: Status 969 1.1.1.11 christos * 970 1.1.1.11 christos * DESCRIPTION: Compile CEDT. 971 1.1.1.11 christos * 972 1.1.1.11 christos *****************************************************************************/ 973 1.1.1.11 christos 974 1.1.1.11 christos ACPI_STATUS 975 1.1.1.11 christos DtCompileCedt ( 976 1.1.1.11 christos void **List) 977 1.1.1.11 christos { 978 1.1.1.11 christos ACPI_STATUS Status; 979 1.1.1.11 christos DT_SUBTABLE *Subtable; 980 1.1.1.11 christos DT_SUBTABLE *ParentTable; 981 1.1.1.11 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 982 1.1.1.11 christos ACPI_CEDT_HEADER *CedtHeader; 983 1.1.1.11 christos DT_FIELD *SubtableStart; 984 1.1.1.11 christos 985 1.1.1.11 christos 986 1.1.1.11 christos /* Walk the parse tree */ 987 1.1.1.11 christos 988 1.1.1.11 christos while (*PFieldList) 989 1.1.1.11 christos { 990 1.1.1.14 christos /* if CFMWS and has more than one target, then set to zero later */ 991 1.1.1.14 christos 992 1.1.1.14 christos int InsertFlag = 1; 993 1.1.1.11 christos SubtableStart = *PFieldList; 994 1.1.1.11 christos 995 1.1.1.11 christos /* CEDT Header */ 996 1.1.1.11 christos 997 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedtHdr, 998 1.1.1.11 christos &Subtable); 999 1.1.1.11 christos if (ACPI_FAILURE (Status)) 1000 1.1.1.11 christos { 1001 1.1.1.11 christos return (Status); 1002 1.1.1.11 christos } 1003 1.1.1.11 christos 1004 1.1.1.11 christos ParentTable = DtPeekSubtable (); 1005 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 1006 1.1.1.11 christos DtPushSubtable (Subtable); 1007 1.1.1.11 christos 1008 1.1.1.11 christos CedtHeader = ACPI_CAST_PTR (ACPI_CEDT_HEADER, Subtable->Buffer); 1009 1.1.1.11 christos 1010 1.1.1.11 christos switch (CedtHeader->Type) 1011 1.1.1.11 christos { 1012 1.1.1.11 christos case ACPI_CEDT_TYPE_CHBS: 1013 1.1.1.14 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt0, &Subtable); 1014 1.1.1.14 christos if (ACPI_FAILURE (Status)) 1015 1.1.1.14 christos { 1016 1.1.1.14 christos return (Status); 1017 1.1.1.14 christos } 1018 1.1.1.14 christos break; 1019 1.1.1.14 christos case ACPI_CEDT_TYPE_CFMWS: { 1020 1.1.1.14 christos unsigned char *dump; 1021 1.1.1.14 christos unsigned int idx, offset, max = 0; 1022 1.1.1.14 christos 1023 1.1.1.14 christos /* Compile table with first "Interleave target" */ 1024 1.1.1.11 christos 1025 1.1.1.14 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt1, &Subtable); 1026 1.1.1.14 christos if (ACPI_FAILURE (Status)) 1027 1.1.1.14 christos { 1028 1.1.1.14 christos return (Status); 1029 1.1.1.14 christos } 1030 1.1.1.14 christos 1031 1.1.1.14 christos /* Look in buffer for the number of targets */ 1032 1.1.1.14 christos offset = (unsigned int) ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveWays); 1033 1.1.1.14 christos dump = (unsigned char *) Subtable->Buffer - 4; /* place at beginning of cedt1 */ 1034 1.1.1.16 christos max = 0x01 << dump[offset]; /* 2^max, so 0=1, 1=2, 2=4, 3=8. 8 is MAX */ 1035 1.1.1.14 christos if (max > 8) max=1; /* Error in encoding Interleaving Ways. */ 1036 1.1.1.14 christos if (max == 1) /* if only one target, then break here. */ 1037 1.1.1.14 christos break; /* break if only one target. */ 1038 1.1.1.14 christos 1039 1.1.1.14 christos /* We need to add more interleave targets, so write the current Subtable. */ 1040 1.1.1.14 christos 1041 1.1.1.14 christos ParentTable = DtPeekSubtable (); 1042 1.1.1.14 christos DtInsertSubtable (ParentTable, Subtable); /* Insert AcpiDmTableInfoCedt1 table so we can put in */ 1043 1.1.1.14 christos DtPushSubtable (Subtable); /* the targets > the first. */ 1044 1.1.1.14 christos 1045 1.1.1.14 christos /* Now, find out all interleave targets beyond the first. */ 1046 1.1.1.14 christos 1047 1.1.1.14 christos for (idx = 1; idx < max; idx++) { 1048 1.1.1.14 christos ParentTable = DtPeekSubtable (); 1049 1.1.1.14 christos 1050 1.1.1.14 christos if (*PFieldList) 1051 1.1.1.14 christos { 1052 1.1.1.14 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt1_te, &Subtable); 1053 1.1.1.14 christos if (ACPI_FAILURE (Status)) 1054 1.1.1.14 christos { 1055 1.1.1.14 christos return (Status); 1056 1.1.1.14 christos } 1057 1.1.1.14 christos if (Subtable) 1058 1.1.1.14 christos { 1059 1.1.1.14 christos DtInsertSubtable (ParentTable, Subtable); /* got a target, so insert table. */ 1060 1.1.1.14 christos InsertFlag = 0; 1061 1.1.1.14 christos } 1062 1.1.1.14 christos } 1063 1.1.1.14 christos } 1064 1.1.1.14 christos 1065 1.1.1.14 christos DtPopSubtable (); 1066 1.1.1.14 christos ParentTable = DtPeekSubtable (); 1067 1.1.1.11 christos break; 1068 1.1.1.14 christos } 1069 1.1.1.17 christos case ACPI_CEDT_TYPE_CXIMS: { 1070 1.1.1.17 christos unsigned char *dump; 1071 1.1.1.17 christos unsigned int idx, offset, max = 0; 1072 1.1.1.17 christos 1073 1.1.1.17 christos /* Compile table with first "Xor map" */ 1074 1.1.1.17 christos 1075 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt2, &Subtable); 1076 1.1.1.17 christos if (ACPI_FAILURE (Status)) 1077 1.1.1.17 christos { 1078 1.1.1.17 christos return (Status); 1079 1.1.1.17 christos } 1080 1.1.1.17 christos 1081 1.1.1.17 christos /* Look in buffer for the number of Xor maps */ 1082 1.1.1.17 christos offset = (unsigned int) ACPI_OFFSET (ACPI_CEDT_CXIMS, NrXormaps); 1083 1.1.1.17 christos dump = (unsigned char *) Subtable->Buffer - 4; /* place at beginning of cedt2 */ 1084 1.1.1.17 christos max = dump[offset]; 1085 1.1.1.17 christos 1086 1.1.1.17 christos /* We need to add more XOR maps, so write the current Subtable. */ 1087 1.1.1.17 christos 1088 1.1.1.17 christos ParentTable = DtPeekSubtable (); 1089 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); /* Insert AcpiDmTableInfoCedt2 table so we can put in */ 1090 1.1.1.17 christos DtPushSubtable (Subtable); 1091 1.1.1.17 christos 1092 1.1.1.17 christos /* Now, find out all Xor maps beyond the first. */ 1093 1.1.1.17 christos 1094 1.1.1.17 christos for (idx = 1; idx < max; idx++) { 1095 1.1.1.17 christos ParentTable = DtPeekSubtable (); 1096 1.1.1.17 christos 1097 1.1.1.17 christos if (*PFieldList) 1098 1.1.1.17 christos { 1099 1.1.1.17 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt2_te, &Subtable); 1100 1.1.1.17 christos if (ACPI_FAILURE (Status)) 1101 1.1.1.17 christos { 1102 1.1.1.17 christos return (Status); 1103 1.1.1.17 christos } 1104 1.1.1.17 christos if (Subtable) 1105 1.1.1.17 christos { 1106 1.1.1.17 christos DtInsertSubtable (ParentTable, Subtable); /* got an Xor map, so insert table. */ 1107 1.1.1.17 christos InsertFlag = 0; 1108 1.1.1.17 christos } 1109 1.1.1.17 christos } 1110 1.1.1.17 christos } 1111 1.1.1.17 christos 1112 1.1.1.17 christos DtPopSubtable (); 1113 1.1.1.17 christos ParentTable = DtPeekSubtable (); 1114 1.1.1.17 christos break; 1115 1.1.1.17 christos } 1116 1.1.1.11 christos 1117 1.1.1.11 christos default: 1118 1.1.1.11 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CEDT"); 1119 1.1.1.11 christos return (AE_ERROR); 1120 1.1.1.11 christos } 1121 1.1.1.11 christos 1122 1.1.1.11 christos ParentTable = DtPeekSubtable (); 1123 1.1.1.14 christos if (InsertFlag == 1) { 1124 1.1.1.14 christos DtInsertSubtable (ParentTable, Subtable); 1125 1.1.1.14 christos } 1126 1.1.1.11 christos DtPopSubtable (); 1127 1.1.1.11 christos } 1128 1.1.1.11 christos 1129 1.1.1.11 christos return (AE_OK); 1130 1.1.1.11 christos } 1131 1.1.1.11 christos 1132 1.1.1.11 christos 1133 1.1.1.11 christos /****************************************************************************** 1134 1.1.1.11 christos * 1135 1.1 christos * FUNCTION: DtCompileCpep 1136 1.1 christos * 1137 1.1 christos * PARAMETERS: List - Current field list pointer 1138 1.1 christos * 1139 1.1 christos * RETURN: Status 1140 1.1 christos * 1141 1.1 christos * DESCRIPTION: Compile CPEP. 1142 1.1 christos * 1143 1.1 christos *****************************************************************************/ 1144 1.1 christos 1145 1.1 christos ACPI_STATUS 1146 1.1 christos DtCompileCpep ( 1147 1.1 christos void **List) 1148 1.1 christos { 1149 1.1 christos ACPI_STATUS Status; 1150 1.1 christos 1151 1.1 christos 1152 1.1 christos Status = DtCompileTwoSubtables (List, 1153 1.1 christos AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0); 1154 1.1 christos return (Status); 1155 1.1 christos } 1156 1.1 christos 1157 1.1 christos 1158 1.1 christos /****************************************************************************** 1159 1.1 christos * 1160 1.1 christos * FUNCTION: DtCompileCsrt 1161 1.1 christos * 1162 1.1 christos * PARAMETERS: List - Current field list pointer 1163 1.1 christos * 1164 1.1 christos * RETURN: Status 1165 1.1 christos * 1166 1.1 christos * DESCRIPTION: Compile CSRT. 1167 1.1 christos * 1168 1.1 christos *****************************************************************************/ 1169 1.1 christos 1170 1.1 christos ACPI_STATUS 1171 1.1 christos DtCompileCsrt ( 1172 1.1 christos void **List) 1173 1.1 christos { 1174 1.1 christos ACPI_STATUS Status = AE_OK; 1175 1.1 christos DT_SUBTABLE *Subtable; 1176 1.1 christos DT_SUBTABLE *ParentTable; 1177 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1178 1.1 christos UINT32 DescriptorCount; 1179 1.1 christos UINT32 GroupLength; 1180 1.1 christos 1181 1.1 christos 1182 1.1 christos /* Subtables (Resource Groups) */ 1183 1.1 christos 1184 1.1 christos ParentTable = DtPeekSubtable (); 1185 1.1 christos while (*PFieldList) 1186 1.1 christos { 1187 1.1 christos /* Resource group subtable */ 1188 1.1 christos 1189 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0, 1190 1.1.1.7 christos &Subtable); 1191 1.1 christos if (ACPI_FAILURE (Status)) 1192 1.1 christos { 1193 1.1 christos return (Status); 1194 1.1 christos } 1195 1.1 christos 1196 1.1 christos /* Compute the number of resource descriptors */ 1197 1.1 christos 1198 1.1 christos GroupLength = 1199 1.1 christos (ACPI_CAST_PTR (ACPI_CSRT_GROUP, 1200 1.1 christos Subtable->Buffer))->Length - 1201 1.1 christos (ACPI_CAST_PTR (ACPI_CSRT_GROUP, 1202 1.1 christos Subtable->Buffer))->SharedInfoLength - 1203 1.1 christos sizeof (ACPI_CSRT_GROUP); 1204 1.1 christos 1205 1.1 christos DescriptorCount = (GroupLength / 1206 1.1 christos sizeof (ACPI_CSRT_DESCRIPTOR)); 1207 1.1 christos 1208 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1209 1.1 christos DtPushSubtable (Subtable); 1210 1.1 christos ParentTable = DtPeekSubtable (); 1211 1.1 christos 1212 1.1 christos /* Shared info subtable (One per resource group) */ 1213 1.1 christos 1214 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1, 1215 1.1.1.7 christos &Subtable); 1216 1.1 christos if (ACPI_FAILURE (Status)) 1217 1.1 christos { 1218 1.1 christos return (Status); 1219 1.1 christos } 1220 1.1 christos 1221 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1222 1.1 christos 1223 1.1 christos /* Sub-Subtables (Resource Descriptors) */ 1224 1.1 christos 1225 1.1 christos while (*PFieldList && DescriptorCount) 1226 1.1 christos { 1227 1.1 christos 1228 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2, 1229 1.1.1.7 christos &Subtable); 1230 1.1 christos if (ACPI_FAILURE (Status)) 1231 1.1 christos { 1232 1.1 christos return (Status); 1233 1.1 christos } 1234 1.1 christos 1235 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1236 1.1 christos 1237 1.1 christos DtPushSubtable (Subtable); 1238 1.1 christos ParentTable = DtPeekSubtable (); 1239 1.1 christos if (*PFieldList) 1240 1.1 christos { 1241 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a, 1242 1.1.1.7 christos &Subtable); 1243 1.1 christos if (ACPI_FAILURE (Status)) 1244 1.1 christos { 1245 1.1 christos return (Status); 1246 1.1 christos } 1247 1.1 christos if (Subtable) 1248 1.1 christos { 1249 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1250 1.1 christos } 1251 1.1 christos } 1252 1.1 christos 1253 1.1 christos DtPopSubtable (); 1254 1.1 christos ParentTable = DtPeekSubtable (); 1255 1.1 christos DescriptorCount--; 1256 1.1 christos } 1257 1.1 christos 1258 1.1 christos DtPopSubtable (); 1259 1.1 christos ParentTable = DtPeekSubtable (); 1260 1.1 christos } 1261 1.1 christos 1262 1.1 christos return (Status); 1263 1.1 christos } 1264 1.1 christos 1265 1.1 christos 1266 1.1 christos /****************************************************************************** 1267 1.1 christos * 1268 1.1 christos * FUNCTION: DtCompileDbg2 1269 1.1 christos * 1270 1.1 christos * PARAMETERS: List - Current field list pointer 1271 1.1 christos * 1272 1.1 christos * RETURN: Status 1273 1.1 christos * 1274 1.1 christos * DESCRIPTION: Compile DBG2. 1275 1.1 christos * 1276 1.1 christos *****************************************************************************/ 1277 1.1 christos 1278 1.1 christos ACPI_STATUS 1279 1.1 christos DtCompileDbg2 ( 1280 1.1 christos void **List) 1281 1.1 christos { 1282 1.1 christos ACPI_STATUS Status; 1283 1.1 christos DT_SUBTABLE *Subtable; 1284 1.1 christos DT_SUBTABLE *ParentTable; 1285 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1286 1.1 christos UINT32 SubtableCount; 1287 1.1 christos ACPI_DBG2_HEADER *Dbg2Header; 1288 1.1 christos ACPI_DBG2_DEVICE *DeviceInfo; 1289 1.1 christos UINT16 CurrentOffset; 1290 1.1 christos UINT32 i; 1291 1.1 christos 1292 1.1 christos 1293 1.1 christos /* Main table */ 1294 1.1 christos 1295 1.1.1.7 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable); 1296 1.1 christos if (ACPI_FAILURE (Status)) 1297 1.1 christos { 1298 1.1 christos return (Status); 1299 1.1 christos } 1300 1.1 christos 1301 1.1 christos ParentTable = DtPeekSubtable (); 1302 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1303 1.1 christos 1304 1.1 christos /* Main table fields */ 1305 1.1 christos 1306 1.1 christos Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer); 1307 1.1 christos Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF ( 1308 1.1 christos ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header); 1309 1.1 christos 1310 1.1 christos SubtableCount = Dbg2Header->InfoCount; 1311 1.1 christos DtPushSubtable (Subtable); 1312 1.1 christos 1313 1.1 christos /* Process all Device Information subtables (Count = InfoCount) */ 1314 1.1 christos 1315 1.1 christos while (*PFieldList && SubtableCount) 1316 1.1 christos { 1317 1.1 christos /* Subtable: Debug Device Information */ 1318 1.1 christos 1319 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device, 1320 1.1.1.7 christos &Subtable); 1321 1.1 christos if (ACPI_FAILURE (Status)) 1322 1.1 christos { 1323 1.1 christos return (Status); 1324 1.1 christos } 1325 1.1 christos 1326 1.1 christos DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer); 1327 1.1 christos CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE); 1328 1.1 christos 1329 1.1 christos ParentTable = DtPeekSubtable (); 1330 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1331 1.1 christos DtPushSubtable (Subtable); 1332 1.1 christos 1333 1.1 christos ParentTable = DtPeekSubtable (); 1334 1.1 christos 1335 1.1 christos /* BaseAddressRegister GAS array (Required, size is RegisterCount) */ 1336 1.1 christos 1337 1.1 christos DeviceInfo->BaseAddressOffset = CurrentOffset; 1338 1.1 christos for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) 1339 1.1 christos { 1340 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr, 1341 1.1.1.7 christos &Subtable); 1342 1.1 christos if (ACPI_FAILURE (Status)) 1343 1.1 christos { 1344 1.1 christos return (Status); 1345 1.1 christos } 1346 1.1 christos 1347 1.1 christos CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS); 1348 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1349 1.1 christos } 1350 1.1 christos 1351 1.1 christos /* AddressSize array (Required, size = RegisterCount) */ 1352 1.1 christos 1353 1.1 christos DeviceInfo->AddressSizeOffset = CurrentOffset; 1354 1.1 christos for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) 1355 1.1 christos { 1356 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size, 1357 1.1.1.7 christos &Subtable); 1358 1.1 christos if (ACPI_FAILURE (Status)) 1359 1.1 christos { 1360 1.1 christos return (Status); 1361 1.1 christos } 1362 1.1 christos 1363 1.1 christos CurrentOffset += (UINT16) sizeof (UINT32); 1364 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1365 1.1 christos } 1366 1.1 christos 1367 1.1 christos /* NamespaceString device identifier (Required, size = NamePathLength) */ 1368 1.1 christos 1369 1.1 christos DeviceInfo->NamepathOffset = CurrentOffset; 1370 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name, 1371 1.1.1.7 christos &Subtable); 1372 1.1 christos if (ACPI_FAILURE (Status)) 1373 1.1 christos { 1374 1.1 christos return (Status); 1375 1.1 christos } 1376 1.1 christos 1377 1.1 christos /* Update the device info header */ 1378 1.1 christos 1379 1.1 christos DeviceInfo->NamepathLength = (UINT16) Subtable->Length; 1380 1.1 christos CurrentOffset += (UINT16) DeviceInfo->NamepathLength; 1381 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1382 1.1 christos 1383 1.1 christos /* OemData - Variable-length data (Optional, size = OemDataLength) */ 1384 1.1 christos 1385 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData, 1386 1.1.1.7 christos &Subtable); 1387 1.1.1.7 christos if (Status == AE_END_OF_TABLE) 1388 1.1.1.7 christos { 1389 1.1.1.7 christos /* optional field was not found and we're at the end of the file */ 1390 1.1.1.7 christos 1391 1.1.1.7 christos goto subtableDone; 1392 1.1.1.7 christos } 1393 1.1.1.7 christos else if (ACPI_FAILURE (Status)) 1394 1.1 christos { 1395 1.1 christos return (Status); 1396 1.1 christos } 1397 1.1 christos 1398 1.1 christos /* Update the device info header (zeros if no OEM data present) */ 1399 1.1 christos 1400 1.1 christos DeviceInfo->OemDataOffset = 0; 1401 1.1 christos DeviceInfo->OemDataLength = 0; 1402 1.1 christos 1403 1.1 christos /* Optional subtable (OemData) */ 1404 1.1 christos 1405 1.1 christos if (Subtable && Subtable->Length) 1406 1.1 christos { 1407 1.1 christos DeviceInfo->OemDataOffset = CurrentOffset; 1408 1.1 christos DeviceInfo->OemDataLength = (UINT16) Subtable->Length; 1409 1.1 christos 1410 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1411 1.1 christos } 1412 1.1.1.7 christos subtableDone: 1413 1.1 christos SubtableCount--; 1414 1.1 christos DtPopSubtable (); /* Get next Device Information subtable */ 1415 1.1 christos } 1416 1.1 christos 1417 1.1 christos DtPopSubtable (); 1418 1.1 christos return (AE_OK); 1419 1.1 christos } 1420 1.1 christos 1421 1.1 christos 1422 1.1 christos /****************************************************************************** 1423 1.1 christos * 1424 1.1 christos * FUNCTION: DtCompileDmar 1425 1.1 christos * 1426 1.1 christos * PARAMETERS: List - Current field list pointer 1427 1.1 christos * 1428 1.1 christos * RETURN: Status 1429 1.1 christos * 1430 1.1 christos * DESCRIPTION: Compile DMAR. 1431 1.1 christos * 1432 1.1 christos *****************************************************************************/ 1433 1.1 christos 1434 1.1 christos ACPI_STATUS 1435 1.1 christos DtCompileDmar ( 1436 1.1 christos void **List) 1437 1.1 christos { 1438 1.1 christos ACPI_STATUS Status; 1439 1.1 christos DT_SUBTABLE *Subtable; 1440 1.1 christos DT_SUBTABLE *ParentTable; 1441 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1442 1.1 christos DT_FIELD *SubtableStart; 1443 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 1444 1.1 christos ACPI_DMAR_HEADER *DmarHeader; 1445 1.1 christos ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope; 1446 1.1 christos UINT32 DeviceScopeLength; 1447 1.1 christos UINT32 PciPathLength; 1448 1.1 christos 1449 1.1 christos 1450 1.1.1.7 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable); 1451 1.1 christos if (ACPI_FAILURE (Status)) 1452 1.1 christos { 1453 1.1 christos return (Status); 1454 1.1 christos } 1455 1.1 christos 1456 1.1 christos ParentTable = DtPeekSubtable (); 1457 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1458 1.1 christos DtPushSubtable (Subtable); 1459 1.1 christos 1460 1.1 christos while (*PFieldList) 1461 1.1 christos { 1462 1.1 christos /* DMAR Header */ 1463 1.1 christos 1464 1.1 christos SubtableStart = *PFieldList; 1465 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr, 1466 1.1.1.7 christos &Subtable); 1467 1.1 christos if (ACPI_FAILURE (Status)) 1468 1.1 christos { 1469 1.1 christos return (Status); 1470 1.1 christos } 1471 1.1 christos 1472 1.1 christos ParentTable = DtPeekSubtable (); 1473 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1474 1.1 christos DtPushSubtable (Subtable); 1475 1.1 christos 1476 1.1 christos DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer); 1477 1.1 christos 1478 1.1 christos switch (DmarHeader->Type) 1479 1.1 christos { 1480 1.1 christos case ACPI_DMAR_TYPE_HARDWARE_UNIT: 1481 1.1 christos 1482 1.1 christos InfoTable = AcpiDmTableInfoDmar0; 1483 1.1 christos break; 1484 1.1 christos 1485 1.1 christos case ACPI_DMAR_TYPE_RESERVED_MEMORY: 1486 1.1 christos 1487 1.1 christos InfoTable = AcpiDmTableInfoDmar1; 1488 1.1 christos break; 1489 1.1 christos 1490 1.1 christos case ACPI_DMAR_TYPE_ROOT_ATS: 1491 1.1 christos 1492 1.1 christos InfoTable = AcpiDmTableInfoDmar2; 1493 1.1 christos break; 1494 1.1 christos 1495 1.1 christos case ACPI_DMAR_TYPE_HARDWARE_AFFINITY: 1496 1.1 christos 1497 1.1 christos InfoTable = AcpiDmTableInfoDmar3; 1498 1.1 christos break; 1499 1.1 christos 1500 1.1 christos case ACPI_DMAR_TYPE_NAMESPACE: 1501 1.1 christos 1502 1.1 christos InfoTable = AcpiDmTableInfoDmar4; 1503 1.1 christos break; 1504 1.1 christos 1505 1.1.1.14 christos case ACPI_DMAR_TYPE_SATC: 1506 1.1.1.14 christos 1507 1.1.1.14 christos InfoTable = AcpiDmTableInfoDmar5; 1508 1.1.1.14 christos break; 1509 1.1.1.14 christos 1510 1.1.1.19 christos case ACPI_DMAR_TYPE_SIDP: 1511 1.1.1.19 christos 1512 1.1.1.19 christos InfoTable = AcpiDmTableInfoDmar6; 1513 1.1.1.19 christos break; 1514 1.1.1.19 christos 1515 1.1 christos default: 1516 1.1 christos 1517 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR"); 1518 1.1 christos return (AE_ERROR); 1519 1.1 christos } 1520 1.1 christos 1521 1.1 christos /* DMAR Subtable */ 1522 1.1 christos 1523 1.1.1.7 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1524 1.1 christos if (ACPI_FAILURE (Status)) 1525 1.1 christos { 1526 1.1 christos return (Status); 1527 1.1 christos } 1528 1.1 christos 1529 1.1 christos ParentTable = DtPeekSubtable (); 1530 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1531 1.1 christos 1532 1.1 christos /* 1533 1.1 christos * Optional Device Scope subtables 1534 1.1 christos */ 1535 1.1 christos if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || 1536 1.1 christos (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE)) 1537 1.1 christos { 1538 1.1 christos /* These types do not support device scopes */ 1539 1.1 christos 1540 1.1 christos DtPopSubtable (); 1541 1.1 christos continue; 1542 1.1 christos } 1543 1.1 christos 1544 1.1 christos DtPushSubtable (Subtable); 1545 1.1 christos DeviceScopeLength = DmarHeader->Length - Subtable->Length - 1546 1.1 christos ParentTable->Length; 1547 1.1 christos while (DeviceScopeLength) 1548 1.1 christos { 1549 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope, 1550 1.1.1.7 christos &Subtable); 1551 1.1 christos if (Status == AE_NOT_FOUND) 1552 1.1 christos { 1553 1.1 christos break; 1554 1.1 christos } 1555 1.1 christos 1556 1.1 christos ParentTable = DtPeekSubtable (); 1557 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1558 1.1 christos DtPushSubtable (Subtable); 1559 1.1 christos 1560 1.1 christos DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer); 1561 1.1 christos 1562 1.1 christos /* Optional PCI Paths */ 1563 1.1 christos 1564 1.1 christos PciPathLength = DmarDeviceScope->Length - Subtable->Length; 1565 1.1 christos while (PciPathLength) 1566 1.1 christos { 1567 1.1 christos Status = DtCompileTable (PFieldList, TableInfoDmarPciPath, 1568 1.1.1.7 christos &Subtable); 1569 1.1 christos if (Status == AE_NOT_FOUND) 1570 1.1 christos { 1571 1.1 christos DtPopSubtable (); 1572 1.1 christos break; 1573 1.1 christos } 1574 1.1 christos 1575 1.1 christos ParentTable = DtPeekSubtable (); 1576 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1577 1.1 christos PciPathLength -= Subtable->Length; 1578 1.1 christos } 1579 1.1 christos 1580 1.1 christos DtPopSubtable (); 1581 1.1 christos DeviceScopeLength -= DmarDeviceScope->Length; 1582 1.1 christos } 1583 1.1 christos 1584 1.1 christos DtPopSubtable (); 1585 1.1 christos DtPopSubtable (); 1586 1.1 christos } 1587 1.1 christos 1588 1.1 christos return (AE_OK); 1589 1.1 christos } 1590 1.1 christos 1591 1.1 christos 1592 1.1 christos /****************************************************************************** 1593 1.1 christos * 1594 1.1 christos * FUNCTION: DtCompileDrtm 1595 1.1 christos * 1596 1.1 christos * PARAMETERS: List - Current field list pointer 1597 1.1 christos * 1598 1.1 christos * RETURN: Status 1599 1.1 christos * 1600 1.1 christos * DESCRIPTION: Compile DRTM. 1601 1.1 christos * 1602 1.1 christos *****************************************************************************/ 1603 1.1 christos 1604 1.1 christos ACPI_STATUS 1605 1.1 christos DtCompileDrtm ( 1606 1.1 christos void **List) 1607 1.1 christos { 1608 1.1 christos ACPI_STATUS Status; 1609 1.1 christos DT_SUBTABLE *Subtable; 1610 1.1 christos DT_SUBTABLE *ParentTable; 1611 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1612 1.1 christos UINT32 Count; 1613 1.1 christos /* ACPI_TABLE_DRTM *Drtm; */ 1614 1.1 christos ACPI_DRTM_VTABLE_LIST *DrtmVtl; 1615 1.1 christos ACPI_DRTM_RESOURCE_LIST *DrtmRl; 1616 1.1 christos /* ACPI_DRTM_DPS_ID *DrtmDps; */ 1617 1.1 christos 1618 1.1 christos 1619 1.1 christos ParentTable = DtPeekSubtable (); 1620 1.1 christos 1621 1.1 christos /* Compile DRTM header */ 1622 1.1 christos 1623 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm, 1624 1.1.1.7 christos &Subtable); 1625 1.1 christos if (ACPI_FAILURE (Status)) 1626 1.1 christos { 1627 1.1 christos return (Status); 1628 1.1 christos } 1629 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1630 1.1 christos 1631 1.1 christos /* 1632 1.1.1.9 christos * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 1633 1.1 christos * should be taken to avoid accessing ACPI_TABLE_HADER fields. 1634 1.1 christos */ 1635 1.1 christos #if 0 1636 1.1 christos Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM, 1637 1.1 christos Subtable->Buffer, sizeof (ACPI_TABLE_HEADER)); 1638 1.1 christos #endif 1639 1.1 christos /* Compile VTL */ 1640 1.1 christos 1641 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0, 1642 1.1.1.7 christos &Subtable); 1643 1.1 christos if (ACPI_FAILURE (Status)) 1644 1.1 christos { 1645 1.1 christos return (Status); 1646 1.1 christos } 1647 1.1 christos 1648 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1649 1.1 christos DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer); 1650 1.1 christos 1651 1.1 christos DtPushSubtable (Subtable); 1652 1.1 christos ParentTable = DtPeekSubtable (); 1653 1.1 christos Count = 0; 1654 1.1 christos 1655 1.1 christos while (*PFieldList) 1656 1.1 christos { 1657 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a, 1658 1.1.1.7 christos &Subtable); 1659 1.1 christos if (ACPI_FAILURE (Status)) 1660 1.1 christos { 1661 1.1 christos return (Status); 1662 1.1 christos } 1663 1.1 christos if (!Subtable) 1664 1.1 christos { 1665 1.1 christos break; 1666 1.1 christos } 1667 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1668 1.1 christos Count++; 1669 1.1 christos } 1670 1.1 christos 1671 1.1 christos DrtmVtl->ValidatedTableCount = Count; 1672 1.1 christos DtPopSubtable (); 1673 1.1 christos ParentTable = DtPeekSubtable (); 1674 1.1 christos 1675 1.1 christos /* Compile RL */ 1676 1.1 christos 1677 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1, 1678 1.1.1.7 christos &Subtable); 1679 1.1 christos if (ACPI_FAILURE (Status)) 1680 1.1 christos { 1681 1.1 christos return (Status); 1682 1.1 christos } 1683 1.1 christos 1684 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1685 1.1 christos DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer); 1686 1.1 christos 1687 1.1 christos DtPushSubtable (Subtable); 1688 1.1 christos ParentTable = DtPeekSubtable (); 1689 1.1 christos Count = 0; 1690 1.1 christos 1691 1.1 christos while (*PFieldList) 1692 1.1 christos { 1693 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a, 1694 1.1.1.7 christos &Subtable); 1695 1.1 christos if (ACPI_FAILURE (Status)) 1696 1.1 christos { 1697 1.1 christos return (Status); 1698 1.1 christos } 1699 1.1 christos 1700 1.1 christos if (!Subtable) 1701 1.1 christos { 1702 1.1 christos break; 1703 1.1 christos } 1704 1.1 christos 1705 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1706 1.1 christos Count++; 1707 1.1 christos } 1708 1.1 christos 1709 1.1 christos DrtmRl->ResourceCount = Count; 1710 1.1 christos DtPopSubtable (); 1711 1.1 christos ParentTable = DtPeekSubtable (); 1712 1.1 christos 1713 1.1 christos /* Compile DPS */ 1714 1.1 christos 1715 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2, 1716 1.1.1.7 christos &Subtable); 1717 1.1 christos if (ACPI_FAILURE (Status)) 1718 1.1 christos { 1719 1.1 christos return (Status); 1720 1.1 christos } 1721 1.1 christos DtInsertSubtable (ParentTable, Subtable); 1722 1.1 christos /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/ 1723 1.1 christos 1724 1.1 christos 1725 1.1 christos return (AE_OK); 1726 1.1 christos } 1727 1.1 christos 1728 1.1 christos 1729 1.1 christos /****************************************************************************** 1730 1.1 christos * 1731 1.1 christos * FUNCTION: DtCompileEinj 1732 1.1 christos * 1733 1.1 christos * PARAMETERS: List - Current field list pointer 1734 1.1 christos * 1735 1.1 christos * RETURN: Status 1736 1.1 christos * 1737 1.1 christos * DESCRIPTION: Compile EINJ. 1738 1.1 christos * 1739 1.1 christos *****************************************************************************/ 1740 1.1 christos 1741 1.1 christos ACPI_STATUS 1742 1.1 christos DtCompileEinj ( 1743 1.1 christos void **List) 1744 1.1 christos { 1745 1.1 christos ACPI_STATUS Status; 1746 1.1 christos 1747 1.1 christos 1748 1.1 christos Status = DtCompileTwoSubtables (List, 1749 1.1 christos AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0); 1750 1.1 christos return (Status); 1751 1.1 christos } 1752 1.1 christos 1753 1.1 christos 1754 1.1 christos /****************************************************************************** 1755 1.1 christos * 1756 1.1.1.19 christos * FUNCTION: DtCompileErdt 1757 1.1.1.19 christos * 1758 1.1.1.19 christos * PARAMETERS: List - Current field list pointer 1759 1.1.1.19 christos * 1760 1.1.1.19 christos * RETURN: Status 1761 1.1.1.19 christos * 1762 1.1.1.19 christos * DESCRIPTION: Compile ERST. Complex table with subtables and subsubtables. 1763 1.1.1.19 christos * 1764 1.1.1.19 christos *****************************************************************************/ 1765 1.1.1.19 christos 1766 1.1.1.19 christos ACPI_STATUS 1767 1.1.1.19 christos DtCompileErdt ( 1768 1.1.1.19 christos void **List) 1769 1.1.1.19 christos { 1770 1.1.1.19 christos ACPI_STATUS Status; 1771 1.1.1.19 christos DT_SUBTABLE *Subtable, *RmddSubtable = NULL, *Subsubtable; 1772 1.1.1.19 christos DT_SUBTABLE *ParentTable; 1773 1.1.1.19 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 1774 1.1.1.19 christos DT_FIELD *SubtableStart; 1775 1.1.1.19 christos ACPI_SUBTBL_HDR_16 *ErdtHeader; 1776 1.1.1.19 christos ACPI_DMTABLE_INFO *InfoTable; 1777 1.1.1.19 christos ACPI_ERDT_MMRC *Mmrc; 1778 1.1.1.19 christos ACPI_ERDT_IBRD *Ibrd; 1779 1.1.1.19 christos UINT32 NumEntries; 1780 1.1.1.19 christos BOOLEAN SeenRmdd = FALSE; 1781 1.1.1.19 christos BOOLEAN SeenSubtable = FALSE; 1782 1.1.1.19 christos 1783 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoErdt, 1784 1.1.1.19 christos &Subtable); 1785 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1786 1.1.1.19 christos { 1787 1.1.1.19 christos return (Status); 1788 1.1.1.19 christos } 1789 1.1.1.19 christos 1790 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1791 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 1792 1.1.1.19 christos 1793 1.1.1.19 christos while (*PFieldList) 1794 1.1.1.19 christos { 1795 1.1.1.19 christos SubtableStart = *PFieldList; 1796 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoErdtHdr, 1797 1.1.1.19 christos &Subtable); 1798 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1799 1.1.1.19 christos { 1800 1.1.1.19 christos return (Status); 1801 1.1.1.19 christos } 1802 1.1.1.19 christos 1803 1.1.1.19 christos ErdtHeader = ACPI_CAST_PTR (ACPI_SUBTBL_HDR_16, Subtable->Buffer); 1804 1.1.1.19 christos 1805 1.1.1.19 christos /* RMDD tables at top level. All others are subtables of preceeding RMDD */ 1806 1.1.1.19 christos if (ErdtHeader->Type == ACPI_ERDT_TYPE_RMDD) 1807 1.1.1.19 christos { 1808 1.1.1.19 christos if (SeenRmdd && SeenSubtable) 1809 1.1.1.19 christos DtPopSubtable (); 1810 1.1.1.19 christos SeenRmdd = TRUE; 1811 1.1.1.19 christos SeenSubtable = FALSE; 1812 1.1.1.19 christos RmddSubtable = Subtable; 1813 1.1.1.19 christos } 1814 1.1.1.19 christos else 1815 1.1.1.19 christos { 1816 1.1.1.19 christos if (!SeenSubtable) 1817 1.1.1.19 christos { 1818 1.1.1.19 christos DtPushSubtable (RmddSubtable); 1819 1.1.1.19 christos SeenSubtable = TRUE; 1820 1.1.1.19 christos } 1821 1.1.1.19 christos } 1822 1.1.1.19 christos 1823 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1824 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 1825 1.1.1.19 christos DtPushSubtable (Subtable); 1826 1.1.1.19 christos 1827 1.1.1.19 christos switch (ErdtHeader->Type) 1828 1.1.1.19 christos { 1829 1.1.1.19 christos case ACPI_ERDT_TYPE_RMDD: 1830 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtRmdd; 1831 1.1.1.19 christos break; 1832 1.1.1.19 christos 1833 1.1.1.19 christos case ACPI_ERDT_TYPE_CACD: 1834 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtCacd; 1835 1.1.1.19 christos break; 1836 1.1.1.19 christos 1837 1.1.1.19 christos case ACPI_ERDT_TYPE_DACD: 1838 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtDacd; 1839 1.1.1.19 christos break; 1840 1.1.1.19 christos 1841 1.1.1.19 christos case ACPI_ERDT_TYPE_CMRC: 1842 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtCmrc; 1843 1.1.1.19 christos break; 1844 1.1.1.19 christos 1845 1.1.1.19 christos case ACPI_ERDT_TYPE_MMRC: 1846 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtMmrc; 1847 1.1.1.19 christos break; 1848 1.1.1.19 christos 1849 1.1.1.19 christos case ACPI_ERDT_TYPE_MARC: 1850 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtMarc; 1851 1.1.1.19 christos break; 1852 1.1.1.19 christos 1853 1.1.1.19 christos case ACPI_ERDT_TYPE_CARC: 1854 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtCarc; 1855 1.1.1.19 christos break; 1856 1.1.1.19 christos 1857 1.1.1.19 christos case ACPI_ERDT_TYPE_CMRD: 1858 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtCmrd; 1859 1.1.1.19 christos break; 1860 1.1.1.19 christos 1861 1.1.1.19 christos case ACPI_ERDT_TYPE_IBRD: 1862 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtIbrd; 1863 1.1.1.19 christos break; 1864 1.1.1.19 christos 1865 1.1.1.19 christos case ACPI_ERDT_TYPE_IBAD: 1866 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtIbad; 1867 1.1.1.19 christos break; 1868 1.1.1.19 christos 1869 1.1.1.19 christos case ACPI_ERDT_TYPE_CARD: 1870 1.1.1.19 christos InfoTable = AcpiDmTableInfoErdtCard; 1871 1.1.1.19 christos break; 1872 1.1.1.19 christos 1873 1.1.1.19 christos default: 1874 1.1.1.19 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ERDT"); 1875 1.1.1.19 christos return (AE_ERROR); 1876 1.1.1.19 christos } 1877 1.1.1.19 christos 1878 1.1.1.19 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 1879 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1880 1.1.1.19 christos { 1881 1.1.1.19 christos return (Status); 1882 1.1.1.19 christos } 1883 1.1.1.19 christos 1884 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1885 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 1886 1.1.1.19 christos 1887 1.1.1.19 christos /* Some subtable types end with flex arrays */ 1888 1.1.1.19 christos 1889 1.1.1.19 christos switch (ErdtHeader->Type) 1890 1.1.1.19 christos { 1891 1.1.1.19 christos case ACPI_ERDT_TYPE_CACD: 1892 1.1.1.19 christos while (*PFieldList) 1893 1.1.1.19 christos { 1894 1.1.1.19 christos Status = DtCompileTable (PFieldList, 1895 1.1.1.19 christos AcpiDmTableInfoErdtCacdX2apic, &Subtable); 1896 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1897 1.1.1.19 christos { 1898 1.1.1.19 christos return (Status); 1899 1.1.1.19 christos } 1900 1.1.1.19 christos if (!Subtable) 1901 1.1.1.19 christos { 1902 1.1.1.19 christos break; 1903 1.1.1.19 christos } 1904 1.1.1.19 christos 1905 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1906 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 1907 1.1.1.19 christos } 1908 1.1.1.19 christos break; 1909 1.1.1.19 christos 1910 1.1.1.19 christos case ACPI_ERDT_TYPE_DACD: 1911 1.1.1.19 christos while (*PFieldList) 1912 1.1.1.19 christos { 1913 1.1.1.19 christos Status = DtCompileTable (PFieldList, 1914 1.1.1.19 christos AcpiDmTableInfoErdtDacdScope, &Subtable); 1915 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1916 1.1.1.19 christos { 1917 1.1.1.19 christos return (Status); 1918 1.1.1.19 christos } 1919 1.1.1.19 christos if (!Subtable) 1920 1.1.1.19 christos { 1921 1.1.1.19 christos break; 1922 1.1.1.19 christos } 1923 1.1.1.19 christos 1924 1.1.1.19 christos DtPushSubtable (Subtable); 1925 1.1.1.19 christos while (*PFieldList) 1926 1.1.1.19 christos { 1927 1.1.1.19 christos Status = DtCompileTable (PFieldList, 1928 1.1.1.19 christos AcpiDmTableInfoErdtDacdPath, &Subsubtable); 1929 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1930 1.1.1.19 christos { 1931 1.1.1.19 christos return (Status); 1932 1.1.1.19 christos } 1933 1.1.1.19 christos if (!Subsubtable) 1934 1.1.1.19 christos { 1935 1.1.1.19 christos break; 1936 1.1.1.19 christos } 1937 1.1.1.19 christos 1938 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1939 1.1.1.19 christos DtInsertSubtable (ParentTable, Subsubtable); 1940 1.1.1.19 christos } 1941 1.1.1.19 christos DtPopSubtable (); 1942 1.1.1.19 christos 1943 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1944 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 1945 1.1.1.19 christos } 1946 1.1.1.19 christos break; 1947 1.1.1.19 christos 1948 1.1.1.19 christos case ACPI_ERDT_TYPE_MMRC: 1949 1.1.1.19 christos Mmrc = ACPI_SUB_PTR (ACPI_ERDT_MMRC, Subtable->Buffer, 1950 1.1.1.19 christos sizeof(ACPI_SUBTBL_HDR_16)); 1951 1.1.1.19 christos NumEntries = 0; 1952 1.1.1.19 christos while (*PFieldList) 1953 1.1.1.19 christos { 1954 1.1.1.19 christos Status = DtCompileTable (PFieldList, 1955 1.1.1.19 christos AcpiDmTableInfoErdtMmrcCorrFactor, &Subtable); 1956 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1957 1.1.1.19 christos { 1958 1.1.1.19 christos return (Status); 1959 1.1.1.19 christos } 1960 1.1.1.19 christos if (!Subtable) 1961 1.1.1.19 christos { 1962 1.1.1.19 christos break; 1963 1.1.1.19 christos } 1964 1.1.1.19 christos 1965 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1966 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 1967 1.1.1.19 christos NumEntries++; 1968 1.1.1.19 christos } 1969 1.1.1.19 christos Mmrc->CorrFactorListLen = NumEntries; 1970 1.1.1.19 christos break; 1971 1.1.1.19 christos 1972 1.1.1.19 christos case ACPI_ERDT_TYPE_IBRD: 1973 1.1.1.19 christos Ibrd = ACPI_SUB_PTR (ACPI_ERDT_IBRD, Subtable->Buffer, 1974 1.1.1.19 christos sizeof(ACPI_SUBTBL_HDR_16)); 1975 1.1.1.19 christos NumEntries = 0; 1976 1.1.1.19 christos while (*PFieldList) 1977 1.1.1.19 christos { 1978 1.1.1.19 christos Status = DtCompileTable (PFieldList, 1979 1.1.1.19 christos AcpiDmTableInfoErdtIbrdCorrFactor, &Subtable); 1980 1.1.1.19 christos if (ACPI_FAILURE (Status)) 1981 1.1.1.19 christos { 1982 1.1.1.19 christos return (Status); 1983 1.1.1.19 christos } 1984 1.1.1.19 christos if (!Subtable) 1985 1.1.1.19 christos { 1986 1.1.1.19 christos break; 1987 1.1.1.19 christos } 1988 1.1.1.19 christos 1989 1.1.1.19 christos ParentTable = DtPeekSubtable (); 1990 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 1991 1.1.1.19 christos NumEntries++; 1992 1.1.1.19 christos } 1993 1.1.1.19 christos Ibrd->CorrFactorListLen = NumEntries; 1994 1.1.1.19 christos break; 1995 1.1.1.19 christos 1996 1.1.1.19 christos default: 1997 1.1.1.19 christos /* Already checked for valid subtable type above */ 1998 1.1.1.19 christos 1999 1.1.1.19 christos break; 2000 1.1.1.19 christos } 2001 1.1.1.19 christos DtPopSubtable (); 2002 1.1.1.19 christos } 2003 1.1.1.19 christos 2004 1.1.1.19 christos if (SeenSubtable) 2005 1.1.1.19 christos { 2006 1.1.1.19 christos DtPopSubtable (); 2007 1.1.1.19 christos } 2008 1.1.1.19 christos 2009 1.1.1.19 christos return (AE_OK); 2010 1.1.1.19 christos } 2011 1.1.1.19 christos 2012 1.1.1.19 christos 2013 1.1.1.19 christos /****************************************************************************** 2014 1.1.1.19 christos * 2015 1.1 christos * FUNCTION: DtCompileErst 2016 1.1 christos * 2017 1.1 christos * PARAMETERS: List - Current field list pointer 2018 1.1 christos * 2019 1.1 christos * RETURN: Status 2020 1.1 christos * 2021 1.1 christos * DESCRIPTION: Compile ERST. 2022 1.1 christos * 2023 1.1 christos *****************************************************************************/ 2024 1.1 christos 2025 1.1 christos ACPI_STATUS 2026 1.1 christos DtCompileErst ( 2027 1.1 christos void **List) 2028 1.1 christos { 2029 1.1 christos ACPI_STATUS Status; 2030 1.1 christos 2031 1.1 christos 2032 1.1 christos Status = DtCompileTwoSubtables (List, 2033 1.1 christos AcpiDmTableInfoErst, AcpiDmTableInfoEinj0); 2034 1.1 christos return (Status); 2035 1.1 christos } 2036 1.1 christos 2037 1.1 christos 2038 1.1 christos /****************************************************************************** 2039 1.1 christos * 2040 1.1 christos * FUNCTION: DtCompileGtdt 2041 1.1 christos * 2042 1.1 christos * PARAMETERS: List - Current field list pointer 2043 1.1 christos * 2044 1.1 christos * RETURN: Status 2045 1.1 christos * 2046 1.1 christos * DESCRIPTION: Compile GTDT. 2047 1.1 christos * 2048 1.1 christos *****************************************************************************/ 2049 1.1 christos 2050 1.1 christos ACPI_STATUS 2051 1.1 christos DtCompileGtdt ( 2052 1.1 christos void **List) 2053 1.1 christos { 2054 1.1 christos ACPI_STATUS Status; 2055 1.1 christos DT_SUBTABLE *Subtable; 2056 1.1 christos DT_SUBTABLE *ParentTable; 2057 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2058 1.1 christos DT_FIELD *SubtableStart; 2059 1.1 christos ACPI_SUBTABLE_HEADER *GtdtHeader; 2060 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 2061 1.1 christos UINT32 GtCount; 2062 1.1.1.9 christos ACPI_TABLE_HEADER *Header; 2063 1.1.1.9 christos 2064 1.1.1.9 christos 2065 1.1.1.9 christos ParentTable = DtPeekSubtable (); 2066 1.1 christos 2067 1.1.1.9 christos Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 2068 1.1.1.9 christos 2069 1.1.1.9 christos /* Compile the main table */ 2070 1.1 christos 2071 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt, 2072 1.1.1.7 christos &Subtable); 2073 1.1 christos if (ACPI_FAILURE (Status)) 2074 1.1 christos { 2075 1.1 christos return (Status); 2076 1.1 christos } 2077 1.1 christos 2078 1.1.1.9 christos /* GTDT revision 3 later contains 2 extra fields before subtables */ 2079 1.1.1.9 christos 2080 1.1.1.9 christos if (Header->Revision > 2) 2081 1.1.1.9 christos { 2082 1.1.1.9 christos ParentTable = DtPeekSubtable (); 2083 1.1.1.9 christos DtInsertSubtable (ParentTable, Subtable); 2084 1.1.1.9 christos 2085 1.1.1.9 christos Status = DtCompileTable (PFieldList, 2086 1.1.1.9 christos AcpiDmTableInfoGtdtEl2, &Subtable); 2087 1.1.1.9 christos if (ACPI_FAILURE (Status)) 2088 1.1.1.9 christos { 2089 1.1.1.9 christos return (Status); 2090 1.1.1.9 christos } 2091 1.1.1.9 christos } 2092 1.1.1.9 christos 2093 1.1 christos ParentTable = DtPeekSubtable (); 2094 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2095 1.1 christos 2096 1.1 christos while (*PFieldList) 2097 1.1 christos { 2098 1.1 christos SubtableStart = *PFieldList; 2099 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr, 2100 1.1.1.7 christos &Subtable); 2101 1.1 christos if (ACPI_FAILURE (Status)) 2102 1.1 christos { 2103 1.1 christos return (Status); 2104 1.1 christos } 2105 1.1 christos 2106 1.1 christos ParentTable = DtPeekSubtable (); 2107 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2108 1.1 christos DtPushSubtable (Subtable); 2109 1.1 christos 2110 1.1 christos GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer); 2111 1.1 christos 2112 1.1 christos switch (GtdtHeader->Type) 2113 1.1 christos { 2114 1.1 christos case ACPI_GTDT_TYPE_TIMER_BLOCK: 2115 1.1 christos 2116 1.1 christos InfoTable = AcpiDmTableInfoGtdt0; 2117 1.1 christos break; 2118 1.1 christos 2119 1.1 christos case ACPI_GTDT_TYPE_WATCHDOG: 2120 1.1 christos 2121 1.1 christos InfoTable = AcpiDmTableInfoGtdt1; 2122 1.1 christos break; 2123 1.1 christos 2124 1.1 christos default: 2125 1.1 christos 2126 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT"); 2127 1.1 christos return (AE_ERROR); 2128 1.1 christos } 2129 1.1 christos 2130 1.1.1.7 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2131 1.1 christos if (ACPI_FAILURE (Status)) 2132 1.1 christos { 2133 1.1 christos return (Status); 2134 1.1 christos } 2135 1.1 christos 2136 1.1 christos ParentTable = DtPeekSubtable (); 2137 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2138 1.1 christos 2139 1.1 christos /* 2140 1.1 christos * Additional GT block subtable data 2141 1.1 christos */ 2142 1.1 christos 2143 1.1 christos switch (GtdtHeader->Type) 2144 1.1 christos { 2145 1.1 christos case ACPI_GTDT_TYPE_TIMER_BLOCK: 2146 1.1 christos 2147 1.1 christos DtPushSubtable (Subtable); 2148 1.1 christos ParentTable = DtPeekSubtable (); 2149 1.1 christos 2150 1.1 christos GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, 2151 1.1 christos Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount; 2152 1.1 christos 2153 1.1 christos while (GtCount) 2154 1.1 christos { 2155 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a, 2156 1.1.1.7 christos &Subtable); 2157 1.1 christos if (ACPI_FAILURE (Status)) 2158 1.1 christos { 2159 1.1 christos return (Status); 2160 1.1 christos } 2161 1.1 christos 2162 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2163 1.1 christos GtCount--; 2164 1.1 christos } 2165 1.1 christos 2166 1.1 christos DtPopSubtable (); 2167 1.1 christos break; 2168 1.1 christos 2169 1.1 christos default: 2170 1.1 christos 2171 1.1 christos break; 2172 1.1 christos } 2173 1.1 christos 2174 1.1 christos DtPopSubtable (); 2175 1.1 christos } 2176 1.1 christos 2177 1.1 christos return (AE_OK); 2178 1.1 christos } 2179 1.1 christos 2180 1.1 christos 2181 1.1 christos /****************************************************************************** 2182 1.1 christos * 2183 1.1 christos * FUNCTION: DtCompileFpdt 2184 1.1 christos * 2185 1.1 christos * PARAMETERS: List - Current field list pointer 2186 1.1 christos * 2187 1.1 christos * RETURN: Status 2188 1.1 christos * 2189 1.1 christos * DESCRIPTION: Compile FPDT. 2190 1.1 christos * 2191 1.1 christos *****************************************************************************/ 2192 1.1 christos 2193 1.1 christos ACPI_STATUS 2194 1.1 christos DtCompileFpdt ( 2195 1.1 christos void **List) 2196 1.1 christos { 2197 1.1 christos ACPI_STATUS Status; 2198 1.1 christos ACPI_FPDT_HEADER *FpdtHeader; 2199 1.1 christos DT_SUBTABLE *Subtable; 2200 1.1 christos DT_SUBTABLE *ParentTable; 2201 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 2202 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2203 1.1 christos DT_FIELD *SubtableStart; 2204 1.1 christos 2205 1.1 christos 2206 1.1 christos while (*PFieldList) 2207 1.1 christos { 2208 1.1 christos SubtableStart = *PFieldList; 2209 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr, 2210 1.1.1.7 christos &Subtable); 2211 1.1 christos if (ACPI_FAILURE (Status)) 2212 1.1 christos { 2213 1.1 christos return (Status); 2214 1.1 christos } 2215 1.1 christos 2216 1.1 christos ParentTable = DtPeekSubtable (); 2217 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2218 1.1 christos DtPushSubtable (Subtable); 2219 1.1 christos 2220 1.1 christos FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer); 2221 1.1 christos 2222 1.1 christos switch (FpdtHeader->Type) 2223 1.1 christos { 2224 1.1 christos case ACPI_FPDT_TYPE_BOOT: 2225 1.1 christos 2226 1.1 christos InfoTable = AcpiDmTableInfoFpdt0; 2227 1.1 christos break; 2228 1.1 christos 2229 1.1 christos case ACPI_FPDT_TYPE_S3PERF: 2230 1.1 christos 2231 1.1 christos InfoTable = AcpiDmTableInfoFpdt1; 2232 1.1 christos break; 2233 1.1 christos 2234 1.1 christos default: 2235 1.1 christos 2236 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT"); 2237 1.1 christos return (AE_ERROR); 2238 1.1 christos break; 2239 1.1 christos } 2240 1.1 christos 2241 1.1.1.7 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2242 1.1 christos if (ACPI_FAILURE (Status)) 2243 1.1 christos { 2244 1.1 christos return (Status); 2245 1.1 christos } 2246 1.1 christos 2247 1.1 christos ParentTable = DtPeekSubtable (); 2248 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2249 1.1 christos DtPopSubtable (); 2250 1.1 christos } 2251 1.1 christos 2252 1.1 christos return (AE_OK); 2253 1.1 christos } 2254 1.1 christos 2255 1.1 christos 2256 1.1 christos /****************************************************************************** 2257 1.1 christos * 2258 1.1 christos * FUNCTION: DtCompileHest 2259 1.1 christos * 2260 1.1 christos * PARAMETERS: List - Current field list pointer 2261 1.1 christos * 2262 1.1 christos * RETURN: Status 2263 1.1 christos * 2264 1.1 christos * DESCRIPTION: Compile HEST. 2265 1.1 christos * 2266 1.1 christos *****************************************************************************/ 2267 1.1 christos 2268 1.1 christos ACPI_STATUS 2269 1.1 christos DtCompileHest ( 2270 1.1 christos void **List) 2271 1.1 christos { 2272 1.1 christos ACPI_STATUS Status; 2273 1.1 christos DT_SUBTABLE *Subtable; 2274 1.1 christos DT_SUBTABLE *ParentTable; 2275 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2276 1.1 christos DT_FIELD *SubtableStart; 2277 1.1 christos ACPI_DMTABLE_INFO *InfoTable; 2278 1.1 christos UINT16 Type; 2279 1.1 christos UINT32 BankCount; 2280 1.1 christos 2281 1.1 christos 2282 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest, 2283 1.1.1.7 christos &Subtable); 2284 1.1 christos if (ACPI_FAILURE (Status)) 2285 1.1 christos { 2286 1.1 christos return (Status); 2287 1.1 christos } 2288 1.1 christos 2289 1.1 christos ParentTable = DtPeekSubtable (); 2290 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2291 1.1 christos 2292 1.1 christos while (*PFieldList) 2293 1.1 christos { 2294 1.1 christos /* Get subtable type */ 2295 1.1 christos 2296 1.1 christos SubtableStart = *PFieldList; 2297 1.1 christos DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0); 2298 1.1 christos 2299 1.1 christos switch (Type) 2300 1.1 christos { 2301 1.1 christos case ACPI_HEST_TYPE_IA32_CHECK: 2302 1.1 christos 2303 1.1 christos InfoTable = AcpiDmTableInfoHest0; 2304 1.1 christos break; 2305 1.1 christos 2306 1.1 christos case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 2307 1.1 christos 2308 1.1 christos InfoTable = AcpiDmTableInfoHest1; 2309 1.1 christos break; 2310 1.1 christos 2311 1.1 christos case ACPI_HEST_TYPE_IA32_NMI: 2312 1.1 christos 2313 1.1 christos InfoTable = AcpiDmTableInfoHest2; 2314 1.1 christos break; 2315 1.1 christos 2316 1.1 christos case ACPI_HEST_TYPE_AER_ROOT_PORT: 2317 1.1 christos 2318 1.1 christos InfoTable = AcpiDmTableInfoHest6; 2319 1.1 christos break; 2320 1.1 christos 2321 1.1 christos case ACPI_HEST_TYPE_AER_ENDPOINT: 2322 1.1 christos 2323 1.1 christos InfoTable = AcpiDmTableInfoHest7; 2324 1.1 christos break; 2325 1.1 christos 2326 1.1 christos case ACPI_HEST_TYPE_AER_BRIDGE: 2327 1.1 christos 2328 1.1 christos InfoTable = AcpiDmTableInfoHest8; 2329 1.1 christos break; 2330 1.1 christos 2331 1.1 christos case ACPI_HEST_TYPE_GENERIC_ERROR: 2332 1.1 christos 2333 1.1 christos InfoTable = AcpiDmTableInfoHest9; 2334 1.1 christos break; 2335 1.1 christos 2336 1.1.1.5 christos case ACPI_HEST_TYPE_GENERIC_ERROR_V2: 2337 1.1.1.5 christos 2338 1.1.1.5 christos InfoTable = AcpiDmTableInfoHest10; 2339 1.1.1.5 christos break; 2340 1.1.1.5 christos 2341 1.1.1.5 christos case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK: 2342 1.1.1.5 christos 2343 1.1.1.5 christos InfoTable = AcpiDmTableInfoHest11; 2344 1.1.1.5 christos break; 2345 1.1.1.5 christos 2346 1.1 christos default: 2347 1.1 christos 2348 1.1 christos /* Cannot continue on unknown type */ 2349 1.1 christos 2350 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST"); 2351 1.1 christos return (AE_ERROR); 2352 1.1 christos } 2353 1.1 christos 2354 1.1.1.7 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2355 1.1 christos if (ACPI_FAILURE (Status)) 2356 1.1 christos { 2357 1.1 christos return (Status); 2358 1.1 christos } 2359 1.1 christos 2360 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2361 1.1 christos 2362 1.1 christos /* 2363 1.1 christos * Additional subtable data - IA32 Error Bank(s) 2364 1.1 christos */ 2365 1.1 christos BankCount = 0; 2366 1.1 christos switch (Type) 2367 1.1 christos { 2368 1.1 christos case ACPI_HEST_TYPE_IA32_CHECK: 2369 1.1 christos 2370 1.1 christos BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 2371 1.1 christos Subtable->Buffer))->NumHardwareBanks; 2372 1.1 christos break; 2373 1.1 christos 2374 1.1 christos case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 2375 1.1 christos 2376 1.1 christos BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 2377 1.1 christos Subtable->Buffer))->NumHardwareBanks; 2378 1.1 christos break; 2379 1.1 christos 2380 1.1.1.5 christos case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK: 2381 1.1.1.5 christos 2382 1.1.1.5 christos BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK, 2383 1.1.1.5 christos Subtable->Buffer))->NumHardwareBanks; 2384 1.1.1.5 christos break; 2385 1.1.1.5 christos 2386 1.1 christos default: 2387 1.1 christos 2388 1.1 christos break; 2389 1.1 christos } 2390 1.1 christos 2391 1.1 christos while (BankCount) 2392 1.1 christos { 2393 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank, 2394 1.1.1.7 christos &Subtable); 2395 1.1 christos if (ACPI_FAILURE (Status)) 2396 1.1 christos { 2397 1.1 christos return (Status); 2398 1.1 christos } 2399 1.1 christos 2400 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2401 1.1 christos BankCount--; 2402 1.1 christos } 2403 1.1 christos } 2404 1.1 christos 2405 1.1 christos return (AE_OK); 2406 1.1 christos } 2407 1.1 christos 2408 1.1 christos 2409 1.1 christos /****************************************************************************** 2410 1.1 christos * 2411 1.1.1.5 christos * FUNCTION: DtCompileHmat 2412 1.1.1.5 christos * 2413 1.1.1.5 christos * PARAMETERS: List - Current field list pointer 2414 1.1.1.5 christos * 2415 1.1.1.5 christos * RETURN: Status 2416 1.1.1.5 christos * 2417 1.1.1.5 christos * DESCRIPTION: Compile HMAT. 2418 1.1.1.5 christos * 2419 1.1.1.5 christos *****************************************************************************/ 2420 1.1.1.5 christos 2421 1.1.1.5 christos ACPI_STATUS 2422 1.1.1.5 christos DtCompileHmat ( 2423 1.1.1.5 christos void **List) 2424 1.1.1.5 christos { 2425 1.1.1.5 christos ACPI_STATUS Status; 2426 1.1.1.5 christos DT_SUBTABLE *Subtable; 2427 1.1.1.5 christos DT_SUBTABLE *ParentTable; 2428 1.1.1.5 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2429 1.1.1.5 christos DT_FIELD *SubtableStart; 2430 1.1.1.5 christos DT_FIELD *EntryStart; 2431 1.1.1.5 christos ACPI_HMAT_STRUCTURE *HmatStruct; 2432 1.1.1.5 christos ACPI_HMAT_LOCALITY *HmatLocality; 2433 1.1.1.5 christos ACPI_HMAT_CACHE *HmatCache; 2434 1.1.1.5 christos ACPI_DMTABLE_INFO *InfoTable; 2435 1.1.1.5 christos UINT32 IntPDNumber; 2436 1.1.1.5 christos UINT32 TgtPDNumber; 2437 1.1.1.5 christos UINT64 EntryNumber; 2438 1.1.1.5 christos UINT16 SMBIOSHandleNumber; 2439 1.1.1.5 christos 2440 1.1.1.5 christos 2441 1.1.1.5 christos ParentTable = DtPeekSubtable (); 2442 1.1.1.5 christos 2443 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat, 2444 1.1.1.7 christos &Subtable); 2445 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2446 1.1.1.5 christos { 2447 1.1.1.5 christos return (Status); 2448 1.1.1.5 christos } 2449 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2450 1.1.1.5 christos 2451 1.1.1.5 christos while (*PFieldList) 2452 1.1.1.5 christos { 2453 1.1.1.5 christos /* Compile HMAT structure header */ 2454 1.1.1.5 christos 2455 1.1.1.5 christos SubtableStart = *PFieldList; 2456 1.1.1.5 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr, 2457 1.1.1.7 christos &Subtable); 2458 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2459 1.1.1.5 christos { 2460 1.1.1.5 christos return (Status); 2461 1.1.1.5 christos } 2462 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2463 1.1.1.5 christos 2464 1.1.1.5 christos HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer); 2465 1.1.1.5 christos HmatStruct->Length = Subtable->Length; 2466 1.1.1.5 christos 2467 1.1.1.5 christos /* Compile HMAT structure body */ 2468 1.1.1.5 christos 2469 1.1.1.5 christos switch (HmatStruct->Type) 2470 1.1.1.5 christos { 2471 1.1.1.5 christos case ACPI_HMAT_TYPE_ADDRESS_RANGE: 2472 1.1.1.5 christos 2473 1.1.1.5 christos InfoTable = AcpiDmTableInfoHmat0; 2474 1.1.1.5 christos break; 2475 1.1.1.5 christos 2476 1.1.1.5 christos case ACPI_HMAT_TYPE_LOCALITY: 2477 1.1.1.5 christos 2478 1.1.1.5 christos InfoTable = AcpiDmTableInfoHmat1; 2479 1.1.1.5 christos break; 2480 1.1.1.5 christos 2481 1.1.1.5 christos case ACPI_HMAT_TYPE_CACHE: 2482 1.1.1.5 christos 2483 1.1.1.5 christos InfoTable = AcpiDmTableInfoHmat2; 2484 1.1.1.5 christos break; 2485 1.1.1.5 christos 2486 1.1.1.5 christos default: 2487 1.1.1.5 christos 2488 1.1.1.5 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT"); 2489 1.1.1.5 christos return (AE_ERROR); 2490 1.1.1.5 christos } 2491 1.1.1.5 christos 2492 1.1.1.7 christos Status = DtCompileTable (PFieldList, InfoTable, &Subtable); 2493 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2494 1.1.1.5 christos { 2495 1.1.1.5 christos return (Status); 2496 1.1.1.5 christos } 2497 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2498 1.1.1.5 christos HmatStruct->Length += Subtable->Length; 2499 1.1.1.5 christos 2500 1.1.1.16 christos /* Compile HMAT structure additional */ 2501 1.1.1.5 christos 2502 1.1.1.5 christos switch (HmatStruct->Type) 2503 1.1.1.5 christos { 2504 1.1.1.5 christos case ACPI_HMAT_TYPE_LOCALITY: 2505 1.1.1.5 christos 2506 1.1.1.5 christos HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY, 2507 1.1.1.5 christos Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE)); 2508 1.1.1.5 christos 2509 1.1.1.5 christos /* Compile initiator proximity domain list */ 2510 1.1.1.5 christos 2511 1.1.1.5 christos IntPDNumber = 0; 2512 1.1.1.5 christos while (*PFieldList) 2513 1.1.1.5 christos { 2514 1.1.1.5 christos Status = DtCompileTable (PFieldList, 2515 1.1.1.7 christos AcpiDmTableInfoHmat1a, &Subtable); 2516 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2517 1.1.1.5 christos { 2518 1.1.1.5 christos return (Status); 2519 1.1.1.5 christos } 2520 1.1.1.5 christos if (!Subtable) 2521 1.1.1.5 christos { 2522 1.1.1.5 christos break; 2523 1.1.1.5 christos } 2524 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2525 1.1.1.5 christos HmatStruct->Length += Subtable->Length; 2526 1.1.1.5 christos IntPDNumber++; 2527 1.1.1.5 christos } 2528 1.1.1.5 christos HmatLocality->NumberOfInitiatorPDs = IntPDNumber; 2529 1.1.1.5 christos 2530 1.1.1.5 christos /* Compile target proximity domain list */ 2531 1.1.1.5 christos 2532 1.1.1.5 christos TgtPDNumber = 0; 2533 1.1.1.5 christos while (*PFieldList) 2534 1.1.1.5 christos { 2535 1.1.1.5 christos Status = DtCompileTable (PFieldList, 2536 1.1.1.7 christos AcpiDmTableInfoHmat1b, &Subtable); 2537 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2538 1.1.1.5 christos { 2539 1.1.1.5 christos return (Status); 2540 1.1.1.5 christos } 2541 1.1.1.5 christos if (!Subtable) 2542 1.1.1.5 christos { 2543 1.1.1.5 christos break; 2544 1.1.1.5 christos } 2545 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2546 1.1.1.5 christos HmatStruct->Length += Subtable->Length; 2547 1.1.1.5 christos TgtPDNumber++; 2548 1.1.1.5 christos } 2549 1.1.1.5 christos HmatLocality->NumberOfTargetPDs = TgtPDNumber; 2550 1.1.1.5 christos 2551 1.1.1.5 christos /* Save start of the entries for reporting errors */ 2552 1.1.1.5 christos 2553 1.1.1.5 christos EntryStart = *PFieldList; 2554 1.1.1.5 christos 2555 1.1.1.5 christos /* Compile latency/bandwidth entries */ 2556 1.1.1.5 christos 2557 1.1.1.5 christos EntryNumber = 0; 2558 1.1.1.5 christos while (*PFieldList) 2559 1.1.1.5 christos { 2560 1.1.1.5 christos Status = DtCompileTable (PFieldList, 2561 1.1.1.7 christos AcpiDmTableInfoHmat1c, &Subtable); 2562 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2563 1.1.1.5 christos { 2564 1.1.1.5 christos return (Status); 2565 1.1.1.5 christos } 2566 1.1.1.5 christos if (!Subtable) 2567 1.1.1.5 christos { 2568 1.1.1.5 christos break; 2569 1.1.1.5 christos } 2570 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2571 1.1.1.5 christos HmatStruct->Length += Subtable->Length; 2572 1.1.1.5 christos EntryNumber++; 2573 1.1.1.5 christos } 2574 1.1.1.5 christos 2575 1.1.1.5 christos /* Validate number of entries */ 2576 1.1.1.5 christos 2577 1.1.1.5 christos if (EntryNumber != 2578 1.1.1.5 christos ((UINT64)IntPDNumber * (UINT64)TgtPDNumber)) 2579 1.1.1.5 christos { 2580 1.1.1.5 christos DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT"); 2581 1.1.1.5 christos return (AE_ERROR); 2582 1.1.1.5 christos } 2583 1.1.1.5 christos break; 2584 1.1.1.5 christos 2585 1.1.1.5 christos case ACPI_HMAT_TYPE_CACHE: 2586 1.1.1.5 christos 2587 1.1.1.5 christos /* Compile SMBIOS handles */ 2588 1.1.1.5 christos 2589 1.1.1.5 christos HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE, 2590 1.1.1.5 christos Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE)); 2591 1.1.1.5 christos SMBIOSHandleNumber = 0; 2592 1.1.1.5 christos while (*PFieldList) 2593 1.1.1.5 christos { 2594 1.1.1.5 christos Status = DtCompileTable (PFieldList, 2595 1.1.1.7 christos AcpiDmTableInfoHmat2a, &Subtable); 2596 1.1.1.5 christos if (ACPI_FAILURE (Status)) 2597 1.1.1.5 christos { 2598 1.1.1.5 christos return (Status); 2599 1.1.1.5 christos } 2600 1.1.1.5 christos if (!Subtable) 2601 1.1.1.5 christos { 2602 1.1.1.5 christos break; 2603 1.1.1.5 christos } 2604 1.1.1.5 christos DtInsertSubtable (ParentTable, Subtable); 2605 1.1.1.5 christos HmatStruct->Length += Subtable->Length; 2606 1.1.1.5 christos SMBIOSHandleNumber++; 2607 1.1.1.5 christos } 2608 1.1.1.5 christos HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber; 2609 1.1.1.5 christos break; 2610 1.1.1.5 christos 2611 1.1.1.5 christos default: 2612 1.1.1.5 christos 2613 1.1.1.5 christos break; 2614 1.1.1.5 christos } 2615 1.1.1.5 christos } 2616 1.1.1.5 christos 2617 1.1.1.5 christos return (AE_OK); 2618 1.1.1.5 christos } 2619 1.1.1.5 christos 2620 1.1.1.5 christos 2621 1.1.1.5 christos /****************************************************************************** 2622 1.1.1.5 christos * 2623 1.1 christos * FUNCTION: DtCompileIort 2624 1.1 christos * 2625 1.1 christos * PARAMETERS: List - Current field list pointer 2626 1.1 christos * 2627 1.1 christos * RETURN: Status 2628 1.1 christos * 2629 1.1 christos * DESCRIPTION: Compile IORT. 2630 1.1 christos * 2631 1.1 christos *****************************************************************************/ 2632 1.1 christos 2633 1.1 christos ACPI_STATUS 2634 1.1 christos DtCompileIort ( 2635 1.1 christos void **List) 2636 1.1 christos { 2637 1.1 christos ACPI_STATUS Status; 2638 1.1 christos DT_SUBTABLE *Subtable; 2639 1.1 christos DT_SUBTABLE *ParentTable; 2640 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 2641 1.1 christos DT_FIELD *SubtableStart; 2642 1.1.1.11 christos ACPI_TABLE_HEADER *Table; 2643 1.1 christos ACPI_TABLE_IORT *Iort; 2644 1.1 christos ACPI_IORT_NODE *IortNode; 2645 1.1 christos ACPI_IORT_ITS_GROUP *IortItsGroup; 2646 1.1 christos ACPI_IORT_SMMU *IortSmmu; 2647 1.1.1.11 christos ACPI_IORT_RMR *IortRmr; 2648 1.1 christos UINT32 NodeNumber; 2649 1.1 christos UINT32 NodeLength; 2650 1.1 christos UINT32 IdMappingNumber; 2651 1.1 christos UINT32 ItsNumber; 2652 1.1 christos UINT32 ContextIrptNumber; 2653 1.1 christos UINT32 PmuIrptNumber; 2654 1.1 christos UINT32 PaddingLength; 2655 1.1.1.11 christos UINT8 Revision; 2656 1.1.1.11 christos UINT32 RmrCount; 2657 1.1 christos 2658 1.1 christos 2659 1.1 christos ParentTable = DtPeekSubtable (); 2660 1.1 christos 2661 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort, 2662 1.1.1.7 christos &Subtable); 2663 1.1 christos if (ACPI_FAILURE (Status)) 2664 1.1 christos { 2665 1.1 christos return (Status); 2666 1.1 christos } 2667 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2668 1.1 christos 2669 1.1.1.11 christos Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 2670 1.1.1.11 christos Revision = Table->Revision; 2671 1.1.1.11 christos 2672 1.1.1.14 christos /* IORT Revisions E, E.a & E.c have known issues and are not supported */ 2673 1.1.1.11 christos 2674 1.1.1.14 christos if (Revision == 1 || Revision == 2 || Revision == 4) 2675 1.1.1.11 christos { 2676 1.1.1.11 christos DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision"); 2677 1.1.1.11 christos return (AE_ERROR); 2678 1.1.1.11 christos } 2679 1.1.1.11 christos 2680 1.1 christos /* 2681 1.1.1.2 christos * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 2682 1.1.1.2 christos * should be taken to avoid accessing ACPI_TABLE_HEADER fields. 2683 1.1 christos */ 2684 1.1 christos Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT, 2685 1.1 christos Subtable->Buffer, sizeof (ACPI_TABLE_HEADER)); 2686 1.1 christos 2687 1.1 christos /* 2688 1.1 christos * OptionalPadding - Variable-length data 2689 1.1 christos * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT)) 2690 1.1 christos * Optionally allows the generic data types to be used for filling 2691 1.1 christos * this field. 2692 1.1 christos */ 2693 1.1 christos Iort->NodeOffset = sizeof (ACPI_TABLE_IORT); 2694 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad, 2695 1.1.1.7 christos &Subtable); 2696 1.1 christos if (ACPI_FAILURE (Status)) 2697 1.1 christos { 2698 1.1 christos return (Status); 2699 1.1 christos } 2700 1.1 christos if (Subtable) 2701 1.1 christos { 2702 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2703 1.1 christos Iort->NodeOffset += Subtable->Length; 2704 1.1 christos } 2705 1.1 christos else 2706 1.1 christos { 2707 1.1 christos Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList), 2708 1.1 christos AcpiDmTableInfoIortHdr[0].Name, &PaddingLength); 2709 1.1 christos if (ACPI_FAILURE (Status)) 2710 1.1 christos { 2711 1.1 christos return (Status); 2712 1.1 christos } 2713 1.1 christos Iort->NodeOffset += PaddingLength; 2714 1.1 christos } 2715 1.1 christos 2716 1.1 christos NodeNumber = 0; 2717 1.1 christos while (*PFieldList) 2718 1.1 christos { 2719 1.1 christos SubtableStart = *PFieldList; 2720 1.1.1.11 christos if (Revision == 0) 2721 1.1.1.11 christos { 2722 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr, 2723 1.1.1.11 christos &Subtable); 2724 1.1.1.11 christos } 2725 1.1.1.11 christos else if (Revision >= 3) 2726 1.1.1.11 christos { 2727 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3, 2728 1.1.1.11 christos &Subtable); 2729 1.1.1.11 christos } 2730 1.1.1.11 christos 2731 1.1 christos if (ACPI_FAILURE (Status)) 2732 1.1 christos { 2733 1.1 christos return (Status); 2734 1.1 christos } 2735 1.1 christos 2736 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2737 1.1 christos IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer); 2738 1.1 christos NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData); 2739 1.1 christos 2740 1.1 christos DtPushSubtable (Subtable); 2741 1.1 christos ParentTable = DtPeekSubtable (); 2742 1.1 christos 2743 1.1 christos switch (IortNode->Type) 2744 1.1 christos { 2745 1.1 christos case ACPI_IORT_NODE_ITS_GROUP: 2746 1.1 christos 2747 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0, 2748 1.1.1.7 christos &Subtable); 2749 1.1 christos if (ACPI_FAILURE (Status)) 2750 1.1 christos { 2751 1.1 christos return (Status); 2752 1.1 christos } 2753 1.1 christos 2754 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2755 1.1 christos IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer); 2756 1.1 christos NodeLength += Subtable->Length; 2757 1.1 christos 2758 1.1 christos ItsNumber = 0; 2759 1.1 christos while (*PFieldList) 2760 1.1 christos { 2761 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a, 2762 1.1.1.7 christos &Subtable); 2763 1.1 christos if (ACPI_FAILURE (Status)) 2764 1.1 christos { 2765 1.1 christos return (Status); 2766 1.1 christos } 2767 1.1 christos if (!Subtable) 2768 1.1 christos { 2769 1.1 christos break; 2770 1.1 christos } 2771 1.1 christos 2772 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2773 1.1 christos NodeLength += Subtable->Length; 2774 1.1 christos ItsNumber++; 2775 1.1 christos } 2776 1.1 christos 2777 1.1 christos IortItsGroup->ItsCount = ItsNumber; 2778 1.1 christos break; 2779 1.1 christos 2780 1.1 christos case ACPI_IORT_NODE_NAMED_COMPONENT: 2781 1.1 christos 2782 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1, 2783 1.1.1.7 christos &Subtable); 2784 1.1 christos if (ACPI_FAILURE (Status)) 2785 1.1 christos { 2786 1.1 christos return (Status); 2787 1.1 christos } 2788 1.1 christos 2789 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2790 1.1 christos NodeLength += Subtable->Length; 2791 1.1 christos 2792 1.1 christos /* 2793 1.1 christos * Padding - Variable-length data 2794 1.1 christos * Optionally allows the offset of the ID mappings to be used 2795 1.1 christos * for filling this field. 2796 1.1 christos */ 2797 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a, 2798 1.1.1.7 christos &Subtable); 2799 1.1 christos if (ACPI_FAILURE (Status)) 2800 1.1 christos { 2801 1.1 christos return (Status); 2802 1.1 christos } 2803 1.1 christos 2804 1.1 christos if (Subtable) 2805 1.1 christos { 2806 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2807 1.1 christos NodeLength += Subtable->Length; 2808 1.1 christos } 2809 1.1 christos else 2810 1.1 christos { 2811 1.1 christos if (NodeLength > IortNode->MappingOffset) 2812 1.1 christos { 2813 1.1 christos return (AE_BAD_DATA); 2814 1.1 christos } 2815 1.1 christos 2816 1.1 christos if (NodeLength < IortNode->MappingOffset) 2817 1.1 christos { 2818 1.1 christos Status = DtCompilePadding ( 2819 1.1 christos IortNode->MappingOffset - NodeLength, 2820 1.1 christos &Subtable); 2821 1.1 christos if (ACPI_FAILURE (Status)) 2822 1.1 christos { 2823 1.1 christos return (Status); 2824 1.1 christos } 2825 1.1 christos 2826 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2827 1.1 christos NodeLength = IortNode->MappingOffset; 2828 1.1 christos } 2829 1.1 christos } 2830 1.1 christos break; 2831 1.1 christos 2832 1.1 christos case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: 2833 1.1 christos 2834 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2, 2835 1.1.1.7 christos &Subtable); 2836 1.1 christos if (ACPI_FAILURE (Status)) 2837 1.1 christos { 2838 1.1 christos return (Status); 2839 1.1 christos } 2840 1.1 christos 2841 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2842 1.1 christos NodeLength += Subtable->Length; 2843 1.1 christos break; 2844 1.1 christos 2845 1.1 christos case ACPI_IORT_NODE_SMMU: 2846 1.1 christos 2847 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3, 2848 1.1.1.7 christos &Subtable); 2849 1.1 christos if (ACPI_FAILURE (Status)) 2850 1.1 christos { 2851 1.1 christos return (Status); 2852 1.1 christos } 2853 1.1 christos 2854 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2855 1.1 christos IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer); 2856 1.1 christos NodeLength += Subtable->Length; 2857 1.1 christos 2858 1.1 christos /* Compile global interrupt array */ 2859 1.1 christos 2860 1.1 christos IortSmmu->GlobalInterruptOffset = NodeLength; 2861 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a, 2862 1.1.1.7 christos &Subtable); 2863 1.1 christos if (ACPI_FAILURE (Status)) 2864 1.1 christos { 2865 1.1 christos return (Status); 2866 1.1 christos } 2867 1.1 christos 2868 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2869 1.1 christos NodeLength += Subtable->Length; 2870 1.1 christos 2871 1.1 christos /* Compile context interrupt array */ 2872 1.1 christos 2873 1.1 christos ContextIrptNumber = 0; 2874 1.1 christos IortSmmu->ContextInterruptOffset = NodeLength; 2875 1.1 christos while (*PFieldList) 2876 1.1 christos { 2877 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b, 2878 1.1.1.7 christos &Subtable); 2879 1.1 christos if (ACPI_FAILURE (Status)) 2880 1.1 christos { 2881 1.1 christos return (Status); 2882 1.1 christos } 2883 1.1 christos 2884 1.1 christos if (!Subtable) 2885 1.1 christos { 2886 1.1 christos break; 2887 1.1 christos } 2888 1.1 christos 2889 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2890 1.1 christos NodeLength += Subtable->Length; 2891 1.1 christos ContextIrptNumber++; 2892 1.1 christos } 2893 1.1 christos 2894 1.1 christos IortSmmu->ContextInterruptCount = ContextIrptNumber; 2895 1.1 christos 2896 1.1 christos /* Compile PMU interrupt array */ 2897 1.1 christos 2898 1.1 christos PmuIrptNumber = 0; 2899 1.1 christos IortSmmu->PmuInterruptOffset = NodeLength; 2900 1.1 christos while (*PFieldList) 2901 1.1 christos { 2902 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c, 2903 1.1.1.7 christos &Subtable); 2904 1.1 christos if (ACPI_FAILURE (Status)) 2905 1.1 christos { 2906 1.1 christos return (Status); 2907 1.1 christos } 2908 1.1 christos 2909 1.1 christos if (!Subtable) 2910 1.1 christos { 2911 1.1 christos break; 2912 1.1 christos } 2913 1.1 christos 2914 1.1 christos DtInsertSubtable (ParentTable, Subtable); 2915 1.1 christos NodeLength += Subtable->Length; 2916 1.1 christos PmuIrptNumber++; 2917 1.1 christos } 2918 1.1 christos 2919 1.1 christos IortSmmu->PmuInterruptCount = PmuIrptNumber; 2920 1.1 christos break; 2921 1.1 christos 2922 1.1.1.2 christos case ACPI_IORT_NODE_SMMU_V3: 2923 1.1.1.2 christos 2924 1.1.1.2 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort4, 2925 1.1.1.7 christos &Subtable); 2926 1.1.1.2 christos if (ACPI_FAILURE (Status)) 2927 1.1.1.2 christos { 2928 1.1.1.2 christos return (Status); 2929 1.1.1.2 christos } 2930 1.1.1.2 christos 2931 1.1.1.2 christos DtInsertSubtable (ParentTable, Subtable); 2932 1.1.1.2 christos NodeLength += Subtable->Length; 2933 1.1.1.2 christos break; 2934 1.1.1.2 christos 2935 1.1.1.8 christos case ACPI_IORT_NODE_PMCG: 2936 1.1.1.8 christos 2937 1.1.1.8 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort5, 2938 1.1.1.8 christos &Subtable); 2939 1.1.1.8 christos if (ACPI_FAILURE (Status)) 2940 1.1.1.8 christos { 2941 1.1.1.8 christos return (Status); 2942 1.1.1.8 christos } 2943 1.1.1.8 christos 2944 1.1.1.8 christos DtInsertSubtable (ParentTable, Subtable); 2945 1.1.1.8 christos NodeLength += Subtable->Length; 2946 1.1.1.8 christos break; 2947 1.1.1.8 christos 2948 1.1.1.11 christos case ACPI_IORT_NODE_RMR: 2949 1.1.1.11 christos 2950 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6, 2951 1.1.1.11 christos &Subtable); 2952 1.1.1.11 christos if (ACPI_FAILURE (Status)) 2953 1.1.1.11 christos { 2954 1.1.1.11 christos return (Status); 2955 1.1.1.11 christos } 2956 1.1.1.11 christos 2957 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 2958 1.1.1.11 christos IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer); 2959 1.1.1.11 christos NodeLength += Subtable->Length; 2960 1.1.1.11 christos 2961 1.1.1.11 christos /* Compile RMR Descriptors */ 2962 1.1.1.11 christos 2963 1.1.1.11 christos RmrCount = 0; 2964 1.1.1.11 christos IortRmr->RmrOffset = NodeLength; 2965 1.1.1.11 christos while (*PFieldList) 2966 1.1.1.11 christos { 2967 1.1.1.11 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a, 2968 1.1.1.11 christos &Subtable); 2969 1.1.1.11 christos if (ACPI_FAILURE (Status)) 2970 1.1.1.11 christos { 2971 1.1.1.11 christos return (Status); 2972 1.1.1.11 christos } 2973 1.1.1.11 christos 2974 1.1.1.11 christos if (!Subtable) 2975 1.1.1.11 christos { 2976 1.1.1.11 christos break; 2977 1.1.1.11 christos } 2978 1.1.1.11 christos 2979 1.1.1.11 christos DtInsertSubtable (ParentTable, Subtable); 2980 1.1.1.11 christos NodeLength += sizeof (ACPI_IORT_RMR_DESC); 2981 1.1.1.11 christos RmrCount++; 2982 1.1.1.11 christos } 2983 1.1.1.11 christos 2984 1.1.1.11 christos IortRmr->RmrCount = RmrCount; 2985 1.1.1.11 christos break; 2986 1.1.1.11 christos 2987 1.1.1.14 christos default: 2988 1.1 christos 2989 1.1 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT"); 2990 1.1 christos return (AE_ERROR); 2991 1.1 christos } 2992 1.1 christos 2993 1.1 christos /* Compile Array of ID mappings */ 2994 1.1 christos 2995 1.1 christos IortNode->MappingOffset = NodeLength; 2996 1.1 christos IdMappingNumber = 0; 2997 1.1 christos while (*PFieldList) 2998 1.1 christos { 2999 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap, 3000 1.1.1.7 christos &Subtable); 3001 1.1 christos if (ACPI_FAILURE (Status)) 3002 1.1 christos { 3003 1.1 christos return (Status); 3004 1.1 christos } 3005 1.1 christos 3006 1.1 christos if (!Subtable) 3007 1.1 christos { 3008 1.1 christos break; 3009 1.1 christos } 3010 1.1 christos 3011 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3012 1.1 christos NodeLength += sizeof (ACPI_IORT_ID_MAPPING); 3013 1.1 christos IdMappingNumber++; 3014 1.1 christos } 3015 1.1 christos 3016 1.1 christos IortNode->MappingCount = IdMappingNumber; 3017 1.1.1.4 christos if (!IdMappingNumber) 3018 1.1.1.4 christos { 3019 1.1.1.4 christos IortNode->MappingOffset = 0; 3020 1.1.1.4 christos } 3021 1.1 christos 3022 1.1 christos /* 3023 1.1 christos * Node length can be determined by DT_LENGTH option 3024 1.1 christos * IortNode->Length = NodeLength; 3025 1.1 christos */ 3026 1.1 christos DtPopSubtable (); 3027 1.1 christos ParentTable = DtPeekSubtable (); 3028 1.1 christos NodeNumber++; 3029 1.1 christos } 3030 1.1 christos 3031 1.1 christos Iort->NodeCount = NodeNumber; 3032 1.1 christos return (AE_OK); 3033 1.1 christos } 3034 1.1 christos 3035 1.1 christos 3036 1.1 christos /****************************************************************************** 3037 1.1 christos * 3038 1.1 christos * FUNCTION: DtCompileIvrs 3039 1.1 christos * 3040 1.1 christos * PARAMETERS: List - Current field list pointer 3041 1.1 christos * 3042 1.1 christos * RETURN: Status 3043 1.1 christos * 3044 1.1.1.12 christos * DESCRIPTION: Compile IVRS. Notes: 3045 1.1.1.12 christos * The IVRS is essentially a flat table, with the following 3046 1.1.1.12 christos * structure: 3047 1.1.1.12 christos * <Main ACPI Table Header> 3048 1.1.1.12 christos * <Main subtable - virtualization info> 3049 1.1.1.12 christos * <IVHD> 3050 1.1.1.12 christos * <Device Entries> 3051 1.1.1.12 christos * ... 3052 1.1.1.12 christos * <IVHD> 3053 1.1.1.12 christos * <Device Entries> 3054 1.1.1.12 christos * <IVMD> 3055 1.1.1.12 christos * ... 3056 1.1 christos * 3057 1.1 christos *****************************************************************************/ 3058 1.1 christos 3059 1.1 christos ACPI_STATUS 3060 1.1 christos DtCompileIvrs ( 3061 1.1 christos void **List) 3062 1.1 christos { 3063 1.1 christos ACPI_STATUS Status; 3064 1.1 christos DT_SUBTABLE *Subtable; 3065 1.1 christos DT_SUBTABLE *ParentTable; 3066 1.1.1.12 christos DT_SUBTABLE *MainSubtable; 3067 1.1 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 3068 1.1 christos DT_FIELD *SubtableStart; 3069 1.1.1.12 christos ACPI_DMTABLE_INFO *InfoTable = NULL; 3070 1.1.1.12 christos UINT8 SubtableType; 3071 1.1.1.12 christos UINT8 Temp64[16]; 3072 1.1.1.12 christos UINT8 Temp8; 3073 1.1 christos 3074 1.1 christos 3075 1.1.1.12 christos /* Main table */ 3076 1.1.1.12 christos 3077 1.1 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs, 3078 1.1.1.7 christos &Subtable); 3079 1.1 christos if (ACPI_FAILURE (Status)) 3080 1.1 christos { 3081 1.1 christos return (Status); 3082 1.1 christos } 3083 1.1 christos 3084 1.1 christos ParentTable = DtPeekSubtable (); 3085 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3086 1.1.1.12 christos DtPushSubtable (Subtable); 3087 1.1.1.12 christos 3088 1.1.1.12 christos /* Save a pointer to the main subtable */ 3089 1.1.1.12 christos 3090 1.1.1.12 christos MainSubtable = Subtable; 3091 1.1 christos 3092 1.1 christos while (*PFieldList) 3093 1.1 christos { 3094 1.1 christos SubtableStart = *PFieldList; 3095 1.1 christos 3096 1.1.1.12 christos /* Compile the SubtableType integer */ 3097 1.1 christos 3098 1.1.1.12 christos DtCompileInteger (&SubtableType, *PFieldList, 1, 0); 3099 1.1 christos 3100 1.1.1.12 christos switch (SubtableType) 3101 1.1 christos { 3102 1.1.1.12 christos 3103 1.1.1.12 christos /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */ 3104 1.1.1.12 christos 3105 1.1.1.10 christos case ACPI_IVRS_TYPE_HARDWARE1: 3106 1.1 christos 3107 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrsHware1; 3108 1.1 christos break; 3109 1.1 christos 3110 1.1.1.12 christos /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */ 3111 1.1.1.12 christos 3112 1.1.1.10 christos case ACPI_IVRS_TYPE_HARDWARE2: 3113 1.1.1.12 christos case ACPI_IVRS_TYPE_HARDWARE3: 3114 1.1.1.10 christos 3115 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrsHware23; 3116 1.1.1.10 christos break; 3117 1.1.1.10 christos 3118 1.1.1.12 christos /* Types 20h, 21h, 22h, IVMD (I/O Virtualization Memory Definition Block) */ 3119 1.1.1.12 christos 3120 1.1 christos case ACPI_IVRS_TYPE_MEMORY1: 3121 1.1 christos case ACPI_IVRS_TYPE_MEMORY2: 3122 1.1 christos case ACPI_IVRS_TYPE_MEMORY3: 3123 1.1 christos 3124 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrsMemory; 3125 1.1.1.12 christos break; 3126 1.1.1.12 christos 3127 1.1.1.12 christos /* 4-byte device entries */ 3128 1.1.1.12 christos 3129 1.1.1.12 christos case ACPI_IVRS_TYPE_PAD4: 3130 1.1.1.12 christos case ACPI_IVRS_TYPE_ALL: 3131 1.1.1.12 christos case ACPI_IVRS_TYPE_SELECT: 3132 1.1.1.12 christos case ACPI_IVRS_TYPE_START: 3133 1.1.1.12 christos case ACPI_IVRS_TYPE_END: 3134 1.1.1.12 christos 3135 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrs4; 3136 1.1.1.12 christos break; 3137 1.1.1.12 christos 3138 1.1.1.12 christos /* 8-byte device entries, type A */ 3139 1.1.1.12 christos 3140 1.1.1.12 christos case ACPI_IVRS_TYPE_ALIAS_SELECT: 3141 1.1.1.12 christos case ACPI_IVRS_TYPE_ALIAS_START: 3142 1.1.1.12 christos 3143 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrs8a; 3144 1.1.1.12 christos break; 3145 1.1.1.12 christos 3146 1.1.1.12 christos /* 8-byte device entries, type B */ 3147 1.1.1.12 christos 3148 1.1.1.12 christos case ACPI_IVRS_TYPE_EXT_SELECT: 3149 1.1.1.12 christos case ACPI_IVRS_TYPE_EXT_START: 3150 1.1.1.12 christos 3151 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrs8b; 3152 1.1.1.12 christos break; 3153 1.1.1.12 christos 3154 1.1.1.12 christos /* 8-byte device entries, type C */ 3155 1.1.1.12 christos 3156 1.1.1.12 christos case ACPI_IVRS_TYPE_SPECIAL: 3157 1.1.1.12 christos 3158 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrs8c; 3159 1.1.1.12 christos break; 3160 1.1.1.12 christos 3161 1.1.1.12 christos /* Variable device entries, type F0h */ 3162 1.1.1.12 christos 3163 1.1.1.12 christos case ACPI_IVRS_TYPE_HID: 3164 1.1.1.12 christos 3165 1.1.1.12 christos InfoTable = AcpiDmTableInfoIvrsHid; 3166 1.1 christos break; 3167 1.1 christos 3168 1.1 christos default: 3169 1.1 christos 3170 1.1.1.12 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, 3171 1.1.1.12 christos "IVRS Device Entry"); 3172 1.1 christos return (AE_ERROR); 3173 1.1 christos } 3174 1.1 christos 3175 1.1.1.12 christos /* Compile the InfoTable from above */ 3176 1.1.1.12 christos 3177 1.1.1.12 christos Status = DtCompileTable (PFieldList, InfoTable, 3178 1.1.1.12 christos &Subtable); 3179 1.1 christos if (ACPI_FAILURE (Status)) 3180 1.1 christos { 3181 1.1 christos return (Status); 3182 1.1 christos } 3183 1.1 christos 3184 1.1 christos ParentTable = DtPeekSubtable (); 3185 1.1.1.12 christos if (SubtableType != ACPI_IVRS_TYPE_HARDWARE1 && 3186 1.1.1.12 christos SubtableType != ACPI_IVRS_TYPE_HARDWARE2 && 3187 1.1.1.12 christos SubtableType != ACPI_IVRS_TYPE_HARDWARE3 && 3188 1.1.1.12 christos SubtableType != ACPI_IVRS_TYPE_HID && 3189 1.1.1.12 christos SubtableType != ACPI_IVRS_TYPE_MEMORY1 && 3190 1.1.1.12 christos SubtableType != ACPI_IVRS_TYPE_MEMORY2 && 3191 1.1.1.12 christos SubtableType != ACPI_IVRS_TYPE_MEMORY3) 3192 1.1.1.12 christos { 3193 1.1.1.12 christos if (ParentTable) 3194 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 3195 1.1.1.12 christos } 3196 1.1 christos 3197 1.1.1.12 christos switch (SubtableType) 3198 1.1 christos { 3199 1.1.1.12 christos case ACPI_IVRS_TYPE_HARDWARE1: 3200 1.1.1.12 christos case ACPI_IVRS_TYPE_HARDWARE2: 3201 1.1.1.12 christos case ACPI_IVRS_TYPE_HARDWARE3: 3202 1.1.1.12 christos case ACPI_IVRS_TYPE_MEMORY1: 3203 1.1.1.12 christos case ACPI_IVRS_TYPE_MEMORY2: 3204 1.1.1.12 christos case ACPI_IVRS_TYPE_MEMORY3: 3205 1.1.1.12 christos 3206 1.1.1.12 christos /* Insert these IVHDs/IVMDs at the root subtable */ 3207 1.1.1.12 christos 3208 1.1.1.12 christos DtInsertSubtable (MainSubtable, Subtable); 3209 1.1.1.12 christos DtPushSubtable (Subtable); 3210 1.1.1.12 christos break; 3211 1.1.1.12 christos 3212 1.1.1.12 christos case ACPI_IVRS_TYPE_HID: 3213 1.1.1.12 christos 3214 1.1.1.12 christos /* Special handling for the HID named device entry (0xF0) */ 3215 1.1.1.12 christos 3216 1.1.1.12 christos if (ParentTable) 3217 1.1 christos { 3218 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 3219 1.1.1.12 christos } 3220 1.1.1.12 christos 3221 1.1.1.12 christos /* 3222 1.1.1.12 christos * Process the HID value. First, get the HID value as a string. 3223 1.1.1.12 christos */ 3224 1.1.1.12 christos DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0); 3225 1.1.1.12 christos 3226 1.1.1.12 christos /* 3227 1.1.1.12 christos * Determine if the HID is an integer or a string. 3228 1.1.1.12 christos * An integer is defined to be 32 bits, with the upper 32 bits 3229 1.1.1.12 christos * set to zero. (from the ACPI Spec): "The HID can be a 32-bit 3230 1.1.1.12 christos * integer or a character string. If an integer, the lower 3231 1.1.1.12 christos * 4 bytes of the field contain the integer and the upper 3232 1.1.1.12 christos * 4 bytes are padded with 0". 3233 1.1.1.12 christos */ 3234 1.1.1.12 christos if (UtIsIdInteger ((UINT8 *) &Temp64)) 3235 1.1.1.12 christos { 3236 1.1.1.12 christos /* Compile the HID value as an integer */ 3237 1.1.1.12 christos 3238 1.1.1.12 christos DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0); 3239 1.1 christos 3240 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidInteger, 3241 1.1.1.12 christos &Subtable); 3242 1.1.1.12 christos if (ACPI_FAILURE (Status)) 3243 1.1 christos { 3244 1.1.1.12 christos return (Status); 3245 1.1.1.12 christos } 3246 1.1.1.12 christos } 3247 1.1.1.12 christos else 3248 1.1.1.12 christos { 3249 1.1.1.12 christos /* Compile the HID value as a string */ 3250 1.1 christos 3251 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidString, 3252 1.1.1.12 christos &Subtable); 3253 1.1.1.12 christos if (ACPI_FAILURE (Status)) 3254 1.1.1.12 christos { 3255 1.1.1.12 christos return (Status); 3256 1.1.1.12 christos } 3257 1.1.1.12 christos } 3258 1.1 christos 3259 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 3260 1.1 christos 3261 1.1.1.12 christos /* 3262 1.1.1.12 christos * Process the CID value. First, get the CID value as a string. 3263 1.1.1.12 christos */ 3264 1.1.1.12 christos DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0); 3265 1.1 christos 3266 1.1.1.12 christos if (UtIsIdInteger ((UINT8 *) &Temp64)) 3267 1.1.1.12 christos { 3268 1.1.1.12 christos /* Compile the CID value as an integer */ 3269 1.1 christos 3270 1.1.1.12 christos DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0); 3271 1.1 christos 3272 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidInteger, 3273 1.1.1.12 christos &Subtable); 3274 1.1.1.12 christos if (ACPI_FAILURE (Status)) 3275 1.1.1.12 christos { 3276 1.1.1.12 christos return (Status); 3277 1.1.1.12 christos } 3278 1.1.1.12 christos } 3279 1.1.1.12 christos else 3280 1.1.1.12 christos { 3281 1.1.1.12 christos /* Compile the CID value as a string */ 3282 1.1 christos 3283 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidString, 3284 1.1.1.12 christos &Subtable); 3285 1.1.1.12 christos if (ACPI_FAILURE (Status)) 3286 1.1.1.12 christos { 3287 1.1.1.12 christos return (Status); 3288 1.1.1.12 christos } 3289 1.1.1.12 christos } 3290 1.1 christos 3291 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 3292 1.1 christos 3293 1.1.1.12 christos /* 3294 1.1.1.12 christos * Process the UID value. First, get and decode the "UID Format" field (Integer). 3295 1.1.1.12 christos */ 3296 1.1.1.12 christos if (!*PFieldList) 3297 1.1.1.12 christos { 3298 1.1.1.12 christos return (AE_OK); 3299 1.1.1.12 christos } 3300 1.1 christos 3301 1.1.1.12 christos DtCompileOneField (&Temp8, *PFieldList, 1, DT_FIELD_TYPE_INTEGER, 0); 3302 1.1 christos 3303 1.1.1.12 christos switch (Temp8) 3304 1.1.1.12 christos { 3305 1.1.1.12 christos case ACPI_IVRS_UID_NOT_PRESENT: 3306 1.1.1.12 christos break; 3307 1.1 christos 3308 1.1.1.12 christos case ACPI_IVRS_UID_IS_INTEGER: 3309 1.1 christos 3310 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidInteger, 3311 1.1.1.12 christos &Subtable); 3312 1.1.1.12 christos if (ACPI_FAILURE (Status)) 3313 1.1.1.12 christos { 3314 1.1.1.12 christos return (Status); 3315 1.1 christos } 3316 1.1.1.12 christos DtInsertSubtable (ParentTable, Subtable); 3317 1.1.1.12 christos break; 3318 1.1 christos 3319 1.1.1.12 christos case ACPI_IVRS_UID_IS_STRING: 3320 1.1.1.12 christos 3321 1.1.1.12 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidString, 3322 1.1.1.7 christos &Subtable); 3323 1.1 christos if (ACPI_FAILURE (Status)) 3324 1.1 christos { 3325 1.1 christos return (Status); 3326 1.1 christos } 3327 1.1 christos DtInsertSubtable (ParentTable, Subtable); 3328 1.1.1.12 christos break; 3329 1.1.1.12 christos 3330 1.1.1.12 christos default: 3331 1.1.1.12 christos 3332 1.1.1.12 christos DtFatal (ASL_MSG_UNKNOWN_FORMAT, SubtableStart, 3333 1.1.1.12 christos "IVRS Device Entry"); 3334 1.1.1.12 christos return (AE_ERROR); 3335 1.1 christos } 3336 1.1 christos 3337 1.1.1.12 christos default: 3338 1.1.1.12 christos 3339 1.1.1.12 christos /* All other subtable types come through here */ 3340 1.1.1.12 christos break; 3341 1.1.1.12 christos } 3342 1.1 christos } 3343 1.1 christos 3344 1.1 christos return (AE_OK); 3345 1.1 christos } 3346 1.1.1.19 christos 3347 1.1.1.19 christos 3348 1.1.1.19 christos /****************************************************************************** 3349 1.1.1.19 christos * 3350 1.1.1.19 christos * FUNCTION: DtCompileRimt 3351 1.1.1.19 christos * 3352 1.1.1.19 christos * PARAMETERS: List - Current field list pointer 3353 1.1.1.19 christos * 3354 1.1.1.19 christos * RETURN: Status 3355 1.1.1.19 christos * 3356 1.1.1.19 christos * DESCRIPTION: Compile RIMT. 3357 1.1.1.19 christos * 3358 1.1.1.19 christos *****************************************************************************/ 3359 1.1.1.19 christos 3360 1.1.1.19 christos ACPI_STATUS 3361 1.1.1.19 christos DtCompileRimt ( 3362 1.1.1.19 christos void **List) 3363 1.1.1.19 christos { 3364 1.1.1.19 christos ACPI_RIMT_PLATFORM_DEVICE *PlatDevNode; 3365 1.1.1.19 christos ACPI_RIMT_PCIE_RC *PcieRcNode; 3366 1.1.1.19 christos ACPI_TABLE_RIMT *Rimt; 3367 1.1.1.19 christos ACPI_RIMT_IOMMU *IommuNode; 3368 1.1.1.19 christos ACPI_RIMT_NODE *RimtNode; 3369 1.1.1.19 christos ACPI_STATUS Status; 3370 1.1.1.19 christos DT_SUBTABLE *Subtable; 3371 1.1.1.19 christos DT_SUBTABLE *ParentTable; 3372 1.1.1.19 christos DT_FIELD **PFieldList = (DT_FIELD **) List; 3373 1.1.1.19 christos DT_FIELD *SubtableStart; 3374 1.1.1.19 christos UINT32 NodeNumber; 3375 1.1.1.19 christos UINT32 NodeLength; 3376 1.1.1.19 christos UINT16 IdMappingNumber; 3377 1.1.1.19 christos UINT32 i; 3378 1.1.1.19 christos 3379 1.1.1.19 christos 3380 1.1.1.19 christos ParentTable = DtPeekSubtable (); 3381 1.1.1.19 christos 3382 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimt, &Subtable); 3383 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3384 1.1.1.19 christos { 3385 1.1.1.19 christos return (Status); 3386 1.1.1.19 christos } 3387 1.1.1.19 christos 3388 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3389 1.1.1.19 christos 3390 1.1.1.19 christos /* 3391 1.1.1.19 christos * Using ACPI_SUB_PTR, We needn't define a separate structure. Care 3392 1.1.1.19 christos * should be taken to avoid accessing ACPI_TABLE_HEADER fields. 3393 1.1.1.19 christos */ 3394 1.1.1.19 christos Rimt = ACPI_SUB_PTR (ACPI_TABLE_RIMT, Subtable->Buffer, 3395 1.1.1.19 christos sizeof (ACPI_TABLE_HEADER)); 3396 1.1.1.19 christos 3397 1.1.1.19 christos NodeNumber = 0; 3398 1.1.1.19 christos while (*PFieldList) 3399 1.1.1.19 christos { 3400 1.1.1.19 christos SubtableStart = *PFieldList; 3401 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtNodeHdr, &Subtable); 3402 1.1.1.19 christos 3403 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3404 1.1.1.19 christos { 3405 1.1.1.19 christos return (Status); 3406 1.1.1.19 christos } 3407 1.1.1.19 christos 3408 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3409 1.1.1.19 christos RimtNode = ACPI_CAST_PTR (ACPI_RIMT_NODE, Subtable->Buffer); 3410 1.1.1.19 christos NodeLength = ACPI_OFFSET (ACPI_RIMT_NODE, NodeData); 3411 1.1.1.19 christos 3412 1.1.1.19 christos DtPushSubtable (Subtable); 3413 1.1.1.19 christos ParentTable = DtPeekSubtable (); 3414 1.1.1.19 christos 3415 1.1.1.19 christos switch (RimtNode->Type) 3416 1.1.1.19 christos { 3417 1.1.1.19 christos case ACPI_RIMT_NODE_TYPE_IOMMU: 3418 1.1.1.19 christos 3419 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtIommu, 3420 1.1.1.19 christos &Subtable); 3421 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3422 1.1.1.19 christos { 3423 1.1.1.19 christos return (Status); 3424 1.1.1.19 christos } 3425 1.1.1.19 christos 3426 1.1.1.19 christos IommuNode = ACPI_CAST_PTR (ACPI_RIMT_IOMMU, Subtable->Buffer); 3427 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3428 1.1.1.19 christos NodeLength += Subtable->Length; 3429 1.1.1.19 christos 3430 1.1.1.19 christos for (i = 0; i < IommuNode->NumInterruptWires; i++) 3431 1.1.1.19 christos { 3432 1.1.1.19 christos while (*PFieldList) 3433 1.1.1.19 christos { 3434 1.1.1.19 christos Status = DtCompileTable (PFieldList, 3435 1.1.1.19 christos AcpiDmTableInfoRimtIommuWire, 3436 1.1.1.19 christos &Subtable); 3437 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3438 1.1.1.19 christos { 3439 1.1.1.19 christos return (Status); 3440 1.1.1.19 christos } 3441 1.1.1.19 christos if (!Subtable) 3442 1.1.1.19 christos { 3443 1.1.1.19 christos break; 3444 1.1.1.19 christos } 3445 1.1.1.19 christos 3446 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3447 1.1.1.19 christos NodeLength += Subtable->Length; 3448 1.1.1.19 christos } 3449 1.1.1.19 christos } 3450 1.1.1.19 christos 3451 1.1.1.19 christos break; 3452 1.1.1.19 christos 3453 1.1.1.19 christos case ACPI_RIMT_NODE_TYPE_PCIE_ROOT_COMPLEX: 3454 1.1.1.19 christos 3455 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtPcieRc, 3456 1.1.1.19 christos &Subtable); 3457 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3458 1.1.1.19 christos { 3459 1.1.1.19 christos return (Status); 3460 1.1.1.19 christos } 3461 1.1.1.19 christos 3462 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3463 1.1.1.19 christos PcieRcNode = ACPI_CAST_PTR (ACPI_RIMT_PCIE_RC, Subtable->Buffer); 3464 1.1.1.19 christos NodeLength += Subtable->Length; 3465 1.1.1.19 christos 3466 1.1.1.19 christos /* Compile Array of ID mappings */ 3467 1.1.1.19 christos 3468 1.1.1.19 christos PcieRcNode->IdMappingOffset = (UINT16) NodeLength; 3469 1.1.1.19 christos IdMappingNumber = 0; 3470 1.1.1.19 christos while (*PFieldList) 3471 1.1.1.19 christos { 3472 1.1.1.19 christos Status = DtCompileTable (PFieldList, 3473 1.1.1.19 christos AcpiDmTableInfoRimtIdMapping, 3474 1.1.1.19 christos &Subtable); 3475 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3476 1.1.1.19 christos { 3477 1.1.1.19 christos return (Status); 3478 1.1.1.19 christos } 3479 1.1.1.19 christos 3480 1.1.1.19 christos if (!Subtable) 3481 1.1.1.19 christos { 3482 1.1.1.19 christos break; 3483 1.1.1.19 christos } 3484 1.1.1.19 christos 3485 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3486 1.1.1.19 christos NodeLength += sizeof (ACPI_RIMT_ID_MAPPING); 3487 1.1.1.19 christos IdMappingNumber++; 3488 1.1.1.19 christos } 3489 1.1.1.19 christos 3490 1.1.1.19 christos PcieRcNode->NumIdMappings = IdMappingNumber; 3491 1.1.1.19 christos if (!IdMappingNumber) 3492 1.1.1.19 christos { 3493 1.1.1.19 christos PcieRcNode->IdMappingOffset = 0; 3494 1.1.1.19 christos } 3495 1.1.1.19 christos 3496 1.1.1.19 christos break; 3497 1.1.1.19 christos 3498 1.1.1.19 christos case ACPI_RIMT_NODE_TYPE_PLAT_DEVICE: 3499 1.1.1.19 christos 3500 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtPlatDev, 3501 1.1.1.19 christos &Subtable); 3502 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3503 1.1.1.19 christos { 3504 1.1.1.19 christos return (Status); 3505 1.1.1.19 christos } 3506 1.1.1.19 christos 3507 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3508 1.1.1.19 christos PlatDevNode = ACPI_CAST_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable->Buffer); 3509 1.1.1.19 christos NodeLength += Subtable->Length; 3510 1.1.1.19 christos 3511 1.1.1.19 christos /* 3512 1.1.1.19 christos * Padding - Variable-length data 3513 1.1.1.19 christos * Optionally allows the offset of the ID mappings to be used 3514 1.1.1.19 christos * for filling this field. 3515 1.1.1.19 christos */ 3516 1.1.1.19 christos Status = DtCompileTable (PFieldList, AcpiDmTableInfoRimtPlatDevPad, 3517 1.1.1.19 christos &Subtable); 3518 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3519 1.1.1.19 christos { 3520 1.1.1.19 christos return (Status); 3521 1.1.1.19 christos } 3522 1.1.1.19 christos 3523 1.1.1.19 christos if (Subtable) 3524 1.1.1.19 christos { 3525 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3526 1.1.1.19 christos NodeLength += Subtable->Length; 3527 1.1.1.19 christos } 3528 1.1.1.19 christos else 3529 1.1.1.19 christos { 3530 1.1.1.19 christos if (NodeLength > PlatDevNode->IdMappingOffset) 3531 1.1.1.19 christos { 3532 1.1.1.19 christos return (AE_BAD_DATA); 3533 1.1.1.19 christos } 3534 1.1.1.19 christos 3535 1.1.1.19 christos if (NodeLength < PlatDevNode->IdMappingOffset) 3536 1.1.1.19 christos { 3537 1.1.1.19 christos Status = DtCompilePadding ( 3538 1.1.1.19 christos PlatDevNode->IdMappingOffset - (UINT16) NodeLength, 3539 1.1.1.19 christos &Subtable); 3540 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3541 1.1.1.19 christos { 3542 1.1.1.19 christos return (Status); 3543 1.1.1.19 christos } 3544 1.1.1.19 christos 3545 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3546 1.1.1.19 christos NodeLength = PlatDevNode->IdMappingOffset; 3547 1.1.1.19 christos } 3548 1.1.1.19 christos } 3549 1.1.1.19 christos 3550 1.1.1.19 christos /* Compile Array of ID mappings */ 3551 1.1.1.19 christos 3552 1.1.1.19 christos PlatDevNode->IdMappingOffset = (UINT16) NodeLength; 3553 1.1.1.19 christos IdMappingNumber = 0; 3554 1.1.1.19 christos while (*PFieldList) 3555 1.1.1.19 christos { 3556 1.1.1.19 christos Status = DtCompileTable (PFieldList, 3557 1.1.1.19 christos AcpiDmTableInfoRimtIdMapping, 3558 1.1.1.19 christos &Subtable); 3559 1.1.1.19 christos if (ACPI_FAILURE (Status)) 3560 1.1.1.19 christos { 3561 1.1.1.19 christos return (Status); 3562 1.1.1.19 christos } 3563 1.1.1.19 christos 3564 1.1.1.19 christos if (!Subtable) 3565 1.1.1.19 christos { 3566 1.1.1.19 christos break; 3567 1.1.1.19 christos } 3568 1.1.1.19 christos 3569 1.1.1.19 christos DtInsertSubtable (ParentTable, Subtable); 3570 1.1.1.19 christos NodeLength += sizeof (ACPI_RIMT_ID_MAPPING); 3571 1.1.1.19 christos IdMappingNumber++; 3572 1.1.1.19 christos } 3573 1.1.1.19 christos 3574 1.1.1.19 christos PlatDevNode->NumIdMappings = IdMappingNumber; 3575 1.1.1.19 christos if (!IdMappingNumber) 3576 1.1.1.19 christos { 3577 1.1.1.19 christos PlatDevNode->IdMappingOffset = 0; 3578 1.1.1.19 christos } 3579 1.1.1.19 christos 3580 1.1.1.19 christos break; 3581 1.1.1.19 christos 3582 1.1.1.19 christos 3583 1.1.1.19 christos default: 3584 1.1.1.19 christos 3585 1.1.1.19 christos DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "RIMT"); 3586 1.1.1.19 christos return (AE_ERROR); 3587 1.1.1.19 christos } 3588 1.1.1.19 christos 3589 1.1.1.19 christos DtPopSubtable (); 3590 1.1.1.19 christos ParentTable = DtPeekSubtable (); 3591 1.1.1.19 christos NodeNumber++; 3592 1.1.1.19 christos } 3593 1.1.1.19 christos 3594 1.1.1.19 christos Rimt->NumNodes = NodeNumber; 3595 1.1.1.19 christos return (AE_OK); 3596 1.1.1.19 christos } 3597