dmtbdump.c revision 241973
1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8229989Sjkim * Copyright (C) 2000 - 2012, Intel Corp. 9167802Sjkim * All rights reserved. 10167802Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25167802Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29167802Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43167802Sjkim 44193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 47193529Sjkim#include <contrib/dev/acpica/include/actables.h> 48167802Sjkim 49167802Sjkim/* This module used for application-level code only */ 50167802Sjkim 51167802Sjkim#define _COMPONENT ACPI_CA_DISASSEMBLER 52167802Sjkim ACPI_MODULE_NAME ("dmtbdump") 53167802Sjkim 54167802Sjkim 55239340Sjkim/* Local prototypes */ 56239340Sjkim 57218590Sjkimstatic void 58218590SjkimAcpiDmValidateFadtLength ( 59218590Sjkim UINT32 Revision, 60218590Sjkim UINT32 Length); 61218590Sjkim 62239340Sjkimstatic void 63239340SjkimAcpiDmDumpBuffer ( 64239340Sjkim void *Table, 65239340Sjkim UINT32 BufferOffset, 66239340Sjkim UINT32 Length, 67239340Sjkim UINT32 AbsoluteOffset, 68239340Sjkim char *Header); 69218590Sjkim 70239340Sjkim 71167802Sjkim/******************************************************************************* 72167802Sjkim * 73239340Sjkim * FUNCTION: AcpiDmDumpBuffer 74239340Sjkim * 75239340Sjkim * PARAMETERS: Table - ACPI Table or subtable 76239340Sjkim * BufferOffset - Offset of buffer from Table above 77239340Sjkim * Length - Length of the buffer 78239340Sjkim * AbsoluteOffset - Offset of buffer in the main ACPI table 79239340Sjkim * Header - Name of the buffer field (printed on the 80239340Sjkim * first line only.) 81239340Sjkim * 82239340Sjkim * RETURN: None 83239340Sjkim * 84239340Sjkim * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the 85239340Sjkim * disassembler output format.) 86239340Sjkim * 87239340Sjkim ******************************************************************************/ 88239340Sjkim 89239340Sjkimstatic void 90239340SjkimAcpiDmDumpBuffer ( 91239340Sjkim void *Table, 92239340Sjkim UINT32 BufferOffset, 93239340Sjkim UINT32 Length, 94239340Sjkim UINT32 AbsoluteOffset, 95239340Sjkim char *Header) 96239340Sjkim{ 97239340Sjkim UINT8 *Buffer; 98239340Sjkim UINT32 i; 99239340Sjkim 100239340Sjkim 101239340Sjkim if (!Length) 102239340Sjkim { 103239340Sjkim return; 104239340Sjkim } 105239340Sjkim 106239340Sjkim Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset; 107239340Sjkim i = 0; 108239340Sjkim 109239340Sjkim while (i < Length) 110239340Sjkim { 111239340Sjkim if (!(i % 16)) 112239340Sjkim { 113239340Sjkim AcpiOsPrintf ("\n"); 114239340Sjkim AcpiDmLineHeader (AbsoluteOffset, 115239340Sjkim ((Length - i) > 16) ? 16 : (Length - i), Header); 116239340Sjkim Header = NULL; 117239340Sjkim } 118239340Sjkim 119239340Sjkim AcpiOsPrintf ("%.02X ", *Buffer); 120239340Sjkim i++; 121239340Sjkim Buffer++; 122239340Sjkim AbsoluteOffset++; 123239340Sjkim } 124239340Sjkim 125239340Sjkim AcpiOsPrintf ("\n"); 126239340Sjkim} 127239340Sjkim 128239340Sjkim 129239340Sjkim/******************************************************************************* 130239340Sjkim * 131167802Sjkim * FUNCTION: AcpiDmDumpRsdp 132167802Sjkim * 133167802Sjkim * PARAMETERS: Table - A RSDP 134167802Sjkim * 135209746Sjkim * RETURN: Length of the table (there is not always a length field, 136209746Sjkim * use revision or length if available (ACPI 2.0+)) 137167802Sjkim * 138167802Sjkim * DESCRIPTION: Format the contents of a RSDP 139167802Sjkim * 140167802Sjkim ******************************************************************************/ 141167802Sjkim 142167802SjkimUINT32 143167802SjkimAcpiDmDumpRsdp ( 144167802Sjkim ACPI_TABLE_HEADER *Table) 145167802Sjkim{ 146209746Sjkim ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table); 147209746Sjkim UINT32 Length = sizeof (ACPI_RSDP_COMMON); 148209746Sjkim UINT8 Checksum; 149167802Sjkim 150167802Sjkim 151167802Sjkim /* Dump the common ACPI 1.0 portion */ 152167802Sjkim 153167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1); 154167802Sjkim 155209746Sjkim /* Validate the first checksum */ 156167802Sjkim 157209746Sjkim Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), 158209746Sjkim Rsdp->Checksum); 159209746Sjkim if (Checksum != Rsdp->Checksum) 160167802Sjkim { 161209746Sjkim AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n", 162209746Sjkim Checksum); 163209746Sjkim } 164209746Sjkim 165209746Sjkim /* The RSDP for ACPI 2.0+ contains more data and has a Length field */ 166209746Sjkim 167209746Sjkim if (Rsdp->Revision > 0) 168209746Sjkim { 169209746Sjkim Length = Rsdp->Length; 170167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2); 171209746Sjkim 172209746Sjkim /* Validate the extended checksum over entire RSDP */ 173209746Sjkim 174209746Sjkim Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), 175209746Sjkim Rsdp->ExtendedChecksum); 176209746Sjkim if (Checksum != Rsdp->ExtendedChecksum) 177209746Sjkim { 178209746Sjkim AcpiOsPrintf ( 179209746Sjkim "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n", 180209746Sjkim Checksum); 181209746Sjkim } 182167802Sjkim } 183167802Sjkim 184167802Sjkim return (Length); 185167802Sjkim} 186167802Sjkim 187167802Sjkim 188167802Sjkim/******************************************************************************* 189167802Sjkim * 190167802Sjkim * FUNCTION: AcpiDmDumpRsdt 191167802Sjkim * 192167802Sjkim * PARAMETERS: Table - A RSDT 193167802Sjkim * 194167802Sjkim * RETURN: None 195167802Sjkim * 196167802Sjkim * DESCRIPTION: Format the contents of a RSDT 197167802Sjkim * 198167802Sjkim ******************************************************************************/ 199167802Sjkim 200167802Sjkimvoid 201167802SjkimAcpiDmDumpRsdt ( 202167802Sjkim ACPI_TABLE_HEADER *Table) 203167802Sjkim{ 204167802Sjkim UINT32 *Array; 205167802Sjkim UINT32 Entries; 206167802Sjkim UINT32 Offset; 207167802Sjkim UINT32 i; 208167802Sjkim 209167802Sjkim 210167802Sjkim /* Point to start of table pointer array */ 211167802Sjkim 212167802Sjkim Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry; 213167802Sjkim Offset = sizeof (ACPI_TABLE_HEADER); 214167802Sjkim 215167802Sjkim /* RSDT uses 32-bit pointers */ 216167802Sjkim 217167802Sjkim Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); 218167802Sjkim 219167802Sjkim for (i = 0; i < Entries; i++) 220167802Sjkim { 221167802Sjkim AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i); 222167802Sjkim AcpiOsPrintf ("%8.8X\n", Array[i]); 223167802Sjkim Offset += sizeof (UINT32); 224167802Sjkim } 225167802Sjkim} 226167802Sjkim 227167802Sjkim 228167802Sjkim/******************************************************************************* 229167802Sjkim * 230167802Sjkim * FUNCTION: AcpiDmDumpXsdt 231167802Sjkim * 232167802Sjkim * PARAMETERS: Table - A XSDT 233167802Sjkim * 234167802Sjkim * RETURN: None 235167802Sjkim * 236167802Sjkim * DESCRIPTION: Format the contents of a XSDT 237167802Sjkim * 238167802Sjkim ******************************************************************************/ 239167802Sjkim 240167802Sjkimvoid 241167802SjkimAcpiDmDumpXsdt ( 242167802Sjkim ACPI_TABLE_HEADER *Table) 243167802Sjkim{ 244167802Sjkim UINT64 *Array; 245167802Sjkim UINT32 Entries; 246167802Sjkim UINT32 Offset; 247167802Sjkim UINT32 i; 248167802Sjkim 249167802Sjkim 250167802Sjkim /* Point to start of table pointer array */ 251167802Sjkim 252167802Sjkim Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry; 253167802Sjkim Offset = sizeof (ACPI_TABLE_HEADER); 254167802Sjkim 255167802Sjkim /* XSDT uses 64-bit pointers */ 256167802Sjkim 257167802Sjkim Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); 258167802Sjkim 259167802Sjkim for (i = 0; i < Entries; i++) 260167802Sjkim { 261167802Sjkim AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); 262167802Sjkim AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i])); 263167802Sjkim Offset += sizeof (UINT64); 264167802Sjkim } 265167802Sjkim} 266167802Sjkim 267167802Sjkim 268167802Sjkim/******************************************************************************* 269167802Sjkim * 270167802Sjkim * FUNCTION: AcpiDmDumpFadt 271167802Sjkim * 272167802Sjkim * PARAMETERS: Table - A FADT 273167802Sjkim * 274167802Sjkim * RETURN: None 275167802Sjkim * 276167802Sjkim * DESCRIPTION: Format the contents of a FADT 277167802Sjkim * 278218590Sjkim * NOTE: We cannot depend on the FADT version to indicate the actual 279218590Sjkim * contents of the FADT because of BIOS bugs. The table length 280218590Sjkim * is the only reliable indicator. 281218590Sjkim * 282167802Sjkim ******************************************************************************/ 283167802Sjkim 284167802Sjkimvoid 285167802SjkimAcpiDmDumpFadt ( 286167802Sjkim ACPI_TABLE_HEADER *Table) 287167802Sjkim{ 288167802Sjkim 289218590Sjkim /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ 290167802Sjkim 291167802Sjkim AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1); 292167802Sjkim 293218590Sjkim /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ 294167802Sjkim 295218590Sjkim if ((Table->Length > ACPI_FADT_V1_SIZE) && 296218590Sjkim (Table->Length <= ACPI_FADT_V2_SIZE)) 297167802Sjkim { 298167802Sjkim AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2); 299167802Sjkim } 300167802Sjkim 301228110Sjkim /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ 302193529Sjkim 303218590Sjkim else if (Table->Length > ACPI_FADT_V2_SIZE) 304193529Sjkim { 305193529Sjkim AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3); 306228110Sjkim 307228110Sjkim /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ 308228110Sjkim 309228110Sjkim if (Table->Length > ACPI_FADT_V3_SIZE) 310228110Sjkim { 311228110Sjkim AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5); 312228110Sjkim } 313193529Sjkim } 314193529Sjkim 315167802Sjkim /* Validate various fields in the FADT, including length */ 316167802Sjkim 317167802Sjkim AcpiTbCreateLocalFadt (Table, Table->Length); 318218590Sjkim 319218590Sjkim /* Validate FADT length against the revision */ 320218590Sjkim 321218590Sjkim AcpiDmValidateFadtLength (Table->Revision, Table->Length); 322167802Sjkim} 323167802Sjkim 324167802Sjkim 325167802Sjkim/******************************************************************************* 326167802Sjkim * 327218590Sjkim * FUNCTION: AcpiDmValidateFadtLength 328218590Sjkim * 329218590Sjkim * PARAMETERS: Revision - FADT revision (Header->Revision) 330218590Sjkim * Length - FADT length (Header->Length 331218590Sjkim * 332218590Sjkim * RETURN: None 333218590Sjkim * 334218590Sjkim * DESCRIPTION: Check the FADT revision against the expected table length for 335218590Sjkim * that revision. Issue a warning if the length is not what was 336218590Sjkim * expected. This seems to be such a common BIOS bug that the 337218590Sjkim * FADT revision has been rendered virtually meaningless. 338218590Sjkim * 339218590Sjkim ******************************************************************************/ 340218590Sjkim 341218590Sjkimstatic void 342218590SjkimAcpiDmValidateFadtLength ( 343218590Sjkim UINT32 Revision, 344218590Sjkim UINT32 Length) 345218590Sjkim{ 346218590Sjkim UINT32 ExpectedLength; 347218590Sjkim 348218590Sjkim 349218590Sjkim switch (Revision) 350218590Sjkim { 351218590Sjkim case 0: 352218590Sjkim AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); 353218590Sjkim return; 354218590Sjkim 355218590Sjkim case 1: 356218590Sjkim ExpectedLength = ACPI_FADT_V1_SIZE; 357218590Sjkim break; 358218590Sjkim 359218590Sjkim case 2: 360218590Sjkim ExpectedLength = ACPI_FADT_V2_SIZE; 361218590Sjkim break; 362218590Sjkim 363218590Sjkim case 3: 364218590Sjkim case 4: 365218590Sjkim ExpectedLength = ACPI_FADT_V3_SIZE; 366218590Sjkim break; 367218590Sjkim 368228110Sjkim case 5: 369228110Sjkim ExpectedLength = ACPI_FADT_V5_SIZE; 370228110Sjkim break; 371228110Sjkim 372218590Sjkim default: 373218590Sjkim return; 374218590Sjkim } 375218590Sjkim 376218590Sjkim if (Length == ExpectedLength) 377218590Sjkim { 378218590Sjkim return; 379218590Sjkim } 380218590Sjkim 381218590Sjkim AcpiOsPrintf ( 382218590Sjkim "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n", 383218590Sjkim Revision, Length, ExpectedLength); 384218590Sjkim} 385218590Sjkim 386218590Sjkim 387218590Sjkim/******************************************************************************* 388218590Sjkim * 389167802Sjkim * FUNCTION: AcpiDmDumpAsf 390167802Sjkim * 391167802Sjkim * PARAMETERS: Table - A ASF table 392167802Sjkim * 393167802Sjkim * RETURN: None 394167802Sjkim * 395167802Sjkim * DESCRIPTION: Format the contents of a ASF table 396167802Sjkim * 397167802Sjkim ******************************************************************************/ 398167802Sjkim 399167802Sjkimvoid 400167802SjkimAcpiDmDumpAsf ( 401167802Sjkim ACPI_TABLE_HEADER *Table) 402167802Sjkim{ 403193529Sjkim ACPI_STATUS Status; 404167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_HEADER); 405167802Sjkim ACPI_ASF_INFO *SubTable; 406167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 407167802Sjkim ACPI_DMTABLE_INFO *DataInfoTable = NULL; 408167802Sjkim UINT8 *DataTable = NULL; 409193529Sjkim UINT32 DataCount = 0; 410193529Sjkim UINT32 DataLength = 0; 411193529Sjkim UINT32 DataOffset = 0; 412193529Sjkim UINT32 i; 413197104Sjkim UINT8 Type; 414167802Sjkim 415167802Sjkim 416167802Sjkim /* No main table, only sub-tables */ 417167802Sjkim 418167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); 419167802Sjkim while (Offset < Table->Length) 420167802Sjkim { 421167802Sjkim /* Common sub-table header */ 422167802Sjkim 423193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 424193529Sjkim SubTable->Header.Length, AcpiDmTableInfoAsfHdr); 425193529Sjkim if (ACPI_FAILURE (Status)) 426193529Sjkim { 427193529Sjkim return; 428193529Sjkim } 429167802Sjkim 430197104Sjkim /* The actual type is the lower 7 bits of Type */ 431197104Sjkim 432197104Sjkim Type = (UINT8) (SubTable->Header.Type & 0x7F); 433197104Sjkim 434197104Sjkim switch (Type) 435167802Sjkim { 436167802Sjkim case ACPI_ASF_TYPE_INFO: 437167802Sjkim InfoTable = AcpiDmTableInfoAsf0; 438167802Sjkim break; 439167802Sjkim 440167802Sjkim case ACPI_ASF_TYPE_ALERT: 441167802Sjkim InfoTable = AcpiDmTableInfoAsf1; 442167802Sjkim DataInfoTable = AcpiDmTableInfoAsf1a; 443167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT)); 444197104Sjkim DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts; 445197104Sjkim DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength; 446167802Sjkim DataOffset = Offset + sizeof (ACPI_ASF_ALERT); 447167802Sjkim break; 448167802Sjkim 449167802Sjkim case ACPI_ASF_TYPE_CONTROL: 450167802Sjkim InfoTable = AcpiDmTableInfoAsf2; 451167802Sjkim DataInfoTable = AcpiDmTableInfoAsf2a; 452167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE)); 453197104Sjkim DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls; 454197104Sjkim DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength; 455167802Sjkim DataOffset = Offset + sizeof (ACPI_ASF_REMOTE); 456167802Sjkim break; 457167802Sjkim 458167802Sjkim case ACPI_ASF_TYPE_BOOT: 459167802Sjkim InfoTable = AcpiDmTableInfoAsf3; 460167802Sjkim break; 461167802Sjkim 462167802Sjkim case ACPI_ASF_TYPE_ADDRESS: 463167802Sjkim InfoTable = AcpiDmTableInfoAsf4; 464167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS)); 465197104Sjkim DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices; 466167802Sjkim DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS); 467167802Sjkim break; 468167802Sjkim 469167802Sjkim default: 470204773Sjkim AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable->Header.Type); 471167802Sjkim return; 472167802Sjkim } 473167802Sjkim 474193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 475193529Sjkim SubTable->Header.Length, InfoTable); 476193529Sjkim if (ACPI_FAILURE (Status)) 477193529Sjkim { 478193529Sjkim return; 479193529Sjkim } 480167802Sjkim 481167802Sjkim /* Dump variable-length extra data */ 482167802Sjkim 483197104Sjkim switch (Type) 484167802Sjkim { 485167802Sjkim case ACPI_ASF_TYPE_ALERT: 486167802Sjkim case ACPI_ASF_TYPE_CONTROL: 487167802Sjkim 488167802Sjkim for (i = 0; i < DataCount; i++) 489167802Sjkim { 490167802Sjkim AcpiOsPrintf ("\n"); 491193529Sjkim Status = AcpiDmDumpTable (Table->Length, DataOffset, 492193529Sjkim DataTable, DataLength, DataInfoTable); 493193529Sjkim if (ACPI_FAILURE (Status)) 494193529Sjkim { 495193529Sjkim return; 496193529Sjkim } 497167802Sjkim 498167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength); 499167802Sjkim DataOffset += DataLength; 500167802Sjkim } 501167802Sjkim break; 502167802Sjkim 503167802Sjkim case ACPI_ASF_TYPE_ADDRESS: 504167802Sjkim 505167802Sjkim for (i = 0; i < DataLength; i++) 506167802Sjkim { 507167802Sjkim if (!(i % 16)) 508167802Sjkim { 509167802Sjkim AcpiDmLineHeader (DataOffset, 1, "Addresses"); 510167802Sjkim } 511167802Sjkim 512167802Sjkim AcpiOsPrintf ("%2.2X ", *DataTable); 513167802Sjkim DataTable++; 514167802Sjkim DataOffset++; 515193529Sjkim if (DataOffset > Table->Length) 516193529Sjkim { 517193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 518193529Sjkim return; 519193529Sjkim } 520167802Sjkim } 521167802Sjkim 522167802Sjkim AcpiOsPrintf ("\n"); 523167802Sjkim break; 524193529Sjkim 525193529Sjkim default: 526193529Sjkim break; 527167802Sjkim } 528167802Sjkim 529167802Sjkim AcpiOsPrintf ("\n"); 530167802Sjkim 531167802Sjkim /* Point to next sub-table */ 532167802Sjkim 533193529Sjkim if (!SubTable->Header.Length) 534193529Sjkim { 535193529Sjkim AcpiOsPrintf ("Invalid zero subtable header length\n"); 536193529Sjkim return; 537193529Sjkim } 538193529Sjkim 539167802Sjkim Offset += SubTable->Header.Length; 540167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length); 541167802Sjkim } 542167802Sjkim} 543167802Sjkim 544167802Sjkim 545167802Sjkim/******************************************************************************* 546167802Sjkim * 547167802Sjkim * FUNCTION: AcpiDmDumpCpep 548167802Sjkim * 549167802Sjkim * PARAMETERS: Table - A CPEP table 550167802Sjkim * 551167802Sjkim * RETURN: None 552167802Sjkim * 553167802Sjkim * DESCRIPTION: Format the contents of a CPEP. This table type consists 554167802Sjkim * of an open-ended number of subtables. 555167802Sjkim * 556167802Sjkim ******************************************************************************/ 557167802Sjkim 558167802Sjkimvoid 559167802SjkimAcpiDmDumpCpep ( 560167802Sjkim ACPI_TABLE_HEADER *Table) 561167802Sjkim{ 562193529Sjkim ACPI_STATUS Status; 563167802Sjkim ACPI_CPEP_POLLING *SubTable; 564167802Sjkim UINT32 Length = Table->Length; 565167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_CPEP); 566167802Sjkim 567167802Sjkim 568167802Sjkim /* Main table */ 569167802Sjkim 570193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep); 571193529Sjkim if (ACPI_FAILURE (Status)) 572193529Sjkim { 573193529Sjkim return; 574193529Sjkim } 575167802Sjkim 576167802Sjkim /* Sub-tables */ 577167802Sjkim 578167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); 579167802Sjkim while (Offset < Table->Length) 580167802Sjkim { 581167802Sjkim AcpiOsPrintf ("\n"); 582193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 583197104Sjkim SubTable->Header.Length, AcpiDmTableInfoCpep0); 584193529Sjkim if (ACPI_FAILURE (Status)) 585193529Sjkim { 586193529Sjkim return; 587193529Sjkim } 588167802Sjkim 589167802Sjkim /* Point to next sub-table */ 590167802Sjkim 591197104Sjkim Offset += SubTable->Header.Length; 592197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable, 593197104Sjkim SubTable->Header.Length); 594167802Sjkim } 595167802Sjkim} 596167802Sjkim 597167802Sjkim 598167802Sjkim/******************************************************************************* 599167802Sjkim * 600239340Sjkim * FUNCTION: AcpiDmDumpCsrt 601239340Sjkim * 602239340Sjkim * PARAMETERS: Table - A CSRT table 603239340Sjkim * 604239340Sjkim * RETURN: None 605239340Sjkim * 606239340Sjkim * DESCRIPTION: Format the contents of a CSRT. This table type consists 607239340Sjkim * of an open-ended number of subtables. 608239340Sjkim * 609239340Sjkim ******************************************************************************/ 610239340Sjkim 611239340Sjkimvoid 612239340SjkimAcpiDmDumpCsrt ( 613239340Sjkim ACPI_TABLE_HEADER *Table) 614239340Sjkim{ 615239340Sjkim ACPI_STATUS Status; 616239340Sjkim ACPI_CSRT_GROUP *SubTable; 617239340Sjkim ACPI_CSRT_DESCRIPTOR *SubSubTable; 618239340Sjkim UINT32 Length = Table->Length; 619239340Sjkim UINT32 Offset = sizeof (ACPI_TABLE_CSRT); 620239340Sjkim UINT32 SubOffset; 621239340Sjkim UINT32 SubSubOffset; 622239340Sjkim UINT32 InfoLength; 623239340Sjkim 624239340Sjkim 625239340Sjkim /* The main table only contains the ACPI header, thus already handled */ 626239340Sjkim 627239340Sjkim /* Sub-tables (Resource Groups) */ 628239340Sjkim 629239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); 630239340Sjkim while (Offset < Table->Length) 631239340Sjkim { 632239340Sjkim AcpiOsPrintf ("\n"); 633239340Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 634239340Sjkim SubTable->Length, AcpiDmTableInfoCsrt0); 635239340Sjkim if (ACPI_FAILURE (Status)) 636239340Sjkim { 637239340Sjkim return; 638239340Sjkim } 639239340Sjkim 640239340Sjkim SubOffset = sizeof (ACPI_CSRT_GROUP); 641239340Sjkim 642239340Sjkim /* Shared resource group info buffer */ 643239340Sjkim 644239340Sjkim AcpiDmDumpBuffer (SubTable, SubOffset, SubTable->InfoLength, 645239340Sjkim Offset+SubOffset, "Shared Data"); 646239340Sjkim SubOffset += SubTable->InfoLength; 647239340Sjkim 648239340Sjkim /* Sub-Sub-tables (Resource Descriptors) */ 649239340Sjkim 650239340Sjkim SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, 651239340Sjkim Offset + SubOffset); 652239340Sjkim 653239340Sjkim while ((SubOffset < SubTable->Length) && 654239340Sjkim ((Offset + SubOffset) < Table->Length)) 655239340Sjkim { 656239340Sjkim AcpiOsPrintf ("\n"); 657239340Sjkim Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable, 658239340Sjkim SubSubTable->Length, AcpiDmTableInfoCsrt1); 659239340Sjkim if (ACPI_FAILURE (Status)) 660239340Sjkim { 661239340Sjkim return; 662239340Sjkim } 663239340Sjkim 664239340Sjkim SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR); 665239340Sjkim 666239340Sjkim /* Resource-specific info buffer */ 667239340Sjkim 668239340Sjkim InfoLength = SubSubTable->Length - SubSubOffset; 669239340Sjkim 670239340Sjkim AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength, 671239340Sjkim Offset + SubOffset + SubSubOffset, "ResourceInfo"); 672239340Sjkim SubSubOffset += InfoLength; 673239340Sjkim 674239340Sjkim /* Point to next sub-sub-table */ 675239340Sjkim 676239340Sjkim SubOffset += SubSubTable->Length; 677239340Sjkim SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable, 678239340Sjkim SubSubTable->Length); 679239340Sjkim } 680239340Sjkim 681239340Sjkim /* Point to next sub-table */ 682239340Sjkim 683239340Sjkim Offset += SubTable->Length; 684239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable, 685239340Sjkim SubTable->Length); 686239340Sjkim } 687239340Sjkim} 688239340Sjkim 689239340Sjkim 690239340Sjkim/******************************************************************************* 691239340Sjkim * 692239340Sjkim * FUNCTION: AcpiDmDumpDbg2 693239340Sjkim * 694239340Sjkim * PARAMETERS: Table - A DBG2 table 695239340Sjkim * 696239340Sjkim * RETURN: None 697239340Sjkim * 698239340Sjkim * DESCRIPTION: Format the contents of a DBG2. This table type consists 699239340Sjkim * of an open-ended number of subtables. 700239340Sjkim * 701239340Sjkim ******************************************************************************/ 702239340Sjkim 703239340Sjkimvoid 704239340SjkimAcpiDmDumpDbg2 ( 705239340Sjkim ACPI_TABLE_HEADER *Table) 706239340Sjkim{ 707239340Sjkim ACPI_STATUS Status; 708239340Sjkim ACPI_DBG2_DEVICE *SubTable; 709239340Sjkim UINT32 Length = Table->Length; 710239340Sjkim UINT32 Offset = sizeof (ACPI_TABLE_DBG2); 711239340Sjkim UINT32 i; 712239340Sjkim UINT32 ArrayOffset; 713239340Sjkim UINT32 AbsoluteOffset; 714239340Sjkim UINT8 *Array; 715239340Sjkim 716239340Sjkim 717239340Sjkim /* Main table */ 718239340Sjkim 719239340Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2); 720239340Sjkim if (ACPI_FAILURE (Status)) 721239340Sjkim { 722239340Sjkim return; 723239340Sjkim } 724239340Sjkim 725239340Sjkim /* Sub-tables */ 726239340Sjkim 727239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); 728239340Sjkim while (Offset < Table->Length) 729239340Sjkim { 730239340Sjkim AcpiOsPrintf ("\n"); 731239340Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 732239340Sjkim SubTable->Length, AcpiDmTableInfoDbg2Device); 733239340Sjkim if (ACPI_FAILURE (Status)) 734239340Sjkim { 735239340Sjkim return; 736239340Sjkim } 737239340Sjkim 738239340Sjkim /* Dump the BaseAddress array */ 739239340Sjkim 740239340Sjkim for (i = 0; i < SubTable->RegisterCount; i++) 741239340Sjkim { 742239340Sjkim ArrayOffset = SubTable->BaseAddressOffset + 743239340Sjkim (sizeof (ACPI_GENERIC_ADDRESS) * i); 744239340Sjkim AbsoluteOffset = Offset + ArrayOffset; 745239340Sjkim Array = (UINT8 *) SubTable + ArrayOffset; 746239340Sjkim 747239340Sjkim Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 748239340Sjkim SubTable->Length, AcpiDmTableInfoDbg2Addr); 749239340Sjkim if (ACPI_FAILURE (Status)) 750239340Sjkim { 751239340Sjkim return; 752239340Sjkim } 753239340Sjkim } 754239340Sjkim 755239340Sjkim /* Dump the AddressSize array */ 756239340Sjkim 757239340Sjkim for (i = 0; i < SubTable->RegisterCount; i++) 758239340Sjkim { 759239340Sjkim ArrayOffset = SubTable->AddressSizeOffset + 760239340Sjkim (sizeof (UINT32) * i); 761239340Sjkim AbsoluteOffset = Offset + ArrayOffset; 762239340Sjkim Array = (UINT8 *) SubTable + ArrayOffset; 763239340Sjkim 764239340Sjkim Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 765239340Sjkim SubTable->Length, AcpiDmTableInfoDbg2Size); 766239340Sjkim if (ACPI_FAILURE (Status)) 767239340Sjkim { 768239340Sjkim return; 769239340Sjkim } 770239340Sjkim } 771239340Sjkim 772239340Sjkim /* Dump the Namestring (required) */ 773239340Sjkim 774239340Sjkim AcpiOsPrintf ("\n"); 775239340Sjkim ArrayOffset = SubTable->NamepathOffset; 776239340Sjkim AbsoluteOffset = Offset + ArrayOffset; 777239340Sjkim Array = (UINT8 *) SubTable + ArrayOffset; 778239340Sjkim 779239340Sjkim Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 780239340Sjkim SubTable->Length, AcpiDmTableInfoDbg2Name); 781239340Sjkim if (ACPI_FAILURE (Status)) 782239340Sjkim { 783239340Sjkim return; 784239340Sjkim } 785239340Sjkim 786239340Sjkim /* Dump the OemData (optional) */ 787239340Sjkim 788239340Sjkim AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength, 789239340Sjkim Offset + SubTable->OemDataOffset, "OEM Data"); 790239340Sjkim 791239340Sjkim /* Point to next sub-table */ 792239340Sjkim 793239340Sjkim Offset += SubTable->Length; 794239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable, 795239340Sjkim SubTable->Length); 796239340Sjkim } 797239340Sjkim} 798239340Sjkim 799239340Sjkim 800239340Sjkim/******************************************************************************* 801239340Sjkim * 802167802Sjkim * FUNCTION: AcpiDmDumpDmar 803167802Sjkim * 804167802Sjkim * PARAMETERS: Table - A DMAR table 805167802Sjkim * 806167802Sjkim * RETURN: None 807167802Sjkim * 808167802Sjkim * DESCRIPTION: Format the contents of a DMAR. This table type consists 809167802Sjkim * of an open-ended number of subtables. 810167802Sjkim * 811167802Sjkim ******************************************************************************/ 812167802Sjkim 813239340Sjkim 814167802Sjkimvoid 815167802SjkimAcpiDmDumpDmar ( 816167802Sjkim ACPI_TABLE_HEADER *Table) 817167802Sjkim{ 818193529Sjkim ACPI_STATUS Status; 819167802Sjkim ACPI_DMAR_HEADER *SubTable; 820167802Sjkim UINT32 Length = Table->Length; 821167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_DMAR); 822167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 823167802Sjkim ACPI_DMAR_DEVICE_SCOPE *ScopeTable; 824167802Sjkim UINT32 ScopeOffset; 825167802Sjkim UINT8 *PciPath; 826167802Sjkim UINT32 PathOffset; 827167802Sjkim 828167802Sjkim 829167802Sjkim /* Main table */ 830167802Sjkim 831193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar); 832193529Sjkim if (ACPI_FAILURE (Status)) 833193529Sjkim { 834193529Sjkim return; 835193529Sjkim } 836167802Sjkim 837167802Sjkim /* Sub-tables */ 838167802Sjkim 839167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); 840167802Sjkim while (Offset < Table->Length) 841167802Sjkim { 842167802Sjkim /* Common sub-table header */ 843167802Sjkim 844167802Sjkim AcpiOsPrintf ("\n"); 845193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 846193529Sjkim SubTable->Length, AcpiDmTableInfoDmarHdr); 847193529Sjkim if (ACPI_FAILURE (Status)) 848193529Sjkim { 849193529Sjkim return; 850193529Sjkim } 851167802Sjkim 852167802Sjkim switch (SubTable->Type) 853167802Sjkim { 854167802Sjkim case ACPI_DMAR_TYPE_HARDWARE_UNIT: 855167802Sjkim InfoTable = AcpiDmTableInfoDmar0; 856167802Sjkim ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT); 857167802Sjkim break; 858167802Sjkim case ACPI_DMAR_TYPE_RESERVED_MEMORY: 859167802Sjkim InfoTable = AcpiDmTableInfoDmar1; 860167802Sjkim ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY); 861167802Sjkim break; 862193529Sjkim case ACPI_DMAR_TYPE_ATSR: 863193529Sjkim InfoTable = AcpiDmTableInfoDmar2; 864193529Sjkim ScopeOffset = sizeof (ACPI_DMAR_ATSR); 865193529Sjkim break; 866197104Sjkim case ACPI_DMAR_HARDWARE_AFFINITY: 867197104Sjkim InfoTable = AcpiDmTableInfoDmar3; 868197104Sjkim ScopeOffset = sizeof (ACPI_DMAR_RHSA); 869197104Sjkim break; 870167802Sjkim default: 871204773Sjkim AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type); 872167802Sjkim return; 873167802Sjkim } 874167802Sjkim 875193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 876193529Sjkim SubTable->Length, InfoTable); 877193529Sjkim if (ACPI_FAILURE (Status)) 878193529Sjkim { 879193529Sjkim return; 880193529Sjkim } 881167802Sjkim 882193529Sjkim /* Dump the device scope entries (if any) */ 883193529Sjkim 884193529Sjkim ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset); 885193529Sjkim while (ScopeOffset < SubTable->Length) 886167802Sjkim { 887193529Sjkim AcpiOsPrintf ("\n"); 888193529Sjkim Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, 889193529Sjkim ScopeTable->Length, AcpiDmTableInfoDmarScope); 890193529Sjkim if (ACPI_FAILURE (Status)) 891167802Sjkim { 892193529Sjkim return; 893193529Sjkim } 894167802Sjkim 895193529Sjkim /* Dump the PCI Path entries for this device scope */ 896167802Sjkim 897193529Sjkim PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */ 898167802Sjkim 899193529Sjkim PciPath = ACPI_ADD_PTR (UINT8, ScopeTable, 900193529Sjkim sizeof (ACPI_DMAR_DEVICE_SCOPE)); 901167802Sjkim 902193529Sjkim while (PathOffset < ScopeTable->Length) 903193529Sjkim { 904193529Sjkim AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path"); 905209746Sjkim AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]); 906167802Sjkim 907193529Sjkim /* Point to next PCI Path entry */ 908167802Sjkim 909193529Sjkim PathOffset += 2; 910193529Sjkim PciPath += 2; 911193529Sjkim } 912167802Sjkim 913193529Sjkim /* Point to next device scope entry */ 914167802Sjkim 915193529Sjkim ScopeOffset += ScopeTable->Length; 916193529Sjkim ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, 917193529Sjkim ScopeTable, ScopeTable->Length); 918167802Sjkim } 919167802Sjkim 920167802Sjkim /* Point to next sub-table */ 921167802Sjkim 922167802Sjkim Offset += SubTable->Length; 923167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length); 924167802Sjkim } 925167802Sjkim} 926167802Sjkim 927167802Sjkim 928167802Sjkim/******************************************************************************* 929167802Sjkim * 930193529Sjkim * FUNCTION: AcpiDmDumpEinj 931193529Sjkim * 932193529Sjkim * PARAMETERS: Table - A EINJ table 933193529Sjkim * 934193529Sjkim * RETURN: None 935193529Sjkim * 936193529Sjkim * DESCRIPTION: Format the contents of a EINJ. This table type consists 937193529Sjkim * of an open-ended number of subtables. 938193529Sjkim * 939193529Sjkim ******************************************************************************/ 940193529Sjkim 941193529Sjkimvoid 942193529SjkimAcpiDmDumpEinj ( 943193529Sjkim ACPI_TABLE_HEADER *Table) 944193529Sjkim{ 945193529Sjkim ACPI_STATUS Status; 946193529Sjkim ACPI_WHEA_HEADER *SubTable; 947193529Sjkim UINT32 Length = Table->Length; 948193529Sjkim UINT32 Offset = sizeof (ACPI_TABLE_EINJ); 949193529Sjkim 950193529Sjkim 951193529Sjkim /* Main table */ 952193529Sjkim 953193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj); 954193529Sjkim if (ACPI_FAILURE (Status)) 955193529Sjkim { 956193529Sjkim return; 957193529Sjkim } 958193529Sjkim 959193529Sjkim /* Sub-tables */ 960193529Sjkim 961193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 962193529Sjkim while (Offset < Table->Length) 963193529Sjkim { 964193529Sjkim AcpiOsPrintf ("\n"); 965193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 966193529Sjkim sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0); 967193529Sjkim if (ACPI_FAILURE (Status)) 968193529Sjkim { 969193529Sjkim return; 970193529Sjkim } 971193529Sjkim 972193529Sjkim /* Point to next sub-table (each subtable is of fixed length) */ 973193529Sjkim 974193529Sjkim Offset += sizeof (ACPI_WHEA_HEADER); 975193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 976193529Sjkim sizeof (ACPI_WHEA_HEADER)); 977193529Sjkim } 978193529Sjkim} 979193529Sjkim 980193529Sjkim 981193529Sjkim/******************************************************************************* 982193529Sjkim * 983193529Sjkim * FUNCTION: AcpiDmDumpErst 984193529Sjkim * 985193529Sjkim * PARAMETERS: Table - A ERST table 986193529Sjkim * 987193529Sjkim * RETURN: None 988193529Sjkim * 989193529Sjkim * DESCRIPTION: Format the contents of a ERST. This table type consists 990193529Sjkim * of an open-ended number of subtables. 991193529Sjkim * 992193529Sjkim ******************************************************************************/ 993193529Sjkim 994193529Sjkimvoid 995193529SjkimAcpiDmDumpErst ( 996193529Sjkim ACPI_TABLE_HEADER *Table) 997193529Sjkim{ 998193529Sjkim ACPI_STATUS Status; 999193529Sjkim ACPI_WHEA_HEADER *SubTable; 1000193529Sjkim UINT32 Length = Table->Length; 1001193529Sjkim UINT32 Offset = sizeof (ACPI_TABLE_ERST); 1002193529Sjkim 1003193529Sjkim 1004193529Sjkim /* Main table */ 1005193529Sjkim 1006193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst); 1007193529Sjkim if (ACPI_FAILURE (Status)) 1008193529Sjkim { 1009193529Sjkim return; 1010193529Sjkim } 1011193529Sjkim 1012193529Sjkim /* Sub-tables */ 1013193529Sjkim 1014193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1015193529Sjkim while (Offset < Table->Length) 1016193529Sjkim { 1017193529Sjkim AcpiOsPrintf ("\n"); 1018193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1019209746Sjkim sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0); 1020193529Sjkim if (ACPI_FAILURE (Status)) 1021193529Sjkim { 1022193529Sjkim return; 1023193529Sjkim } 1024193529Sjkim 1025193529Sjkim /* Point to next sub-table (each subtable is of fixed length) */ 1026193529Sjkim 1027193529Sjkim Offset += sizeof (ACPI_WHEA_HEADER); 1028193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 1029193529Sjkim sizeof (ACPI_WHEA_HEADER)); 1030193529Sjkim } 1031193529Sjkim} 1032193529Sjkim 1033193529Sjkim 1034193529Sjkim/******************************************************************************* 1035193529Sjkim * 1036228110Sjkim * FUNCTION: AcpiDmDumpFpdt 1037228110Sjkim * 1038228110Sjkim * PARAMETERS: Table - A FPDT table 1039228110Sjkim * 1040228110Sjkim * RETURN: None 1041228110Sjkim * 1042228110Sjkim * DESCRIPTION: Format the contents of a FPDT. This table type consists 1043228110Sjkim * of an open-ended number of subtables. 1044228110Sjkim * 1045228110Sjkim ******************************************************************************/ 1046228110Sjkim 1047228110Sjkimvoid 1048228110SjkimAcpiDmDumpFpdt ( 1049228110Sjkim ACPI_TABLE_HEADER *Table) 1050228110Sjkim{ 1051228110Sjkim ACPI_STATUS Status; 1052228110Sjkim ACPI_FPDT_HEADER *SubTable; 1053228110Sjkim UINT32 Length = Table->Length; 1054228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 1055228110Sjkim ACPI_DMTABLE_INFO *InfoTable; 1056228110Sjkim 1057228110Sjkim 1058228110Sjkim /* There is no main table (other than the standard ACPI header) */ 1059228110Sjkim 1060228110Sjkim /* Sub-tables */ 1061228110Sjkim 1062228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); 1063228110Sjkim while (Offset < Table->Length) 1064228110Sjkim { 1065228110Sjkim /* Common sub-table header */ 1066228110Sjkim 1067228110Sjkim AcpiOsPrintf ("\n"); 1068228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1069228110Sjkim SubTable->Length, AcpiDmTableInfoFpdtHdr); 1070228110Sjkim if (ACPI_FAILURE (Status)) 1071228110Sjkim { 1072228110Sjkim return; 1073228110Sjkim } 1074228110Sjkim 1075228110Sjkim switch (SubTable->Type) 1076228110Sjkim { 1077228110Sjkim case ACPI_FPDT_TYPE_BOOT: 1078228110Sjkim InfoTable = AcpiDmTableInfoFpdt0; 1079228110Sjkim break; 1080228110Sjkim case ACPI_FPDT_TYPE_S3PERF: 1081228110Sjkim InfoTable = AcpiDmTableInfoFpdt1; 1082228110Sjkim break; 1083228110Sjkim default: 1084228110Sjkim AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable->Type); 1085228110Sjkim 1086228110Sjkim /* Attempt to continue */ 1087228110Sjkim 1088228110Sjkim if (!SubTable->Length) 1089228110Sjkim { 1090228110Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1091228110Sjkim return; 1092228110Sjkim } 1093228110Sjkim goto NextSubTable; 1094228110Sjkim } 1095228110Sjkim 1096228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1097228110Sjkim SubTable->Length, InfoTable); 1098228110Sjkim if (ACPI_FAILURE (Status)) 1099228110Sjkim { 1100228110Sjkim return; 1101228110Sjkim } 1102228110Sjkim 1103228110SjkimNextSubTable: 1104228110Sjkim /* Point to next sub-table */ 1105228110Sjkim 1106228110Sjkim Offset += SubTable->Length; 1107228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length); 1108228110Sjkim } 1109228110Sjkim} 1110228110Sjkim 1111228110Sjkim 1112228110Sjkim/******************************************************************************* 1113228110Sjkim * 1114193529Sjkim * FUNCTION: AcpiDmDumpHest 1115193529Sjkim * 1116193529Sjkim * PARAMETERS: Table - A HEST table 1117193529Sjkim * 1118193529Sjkim * RETURN: None 1119193529Sjkim * 1120193529Sjkim * DESCRIPTION: Format the contents of a HEST. This table type consists 1121193529Sjkim * of an open-ended number of subtables. 1122193529Sjkim * 1123193529Sjkim ******************************************************************************/ 1124193529Sjkim 1125193529Sjkimvoid 1126193529SjkimAcpiDmDumpHest ( 1127193529Sjkim ACPI_TABLE_HEADER *Table) 1128193529Sjkim{ 1129193529Sjkim ACPI_STATUS Status; 1130193529Sjkim ACPI_HEST_HEADER *SubTable; 1131193529Sjkim UINT32 Length = Table->Length; 1132193529Sjkim UINT32 Offset = sizeof (ACPI_TABLE_HEST); 1133193529Sjkim ACPI_DMTABLE_INFO *InfoTable; 1134193529Sjkim UINT32 SubTableLength; 1135197104Sjkim UINT32 BankCount; 1136197104Sjkim ACPI_HEST_IA_ERROR_BANK *BankTable; 1137193529Sjkim 1138193529Sjkim 1139193529Sjkim /* Main table */ 1140193529Sjkim 1141193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest); 1142193529Sjkim if (ACPI_FAILURE (Status)) 1143193529Sjkim { 1144193529Sjkim return; 1145193529Sjkim } 1146193529Sjkim 1147193529Sjkim /* Sub-tables */ 1148193529Sjkim 1149193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); 1150193529Sjkim while (Offset < Table->Length) 1151193529Sjkim { 1152197104Sjkim BankCount = 0; 1153193529Sjkim switch (SubTable->Type) 1154193529Sjkim { 1155197104Sjkim case ACPI_HEST_TYPE_IA32_CHECK: 1156193529Sjkim InfoTable = AcpiDmTableInfoHest0; 1157197104Sjkim SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); 1158197104Sjkim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 1159197104Sjkim SubTable))->NumHardwareBanks; 1160193529Sjkim break; 1161193529Sjkim 1162197104Sjkim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 1163193529Sjkim InfoTable = AcpiDmTableInfoHest1; 1164197104Sjkim SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED); 1165197104Sjkim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 1166197104Sjkim SubTable))->NumHardwareBanks; 1167193529Sjkim break; 1168193529Sjkim 1169197104Sjkim case ACPI_HEST_TYPE_IA32_NMI: 1170197104Sjkim InfoTable = AcpiDmTableInfoHest2; 1171197104Sjkim SubTableLength = sizeof (ACPI_HEST_IA_NMI); 1172193529Sjkim break; 1173193529Sjkim 1174193529Sjkim case ACPI_HEST_TYPE_AER_ROOT_PORT: 1175193529Sjkim InfoTable = AcpiDmTableInfoHest6; 1176193529Sjkim SubTableLength = sizeof (ACPI_HEST_AER_ROOT); 1177193529Sjkim break; 1178193529Sjkim 1179193529Sjkim case ACPI_HEST_TYPE_AER_ENDPOINT: 1180193529Sjkim InfoTable = AcpiDmTableInfoHest7; 1181193529Sjkim SubTableLength = sizeof (ACPI_HEST_AER); 1182193529Sjkim break; 1183193529Sjkim 1184193529Sjkim case ACPI_HEST_TYPE_AER_BRIDGE: 1185193529Sjkim InfoTable = AcpiDmTableInfoHest8; 1186193529Sjkim SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE); 1187193529Sjkim break; 1188193529Sjkim 1189197104Sjkim case ACPI_HEST_TYPE_GENERIC_ERROR: 1190193529Sjkim InfoTable = AcpiDmTableInfoHest9; 1191193529Sjkim SubTableLength = sizeof (ACPI_HEST_GENERIC); 1192193529Sjkim break; 1193193529Sjkim 1194193529Sjkim default: 1195193529Sjkim /* Cannot continue on unknown type - no length */ 1196193529Sjkim 1197204773Sjkim AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type); 1198193529Sjkim return; 1199193529Sjkim } 1200193529Sjkim 1201193529Sjkim AcpiOsPrintf ("\n"); 1202193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1203193529Sjkim SubTableLength, InfoTable); 1204193529Sjkim if (ACPI_FAILURE (Status)) 1205193529Sjkim { 1206193529Sjkim return; 1207193529Sjkim } 1208193529Sjkim 1209197104Sjkim /* Point to end of current subtable (each subtable above is of fixed length) */ 1210193529Sjkim 1211193529Sjkim Offset += SubTableLength; 1212197104Sjkim 1213197104Sjkim /* If there are any (fixed-length) Error Banks from above, dump them now */ 1214197104Sjkim 1215197104Sjkim if (BankCount) 1216197104Sjkim { 1217197104Sjkim BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength); 1218197104Sjkim SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); 1219197104Sjkim 1220197104Sjkim while (BankCount) 1221197104Sjkim { 1222197104Sjkim AcpiOsPrintf ("\n"); 1223197104Sjkim Status = AcpiDmDumpTable (Length, Offset, BankTable, 1224197104Sjkim sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank); 1225197104Sjkim if (ACPI_FAILURE (Status)) 1226197104Sjkim { 1227197104Sjkim return; 1228197104Sjkim } 1229197104Sjkim Offset += sizeof (ACPI_HEST_IA_ERROR_BANK); 1230197104Sjkim BankTable++; 1231197104Sjkim BankCount--; 1232197104Sjkim } 1233197104Sjkim } 1234197104Sjkim 1235197104Sjkim /* Point to next sub-table */ 1236197104Sjkim 1237193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength); 1238193529Sjkim } 1239193529Sjkim} 1240193529Sjkim 1241193529Sjkim 1242193529Sjkim/******************************************************************************* 1243193529Sjkim * 1244197104Sjkim * FUNCTION: AcpiDmDumpIvrs 1245197104Sjkim * 1246197104Sjkim * PARAMETERS: Table - A IVRS table 1247197104Sjkim * 1248197104Sjkim * RETURN: None 1249197104Sjkim * 1250197104Sjkim * DESCRIPTION: Format the contents of a IVRS 1251197104Sjkim * 1252197104Sjkim ******************************************************************************/ 1253197104Sjkim 1254197104Sjkimstatic UINT8 EntrySizes[] = {4,8,16,32}; 1255197104Sjkim 1256197104Sjkimvoid 1257197104SjkimAcpiDmDumpIvrs ( 1258197104Sjkim ACPI_TABLE_HEADER *Table) 1259197104Sjkim{ 1260197104Sjkim ACPI_STATUS Status; 1261197104Sjkim UINT32 Offset = sizeof (ACPI_TABLE_IVRS); 1262197104Sjkim UINT32 EntryOffset; 1263197104Sjkim UINT32 EntryLength; 1264197104Sjkim UINT32 EntryType; 1265197104Sjkim ACPI_IVRS_DE_HEADER *DeviceEntry; 1266197104Sjkim ACPI_IVRS_HEADER *SubTable; 1267197104Sjkim ACPI_DMTABLE_INFO *InfoTable; 1268197104Sjkim 1269197104Sjkim 1270197104Sjkim /* Main table */ 1271197104Sjkim 1272197104Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); 1273197104Sjkim if (ACPI_FAILURE (Status)) 1274197104Sjkim { 1275197104Sjkim return; 1276197104Sjkim } 1277197104Sjkim 1278197104Sjkim /* Sub-tables */ 1279197104Sjkim 1280197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); 1281197104Sjkim while (Offset < Table->Length) 1282197104Sjkim { 1283197104Sjkim /* Common sub-table header */ 1284197104Sjkim 1285197104Sjkim AcpiOsPrintf ("\n"); 1286197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1287197104Sjkim SubTable->Length, AcpiDmTableInfoIvrsHdr); 1288197104Sjkim if (ACPI_FAILURE (Status)) 1289197104Sjkim { 1290197104Sjkim return; 1291197104Sjkim } 1292197104Sjkim 1293197104Sjkim switch (SubTable->Type) 1294197104Sjkim { 1295197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1296197104Sjkim InfoTable = AcpiDmTableInfoIvrs0; 1297197104Sjkim break; 1298197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1299197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1300197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1301197104Sjkim InfoTable = AcpiDmTableInfoIvrs1; 1302197104Sjkim break; 1303197104Sjkim default: 1304204773Sjkim AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n", 1305197104Sjkim SubTable->Type); 1306197104Sjkim 1307197104Sjkim /* Attempt to continue */ 1308197104Sjkim 1309197104Sjkim if (!SubTable->Length) 1310197104Sjkim { 1311197104Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1312197104Sjkim return; 1313197104Sjkim } 1314197104Sjkim goto NextSubTable; 1315197104Sjkim } 1316197104Sjkim 1317197104Sjkim /* Dump the subtable */ 1318197104Sjkim 1319197104Sjkim AcpiOsPrintf ("\n"); 1320197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1321197104Sjkim SubTable->Length, InfoTable); 1322197104Sjkim if (ACPI_FAILURE (Status)) 1323197104Sjkim { 1324197104Sjkim return; 1325197104Sjkim } 1326197104Sjkim 1327197104Sjkim /* The hardware subtable can contain multiple device entries */ 1328197104Sjkim 1329197104Sjkim if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE) 1330197104Sjkim { 1331197104Sjkim EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); 1332197104Sjkim DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable, 1333197104Sjkim sizeof (ACPI_IVRS_HARDWARE)); 1334197104Sjkim 1335197104Sjkim while (EntryOffset < (Offset + SubTable->Length)) 1336197104Sjkim { 1337197104Sjkim AcpiOsPrintf ("\n"); 1338197104Sjkim /* 1339197104Sjkim * Upper 2 bits of Type encode the length of the device entry 1340197104Sjkim * 1341197104Sjkim * 00 = 4 byte 1342197104Sjkim * 01 = 8 byte 1343197104Sjkim * 10 = 16 byte - currently no entries defined 1344197104Sjkim * 11 = 32 byte - currently no entries defined 1345197104Sjkim */ 1346197104Sjkim EntryType = DeviceEntry->Type; 1347197104Sjkim EntryLength = EntrySizes [EntryType >> 6]; 1348197104Sjkim 1349197104Sjkim switch (EntryType) 1350197104Sjkim { 1351197104Sjkim /* 4-byte device entries */ 1352197104Sjkim 1353197104Sjkim case ACPI_IVRS_TYPE_PAD4: 1354197104Sjkim case ACPI_IVRS_TYPE_ALL: 1355197104Sjkim case ACPI_IVRS_TYPE_SELECT: 1356197104Sjkim case ACPI_IVRS_TYPE_START: 1357197104Sjkim case ACPI_IVRS_TYPE_END: 1358197104Sjkim 1359197104Sjkim InfoTable = AcpiDmTableInfoIvrs4; 1360197104Sjkim break; 1361197104Sjkim 1362197104Sjkim /* 8-byte entries, type A */ 1363197104Sjkim 1364197104Sjkim case ACPI_IVRS_TYPE_ALIAS_SELECT: 1365197104Sjkim case ACPI_IVRS_TYPE_ALIAS_START: 1366197104Sjkim 1367197104Sjkim InfoTable = AcpiDmTableInfoIvrs8a; 1368197104Sjkim break; 1369197104Sjkim 1370197104Sjkim /* 8-byte entries, type B */ 1371197104Sjkim 1372197104Sjkim case ACPI_IVRS_TYPE_PAD8: 1373197104Sjkim case ACPI_IVRS_TYPE_EXT_SELECT: 1374197104Sjkim case ACPI_IVRS_TYPE_EXT_START: 1375197104Sjkim 1376197104Sjkim InfoTable = AcpiDmTableInfoIvrs8b; 1377197104Sjkim break; 1378197104Sjkim 1379197104Sjkim /* 8-byte entries, type C */ 1380197104Sjkim 1381197104Sjkim case ACPI_IVRS_TYPE_SPECIAL: 1382197104Sjkim 1383197104Sjkim InfoTable = AcpiDmTableInfoIvrs8c; 1384197104Sjkim break; 1385197104Sjkim 1386197104Sjkim default: 1387197104Sjkim InfoTable = AcpiDmTableInfoIvrs4; 1388197104Sjkim AcpiOsPrintf ( 1389197104Sjkim "\n**** Unknown IVRS device entry type/length: " 1390204773Sjkim "0x%.2X/0x%X at offset 0x%.4X: (header below)\n", 1391197104Sjkim EntryType, EntryLength, EntryOffset); 1392197104Sjkim break; 1393197104Sjkim } 1394197104Sjkim 1395197104Sjkim /* Dump the Device Entry */ 1396197104Sjkim 1397197104Sjkim Status = AcpiDmDumpTable (Table->Length, EntryOffset, 1398197104Sjkim DeviceEntry, EntryLength, InfoTable); 1399197104Sjkim 1400197104Sjkim EntryOffset += EntryLength; 1401197104Sjkim DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry, 1402197104Sjkim EntryLength); 1403197104Sjkim } 1404197104Sjkim } 1405197104Sjkim 1406197104SjkimNextSubTable: 1407197104Sjkim /* Point to next sub-table */ 1408197104Sjkim 1409197104Sjkim Offset += SubTable->Length; 1410197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length); 1411197104Sjkim } 1412197104Sjkim} 1413197104Sjkim 1414197104Sjkim 1415197104Sjkim/******************************************************************************* 1416197104Sjkim * 1417167802Sjkim * FUNCTION: AcpiDmDumpMadt 1418167802Sjkim * 1419167802Sjkim * PARAMETERS: Table - A MADT table 1420167802Sjkim * 1421167802Sjkim * RETURN: None 1422167802Sjkim * 1423167802Sjkim * DESCRIPTION: Format the contents of a MADT. This table type consists 1424167802Sjkim * of an open-ended number of subtables. 1425167802Sjkim * 1426167802Sjkim ******************************************************************************/ 1427167802Sjkim 1428167802Sjkimvoid 1429167802SjkimAcpiDmDumpMadt ( 1430167802Sjkim ACPI_TABLE_HEADER *Table) 1431167802Sjkim{ 1432193529Sjkim ACPI_STATUS Status; 1433167802Sjkim ACPI_SUBTABLE_HEADER *SubTable; 1434167802Sjkim UINT32 Length = Table->Length; 1435167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MADT); 1436167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 1437167802Sjkim 1438167802Sjkim 1439167802Sjkim /* Main table */ 1440167802Sjkim 1441193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt); 1442193529Sjkim if (ACPI_FAILURE (Status)) 1443193529Sjkim { 1444193529Sjkim return; 1445193529Sjkim } 1446167802Sjkim 1447167802Sjkim /* Sub-tables */ 1448167802Sjkim 1449167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 1450167802Sjkim while (Offset < Table->Length) 1451167802Sjkim { 1452167802Sjkim /* Common sub-table header */ 1453167802Sjkim 1454167802Sjkim AcpiOsPrintf ("\n"); 1455193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1456193529Sjkim SubTable->Length, AcpiDmTableInfoMadtHdr); 1457193529Sjkim if (ACPI_FAILURE (Status)) 1458193529Sjkim { 1459193529Sjkim return; 1460193529Sjkim } 1461167802Sjkim 1462167802Sjkim switch (SubTable->Type) 1463167802Sjkim { 1464167802Sjkim case ACPI_MADT_TYPE_LOCAL_APIC: 1465167802Sjkim InfoTable = AcpiDmTableInfoMadt0; 1466167802Sjkim break; 1467167802Sjkim case ACPI_MADT_TYPE_IO_APIC: 1468167802Sjkim InfoTable = AcpiDmTableInfoMadt1; 1469167802Sjkim break; 1470167802Sjkim case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 1471167802Sjkim InfoTable = AcpiDmTableInfoMadt2; 1472167802Sjkim break; 1473167802Sjkim case ACPI_MADT_TYPE_NMI_SOURCE: 1474167802Sjkim InfoTable = AcpiDmTableInfoMadt3; 1475167802Sjkim break; 1476167802Sjkim case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 1477167802Sjkim InfoTable = AcpiDmTableInfoMadt4; 1478167802Sjkim break; 1479167802Sjkim case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 1480167802Sjkim InfoTable = AcpiDmTableInfoMadt5; 1481167802Sjkim break; 1482167802Sjkim case ACPI_MADT_TYPE_IO_SAPIC: 1483167802Sjkim InfoTable = AcpiDmTableInfoMadt6; 1484167802Sjkim break; 1485167802Sjkim case ACPI_MADT_TYPE_LOCAL_SAPIC: 1486167802Sjkim InfoTable = AcpiDmTableInfoMadt7; 1487167802Sjkim break; 1488167802Sjkim case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 1489167802Sjkim InfoTable = AcpiDmTableInfoMadt8; 1490167802Sjkim break; 1491193529Sjkim case ACPI_MADT_TYPE_LOCAL_X2APIC: 1492193529Sjkim InfoTable = AcpiDmTableInfoMadt9; 1493193529Sjkim break; 1494193529Sjkim case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 1495193529Sjkim InfoTable = AcpiDmTableInfoMadt10; 1496193529Sjkim break; 1497228110Sjkim case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 1498228110Sjkim InfoTable = AcpiDmTableInfoMadt11; 1499228110Sjkim break; 1500228110Sjkim case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 1501228110Sjkim InfoTable = AcpiDmTableInfoMadt12; 1502228110Sjkim break; 1503167802Sjkim default: 1504204773Sjkim AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type); 1505193529Sjkim 1506193529Sjkim /* Attempt to continue */ 1507193529Sjkim 1508193529Sjkim if (!SubTable->Length) 1509193529Sjkim { 1510193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1511193529Sjkim return; 1512193529Sjkim } 1513193529Sjkim goto NextSubTable; 1514193529Sjkim } 1515193529Sjkim 1516193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1517193529Sjkim SubTable->Length, InfoTable); 1518193529Sjkim if (ACPI_FAILURE (Status)) 1519193529Sjkim { 1520167802Sjkim return; 1521167802Sjkim } 1522167802Sjkim 1523193529SjkimNextSubTable: 1524167802Sjkim /* Point to next sub-table */ 1525167802Sjkim 1526167802Sjkim Offset += SubTable->Length; 1527167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length); 1528167802Sjkim } 1529167802Sjkim} 1530167802Sjkim 1531167802Sjkim 1532167802Sjkim/******************************************************************************* 1533167802Sjkim * 1534167802Sjkim * FUNCTION: AcpiDmDumpMcfg 1535167802Sjkim * 1536167802Sjkim * PARAMETERS: Table - A MCFG Table 1537167802Sjkim * 1538167802Sjkim * RETURN: None 1539167802Sjkim * 1540167802Sjkim * DESCRIPTION: Format the contents of a MCFG table 1541167802Sjkim * 1542167802Sjkim ******************************************************************************/ 1543167802Sjkim 1544167802Sjkimvoid 1545167802SjkimAcpiDmDumpMcfg ( 1546167802Sjkim ACPI_TABLE_HEADER *Table) 1547167802Sjkim{ 1548193529Sjkim ACPI_STATUS Status; 1549167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MCFG); 1550167802Sjkim ACPI_MCFG_ALLOCATION *SubTable; 1551167802Sjkim 1552167802Sjkim 1553167802Sjkim /* Main table */ 1554167802Sjkim 1555193529Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); 1556193529Sjkim if (ACPI_FAILURE (Status)) 1557193529Sjkim { 1558193529Sjkim return; 1559193529Sjkim } 1560167802Sjkim 1561167802Sjkim /* Sub-tables */ 1562167802Sjkim 1563167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); 1564167802Sjkim while (Offset < Table->Length) 1565167802Sjkim { 1566167802Sjkim if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) 1567167802Sjkim { 1568209746Sjkim AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", 1569167802Sjkim sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); 1570167802Sjkim return; 1571167802Sjkim } 1572167802Sjkim 1573167802Sjkim AcpiOsPrintf ("\n"); 1574193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1575193529Sjkim sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); 1576193529Sjkim if (ACPI_FAILURE (Status)) 1577193529Sjkim { 1578193529Sjkim return; 1579193529Sjkim } 1580167802Sjkim 1581167802Sjkim /* Point to next sub-table (each subtable is of fixed length) */ 1582167802Sjkim 1583167802Sjkim Offset += sizeof (ACPI_MCFG_ALLOCATION); 1584167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable, 1585167802Sjkim sizeof (ACPI_MCFG_ALLOCATION)); 1586167802Sjkim } 1587167802Sjkim} 1588167802Sjkim 1589167802Sjkim 1590167802Sjkim/******************************************************************************* 1591167802Sjkim * 1592228110Sjkim * FUNCTION: AcpiDmDumpMpst 1593228110Sjkim * 1594228110Sjkim * PARAMETERS: Table - A MPST Table 1595228110Sjkim * 1596228110Sjkim * RETURN: None 1597228110Sjkim * 1598228110Sjkim * DESCRIPTION: Format the contents of a MPST table 1599228110Sjkim * 1600228110Sjkim ******************************************************************************/ 1601228110Sjkim 1602228110Sjkimvoid 1603228110SjkimAcpiDmDumpMpst ( 1604228110Sjkim ACPI_TABLE_HEADER *Table) 1605228110Sjkim{ 1606228110Sjkim ACPI_STATUS Status; 1607228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MPST); 1608228110Sjkim ACPI_MPST_POWER_NODE *SubTable0; 1609228110Sjkim ACPI_MPST_POWER_STATE *SubTable0A; 1610228110Sjkim ACPI_MPST_COMPONENT *SubTable0B; 1611228110Sjkim ACPI_MPST_DATA_HDR *SubTable1; 1612228110Sjkim ACPI_MPST_POWER_DATA *SubTable2; 1613228110Sjkim UINT16 SubtableCount; 1614241973Sjkim UINT32 PowerStateCount; 1615241973Sjkim UINT32 ComponentCount; 1616228110Sjkim 1617228110Sjkim 1618228110Sjkim /* Main table */ 1619228110Sjkim 1620228110Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); 1621228110Sjkim if (ACPI_FAILURE (Status)) 1622228110Sjkim { 1623228110Sjkim return; 1624228110Sjkim } 1625228110Sjkim 1626228110Sjkim /* Subtable: Memory Power Node(s) */ 1627228110Sjkim 1628228110Sjkim SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; 1629228110Sjkim SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); 1630228110Sjkim 1631228110Sjkim while ((Offset < Table->Length) && SubtableCount) 1632228110Sjkim { 1633228110Sjkim AcpiOsPrintf ("\n"); 1634228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0, 1635228110Sjkim sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); 1636228110Sjkim if (ACPI_FAILURE (Status)) 1637228110Sjkim { 1638228110Sjkim return; 1639228110Sjkim } 1640228110Sjkim 1641228110Sjkim /* Extract the sub-subtable counts */ 1642228110Sjkim 1643228110Sjkim PowerStateCount = SubTable0->NumPowerStates; 1644228110Sjkim ComponentCount = SubTable0->NumPhysicalComponents; 1645228110Sjkim Offset += sizeof (ACPI_MPST_POWER_NODE); 1646228110Sjkim 1647228110Sjkim /* Sub-subtables - Memory Power State Structure(s) */ 1648228110Sjkim 1649228110Sjkim SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0, 1650228110Sjkim sizeof (ACPI_MPST_POWER_NODE)); 1651228110Sjkim 1652228110Sjkim while (PowerStateCount) 1653228110Sjkim { 1654228110Sjkim AcpiOsPrintf ("\n"); 1655228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A, 1656228110Sjkim sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); 1657228110Sjkim if (ACPI_FAILURE (Status)) 1658228110Sjkim { 1659228110Sjkim return; 1660228110Sjkim } 1661228110Sjkim 1662228110Sjkim SubTable0A++; 1663228110Sjkim PowerStateCount--; 1664228110Sjkim Offset += sizeof (ACPI_MPST_POWER_STATE); 1665228110Sjkim } 1666228110Sjkim 1667228110Sjkim /* Sub-subtables - Physical Component ID Structure(s) */ 1668228110Sjkim 1669228110Sjkim SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A); 1670228110Sjkim 1671228110Sjkim if (ComponentCount) 1672228110Sjkim { 1673228110Sjkim AcpiOsPrintf ("\n"); 1674228110Sjkim } 1675228110Sjkim 1676228110Sjkim while (ComponentCount) 1677228110Sjkim { 1678228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B, 1679228110Sjkim sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); 1680228110Sjkim if (ACPI_FAILURE (Status)) 1681228110Sjkim { 1682228110Sjkim return; 1683228110Sjkim } 1684228110Sjkim 1685228110Sjkim SubTable0B++; 1686228110Sjkim ComponentCount--; 1687228110Sjkim Offset += sizeof (ACPI_MPST_COMPONENT); 1688228110Sjkim } 1689228110Sjkim 1690228110Sjkim /* Point to next Memory Power Node subtable */ 1691228110Sjkim 1692228110Sjkim SubtableCount--; 1693228110Sjkim SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0, 1694228110Sjkim sizeof (ACPI_MPST_POWER_NODE) + 1695228110Sjkim (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) + 1696228110Sjkim (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents)); 1697228110Sjkim } 1698228110Sjkim 1699228110Sjkim /* Subtable: Count of Memory Power State Characteristic structures */ 1700228110Sjkim 1701228110Sjkim AcpiOsPrintf ("\n"); 1702228110Sjkim SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0); 1703228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1, 1704228110Sjkim sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); 1705228110Sjkim if (ACPI_FAILURE (Status)) 1706228110Sjkim { 1707228110Sjkim return; 1708228110Sjkim } 1709228110Sjkim 1710228110Sjkim SubtableCount = SubTable1->CharacteristicsCount; 1711228110Sjkim Offset += sizeof (ACPI_MPST_DATA_HDR); 1712228110Sjkim 1713228110Sjkim /* Subtable: Memory Power State Characteristics structure(s) */ 1714228110Sjkim 1715228110Sjkim SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR)); 1716228110Sjkim 1717228110Sjkim while ((Offset < Table->Length) && SubtableCount) 1718228110Sjkim { 1719228110Sjkim AcpiOsPrintf ("\n"); 1720228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2, 1721228110Sjkim sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); 1722228110Sjkim if (ACPI_FAILURE (Status)) 1723228110Sjkim { 1724228110Sjkim return; 1725228110Sjkim } 1726228110Sjkim 1727228110Sjkim SubTable2++; 1728228110Sjkim SubtableCount--; 1729228110Sjkim Offset += sizeof (ACPI_MPST_POWER_DATA); 1730228110Sjkim } 1731228110Sjkim} 1732228110Sjkim 1733228110Sjkim 1734228110Sjkim/******************************************************************************* 1735228110Sjkim * 1736197104Sjkim * FUNCTION: AcpiDmDumpMsct 1737197104Sjkim * 1738197104Sjkim * PARAMETERS: Table - A MSCT table 1739197104Sjkim * 1740197104Sjkim * RETURN: None 1741197104Sjkim * 1742197104Sjkim * DESCRIPTION: Format the contents of a MSCT 1743197104Sjkim * 1744197104Sjkim ******************************************************************************/ 1745197104Sjkim 1746197104Sjkimvoid 1747197104SjkimAcpiDmDumpMsct ( 1748197104Sjkim ACPI_TABLE_HEADER *Table) 1749197104Sjkim{ 1750197104Sjkim ACPI_STATUS Status; 1751197104Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MSCT); 1752197104Sjkim ACPI_MSCT_PROXIMITY *SubTable; 1753197104Sjkim 1754197104Sjkim 1755197104Sjkim /* Main table */ 1756197104Sjkim 1757197104Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); 1758197104Sjkim if (ACPI_FAILURE (Status)) 1759197104Sjkim { 1760197104Sjkim return; 1761197104Sjkim } 1762197104Sjkim 1763197104Sjkim /* Sub-tables */ 1764197104Sjkim 1765197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); 1766197104Sjkim while (Offset < Table->Length) 1767197104Sjkim { 1768197104Sjkim /* Common sub-table header */ 1769197104Sjkim 1770197104Sjkim AcpiOsPrintf ("\n"); 1771197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1772197104Sjkim sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); 1773197104Sjkim if (ACPI_FAILURE (Status)) 1774197104Sjkim { 1775197104Sjkim return; 1776197104Sjkim } 1777197104Sjkim 1778197104Sjkim /* Point to next sub-table */ 1779197104Sjkim 1780197104Sjkim Offset += sizeof (ACPI_MSCT_PROXIMITY); 1781197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY)); 1782197104Sjkim } 1783197104Sjkim} 1784197104Sjkim 1785197104Sjkim 1786197104Sjkim/******************************************************************************* 1787197104Sjkim * 1788228110Sjkim * FUNCTION: AcpiDmDumpPcct 1789228110Sjkim * 1790228110Sjkim * PARAMETERS: Table - A PCCT table 1791228110Sjkim * 1792228110Sjkim * RETURN: None 1793228110Sjkim * 1794228110Sjkim * DESCRIPTION: Format the contents of a PCCT. This table type consists 1795228110Sjkim * of an open-ended number of subtables. 1796228110Sjkim * 1797228110Sjkim ******************************************************************************/ 1798228110Sjkim 1799228110Sjkimvoid 1800228110SjkimAcpiDmDumpPcct ( 1801228110Sjkim ACPI_TABLE_HEADER *Table) 1802228110Sjkim{ 1803228110Sjkim ACPI_STATUS Status; 1804228110Sjkim ACPI_PCCT_SUBSPACE *SubTable; 1805228110Sjkim UINT32 Length = Table->Length; 1806228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_PCCT); 1807228110Sjkim 1808228110Sjkim 1809228110Sjkim /* Main table */ 1810228110Sjkim 1811228110Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); 1812228110Sjkim if (ACPI_FAILURE (Status)) 1813228110Sjkim { 1814228110Sjkim return; 1815228110Sjkim } 1816228110Sjkim 1817228110Sjkim /* Sub-tables */ 1818228110Sjkim 1819228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); 1820228110Sjkim while (Offset < Table->Length) 1821228110Sjkim { 1822228110Sjkim AcpiOsPrintf ("\n"); 1823228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1824228110Sjkim SubTable->Header.Length, AcpiDmTableInfoPcct0); 1825228110Sjkim if (ACPI_FAILURE (Status)) 1826228110Sjkim { 1827228110Sjkim return; 1828228110Sjkim } 1829228110Sjkim 1830228110Sjkim /* Point to next sub-table */ 1831228110Sjkim 1832228110Sjkim Offset += SubTable->Header.Length; 1833228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable, 1834228110Sjkim SubTable->Header.Length); 1835228110Sjkim } 1836228110Sjkim} 1837228110Sjkim 1838228110Sjkim 1839228110Sjkim/******************************************************************************* 1840228110Sjkim * 1841228110Sjkim * FUNCTION: AcpiDmDumpPmtt 1842228110Sjkim * 1843228110Sjkim * PARAMETERS: Table - A PMTT table 1844228110Sjkim * 1845228110Sjkim * RETURN: None 1846228110Sjkim * 1847228110Sjkim * DESCRIPTION: Format the contents of a PMTT. This table type consists 1848228110Sjkim * of an open-ended number of subtables. 1849228110Sjkim * 1850228110Sjkim ******************************************************************************/ 1851228110Sjkim 1852228110Sjkimvoid 1853228110SjkimAcpiDmDumpPmtt ( 1854228110Sjkim ACPI_TABLE_HEADER *Table) 1855228110Sjkim{ 1856228110Sjkim ACPI_STATUS Status; 1857228110Sjkim ACPI_PMTT_HEADER *SubTable; 1858228110Sjkim ACPI_PMTT_HEADER *MemSubTable; 1859228110Sjkim ACPI_PMTT_HEADER *DimmSubTable; 1860228110Sjkim ACPI_PMTT_DOMAIN *DomainArray; 1861228110Sjkim UINT32 Length = Table->Length; 1862228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_PMTT); 1863228110Sjkim UINT32 MemOffset; 1864228110Sjkim UINT32 DimmOffset; 1865228110Sjkim UINT32 DomainOffset; 1866228110Sjkim UINT32 DomainCount; 1867228110Sjkim 1868228110Sjkim 1869228110Sjkim /* Main table */ 1870228110Sjkim 1871228110Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt); 1872228110Sjkim if (ACPI_FAILURE (Status)) 1873228110Sjkim { 1874228110Sjkim return; 1875228110Sjkim } 1876228110Sjkim 1877228110Sjkim /* Subtables */ 1878228110Sjkim 1879228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); 1880228110Sjkim while (Offset < Table->Length) 1881228110Sjkim { 1882228110Sjkim /* Common subtable header */ 1883228110Sjkim 1884228110Sjkim AcpiOsPrintf ("\n"); 1885228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1886228110Sjkim SubTable->Length, AcpiDmTableInfoPmttHdr); 1887228110Sjkim if (ACPI_FAILURE (Status)) 1888228110Sjkim { 1889228110Sjkim return; 1890228110Sjkim } 1891228110Sjkim 1892228110Sjkim /* Only Socket subtables are expected at this level */ 1893228110Sjkim 1894228110Sjkim if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET) 1895228110Sjkim { 1896228110Sjkim AcpiOsPrintf ( 1897228110Sjkim "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1898228110Sjkim SubTable->Type); 1899228110Sjkim return; 1900228110Sjkim } 1901228110Sjkim 1902228110Sjkim /* Dump the fixed-length portion of the subtable */ 1903228110Sjkim 1904228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1905228110Sjkim SubTable->Length, AcpiDmTableInfoPmtt0); 1906228110Sjkim if (ACPI_FAILURE (Status)) 1907228110Sjkim { 1908228110Sjkim return; 1909228110Sjkim } 1910228110Sjkim 1911228110Sjkim /* Walk the memory controller subtables */ 1912228110Sjkim 1913228110Sjkim MemOffset = sizeof (ACPI_PMTT_SOCKET); 1914228110Sjkim MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable, 1915228110Sjkim sizeof (ACPI_PMTT_SOCKET)); 1916228110Sjkim 1917228110Sjkim while (((Offset + MemOffset) < Table->Length) && 1918228110Sjkim (MemOffset < SubTable->Length)) 1919228110Sjkim { 1920228110Sjkim /* Common subtable header */ 1921228110Sjkim 1922228110Sjkim AcpiOsPrintf ("\n"); 1923228110Sjkim Status = AcpiDmDumpTable (Length, 1924228110Sjkim Offset + MemOffset, MemSubTable, 1925228110Sjkim MemSubTable->Length, AcpiDmTableInfoPmttHdr); 1926228110Sjkim if (ACPI_FAILURE (Status)) 1927228110Sjkim { 1928228110Sjkim return; 1929228110Sjkim } 1930228110Sjkim 1931228110Sjkim /* Only memory controller subtables are expected at this level */ 1932228110Sjkim 1933228110Sjkim if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER) 1934228110Sjkim { 1935228110Sjkim AcpiOsPrintf ( 1936228110Sjkim "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1937228110Sjkim MemSubTable->Type); 1938228110Sjkim return; 1939228110Sjkim } 1940228110Sjkim 1941228110Sjkim /* Dump the fixed-length portion of the controller subtable */ 1942228110Sjkim 1943228110Sjkim Status = AcpiDmDumpTable (Length, 1944228110Sjkim Offset + MemOffset, MemSubTable, 1945228110Sjkim MemSubTable->Length, AcpiDmTableInfoPmtt1); 1946228110Sjkim if (ACPI_FAILURE (Status)) 1947228110Sjkim { 1948228110Sjkim return; 1949228110Sjkim } 1950228110Sjkim 1951228110Sjkim /* Walk the variable count of proximity domains */ 1952228110Sjkim 1953228110Sjkim DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount; 1954228110Sjkim DomainOffset = sizeof (ACPI_PMTT_CONTROLLER); 1955228110Sjkim DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable, 1956228110Sjkim sizeof (ACPI_PMTT_CONTROLLER)); 1957228110Sjkim 1958228110Sjkim while (((Offset + MemOffset + DomainOffset) < Table->Length) && 1959228110Sjkim ((MemOffset + DomainOffset) < SubTable->Length) && 1960228110Sjkim DomainCount) 1961228110Sjkim { 1962228110Sjkim Status = AcpiDmDumpTable (Length, 1963228110Sjkim Offset + MemOffset + DomainOffset, DomainArray, 1964228110Sjkim sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a); 1965228110Sjkim if (ACPI_FAILURE (Status)) 1966228110Sjkim { 1967228110Sjkim return; 1968228110Sjkim } 1969228110Sjkim 1970228110Sjkim DomainOffset += sizeof (ACPI_PMTT_DOMAIN); 1971228110Sjkim DomainArray++; 1972228110Sjkim DomainCount--; 1973228110Sjkim } 1974228110Sjkim 1975228110Sjkim if (DomainCount) 1976228110Sjkim { 1977228110Sjkim AcpiOsPrintf ( 1978228110Sjkim "\n**** DomainCount exceeds subtable length\n\n", 1979228110Sjkim MemSubTable->Type); 1980228110Sjkim } 1981228110Sjkim 1982228110Sjkim /* Walk the physical component (DIMM) subtables */ 1983228110Sjkim 1984228110Sjkim DimmOffset = DomainOffset; 1985228110Sjkim DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable, 1986228110Sjkim DomainOffset); 1987228110Sjkim 1988228110Sjkim while (((Offset + MemOffset + DimmOffset) < Table->Length) && 1989228110Sjkim (DimmOffset < MemSubTable->Length)) 1990228110Sjkim { 1991228110Sjkim /* Common subtable header */ 1992228110Sjkim 1993228110Sjkim AcpiOsPrintf ("\n"); 1994228110Sjkim Status = AcpiDmDumpTable (Length, 1995228110Sjkim Offset + MemOffset + DimmOffset, DimmSubTable, 1996228110Sjkim DimmSubTable->Length, AcpiDmTableInfoPmttHdr); 1997228110Sjkim if (ACPI_FAILURE (Status)) 1998228110Sjkim { 1999228110Sjkim return; 2000228110Sjkim } 2001228110Sjkim 2002228110Sjkim /* Only DIMM subtables are expected at this level */ 2003228110Sjkim 2004228110Sjkim if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM) 2005228110Sjkim { 2006228110Sjkim AcpiOsPrintf ( 2007228110Sjkim "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 2008228110Sjkim DimmSubTable->Type); 2009228110Sjkim return; 2010228110Sjkim } 2011228110Sjkim 2012228110Sjkim /* Dump the fixed-length DIMM subtable */ 2013228110Sjkim 2014228110Sjkim Status = AcpiDmDumpTable (Length, 2015228110Sjkim Offset + MemOffset + DimmOffset, DimmSubTable, 2016228110Sjkim DimmSubTable->Length, AcpiDmTableInfoPmtt2); 2017228110Sjkim if (ACPI_FAILURE (Status)) 2018228110Sjkim { 2019228110Sjkim return; 2020228110Sjkim } 2021228110Sjkim 2022228110Sjkim /* Point to next DIMM subtable */ 2023228110Sjkim 2024228110Sjkim DimmOffset += DimmSubTable->Length; 2025228110Sjkim DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 2026228110Sjkim DimmSubTable, DimmSubTable->Length); 2027228110Sjkim } 2028228110Sjkim 2029228110Sjkim /* Point to next Controller subtable */ 2030228110Sjkim 2031228110Sjkim MemOffset += MemSubTable->Length; 2032228110Sjkim MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 2033228110Sjkim MemSubTable, MemSubTable->Length); 2034228110Sjkim } 2035228110Sjkim 2036228110Sjkim /* Point to next Socket subtable */ 2037228110Sjkim 2038228110Sjkim Offset += SubTable->Length; 2039228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 2040228110Sjkim SubTable, SubTable->Length); 2041228110Sjkim } 2042228110Sjkim} 2043228110Sjkim 2044228110Sjkim 2045228110Sjkim/******************************************************************************* 2046228110Sjkim * 2047228110Sjkim * FUNCTION: AcpiDmDumpS3pt 2048228110Sjkim * 2049228110Sjkim * PARAMETERS: Table - A S3PT table 2050228110Sjkim * 2051228110Sjkim * RETURN: Length of the table 2052228110Sjkim * 2053228110Sjkim * DESCRIPTION: Format the contents of a S3PT 2054228110Sjkim * 2055228110Sjkim ******************************************************************************/ 2056228110Sjkim 2057228110SjkimUINT32 2058228110SjkimAcpiDmDumpS3pt ( 2059228110Sjkim ACPI_TABLE_HEADER *Tables) 2060228110Sjkim{ 2061228110Sjkim ACPI_STATUS Status; 2062228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_S3PT); 2063228110Sjkim ACPI_S3PT_HEADER *SubTable; 2064228110Sjkim ACPI_DMTABLE_INFO *InfoTable; 2065228110Sjkim ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); 2066228110Sjkim 2067228110Sjkim 2068228110Sjkim /* Main table */ 2069228110Sjkim 2070228110Sjkim Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt); 2071228110Sjkim if (ACPI_FAILURE (Status)) 2072228110Sjkim { 2073228110Sjkim return 0; 2074228110Sjkim } 2075228110Sjkim 2076228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset); 2077228110Sjkim while (Offset < S3ptTable->Length) 2078228110Sjkim { 2079228110Sjkim /* Common sub-table header */ 2080228110Sjkim 2081228110Sjkim AcpiOsPrintf ("\n"); 2082228110Sjkim Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 2083228110Sjkim SubTable->Length, AcpiDmTableInfoS3ptHdr); 2084228110Sjkim if (ACPI_FAILURE (Status)) 2085228110Sjkim { 2086228110Sjkim return 0; 2087228110Sjkim } 2088228110Sjkim 2089228110Sjkim switch (SubTable->Type) 2090228110Sjkim { 2091228110Sjkim case ACPI_S3PT_TYPE_RESUME: 2092228110Sjkim InfoTable = AcpiDmTableInfoS3pt0; 2093228110Sjkim break; 2094228110Sjkim case ACPI_S3PT_TYPE_SUSPEND: 2095228110Sjkim InfoTable = AcpiDmTableInfoS3pt1; 2096228110Sjkim break; 2097228110Sjkim default: 2098228110Sjkim AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable->Type); 2099228110Sjkim 2100228110Sjkim /* Attempt to continue */ 2101228110Sjkim 2102228110Sjkim if (!SubTable->Length) 2103228110Sjkim { 2104228110Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 2105228110Sjkim return 0; 2106228110Sjkim } 2107228110Sjkim goto NextSubTable; 2108228110Sjkim } 2109228110Sjkim 2110228110Sjkim AcpiOsPrintf ("\n"); 2111228110Sjkim Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 2112228110Sjkim SubTable->Length, InfoTable); 2113228110Sjkim if (ACPI_FAILURE (Status)) 2114228110Sjkim { 2115228110Sjkim return 0; 2116228110Sjkim } 2117228110Sjkim 2118228110SjkimNextSubTable: 2119228110Sjkim /* Point to next sub-table */ 2120228110Sjkim 2121228110Sjkim Offset += SubTable->Length; 2122228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length); 2123228110Sjkim } 2124228110Sjkim 2125228110Sjkim return (S3ptTable->Length); 2126228110Sjkim} 2127228110Sjkim 2128228110Sjkim 2129228110Sjkim/******************************************************************************* 2130228110Sjkim * 2131219707Sjkim * FUNCTION: AcpiDmDumpSlic 2132219707Sjkim * 2133219707Sjkim * PARAMETERS: Table - A SLIC table 2134219707Sjkim * 2135219707Sjkim * RETURN: None 2136219707Sjkim * 2137219707Sjkim * DESCRIPTION: Format the contents of a SLIC 2138219707Sjkim * 2139219707Sjkim ******************************************************************************/ 2140219707Sjkim 2141219707Sjkimvoid 2142219707SjkimAcpiDmDumpSlic ( 2143219707Sjkim ACPI_TABLE_HEADER *Table) 2144219707Sjkim{ 2145219707Sjkim ACPI_STATUS Status; 2146219707Sjkim UINT32 Offset = sizeof (ACPI_TABLE_SLIC); 2147219707Sjkim ACPI_SLIC_HEADER *SubTable; 2148219707Sjkim ACPI_DMTABLE_INFO *InfoTable; 2149219707Sjkim 2150219707Sjkim 2151219707Sjkim /* There is no main SLIC table, only subtables */ 2152219707Sjkim 2153219707Sjkim SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset); 2154219707Sjkim while (Offset < Table->Length) 2155219707Sjkim { 2156219707Sjkim /* Common sub-table header */ 2157219707Sjkim 2158219707Sjkim AcpiOsPrintf ("\n"); 2159219707Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2160219707Sjkim SubTable->Length, AcpiDmTableInfoSlicHdr); 2161219707Sjkim if (ACPI_FAILURE (Status)) 2162219707Sjkim { 2163219707Sjkim return; 2164219707Sjkim } 2165219707Sjkim 2166219707Sjkim switch (SubTable->Type) 2167219707Sjkim { 2168219707Sjkim case ACPI_SLIC_TYPE_PUBLIC_KEY: 2169219707Sjkim InfoTable = AcpiDmTableInfoSlic0; 2170219707Sjkim break; 2171219707Sjkim case ACPI_SLIC_TYPE_WINDOWS_MARKER: 2172219707Sjkim InfoTable = AcpiDmTableInfoSlic1; 2173219707Sjkim break; 2174219707Sjkim default: 2175219707Sjkim AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type); 2176219707Sjkim 2177219707Sjkim /* Attempt to continue */ 2178219707Sjkim 2179219707Sjkim if (!SubTable->Length) 2180219707Sjkim { 2181219707Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 2182219707Sjkim return; 2183219707Sjkim } 2184219707Sjkim goto NextSubTable; 2185219707Sjkim } 2186219707Sjkim 2187219707Sjkim AcpiOsPrintf ("\n"); 2188219707Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2189219707Sjkim SubTable->Length, InfoTable); 2190219707Sjkim if (ACPI_FAILURE (Status)) 2191219707Sjkim { 2192219707Sjkim return; 2193219707Sjkim } 2194219707Sjkim 2195219707SjkimNextSubTable: 2196219707Sjkim /* Point to next sub-table */ 2197219707Sjkim 2198219707Sjkim Offset += SubTable->Length; 2199219707Sjkim SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length); 2200219707Sjkim } 2201219707Sjkim} 2202219707Sjkim 2203219707Sjkim 2204219707Sjkim/******************************************************************************* 2205219707Sjkim * 2206167802Sjkim * FUNCTION: AcpiDmDumpSlit 2207167802Sjkim * 2208167802Sjkim * PARAMETERS: Table - An SLIT 2209167802Sjkim * 2210167802Sjkim * RETURN: None 2211167802Sjkim * 2212167802Sjkim * DESCRIPTION: Format the contents of a SLIT 2213167802Sjkim * 2214167802Sjkim ******************************************************************************/ 2215167802Sjkim 2216167802Sjkimvoid 2217167802SjkimAcpiDmDumpSlit ( 2218167802Sjkim ACPI_TABLE_HEADER *Table) 2219167802Sjkim{ 2220193529Sjkim ACPI_STATUS Status; 2221167802Sjkim UINT32 Offset; 2222167802Sjkim UINT8 *Row; 2223167802Sjkim UINT32 Localities; 2224167802Sjkim UINT32 i; 2225167802Sjkim UINT32 j; 2226167802Sjkim 2227167802Sjkim 2228167802Sjkim /* Main table */ 2229167802Sjkim 2230193529Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit); 2231193529Sjkim if (ACPI_FAILURE (Status)) 2232193529Sjkim { 2233193529Sjkim return; 2234193529Sjkim } 2235167802Sjkim 2236167802Sjkim /* Display the Locality NxN Matrix */ 2237167802Sjkim 2238167802Sjkim Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount; 2239167802Sjkim Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]); 2240167802Sjkim Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry; 2241167802Sjkim 2242167802Sjkim for (i = 0; i < Localities; i++) 2243167802Sjkim { 2244167802Sjkim /* Display one row of the matrix */ 2245167802Sjkim 2246167802Sjkim AcpiDmLineHeader2 (Offset, Localities, "Locality", i); 2247167802Sjkim for (j = 0; j < Localities; j++) 2248167802Sjkim { 2249167802Sjkim /* Check for beyond EOT */ 2250167802Sjkim 2251167802Sjkim if (Offset >= Table->Length) 2252167802Sjkim { 2253167802Sjkim AcpiOsPrintf ("\n**** Not enough room in table for all localities\n"); 2254167802Sjkim return; 2255167802Sjkim } 2256167802Sjkim 2257209746Sjkim AcpiOsPrintf ("%2.2X", Row[j]); 2258167802Sjkim Offset++; 2259167802Sjkim 2260167802Sjkim /* Display up to 16 bytes per output row */ 2261167802Sjkim 2262209746Sjkim if ((j+1) < Localities) 2263167802Sjkim { 2264220663Sjkim AcpiOsPrintf (" "); 2265209746Sjkim 2266209746Sjkim if (j && (((j+1) % 16) == 0)) 2267209746Sjkim { 2268220663Sjkim AcpiOsPrintf ("\\\n"); /* With line continuation char */ 2269220663Sjkim AcpiDmLineHeader (Offset, 0, NULL); 2270209746Sjkim } 2271167802Sjkim } 2272167802Sjkim } 2273167802Sjkim 2274167802Sjkim /* Point to next row */ 2275167802Sjkim 2276167802Sjkim AcpiOsPrintf ("\n"); 2277167802Sjkim Row += Localities; 2278167802Sjkim } 2279167802Sjkim} 2280167802Sjkim 2281167802Sjkim 2282167802Sjkim/******************************************************************************* 2283167802Sjkim * 2284167802Sjkim * FUNCTION: AcpiDmDumpSrat 2285167802Sjkim * 2286167802Sjkim * PARAMETERS: Table - A SRAT table 2287167802Sjkim * 2288167802Sjkim * RETURN: None 2289167802Sjkim * 2290167802Sjkim * DESCRIPTION: Format the contents of a SRAT 2291167802Sjkim * 2292167802Sjkim ******************************************************************************/ 2293167802Sjkim 2294167802Sjkimvoid 2295167802SjkimAcpiDmDumpSrat ( 2296167802Sjkim ACPI_TABLE_HEADER *Table) 2297167802Sjkim{ 2298193529Sjkim ACPI_STATUS Status; 2299167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_SRAT); 2300167802Sjkim ACPI_SUBTABLE_HEADER *SubTable; 2301167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 2302167802Sjkim 2303167802Sjkim 2304167802Sjkim /* Main table */ 2305167802Sjkim 2306193529Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat); 2307193529Sjkim if (ACPI_FAILURE (Status)) 2308193529Sjkim { 2309193529Sjkim return; 2310193529Sjkim } 2311167802Sjkim 2312167802Sjkim /* Sub-tables */ 2313167802Sjkim 2314167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 2315167802Sjkim while (Offset < Table->Length) 2316167802Sjkim { 2317193529Sjkim /* Common sub-table header */ 2318193529Sjkim 2319193529Sjkim AcpiOsPrintf ("\n"); 2320193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2321193529Sjkim SubTable->Length, AcpiDmTableInfoSratHdr); 2322193529Sjkim if (ACPI_FAILURE (Status)) 2323193529Sjkim { 2324193529Sjkim return; 2325193529Sjkim } 2326193529Sjkim 2327167802Sjkim switch (SubTable->Type) 2328167802Sjkim { 2329167802Sjkim case ACPI_SRAT_TYPE_CPU_AFFINITY: 2330167802Sjkim InfoTable = AcpiDmTableInfoSrat0; 2331167802Sjkim break; 2332167802Sjkim case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 2333167802Sjkim InfoTable = AcpiDmTableInfoSrat1; 2334167802Sjkim break; 2335193529Sjkim case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 2336193529Sjkim InfoTable = AcpiDmTableInfoSrat2; 2337193529Sjkim break; 2338167802Sjkim default: 2339204773Sjkim AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type); 2340193529Sjkim 2341193529Sjkim /* Attempt to continue */ 2342193529Sjkim 2343193529Sjkim if (!SubTable->Length) 2344193529Sjkim { 2345193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 2346193529Sjkim return; 2347193529Sjkim } 2348193529Sjkim goto NextSubTable; 2349167802Sjkim } 2350167802Sjkim 2351167802Sjkim AcpiOsPrintf ("\n"); 2352193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2353193529Sjkim SubTable->Length, InfoTable); 2354193529Sjkim if (ACPI_FAILURE (Status)) 2355193529Sjkim { 2356193529Sjkim return; 2357193529Sjkim } 2358167802Sjkim 2359193529SjkimNextSubTable: 2360167802Sjkim /* Point to next sub-table */ 2361167802Sjkim 2362167802Sjkim Offset += SubTable->Length; 2363167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length); 2364167802Sjkim } 2365167802Sjkim} 2366167802Sjkim 2367197104Sjkim 2368197104Sjkim/******************************************************************************* 2369197104Sjkim * 2370197104Sjkim * FUNCTION: AcpiDmDumpWdat 2371197104Sjkim * 2372197104Sjkim * PARAMETERS: Table - A WDAT table 2373197104Sjkim * 2374197104Sjkim * RETURN: None 2375197104Sjkim * 2376197104Sjkim * DESCRIPTION: Format the contents of a WDAT 2377197104Sjkim * 2378197104Sjkim ******************************************************************************/ 2379197104Sjkim 2380197104Sjkimvoid 2381197104SjkimAcpiDmDumpWdat ( 2382197104Sjkim ACPI_TABLE_HEADER *Table) 2383197104Sjkim{ 2384197104Sjkim ACPI_STATUS Status; 2385197104Sjkim UINT32 Offset = sizeof (ACPI_TABLE_WDAT); 2386197104Sjkim ACPI_WDAT_ENTRY *SubTable; 2387197104Sjkim 2388197104Sjkim 2389197104Sjkim /* Main table */ 2390197104Sjkim 2391197104Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat); 2392197104Sjkim if (ACPI_FAILURE (Status)) 2393197104Sjkim { 2394197104Sjkim return; 2395197104Sjkim } 2396197104Sjkim 2397197104Sjkim /* Sub-tables */ 2398197104Sjkim 2399197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); 2400197104Sjkim while (Offset < Table->Length) 2401197104Sjkim { 2402197104Sjkim /* Common sub-table header */ 2403197104Sjkim 2404197104Sjkim AcpiOsPrintf ("\n"); 2405197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2406197104Sjkim sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); 2407197104Sjkim if (ACPI_FAILURE (Status)) 2408197104Sjkim { 2409197104Sjkim return; 2410197104Sjkim } 2411197104Sjkim 2412197104Sjkim /* Point to next sub-table */ 2413197104Sjkim 2414197104Sjkim Offset += sizeof (ACPI_WDAT_ENTRY); 2415197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY)); 2416197104Sjkim } 2417197104Sjkim} 2418