1 /****************************************************************************** 2 * 3 * Module Name: dmtbdump1 - 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 "acpi.h" 45 #include "accommon.h" 46 #include "acdisasm.h" 47 #include "actables.h" 48 #include "aslcompiler.h" 49 50 /* This module used for application-level code only */ 51 52 #define _COMPONENT ACPI_CA_DISASSEMBLER 53 ACPI_MODULE_NAME ("dmtbdump1") 54 55 56 /******************************************************************************* 57 * 58 * FUNCTION: AcpiDmDumpAest 59 * 60 * PARAMETERS: Table - A AEST table 61 * 62 * RETURN: None 63 * 64 * DESCRIPTION: Format the contents of a AEST table 65 * 66 * NOTE: Assumes the following table structure: 67 * For all AEST Error Nodes: 68 * 1) An AEST Error Node, followed immediately by: 69 * 2) Any node-specific data 70 * 3) An Interface Structure (one) 71 * 4) A list (array) of Interrupt Structures 72 * 73 * AEST - ARM Error Source table. Conforms to: 74 * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020 75 * 76 ******************************************************************************/ 77 78 void 79 AcpiDmDumpAest ( 80 ACPI_TABLE_HEADER *Table) 81 { 82 ACPI_STATUS Status; 83 UINT32 Offset = sizeof (ACPI_TABLE_HEADER); 84 ACPI_AEST_HEADER *Subtable; 85 ACPI_AEST_HEADER *NodeHeader; 86 ACPI_AEST_PROCESSOR *ProcessorSubtable; 87 ACPI_DMTABLE_INFO *InfoTable; 88 ACPI_SIZE Length; 89 UINT8 Type; 90 UINT8 Revision = Table->Revision; 91 UINT32 Count; 92 ACPI_AEST_NODE_INTERFACE_HEADER *InterfaceHeader; 93 94 95 /* Very small, generic main table. AEST consists of mostly subtables */ 96 97 while (Offset < Table->Length) 98 { 99 NodeHeader = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset); 100 101 /* Dump the common error node (subtable) header */ 102 103 Status = AcpiDmDumpTable (Table->Length, Offset, NodeHeader, 104 NodeHeader->Length, AcpiDmTableInfoAestHdr); 105 if (ACPI_FAILURE (Status)) 106 { 107 return; 108 } 109 110 Type = NodeHeader->Type; 111 112 /* Setup the node-specific subtable based on the header Type field */ 113 114 switch (Type) 115 { 116 case ACPI_AEST_PROCESSOR_ERROR_NODE: 117 InfoTable = AcpiDmTableInfoAestProcError; 118 Length = sizeof (ACPI_AEST_PROCESSOR); 119 break; 120 121 case ACPI_AEST_MEMORY_ERROR_NODE: 122 InfoTable = AcpiDmTableInfoAestMemError; 123 Length = sizeof (ACPI_AEST_MEMORY); 124 break; 125 126 case ACPI_AEST_SMMU_ERROR_NODE: 127 InfoTable = AcpiDmTableInfoAestSmmuError; 128 Length = sizeof (ACPI_AEST_SMMU); 129 break; 130 131 case ACPI_AEST_VENDOR_ERROR_NODE: 132 switch (Revision) 133 { 134 case 1: 135 InfoTable = AcpiDmTableInfoAestVendorError; 136 Length = sizeof (ACPI_AEST_VENDOR); 137 break; 138 139 case 2: 140 InfoTable = AcpiDmTableInfoAestVendorV2Error; 141 Length = sizeof (ACPI_AEST_VENDOR_V2); 142 break; 143 144 default: 145 AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision); 146 return; 147 } 148 break; 149 150 case ACPI_AEST_GIC_ERROR_NODE: 151 InfoTable = AcpiDmTableInfoAestGicError; 152 Length = sizeof (ACPI_AEST_GIC); 153 break; 154 155 case ACPI_AEST_PCIE_ERROR_NODE: 156 InfoTable = AcpiDmTableInfoAestPCIeError; 157 Length = sizeof (ACPI_AEST_PCIE); 158 break; 159 160 case ACPI_AEST_PROXY_ERROR_NODE: 161 InfoTable = AcpiDmTableInfoAestProxyError; 162 Length = sizeof (ACPI_AEST_PROXY); 163 break; 164 165 /* Error case below */ 166 default: 167 168 AcpiOsPrintf ("\n**** Unknown AEST Error Subtable type 0x%X\n", 169 Type); 170 return; 171 } 172 173 /* Point past the common header (to the node-specific data) */ 174 175 Offset += sizeof (ACPI_AEST_HEADER); 176 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset); 177 AcpiOsPrintf ("\n"); 178 179 /* Dump the node-specific subtable */ 180 181 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, 182 InfoTable); 183 if (ACPI_FAILURE (Status)) 184 { 185 return; 186 } 187 AcpiOsPrintf ("\n"); 188 189 if (Type == ACPI_AEST_PROCESSOR_ERROR_NODE) 190 { 191 /* 192 * Special handling for PROCESSOR_ERROR_NODE subtables 193 * (to handle the Resource Substructure via the ResourceType 194 * field). 195 */ 196 197 /* Point past the node-specific data */ 198 199 Offset += Length; 200 ProcessorSubtable = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, Subtable); 201 202 switch (ProcessorSubtable->ResourceType) 203 { 204 /* Setup the Resource Substructure subtable */ 205 206 case ACPI_AEST_CACHE_RESOURCE: 207 InfoTable = AcpiDmTableInfoAestCacheRsrc; 208 Length = sizeof (ACPI_AEST_PROCESSOR_CACHE); 209 break; 210 211 case ACPI_AEST_TLB_RESOURCE: 212 InfoTable = AcpiDmTableInfoAestTlbRsrc; 213 Length = sizeof (ACPI_AEST_PROCESSOR_TLB); 214 break; 215 216 case ACPI_AEST_GENERIC_RESOURCE: 217 InfoTable = AcpiDmTableInfoAestGenRsrc; 218 Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC); 219 break; 220 221 /* Error case below */ 222 default: 223 AcpiOsPrintf ("\n**** Unknown AEST Processor Resource type 0x%X\n", 224 ProcessorSubtable->ResourceType); 225 return; 226 } 227 228 ProcessorSubtable = ACPI_ADD_PTR (ACPI_AEST_PROCESSOR, Table, 229 Offset); 230 231 /* Dump the resource substructure subtable */ 232 233 Status = AcpiDmDumpTable (Table->Length, Offset, ProcessorSubtable, 234 Length, InfoTable); 235 if (ACPI_FAILURE (Status)) 236 { 237 return; 238 } 239 240 AcpiOsPrintf ("\n"); 241 } 242 243 /* Point past the resource substructure or the node-specific data */ 244 245 Offset += Length; 246 247 /* Dump the interface structure, required to be present */ 248 249 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset); 250 if (Subtable->Type >= ACPI_AEST_XFACE_RESERVED) 251 { 252 AcpiOsPrintf ("\n**** Unknown AEST Node Interface type 0x%X\n", 253 Subtable->Type); 254 return; 255 } 256 257 if (Revision == 1) 258 { 259 InfoTable = AcpiDmTableInfoAestXface; 260 Length = sizeof (ACPI_AEST_NODE_INTERFACE); 261 } 262 else if (Revision == 2) 263 { 264 InfoTable = AcpiDmTableInfoAestXfaceHeader; 265 Length = sizeof (ACPI_AEST_NODE_INTERFACE_HEADER); 266 267 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable); 268 if (ACPI_FAILURE (Status)) 269 { 270 return; 271 } 272 273 Offset += Length; 274 275 InterfaceHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER, Subtable); 276 switch (InterfaceHeader->GroupFormat) 277 { 278 case ACPI_AEST_NODE_GROUP_FORMAT_4K: 279 InfoTable = AcpiDmTableInfoAestXface4k; 280 Length = sizeof (ACPI_AEST_NODE_INTERFACE_4K); 281 break; 282 283 case ACPI_AEST_NODE_GROUP_FORMAT_16K: 284 InfoTable = AcpiDmTableInfoAestXface16k; 285 Length = sizeof (ACPI_AEST_NODE_INTERFACE_16K); 286 break; 287 288 case ACPI_AEST_NODE_GROUP_FORMAT_64K: 289 InfoTable = AcpiDmTableInfoAestXface64k; 290 Length = sizeof (ACPI_AEST_NODE_INTERFACE_64K); 291 break; 292 293 default: 294 AcpiOsPrintf ("\n**** Unknown AEST Interface Group Format 0x%X\n", 295 InterfaceHeader->GroupFormat); 296 return; 297 } 298 299 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset); 300 } 301 else 302 { 303 AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision); 304 return; 305 } 306 307 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable); 308 if (ACPI_FAILURE (Status)) 309 { 310 return; 311 } 312 313 /* Point past the interface structure */ 314 315 AcpiOsPrintf ("\n"); 316 Offset += Length; 317 318 /* Dump the entire interrupt structure array, if present */ 319 320 if (NodeHeader->NodeInterruptOffset) 321 { 322 Count = NodeHeader->NodeInterruptCount; 323 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset); 324 325 while (Count) 326 { 327 /* Dump the interrupt structure */ 328 329 switch (Revision) { 330 case 1: 331 InfoTable = AcpiDmTableInfoAestXrupt; 332 Length = sizeof (ACPI_AEST_NODE_INTERRUPT); 333 break; 334 335 case 2: 336 InfoTable = AcpiDmTableInfoAestXruptV2; 337 Length = sizeof (ACPI_AEST_NODE_INTERRUPT_V2); 338 break; 339 default: 340 AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", 341 Revision); 342 return; 343 } 344 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 345 Length, InfoTable); 346 if (ACPI_FAILURE (Status)) 347 { 348 return; 349 } 350 351 /* Point to the next interrupt structure */ 352 353 Offset += Length; 354 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset); 355 Count--; 356 AcpiOsPrintf ("\n"); 357 } 358 } 359 } 360 } 361 362 /******************************************************************************* 363 * 364 * FUNCTION: AcpiDmDumpApmt 365 * 366 * PARAMETERS: Table - A APMT table 367 * 368 * RETURN: None 369 * 370 * DESCRIPTION: Format the contents of a APMT. This table type consists 371 * of an open-ended number of subtables. 372 * 373 * 374 * APMT - ARM Performance Monitoring Unit table. Conforms to: 375 * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document 376 * ARM DEN0117 v1.0 November 25, 2021 377 * 378 ******************************************************************************/ 379 380 void 381 AcpiDmDumpApmt ( 382 ACPI_TABLE_HEADER *Table) 383 { 384 ACPI_STATUS Status; 385 ACPI_APMT_NODE *Subtable; 386 UINT32 Length = Table->Length; 387 UINT32 Offset = sizeof (ACPI_TABLE_APMT); 388 UINT32 NodeNum = 0; 389 390 /* There is no main table (other than the standard ACPI header) */ 391 392 /* Subtables */ 393 394 Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Table, Offset); 395 while (Offset < Table->Length) 396 { 397 AcpiOsPrintf ("\n"); 398 399 if (Subtable->Type >= ACPI_APMT_NODE_TYPE_COUNT) 400 { 401 AcpiOsPrintf ("\n**** Unknown APMT subtable type 0x%X\n", 402 Subtable->Type); 403 return; 404 } 405 406 AcpiOsPrintf ("/* APMT Node-%u */\n", NodeNum++); 407 408 Status = AcpiDmDumpTable (Length, Offset, Subtable, 409 Subtable->Length, AcpiDmTableInfoApmtNode); 410 if (ACPI_FAILURE (Status)) 411 { 412 return; 413 } 414 415 /* Point to next subtable */ 416 417 Offset += Subtable->Length; 418 Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Subtable, 419 Subtable->Length); 420 AcpiOsPrintf ("\n"); 421 } 422 } 423 424 425 /******************************************************************************* 426 * 427 * FUNCTION: AcpiDmDumpAsf 428 * 429 * PARAMETERS: Table - A ASF table 430 * 431 * RETURN: None 432 * 433 * DESCRIPTION: Format the contents of a ASF table 434 * 435 ******************************************************************************/ 436 437 void 438 AcpiDmDumpAsf ( 439 ACPI_TABLE_HEADER *Table) 440 { 441 ACPI_STATUS Status; 442 UINT32 Offset = sizeof (ACPI_TABLE_HEADER); 443 ACPI_ASF_INFO *Subtable; 444 ACPI_DMTABLE_INFO *InfoTable; 445 ACPI_DMTABLE_INFO *DataInfoTable = NULL; 446 UINT8 *DataTable = NULL; 447 UINT32 DataCount = 0; 448 UINT32 DataLength = 0; 449 UINT32 DataOffset = 0; 450 UINT32 i; 451 UINT8 Type; 452 453 454 /* No main table, only subtables */ 455 456 Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); 457 while (Offset < Table->Length) 458 { 459 /* Common subtable header */ 460 461 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 462 Subtable->Header.Length, AcpiDmTableInfoAsfHdr); 463 if (ACPI_FAILURE (Status)) 464 { 465 return; 466 } 467 468 /* The actual type is the lower 7 bits of Type */ 469 470 Type = (UINT8) (Subtable->Header.Type & 0x7F); 471 472 switch (Type) 473 { 474 case ACPI_ASF_TYPE_INFO: 475 476 InfoTable = AcpiDmTableInfoAsf0; 477 break; 478 479 case ACPI_ASF_TYPE_ALERT: 480 481 InfoTable = AcpiDmTableInfoAsf1; 482 DataInfoTable = AcpiDmTableInfoAsf1a; 483 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT)); 484 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts; 485 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength; 486 DataOffset = Offset + sizeof (ACPI_ASF_ALERT); 487 break; 488 489 case ACPI_ASF_TYPE_CONTROL: 490 491 InfoTable = AcpiDmTableInfoAsf2; 492 DataInfoTable = AcpiDmTableInfoAsf2a; 493 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE)); 494 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls; 495 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength; 496 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE); 497 break; 498 499 case ACPI_ASF_TYPE_BOOT: 500 501 InfoTable = AcpiDmTableInfoAsf3; 502 break; 503 504 case ACPI_ASF_TYPE_ADDRESS: 505 506 InfoTable = AcpiDmTableInfoAsf4; 507 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS)); 508 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices; 509 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS); 510 break; 511 512 default: 513 514 AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", 515 Subtable->Header.Type); 516 return; 517 } 518 519 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 520 Subtable->Header.Length, InfoTable); 521 if (ACPI_FAILURE (Status)) 522 { 523 return; 524 } 525 526 /* Dump variable-length extra data */ 527 528 switch (Type) 529 { 530 case ACPI_ASF_TYPE_ALERT: 531 case ACPI_ASF_TYPE_CONTROL: 532 533 for (i = 0; i < DataCount; i++) 534 { 535 AcpiOsPrintf ("\n"); 536 Status = AcpiDmDumpTable (Table->Length, DataOffset, 537 DataTable, DataLength, DataInfoTable); 538 if (ACPI_FAILURE (Status)) 539 { 540 return; 541 } 542 543 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength); 544 DataOffset += DataLength; 545 } 546 break; 547 548 case ACPI_ASF_TYPE_ADDRESS: 549 550 for (i = 0; i < DataLength; i++) 551 { 552 if (!(i % 16)) 553 { 554 AcpiDmLineHeader (DataOffset, 1, "Addresses"); 555 } 556 557 AcpiOsPrintf ("%2.2X ", *DataTable); 558 DataTable++; 559 DataOffset++; 560 561 if (DataOffset > Table->Length) 562 { 563 AcpiOsPrintf ( 564 "**** ACPI table terminates in the middle of a " 565 "data structure! (ASF! table)\n"); 566 return; 567 } 568 } 569 570 AcpiOsPrintf ("\n"); 571 break; 572 573 default: 574 575 break; 576 } 577 578 AcpiOsPrintf ("\n"); 579 580 /* Point to next subtable */ 581 582 if (!Subtable->Header.Length) 583 { 584 AcpiOsPrintf ("Invalid zero subtable header length\n"); 585 return; 586 } 587 588 Offset += Subtable->Header.Length; 589 Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable, 590 Subtable->Header.Length); 591 } 592 } 593 594 /******************************************************************************* 595 * 596 * FUNCTION: AcpiDmDumpAspt 597 * 598 * PARAMETERS: Table - A ASPT table 599 * 600 * RETURN: None 601 * 602 * DESCRIPTION: Format the contents of a ASPT table 603 * 604 ******************************************************************************/ 605 606 void 607 AcpiDmDumpAspt ( 608 ACPI_TABLE_HEADER *Table) 609 { 610 ACPI_STATUS Status; 611 UINT32 Offset = sizeof (ACPI_TABLE_ASPT); 612 UINT32 Length = Table->Length; 613 ACPI_ASPT_HEADER *Subtable; 614 ACPI_DMTABLE_INFO *InfoTable; 615 UINT16 Type; 616 617 /* Main table */ 618 Status = AcpiDmDumpTable(Length, 0, Table, 0, AcpiDmTableInfoAspt); 619 620 /* Subtables */ 621 622 Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Table, Offset); 623 while (Offset < Table->Length) 624 { 625 AcpiOsPrintf ("\n"); 626 627 /* Common subtable header */ 628 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 629 Subtable->Length, AcpiDmTableInfoAsptHdr); 630 if (ACPI_FAILURE (Status)) 631 { 632 return; 633 } 634 635 Type = Subtable->Type; 636 637 switch (Type) 638 { 639 case ACPI_ASPT_TYPE_GLOBAL_REGS: 640 641 InfoTable = AcpiDmTableInfoAspt0; 642 break; 643 644 case ACPI_ASPT_TYPE_SEV_MBOX_REGS: 645 646 InfoTable = AcpiDmTableInfoAspt1; 647 break; 648 649 case ACPI_ASPT_TYPE_ACPI_MBOX_REGS: 650 651 InfoTable = AcpiDmTableInfoAspt2; 652 break; 653 654 default: 655 656 AcpiOsPrintf ("\n**** Unknown ASPT subtable type 0x%X\n", 657 Subtable->Type); 658 return; 659 } 660 661 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 662 Subtable->Length, InfoTable); 663 if (ACPI_FAILURE (Status)) 664 { 665 return; 666 } 667 668 AcpiOsPrintf ("\n"); 669 670 /* Point to next subtable */ 671 if (!Subtable->Length) 672 { 673 AcpiOsPrintf ("Invalid zero subtable header length\n"); 674 return; 675 } 676 677 Offset += Subtable->Length; 678 Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Subtable, 679 Subtable->Length); 680 } 681 } 682 683 684 /******************************************************************************* 685 * 686 * FUNCTION: AcpiDmDumpCdat 687 * 688 * PARAMETERS: InTable - A CDAT table 689 * 690 * RETURN: None 691 * 692 * DESCRIPTION: Format the contents of a CDAT. This table type consists 693 * of an open-ended number of subtables. 694 * 695 ******************************************************************************/ 696 697 void 698 AcpiDmDumpCdat ( 699 ACPI_TABLE_HEADER *InTable) 700 { 701 ACPI_TABLE_CDAT *Table = ACPI_CAST_PTR (ACPI_TABLE_CDAT, InTable); 702 ACPI_STATUS Status; 703 ACPI_CDAT_HEADER *Subtable; 704 ACPI_TABLE_CDAT *CdatTable = ACPI_CAST_PTR (ACPI_TABLE_CDAT, Table); 705 ACPI_DMTABLE_INFO *InfoTable; 706 UINT32 Length = CdatTable->Length; 707 UINT32 Offset = sizeof (ACPI_TABLE_CDAT); 708 UINT32 SubtableLength; 709 UINT32 SubtableType; 710 INT32 EntriesLength; 711 712 713 /* Main table */ 714 715 Status = AcpiDmDumpTable (Offset, 0, CdatTable, 0, 716 AcpiDmTableInfoCdatTableHdr); 717 if (ACPI_FAILURE (Status)) 718 { 719 return; 720 } 721 722 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, sizeof (ACPI_TABLE_CDAT)); 723 while (Offset < Table->Length) 724 { 725 /* Dump the common subtable header */ 726 727 DbgPrint (ASL_DEBUG_OUTPUT, "0) HeaderOffset: %X\n", Offset); 728 AcpiOsPrintf ("\n"); 729 Status = AcpiDmDumpTable (Length, Offset, Subtable, 730 sizeof (ACPI_CDAT_HEADER), AcpiDmTableInfoCdatHeader); 731 if (ACPI_FAILURE (Status)) 732 { 733 return; 734 } 735 736 /* Point past the common subtable header, decode the subtable type */ 737 738 Offset += sizeof (ACPI_CDAT_HEADER); 739 SubtableType = Subtable->Type; 740 741 switch (Subtable->Type) 742 { 743 case ACPI_CDAT_TYPE_DSMAS: 744 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 745 SubtableLength = sizeof (ACPI_CDAT_DSMAS); 746 747 InfoTable = AcpiDmTableInfoCdat0; 748 break; 749 750 case ACPI_CDAT_TYPE_DSLBIS: 751 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 752 SubtableLength = sizeof (ACPI_CDAT_DSLBIS); 753 DbgPrint (ASL_DEBUG_OUTPUT, "1) Offset: %X\n", Offset); 754 755 InfoTable = AcpiDmTableInfoCdat1; 756 break; 757 758 case ACPI_CDAT_TYPE_DSMSCIS: 759 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 760 SubtableLength = sizeof (ACPI_CDAT_DSMSCIS); 761 762 InfoTable = AcpiDmTableInfoCdat2; 763 break; 764 765 case ACPI_CDAT_TYPE_DSIS: 766 DbgPrint (ASL_DEBUG_OUTPUT, "2) Offset: %X ", Offset); 767 SubtableLength = sizeof (ACPI_CDAT_DSIS); 768 DbgPrint (ASL_DEBUG_OUTPUT, "1) input pointer: %p\n", Table); 769 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 770 DbgPrint (ASL_DEBUG_OUTPUT, "1) output pointers: %p, %p, Offset: %X\n", 771 Table, Subtable, Offset); 772 DbgPrint (ASL_DEBUG_OUTPUT, "3) Offset: %X\n", Offset); 773 774 InfoTable = AcpiDmTableInfoCdat3; 775 break; 776 777 case ACPI_CDAT_TYPE_DSEMTS: 778 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 779 SubtableLength = sizeof (ACPI_CDAT_DSEMTS); 780 781 InfoTable = AcpiDmTableInfoCdat4; 782 break; 783 784 case ACPI_CDAT_TYPE_SSLBIS: 785 SubtableLength = Subtable->Length; 786 787 InfoTable = AcpiDmTableInfoCdat5; 788 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 789 break; 790 791 default: 792 fprintf (stderr, "ERROR: Unknown SubtableType: %X\n", Subtable->Type); 793 return; 794 } 795 796 DbgPrint (ASL_DEBUG_OUTPUT, "SubtableType: %X, Length: %X Actual " 797 "Length: %X Offset: %X tableptr: %p\n", SubtableType, 798 Subtable->Length, SubtableLength, Offset, Table); 799 800 /* 801 * Do the subtable-specific fields 802 */ 803 Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, InfoTable); 804 if (ACPI_FAILURE (Status)) 805 { 806 return; 807 } 808 809 DbgPrint (ASL_DEBUG_OUTPUT, "Subtable Type: %X, Offset: %X, SubtableLength: %X\n", 810 SubtableType, Offset, SubtableLength); 811 812 /* Additional sub-subtables, dependent on the main subtable type */ 813 814 switch (SubtableType) 815 { 816 case ACPI_CDAT_TYPE_SSLBIS: 817 Offset += sizeof (ACPI_CDAT_SSLBIS); 818 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, 819 Offset); 820 821 DbgPrint (ASL_DEBUG_OUTPUT, "Case SSLBIS, Offset: %X, SubtableLength: %X " 822 "Subtable->Length %X\n", Offset, SubtableLength, Subtable->Length); 823 824 /* Generate the total length of all the SSLBE entries */ 825 826 EntriesLength = SubtableLength - sizeof (ACPI_CDAT_HEADER) - 827 sizeof (ACPI_CDAT_SSLBIS); 828 DbgPrint (ASL_DEBUG_OUTPUT, "EntriesLength: %X, Offset: %X, Table->Length: %X\n", 829 EntriesLength, Offset, Table->Length); 830 831 /* Do each of the SSLBE Entries */ 832 833 while ((EntriesLength > 0) && (Offset < Table->Length)) 834 { 835 AcpiOsPrintf ("\n"); 836 837 Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, 838 AcpiDmTableInfoCdatEntries); 839 if (ACPI_FAILURE (Status)) 840 { 841 return; 842 } 843 844 EntriesLength -= sizeof (ACPI_CDAT_SSLBE); 845 Offset += sizeof (ACPI_CDAT_SSLBE); 846 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 847 } 848 849 SubtableLength = 0; 850 break; 851 852 default: 853 break; 854 } 855 856 DbgPrint (ASL_DEBUG_OUTPUT, "Offset: %X, Subtable Length: %X\n", 857 Offset, SubtableLength); 858 859 /* Point to next subtable */ 860 861 Offset += SubtableLength; 862 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); 863 } 864 865 return; 866 } 867 868 869 /******************************************************************************* 870 * 871 * FUNCTION: AcpiDmDumpCedt 872 * 873 * PARAMETERS: Table - A CEDT table 874 * 875 * RETURN: None 876 * 877 * DESCRIPTION: Format the contents of a CEDT. This table type consists 878 * of an open-ended number of subtables. 879 * 880 ******************************************************************************/ 881 882 void 883 AcpiDmDumpCedt ( 884 ACPI_TABLE_HEADER *Table) 885 { 886 ACPI_STATUS Status; 887 ACPI_CEDT_HEADER *Subtable; 888 UINT32 Length = Table->Length; 889 UINT32 Offset = sizeof (ACPI_TABLE_CEDT); 890 891 892 /* There is no main table (other than the standard ACPI header) */ 893 894 Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset); 895 while (Offset < Table->Length) 896 { 897 /* Common subtable header */ 898 899 AcpiOsPrintf ("\n"); 900 Status = AcpiDmDumpTable (Length, Offset, Subtable, 901 Subtable->Length, AcpiDmTableInfoCedtHdr); 902 if (ACPI_FAILURE (Status)) 903 { 904 return; 905 } 906 907 switch (Subtable->Type) 908 { 909 case ACPI_CEDT_TYPE_CHBS: 910 Status = AcpiDmDumpTable (Length, Offset, Subtable, 911 Subtable->Length, AcpiDmTableInfoCedt0); 912 if (ACPI_FAILURE (Status)) 913 { 914 return; 915 } 916 break; 917 918 case ACPI_CEDT_TYPE_CFMWS: 919 { 920 ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable; 921 unsigned int i, max; 922 923 if (ptr->InterleaveWays < 8) 924 max = 1 << (ptr->InterleaveWays); 925 else 926 max = 3 << (ptr->InterleaveWays - 8); 927 928 /* print out table with first "Interleave target" */ 929 930 Status = AcpiDmDumpTable (Length, Offset, Subtable, 931 Subtable->Length, AcpiDmTableInfoCedt1); 932 if (ACPI_FAILURE (Status)) 933 { 934 return; 935 } 936 937 /* Now, print out any interleave targets beyond the first. */ 938 939 for (i = 1; i < max; i++) 940 { 941 unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveTargets); 942 unsigned int *trg = &(ptr->InterleaveTargets[i]); 943 944 Status = AcpiDmDumpTable (Length, loc_offset, trg, 945 Subtable->Length, AcpiDmTableInfoCedt1_te); 946 if (ACPI_FAILURE (Status)) 947 { 948 return; 949 } 950 } 951 break; 952 } 953 954 case ACPI_CEDT_TYPE_CXIMS: 955 { 956 ACPI_CEDT_CXIMS *ptr = (ACPI_CEDT_CXIMS *) Subtable; 957 unsigned int i, max = ptr->NrXormaps; 958 959 /* print out table with first "XOR Map" */ 960 961 Status = AcpiDmDumpTable (Length, Offset, Subtable, 962 Subtable->Length, AcpiDmTableInfoCedt2); 963 if (ACPI_FAILURE (Status)) 964 { 965 return; 966 } 967 968 /* Now, print out any XOR Map beyond the first. */ 969 970 for (i = 1; i < max; i++) 971 { 972 unsigned int loc_offset = Offset + (i * 1) + ACPI_OFFSET (ACPI_CEDT_CXIMS, XormapList); 973 UINT64 *trg = &(ptr->XormapList[i]); 974 975 Status = AcpiDmDumpTable (Length, loc_offset, trg, 976 Subtable->Length, AcpiDmTableInfoCedt2_te); 977 if (ACPI_FAILURE (Status)) 978 { 979 return; 980 } 981 } 982 break; 983 } 984 985 default: 986 AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n", 987 Subtable->Type); 988 989 /* Attempt to continue */ 990 if (!Subtable->Length) 991 { 992 AcpiOsPrintf ("Invalid zero length subtable\n"); 993 return; 994 } 995 } 996 997 /* Point to next subtable */ 998 Offset += Subtable->Length; 999 Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable, 1000 Subtable->Length); 1001 } 1002 } 1003 1004 /******************************************************************************* 1005 * 1006 * FUNCTION: AcpiDmDumpCpep 1007 * 1008 * PARAMETERS: Table - A CPEP table 1009 * 1010 * RETURN: None 1011 * 1012 * DESCRIPTION: Format the contents of a CPEP. This table type consists 1013 * of an open-ended number of subtables. 1014 * 1015 ******************************************************************************/ 1016 1017 void 1018 AcpiDmDumpCpep ( 1019 ACPI_TABLE_HEADER *Table) 1020 { 1021 ACPI_STATUS Status; 1022 ACPI_CPEP_POLLING *Subtable; 1023 UINT32 Length = Table->Length; 1024 UINT32 Offset = sizeof (ACPI_TABLE_CPEP); 1025 1026 1027 /* Main table */ 1028 1029 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep); 1030 if (ACPI_FAILURE (Status)) 1031 { 1032 return; 1033 } 1034 1035 /* Subtables */ 1036 1037 Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); 1038 while (Offset < Table->Length) 1039 { 1040 AcpiOsPrintf ("\n"); 1041 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1042 Subtable->Header.Length, AcpiDmTableInfoCpep0); 1043 if (ACPI_FAILURE (Status)) 1044 { 1045 return; 1046 } 1047 1048 /* Point to next subtable */ 1049 1050 Offset += Subtable->Header.Length; 1051 Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable, 1052 Subtable->Header.Length); 1053 } 1054 } 1055 1056 1057 /******************************************************************************* 1058 * 1059 * FUNCTION: AcpiDmDumpCsrt 1060 * 1061 * PARAMETERS: Table - A CSRT table 1062 * 1063 * RETURN: None 1064 * 1065 * DESCRIPTION: Format the contents of a CSRT. This table type consists 1066 * of an open-ended number of subtables. 1067 * 1068 ******************************************************************************/ 1069 1070 void 1071 AcpiDmDumpCsrt ( 1072 ACPI_TABLE_HEADER *Table) 1073 { 1074 ACPI_STATUS Status; 1075 ACPI_CSRT_GROUP *Subtable; 1076 ACPI_CSRT_SHARED_INFO *SharedInfoTable; 1077 ACPI_CSRT_DESCRIPTOR *SubSubtable; 1078 UINT32 Length = Table->Length; 1079 UINT32 Offset = sizeof (ACPI_TABLE_CSRT); 1080 UINT32 SubOffset; 1081 UINT32 SubSubOffset; 1082 UINT32 InfoLength; 1083 1084 1085 /* The main table only contains the ACPI header, thus already handled */ 1086 1087 /* Subtables (Resource Groups) */ 1088 1089 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); 1090 while (Offset < Table->Length) 1091 { 1092 /* Resource group subtable */ 1093 1094 AcpiOsPrintf ("\n"); 1095 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1096 Subtable->Length, AcpiDmTableInfoCsrt0); 1097 if (ACPI_FAILURE (Status)) 1098 { 1099 return; 1100 } 1101 1102 /* Shared info subtable (One per resource group) */ 1103 1104 SubOffset = sizeof (ACPI_CSRT_GROUP); 1105 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table, 1106 Offset + SubOffset); 1107 1108 AcpiOsPrintf ("\n"); 1109 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable, 1110 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1); 1111 if (ACPI_FAILURE (Status)) 1112 { 1113 return; 1114 } 1115 1116 SubOffset += Subtable->SharedInfoLength; 1117 1118 /* Sub-Subtables (Resource Descriptors) */ 1119 1120 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, 1121 Offset + SubOffset); 1122 1123 while ((SubOffset < Subtable->Length) && 1124 ((Offset + SubOffset) < Table->Length)) 1125 { 1126 AcpiOsPrintf ("\n"); 1127 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable, 1128 SubSubtable->Length, AcpiDmTableInfoCsrt2); 1129 if (ACPI_FAILURE (Status)) 1130 { 1131 return; 1132 } 1133 1134 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR); 1135 1136 /* Resource-specific info buffer */ 1137 1138 InfoLength = SubSubtable->Length - SubSubOffset; 1139 if (InfoLength) 1140 { 1141 Status = AcpiDmDumpTable (Length, 1142 Offset + SubOffset + SubSubOffset, Table, 1143 InfoLength, AcpiDmTableInfoCsrt2a); 1144 if (ACPI_FAILURE (Status)) 1145 { 1146 return; 1147 } 1148 } 1149 1150 /* Point to next sub-subtable */ 1151 1152 SubOffset += SubSubtable->Length; 1153 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable, 1154 SubSubtable->Length); 1155 } 1156 1157 /* Point to next subtable */ 1158 1159 Offset += Subtable->Length; 1160 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, 1161 Subtable->Length); 1162 } 1163 } 1164 1165 1166 /******************************************************************************* 1167 * 1168 * FUNCTION: AcpiDmDumpDbg2 1169 * 1170 * PARAMETERS: Table - A DBG2 table 1171 * 1172 * RETURN: None 1173 * 1174 * DESCRIPTION: Format the contents of a DBG2. This table type consists 1175 * of an open-ended number of subtables. 1176 * 1177 ******************************************************************************/ 1178 1179 void 1180 AcpiDmDumpDbg2 ( 1181 ACPI_TABLE_HEADER *Table) 1182 { 1183 ACPI_STATUS Status; 1184 ACPI_DBG2_DEVICE *Subtable; 1185 UINT32 Length = Table->Length; 1186 UINT32 Offset = sizeof (ACPI_TABLE_DBG2); 1187 UINT32 i; 1188 UINT32 ArrayOffset; 1189 UINT32 AbsoluteOffset; 1190 UINT8 *Array; 1191 1192 1193 /* Main table */ 1194 1195 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2); 1196 if (ACPI_FAILURE (Status)) 1197 { 1198 return; 1199 } 1200 1201 /* Subtables */ 1202 1203 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); 1204 while (Offset < Table->Length) 1205 { 1206 AcpiOsPrintf ("\n"); 1207 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1208 Subtable->Length, AcpiDmTableInfoDbg2Device); 1209 if (ACPI_FAILURE (Status)) 1210 { 1211 return; 1212 } 1213 1214 /* Dump the BaseAddress array */ 1215 1216 for (i = 0; i < Subtable->RegisterCount; i++) 1217 { 1218 ArrayOffset = Subtable->BaseAddressOffset + 1219 (sizeof (ACPI_GENERIC_ADDRESS) * i); 1220 AbsoluteOffset = Offset + ArrayOffset; 1221 Array = (UINT8 *) Subtable + ArrayOffset; 1222 1223 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 1224 Subtable->Length, AcpiDmTableInfoDbg2Addr); 1225 if (ACPI_FAILURE (Status)) 1226 { 1227 return; 1228 } 1229 } 1230 1231 /* Dump the AddressSize array */ 1232 1233 for (i = 0; i < Subtable->RegisterCount; i++) 1234 { 1235 ArrayOffset = Subtable->AddressSizeOffset + 1236 (sizeof (UINT32) * i); 1237 AbsoluteOffset = Offset + ArrayOffset; 1238 Array = (UINT8 *) Subtable + ArrayOffset; 1239 1240 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 1241 Subtable->Length, AcpiDmTableInfoDbg2Size); 1242 if (ACPI_FAILURE (Status)) 1243 { 1244 return; 1245 } 1246 } 1247 1248 /* Dump the Namestring (required) */ 1249 1250 AcpiOsPrintf ("\n"); 1251 ArrayOffset = Subtable->NamepathOffset; 1252 AbsoluteOffset = Offset + ArrayOffset; 1253 Array = (UINT8 *) Subtable + ArrayOffset; 1254 1255 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 1256 Subtable->Length, AcpiDmTableInfoDbg2Name); 1257 if (ACPI_FAILURE (Status)) 1258 { 1259 return; 1260 } 1261 1262 /* Dump the OemData (optional) */ 1263 1264 if (Subtable->OemDataOffset) 1265 { 1266 Status = AcpiDmDumpTable (Length, Subtable->OemDataOffset, 1267 Subtable, Subtable->OemDataLength, 1268 AcpiDmTableInfoDbg2OemData); 1269 if (ACPI_FAILURE (Status)) 1270 { 1271 return; 1272 } 1273 } 1274 1275 /* Point to next subtable */ 1276 1277 Offset += Subtable->Length; 1278 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable, 1279 Subtable->Length); 1280 } 1281 } 1282 1283 1284 /******************************************************************************* 1285 * 1286 * FUNCTION: AcpiDmDumpDmar 1287 * 1288 * PARAMETERS: Table - A DMAR table 1289 * 1290 * RETURN: None 1291 * 1292 * DESCRIPTION: Format the contents of a DMAR. This table type consists 1293 * of an open-ended number of subtables. 1294 * 1295 ******************************************************************************/ 1296 1297 void 1298 AcpiDmDumpDmar ( 1299 ACPI_TABLE_HEADER *Table) 1300 { 1301 ACPI_STATUS Status; 1302 ACPI_DMAR_HEADER *Subtable; 1303 UINT32 Length = Table->Length; 1304 UINT32 Offset = sizeof (ACPI_TABLE_DMAR); 1305 ACPI_DMTABLE_INFO *InfoTable; 1306 ACPI_DMAR_DEVICE_SCOPE *ScopeTable; 1307 UINT32 ScopeOffset; 1308 UINT8 *PciPath; 1309 UINT32 PathOffset; 1310 1311 1312 /* Main table */ 1313 1314 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar); 1315 if (ACPI_FAILURE (Status)) 1316 { 1317 return; 1318 } 1319 1320 /* Subtables */ 1321 1322 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); 1323 while (Offset < Table->Length) 1324 { 1325 /* Common subtable header */ 1326 1327 AcpiOsPrintf ("\n"); 1328 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1329 Subtable->Length, AcpiDmTableInfoDmarHdr); 1330 if (ACPI_FAILURE (Status)) 1331 { 1332 return; 1333 } 1334 1335 AcpiOsPrintf ("\n"); 1336 1337 switch (Subtable->Type) 1338 { 1339 case ACPI_DMAR_TYPE_HARDWARE_UNIT: 1340 1341 InfoTable = AcpiDmTableInfoDmar0; 1342 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT); 1343 break; 1344 1345 case ACPI_DMAR_TYPE_RESERVED_MEMORY: 1346 1347 InfoTable = AcpiDmTableInfoDmar1; 1348 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY); 1349 break; 1350 1351 case ACPI_DMAR_TYPE_ROOT_ATS: 1352 1353 InfoTable = AcpiDmTableInfoDmar2; 1354 ScopeOffset = sizeof (ACPI_DMAR_ATSR); 1355 break; 1356 1357 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY: 1358 1359 InfoTable = AcpiDmTableInfoDmar3; 1360 ScopeOffset = sizeof (ACPI_DMAR_RHSA); 1361 break; 1362 1363 case ACPI_DMAR_TYPE_NAMESPACE: 1364 1365 InfoTable = AcpiDmTableInfoDmar4; 1366 ScopeOffset = sizeof (ACPI_DMAR_ANDD); 1367 break; 1368 1369 case ACPI_DMAR_TYPE_SATC: 1370 1371 InfoTable = AcpiDmTableInfoDmar5; 1372 ScopeOffset = sizeof (ACPI_DMAR_SATC); 1373 break; 1374 1375 default: 1376 1377 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", 1378 Subtable->Type); 1379 return; 1380 } 1381 1382 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1383 Subtable->Length, InfoTable); 1384 if (ACPI_FAILURE (Status)) 1385 { 1386 return; 1387 } 1388 1389 /* 1390 * Dump the optional device scope entries 1391 */ 1392 if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || 1393 (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE)) 1394 { 1395 /* These types do not support device scopes */ 1396 1397 goto NextSubtable; 1398 } 1399 1400 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset); 1401 while (ScopeOffset < Subtable->Length) 1402 { 1403 AcpiOsPrintf ("\n"); 1404 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, 1405 ScopeTable->Length, AcpiDmTableInfoDmarScope); 1406 if (ACPI_FAILURE (Status)) 1407 { 1408 return; 1409 } 1410 AcpiOsPrintf ("\n"); 1411 1412 /* Dump the PCI Path entries for this device scope */ 1413 1414 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */ 1415 1416 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable, 1417 sizeof (ACPI_DMAR_DEVICE_SCOPE)); 1418 1419 while (PathOffset < ScopeTable->Length) 1420 { 1421 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, 1422 "PCI Path"); 1423 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]); 1424 1425 /* Point to next PCI Path entry */ 1426 1427 PathOffset += 2; 1428 PciPath += 2; 1429 AcpiOsPrintf ("\n"); 1430 } 1431 1432 /* Point to next device scope entry */ 1433 1434 ScopeOffset += ScopeTable->Length; 1435 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, 1436 ScopeTable, ScopeTable->Length); 1437 } 1438 1439 NextSubtable: 1440 /* Point to next subtable */ 1441 1442 Offset += Subtable->Length; 1443 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable, 1444 Subtable->Length); 1445 } 1446 } 1447 1448 1449 /******************************************************************************* 1450 * 1451 * FUNCTION: AcpiDmDumpDrtm 1452 * 1453 * PARAMETERS: Table - A DRTM table 1454 * 1455 * RETURN: None 1456 * 1457 * DESCRIPTION: Format the contents of a DRTM. 1458 * 1459 ******************************************************************************/ 1460 1461 void 1462 AcpiDmDumpDrtm ( 1463 ACPI_TABLE_HEADER *Table) 1464 { 1465 ACPI_STATUS Status; 1466 UINT32 Offset; 1467 ACPI_DRTM_VTABLE_LIST *DrtmVtl; 1468 ACPI_DRTM_RESOURCE_LIST *DrtmRl; 1469 ACPI_DRTM_DPS_ID *DrtmDps; 1470 UINT32 Count; 1471 1472 1473 /* Main table */ 1474 1475 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 1476 AcpiDmTableInfoDrtm); 1477 if (ACPI_FAILURE (Status)) 1478 { 1479 return; 1480 } 1481 1482 Offset = sizeof (ACPI_TABLE_DRTM); 1483 1484 /* Sub-tables */ 1485 1486 /* Dump ValidatedTable length */ 1487 1488 DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset); 1489 AcpiOsPrintf ("\n"); 1490 Status = AcpiDmDumpTable (Table->Length, Offset, 1491 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables), 1492 AcpiDmTableInfoDrtm0); 1493 if (ACPI_FAILURE (Status)) 1494 { 1495 return; 1496 } 1497 1498 Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables); 1499 1500 /* Dump Validated table addresses */ 1501 1502 Count = 0; 1503 while ((Offset < Table->Length) && 1504 (DrtmVtl->ValidatedTableCount > Count)) 1505 { 1506 Status = AcpiDmDumpTable (Table->Length, Offset, 1507 ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64), 1508 AcpiDmTableInfoDrtm0a); 1509 if (ACPI_FAILURE (Status)) 1510 { 1511 return; 1512 } 1513 1514 Offset += sizeof (UINT64); 1515 Count++; 1516 } 1517 1518 /* Dump ResourceList length */ 1519 1520 DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset); 1521 AcpiOsPrintf ("\n"); 1522 Status = AcpiDmDumpTable (Table->Length, Offset, 1523 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources), 1524 AcpiDmTableInfoDrtm1); 1525 if (ACPI_FAILURE (Status)) 1526 { 1527 return; 1528 } 1529 1530 Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources); 1531 1532 /* Dump the Resource List */ 1533 1534 Count = 0; 1535 while ((Offset < Table->Length) && 1536 (DrtmRl->ResourceCount > Count)) 1537 { 1538 Status = AcpiDmDumpTable (Table->Length, Offset, 1539 ACPI_ADD_PTR (void, Table, Offset), 1540 sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a); 1541 if (ACPI_FAILURE (Status)) 1542 { 1543 return; 1544 } 1545 1546 Offset += sizeof (ACPI_DRTM_RESOURCE); 1547 Count++; 1548 } 1549 1550 /* Dump DPS */ 1551 1552 DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset); 1553 AcpiOsPrintf ("\n"); 1554 (void) AcpiDmDumpTable (Table->Length, Offset, 1555 DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2); 1556 } 1557 1558 1559 /******************************************************************************* 1560 * 1561 * FUNCTION: AcpiDmDumpEinj 1562 * 1563 * PARAMETERS: Table - A EINJ table 1564 * 1565 * RETURN: None 1566 * 1567 * DESCRIPTION: Format the contents of a EINJ. This table type consists 1568 * of an open-ended number of subtables. 1569 * 1570 ******************************************************************************/ 1571 1572 void 1573 AcpiDmDumpEinj ( 1574 ACPI_TABLE_HEADER *Table) 1575 { 1576 ACPI_STATUS Status; 1577 ACPI_WHEA_HEADER *Subtable; 1578 UINT32 Length = Table->Length; 1579 UINT32 Offset = sizeof (ACPI_TABLE_EINJ); 1580 1581 1582 /* Main table */ 1583 1584 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj); 1585 if (ACPI_FAILURE (Status)) 1586 { 1587 return; 1588 } 1589 1590 /* Subtables */ 1591 1592 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1593 while (Offset < Table->Length) 1594 { 1595 AcpiOsPrintf ("\n"); 1596 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1597 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0); 1598 if (ACPI_FAILURE (Status)) 1599 { 1600 return; 1601 } 1602 1603 /* Point to next subtable (each subtable is of fixed length) */ 1604 1605 Offset += sizeof (ACPI_WHEA_HEADER); 1606 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable, 1607 sizeof (ACPI_WHEA_HEADER)); 1608 } 1609 } 1610 1611 1612 /******************************************************************************* 1613 * 1614 * FUNCTION: AcpiDmDumpErst 1615 * 1616 * PARAMETERS: Table - A ERST table 1617 * 1618 * RETURN: None 1619 * 1620 * DESCRIPTION: Format the contents of a ERST. This table type consists 1621 * of an open-ended number of subtables. 1622 * 1623 ******************************************************************************/ 1624 1625 void 1626 AcpiDmDumpErst ( 1627 ACPI_TABLE_HEADER *Table) 1628 { 1629 ACPI_STATUS Status; 1630 ACPI_WHEA_HEADER *Subtable; 1631 UINT32 Length = Table->Length; 1632 UINT32 Offset = sizeof (ACPI_TABLE_ERST); 1633 1634 1635 /* Main table */ 1636 1637 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst); 1638 if (ACPI_FAILURE (Status)) 1639 { 1640 return; 1641 } 1642 1643 /* Subtables */ 1644 1645 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1646 while (Offset < Table->Length) 1647 { 1648 AcpiOsPrintf ("\n"); 1649 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1650 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0); 1651 if (ACPI_FAILURE (Status)) 1652 { 1653 return; 1654 } 1655 1656 /* Point to next subtable (each subtable is of fixed length) */ 1657 1658 Offset += sizeof (ACPI_WHEA_HEADER); 1659 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable, 1660 sizeof (ACPI_WHEA_HEADER)); 1661 } 1662 } 1663 1664 1665 /******************************************************************************* 1666 * 1667 * FUNCTION: AcpiDmDumpFpdt 1668 * 1669 * PARAMETERS: Table - A FPDT table 1670 * 1671 * RETURN: None 1672 * 1673 * DESCRIPTION: Format the contents of a FPDT. This table type consists 1674 * of an open-ended number of subtables. 1675 * 1676 ******************************************************************************/ 1677 1678 void 1679 AcpiDmDumpFpdt ( 1680 ACPI_TABLE_HEADER *Table) 1681 { 1682 ACPI_STATUS Status; 1683 ACPI_FPDT_HEADER *Subtable; 1684 UINT32 Length = Table->Length; 1685 UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 1686 ACPI_DMTABLE_INFO *InfoTable; 1687 1688 1689 /* There is no main table (other than the standard ACPI header) */ 1690 1691 /* Subtables */ 1692 1693 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); 1694 while (Offset < Table->Length) 1695 { 1696 /* Common subtable header */ 1697 1698 AcpiOsPrintf ("\n"); 1699 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1700 Subtable->Length, AcpiDmTableInfoFpdtHdr); 1701 if (ACPI_FAILURE (Status)) 1702 { 1703 return; 1704 } 1705 1706 switch (Subtable->Type) 1707 { 1708 case ACPI_FPDT_TYPE_BOOT: 1709 1710 InfoTable = AcpiDmTableInfoFpdt0; 1711 break; 1712 1713 case ACPI_FPDT_TYPE_S3PERF: 1714 1715 InfoTable = AcpiDmTableInfoFpdt1; 1716 break; 1717 1718 default: 1719 1720 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", 1721 Subtable->Type); 1722 1723 /* Attempt to continue */ 1724 1725 if (!Subtable->Length) 1726 { 1727 AcpiOsPrintf ("Invalid zero length subtable\n"); 1728 return; 1729 } 1730 goto NextSubtable; 1731 } 1732 1733 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1734 Subtable->Length, InfoTable); 1735 if (ACPI_FAILURE (Status)) 1736 { 1737 return; 1738 } 1739 1740 NextSubtable: 1741 /* Point to next subtable */ 1742 1743 Offset += Subtable->Length; 1744 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, 1745 Subtable->Length); 1746 } 1747 } 1748 1749 1750 /******************************************************************************* 1751 * 1752 * FUNCTION: AcpiDmDumpGtdt 1753 * 1754 * PARAMETERS: Table - A GTDT table 1755 * 1756 * RETURN: None 1757 * 1758 * DESCRIPTION: Format the contents of a GTDT. This table type consists 1759 * of an open-ended number of subtables. 1760 * 1761 ******************************************************************************/ 1762 1763 void 1764 AcpiDmDumpGtdt ( 1765 ACPI_TABLE_HEADER *Table) 1766 { 1767 ACPI_STATUS Status; 1768 ACPI_GTDT_HEADER *Subtable; 1769 UINT32 Length = Table->Length; 1770 UINT32 Offset = sizeof (ACPI_TABLE_GTDT); 1771 ACPI_DMTABLE_INFO *InfoTable; 1772 UINT32 SubtableLength; 1773 UINT32 GtCount; 1774 ACPI_GTDT_TIMER_ENTRY *GtxTable; 1775 1776 1777 /* Main table */ 1778 1779 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt); 1780 if (ACPI_FAILURE (Status)) 1781 { 1782 return; 1783 } 1784 1785 /* Rev 3 fields */ 1786 1787 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset); 1788 1789 if (Table->Revision > 2) 1790 { 1791 SubtableLength = sizeof (ACPI_GTDT_EL2); 1792 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1793 SubtableLength, AcpiDmTableInfoGtdtEl2); 1794 if (ACPI_FAILURE (Status)) 1795 { 1796 return; 1797 } 1798 Offset += SubtableLength; 1799 } 1800 1801 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset); 1802 1803 /* Subtables */ 1804 1805 while (Offset < Table->Length) 1806 { 1807 /* Common subtable header */ 1808 1809 AcpiOsPrintf ("\n"); 1810 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1811 Subtable->Length, AcpiDmTableInfoGtdtHdr); 1812 if (ACPI_FAILURE (Status)) 1813 { 1814 return; 1815 } 1816 1817 GtCount = 0; 1818 switch (Subtable->Type) 1819 { 1820 case ACPI_GTDT_TYPE_TIMER_BLOCK: 1821 1822 SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK); 1823 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, 1824 Subtable))->TimerCount; 1825 1826 InfoTable = AcpiDmTableInfoGtdt0; 1827 break; 1828 1829 case ACPI_GTDT_TYPE_WATCHDOG: 1830 1831 SubtableLength = sizeof (ACPI_GTDT_WATCHDOG); 1832 1833 InfoTable = AcpiDmTableInfoGtdt1; 1834 break; 1835 1836 default: 1837 1838 /* Cannot continue on unknown type - no length */ 1839 1840 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", 1841 Subtable->Type); 1842 return; 1843 } 1844 1845 Status = AcpiDmDumpTable (Length, Offset, Subtable, 1846 Subtable->Length, InfoTable); 1847 if (ACPI_FAILURE (Status)) 1848 { 1849 return; 1850 } 1851 1852 /* Point to end of current subtable (each subtable above is of fixed length) */ 1853 1854 Offset += SubtableLength; 1855 1856 /* If there are any Gt Timer Blocks from above, dump them now */ 1857 1858 if (GtCount) 1859 { 1860 GtxTable = ACPI_ADD_PTR ( 1861 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength); 1862 SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY); 1863 1864 while (GtCount) 1865 { 1866 AcpiOsPrintf ("\n"); 1867 Status = AcpiDmDumpTable (Length, Offset, GtxTable, 1868 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a); 1869 if (ACPI_FAILURE (Status)) 1870 { 1871 return; 1872 } 1873 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY); 1874 GtxTable++; 1875 GtCount--; 1876 } 1877 } 1878 1879 /* Point to next subtable */ 1880 1881 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength); 1882 } 1883 } 1884 1885 1886 /******************************************************************************* 1887 * 1888 * FUNCTION: AcpiDmDumpHest 1889 * 1890 * PARAMETERS: Table - A HEST table 1891 * 1892 * RETURN: None 1893 * 1894 * DESCRIPTION: Format the contents of a HEST. This table type consists 1895 * of an open-ended number of subtables. 1896 * 1897 ******************************************************************************/ 1898 1899 void 1900 AcpiDmDumpHest ( 1901 ACPI_TABLE_HEADER *Table) 1902 { 1903 ACPI_STATUS Status; 1904 ACPI_HEST_HEADER *Subtable; 1905 UINT32 Length = Table->Length; 1906 UINT32 Offset = sizeof (ACPI_TABLE_HEST); 1907 ACPI_DMTABLE_INFO *InfoTable; 1908 UINT32 SubtableLength; 1909 UINT32 BankCount; 1910 ACPI_HEST_IA_ERROR_BANK *BankTable; 1911 1912 1913 /* Main table */ 1914 1915 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest); 1916 if (ACPI_FAILURE (Status)) 1917 { 1918 return; 1919 } 1920 1921 /* Subtables */ 1922 1923 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); 1924 while (Offset < Table->Length) 1925 { 1926 BankCount = 0; 1927 switch (Subtable->Type) 1928 { 1929 case ACPI_HEST_TYPE_IA32_CHECK: 1930 1931 InfoTable = AcpiDmTableInfoHest0; 1932 SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); 1933 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 1934 Subtable))->NumHardwareBanks; 1935 break; 1936 1937 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 1938 1939 InfoTable = AcpiDmTableInfoHest1; 1940 SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED); 1941 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 1942 Subtable))->NumHardwareBanks; 1943 break; 1944 1945 case ACPI_HEST_TYPE_IA32_NMI: 1946 1947 InfoTable = AcpiDmTableInfoHest2; 1948 SubtableLength = sizeof (ACPI_HEST_IA_NMI); 1949 break; 1950 1951 case ACPI_HEST_TYPE_AER_ROOT_PORT: 1952 1953 InfoTable = AcpiDmTableInfoHest6; 1954 SubtableLength = sizeof (ACPI_HEST_AER_ROOT); 1955 break; 1956 1957 case ACPI_HEST_TYPE_AER_ENDPOINT: 1958 1959 InfoTable = AcpiDmTableInfoHest7; 1960 SubtableLength = sizeof (ACPI_HEST_AER); 1961 break; 1962 1963 case ACPI_HEST_TYPE_AER_BRIDGE: 1964 1965 InfoTable = AcpiDmTableInfoHest8; 1966 SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE); 1967 break; 1968 1969 case ACPI_HEST_TYPE_GENERIC_ERROR: 1970 1971 InfoTable = AcpiDmTableInfoHest9; 1972 SubtableLength = sizeof (ACPI_HEST_GENERIC); 1973 break; 1974 1975 case ACPI_HEST_TYPE_GENERIC_ERROR_V2: 1976 1977 InfoTable = AcpiDmTableInfoHest10; 1978 SubtableLength = sizeof (ACPI_HEST_GENERIC_V2); 1979 break; 1980 1981 case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK: 1982 1983 InfoTable = AcpiDmTableInfoHest11; 1984 SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK); 1985 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK, 1986 Subtable))->NumHardwareBanks; 1987 break; 1988 1989 default: 1990 1991 /* Cannot continue on unknown type - no length */ 1992 1993 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", 1994 Subtable->Type); 1995 return; 1996 } 1997 1998 AcpiOsPrintf ("\n"); 1999 Status = AcpiDmDumpTable (Length, Offset, Subtable, 2000 SubtableLength, InfoTable); 2001 if (ACPI_FAILURE (Status)) 2002 { 2003 return; 2004 } 2005 2006 /* Point to end of current subtable (each subtable above is of fixed length) */ 2007 2008 Offset += SubtableLength; 2009 2010 /* If there are any (fixed-length) Error Banks from above, dump them now */ 2011 2012 if (BankCount) 2013 { 2014 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable, 2015 SubtableLength); 2016 SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); 2017 2018 while (BankCount) 2019 { 2020 AcpiOsPrintf ("\n"); 2021 Status = AcpiDmDumpTable (Length, Offset, BankTable, 2022 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank); 2023 if (ACPI_FAILURE (Status)) 2024 { 2025 return; 2026 } 2027 2028 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK); 2029 BankTable++; 2030 BankCount--; 2031 } 2032 } 2033 2034 /* Point to next subtable */ 2035 2036 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength); 2037 } 2038 } 2039 2040 2041 /******************************************************************************* 2042 * 2043 * FUNCTION: AcpiDmDumpHmat 2044 * 2045 * PARAMETERS: Table - A HMAT table 2046 * 2047 * RETURN: None 2048 * 2049 * DESCRIPTION: Format the contents of a HMAT. 2050 * 2051 ******************************************************************************/ 2052 2053 void 2054 AcpiDmDumpHmat ( 2055 ACPI_TABLE_HEADER *Table) 2056 { 2057 ACPI_STATUS Status; 2058 ACPI_HMAT_STRUCTURE *HmatStruct; 2059 ACPI_HMAT_LOCALITY *HmatLocality; 2060 ACPI_HMAT_CACHE *HmatCache; 2061 UINT32 Offset; 2062 UINT32 SubtableOffset; 2063 UINT32 Length; 2064 ACPI_DMTABLE_INFO *InfoTable; 2065 UINT32 i, j; 2066 2067 2068 /* Main table */ 2069 2070 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat); 2071 if (ACPI_FAILURE (Status)) 2072 { 2073 return; 2074 } 2075 Offset = sizeof (ACPI_TABLE_HMAT); 2076 2077 while (Offset < Table->Length) 2078 { 2079 AcpiOsPrintf ("\n"); 2080 2081 /* Dump HMAT structure header */ 2082 2083 HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset); 2084 if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE)) 2085 { 2086 AcpiOsPrintf ("Invalid HMAT structure length\n"); 2087 return; 2088 } 2089 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct, 2090 HmatStruct->Length, AcpiDmTableInfoHmatHdr); 2091 if (ACPI_FAILURE (Status)) 2092 { 2093 return; 2094 } 2095 2096 switch (HmatStruct->Type) 2097 { 2098 case ACPI_HMAT_TYPE_ADDRESS_RANGE: 2099 2100 InfoTable = AcpiDmTableInfoHmat0; 2101 Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN); 2102 break; 2103 2104 case ACPI_HMAT_TYPE_LOCALITY: 2105 2106 InfoTable = AcpiDmTableInfoHmat1; 2107 Length = sizeof (ACPI_HMAT_LOCALITY); 2108 break; 2109 2110 case ACPI_HMAT_TYPE_CACHE: 2111 2112 InfoTable = AcpiDmTableInfoHmat2; 2113 Length = sizeof (ACPI_HMAT_CACHE); 2114 break; 2115 2116 default: 2117 2118 AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n", 2119 HmatStruct->Type); 2120 2121 /* Attempt to continue */ 2122 2123 goto NextSubtable; 2124 } 2125 2126 /* Dump HMAT structure body */ 2127 2128 if (HmatStruct->Length < Length) 2129 { 2130 AcpiOsPrintf ("Invalid HMAT structure length\n"); 2131 return; 2132 } 2133 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct, 2134 HmatStruct->Length, InfoTable); 2135 if (ACPI_FAILURE (Status)) 2136 { 2137 return; 2138 } 2139 2140 /* Dump HMAT structure additional */ 2141 2142 switch (HmatStruct->Type) 2143 { 2144 case ACPI_HMAT_TYPE_LOCALITY: 2145 2146 HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct); 2147 SubtableOffset = sizeof (ACPI_HMAT_LOCALITY); 2148 2149 /* Dump initiator proximity domains */ 2150 2151 if ((UINT32)(HmatStruct->Length - SubtableOffset) < 2152 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4)) 2153 { 2154 AcpiOsPrintf ("Invalid initiator proximity domain number\n"); 2155 return; 2156 } 2157 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++) 2158 { 2159 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2160 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 2161 4, AcpiDmTableInfoHmat1a); 2162 if (ACPI_FAILURE (Status)) 2163 { 2164 return; 2165 } 2166 2167 SubtableOffset += 4; 2168 } 2169 2170 /* Dump target proximity domains */ 2171 2172 if ((UINT32)(HmatStruct->Length - SubtableOffset) < 2173 (UINT32)(HmatLocality->NumberOfTargetPDs * 4)) 2174 { 2175 AcpiOsPrintf ("Invalid target proximity domain number\n"); 2176 return; 2177 } 2178 for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++) 2179 { 2180 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2181 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 2182 4, AcpiDmTableInfoHmat1b); 2183 if (ACPI_FAILURE (Status)) 2184 { 2185 return; 2186 } 2187 2188 SubtableOffset += 4; 2189 } 2190 2191 /* Dump latency/bandwidth entris */ 2192 2193 if ((UINT32)(HmatStruct->Length - SubtableOffset) < 2194 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 2195 HmatLocality->NumberOfTargetPDs * 2)) 2196 { 2197 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n"); 2198 return; 2199 } 2200 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++) 2201 { 2202 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++) 2203 { 2204 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2205 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 2206 2, AcpiDmTableInfoHmat1c); 2207 if (ACPI_FAILURE(Status)) 2208 { 2209 return; 2210 } 2211 2212 SubtableOffset += 2; 2213 } 2214 } 2215 break; 2216 2217 case ACPI_HMAT_TYPE_CACHE: 2218 2219 HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct); 2220 SubtableOffset = sizeof (ACPI_HMAT_CACHE); 2221 2222 /* Dump SMBIOS handles */ 2223 2224 if ((UINT32)(HmatStruct->Length - SubtableOffset) < 2225 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2)) 2226 { 2227 AcpiOsPrintf ("Invalid SMBIOS handle number\n"); 2228 return; 2229 } 2230 for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++) 2231 { 2232 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, 2233 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 2234 2, AcpiDmTableInfoHmat2a); 2235 if (ACPI_FAILURE (Status)) 2236 { 2237 return; 2238 } 2239 2240 SubtableOffset += 2; 2241 } 2242 break; 2243 2244 default: 2245 2246 break; 2247 } 2248 2249 NextSubtable: 2250 /* Point to next HMAT structure subtable */ 2251 2252 Offset += (HmatStruct->Length); 2253 } 2254 } 2255