1 /****************************************************************************** 2 * 3 * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2018, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include "acpi.h" 45 #include "accommon.h" 46 #include "acdisasm.h" 47 #include "actables.h" 48 49 /* This module used for application-level code only */ 50 51 #define _COMPONENT ACPI_CA_DISASSEMBLER 52 ACPI_MODULE_NAME ("dmtbdump2") 53 54 55 /******************************************************************************* 56 * 57 * FUNCTION: AcpiDmDumpIort 58 * 59 * PARAMETERS: Table - A IORT table 60 * 61 * RETURN: None 62 * 63 * DESCRIPTION: Format the contents of a IORT 64 * 65 ******************************************************************************/ 66 67 void 68 AcpiDmDumpIort ( 69 ACPI_TABLE_HEADER *Table) 70 { 71 ACPI_STATUS Status; 72 ACPI_TABLE_IORT *Iort; 73 ACPI_IORT_NODE *IortNode; 74 ACPI_IORT_ITS_GROUP *IortItsGroup = NULL; 75 ACPI_IORT_SMMU *IortSmmu = NULL; 76 UINT32 Offset; 77 UINT32 NodeOffset; 78 UINT32 Length; 79 ACPI_DMTABLE_INFO *InfoTable; 80 char *String; 81 UINT32 i; 82 83 84 /* Main table */ 85 86 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort); 87 if (ACPI_FAILURE (Status)) 88 { 89 return; 90 } 91 92 Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table); 93 Offset = sizeof (ACPI_TABLE_IORT); 94 95 /* Dump the OptionalPadding (optional) */ 96 97 if (Iort->NodeOffset > Offset) 98 { 99 Status = AcpiDmDumpTable (Table->Length, Offset, Table, 100 Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad); 101 if (ACPI_FAILURE (Status)) 102 { 103 return; 104 } 105 } 106 107 Offset = Iort->NodeOffset; 108 while (Offset < Table->Length) 109 { 110 /* Common subtable header */ 111 112 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset); 113 AcpiOsPrintf ("\n"); 114 Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData); 115 Status = AcpiDmDumpTable (Table->Length, Offset, 116 IortNode, Length, AcpiDmTableInfoIortHdr); 117 if (ACPI_FAILURE (Status)) 118 { 119 return; 120 } 121 122 NodeOffset = Length; 123 124 switch (IortNode->Type) 125 { 126 case ACPI_IORT_NODE_ITS_GROUP: 127 128 InfoTable = AcpiDmTableInfoIort0; 129 Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers); 130 IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset); 131 break; 132 133 case ACPI_IORT_NODE_NAMED_COMPONENT: 134 135 InfoTable = AcpiDmTableInfoIort1; 136 Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName); 137 String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length); 138 Length += strlen (String) + 1; 139 break; 140 141 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: 142 143 InfoTable = AcpiDmTableInfoIort2; 144 Length = IortNode->Length - NodeOffset; 145 break; 146 147 case ACPI_IORT_NODE_SMMU: 148 149 InfoTable = AcpiDmTableInfoIort3; 150 Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts); 151 IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset); 152 break; 153 154 case ACPI_IORT_NODE_SMMU_V3: 155 156 InfoTable = AcpiDmTableInfoIort4; 157 Length = IortNode->Length - NodeOffset; 158 break; 159 160 default: 161 162 AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n", 163 IortNode->Type); 164 165 /* Attempt to continue */ 166 167 if (!IortNode->Length) 168 { 169 AcpiOsPrintf ("Invalid zero length IORT node\n"); 170 return; 171 } 172 goto NextSubtable; 173 } 174 175 /* Dump the node subtable header */ 176 177 AcpiOsPrintf ("\n"); 178 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 179 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 180 Length, InfoTable); 181 if (ACPI_FAILURE (Status)) 182 { 183 return; 184 } 185 186 NodeOffset += Length; 187 188 /* Dump the node specific data */ 189 190 switch (IortNode->Type) 191 { 192 case ACPI_IORT_NODE_ITS_GROUP: 193 194 /* Validate IortItsGroup to avoid compiler warnings */ 195 196 if (IortItsGroup) 197 { 198 for (i = 0; i < IortItsGroup->ItsCount; i++) 199 { 200 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 201 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 202 4, AcpiDmTableInfoIort0a); 203 NodeOffset += 4; 204 } 205 } 206 break; 207 208 case ACPI_IORT_NODE_NAMED_COMPONENT: 209 210 /* Dump the Padding (optional) */ 211 212 if (IortNode->Length > NodeOffset) 213 { 214 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 215 Table, IortNode->Length - NodeOffset, 216 AcpiDmTableInfoIort1a); 217 if (ACPI_FAILURE (Status)) 218 { 219 return; 220 } 221 } 222 break; 223 224 case ACPI_IORT_NODE_SMMU: 225 226 AcpiOsPrintf ("\n"); 227 228 /* Validate IortSmmu to avoid compiler warnings */ 229 230 if (IortSmmu) 231 { 232 Length = 2 * sizeof (UINT64); 233 NodeOffset = IortSmmu->GlobalInterruptOffset; 234 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 235 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 236 Length, AcpiDmTableInfoIort3a); 237 if (ACPI_FAILURE (Status)) 238 { 239 return; 240 } 241 242 NodeOffset = IortSmmu->ContextInterruptOffset; 243 for (i = 0; i < IortSmmu->ContextInterruptCount; i++) 244 { 245 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 246 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 247 8, AcpiDmTableInfoIort3b); 248 if (ACPI_FAILURE (Status)) 249 { 250 return; 251 } 252 253 NodeOffset += 8; 254 } 255 256 NodeOffset = IortSmmu->PmuInterruptOffset; 257 for (i = 0; i < IortSmmu->PmuInterruptCount; i++) 258 { 259 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 260 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 261 8, AcpiDmTableInfoIort3c); 262 if (ACPI_FAILURE (Status)) 263 { 264 return; 265 } 266 267 NodeOffset += 8; 268 } 269 } 270 break; 271 272 default: 273 274 break; 275 } 276 277 /* Dump the ID mappings */ 278 279 NodeOffset = IortNode->MappingOffset; 280 for (i = 0; i < IortNode->MappingCount; i++) 281 { 282 AcpiOsPrintf ("\n"); 283 Length = sizeof (ACPI_IORT_ID_MAPPING); 284 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 285 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 286 Length, AcpiDmTableInfoIortMap); 287 if (ACPI_FAILURE (Status)) 288 { 289 return; 290 } 291 292 NodeOffset += Length; 293 } 294 295 NextSubtable: 296 /* Point to next node subtable */ 297 298 Offset += IortNode->Length; 299 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length); 300 } 301 } 302 303 304 /******************************************************************************* 305 * 306 * FUNCTION: AcpiDmDumpIvrs 307 * 308 * PARAMETERS: Table - A IVRS table 309 * 310 * RETURN: None 311 * 312 * DESCRIPTION: Format the contents of a IVRS 313 * 314 ******************************************************************************/ 315 316 static UINT8 EntrySizes[] = {4,8,16,32}; 317 318 void 319 AcpiDmDumpIvrs ( 320 ACPI_TABLE_HEADER *Table) 321 { 322 ACPI_STATUS Status; 323 UINT32 Offset = sizeof (ACPI_TABLE_IVRS); 324 UINT32 EntryOffset; 325 UINT32 EntryLength; 326 UINT32 EntryType; 327 ACPI_IVRS_DE_HEADER *DeviceEntry; 328 ACPI_IVRS_HEADER *Subtable; 329 ACPI_DMTABLE_INFO *InfoTable; 330 331 332 /* Main table */ 333 334 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); 335 if (ACPI_FAILURE (Status)) 336 { 337 return; 338 } 339 340 /* Subtables */ 341 342 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); 343 while (Offset < Table->Length) 344 { 345 /* Common subtable header */ 346 347 AcpiOsPrintf ("\n"); 348 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 349 Subtable->Length, AcpiDmTableInfoIvrsHdr); 350 if (ACPI_FAILURE (Status)) 351 { 352 return; 353 } 354 355 switch (Subtable->Type) 356 { 357 case ACPI_IVRS_TYPE_HARDWARE: 358 359 InfoTable = AcpiDmTableInfoIvrs0; 360 break; 361 362 case ACPI_IVRS_TYPE_MEMORY1: 363 case ACPI_IVRS_TYPE_MEMORY2: 364 case ACPI_IVRS_TYPE_MEMORY3: 365 366 InfoTable = AcpiDmTableInfoIvrs1; 367 break; 368 369 default: 370 371 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n", 372 Subtable->Type); 373 374 /* Attempt to continue */ 375 376 if (!Subtable->Length) 377 { 378 AcpiOsPrintf ("Invalid zero length subtable\n"); 379 return; 380 } 381 goto NextSubtable; 382 } 383 384 /* Dump the subtable */ 385 386 AcpiOsPrintf ("\n"); 387 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 388 Subtable->Length, InfoTable); 389 if (ACPI_FAILURE (Status)) 390 { 391 return; 392 } 393 394 /* The hardware subtable can contain multiple device entries */ 395 396 if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE) 397 { 398 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); 399 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, 400 sizeof (ACPI_IVRS_HARDWARE)); 401 402 while (EntryOffset < (Offset + Subtable->Length)) 403 { 404 AcpiOsPrintf ("\n"); 405 /* 406 * Upper 2 bits of Type encode the length of the device entry 407 * 408 * 00 = 4 byte 409 * 01 = 8 byte 410 * 10 = 16 byte - currently no entries defined 411 * 11 = 32 byte - currently no entries defined 412 */ 413 EntryType = DeviceEntry->Type; 414 EntryLength = EntrySizes [EntryType >> 6]; 415 416 switch (EntryType) 417 { 418 /* 4-byte device entries */ 419 420 case ACPI_IVRS_TYPE_PAD4: 421 case ACPI_IVRS_TYPE_ALL: 422 case ACPI_IVRS_TYPE_SELECT: 423 case ACPI_IVRS_TYPE_START: 424 case ACPI_IVRS_TYPE_END: 425 426 InfoTable = AcpiDmTableInfoIvrs4; 427 break; 428 429 /* 8-byte entries, type A */ 430 431 case ACPI_IVRS_TYPE_ALIAS_SELECT: 432 case ACPI_IVRS_TYPE_ALIAS_START: 433 434 InfoTable = AcpiDmTableInfoIvrs8a; 435 break; 436 437 /* 8-byte entries, type B */ 438 439 case ACPI_IVRS_TYPE_PAD8: 440 case ACPI_IVRS_TYPE_EXT_SELECT: 441 case ACPI_IVRS_TYPE_EXT_START: 442 443 InfoTable = AcpiDmTableInfoIvrs8b; 444 break; 445 446 /* 8-byte entries, type C */ 447 448 case ACPI_IVRS_TYPE_SPECIAL: 449 450 InfoTable = AcpiDmTableInfoIvrs8c; 451 break; 452 453 default: 454 InfoTable = AcpiDmTableInfoIvrs4; 455 AcpiOsPrintf ( 456 "\n**** Unknown IVRS device entry type/length: " 457 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n", 458 EntryType, EntryLength, EntryOffset); 459 break; 460 } 461 462 /* Dump the Device Entry */ 463 464 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 465 DeviceEntry, EntryLength, InfoTable); 466 if (ACPI_FAILURE (Status)) 467 { 468 return; 469 } 470 471 EntryOffset += EntryLength; 472 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry, 473 EntryLength); 474 } 475 } 476 477 NextSubtable: 478 /* Point to next subtable */ 479 480 Offset += Subtable->Length; 481 Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length); 482 } 483 } 484 485 486 /******************************************************************************* 487 * 488 * FUNCTION: AcpiDmDumpLpit 489 * 490 * PARAMETERS: Table - A LPIT table 491 * 492 * RETURN: None 493 * 494 * DESCRIPTION: Format the contents of a LPIT. This table type consists 495 * of an open-ended number of subtables. Note: There are no 496 * entries in the main table. An LPIT consists of the table 497 * header and then subtables only. 498 * 499 ******************************************************************************/ 500 501 void 502 AcpiDmDumpLpit ( 503 ACPI_TABLE_HEADER *Table) 504 { 505 ACPI_STATUS Status; 506 ACPI_LPIT_HEADER *Subtable; 507 UINT32 Length = Table->Length; 508 UINT32 Offset = sizeof (ACPI_TABLE_LPIT); 509 ACPI_DMTABLE_INFO *InfoTable; 510 UINT32 SubtableLength; 511 512 513 /* Subtables */ 514 515 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); 516 while (Offset < Table->Length) 517 { 518 /* Common subtable header */ 519 520 Status = AcpiDmDumpTable (Length, Offset, Subtable, 521 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr); 522 if (ACPI_FAILURE (Status)) 523 { 524 return; 525 } 526 527 switch (Subtable->Type) 528 { 529 case ACPI_LPIT_TYPE_NATIVE_CSTATE: 530 531 InfoTable = AcpiDmTableInfoLpit0; 532 SubtableLength = sizeof (ACPI_LPIT_NATIVE); 533 break; 534 535 default: 536 537 /* Cannot continue on unknown type - no length */ 538 539 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", 540 Subtable->Type); 541 return; 542 } 543 544 Status = AcpiDmDumpTable (Length, Offset, Subtable, 545 SubtableLength, InfoTable); 546 if (ACPI_FAILURE (Status)) 547 { 548 return; 549 } 550 551 AcpiOsPrintf ("\n"); 552 553 /* Point to next subtable */ 554 555 Offset += SubtableLength; 556 Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength); 557 } 558 } 559 560 561 /******************************************************************************* 562 * 563 * FUNCTION: AcpiDmDumpMadt 564 * 565 * PARAMETERS: Table - A MADT table 566 * 567 * RETURN: None 568 * 569 * DESCRIPTION: Format the contents of a MADT. This table type consists 570 * of an open-ended number of subtables. 571 * 572 ******************************************************************************/ 573 574 void 575 AcpiDmDumpMadt ( 576 ACPI_TABLE_HEADER *Table) 577 { 578 ACPI_STATUS Status; 579 ACPI_SUBTABLE_HEADER *Subtable; 580 UINT32 Length = Table->Length; 581 UINT32 Offset = sizeof (ACPI_TABLE_MADT); 582 ACPI_DMTABLE_INFO *InfoTable; 583 584 585 /* Main table */ 586 587 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt); 588 if (ACPI_FAILURE (Status)) 589 { 590 return; 591 } 592 593 /* Subtables */ 594 595 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 596 while (Offset < Table->Length) 597 { 598 /* Common subtable header */ 599 600 AcpiOsPrintf ("\n"); 601 Status = AcpiDmDumpTable (Length, Offset, Subtable, 602 Subtable->Length, AcpiDmTableInfoMadtHdr); 603 if (ACPI_FAILURE (Status)) 604 { 605 return; 606 } 607 608 switch (Subtable->Type) 609 { 610 case ACPI_MADT_TYPE_LOCAL_APIC: 611 612 InfoTable = AcpiDmTableInfoMadt0; 613 break; 614 615 case ACPI_MADT_TYPE_IO_APIC: 616 617 InfoTable = AcpiDmTableInfoMadt1; 618 break; 619 620 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 621 622 InfoTable = AcpiDmTableInfoMadt2; 623 break; 624 625 case ACPI_MADT_TYPE_NMI_SOURCE: 626 627 InfoTable = AcpiDmTableInfoMadt3; 628 break; 629 630 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 631 632 InfoTable = AcpiDmTableInfoMadt4; 633 break; 634 635 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 636 637 InfoTable = AcpiDmTableInfoMadt5; 638 break; 639 640 case ACPI_MADT_TYPE_IO_SAPIC: 641 642 InfoTable = AcpiDmTableInfoMadt6; 643 break; 644 645 case ACPI_MADT_TYPE_LOCAL_SAPIC: 646 647 InfoTable = AcpiDmTableInfoMadt7; 648 break; 649 650 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 651 652 InfoTable = AcpiDmTableInfoMadt8; 653 break; 654 655 case ACPI_MADT_TYPE_LOCAL_X2APIC: 656 657 InfoTable = AcpiDmTableInfoMadt9; 658 break; 659 660 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 661 662 InfoTable = AcpiDmTableInfoMadt10; 663 break; 664 665 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 666 667 InfoTable = AcpiDmTableInfoMadt11; 668 break; 669 670 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 671 672 InfoTable = AcpiDmTableInfoMadt12; 673 break; 674 675 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 676 677 InfoTable = AcpiDmTableInfoMadt13; 678 break; 679 680 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 681 682 InfoTable = AcpiDmTableInfoMadt14; 683 break; 684 685 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR: 686 687 InfoTable = AcpiDmTableInfoMadt15; 688 break; 689 690 default: 691 692 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", 693 Subtable->Type); 694 695 /* Attempt to continue */ 696 697 if (!Subtable->Length) 698 { 699 AcpiOsPrintf ("Invalid zero length subtable\n"); 700 return; 701 } 702 703 goto NextSubtable; 704 } 705 706 Status = AcpiDmDumpTable (Length, Offset, Subtable, 707 Subtable->Length, InfoTable); 708 if (ACPI_FAILURE (Status)) 709 { 710 return; 711 } 712 713 NextSubtable: 714 /* Point to next subtable */ 715 716 Offset += Subtable->Length; 717 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, 718 Subtable->Length); 719 } 720 } 721 722 723 /******************************************************************************* 724 * 725 * FUNCTION: AcpiDmDumpMcfg 726 * 727 * PARAMETERS: Table - A MCFG Table 728 * 729 * RETURN: None 730 * 731 * DESCRIPTION: Format the contents of a MCFG table 732 * 733 ******************************************************************************/ 734 735 void 736 AcpiDmDumpMcfg ( 737 ACPI_TABLE_HEADER *Table) 738 { 739 ACPI_STATUS Status; 740 UINT32 Offset = sizeof (ACPI_TABLE_MCFG); 741 ACPI_MCFG_ALLOCATION *Subtable; 742 743 744 /* Main table */ 745 746 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); 747 if (ACPI_FAILURE (Status)) 748 { 749 return; 750 } 751 752 /* Subtables */ 753 754 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); 755 while (Offset < Table->Length) 756 { 757 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) 758 { 759 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", 760 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); 761 return; 762 } 763 764 AcpiOsPrintf ("\n"); 765 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 766 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); 767 if (ACPI_FAILURE (Status)) 768 { 769 return; 770 } 771 772 /* Point to next subtable (each subtable is of fixed length) */ 773 774 Offset += sizeof (ACPI_MCFG_ALLOCATION); 775 Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable, 776 sizeof (ACPI_MCFG_ALLOCATION)); 777 } 778 } 779 780 781 /******************************************************************************* 782 * 783 * FUNCTION: AcpiDmDumpMpst 784 * 785 * PARAMETERS: Table - A MPST Table 786 * 787 * RETURN: None 788 * 789 * DESCRIPTION: Format the contents of a MPST table 790 * 791 ******************************************************************************/ 792 793 void 794 AcpiDmDumpMpst ( 795 ACPI_TABLE_HEADER *Table) 796 { 797 ACPI_STATUS Status; 798 UINT32 Offset = sizeof (ACPI_TABLE_MPST); 799 ACPI_MPST_POWER_NODE *Subtable0; 800 ACPI_MPST_POWER_STATE *Subtable0A; 801 ACPI_MPST_COMPONENT *Subtable0B; 802 ACPI_MPST_DATA_HDR *Subtable1; 803 ACPI_MPST_POWER_DATA *Subtable2; 804 UINT16 SubtableCount; 805 UINT32 PowerStateCount; 806 UINT32 ComponentCount; 807 808 809 /* Main table */ 810 811 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); 812 if (ACPI_FAILURE (Status)) 813 { 814 return; 815 } 816 817 /* Subtable: Memory Power Node(s) */ 818 819 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; 820 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); 821 822 while ((Offset < Table->Length) && SubtableCount) 823 { 824 AcpiOsPrintf ("\n"); 825 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0, 826 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); 827 if (ACPI_FAILURE (Status)) 828 { 829 return; 830 } 831 832 /* Extract the sub-subtable counts */ 833 834 PowerStateCount = Subtable0->NumPowerStates; 835 ComponentCount = Subtable0->NumPhysicalComponents; 836 Offset += sizeof (ACPI_MPST_POWER_NODE); 837 838 /* Sub-subtables - Memory Power State Structure(s) */ 839 840 Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0, 841 sizeof (ACPI_MPST_POWER_NODE)); 842 843 while (PowerStateCount) 844 { 845 AcpiOsPrintf ("\n"); 846 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A, 847 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); 848 if (ACPI_FAILURE (Status)) 849 { 850 return; 851 } 852 853 Subtable0A++; 854 PowerStateCount--; 855 Offset += sizeof (ACPI_MPST_POWER_STATE); 856 } 857 858 /* Sub-subtables - Physical Component ID Structure(s) */ 859 860 Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A); 861 862 if (ComponentCount) 863 { 864 AcpiOsPrintf ("\n"); 865 } 866 867 while (ComponentCount) 868 { 869 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B, 870 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); 871 if (ACPI_FAILURE (Status)) 872 { 873 return; 874 } 875 876 Subtable0B++; 877 ComponentCount--; 878 Offset += sizeof (ACPI_MPST_COMPONENT); 879 } 880 881 /* Point to next Memory Power Node subtable */ 882 883 SubtableCount--; 884 Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0, 885 sizeof (ACPI_MPST_POWER_NODE) + 886 (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) + 887 (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents)); 888 } 889 890 /* Subtable: Count of Memory Power State Characteristic structures */ 891 892 AcpiOsPrintf ("\n"); 893 Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0); 894 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1, 895 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); 896 if (ACPI_FAILURE (Status)) 897 { 898 return; 899 } 900 901 SubtableCount = Subtable1->CharacteristicsCount; 902 Offset += sizeof (ACPI_MPST_DATA_HDR); 903 904 /* Subtable: Memory Power State Characteristics structure(s) */ 905 906 Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1, 907 sizeof (ACPI_MPST_DATA_HDR)); 908 909 while ((Offset < Table->Length) && SubtableCount) 910 { 911 AcpiOsPrintf ("\n"); 912 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2, 913 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); 914 if (ACPI_FAILURE (Status)) 915 { 916 return; 917 } 918 919 Subtable2++; 920 SubtableCount--; 921 Offset += sizeof (ACPI_MPST_POWER_DATA); 922 } 923 } 924 925 926 /******************************************************************************* 927 * 928 * FUNCTION: AcpiDmDumpMsct 929 * 930 * PARAMETERS: Table - A MSCT table 931 * 932 * RETURN: None 933 * 934 * DESCRIPTION: Format the contents of a MSCT 935 * 936 ******************************************************************************/ 937 938 void 939 AcpiDmDumpMsct ( 940 ACPI_TABLE_HEADER *Table) 941 { 942 ACPI_STATUS Status; 943 UINT32 Offset = sizeof (ACPI_TABLE_MSCT); 944 ACPI_MSCT_PROXIMITY *Subtable; 945 946 947 /* Main table */ 948 949 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); 950 if (ACPI_FAILURE (Status)) 951 { 952 return; 953 } 954 955 /* Subtables */ 956 957 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); 958 while (Offset < Table->Length) 959 { 960 /* Common subtable header */ 961 962 AcpiOsPrintf ("\n"); 963 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 964 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); 965 if (ACPI_FAILURE (Status)) 966 { 967 return; 968 } 969 970 /* Point to next subtable */ 971 972 Offset += sizeof (ACPI_MSCT_PROXIMITY); 973 Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable, 974 sizeof (ACPI_MSCT_PROXIMITY)); 975 } 976 } 977 978 979 /******************************************************************************* 980 * 981 * FUNCTION: AcpiDmDumpMtmr 982 * 983 * PARAMETERS: Table - A MTMR table 984 * 985 * RETURN: None 986 * 987 * DESCRIPTION: Format the contents of a MTMR 988 * 989 ******************************************************************************/ 990 991 void 992 AcpiDmDumpMtmr ( 993 ACPI_TABLE_HEADER *Table) 994 { 995 ACPI_STATUS Status; 996 UINT32 Offset = sizeof (ACPI_TABLE_MTMR); 997 ACPI_MTMR_ENTRY *Subtable; 998 999 1000 /* Main table */ 1001 1002 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr); 1003 if (ACPI_FAILURE (Status)) 1004 { 1005 return; 1006 } 1007 1008 /* Subtables */ 1009 1010 Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset); 1011 while (Offset < Table->Length) 1012 { 1013 /* Common subtable header */ 1014 1015 AcpiOsPrintf ("\n"); 1016 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1017 sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0); 1018 if (ACPI_FAILURE (Status)) 1019 { 1020 return; 1021 } 1022 1023 /* Point to next subtable */ 1024 1025 Offset += sizeof (ACPI_MTMR_ENTRY); 1026 Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Subtable, 1027 sizeof (ACPI_MTMR_ENTRY)); 1028 } 1029 } 1030 1031 1032 /******************************************************************************* 1033 * 1034 * FUNCTION: AcpiDmDumpNfit 1035 * 1036 * PARAMETERS: Table - A NFIT table 1037 * 1038 * RETURN: None 1039 * 1040 * DESCRIPTION: Format the contents of an NFIT. 1041 * 1042 ******************************************************************************/ 1043 1044 void 1045 AcpiDmDumpNfit ( 1046 ACPI_TABLE_HEADER *Table) 1047 { 1048 ACPI_STATUS Status; 1049 UINT32 Offset = sizeof (ACPI_TABLE_NFIT); 1050 UINT32 FieldOffset = 0; 1051 UINT32 Length; 1052 ACPI_NFIT_HEADER *Subtable; 1053 ACPI_DMTABLE_INFO *InfoTable; 1054 ACPI_NFIT_INTERLEAVE *Interleave = NULL; 1055 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL; 1056 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; 1057 UINT32 i; 1058 1059 1060 /* Main table */ 1061 1062 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit); 1063 if (ACPI_FAILURE (Status)) 1064 { 1065 return; 1066 } 1067 1068 /* Subtables */ 1069 1070 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset); 1071 while (Offset < Table->Length) 1072 { 1073 /* NFIT subtable header */ 1074 1075 AcpiOsPrintf ("\n"); 1076 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1077 Subtable->Length, AcpiDmTableInfoNfitHdr); 1078 if (ACPI_FAILURE (Status)) 1079 { 1080 return; 1081 } 1082 1083 switch (Subtable->Type) 1084 { 1085 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 1086 1087 InfoTable = AcpiDmTableInfoNfit0; 1088 break; 1089 1090 case ACPI_NFIT_TYPE_MEMORY_MAP: 1091 1092 InfoTable = AcpiDmTableInfoNfit1; 1093 break; 1094 1095 case ACPI_NFIT_TYPE_INTERLEAVE: 1096 1097 /* Has a variable number of 32-bit values at the end */ 1098 1099 InfoTable = AcpiDmTableInfoNfit2; 1100 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable); 1101 FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE); 1102 break; 1103 1104 case ACPI_NFIT_TYPE_SMBIOS: 1105 1106 SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable); 1107 InfoTable = AcpiDmTableInfoNfit3; 1108 break; 1109 1110 case ACPI_NFIT_TYPE_CONTROL_REGION: 1111 1112 InfoTable = AcpiDmTableInfoNfit4; 1113 break; 1114 1115 case ACPI_NFIT_TYPE_DATA_REGION: 1116 1117 InfoTable = AcpiDmTableInfoNfit5; 1118 break; 1119 1120 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 1121 1122 /* Has a variable number of 64-bit addresses at the end */ 1123 1124 InfoTable = AcpiDmTableInfoNfit6; 1125 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable); 1126 FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64); 1127 break; 1128 1129 case ACPI_NFIT_TYPE_CAPABILITIES: /* ACPI 6.0A */ 1130 1131 InfoTable = AcpiDmTableInfoNfit7; 1132 break; 1133 1134 default: 1135 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", 1136 Subtable->Type); 1137 1138 /* Attempt to continue */ 1139 1140 if (!Subtable->Length) 1141 { 1142 AcpiOsPrintf ("Invalid zero length subtable\n"); 1143 return; 1144 } 1145 goto NextSubtable; 1146 } 1147 1148 AcpiOsPrintf ("\n"); 1149 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1150 Subtable->Length, InfoTable); 1151 if (ACPI_FAILURE (Status)) 1152 { 1153 return; 1154 } 1155 1156 /* Per-subtable variable-length fields */ 1157 1158 switch (Subtable->Type) 1159 { 1160 case ACPI_NFIT_TYPE_INTERLEAVE: 1161 1162 for (i = 0; i < Interleave->LineCount; i++) 1163 { 1164 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 1165 &Interleave->LineOffset[i], 1166 sizeof (UINT32), AcpiDmTableInfoNfit2a); 1167 if (ACPI_FAILURE (Status)) 1168 { 1169 return; 1170 } 1171 1172 FieldOffset += sizeof (UINT32); 1173 } 1174 break; 1175 1176 case ACPI_NFIT_TYPE_SMBIOS: 1177 1178 Length = Subtable->Length - 1179 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8); 1180 1181 if (Length) 1182 { 1183 Status = AcpiDmDumpTable (Table->Length, 1184 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8), 1185 SmbiosInfo, 1186 Length, AcpiDmTableInfoNfit3a); 1187 if (ACPI_FAILURE (Status)) 1188 { 1189 return; 1190 } 1191 } 1192 1193 break; 1194 1195 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 1196 1197 for (i = 0; i < Hint->HintCount; i++) 1198 { 1199 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 1200 &Hint->HintAddress[i], 1201 sizeof (UINT64), AcpiDmTableInfoNfit6a); 1202 if (ACPI_FAILURE (Status)) 1203 { 1204 return; 1205 } 1206 1207 FieldOffset += sizeof (UINT64); 1208 } 1209 break; 1210 1211 default: 1212 break; 1213 } 1214 1215 NextSubtable: 1216 /* Point to next subtable */ 1217 1218 Offset += Subtable->Length; 1219 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length); 1220 } 1221 } 1222 1223 1224 /******************************************************************************* 1225 * 1226 * FUNCTION: AcpiDmDumpPcct 1227 * 1228 * PARAMETERS: Table - A PCCT table 1229 * 1230 * RETURN: None 1231 * 1232 * DESCRIPTION: Format the contents of a PCCT. This table type consists 1233 * of an open-ended number of subtables. 1234 * 1235 ******************************************************************************/ 1236 1237 void 1238 AcpiDmDumpPcct ( 1239 ACPI_TABLE_HEADER *Table) 1240 { 1241 ACPI_STATUS Status; 1242 ACPI_PCCT_SUBSPACE *Subtable; 1243 ACPI_DMTABLE_INFO *InfoTable; 1244 UINT32 Length = Table->Length; 1245 UINT32 Offset = sizeof (ACPI_TABLE_PCCT); 1246 1247 1248 /* Main table */ 1249 1250 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); 1251 if (ACPI_FAILURE (Status)) 1252 { 1253 return; 1254 } 1255 1256 /* Subtables */ 1257 1258 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); 1259 while (Offset < Table->Length) 1260 { 1261 /* Common subtable header */ 1262 1263 AcpiOsPrintf ("\n"); 1264 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1265 Subtable->Header.Length, AcpiDmTableInfoPcctHdr); 1266 if (ACPI_FAILURE (Status)) 1267 { 1268 return; 1269 } 1270 1271 switch (Subtable->Header.Type) 1272 { 1273 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 1274 1275 InfoTable = AcpiDmTableInfoPcct0; 1276 break; 1277 1278 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 1279 1280 InfoTable = AcpiDmTableInfoPcct1; 1281 break; 1282 1283 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2: 1284 1285 InfoTable = AcpiDmTableInfoPcct2; 1286 break; 1287 1288 case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE: 1289 1290 InfoTable = AcpiDmTableInfoPcct3; 1291 break; 1292 1293 case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE: 1294 1295 InfoTable = AcpiDmTableInfoPcct4; 1296 break; 1297 1298 default: 1299 1300 AcpiOsPrintf ( 1301 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n", 1302 Subtable->Header.Type); 1303 return; 1304 } 1305 1306 AcpiOsPrintf ("\n"); 1307 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1308 Subtable->Header.Length, InfoTable); 1309 if (ACPI_FAILURE (Status)) 1310 { 1311 return; 1312 } 1313 1314 /* Point to next subtable */ 1315 1316 Offset += Subtable->Header.Length; 1317 Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable, 1318 Subtable->Header.Length); 1319 } 1320 } 1321 1322 1323 /******************************************************************************* 1324 * 1325 * FUNCTION: AcpiDmDumpPdtt 1326 * 1327 * PARAMETERS: Table - A PDTT table 1328 * 1329 * RETURN: None 1330 * 1331 * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length 1332 * table that contains an open-ended number of IDs 1333 * at the end of the table. 1334 * 1335 ******************************************************************************/ 1336 1337 void 1338 AcpiDmDumpPdtt ( 1339 ACPI_TABLE_HEADER *Table) 1340 { 1341 ACPI_STATUS Status; 1342 ACPI_PDTT_CHANNEL *Subtable; 1343 UINT32 Length = Table->Length; 1344 UINT32 Offset = sizeof (ACPI_TABLE_PDTT); 1345 1346 1347 /* Main table */ 1348 1349 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt); 1350 if (ACPI_FAILURE (Status)) 1351 { 1352 return; 1353 } 1354 1355 /* Subtables. Currently there is only one type, but can be multiples */ 1356 1357 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset); 1358 while (Offset < Table->Length) 1359 { 1360 AcpiOsPrintf ("\n"); 1361 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1362 sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0); 1363 if (ACPI_FAILURE (Status)) 1364 { 1365 return; 1366 } 1367 1368 /* Point to next subtable */ 1369 1370 Offset += sizeof (ACPI_PDTT_CHANNEL); 1371 Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable, 1372 sizeof (ACPI_PDTT_CHANNEL)); 1373 } 1374 } 1375 1376 1377 /******************************************************************************* 1378 * 1379 * FUNCTION: AcpiDmDumpPmtt 1380 * 1381 * PARAMETERS: Table - A PMTT table 1382 * 1383 * RETURN: None 1384 * 1385 * DESCRIPTION: Format the contents of a PMTT. This table type consists 1386 * of an open-ended number of subtables. 1387 * 1388 ******************************************************************************/ 1389 1390 void 1391 AcpiDmDumpPmtt ( 1392 ACPI_TABLE_HEADER *Table) 1393 { 1394 ACPI_STATUS Status; 1395 ACPI_PMTT_HEADER *Subtable; 1396 ACPI_PMTT_HEADER *MemSubtable; 1397 ACPI_PMTT_HEADER *DimmSubtable; 1398 ACPI_PMTT_DOMAIN *DomainArray; 1399 UINT32 Length = Table->Length; 1400 UINT32 Offset = sizeof (ACPI_TABLE_PMTT); 1401 UINT32 MemOffset; 1402 UINT32 DimmOffset; 1403 UINT32 DomainOffset; 1404 UINT32 DomainCount; 1405 1406 1407 /* Main table */ 1408 1409 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt); 1410 if (ACPI_FAILURE (Status)) 1411 { 1412 return; 1413 } 1414 1415 /* Subtables */ 1416 1417 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); 1418 while (Offset < Table->Length) 1419 { 1420 /* Common subtable header */ 1421 1422 AcpiOsPrintf ("\n"); 1423 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1424 Subtable->Length, AcpiDmTableInfoPmttHdr); 1425 if (ACPI_FAILURE (Status)) 1426 { 1427 return; 1428 } 1429 1430 /* Only Socket subtables are expected at this level */ 1431 1432 if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET) 1433 { 1434 AcpiOsPrintf ( 1435 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1436 Subtable->Type); 1437 return; 1438 } 1439 1440 /* Dump the fixed-length portion of the subtable */ 1441 1442 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1443 Subtable->Length, AcpiDmTableInfoPmtt0); 1444 if (ACPI_FAILURE (Status)) 1445 { 1446 return; 1447 } 1448 1449 /* Walk the memory controller subtables */ 1450 1451 MemOffset = sizeof (ACPI_PMTT_SOCKET); 1452 MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable, 1453 sizeof (ACPI_PMTT_SOCKET)); 1454 1455 while (((Offset + MemOffset) < Table->Length) && 1456 (MemOffset < Subtable->Length)) 1457 { 1458 /* Common subtable header */ 1459 1460 AcpiOsPrintf ("\n"); 1461 Status = AcpiDmDumpTable (Length, 1462 Offset + MemOffset, MemSubtable, 1463 MemSubtable->Length, AcpiDmTableInfoPmttHdr); 1464 if (ACPI_FAILURE (Status)) 1465 { 1466 return; 1467 } 1468 1469 /* Only memory controller subtables are expected at this level */ 1470 1471 if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER) 1472 { 1473 AcpiOsPrintf ( 1474 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1475 MemSubtable->Type); 1476 return; 1477 } 1478 1479 /* Dump the fixed-length portion of the controller subtable */ 1480 1481 Status = AcpiDmDumpTable (Length, 1482 Offset + MemOffset, MemSubtable, 1483 MemSubtable->Length, AcpiDmTableInfoPmtt1); 1484 if (ACPI_FAILURE (Status)) 1485 { 1486 return; 1487 } 1488 1489 /* Walk the variable count of proximity domains */ 1490 1491 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount; 1492 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER); 1493 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable, 1494 sizeof (ACPI_PMTT_CONTROLLER)); 1495 1496 while (((Offset + MemOffset + DomainOffset) < Table->Length) && 1497 ((MemOffset + DomainOffset) < Subtable->Length) && 1498 DomainCount) 1499 { 1500 Status = AcpiDmDumpTable (Length, 1501 Offset + MemOffset + DomainOffset, DomainArray, 1502 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a); 1503 if (ACPI_FAILURE (Status)) 1504 { 1505 return; 1506 } 1507 1508 DomainOffset += sizeof (ACPI_PMTT_DOMAIN); 1509 DomainArray++; 1510 DomainCount--; 1511 } 1512 1513 if (DomainCount) 1514 { 1515 AcpiOsPrintf ( 1516 "\n**** DomainCount exceeds subtable length\n\n"); 1517 } 1518 1519 /* Walk the physical component (DIMM) subtables */ 1520 1521 DimmOffset = DomainOffset; 1522 DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable, 1523 DomainOffset); 1524 1525 while (((Offset + MemOffset + DimmOffset) < Table->Length) && 1526 (DimmOffset < MemSubtable->Length)) 1527 { 1528 /* Common subtable header */ 1529 1530 AcpiOsPrintf ("\n"); 1531 Status = AcpiDmDumpTable (Length, 1532 Offset + MemOffset + DimmOffset, DimmSubtable, 1533 DimmSubtable->Length, AcpiDmTableInfoPmttHdr); 1534 if (ACPI_FAILURE (Status)) 1535 { 1536 return; 1537 } 1538 1539 /* Only DIMM subtables are expected at this level */ 1540 1541 if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM) 1542 { 1543 AcpiOsPrintf ( 1544 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1545 DimmSubtable->Type); 1546 return; 1547 } 1548 1549 /* Dump the fixed-length DIMM subtable */ 1550 1551 Status = AcpiDmDumpTable (Length, 1552 Offset + MemOffset + DimmOffset, DimmSubtable, 1553 DimmSubtable->Length, AcpiDmTableInfoPmtt2); 1554 if (ACPI_FAILURE (Status)) 1555 { 1556 return; 1557 } 1558 1559 /* Point to next DIMM subtable */ 1560 1561 DimmOffset += DimmSubtable->Length; 1562 DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 1563 DimmSubtable, DimmSubtable->Length); 1564 } 1565 1566 /* Point to next Controller subtable */ 1567 1568 MemOffset += MemSubtable->Length; 1569 MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 1570 MemSubtable, MemSubtable->Length); 1571 } 1572 1573 /* Point to next Socket subtable */ 1574 1575 Offset += Subtable->Length; 1576 Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 1577 Subtable, Subtable->Length); 1578 } 1579 } 1580 1581 1582 /******************************************************************************* 1583 * 1584 * FUNCTION: AcpiDmDumpPptt 1585 * 1586 * PARAMETERS: Table - A PMTT table 1587 * 1588 * RETURN: None 1589 * 1590 * DESCRIPTION: Format the contents of a PPTT. This table type consists 1591 * of an open-ended number of subtables. 1592 * 1593 ******************************************************************************/ 1594 1595 void 1596 AcpiDmDumpPptt ( 1597 ACPI_TABLE_HEADER *Table) 1598 { 1599 ACPI_STATUS Status; 1600 ACPI_SUBTABLE_HEADER *Subtable; 1601 ACPI_PPTT_PROCESSOR *PpttProcessor; 1602 UINT8 Length; 1603 UINT8 SubtableOffset; 1604 UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 1605 ACPI_DMTABLE_INFO *InfoTable; 1606 UINT32 i; 1607 1608 1609 /* There is no main table (other than the standard ACPI header) */ 1610 1611 /* Subtables */ 1612 1613 Offset = sizeof (ACPI_TABLE_HEADER); 1614 while (Offset < Table->Length) 1615 { 1616 AcpiOsPrintf ("\n"); 1617 1618 /* Common subtable header */ 1619 1620 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 1621 if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER)) 1622 { 1623 AcpiOsPrintf ("Invalid subtable length\n"); 1624 return; 1625 } 1626 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1627 Subtable->Length, AcpiDmTableInfoPpttHdr); 1628 if (ACPI_FAILURE (Status)) 1629 { 1630 return; 1631 } 1632 1633 switch (Subtable->Type) 1634 { 1635 case ACPI_PPTT_TYPE_PROCESSOR: 1636 1637 InfoTable = AcpiDmTableInfoPptt0; 1638 Length = sizeof (ACPI_PPTT_PROCESSOR); 1639 break; 1640 1641 case ACPI_PPTT_TYPE_CACHE: 1642 1643 InfoTable = AcpiDmTableInfoPptt1; 1644 Length = sizeof (ACPI_PPTT_CACHE); 1645 break; 1646 1647 case ACPI_PPTT_TYPE_ID: 1648 1649 InfoTable = AcpiDmTableInfoPptt2; 1650 Length = sizeof (ACPI_PPTT_ID); 1651 break; 1652 1653 default: 1654 1655 AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n", 1656 Subtable->Type); 1657 1658 /* Attempt to continue */ 1659 1660 goto NextSubtable; 1661 } 1662 1663 if (Subtable->Length < Length) 1664 { 1665 AcpiOsPrintf ("Invalid subtable length\n"); 1666 return; 1667 } 1668 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1669 Subtable->Length, InfoTable); 1670 if (ACPI_FAILURE (Status)) 1671 { 1672 return; 1673 } 1674 SubtableOffset = Length; 1675 1676 switch (Subtable->Type) 1677 { 1678 case ACPI_PPTT_TYPE_PROCESSOR: 1679 1680 PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable); 1681 1682 /* Dump SMBIOS handles */ 1683 1684 if ((UINT8)(Subtable->Length - SubtableOffset) < 1685 (UINT8)(PpttProcessor->NumberOfPrivResources * 4)) 1686 { 1687 AcpiOsPrintf ("Invalid private resource number\n"); 1688 return; 1689 } 1690 for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++) 1691 { 1692 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 1693 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset), 1694 4, AcpiDmTableInfoPptt0a); 1695 SubtableOffset += 4; 1696 } 1697 break; 1698 1699 default: 1700 1701 break; 1702 } 1703 1704 NextSubtable: 1705 /* Point to next subtable */ 1706 1707 Offset += Subtable->Length; 1708 } 1709 } 1710 1711 1712 /******************************************************************************* 1713 * 1714 * FUNCTION: AcpiDmDumpS3pt 1715 * 1716 * PARAMETERS: Table - A S3PT table 1717 * 1718 * RETURN: Length of the table 1719 * 1720 * DESCRIPTION: Format the contents of a S3PT 1721 * 1722 ******************************************************************************/ 1723 1724 UINT32 1725 AcpiDmDumpS3pt ( 1726 ACPI_TABLE_HEADER *Tables) 1727 { 1728 ACPI_STATUS Status; 1729 UINT32 Offset = sizeof (ACPI_TABLE_S3PT); 1730 ACPI_FPDT_HEADER *Subtable; 1731 ACPI_DMTABLE_INFO *InfoTable; 1732 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); 1733 1734 1735 /* Main table */ 1736 1737 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt); 1738 if (ACPI_FAILURE (Status)) 1739 { 1740 return 0; 1741 } 1742 1743 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset); 1744 while (Offset < S3ptTable->Length) 1745 { 1746 /* Common subtable header */ 1747 1748 AcpiOsPrintf ("\n"); 1749 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, 1750 Subtable->Length, AcpiDmTableInfoS3ptHdr); 1751 if (ACPI_FAILURE (Status)) 1752 { 1753 return 0; 1754 } 1755 1756 switch (Subtable->Type) 1757 { 1758 case ACPI_S3PT_TYPE_RESUME: 1759 1760 InfoTable = AcpiDmTableInfoS3pt0; 1761 break; 1762 1763 case ACPI_S3PT_TYPE_SUSPEND: 1764 1765 InfoTable = AcpiDmTableInfoS3pt1; 1766 break; 1767 1768 default: 1769 1770 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", 1771 Subtable->Type); 1772 1773 /* Attempt to continue */ 1774 1775 if (!Subtable->Length) 1776 { 1777 AcpiOsPrintf ("Invalid zero length subtable\n"); 1778 return 0; 1779 } 1780 goto NextSubtable; 1781 } 1782 1783 AcpiOsPrintf ("\n"); 1784 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, 1785 Subtable->Length, InfoTable); 1786 if (ACPI_FAILURE (Status)) 1787 { 1788 return 0; 1789 } 1790 1791 NextSubtable: 1792 /* Point to next subtable */ 1793 1794 Offset += Subtable->Length; 1795 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length); 1796 } 1797 1798 return (S3ptTable->Length); 1799 } 1800 1801 1802 /******************************************************************************* 1803 * 1804 * FUNCTION: AcpiDmDumpSdev 1805 * 1806 * PARAMETERS: Table - A SDEV table 1807 * 1808 * RETURN: None 1809 * 1810 * DESCRIPTION: Format the contents of a SDEV. This is a variable-length 1811 * table that contains variable strings and vendor data. 1812 * 1813 ******************************************************************************/ 1814 1815 void 1816 AcpiDmDumpSdev ( 1817 ACPI_TABLE_HEADER *Table) 1818 { 1819 ACPI_STATUS Status; 1820 ACPI_SDEV_HEADER *Subtable; 1821 ACPI_SDEV_PCIE *Pcie; 1822 ACPI_SDEV_NAMESPACE *Namesp; 1823 ACPI_DMTABLE_INFO *InfoTable; 1824 UINT32 Length = Table->Length; 1825 UINT32 Offset = sizeof (ACPI_TABLE_SDEV); 1826 UINT16 PathOffset; 1827 UINT16 PathLength; 1828 UINT16 VendorDataOffset; 1829 UINT16 VendorDataLength; 1830 1831 1832 /* Main table */ 1833 1834 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev); 1835 if (ACPI_FAILURE (Status)) 1836 { 1837 return; 1838 } 1839 1840 /* Subtables */ 1841 1842 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset); 1843 while (Offset < Table->Length) 1844 { 1845 /* Common subtable header */ 1846 1847 AcpiOsPrintf ("\n"); 1848 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1849 Subtable->Length, AcpiDmTableInfoSdevHdr); 1850 if (ACPI_FAILURE (Status)) 1851 { 1852 return; 1853 } 1854 1855 switch (Subtable->Type) 1856 { 1857 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 1858 1859 InfoTable = AcpiDmTableInfoSdev0; 1860 break; 1861 1862 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 1863 1864 InfoTable = AcpiDmTableInfoSdev1; 1865 break; 1866 1867 default: 1868 goto NextSubtable; 1869 } 1870 1871 AcpiOsPrintf ("\n"); 1872 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 1873 Subtable->Length, InfoTable); 1874 if (ACPI_FAILURE (Status)) 1875 { 1876 return; 1877 } 1878 1879 switch (Subtable->Type) 1880 { 1881 case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: 1882 1883 /* Dump the PCIe device ID(s) */ 1884 1885 Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable); 1886 PathOffset = Namesp->DeviceIdOffset; 1887 PathLength = Namesp->DeviceIdLength; 1888 1889 if (PathLength) 1890 { 1891 Status = AcpiDmDumpTable (Table->Length, 0, 1892 ACPI_ADD_PTR (UINT8, Namesp, PathOffset), 1893 PathLength, AcpiDmTableInfoSdev0a); 1894 if (ACPI_FAILURE (Status)) 1895 { 1896 return; 1897 } 1898 } 1899 1900 /* Dump the vendor-specific data */ 1901 1902 VendorDataLength = 1903 Namesp->VendorDataLength; 1904 VendorDataOffset = 1905 Namesp->DeviceIdOffset + Namesp->DeviceIdLength; 1906 1907 if (VendorDataLength) 1908 { 1909 Status = AcpiDmDumpTable (Table->Length, 0, 1910 ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset), 1911 VendorDataLength, AcpiDmTableInfoSdev1b); 1912 if (ACPI_FAILURE (Status)) 1913 { 1914 return; 1915 } 1916 } 1917 break; 1918 1919 case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: 1920 1921 /* PCI path substructures */ 1922 1923 Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable); 1924 PathOffset = Pcie->PathOffset; 1925 PathLength = Pcie->PathLength; 1926 1927 while (PathLength) 1928 { 1929 Status = AcpiDmDumpTable (Table->Length, 1930 PathOffset + Offset, 1931 ACPI_ADD_PTR (UINT8, Pcie, PathOffset), 1932 sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a); 1933 if (ACPI_FAILURE (Status)) 1934 { 1935 return; 1936 } 1937 1938 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH); 1939 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH); 1940 } 1941 1942 /* VendorData */ 1943 1944 VendorDataLength = Pcie->VendorDataLength; 1945 VendorDataOffset = Pcie->PathOffset + Pcie->PathLength; 1946 1947 if (VendorDataLength) 1948 { 1949 Status = AcpiDmDumpTable (Table->Length, 0, 1950 ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset), 1951 VendorDataLength, AcpiDmTableInfoSdev1b); 1952 } 1953 break; 1954 1955 default: 1956 goto NextSubtable; 1957 } 1958 1959 NextSubtable: 1960 /* Point to next subtable */ 1961 1962 Offset += Subtable->Length; 1963 Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable, 1964 Subtable->Length); 1965 } 1966 } 1967