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