1 /****************************************************************************** 2 * 3 * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7 /****************************************************************************** 8 * 9 * 1. Copyright Notice 10 * 11 * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 12 * All rights reserved. 13 * 14 * 2. License 15 * 16 * 2.1. This is your license from Intel Corp. under its intellectual property 17 * rights. You may have additional license terms from the party that provided 18 * you this software, covering your right to use that party's intellectual 19 * property rights. 20 * 21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 * copy of the source code appearing in this file ("Covered Code") an 23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 * base code distributed originally by Intel ("Original Intel Code") to copy, 25 * make derivatives, distribute, use and display any portion of the Covered 26 * Code in any form, with the right to sublicense such rights; and 27 * 28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 * license (with the right to sublicense), under only those claims of Intel 30 * patents that are infringed by the Original Intel Code, to make, use, sell, 31 * offer to sell, and import the Covered Code and derivative works thereof 32 * solely to the minimum extent necessary to exercise the above copyright 33 * license, and in no event shall the patent license extend to any additions 34 * to or modifications of the Original Intel Code. No other license or right 35 * is granted directly or by implication, estoppel or otherwise; 36 * 37 * The above copyright and patent license is granted only if the following 38 * conditions are met: 39 * 40 * 3. Conditions 41 * 42 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 * Redistribution of source code of any substantial portion of the Covered 44 * Code or modification with rights to further distribute source must include 45 * the above Copyright Notice, the above License, this list of Conditions, 46 * and the following Disclaimer and Export Compliance provision. In addition, 47 * Licensee must cause all Covered Code to which Licensee contributes to 48 * contain a file documenting the changes Licensee made to create that Covered 49 * Code and the date of any change. Licensee must include in that file the 50 * documentation of any changes made by any predecessor Licensee. Licensee 51 * must include a prominent statement that the modification is derived, 52 * directly or indirectly, from Original Intel Code. 53 * 54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 * Redistribution of source code of any substantial portion of the Covered 56 * Code or modification without rights to further distribute source must 57 * include the following Disclaimer and Export Compliance provision in the 58 * documentation and/or other materials provided with distribution. In 59 * addition, Licensee may not authorize further sublicense of source of any 60 * portion of the Covered Code, and must include terms to the effect that the 61 * license from Licensee to its licensee is limited to the intellectual 62 * property embodied in the software Licensee provides to its licensee, and 63 * not to intellectual property embodied in modifications its licensee may 64 * make. 65 * 66 * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 * substantial portion of the Covered Code or modification must reproduce the 68 * above Copyright Notice, and the following Disclaimer and Export Compliance 69 * provision in the documentation and/or other materials provided with the 70 * distribution. 71 * 72 * 3.4. Intel retains all right, title, and interest in and to the Original 73 * Intel Code. 74 * 75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 * Intel shall be used in advertising or otherwise to promote the sale, use or 77 * other dealings in products derived from or relating to the Covered Code 78 * without prior written authorization from Intel. 79 * 80 * 4. Disclaimer and Export Compliance 81 * 82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 * PARTICULAR PURPOSE. 89 * 90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 * LIMITED REMEDY. 98 * 99 * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 * software or system incorporating such software without first obtaining any 101 * required license or other approval from the U. S. Department of Commerce or 102 * any other agency or department of the United States Government. In the 103 * event Licensee exports any such software from the United States or 104 * re-exports any such software from a foreign destination, Licensee shall 105 * ensure that the distribution and export/re-export of the software is in 106 * compliance with all laws, regulations, orders, or other restrictions of the 107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 * any of its subsidiaries will export/re-export any technical data, process, 109 * software, or service, directly or indirectly, to any country for which the 110 * United States government or any agency thereof requires an export license, 111 * other governmental approval, or letter of assurance, without first obtaining 112 * such license, approval or letter. 113 * 114 ***************************************************************************** 115 * 116 * Alternatively, you may choose to be licensed under the terms of the 117 * following license: 118 * 119 * Redistribution and use in source and binary forms, with or without 120 * modification, are permitted provided that the following conditions 121 * are met: 122 * 1. Redistributions of source code must retain the above copyright 123 * notice, this list of conditions, and the following disclaimer, 124 * without modification. 125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 * substantially similar to the "NO WARRANTY" disclaimer below 127 * ("Disclaimer") and any redistribution must be conditioned upon 128 * including a substantially similar Disclaimer requirement for further 129 * binary redistribution. 130 * 3. Neither the names of the above-listed copyright holders nor the names 131 * of any contributors may be used to endorse or promote products derived 132 * from this software without specific prior written permission. 133 * 134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 * 146 * Alternatively, you may choose to be licensed under the terms of the 147 * GNU General Public License ("GPL") version 2 as published by the Free 148 * Software Foundation. 149 * 150 *****************************************************************************/ 151 152 #include <wchar.h> 153 #include "acpi.h" 154 #include "accommon.h" 155 #include "acdisasm.h" 156 #include "actables.h" 157 #include "aslcompiler.h" 158 159 /* This module used for application-level code only */ 160 161 #define _COMPONENT ACPI_CA_DISASSEMBLER 162 ACPI_MODULE_NAME ("dmtbdump2") 163 164 165 /******************************************************************************* 166 * 167 * FUNCTION: AcpiDmDumpIort 168 * 169 * PARAMETERS: Table - A IORT table 170 * 171 * RETURN: None 172 * 173 * DESCRIPTION: Format the contents of a IORT 174 * 175 ******************************************************************************/ 176 177 void 178 AcpiDmDumpIort ( 179 ACPI_TABLE_HEADER *Table) 180 { 181 ACPI_STATUS Status; 182 ACPI_TABLE_IORT *Iort; 183 ACPI_IORT_NODE *IortNode; 184 ACPI_IORT_ITS_GROUP *IortItsGroup = NULL; 185 ACPI_IORT_SMMU *IortSmmu = NULL; 186 ACPI_IORT_RMR *IortRmr = NULL; 187 UINT32 Offset; 188 UINT32 NodeOffset; 189 UINT32 Length; 190 ACPI_DMTABLE_INFO *InfoTable; 191 char *String; 192 UINT32 i; 193 UINT32 MappingByteLength; 194 UINT8 Revision; 195 196 197 /* Main table */ 198 199 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort); 200 if (ACPI_FAILURE (Status)) 201 { 202 return; 203 } 204 205 Revision = Table->Revision; 206 207 /* IORT Revisions E, E.a and E.c have known issues and are not supported */ 208 209 if (Revision == 1 || Revision == 2 || Revision == 4) 210 { 211 AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n", 212 Revision); 213 return; 214 } 215 216 Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table); 217 Offset = sizeof (ACPI_TABLE_IORT); 218 219 /* Dump the OptionalPadding (optional) */ 220 221 if (Iort->NodeOffset > Offset) 222 { 223 Status = AcpiDmDumpTable (Table->Length, Offset, Table, 224 Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad); 225 if (ACPI_FAILURE (Status)) 226 { 227 return; 228 } 229 } 230 231 Offset = Iort->NodeOffset; 232 while (Offset < Table->Length) 233 { 234 /* Common subtable header */ 235 236 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset); 237 AcpiOsPrintf ("\n"); 238 Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData); 239 240 if (Revision == 0) 241 { 242 Status = AcpiDmDumpTable (Table->Length, Offset, 243 IortNode, Length, AcpiDmTableInfoIortHdr); 244 } 245 else if (Revision >= 3) 246 { 247 Status = AcpiDmDumpTable (Table->Length, Offset, 248 IortNode, Length, AcpiDmTableInfoIortHdr3); 249 } 250 251 if (ACPI_FAILURE (Status)) 252 { 253 return; 254 } 255 256 NodeOffset = Length; 257 258 switch (IortNode->Type) 259 { 260 case ACPI_IORT_NODE_ITS_GROUP: 261 262 InfoTable = AcpiDmTableInfoIort0; 263 Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers); 264 IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset); 265 break; 266 267 case ACPI_IORT_NODE_NAMED_COMPONENT: 268 269 InfoTable = AcpiDmTableInfoIort1; 270 Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName); 271 String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length); 272 Length += strlen (String) + 1; 273 break; 274 275 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: 276 277 InfoTable = AcpiDmTableInfoIort2; 278 Length = IortNode->Length - NodeOffset; 279 break; 280 281 case ACPI_IORT_NODE_SMMU: 282 283 InfoTable = AcpiDmTableInfoIort3; 284 Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts); 285 IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset); 286 break; 287 288 case ACPI_IORT_NODE_SMMU_V3: 289 290 InfoTable = AcpiDmTableInfoIort4; 291 Length = IortNode->Length - NodeOffset; 292 break; 293 294 case ACPI_IORT_NODE_PMCG: 295 296 InfoTable = AcpiDmTableInfoIort5; 297 Length = IortNode->Length - NodeOffset; 298 break; 299 300 case ACPI_IORT_NODE_RMR: 301 302 InfoTable = AcpiDmTableInfoIort6; 303 Length = IortNode->Length - NodeOffset; 304 IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset); 305 break; 306 307 default: 308 309 AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n", 310 IortNode->Type); 311 312 /* Attempt to continue */ 313 314 if (!IortNode->Length) 315 { 316 AcpiOsPrintf ("Invalid zero length IORT node\n"); 317 return; 318 } 319 goto NextSubtable; 320 } 321 322 /* Dump the node subtable header */ 323 324 AcpiOsPrintf ("\n"); 325 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 326 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 327 Length, InfoTable); 328 if (ACPI_FAILURE (Status)) 329 { 330 return; 331 } 332 333 NodeOffset += Length; 334 335 /* Dump the node specific data */ 336 337 switch (IortNode->Type) 338 { 339 case ACPI_IORT_NODE_ITS_GROUP: 340 341 /* Validate IortItsGroup to avoid compiler warnings */ 342 343 if (IortItsGroup) 344 { 345 for (i = 0; i < IortItsGroup->ItsCount; i++) 346 { 347 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 348 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 349 4, AcpiDmTableInfoIort0a); 350 if (ACPI_FAILURE (Status)) 351 { 352 return; 353 } 354 355 NodeOffset += 4; 356 } 357 } 358 break; 359 360 case ACPI_IORT_NODE_NAMED_COMPONENT: 361 362 /* Dump the Padding (optional) */ 363 364 if (IortNode->Length > NodeOffset) 365 { 366 MappingByteLength = 367 IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING); 368 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 369 Table, IortNode->Length - NodeOffset - MappingByteLength, 370 AcpiDmTableInfoIort1a); 371 if (ACPI_FAILURE (Status)) 372 { 373 return; 374 } 375 } 376 break; 377 378 case ACPI_IORT_NODE_SMMU: 379 380 AcpiOsPrintf ("\n"); 381 382 /* Validate IortSmmu to avoid compiler warnings */ 383 384 if (IortSmmu) 385 { 386 Length = 2 * sizeof (UINT64); 387 NodeOffset = IortSmmu->GlobalInterruptOffset; 388 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 389 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 390 Length, AcpiDmTableInfoIort3a); 391 if (ACPI_FAILURE (Status)) 392 { 393 return; 394 } 395 396 NodeOffset = IortSmmu->ContextInterruptOffset; 397 for (i = 0; i < IortSmmu->ContextInterruptCount; i++) 398 { 399 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 400 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 401 8, AcpiDmTableInfoIort3b); 402 if (ACPI_FAILURE (Status)) 403 { 404 return; 405 } 406 407 NodeOffset += 8; 408 } 409 410 NodeOffset = IortSmmu->PmuInterruptOffset; 411 for (i = 0; i < IortSmmu->PmuInterruptCount; i++) 412 { 413 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 414 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 415 8, AcpiDmTableInfoIort3c); 416 if (ACPI_FAILURE (Status)) 417 { 418 return; 419 } 420 421 NodeOffset += 8; 422 } 423 } 424 break; 425 426 case ACPI_IORT_NODE_RMR: 427 428 /* Validate IortRmr to avoid compiler warnings */ 429 if (IortRmr) 430 { 431 NodeOffset = IortRmr->RmrOffset; 432 Length = sizeof (ACPI_IORT_RMR_DESC); 433 for (i = 0; i < IortRmr->RmrCount; i++) 434 { 435 AcpiOsPrintf ("\n"); 436 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 437 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 438 Length, AcpiDmTableInfoIort6a); 439 if (ACPI_FAILURE (Status)) 440 { 441 return; 442 } 443 444 NodeOffset += Length; 445 } 446 } 447 break; 448 449 default: 450 451 break; 452 } 453 454 /* Dump the ID mappings */ 455 456 NodeOffset = IortNode->MappingOffset; 457 for (i = 0; i < IortNode->MappingCount; i++) 458 { 459 AcpiOsPrintf ("\n"); 460 Length = sizeof (ACPI_IORT_ID_MAPPING); 461 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 462 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 463 Length, AcpiDmTableInfoIortMap); 464 if (ACPI_FAILURE (Status)) 465 { 466 return; 467 } 468 469 NodeOffset += Length; 470 } 471 472 NextSubtable: 473 /* Point to next node subtable */ 474 475 Offset += IortNode->Length; 476 } 477 } 478 479 480 /******************************************************************************* 481 * 482 * FUNCTION: AcpiDmDumpIvrs 483 * 484 * PARAMETERS: Table - A IVRS table 485 * 486 * RETURN: None 487 * 488 * DESCRIPTION: Format the contents of a IVRS. Notes: 489 * The IVRS is essentially a flat table, with the following 490 * structure: 491 * <Main ACPI Table Header> 492 * <Main subtable - virtualization info> 493 * <IVHD> 494 * <Device Entries> 495 * ... 496 * <IVHD> 497 * <Device Entries> 498 * <IVMD> 499 * ... 500 * 501 ******************************************************************************/ 502 503 void 504 AcpiDmDumpIvrs ( 505 ACPI_TABLE_HEADER *Table) 506 { 507 ACPI_STATUS Status; 508 UINT32 Offset = sizeof (ACPI_TABLE_IVRS); 509 UINT32 EntryOffset; 510 UINT32 EntryLength; 511 UINT32 EntryType; 512 ACPI_IVRS_DEVICE_HID *HidSubtable; 513 ACPI_IVRS_DE_HEADER *DeviceEntry; 514 ACPI_IVRS_HEADER *Subtable; 515 ACPI_DMTABLE_INFO *InfoTable; 516 517 518 /* Main table */ 519 520 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); 521 if (ACPI_FAILURE (Status)) 522 { 523 return; 524 } 525 526 /* Subtables */ 527 528 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); 529 530 while (Offset < Table->Length) 531 { 532 switch (Subtable->Type) 533 { 534 /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */ 535 536 case ACPI_IVRS_TYPE_HARDWARE1: 537 538 AcpiOsPrintf ("\n"); 539 InfoTable = AcpiDmTableInfoIvrsHware1; 540 break; 541 542 /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */ 543 544 case ACPI_IVRS_TYPE_HARDWARE2: 545 case ACPI_IVRS_TYPE_HARDWARE3: 546 547 AcpiOsPrintf ("\n"); 548 InfoTable = AcpiDmTableInfoIvrsHware23; 549 break; 550 551 /* Types 20h-22h, IVMD (I/O Virtualization Memory Definition Block) */ 552 553 case ACPI_IVRS_TYPE_MEMORY1: 554 case ACPI_IVRS_TYPE_MEMORY2: 555 case ACPI_IVRS_TYPE_MEMORY3: 556 557 AcpiOsPrintf ("\n"); 558 InfoTable = AcpiDmTableInfoIvrsMemory; 559 break; 560 561 default: 562 563 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n", 564 Subtable->Type); 565 566 /* Attempt to continue */ 567 568 if (!Subtable->Length) 569 { 570 AcpiOsPrintf ("Invalid zero length subtable\n"); 571 return; 572 } 573 goto NextSubtable; 574 } 575 576 /* Dump the subtable */ 577 578 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 579 Subtable->Length, InfoTable); 580 if (ACPI_FAILURE (Status)) 581 { 582 return; 583 } 584 585 /* The hardware subtables (IVHD) can contain multiple device entries */ 586 587 if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 || 588 Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 || 589 Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3) 590 { 591 if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1) 592 { 593 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1); 594 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, 595 sizeof (ACPI_IVRS_HARDWARE1)); 596 } 597 else 598 { 599 /* ACPI_IVRS_TYPE_HARDWARE2, HARDWARE3 subtable types */ 600 601 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2); 602 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, 603 sizeof (ACPI_IVRS_HARDWARE2)); 604 } 605 606 /* Process all of the Device Entries */ 607 608 while (EntryOffset < (Offset + Subtable->Length)) 609 { 610 AcpiOsPrintf ("\n"); 611 612 /* 613 * Upper 2 bits of Type encode the length of the device entry 614 * 615 * 00 = 4 byte 616 * 01 = 8 byte 617 * 1x = variable length 618 */ 619 EntryType = DeviceEntry->Type; 620 EntryLength = EntryType >> 6 == 1 ? 8 : 4; 621 622 switch (EntryType) 623 { 624 /* 4-byte device entries */ 625 626 case ACPI_IVRS_TYPE_PAD4: 627 case ACPI_IVRS_TYPE_ALL: 628 case ACPI_IVRS_TYPE_SELECT: 629 case ACPI_IVRS_TYPE_START: 630 case ACPI_IVRS_TYPE_END: 631 632 InfoTable = AcpiDmTableInfoIvrs4; 633 break; 634 635 /* 8-byte entries, type A */ 636 637 case ACPI_IVRS_TYPE_ALIAS_SELECT: 638 case ACPI_IVRS_TYPE_ALIAS_START: 639 640 InfoTable = AcpiDmTableInfoIvrs8a; 641 break; 642 643 /* 8-byte entries, type B */ 644 645 case ACPI_IVRS_TYPE_PAD8: 646 case ACPI_IVRS_TYPE_EXT_SELECT: 647 case ACPI_IVRS_TYPE_EXT_START: 648 649 InfoTable = AcpiDmTableInfoIvrs8b; 650 break; 651 652 /* 8-byte entries, type C */ 653 654 case ACPI_IVRS_TYPE_SPECIAL: 655 656 InfoTable = AcpiDmTableInfoIvrs8c; 657 break; 658 659 /* Variable-length entries */ 660 661 case ACPI_IVRS_TYPE_HID: 662 663 EntryLength = 4; 664 InfoTable = AcpiDmTableInfoIvrsHid; 665 break; 666 667 default: 668 InfoTable = AcpiDmTableInfoIvrs4; 669 AcpiOsPrintf ( 670 "\n**** Unknown IVRS device entry type/length: " 671 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n", 672 EntryType, EntryLength, EntryOffset); 673 break; 674 } 675 676 /* Dump the Device Entry */ 677 678 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 679 DeviceEntry, EntryLength, InfoTable); 680 if (ACPI_FAILURE (Status)) 681 { 682 return; 683 } 684 685 HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry); 686 EntryOffset += EntryLength; 687 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, HidSubtable, 688 EntryLength); 689 690 if (EntryType == ACPI_IVRS_TYPE_HID) 691 { 692 /* 693 * Determine if the HID is an integer or a string. 694 * An integer is defined to be 32 bits, with the upper 32 bits 695 * set to zero. (from the ACPI Spec): "The HID can be a 32-bit 696 * integer or a character string. If an integer, the lower 697 * 4 bytes of the field contain the integer and the upper 698 * 4 bytes are padded with 0". 699 */ 700 if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid)) 701 { 702 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 703 &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger); 704 } 705 else 706 { 707 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 708 &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString); 709 } 710 if (ACPI_FAILURE (Status)) 711 { 712 return; 713 } 714 715 EntryOffset += 8; 716 717 /* 718 * Determine if the CID is an integer or a string. The format 719 * of the CID is the same as the HID above. From ACPI Spec: 720 * "If present, CID must be a single Compatible Device ID 721 * following the same format as the HID field." 722 */ 723 if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid)) 724 { 725 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 726 &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger); 727 } 728 else 729 { 730 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 731 &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString); 732 } 733 if (ACPI_FAILURE (Status)) 734 { 735 return; 736 } 737 738 EntryOffset += 8; 739 EntryLength = HidSubtable->UidLength; 740 741 if (EntryLength > ACPI_IVRS_UID_NOT_PRESENT) 742 { 743 /* Dump the UID based upon the UidType field (String or Integer) */ 744 745 if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING) 746 { 747 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 748 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString); 749 if (ACPI_FAILURE (Status)) 750 { 751 return; 752 } 753 } 754 else /* ACPI_IVRS_UID_IS_INTEGER */ 755 { 756 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 757 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger); 758 if (ACPI_FAILURE (Status)) 759 { 760 return; 761 } 762 } 763 } 764 765 EntryOffset += EntryLength+2; 766 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, 767 Table, EntryOffset); 768 } 769 } 770 } 771 772 NextSubtable: 773 /* Point to next subtable */ 774 775 Offset += Subtable->Length; 776 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length); 777 } 778 } 779 780 781 /******************************************************************************* 782 * 783 * FUNCTION: AcpiDmDumpLpit 784 * 785 * PARAMETERS: Table - A LPIT table 786 * 787 * RETURN: None 788 * 789 * DESCRIPTION: Format the contents of a LPIT. This table type consists 790 * of an open-ended number of subtables. Note: There are no 791 * entries in the main table. An LPIT consists of the table 792 * header and then subtables only. 793 * 794 ******************************************************************************/ 795 796 void 797 AcpiDmDumpLpit ( 798 ACPI_TABLE_HEADER *Table) 799 { 800 ACPI_STATUS Status; 801 ACPI_LPIT_HEADER *Subtable; 802 UINT32 Length = Table->Length; 803 UINT32 Offset = sizeof (ACPI_TABLE_LPIT); 804 ACPI_DMTABLE_INFO *InfoTable; 805 UINT32 SubtableLength; 806 807 808 /* Subtables */ 809 810 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); 811 while (Offset < Table->Length) 812 { 813 /* Common subtable header */ 814 815 Status = AcpiDmDumpTable (Length, Offset, Subtable, 816 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr); 817 if (ACPI_FAILURE (Status)) 818 { 819 return; 820 } 821 822 switch (Subtable->Type) 823 { 824 case ACPI_LPIT_TYPE_NATIVE_CSTATE: 825 826 InfoTable = AcpiDmTableInfoLpit0; 827 SubtableLength = sizeof (ACPI_LPIT_NATIVE); 828 break; 829 830 default: 831 832 /* Cannot continue on unknown type - no length */ 833 834 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", 835 Subtable->Type); 836 return; 837 } 838 839 Status = AcpiDmDumpTable (Length, Offset, Subtable, 840 SubtableLength, InfoTable); 841 if (ACPI_FAILURE (Status)) 842 { 843 return; 844 } 845 846 AcpiOsPrintf ("\n"); 847 848 /* Point to next subtable */ 849 850 Offset += SubtableLength; 851 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength); 852 } 853 } 854 855 856 /******************************************************************************* 857 * 858 * FUNCTION: AcpiDmDumpMadt 859 * 860 * PARAMETERS: Table - A MADT table 861 * 862 * RETURN: None 863 * 864 * DESCRIPTION: Format the contents of a MADT. This table type consists 865 * of an open-ended number of subtables. 866 * 867 ******************************************************************************/ 868 869 void 870 AcpiDmDumpMadt ( 871 ACPI_TABLE_HEADER *Table) 872 { 873 ACPI_STATUS Status; 874 ACPI_SUBTABLE_HEADER *Subtable; 875 UINT32 Length = Table->Length; 876 UINT32 Offset = sizeof (ACPI_TABLE_MADT); 877 ACPI_DMTABLE_INFO *InfoTable; 878 UINT8 Revision; 879 880 881 /* Main table */ 882 883 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt); 884 if (ACPI_FAILURE (Status)) 885 { 886 return; 887 } 888 889 Revision = Table->Revision; 890 891 /* Subtables */ 892 893 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 894 DbgPrint (ASL_PARSE_OUTPUT, "//0B) Offset %X, from table start: 0x%8.8X%8.8X\n", 895 Offset, ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table))); 896 while (Offset < Table->Length) 897 { 898 /* Common subtable header */ 899 900 AcpiOsPrintf ("\n"); 901 Status = AcpiDmDumpTable (Length, Offset, Subtable, 902 Subtable->Length, AcpiDmTableInfoMadtHdr); 903 if (ACPI_FAILURE (Status)) 904 { 905 return; 906 } 907 908 DbgPrint (ASL_PARSE_OUTPUT, "subtableType: %X\n", Subtable->Type); 909 switch (Subtable->Type) 910 { 911 case ACPI_MADT_TYPE_LOCAL_APIC: 912 913 InfoTable = AcpiDmTableInfoMadt0; 914 break; 915 916 case ACPI_MADT_TYPE_IO_APIC: 917 918 InfoTable = AcpiDmTableInfoMadt1; 919 break; 920 921 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 922 923 InfoTable = AcpiDmTableInfoMadt2; 924 break; 925 926 case ACPI_MADT_TYPE_NMI_SOURCE: 927 928 InfoTable = AcpiDmTableInfoMadt3; 929 break; 930 931 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 932 933 InfoTable = AcpiDmTableInfoMadt4; 934 break; 935 936 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 937 938 InfoTable = AcpiDmTableInfoMadt5; 939 break; 940 941 case ACPI_MADT_TYPE_IO_SAPIC: 942 943 InfoTable = AcpiDmTableInfoMadt6; 944 break; 945 946 case ACPI_MADT_TYPE_LOCAL_SAPIC: 947 948 InfoTable = AcpiDmTableInfoMadt7; 949 break; 950 951 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 952 953 InfoTable = AcpiDmTableInfoMadt8; 954 break; 955 956 case ACPI_MADT_TYPE_LOCAL_X2APIC: 957 958 InfoTable = AcpiDmTableInfoMadt9; 959 break; 960 961 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 962 963 InfoTable = AcpiDmTableInfoMadt10; 964 break; 965 966 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 967 968 if (Revision > 6) 969 InfoTable = AcpiDmTableInfoMadt11b; 970 else if (Revision == 6) 971 InfoTable = AcpiDmTableInfoMadt11a; 972 else 973 InfoTable = AcpiDmTableInfoMadt11; 974 break; 975 976 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 977 978 InfoTable = AcpiDmTableInfoMadt12; 979 break; 980 981 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 982 983 InfoTable = AcpiDmTableInfoMadt13; 984 break; 985 986 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 987 988 InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a : 989 AcpiDmTableInfoMadt14; 990 break; 991 992 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR: 993 994 InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a : 995 AcpiDmTableInfoMadt15; 996 break; 997 998 case ACPI_MADT_TYPE_MULTIPROC_WAKEUP: 999 1000 InfoTable = AcpiDmTableInfoMadt16; 1001 break; 1002 1003 case ACPI_MADT_TYPE_CORE_PIC: 1004 1005 InfoTable = AcpiDmTableInfoMadt17; 1006 break; 1007 1008 case ACPI_MADT_TYPE_LIO_PIC: 1009 1010 InfoTable = AcpiDmTableInfoMadt18; 1011 break; 1012 1013 case ACPI_MADT_TYPE_HT_PIC: 1014 1015 InfoTable = AcpiDmTableInfoMadt19; 1016 break; 1017 1018 case ACPI_MADT_TYPE_EIO_PIC: 1019 1020 InfoTable = AcpiDmTableInfoMadt20; 1021 break; 1022 1023 case ACPI_MADT_TYPE_MSI_PIC: 1024 1025 InfoTable = AcpiDmTableInfoMadt21; 1026 break; 1027 1028 case ACPI_MADT_TYPE_BIO_PIC: 1029 1030 InfoTable = AcpiDmTableInfoMadt22; 1031 break; 1032 1033 case ACPI_MADT_TYPE_LPC_PIC: 1034 1035 InfoTable = AcpiDmTableInfoMadt23; 1036 break; 1037 1038 case ACPI_MADT_TYPE_RINTC: 1039 1040 InfoTable = AcpiDmTableInfoMadt24; 1041 break; 1042 1043 case ACPI_MADT_TYPE_IMSIC: 1044 1045 InfoTable = AcpiDmTableInfoMadt25; 1046 break; 1047 1048 case ACPI_MADT_TYPE_APLIC: 1049 1050 InfoTable = AcpiDmTableInfoMadt26; 1051 break; 1052 1053 case ACPI_MADT_TYPE_PLIC: 1054 1055 InfoTable = AcpiDmTableInfoMadt27; 1056 break; 1057 1058 default: 1059 1060 if ((Subtable->Type >= ACPI_MADT_TYPE_RESERVED) && 1061 (Subtable->Type < ACPI_MADT_TYPE_OEM_RESERVED)) 1062 { 1063 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", 1064 Subtable->Type); 1065 goto NextSubtable; 1066 } 1067 else if (Subtable->Type >= ACPI_MADT_TYPE_OEM_RESERVED) 1068 { 1069 DbgPrint (ASL_PARSE_OUTPUT, "//[Found an OEM structure, type = %0x]\n", 1070 Subtable->Type); 1071 Offset += sizeof (ACPI_SUBTABLE_HEADER); 1072 DbgPrint (ASL_PARSE_OUTPUT, "//[0) Subtable->Length = %X, Subtable = %p, Offset = %X]\n", 1073 Subtable->Length, Subtable, Offset); 1074 DbgPrint (ASL_PARSE_OUTPUT, "//[0A) Offset from table start: 0x%8.8X%8.8X]\n", 1075 ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table))); 1076 } 1077 1078 /* Attempt to continue */ 1079 1080 if (!Subtable->Length) 1081 { 1082 AcpiOsPrintf ("Invalid zero length subtable\n"); 1083 return; 1084 } 1085 1086 /* Dump the OEM data */ 1087 1088 Status = AcpiDmDumpTable (Length, Offset, ACPI_CAST_PTR (UINT8, Table) + Offset, 1089 Subtable->Length - sizeof (ACPI_SUBTABLE_HEADER), AcpiDmTableInfoMadt128); 1090 if (ACPI_FAILURE (Status)) 1091 { 1092 return; 1093 } 1094 1095 DbgPrint (ASL_PARSE_OUTPUT, "//[1) Subtable->Length = %X, Offset = %X]\n", 1096 Subtable->Length, Offset); 1097 Offset -= sizeof (ACPI_SUBTABLE_HEADER); 1098 1099 goto NextSubtable; 1100 } 1101 1102 DbgPrint (ASL_PARSE_OUTPUT, "//[2) Subtable->Length = %X, Offset = %X]\n", 1103 Subtable->Length, Offset); 1104 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1105 Subtable->Length, InfoTable); 1106 if (ACPI_FAILURE (Status)) 1107 { 1108 return; 1109 } 1110 1111 NextSubtable: 1112 /* Point to next subtable */ 1113 1114 DbgPrint (ASL_PARSE_OUTPUT, "//[3) Subtable->Length = %X, Offset = %X]\n", 1115 Subtable->Length, Offset); 1116 DbgPrint (ASL_PARSE_OUTPUT, "//[4) Offset from table start: 0x%8.8X%8.8X (%p) %p]\n", 1117 ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (UINT8, Subtable) - ACPI_CAST_PTR (UINT8, Table)), Subtable, Table); 1118 if (Offset > Table->Length) 1119 { 1120 return; 1121 } 1122 1123 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, 1124 Subtable->Length); 1125 1126 Offset = ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table); 1127 if (Offset >= Table->Length) 1128 { 1129 return; 1130 } 1131 1132 DbgPrint (ASL_PARSE_OUTPUT, "//[5) Next Subtable %p, length %X]\n", 1133 Subtable, Subtable->Length); 1134 DbgPrint (ASL_PARSE_OUTPUT, "//[5B) Offset from table start: 0x%8.8X%8.8X (%p)]\n", 1135 ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)), Subtable); 1136 } 1137 } 1138 1139 1140 /******************************************************************************* 1141 * 1142 * FUNCTION: AcpiDmDumpMcfg 1143 * 1144 * PARAMETERS: Table - A MCFG Table 1145 * 1146 * RETURN: None 1147 * 1148 * DESCRIPTION: Format the contents of a MCFG table 1149 * 1150 ******************************************************************************/ 1151 1152 void 1153 AcpiDmDumpMcfg ( 1154 ACPI_TABLE_HEADER *Table) 1155 { 1156 ACPI_STATUS Status; 1157 UINT32 Offset = sizeof (ACPI_TABLE_MCFG); 1158 ACPI_MCFG_ALLOCATION *Subtable; 1159 1160 1161 /* Main table */ 1162 1163 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); 1164 if (ACPI_FAILURE (Status)) 1165 { 1166 return; 1167 } 1168 1169 /* Subtables */ 1170 1171 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); 1172 while (Offset < Table->Length) 1173 { 1174 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) 1175 { 1176 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", 1177 (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); 1178 return; 1179 } 1180 1181 AcpiOsPrintf ("\n"); 1182 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1183 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); 1184 if (ACPI_FAILURE (Status)) 1185 { 1186 return; 1187 } 1188 1189 /* Point to next subtable (each subtable is of fixed length) */ 1190 1191 Offset += sizeof (ACPI_MCFG_ALLOCATION); 1192 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable, 1193 sizeof (ACPI_MCFG_ALLOCATION)); 1194 } 1195 } 1196 1197 /******************************************************************************* 1198 * 1199 * FUNCTION: AcpiDmDumpMpam 1200 * 1201 * PARAMETERS: Table - A MPAM table 1202 * 1203 * RETURN: None 1204 * 1205 * DESCRIPTION: Format the contents of a MPAM table 1206 * 1207 ******************************************************************************/ 1208 1209 void 1210 AcpiDmDumpMpam ( 1211 ACPI_TABLE_HEADER *Table) 1212 { 1213 ACPI_STATUS Status; 1214 ACPI_MPAM_MSC_NODE *MpamMscNode; 1215 ACPI_MPAM_RESOURCE_NODE *MpamResourceNode; 1216 ACPI_MPAM_FUNC_DEPS *MpamFunctionalDependency; 1217 ACPI_DMTABLE_INFO *InfoTable; 1218 UINT32 Offset = sizeof(ACPI_TABLE_HEADER); 1219 UINT32 TempOffset; 1220 UINT32 MpamResourceNodeLength = 0; 1221 1222 while (Offset < Table->Length) 1223 { 1224 MpamMscNode = ACPI_ADD_PTR (ACPI_MPAM_MSC_NODE, Table, Offset); 1225 1226 /* Subtable: MSC */ 1227 Status = AcpiDmDumpTable (Table->Length, Offset, MpamMscNode, 1228 MpamMscNode->Length, AcpiDmTableInfoMpam0); 1229 if (ACPI_FAILURE (Status)) 1230 { 1231 return; 1232 } 1233 1234 /* Offset the start of the array of resources */ 1235 Offset += sizeof(ACPI_MPAM_MSC_NODE); 1236 1237 /* Subtable: MSC RIS(es) */ 1238 for (UINT32 ResourceIdx = 0; ResourceIdx < MpamMscNode->NumResourceNodes; ResourceIdx++) 1239 { 1240 AcpiOsPrintf ("\n"); 1241 MpamResourceNode = ACPI_ADD_PTR (ACPI_MPAM_RESOURCE_NODE, Table, Offset); 1242 1243 MpamResourceNodeLength = sizeof(ACPI_MPAM_RESOURCE_NODE) + 1244 MpamResourceNode->NumFunctionalDeps * sizeof(ACPI_MPAM_FUNC_DEPS); 1245 TempOffset = Offset; 1246 Offset += MpamResourceNodeLength; 1247 1248 /* Subtable: MSC RIS */ 1249 Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamResourceNode, 1250 sizeof(ACPI_MPAM_RESOURCE_NODE), AcpiDmTableInfoMpam1); 1251 if (ACPI_FAILURE (Status)) 1252 { 1253 return; 1254 } 1255 1256 switch (MpamResourceNode->LocatorType) 1257 { 1258 case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE: 1259 InfoTable = AcpiDmTableInfoMpam1A; 1260 break; 1261 case ACPI_MPAM_LOCATION_TYPE_MEMORY: 1262 InfoTable = AcpiDmTableInfoMpam1B; 1263 break; 1264 case ACPI_MPAM_LOCATION_TYPE_SMMU: 1265 InfoTable = AcpiDmTableInfoMpam1C; 1266 break; 1267 case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE: 1268 InfoTable = AcpiDmTableInfoMpam1D; 1269 break; 1270 case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE: 1271 InfoTable = AcpiDmTableInfoMpam1E; 1272 break; 1273 case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT: 1274 InfoTable = AcpiDmTableInfoMpam1F; 1275 break; 1276 case ACPI_MPAM_LOCATION_TYPE_UNKNOWN: 1277 InfoTable = AcpiDmTableInfoMpam1G; 1278 default: 1279 AcpiOsPrintf ("\n**** Unknown MPAM locator type 0x%X\n", 1280 MpamResourceNode->LocatorType); 1281 return; 1282 } 1283 1284 /* Subtable: MSC Resource Locator(s) */ 1285 TempOffset += ACPI_OFFSET(ACPI_MPAM_RESOURCE_NODE, Locator); 1286 Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->Locator, 1287 sizeof(ACPI_MPAM_RESOURCE_LOCATOR), InfoTable); 1288 if (ACPI_FAILURE (Status)) 1289 { 1290 return; 1291 } 1292 1293 /* Get the number of functional dependencies of an RIS */ 1294 TempOffset += sizeof(ACPI_MPAM_RESOURCE_LOCATOR); 1295 Status = AcpiDmDumpTable (Table->Length, TempOffset, &MpamResourceNode->NumFunctionalDeps, 1296 sizeof(UINT32), AcpiDmTableInfoMpam1Deps); 1297 if (ACPI_FAILURE (Status)) 1298 { 1299 return; 1300 } 1301 1302 TempOffset += sizeof(UINT32); 1303 MpamFunctionalDependency = ACPI_ADD_PTR (ACPI_MPAM_FUNC_DEPS, MpamResourceNode, 1304 sizeof(ACPI_MPAM_RESOURCE_NODE)); 1305 /* Subtable: MSC functional dependencies */ 1306 for (UINT32 funcDep = 0; funcDep < MpamResourceNode->NumFunctionalDeps; funcDep++) 1307 { 1308 AcpiOsPrintf ("\n"); 1309 Status = AcpiDmDumpTable (sizeof(ACPI_MPAM_FUNC_DEPS), 0, 1310 &MpamResourceNode->NumFunctionalDeps, 0, AcpiDmTableInfoMpam2); 1311 Status = AcpiDmDumpTable (Table->Length, TempOffset, MpamFunctionalDependency, 1312 sizeof(ACPI_MPAM_FUNC_DEPS), AcpiDmTableInfoMpam2); 1313 if (ACPI_FAILURE (Status)) 1314 { 1315 return; 1316 } 1317 TempOffset += sizeof(ACPI_MPAM_FUNC_DEPS); 1318 MpamFunctionalDependency++; 1319 } 1320 1321 AcpiOsPrintf ("\n\n"); 1322 } 1323 1324 } 1325 1326 return; 1327 } 1328 1329 /******************************************************************************* 1330 * 1331 * FUNCTION: AcpiDmDumpMpst 1332 * 1333 * PARAMETERS: Table - A MPST Table 1334 * 1335 * RETURN: None 1336 * 1337 * DESCRIPTION: Format the contents of a MPST table 1338 * 1339 ******************************************************************************/ 1340 1341 void 1342 AcpiDmDumpMpst ( 1343 ACPI_TABLE_HEADER *Table) 1344 { 1345 ACPI_STATUS Status; 1346 UINT32 Offset = sizeof (ACPI_TABLE_MPST); 1347 ACPI_MPST_POWER_NODE *Subtable0; 1348 ACPI_MPST_POWER_STATE *Subtable0A; 1349 ACPI_MPST_COMPONENT *Subtable0B; 1350 ACPI_MPST_DATA_HDR *Subtable1; 1351 ACPI_MPST_POWER_DATA *Subtable2; 1352 UINT16 SubtableCount; 1353 UINT32 PowerStateCount; 1354 UINT32 ComponentCount; 1355 1356 1357 /* Main table */ 1358 1359 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); 1360 if (ACPI_FAILURE (Status)) 1361 { 1362 return; 1363 } 1364 1365 /* Subtable: Memory Power Node(s) */ 1366 1367 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; 1368 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); 1369 1370 while ((Offset < Table->Length) && SubtableCount) 1371 { 1372 AcpiOsPrintf ("\n"); 1373 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0, 1374 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); 1375 if (ACPI_FAILURE (Status)) 1376 { 1377 return; 1378 } 1379 1380 /* Extract the sub-subtable counts */ 1381 1382 PowerStateCount = Subtable0->NumPowerStates; 1383 ComponentCount = Subtable0->NumPhysicalComponents; 1384 Offset += sizeof (ACPI_MPST_POWER_NODE); 1385 1386 /* Sub-subtables - Memory Power State Structure(s) */ 1387 1388 Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0, 1389 sizeof (ACPI_MPST_POWER_NODE)); 1390 1391 while (PowerStateCount) 1392 { 1393 AcpiOsPrintf ("\n"); 1394 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A, 1395 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); 1396 if (ACPI_FAILURE (Status)) 1397 { 1398 return; 1399 } 1400 1401 Subtable0A++; 1402 PowerStateCount--; 1403 Offset += sizeof (ACPI_MPST_POWER_STATE); 1404 } 1405 1406 /* Sub-subtables - Physical Component ID Structure(s) */ 1407 1408 Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A); 1409 1410 if (ComponentCount) 1411 { 1412 AcpiOsPrintf ("\n"); 1413 } 1414 1415 while (ComponentCount) 1416 { 1417 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B, 1418 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); 1419 if (ACPI_FAILURE (Status)) 1420 { 1421 return; 1422 } 1423 1424 Subtable0B++; 1425 ComponentCount--; 1426 Offset += sizeof (ACPI_MPST_COMPONENT); 1427 } 1428 1429 /* Point to next Memory Power Node subtable */ 1430 1431 SubtableCount--; 1432 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0, 1433 sizeof (ACPI_MPST_POWER_NODE) + 1434 (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) + 1435 (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents)); 1436 } 1437 1438 /* Subtable: Count of Memory Power State Characteristic structures */ 1439 1440 AcpiOsPrintf ("\n"); 1441 Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0); 1442 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1, 1443 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); 1444 if (ACPI_FAILURE (Status)) 1445 { 1446 return; 1447 } 1448 1449 SubtableCount = Subtable1->CharacteristicsCount; 1450 Offset += sizeof (ACPI_MPST_DATA_HDR); 1451 1452 /* Subtable: Memory Power State Characteristics structure(s) */ 1453 1454 Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1, 1455 sizeof (ACPI_MPST_DATA_HDR)); 1456 1457 while ((Offset < Table->Length) && SubtableCount) 1458 { 1459 AcpiOsPrintf ("\n"); 1460 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2, 1461 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); 1462 if (ACPI_FAILURE (Status)) 1463 { 1464 return; 1465 } 1466 1467 Subtable2++; 1468 SubtableCount--; 1469 Offset += sizeof (ACPI_MPST_POWER_DATA); 1470 } 1471 } 1472 1473 1474 /******************************************************************************* 1475 * 1476 * FUNCTION: AcpiDmDumpMrrm 1477 * 1478 * PARAMETERS: Table - A MRRM table 1479 * 1480 * RETURN: None 1481 * 1482 * DESCRIPTION: Format the contents of a MRRM 1483 * 1484 ******************************************************************************/ 1485 1486 void 1487 AcpiDmDumpMrrm ( 1488 ACPI_TABLE_HEADER *Table) 1489 { 1490 ACPI_STATUS Status; 1491 ACPI_MRRM_MEM_RANGE_ENTRY *Subtable; 1492 UINT16 Offset = sizeof (ACPI_TABLE_MRRM); 1493 1494 /* Main table */ 1495 1496 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMrrm); 1497 if (ACPI_FAILURE (Status)) 1498 { 1499 return; 1500 } 1501 1502 /* Subtables (all are same type) */ 1503 1504 Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Table, Offset); 1505 while (Offset < Table->Length) 1506 { 1507 AcpiOsPrintf ("\n"); 1508 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1509 Subtable->Header.Length, AcpiDmTableInfoMrrm0); 1510 if (ACPI_FAILURE (Status)) 1511 { 1512 return; 1513 } 1514 1515 Offset += Subtable->Header.Length; 1516 Subtable = ACPI_ADD_PTR (ACPI_MRRM_MEM_RANGE_ENTRY, Subtable, 1517 Subtable->Header.Length); 1518 } 1519 } 1520 1521 1522 /******************************************************************************* 1523 * 1524 * FUNCTION: AcpiDmDumpMsct 1525 * 1526 * PARAMETERS: Table - A MSCT table 1527 * 1528 * RETURN: None 1529 * 1530 * DESCRIPTION: Format the contents of a MSCT 1531 * 1532 ******************************************************************************/ 1533 1534 void 1535 AcpiDmDumpMsct ( 1536 ACPI_TABLE_HEADER *Table) 1537 { 1538 ACPI_STATUS Status; 1539 UINT32 Offset = sizeof (ACPI_TABLE_MSCT); 1540 ACPI_MSCT_PROXIMITY *Subtable; 1541 1542 1543 /* Main table */ 1544 1545 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); 1546 if (ACPI_FAILURE (Status)) 1547 { 1548 return; 1549 } 1550 1551 /* Subtables */ 1552 1553 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); 1554 while (Offset < Table->Length) 1555 { 1556 /* Common subtable header */ 1557 1558 AcpiOsPrintf ("\n"); 1559 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1560 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); 1561 if (ACPI_FAILURE (Status)) 1562 { 1563 return; 1564 } 1565 1566 /* Point to next subtable */ 1567 1568 Offset += sizeof (ACPI_MSCT_PROXIMITY); 1569 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable, 1570 sizeof (ACPI_MSCT_PROXIMITY)); 1571 } 1572 } 1573 1574 1575 /******************************************************************************* 1576 * 1577 * FUNCTION: AcpiDmDumpNfit 1578 * 1579 * PARAMETERS: Table - A NFIT table 1580 * 1581 * RETURN: None 1582 * 1583 * DESCRIPTION: Format the contents of an NFIT. 1584 * 1585 ******************************************************************************/ 1586 1587 void 1588 AcpiDmDumpNfit ( 1589 ACPI_TABLE_HEADER *Table) 1590 { 1591 ACPI_STATUS Status; 1592 UINT32 Offset = sizeof (ACPI_TABLE_NFIT); 1593 UINT32 FieldOffset = 0; 1594 UINT32 Length; 1595 ACPI_NFIT_HEADER *Subtable; 1596 ACPI_DMTABLE_INFO *InfoTable; 1597 ACPI_NFIT_INTERLEAVE *Interleave = NULL; 1598 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL; 1599 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; 1600 UINT32 i; 1601 1602 1603 /* Main table */ 1604 1605 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit); 1606 if (ACPI_FAILURE (Status)) 1607 { 1608 return; 1609 } 1610 1611 /* Subtables */ 1612 1613 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset); 1614 while (Offset < Table->Length) 1615 { 1616 /* NFIT subtable header */ 1617 1618 AcpiOsPrintf ("\n"); 1619 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1620 Subtable->Length, AcpiDmTableInfoNfitHdr); 1621 if (ACPI_FAILURE (Status)) 1622 { 1623 return; 1624 } 1625 1626 switch (Subtable->Type) 1627 { 1628 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 1629 1630 InfoTable = AcpiDmTableInfoNfit0; 1631 break; 1632 1633 case ACPI_NFIT_TYPE_MEMORY_MAP: 1634 1635 InfoTable = AcpiDmTableInfoNfit1; 1636 break; 1637 1638 case ACPI_NFIT_TYPE_INTERLEAVE: 1639 1640 /* Has a variable number of 32-bit values at the end */ 1641 1642 InfoTable = AcpiDmTableInfoNfit2; 1643 FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE); 1644 break; 1645 1646 case ACPI_NFIT_TYPE_SMBIOS: 1647 1648 SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable); 1649 InfoTable = AcpiDmTableInfoNfit3; 1650 break; 1651 1652 case ACPI_NFIT_TYPE_CONTROL_REGION: 1653 1654 InfoTable = AcpiDmTableInfoNfit4; 1655 break; 1656 1657 case ACPI_NFIT_TYPE_DATA_REGION: 1658 1659 InfoTable = AcpiDmTableInfoNfit5; 1660 break; 1661 1662 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 1663 1664 /* Has a variable number of 64-bit addresses at the end */ 1665 1666 InfoTable = AcpiDmTableInfoNfit6; 1667 FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS); 1668 break; 1669 1670 case ACPI_NFIT_TYPE_CAPABILITIES: /* ACPI 6.0A */ 1671 1672 InfoTable = AcpiDmTableInfoNfit7; 1673 break; 1674 1675 default: 1676 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", 1677 Subtable->Type); 1678 1679 /* Attempt to continue */ 1680 1681 if (!Subtable->Length) 1682 { 1683 AcpiOsPrintf ("Invalid zero length subtable\n"); 1684 return; 1685 } 1686 goto NextSubtable; 1687 } 1688 1689 AcpiOsPrintf ("\n"); 1690 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1691 Subtable->Length, InfoTable); 1692 if (ACPI_FAILURE (Status)) 1693 { 1694 return; 1695 } 1696 1697 /* Per-subtable variable-length fields */ 1698 1699 switch (Subtable->Type) 1700 { 1701 case ACPI_NFIT_TYPE_INTERLEAVE: 1702 1703 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable); 1704 for (i = 0; i < Interleave->LineCount; i++) 1705 { 1706 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 1707 &Interleave->LineOffset[i], 1708 sizeof (UINT32), AcpiDmTableInfoNfit2a); 1709 if (ACPI_FAILURE (Status)) 1710 { 1711 return; 1712 } 1713 1714 FieldOffset += sizeof (UINT32); 1715 } 1716 break; 1717 1718 case ACPI_NFIT_TYPE_SMBIOS: 1719 1720 Length = Subtable->Length - 1721 sizeof (ACPI_NFIT_SMBIOS); 1722 1723 if (Length) 1724 { 1725 Status = AcpiDmDumpTable (Table->Length, 1726 sizeof (ACPI_NFIT_SMBIOS), 1727 SmbiosInfo, 1728 Length, AcpiDmTableInfoNfit3a); 1729 if (ACPI_FAILURE (Status)) 1730 { 1731 return; 1732 } 1733 } 1734 1735 break; 1736 1737 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 1738 1739 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable); 1740 for (i = 0; i < Hint->HintCount; i++) 1741 { 1742 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 1743 &Hint->HintAddress[i], 1744 sizeof (UINT64), AcpiDmTableInfoNfit6a); 1745 if (ACPI_FAILURE (Status)) 1746 { 1747 return; 1748 } 1749 1750 FieldOffset += sizeof (UINT64); 1751 } 1752 break; 1753 1754 default: 1755 break; 1756 } 1757 1758 NextSubtable: 1759 /* Point to next subtable */ 1760 1761 Offset += Subtable->Length; 1762 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length); 1763 } 1764 } 1765 1766 1767 /******************************************************************************* 1768 * 1769 * FUNCTION: AcpiDmDumpPcct 1770 * 1771 * PARAMETERS: Table - A PCCT table 1772 * 1773 * RETURN: None 1774 * 1775 * DESCRIPTION: Format the contents of a PCCT. This table type consists 1776 * of an open-ended number of subtables. 1777 * 1778 ******************************************************************************/ 1779 1780 void 1781 AcpiDmDumpPcct ( 1782 ACPI_TABLE_HEADER *Table) 1783 { 1784 ACPI_STATUS Status; 1785 ACPI_PCCT_SUBSPACE *Subtable; 1786 ACPI_DMTABLE_INFO *InfoTable; 1787 UINT32 Length = Table->Length; 1788 UINT32 Offset = sizeof (ACPI_TABLE_PCCT); 1789 1790 1791 /* Main table */ 1792 1793 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); 1794 if (ACPI_FAILURE (Status)) 1795 { 1796 return; 1797 } 1798 1799 /* Subtables */ 1800 1801 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); 1802 while (Offset < Table->Length) 1803 { 1804 /* Common subtable header */ 1805 1806 AcpiOsPrintf ("\n"); 1807 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1808 Subtable->Header.Length, AcpiDmTableInfoPcctHdr); 1809 if (ACPI_FAILURE (Status)) 1810 { 1811 return; 1812 } 1813 1814 switch (Subtable->Header.Type) 1815 { 1816 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 1817 1818 InfoTable = AcpiDmTableInfoPcct0; 1819 break; 1820 1821 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 1822 1823 InfoTable = AcpiDmTableInfoPcct1; 1824 break; 1825 1826 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2: 1827 1828 InfoTable = AcpiDmTableInfoPcct2; 1829 break; 1830 1831 case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE: 1832 1833 InfoTable = AcpiDmTableInfoPcct3; 1834 break; 1835 1836 case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE: 1837 1838 InfoTable = AcpiDmTableInfoPcct4; 1839 break; 1840 1841 case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE: 1842 1843 InfoTable = AcpiDmTableInfoPcct5; 1844 break; 1845 1846 default: 1847 1848 AcpiOsPrintf ( 1849 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n", 1850 Subtable->Header.Type); 1851 return; 1852 } 1853 1854 AcpiOsPrintf ("\n"); 1855 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1856 Subtable->Header.Length, InfoTable); 1857 if (ACPI_FAILURE (Status)) 1858 { 1859 return; 1860 } 1861 1862 /* Point to next subtable */ 1863 1864 Offset += Subtable->Header.Length; 1865 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable, 1866 Subtable->Header.Length); 1867 } 1868 } 1869 1870 1871 /******************************************************************************* 1872 * 1873 * FUNCTION: AcpiDmDumpPdtt 1874 * 1875 * PARAMETERS: Table - A PDTT table 1876 * 1877 * RETURN: None 1878 * 1879 * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length 1880 * table that contains an open-ended number of IDs 1881 * at the end of the table. 1882 * 1883 ******************************************************************************/ 1884 1885 void 1886 AcpiDmDumpPdtt ( 1887 ACPI_TABLE_HEADER *Table) 1888 { 1889 ACPI_STATUS Status; 1890 ACPI_PDTT_CHANNEL *Subtable; 1891 UINT32 Length = Table->Length; 1892 UINT32 Offset = sizeof (ACPI_TABLE_PDTT); 1893 1894 1895 /* Main table */ 1896 1897 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt); 1898 if (ACPI_FAILURE (Status)) 1899 { 1900 return; 1901 } 1902 1903 /* Subtables. Currently there is only one type, but can be multiples */ 1904 1905 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset); 1906 while (Offset < Table->Length) 1907 { 1908 AcpiOsPrintf ("\n"); 1909 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1910 sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0); 1911 if (ACPI_FAILURE (Status)) 1912 { 1913 return; 1914 } 1915 1916 /* Point to next subtable */ 1917 1918 Offset += sizeof (ACPI_PDTT_CHANNEL); 1919 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable, 1920 sizeof (ACPI_PDTT_CHANNEL)); 1921 } 1922 } 1923 1924 1925 /******************************************************************************* 1926 * 1927 * FUNCTION: AcpiDmDumpPhat 1928 * 1929 * PARAMETERS: Table - A PHAT table 1930 * 1931 * RETURN: None 1932 * 1933 * DESCRIPTION: Format the contents of a PHAT. 1934 * 1935 ******************************************************************************/ 1936 1937 void 1938 AcpiDmDumpPhat ( 1939 ACPI_TABLE_HEADER *Table) 1940 { 1941 ACPI_STATUS Status; 1942 ACPI_DMTABLE_INFO *InfoTable; 1943 ACPI_PHAT_HEADER *Subtable; 1944 ACPI_PHAT_VERSION_DATA *VersionData; 1945 ACPI_PHAT_HEALTH_DATA *HealthData; 1946 UINT32 RecordCount; 1947 UINT32 Length = Table->Length; 1948 UINT32 Offset = sizeof (ACPI_TABLE_PHAT); 1949 UINT32 OriginalOffset; 1950 UINT32 SubtableLength; 1951 UINT32 PathLength; 1952 UINT32 VendorLength; 1953 UINT16 RecordType; 1954 1955 1956 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT)); 1957 1958 while (Offset < Table->Length) 1959 { 1960 /* Common subtable header */ 1961 1962 AcpiOsPrintf ("\n"); 1963 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1964 sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr); 1965 if (ACPI_FAILURE (Status)) 1966 { 1967 return; 1968 } 1969 1970 DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n", 1971 __LINE__, Subtable->Type); 1972 1973 switch (Subtable->Type) 1974 { 1975 case ACPI_PHAT_TYPE_FW_VERSION_DATA: 1976 1977 InfoTable = AcpiDmTableInfoPhat0; 1978 SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA); 1979 break; 1980 1981 case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 1982 1983 InfoTable = AcpiDmTableInfoPhat1; 1984 SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA); 1985 break; 1986 1987 default: 1988 1989 DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n", 1990 Subtable->Type); 1991 1992 return; 1993 } 1994 1995 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1996 SubtableLength, InfoTable); 1997 if (ACPI_FAILURE (Status)) 1998 { 1999 return; 2000 } 2001 2002 Offset += SubtableLength; 2003 2004 OriginalOffset = Offset; 2005 switch (Subtable->Type) 2006 { 2007 case ACPI_PHAT_TYPE_FW_VERSION_DATA: 2008 2009 VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable); 2010 RecordCount = VersionData->ElementCount; 2011 RecordType = *ACPI_CAST_PTR (UINT8, Subtable); 2012 2013 /* 2014 * Skip past a zero-valued block (not part of the ACPI PHAT specification). 2015 * First, check for a zero length record and a zero element count 2016 */ 2017 if (!VersionData->Header.Length && !VersionData->ElementCount) 2018 { 2019 while (RecordType == 0) 2020 { 2021 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); 2022 RecordType = *ACPI_CAST_PTR (UINT8, Subtable); 2023 RecordCount = VersionData->ElementCount; 2024 Offset += 1; 2025 } 2026 2027 Offset -= 1; 2028 AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n" 2029 "/* (not compliant to PHAT specification -- ignoring block) */\n", 2030 OriginalOffset - 12, Offset - OriginalOffset + 12); 2031 } 2032 2033 DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n", 2034 __LINE__, RecordCount, Offset, SubtableLength); 2035 2036 /* Emit each of the version elements */ 2037 2038 while (RecordCount && VersionData->Header.Length) 2039 { 2040 AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n", 2041 VersionData->ElementCount - RecordCount + 1, Offset); 2042 2043 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); 2044 Status = AcpiDmDumpTable (Length, Offset, Subtable, 2045 sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a); 2046 if (ACPI_FAILURE (Status)) 2047 { 2048 return; 2049 } 2050 2051 Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT); 2052 RecordCount--; 2053 } 2054 2055 break; 2056 2057 case ACPI_PHAT_TYPE_FW_HEALTH_DATA: 2058 2059 HealthData = ACPI_CAST_PTR (ACPI_PHAT_HEALTH_DATA, Subtable); 2060 PathLength = Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA); 2061 VendorLength = 0; 2062 2063 /* An offset of 0 should be ignored */ 2064 if (HealthData->DeviceSpecificOffset != 0) 2065 { 2066 if (HealthData->DeviceSpecificOffset > Subtable->Length) 2067 { 2068 AcpiOsPrintf ("\n/* Warning: Oversized device-specific data offset %X */\n" 2069 "/* (maximum is %X -- ignoring device-specific data) */\n", 2070 HealthData->DeviceSpecificOffset, Subtable->Length); 2071 } 2072 else if (HealthData->DeviceSpecificOffset < sizeof (ACPI_PHAT_HEALTH_DATA)) 2073 { 2074 AcpiOsPrintf ("\n/* Warning: Undersized device-specific data offset %X */\n" 2075 "/* (minimum is %X -- ignoring device-specific data) */\n", 2076 HealthData->DeviceSpecificOffset, (UINT8) sizeof (ACPI_PHAT_HEALTH_DATA)); 2077 } 2078 else 2079 { 2080 PathLength = HealthData->DeviceSpecificOffset - sizeof (ACPI_PHAT_HEALTH_DATA); 2081 VendorLength = Subtable->Length - HealthData->DeviceSpecificOffset; 2082 } 2083 } 2084 2085 DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X */\n", 2086 __LINE__, PathLength, Offset); 2087 2088 if (PathLength) 2089 { 2090 Status = AcpiDmDumpTable (Length, Offset, 2091 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), 2092 PathLength, AcpiDmTableInfoPhat1a); 2093 if (ACPI_FAILURE (Status)) 2094 { 2095 return; 2096 } 2097 2098 Offset += PathLength; 2099 } 2100 2101 DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, VendorLength %X, Offset %X */\n", 2102 __LINE__, VendorLength, Offset); 2103 2104 if (VendorLength) 2105 { 2106 Status = AcpiDmDumpTable (Length, Offset, 2107 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, HealthData->DeviceSpecificOffset), 2108 VendorLength, AcpiDmTableInfoPhat1b); 2109 if (ACPI_FAILURE (Status)) 2110 { 2111 return; 2112 } 2113 2114 Offset += VendorLength; 2115 } 2116 2117 break; 2118 2119 default: 2120 2121 AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n", 2122 Subtable->Type); 2123 return; 2124 } 2125 2126 /* Next subtable */ 2127 2128 DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, " 2129 "Subtable->Length %X, Table->Length %X */\n", 2130 __LINE__, Offset, Subtable->Length, Table->Length); 2131 2132 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, 2133 Offset); 2134 } 2135 } 2136 2137 2138 /******************************************************************************* 2139 * 2140 * FUNCTION: AcpiDmDumpPmtt 2141 * 2142 * PARAMETERS: Table - A PMTT table 2143 * 2144 * RETURN: None 2145 * 2146 * DESCRIPTION: Format the contents of a PMTT. This table type consists 2147 * of an open-ended number of subtables. 2148 * 2149 ******************************************************************************/ 2150 2151 void 2152 AcpiDmDumpPmtt ( 2153 ACPI_TABLE_HEADER *Table) 2154 { 2155 ACPI_STATUS Status; 2156 ACPI_PMTT_HEADER *Subtable; 2157 UINT32 Length = Table->Length; 2158 UINT32 Offset = sizeof (ACPI_TABLE_PMTT); 2159 2160 2161 /* Main table */ 2162 2163 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt); 2164 if (ACPI_FAILURE (Status)) 2165 { 2166 return; 2167 } 2168 2169 /* Subtables */ 2170 2171 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); 2172 while (Offset < Table->Length) 2173 { 2174 /* Each of the types below contain the common subtable header */ 2175 2176 AcpiOsPrintf ("\n"); 2177 switch (Subtable->Type) 2178 { 2179 case ACPI_PMTT_TYPE_SOCKET: 2180 2181 Status = AcpiDmDumpTable (Length, Offset, Subtable, 2182 Subtable->Length, AcpiDmTableInfoPmtt0); 2183 if (ACPI_FAILURE (Status)) 2184 { 2185 return; 2186 } 2187 break; 2188 2189 case ACPI_PMTT_TYPE_CONTROLLER: 2190 Status = AcpiDmDumpTable (Length, Offset, Subtable, 2191 Subtable->Length, AcpiDmTableInfoPmtt1); 2192 if (ACPI_FAILURE (Status)) 2193 { 2194 return; 2195 } 2196 break; 2197 2198 case ACPI_PMTT_TYPE_DIMM: 2199 Status = AcpiDmDumpTable (Length, Offset, Subtable, 2200 Subtable->Length, AcpiDmTableInfoPmtt2); 2201 if (ACPI_FAILURE (Status)) 2202 { 2203 return; 2204 } 2205 break; 2206 2207 case ACPI_PMTT_TYPE_VENDOR: 2208 Status = AcpiDmDumpTable (Length, Offset, Subtable, 2209 Subtable->Length, AcpiDmTableInfoPmttVendor); 2210 if (ACPI_FAILURE (Status)) 2211 { 2212 return; 2213 } 2214 break; 2215 2216 default: 2217 AcpiOsPrintf ( 2218 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 2219 Subtable->Type); 2220 return; 2221 } 2222 2223 /* Point to next subtable */ 2224 2225 Offset += Subtable->Length; 2226 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 2227 Subtable, Subtable->Length); 2228 } 2229 } 2230 2231 2232 /******************************************************************************* 2233 * 2234 * FUNCTION: AcpiDmDumpPptt 2235 * 2236 * PARAMETERS: Table - A PMTT table 2237 * 2238 * RETURN: None 2239 * 2240 * DESCRIPTION: Format the contents of a PPTT. This table type consists 2241 * of an open-ended number of subtables. 2242 * 2243 ******************************************************************************/ 2244 2245 void 2246 AcpiDmDumpPptt ( 2247 ACPI_TABLE_HEADER *Table) 2248 { 2249 ACPI_STATUS Status; 2250 ACPI_SUBTABLE_HEADER *Subtable; 2251 ACPI_PPTT_PROCESSOR *PpttProcessor; 2252 UINT8 Length; 2253 UINT8 SubtableOffset; 2254 UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 2255 ACPI_DMTABLE_INFO *InfoTable; 2256 UINT32 i; 2257 2258 2259 /* There is no main table (other than the standard ACPI header) */ 2260 2261 /* Subtables */ 2262 2263 Offset = sizeof (ACPI_TABLE_HEADER); 2264 while (Offset < Table->Length) 2265 { 2266 AcpiOsPrintf ("\n"); 2267 2268 /* Common subtable header */ 2269 2270 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 2271 if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER)) 2272 { 2273 AcpiOsPrintf ("Invalid subtable length\n"); 2274 return; 2275 } 2276 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 2277 Subtable->Length, AcpiDmTableInfoPpttHdr); 2278 if (ACPI_FAILURE (Status)) 2279 { 2280 return; 2281 } 2282 2283 switch (Subtable->Type) 2284 { 2285 case ACPI_PPTT_TYPE_PROCESSOR: 2286 2287 InfoTable = AcpiDmTableInfoPptt0; 2288 Length = sizeof (ACPI_PPTT_PROCESSOR); 2289 break; 2290 2291 case ACPI_PPTT_TYPE_CACHE: 2292 2293 InfoTable = AcpiDmTableInfoPptt1; 2294 Length = sizeof (ACPI_PPTT_CACHE); 2295 break; 2296 2297 case ACPI_PPTT_TYPE_ID: 2298 2299 InfoTable = AcpiDmTableInfoPptt2; 2300 Length = sizeof (ACPI_PPTT_ID); 2301 break; 2302 2303 default: 2304 2305 AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n", 2306 Subtable->Type); 2307 2308 /* Attempt to continue */ 2309 2310 goto NextSubtable; 2311 } 2312 2313 if (Subtable->Length < Length) 2314 { 2315 AcpiOsPrintf ("Invalid subtable length\n"); 2316 return; 2317 } 2318 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 2319 Subtable->Length, InfoTable); 2320 if (ACPI_FAILURE (Status)) 2321 { 2322 return; 2323 } 2324 SubtableOffset = Length; 2325 2326 switch (Subtable->Type) 2327 { 2328 case ACPI_PPTT_TYPE_PROCESSOR: 2329 2330 PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable); 2331 2332 /* Dump SMBIOS handles */ 2333 2334 if ((UINT8)(Subtable->Length - SubtableOffset) < 2335 (UINT8)(PpttProcessor->NumberOfPrivResources * 4)) 2336 { 2337 AcpiOsPrintf ("Invalid private resource number\n"); 2338 return; 2339 } 2340 for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++) 2341 { 2342 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2343 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset), 2344 4, AcpiDmTableInfoPptt0a); 2345 if (ACPI_FAILURE (Status)) 2346 { 2347 return; 2348 } 2349 2350 SubtableOffset += 4; 2351 } 2352 break; 2353 2354 case ACPI_PPTT_TYPE_CACHE: 2355 2356 if (Table->Revision < 3) 2357 { 2358 break; 2359 } 2360 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2361 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset), 2362 sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a); 2363 if (ACPI_FAILURE (Status)) 2364 { 2365 return; 2366 } 2367 break; 2368 2369 default: 2370 2371 break; 2372 } 2373 2374 NextSubtable: 2375 /* Point to next subtable */ 2376 2377 Offset += Subtable->Length; 2378 } 2379 } 2380 2381 2382 /******************************************************************************* 2383 * 2384 * FUNCTION: AcpiDmDumpPrmt 2385 * 2386 * PARAMETERS: Table - A PRMT table 2387 * 2388 * RETURN: None 2389 * 2390 * DESCRIPTION: Format the contents of a PRMT. This table type consists 2391 * of an open-ended number of subtables. 2392 * 2393 ******************************************************************************/ 2394 2395 void 2396 AcpiDmDumpPrmt ( 2397 ACPI_TABLE_HEADER *Table) 2398 { 2399 UINT32 CurrentOffset = sizeof (ACPI_TABLE_HEADER); 2400 ACPI_TABLE_PRMT_HEADER *PrmtHeader; 2401 ACPI_PRMT_MODULE_INFO *PrmtModuleInfo; 2402 ACPI_PRMT_HANDLER_INFO *PrmtHandlerInfo; 2403 ACPI_STATUS Status; 2404 UINT32 i, j; 2405 2406 2407 /* Main table header */ 2408 2409 PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset); 2410 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader, 2411 sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr); 2412 if (ACPI_FAILURE (Status)) 2413 { 2414 AcpiOsPrintf ("Invalid PRMT header\n"); 2415 return; 2416 } 2417 2418 CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER); 2419 2420 /* PRM Module Information Structure array */ 2421 2422 for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i) 2423 { 2424 PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset); 2425 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo, 2426 sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule); 2427 2428 CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO); 2429 2430 /* PRM handler information structure array */ 2431 2432 for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j) 2433 { 2434 PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset); 2435 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo, 2436 sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler); 2437 2438 CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO); 2439 } 2440 } 2441 } 2442 2443 2444 /******************************************************************************* 2445 * 2446 * FUNCTION: AcpiDmDumpRas2 2447 * 2448 * PARAMETERS: Table - A RAS2 table 2449 * 2450 * RETURN: None 2451 * 2452 * DESCRIPTION: Format the contents of a Ras2. This is a variable-length 2453 * table that contains an open-ended number of the RAS2 PCC 2454 * descriptors at the end of the table. 2455 * 2456 ******************************************************************************/ 2457 2458 void 2459 AcpiDmDumpRas2 ( 2460 ACPI_TABLE_HEADER *Table) 2461 { 2462 ACPI_STATUS Status; 2463 ACPI_RAS2_PCC_DESC *Subtable; 2464 UINT32 Length = Table->Length; 2465 UINT32 Offset = sizeof (ACPI_TABLE_RAS2); 2466 2467 2468 /* Main table */ 2469 2470 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRas2); 2471 if (ACPI_FAILURE (Status)) 2472 { 2473 return; 2474 } 2475 2476 /* Subtables - RAS2 PCC descriptor list */ 2477 2478 Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Table, Offset); 2479 while (Offset < Table->Length) 2480 { 2481 AcpiOsPrintf ("\n"); 2482 Status = AcpiDmDumpTable (Length, Offset, Subtable, 2483 sizeof (ACPI_RAS2_PCC_DESC), AcpiDmTableInfoRas2PccDesc); 2484 if (ACPI_FAILURE (Status)) 2485 { 2486 return; 2487 } 2488 2489 /* Point to next subtable */ 2490 2491 Offset += sizeof (ACPI_RAS2_PCC_DESC); 2492 Subtable = ACPI_ADD_PTR (ACPI_RAS2_PCC_DESC, Subtable, 2493 sizeof (ACPI_RAS2_PCC_DESC)); 2494 } 2495 } 2496 2497 2498 /******************************************************************************* 2499 * 2500 * FUNCTION: AcpiDmDumpRgrt 2501 * 2502 * PARAMETERS: Table - A RGRT table 2503 * 2504 * RETURN: None 2505 * 2506 * DESCRIPTION: Format the contents of a RGRT 2507 * 2508 ******************************************************************************/ 2509 2510 void 2511 AcpiDmDumpRgrt ( 2512 ACPI_TABLE_HEADER *Table) 2513 { 2514 ACPI_STATUS Status; 2515 ACPI_TABLE_RGRT *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table); 2516 UINT32 Offset = sizeof (ACPI_TABLE_RGRT); 2517 2518 2519 /* Main table */ 2520 2521 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt); 2522 if (ACPI_FAILURE (Status)) 2523 { 2524 return; 2525 } 2526 2527 /* Dump the binary image as a subtable */ 2528 2529 Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image, 2530 Table->Length - Offset, AcpiDmTableInfoRgrt0); 2531 if (ACPI_FAILURE (Status)) 2532 { 2533 return; 2534 } 2535 } 2536 2537 2538 /******************************************************************************* 2539 * 2540 * FUNCTION: AcpiDmDumpRhct 2541 * 2542 * PARAMETERS: Table - A RHCT table 2543 * 2544 * RETURN: None 2545 * 2546 * DESCRIPTION: Format the contents of a RHCT. 2547 * 2548 ******************************************************************************/ 2549 2550 void 2551 AcpiDmDumpRhct ( 2552 ACPI_TABLE_HEADER *Table) 2553 { 2554 ACPI_STATUS Status; 2555 ACPI_RHCT_NODE_HEADER *Subtable; 2556 ACPI_RHCT_HART_INFO *RhctHartInfo; 2557 ACPI_RHCT_ISA_STRING *RhctIsaString; 2558 ACPI_RHCT_CMO_NODE *RhctCmoNode; 2559 ACPI_RHCT_MMU_NODE *RhctMmuNode; 2560 UINT32 Length = Table->Length; 2561 UINT8 SubtableOffset, IsaPadOffset; 2562 UINT32 Offset = sizeof (ACPI_TABLE_RHCT); 2563 UINT32 i; 2564 2565 /* Main table */ 2566 2567 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRhct); 2568 if (ACPI_FAILURE (Status)) 2569 { 2570 return; 2571 } 2572 2573 /* Subtables */ 2574 2575 while (Offset < Table->Length) 2576 { 2577 AcpiOsPrintf ("\n"); 2578 2579 /* Common subtable header */ 2580 2581 Subtable = ACPI_ADD_PTR (ACPI_RHCT_NODE_HEADER, Table, Offset); 2582 if (Subtable->Length < sizeof (ACPI_RHCT_NODE_HEADER)) 2583 { 2584 AcpiOsPrintf ("Invalid subtable length\n"); 2585 return; 2586 } 2587 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 2588 Subtable->Length, AcpiDmTableInfoRhctNodeHdr); 2589 if (ACPI_FAILURE (Status)) 2590 { 2591 return; 2592 } 2593 2594 Length = sizeof (ACPI_RHCT_NODE_HEADER); 2595 2596 if (Subtable->Length < Length) 2597 { 2598 AcpiOsPrintf ("Invalid subtable length\n"); 2599 return; 2600 } 2601 SubtableOffset = (UINT8) Length; 2602 2603 switch (Subtable->Type) 2604 { 2605 case ACPI_RHCT_NODE_TYPE_HART_INFO: 2606 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2607 ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset), 2608 sizeof (ACPI_RHCT_HART_INFO), AcpiDmTableInfoRhctHartInfo1); 2609 2610 RhctHartInfo = ACPI_ADD_PTR (ACPI_RHCT_HART_INFO, Subtable, SubtableOffset); 2611 2612 if ((UINT16)(Subtable->Length - SubtableOffset) < 2613 (UINT16)(RhctHartInfo->NumOffsets * 4)) 2614 { 2615 AcpiOsPrintf ("Invalid number of offsets\n"); 2616 return; 2617 } 2618 SubtableOffset += sizeof (ACPI_RHCT_HART_INFO); 2619 for (i = 0; i < RhctHartInfo->NumOffsets; i++) 2620 { 2621 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2622 ACPI_ADD_PTR (UINT32, Subtable, SubtableOffset), 2623 4, AcpiDmTableInfoRhctHartInfo2); 2624 if (ACPI_FAILURE (Status)) 2625 { 2626 return; 2627 } 2628 2629 SubtableOffset += 4; 2630 } 2631 break; 2632 2633 case ACPI_RHCT_NODE_TYPE_ISA_STRING: 2634 RhctIsaString = ACPI_ADD_PTR (ACPI_RHCT_ISA_STRING, Subtable, SubtableOffset); 2635 IsaPadOffset = (UINT8) (SubtableOffset + 2 + RhctIsaString->IsaLength); 2636 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2637 RhctIsaString, RhctIsaString->IsaLength, AcpiDmTableInfoRhctIsa1); 2638 if (Subtable->Length > IsaPadOffset) 2639 { 2640 Status = AcpiDmDumpTable (Table->Length, Offset + IsaPadOffset, 2641 ACPI_ADD_PTR (UINT8, Subtable, IsaPadOffset), 2642 (Subtable->Length - IsaPadOffset), AcpiDmTableInfoRhctIsaPad); 2643 } 2644 2645 break; 2646 2647 case ACPI_RHCT_NODE_TYPE_CMO: 2648 RhctCmoNode = ACPI_ADD_PTR (ACPI_RHCT_CMO_NODE, Subtable, SubtableOffset); 2649 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2650 RhctCmoNode, 4, AcpiDmTableInfoRhctCmo1); 2651 break; 2652 2653 case ACPI_RHCT_NODE_TYPE_MMU: 2654 RhctMmuNode = ACPI_ADD_PTR (ACPI_RHCT_MMU_NODE, Subtable, SubtableOffset); 2655 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2656 RhctMmuNode, 2, AcpiDmTableInfoRhctMmu1); 2657 break; 2658 2659 default: 2660 break; 2661 } 2662 2663 /* Point to next subtable */ 2664 2665 Offset += Subtable->Length; 2666 } 2667 } 2668 2669 /******************************************************************************* 2670 * 2671 * FUNCTION: AcpiDmDumpRimt 2672 * 2673 * PARAMETERS: Table - A RIMT table 2674 * 2675 * RETURN: None 2676 * 2677 * DESCRIPTION: Format the contents of a RIMT. 2678 * 2679 ******************************************************************************/ 2680 2681 void 2682 AcpiDmDumpRimt ( 2683 ACPI_TABLE_HEADER *Table) 2684 { 2685 ACPI_RIMT_PLATFORM_DEVICE *PlatNode; 2686 ACPI_RIMT_PCIE_RC *PcieNode; 2687 ACPI_RIMT_NODE *Subtable; 2688 ACPI_STATUS Status; 2689 UINT32 Length = Table->Length; 2690 UINT16 SubtableOffset; 2691 UINT32 NodeOffset; 2692 UINT16 i; 2693 UINT32 Offset = sizeof (ACPI_TABLE_RIMT); 2694 2695 /* Main table */ 2696 2697 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRimt); 2698 if (ACPI_FAILURE (Status)) 2699 { 2700 return; 2701 } 2702 2703 /* Subtables */ 2704 2705 while (Offset < Table->Length) 2706 { 2707 AcpiOsPrintf ("\n"); 2708 2709 /* Common subtable header */ 2710 2711 Subtable = ACPI_ADD_PTR (ACPI_RIMT_NODE, Table, Offset); 2712 if (Subtable->Length < sizeof (ACPI_RIMT_NODE)) 2713 { 2714 AcpiOsPrintf ("Invalid subtable length\n"); 2715 return; 2716 } 2717 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 2718 Subtable->Length, AcpiDmTableInfoRimtNodeHdr); 2719 if (ACPI_FAILURE (Status)) 2720 { 2721 return; 2722 } 2723 2724 Length = sizeof (ACPI_RIMT_NODE); 2725 2726 if (Subtable->Length < Length) 2727 { 2728 AcpiOsPrintf ("Invalid subtable length\n"); 2729 return; 2730 } 2731 SubtableOffset = (UINT16) Length; 2732 2733 switch (Subtable->Type) 2734 { 2735 case ACPI_RIMT_NODE_TYPE_IOMMU: 2736 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2737 ACPI_ADD_PTR (ACPI_RIMT_IOMMU, Subtable, SubtableOffset), 2738 sizeof (ACPI_RIMT_IOMMU), AcpiDmTableInfoRimtIommu); 2739 2740 break; 2741 2742 case ACPI_RIMT_NODE_TYPE_PCIE_ROOT_COMPLEX: 2743 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2744 ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset), 2745 sizeof (ACPI_RIMT_PCIE_RC), AcpiDmTableInfoRimtPcieRc); 2746 2747 PcieNode = ACPI_ADD_PTR (ACPI_RIMT_PCIE_RC, Subtable, SubtableOffset); 2748 2749 /* Dump the ID mappings */ 2750 NodeOffset = PcieNode->IdMappingOffset; 2751 for (i = 0; i < PcieNode->NumIdMappings; i++) 2752 { 2753 AcpiOsPrintf ("\n"); 2754 Length = sizeof (ACPI_RIMT_ID_MAPPING); 2755 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 2756 ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset), 2757 Length, AcpiDmTableInfoRimtIdMapping); 2758 if (ACPI_FAILURE (Status)) 2759 { 2760 return; 2761 } 2762 2763 NodeOffset += Length; 2764 } 2765 break; 2766 2767 case ACPI_RIMT_NODE_TYPE_PLAT_DEVICE: 2768 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2769 ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset), 2770 sizeof (ACPI_RIMT_PLATFORM_DEVICE), AcpiDmTableInfoRimtPlatDev); 2771 PlatNode = ACPI_ADD_PTR (ACPI_RIMT_PLATFORM_DEVICE, Subtable, SubtableOffset); 2772 2773 /* Dump the ID mappings */ 2774 NodeOffset = PlatNode->IdMappingOffset; 2775 for (i = 0; i < PlatNode->NumIdMappings; i++) 2776 { 2777 AcpiOsPrintf ("\n"); 2778 Length = sizeof (ACPI_RIMT_ID_MAPPING); 2779 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 2780 ACPI_ADD_PTR (ACPI_RIMT_ID_MAPPING, Subtable, NodeOffset), 2781 Length, AcpiDmTableInfoRimtIdMapping); 2782 if (ACPI_FAILURE (Status)) 2783 { 2784 return; 2785 } 2786 2787 NodeOffset += Length; 2788 } 2789 break; 2790 2791 default: 2792 break; 2793 } 2794 2795 /* Point to next subtable */ 2796 2797 Offset += Subtable->Length; 2798 } 2799 } 2800 2801 2802 /******************************************************************************* 2803 * 2804 * FUNCTION: AcpiDmDumpS3pt 2805 * 2806 * PARAMETERS: Table - A S3PT table 2807 * 2808 * RETURN: Length of the table 2809 * 2810 * DESCRIPTION: Format the contents of a S3PT 2811 * 2812 ******************************************************************************/ 2813 2814 UINT32 2815 AcpiDmDumpS3pt ( 2816 ACPI_TABLE_HEADER *Tables) 2817 { 2818 ACPI_STATUS Status; 2819 UINT32 Offset = sizeof (ACPI_TABLE_S3PT); 2820 ACPI_FPDT_HEADER *Subtable; 2821 ACPI_DMTABLE_INFO *InfoTable; 2822 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); 2823 2824 2825 /* Main table */ 2826 2827 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt); 2828 if (ACPI_FAILURE (Status)) 2829 { 2830 return 0; 2831 } 2832 2833 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset); 2834 while (Offset < S3ptTable->Length) 2835 { 2836 /* Common subtable header */ 2837 2838 AcpiOsPrintf ("\n"); 2839 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, 2840 Subtable->Length, AcpiDmTableInfoS3ptHdr); 2841 if (ACPI_FAILURE (Status)) 2842 { 2843 return 0; 2844 } 2845 2846 switch (Subtable->Type) 2847 { 2848 case ACPI_S3PT_TYPE_RESUME: 2849 2850 InfoTable = AcpiDmTableInfoS3pt0; 2851 break; 2852 2853 case ACPI_S3PT_TYPE_SUSPEND: 2854 2855 InfoTable = AcpiDmTableInfoS3pt1; 2856 break; 2857 2858 default: 2859 2860 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", 2861 Subtable->Type); 2862 2863 /* Attempt to continue */ 2864 2865 if (!Subtable->Length) 2866 { 2867 AcpiOsPrintf ("Invalid zero length subtable\n"); 2868 return 0; 2869 } 2870 goto NextSubtable; 2871 } 2872 2873 AcpiOsPrintf ("\n"); 2874 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, 2875 Subtable->Length, InfoTable); 2876 if (ACPI_FAILURE (Status)) 2877 { 2878 return 0; 2879 } 2880 2881 NextSubtable: 2882 /* Point to next subtable */ 2883 2884 Offset += Subtable->Length; 2885 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length); 2886 } 2887 2888 return (S3ptTable->Length); 2889 } 2890 2891 2892 /******************************************************************************* 2893 * 2894 * FUNCTION: AcpiDmDumpSdev 2895 * 2896 * PARAMETERS: Table - A SDEV table 2897 * 2898 * RETURN: None 2899 * 2900 * DESCRIPTION: Format the contents of a SDEV. This is a variable-length 2901 * table that contains variable strings and vendor data. 2902 * 2903 ******************************************************************************/ 2904 2905 void 2906 AcpiDmDumpSdev ( 2907 ACPI_TABLE_HEADER *Table) 2908 { 2909 ACPI_STATUS Status; 2910 ACPI_SDEV_HEADER *Subtable; 2911 ACPI_SDEV_PCIE *Pcie; 2912 ACPI_SDEV_NAMESPACE *Namesp; 2913 ACPI_DMTABLE_INFO *InfoTable; 2914 ACPI_DMTABLE_INFO *SecureComponentInfoTable; 2915 UINT32 Length = Table->Length; 2916 UINT32 Offset = sizeof (ACPI_TABLE_SDEV); 2917 UINT16 PathOffset; 2918 UINT16 PathLength; 2919 UINT16 VendorDataOffset; 2920 UINT16 VendorDataLength; 2921 ACPI_SDEV_SECURE_COMPONENT *SecureComponent = NULL; 2922 UINT32 CurrentOffset = 0; 2923 2924 2925 /* Main table */ 2926 2927 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev); 2928 if (ACPI_FAILURE (Status)) 2929 { 2930 return; 2931 } 2932 2933 /* Subtables */ 2934 2935 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset); 2936 while (Offset < Table->Length) 2937 { 2938 /* Common subtable header */ 2939 2940 AcpiOsPrintf ("\n"); 2941 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 2942 Subtable->Length, AcpiDmTableInfoSdevHdr); 2943 if (ACPI_FAILURE (Status)) 2944 { 2945 return; 2946 } 2947 2948 switch (Subtable->Type) 2949 { 2950 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 2951 2952 InfoTable = AcpiDmTableInfoSdev0; 2953 break; 2954 2955 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 2956 2957 InfoTable = AcpiDmTableInfoSdev1; 2958 break; 2959 2960 default: 2961 goto NextSubtable; 2962 } 2963 2964 AcpiOsPrintf ("\n"); 2965 Status = AcpiDmDumpTable (Table->Length, 0, Subtable, 2966 Subtable->Length, InfoTable); 2967 if (ACPI_FAILURE (Status)) 2968 { 2969 return; 2970 } 2971 2972 switch (Subtable->Type) 2973 { 2974 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 2975 2976 CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE); 2977 if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT) 2978 { 2979 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT, 2980 ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE))); 2981 2982 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, 2983 ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)), 2984 sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b); 2985 if (ACPI_FAILURE (Status)) 2986 { 2987 return; 2988 } 2989 CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT); 2990 2991 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, 2992 ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset), 2993 sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr); 2994 if (ACPI_FAILURE (Status)) 2995 { 2996 return; 2997 } 2998 CurrentOffset += sizeof (ACPI_SDEV_HEADER); 2999 3000 switch (Subtable->Type) 3001 { 3002 case ACPI_SDEV_TYPE_ID_COMPONENT: 3003 3004 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId; 3005 break; 3006 3007 case ACPI_SDEV_TYPE_MEM_COMPONENT: 3008 3009 SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem; 3010 break; 3011 3012 default: 3013 goto NextSubtable; 3014 } 3015 3016 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, 3017 ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset), 3018 SecureComponent->SecureComponentLength, SecureComponentInfoTable); 3019 CurrentOffset += SecureComponent->SecureComponentLength; 3020 } 3021 3022 /* Dump the PCIe device ID(s) */ 3023 3024 Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable); 3025 PathOffset = Namesp->DeviceIdOffset; 3026 PathLength = Namesp->DeviceIdLength; 3027 3028 if (PathLength) 3029 { 3030 Status = AcpiDmDumpTable (Table->Length, CurrentOffset, 3031 ACPI_ADD_PTR (UINT8, Namesp, PathOffset), 3032 PathLength, AcpiDmTableInfoSdev0a); 3033 if (ACPI_FAILURE (Status)) 3034 { 3035 return; 3036 } 3037 CurrentOffset += PathLength; 3038 } 3039 3040 /* Dump the vendor-specific data */ 3041 3042 VendorDataLength = 3043 Namesp->VendorDataLength; 3044 VendorDataOffset = 3045 Namesp->DeviceIdOffset + Namesp->DeviceIdLength; 3046 3047 if (VendorDataLength) 3048 { 3049 Status = AcpiDmDumpTable (Table->Length, 0, 3050 ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset), 3051 VendorDataLength, AcpiDmTableInfoSdev1b); 3052 if (ACPI_FAILURE (Status)) 3053 { 3054 return; 3055 } 3056 } 3057 break; 3058 3059 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 3060 3061 /* PCI path substructures */ 3062 3063 Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable); 3064 PathOffset = Pcie->PathOffset; 3065 PathLength = Pcie->PathLength; 3066 3067 while (PathLength) 3068 { 3069 Status = AcpiDmDumpTable (Table->Length, 3070 PathOffset + Offset, 3071 ACPI_ADD_PTR (UINT8, Pcie, PathOffset), 3072 sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a); 3073 if (ACPI_FAILURE (Status)) 3074 { 3075 return; 3076 } 3077 3078 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH); 3079 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH); 3080 } 3081 3082 /* VendorData */ 3083 3084 VendorDataLength = Pcie->VendorDataLength; 3085 VendorDataOffset = Pcie->PathOffset + Pcie->PathLength; 3086 3087 if (VendorDataLength) 3088 { 3089 Status = AcpiDmDumpTable (Table->Length, 0, 3090 ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset), 3091 VendorDataLength, AcpiDmTableInfoSdev1b); 3092 if (ACPI_FAILURE (Status)) 3093 { 3094 return; 3095 } 3096 } 3097 break; 3098 3099 default: 3100 goto NextSubtable; 3101 } 3102 3103 NextSubtable: 3104 /* Point to next subtable */ 3105 3106 Offset += Subtable->Length; 3107 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable, 3108 Subtable->Length); 3109 } 3110 } 3111