1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8298714Sjkim * Copyright (C) 2000 - 2016, 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 62218590Sjkim 63167802Sjkim/******************************************************************************* 64167802Sjkim * 65239340Sjkim * FUNCTION: AcpiDmDumpBuffer 66239340Sjkim * 67239340Sjkim * PARAMETERS: Table - ACPI Table or subtable 68239340Sjkim * BufferOffset - Offset of buffer from Table above 69239340Sjkim * Length - Length of the buffer 70239340Sjkim * AbsoluteOffset - Offset of buffer in the main ACPI table 71239340Sjkim * Header - Name of the buffer field (printed on the 72239340Sjkim * first line only.) 73239340Sjkim * 74239340Sjkim * RETURN: None 75239340Sjkim * 76239340Sjkim * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the 77239340Sjkim * disassembler output format.) 78239340Sjkim * 79239340Sjkim ******************************************************************************/ 80239340Sjkim 81281396Sjkimvoid 82239340SjkimAcpiDmDumpBuffer ( 83239340Sjkim void *Table, 84239340Sjkim UINT32 BufferOffset, 85239340Sjkim UINT32 Length, 86239340Sjkim UINT32 AbsoluteOffset, 87283092Sjkim char *Header) 88239340Sjkim{ 89239340Sjkim UINT8 *Buffer; 90239340Sjkim UINT32 i; 91239340Sjkim 92239340Sjkim 93239340Sjkim if (!Length) 94239340Sjkim { 95239340Sjkim return; 96239340Sjkim } 97239340Sjkim 98239340Sjkim Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset; 99239340Sjkim i = 0; 100239340Sjkim 101239340Sjkim while (i < Length) 102239340Sjkim { 103239340Sjkim if (!(i % 16)) 104239340Sjkim { 105283092Sjkim /* Insert a backslash - line continuation character */ 106283092Sjkim 107283092Sjkim if (Length > 16) 108281396Sjkim { 109281396Sjkim AcpiOsPrintf ("\\\n "); 110281396Sjkim } 111239340Sjkim } 112239340Sjkim 113239340Sjkim AcpiOsPrintf ("%.02X ", *Buffer); 114239340Sjkim i++; 115239340Sjkim Buffer++; 116239340Sjkim AbsoluteOffset++; 117239340Sjkim } 118239340Sjkim 119239340Sjkim AcpiOsPrintf ("\n"); 120239340Sjkim} 121239340Sjkim 122239340Sjkim 123239340Sjkim/******************************************************************************* 124239340Sjkim * 125283092Sjkim * FUNCTION: AcpiDmDumpUnicode 126283092Sjkim * 127283092Sjkim * PARAMETERS: Table - ACPI Table or subtable 128283092Sjkim * BufferOffset - Offset of buffer from Table above 129283092Sjkim * ByteLength - Length of the buffer 130283092Sjkim * 131283092Sjkim * RETURN: None 132283092Sjkim * 133283092Sjkim * DESCRIPTION: Validate and dump the contents of a buffer that contains 134283092Sjkim * unicode data. The output is a standard ASCII string. If it 135283092Sjkim * appears that the data is not unicode, the buffer is dumped 136283092Sjkim * as hex characters. 137283092Sjkim * 138283092Sjkim ******************************************************************************/ 139283092Sjkim 140283092Sjkimvoid 141283092SjkimAcpiDmDumpUnicode ( 142283092Sjkim void *Table, 143283092Sjkim UINT32 BufferOffset, 144283092Sjkim UINT32 ByteLength) 145283092Sjkim{ 146283092Sjkim UINT8 *Buffer; 147283092Sjkim UINT32 Length; 148283092Sjkim UINT32 i; 149283092Sjkim 150283092Sjkim 151283092Sjkim Buffer = ((UINT8 *) Table) + BufferOffset; 152283092Sjkim Length = ByteLength - 2; /* Last two bytes are the null terminator */ 153283092Sjkim 154283092Sjkim /* Ensure all low bytes are entirely printable ASCII */ 155283092Sjkim 156283092Sjkim for (i = 0; i < Length; i += 2) 157283092Sjkim { 158284583Sjkim if (!isprint (Buffer[i])) 159283092Sjkim { 160283092Sjkim goto DumpRawBuffer; 161283092Sjkim } 162283092Sjkim } 163283092Sjkim 164283092Sjkim /* Ensure all high bytes are zero */ 165283092Sjkim 166283092Sjkim for (i = 1; i < Length; i += 2) 167283092Sjkim { 168283092Sjkim if (Buffer[i]) 169283092Sjkim { 170283092Sjkim goto DumpRawBuffer; 171283092Sjkim } 172283092Sjkim } 173283092Sjkim 174283092Sjkim /* Dump the buffer as a normal string */ 175283092Sjkim 176283092Sjkim AcpiOsPrintf ("\""); 177283092Sjkim for (i = 0; i < Length; i += 2) 178283092Sjkim { 179283092Sjkim AcpiOsPrintf ("%c", Buffer[i]); 180283092Sjkim } 181298714Sjkim 182283092Sjkim AcpiOsPrintf ("\"\n"); 183283092Sjkim return; 184283092Sjkim 185283092SjkimDumpRawBuffer: 186283092Sjkim AcpiDmDumpBuffer (Table, BufferOffset, ByteLength, 187283092Sjkim BufferOffset, NULL); 188283092Sjkim AcpiOsPrintf ("\n"); 189283092Sjkim} 190283092Sjkim 191283092Sjkim 192283092Sjkim/******************************************************************************* 193283092Sjkim * 194167802Sjkim * FUNCTION: AcpiDmDumpRsdp 195167802Sjkim * 196167802Sjkim * PARAMETERS: Table - A RSDP 197167802Sjkim * 198209746Sjkim * RETURN: Length of the table (there is not always a length field, 199209746Sjkim * use revision or length if available (ACPI 2.0+)) 200167802Sjkim * 201167802Sjkim * DESCRIPTION: Format the contents of a RSDP 202167802Sjkim * 203167802Sjkim ******************************************************************************/ 204167802Sjkim 205167802SjkimUINT32 206167802SjkimAcpiDmDumpRsdp ( 207167802Sjkim ACPI_TABLE_HEADER *Table) 208167802Sjkim{ 209209746Sjkim ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table); 210209746Sjkim UINT32 Length = sizeof (ACPI_RSDP_COMMON); 211209746Sjkim UINT8 Checksum; 212285797Sjkim ACPI_STATUS Status; 213167802Sjkim 214167802Sjkim 215167802Sjkim /* Dump the common ACPI 1.0 portion */ 216167802Sjkim 217285797Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1); 218285797Sjkim if (ACPI_FAILURE (Status)) 219285797Sjkim { 220285797Sjkim return (Length); 221285797Sjkim } 222167802Sjkim 223209746Sjkim /* Validate the first checksum */ 224167802Sjkim 225209746Sjkim Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), 226298714Sjkim Rsdp->Checksum); 227209746Sjkim if (Checksum != Rsdp->Checksum) 228167802Sjkim { 229209746Sjkim AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n", 230209746Sjkim Checksum); 231209746Sjkim } 232209746Sjkim 233209746Sjkim /* The RSDP for ACPI 2.0+ contains more data and has a Length field */ 234209746Sjkim 235209746Sjkim if (Rsdp->Revision > 0) 236209746Sjkim { 237209746Sjkim Length = Rsdp->Length; 238285797Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2); 239285797Sjkim if (ACPI_FAILURE (Status)) 240285797Sjkim { 241285797Sjkim return (Length); 242285797Sjkim } 243209746Sjkim 244209746Sjkim /* Validate the extended checksum over entire RSDP */ 245209746Sjkim 246209746Sjkim Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), 247298714Sjkim Rsdp->ExtendedChecksum); 248209746Sjkim if (Checksum != Rsdp->ExtendedChecksum) 249209746Sjkim { 250209746Sjkim AcpiOsPrintf ( 251209746Sjkim "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n", 252209746Sjkim Checksum); 253209746Sjkim } 254167802Sjkim } 255167802Sjkim 256167802Sjkim return (Length); 257167802Sjkim} 258167802Sjkim 259167802Sjkim 260167802Sjkim/******************************************************************************* 261167802Sjkim * 262167802Sjkim * FUNCTION: AcpiDmDumpRsdt 263167802Sjkim * 264167802Sjkim * PARAMETERS: Table - A RSDT 265167802Sjkim * 266167802Sjkim * RETURN: None 267167802Sjkim * 268167802Sjkim * DESCRIPTION: Format the contents of a RSDT 269167802Sjkim * 270167802Sjkim ******************************************************************************/ 271167802Sjkim 272167802Sjkimvoid 273167802SjkimAcpiDmDumpRsdt ( 274167802Sjkim ACPI_TABLE_HEADER *Table) 275167802Sjkim{ 276167802Sjkim UINT32 *Array; 277167802Sjkim UINT32 Entries; 278167802Sjkim UINT32 Offset; 279167802Sjkim UINT32 i; 280167802Sjkim 281167802Sjkim 282167802Sjkim /* Point to start of table pointer array */ 283167802Sjkim 284167802Sjkim Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry; 285167802Sjkim Offset = sizeof (ACPI_TABLE_HEADER); 286167802Sjkim 287167802Sjkim /* RSDT uses 32-bit pointers */ 288167802Sjkim 289167802Sjkim Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); 290167802Sjkim 291167802Sjkim for (i = 0; i < Entries; i++) 292167802Sjkim { 293167802Sjkim AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i); 294167802Sjkim AcpiOsPrintf ("%8.8X\n", Array[i]); 295167802Sjkim Offset += sizeof (UINT32); 296167802Sjkim } 297167802Sjkim} 298167802Sjkim 299167802Sjkim 300167802Sjkim/******************************************************************************* 301167802Sjkim * 302167802Sjkim * FUNCTION: AcpiDmDumpXsdt 303167802Sjkim * 304167802Sjkim * PARAMETERS: Table - A XSDT 305167802Sjkim * 306167802Sjkim * RETURN: None 307167802Sjkim * 308167802Sjkim * DESCRIPTION: Format the contents of a XSDT 309167802Sjkim * 310167802Sjkim ******************************************************************************/ 311167802Sjkim 312167802Sjkimvoid 313167802SjkimAcpiDmDumpXsdt ( 314167802Sjkim ACPI_TABLE_HEADER *Table) 315167802Sjkim{ 316167802Sjkim UINT64 *Array; 317167802Sjkim UINT32 Entries; 318167802Sjkim UINT32 Offset; 319167802Sjkim UINT32 i; 320167802Sjkim 321167802Sjkim 322167802Sjkim /* Point to start of table pointer array */ 323167802Sjkim 324167802Sjkim Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry; 325167802Sjkim Offset = sizeof (ACPI_TABLE_HEADER); 326167802Sjkim 327167802Sjkim /* XSDT uses 64-bit pointers */ 328167802Sjkim 329167802Sjkim Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); 330167802Sjkim 331167802Sjkim for (i = 0; i < Entries; i++) 332167802Sjkim { 333167802Sjkim AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); 334167802Sjkim AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i])); 335167802Sjkim Offset += sizeof (UINT64); 336167802Sjkim } 337167802Sjkim} 338167802Sjkim 339167802Sjkim 340167802Sjkim/******************************************************************************* 341167802Sjkim * 342167802Sjkim * FUNCTION: AcpiDmDumpFadt 343167802Sjkim * 344167802Sjkim * PARAMETERS: Table - A FADT 345167802Sjkim * 346167802Sjkim * RETURN: None 347167802Sjkim * 348167802Sjkim * DESCRIPTION: Format the contents of a FADT 349167802Sjkim * 350218590Sjkim * NOTE: We cannot depend on the FADT version to indicate the actual 351218590Sjkim * contents of the FADT because of BIOS bugs. The table length 352218590Sjkim * is the only reliable indicator. 353218590Sjkim * 354167802Sjkim ******************************************************************************/ 355167802Sjkim 356167802Sjkimvoid 357167802SjkimAcpiDmDumpFadt ( 358167802Sjkim ACPI_TABLE_HEADER *Table) 359167802Sjkim{ 360285797Sjkim ACPI_STATUS Status; 361167802Sjkim 362285797Sjkim 363218590Sjkim /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ 364167802Sjkim 365298714Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 366298714Sjkim AcpiDmTableInfoFadt1); 367285797Sjkim if (ACPI_FAILURE (Status)) 368285797Sjkim { 369285797Sjkim return; 370285797Sjkim } 371167802Sjkim 372218590Sjkim /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ 373167802Sjkim 374218590Sjkim if ((Table->Length > ACPI_FADT_V1_SIZE) && 375218590Sjkim (Table->Length <= ACPI_FADT_V2_SIZE)) 376167802Sjkim { 377298714Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 378298714Sjkim AcpiDmTableInfoFadt2); 379285797Sjkim if (ACPI_FAILURE (Status)) 380285797Sjkim { 381285797Sjkim return; 382285797Sjkim } 383167802Sjkim } 384167802Sjkim 385228110Sjkim /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ 386193529Sjkim 387218590Sjkim else if (Table->Length > ACPI_FADT_V2_SIZE) 388193529Sjkim { 389298714Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 390298714Sjkim AcpiDmTableInfoFadt3); 391285797Sjkim if (ACPI_FAILURE (Status)) 392285797Sjkim { 393285797Sjkim return; 394285797Sjkim } 395228110Sjkim 396228110Sjkim /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ 397228110Sjkim 398228110Sjkim if (Table->Length > ACPI_FADT_V3_SIZE) 399228110Sjkim { 400298714Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 401298714Sjkim AcpiDmTableInfoFadt5); 402285797Sjkim if (ACPI_FAILURE (Status)) 403285797Sjkim { 404285797Sjkim return; 405285797Sjkim } 406228110Sjkim } 407283092Sjkim 408283092Sjkim /* Check for FADT revision 6 fields and up (ACPI 6.0+) */ 409283092Sjkim 410283092Sjkim if (Table->Length > ACPI_FADT_V3_SIZE) 411283092Sjkim { 412298714Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 413298714Sjkim AcpiDmTableInfoFadt6); 414285797Sjkim if (ACPI_FAILURE (Status)) 415285797Sjkim { 416285797Sjkim return; 417285797Sjkim } 418283092Sjkim } 419193529Sjkim } 420193529Sjkim 421167802Sjkim /* Validate various fields in the FADT, including length */ 422167802Sjkim 423167802Sjkim AcpiTbCreateLocalFadt (Table, Table->Length); 424218590Sjkim 425218590Sjkim /* Validate FADT length against the revision */ 426218590Sjkim 427218590Sjkim AcpiDmValidateFadtLength (Table->Revision, Table->Length); 428167802Sjkim} 429167802Sjkim 430167802Sjkim 431167802Sjkim/******************************************************************************* 432167802Sjkim * 433218590Sjkim * FUNCTION: AcpiDmValidateFadtLength 434218590Sjkim * 435218590Sjkim * PARAMETERS: Revision - FADT revision (Header->Revision) 436218590Sjkim * Length - FADT length (Header->Length 437218590Sjkim * 438218590Sjkim * RETURN: None 439218590Sjkim * 440218590Sjkim * DESCRIPTION: Check the FADT revision against the expected table length for 441218590Sjkim * that revision. Issue a warning if the length is not what was 442218590Sjkim * expected. This seems to be such a common BIOS bug that the 443218590Sjkim * FADT revision has been rendered virtually meaningless. 444218590Sjkim * 445218590Sjkim ******************************************************************************/ 446218590Sjkim 447218590Sjkimstatic void 448218590SjkimAcpiDmValidateFadtLength ( 449218590Sjkim UINT32 Revision, 450218590Sjkim UINT32 Length) 451218590Sjkim{ 452218590Sjkim UINT32 ExpectedLength; 453218590Sjkim 454218590Sjkim 455218590Sjkim switch (Revision) 456218590Sjkim { 457218590Sjkim case 0: 458250838Sjkim 459218590Sjkim AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); 460218590Sjkim return; 461218590Sjkim 462218590Sjkim case 1: 463250838Sjkim 464218590Sjkim ExpectedLength = ACPI_FADT_V1_SIZE; 465218590Sjkim break; 466218590Sjkim 467218590Sjkim case 2: 468250838Sjkim 469218590Sjkim ExpectedLength = ACPI_FADT_V2_SIZE; 470218590Sjkim break; 471218590Sjkim 472218590Sjkim case 3: 473218590Sjkim case 4: 474250838Sjkim 475218590Sjkim ExpectedLength = ACPI_FADT_V3_SIZE; 476218590Sjkim break; 477218590Sjkim 478228110Sjkim case 5: 479250838Sjkim 480228110Sjkim ExpectedLength = ACPI_FADT_V5_SIZE; 481228110Sjkim break; 482228110Sjkim 483218590Sjkim default: 484250838Sjkim 485218590Sjkim return; 486218590Sjkim } 487218590Sjkim 488218590Sjkim if (Length == ExpectedLength) 489218590Sjkim { 490218590Sjkim return; 491218590Sjkim } 492218590Sjkim 493218590Sjkim AcpiOsPrintf ( 494298714Sjkim "\n// ACPI Warning: FADT revision %X does not match length: " 495298714Sjkim "found %X expected %X\n", 496218590Sjkim Revision, Length, ExpectedLength); 497218590Sjkim} 498218590Sjkim 499218590Sjkim 500218590Sjkim/******************************************************************************* 501218590Sjkim * 502167802Sjkim * FUNCTION: AcpiDmDumpAsf 503167802Sjkim * 504167802Sjkim * PARAMETERS: Table - A ASF table 505167802Sjkim * 506167802Sjkim * RETURN: None 507167802Sjkim * 508167802Sjkim * DESCRIPTION: Format the contents of a ASF table 509167802Sjkim * 510167802Sjkim ******************************************************************************/ 511167802Sjkim 512167802Sjkimvoid 513167802SjkimAcpiDmDumpAsf ( 514167802Sjkim ACPI_TABLE_HEADER *Table) 515167802Sjkim{ 516193529Sjkim ACPI_STATUS Status; 517167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_HEADER); 518167802Sjkim ACPI_ASF_INFO *SubTable; 519167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 520167802Sjkim ACPI_DMTABLE_INFO *DataInfoTable = NULL; 521167802Sjkim UINT8 *DataTable = NULL; 522193529Sjkim UINT32 DataCount = 0; 523193529Sjkim UINT32 DataLength = 0; 524193529Sjkim UINT32 DataOffset = 0; 525193529Sjkim UINT32 i; 526197104Sjkim UINT8 Type; 527167802Sjkim 528167802Sjkim 529272444Sjkim /* No main table, only subtables */ 530167802Sjkim 531167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); 532167802Sjkim while (Offset < Table->Length) 533167802Sjkim { 534272444Sjkim /* Common subtable header */ 535167802Sjkim 536193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 537298714Sjkim SubTable->Header.Length, AcpiDmTableInfoAsfHdr); 538193529Sjkim if (ACPI_FAILURE (Status)) 539193529Sjkim { 540193529Sjkim return; 541193529Sjkim } 542167802Sjkim 543197104Sjkim /* The actual type is the lower 7 bits of Type */ 544197104Sjkim 545197104Sjkim Type = (UINT8) (SubTable->Header.Type & 0x7F); 546197104Sjkim 547197104Sjkim switch (Type) 548167802Sjkim { 549167802Sjkim case ACPI_ASF_TYPE_INFO: 550250838Sjkim 551167802Sjkim InfoTable = AcpiDmTableInfoAsf0; 552167802Sjkim break; 553167802Sjkim 554167802Sjkim case ACPI_ASF_TYPE_ALERT: 555250838Sjkim 556167802Sjkim InfoTable = AcpiDmTableInfoAsf1; 557167802Sjkim DataInfoTable = AcpiDmTableInfoAsf1a; 558167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT)); 559197104Sjkim DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts; 560197104Sjkim DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength; 561167802Sjkim DataOffset = Offset + sizeof (ACPI_ASF_ALERT); 562167802Sjkim break; 563167802Sjkim 564167802Sjkim case ACPI_ASF_TYPE_CONTROL: 565250838Sjkim 566167802Sjkim InfoTable = AcpiDmTableInfoAsf2; 567167802Sjkim DataInfoTable = AcpiDmTableInfoAsf2a; 568167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE)); 569197104Sjkim DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls; 570197104Sjkim DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength; 571167802Sjkim DataOffset = Offset + sizeof (ACPI_ASF_REMOTE); 572167802Sjkim break; 573167802Sjkim 574167802Sjkim case ACPI_ASF_TYPE_BOOT: 575250838Sjkim 576167802Sjkim InfoTable = AcpiDmTableInfoAsf3; 577167802Sjkim break; 578167802Sjkim 579167802Sjkim case ACPI_ASF_TYPE_ADDRESS: 580250838Sjkim 581167802Sjkim InfoTable = AcpiDmTableInfoAsf4; 582167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS)); 583197104Sjkim DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices; 584167802Sjkim DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS); 585167802Sjkim break; 586167802Sjkim 587167802Sjkim default: 588250838Sjkim 589298714Sjkim AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", 590298714Sjkim SubTable->Header.Type); 591167802Sjkim return; 592167802Sjkim } 593167802Sjkim 594193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 595298714Sjkim SubTable->Header.Length, InfoTable); 596193529Sjkim if (ACPI_FAILURE (Status)) 597193529Sjkim { 598193529Sjkim return; 599193529Sjkim } 600167802Sjkim 601167802Sjkim /* Dump variable-length extra data */ 602167802Sjkim 603197104Sjkim switch (Type) 604167802Sjkim { 605167802Sjkim case ACPI_ASF_TYPE_ALERT: 606167802Sjkim case ACPI_ASF_TYPE_CONTROL: 607167802Sjkim 608167802Sjkim for (i = 0; i < DataCount; i++) 609167802Sjkim { 610167802Sjkim AcpiOsPrintf ("\n"); 611193529Sjkim Status = AcpiDmDumpTable (Table->Length, DataOffset, 612298714Sjkim DataTable, DataLength, DataInfoTable); 613193529Sjkim if (ACPI_FAILURE (Status)) 614193529Sjkim { 615193529Sjkim return; 616193529Sjkim } 617167802Sjkim 618167802Sjkim DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength); 619167802Sjkim DataOffset += DataLength; 620167802Sjkim } 621167802Sjkim break; 622167802Sjkim 623167802Sjkim case ACPI_ASF_TYPE_ADDRESS: 624167802Sjkim 625167802Sjkim for (i = 0; i < DataLength; i++) 626167802Sjkim { 627167802Sjkim if (!(i % 16)) 628167802Sjkim { 629167802Sjkim AcpiDmLineHeader (DataOffset, 1, "Addresses"); 630167802Sjkim } 631167802Sjkim 632167802Sjkim AcpiOsPrintf ("%2.2X ", *DataTable); 633167802Sjkim DataTable++; 634167802Sjkim DataOffset++; 635298714Sjkim 636193529Sjkim if (DataOffset > Table->Length) 637193529Sjkim { 638298714Sjkim AcpiOsPrintf ( 639298714Sjkim "**** ACPI table terminates in the middle of a " 640298714Sjkim "data structure! (ASF! table)\n"); 641193529Sjkim return; 642193529Sjkim } 643167802Sjkim } 644167802Sjkim 645167802Sjkim AcpiOsPrintf ("\n"); 646167802Sjkim break; 647193529Sjkim 648193529Sjkim default: 649250838Sjkim 650193529Sjkim break; 651167802Sjkim } 652167802Sjkim 653167802Sjkim AcpiOsPrintf ("\n"); 654167802Sjkim 655272444Sjkim /* Point to next subtable */ 656167802Sjkim 657193529Sjkim if (!SubTable->Header.Length) 658193529Sjkim { 659193529Sjkim AcpiOsPrintf ("Invalid zero subtable header length\n"); 660193529Sjkim return; 661193529Sjkim } 662193529Sjkim 663167802Sjkim Offset += SubTable->Header.Length; 664298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, 665298714Sjkim SubTable->Header.Length); 666167802Sjkim } 667167802Sjkim} 668167802Sjkim 669167802Sjkim 670167802Sjkim/******************************************************************************* 671167802Sjkim * 672167802Sjkim * FUNCTION: AcpiDmDumpCpep 673167802Sjkim * 674167802Sjkim * PARAMETERS: Table - A CPEP table 675167802Sjkim * 676167802Sjkim * RETURN: None 677167802Sjkim * 678167802Sjkim * DESCRIPTION: Format the contents of a CPEP. This table type consists 679167802Sjkim * of an open-ended number of subtables. 680167802Sjkim * 681167802Sjkim ******************************************************************************/ 682167802Sjkim 683167802Sjkimvoid 684167802SjkimAcpiDmDumpCpep ( 685167802Sjkim ACPI_TABLE_HEADER *Table) 686167802Sjkim{ 687193529Sjkim ACPI_STATUS Status; 688167802Sjkim ACPI_CPEP_POLLING *SubTable; 689167802Sjkim UINT32 Length = Table->Length; 690167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_CPEP); 691167802Sjkim 692167802Sjkim 693167802Sjkim /* Main table */ 694167802Sjkim 695193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep); 696193529Sjkim if (ACPI_FAILURE (Status)) 697193529Sjkim { 698193529Sjkim return; 699193529Sjkim } 700167802Sjkim 701272444Sjkim /* Subtables */ 702167802Sjkim 703167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); 704167802Sjkim while (Offset < Table->Length) 705167802Sjkim { 706167802Sjkim AcpiOsPrintf ("\n"); 707193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 708298714Sjkim SubTable->Header.Length, AcpiDmTableInfoCpep0); 709193529Sjkim if (ACPI_FAILURE (Status)) 710193529Sjkim { 711193529Sjkim return; 712193529Sjkim } 713167802Sjkim 714272444Sjkim /* Point to next subtable */ 715167802Sjkim 716197104Sjkim Offset += SubTable->Header.Length; 717197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable, 718298714Sjkim SubTable->Header.Length); 719167802Sjkim } 720167802Sjkim} 721167802Sjkim 722167802Sjkim 723167802Sjkim/******************************************************************************* 724167802Sjkim * 725239340Sjkim * FUNCTION: AcpiDmDumpCsrt 726239340Sjkim * 727239340Sjkim * PARAMETERS: Table - A CSRT table 728239340Sjkim * 729239340Sjkim * RETURN: None 730239340Sjkim * 731239340Sjkim * DESCRIPTION: Format the contents of a CSRT. This table type consists 732239340Sjkim * of an open-ended number of subtables. 733239340Sjkim * 734239340Sjkim ******************************************************************************/ 735239340Sjkim 736239340Sjkimvoid 737239340SjkimAcpiDmDumpCsrt ( 738239340Sjkim ACPI_TABLE_HEADER *Table) 739239340Sjkim{ 740239340Sjkim ACPI_STATUS Status; 741239340Sjkim ACPI_CSRT_GROUP *SubTable; 742245582Sjkim ACPI_CSRT_SHARED_INFO *SharedInfoTable; 743239340Sjkim ACPI_CSRT_DESCRIPTOR *SubSubTable; 744239340Sjkim UINT32 Length = Table->Length; 745239340Sjkim UINT32 Offset = sizeof (ACPI_TABLE_CSRT); 746239340Sjkim UINT32 SubOffset; 747239340Sjkim UINT32 SubSubOffset; 748239340Sjkim UINT32 InfoLength; 749239340Sjkim 750239340Sjkim 751239340Sjkim /* The main table only contains the ACPI header, thus already handled */ 752239340Sjkim 753272444Sjkim /* Subtables (Resource Groups) */ 754239340Sjkim 755239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); 756239340Sjkim while (Offset < Table->Length) 757239340Sjkim { 758245582Sjkim /* Resource group subtable */ 759245582Sjkim 760239340Sjkim AcpiOsPrintf ("\n"); 761239340Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 762298714Sjkim SubTable->Length, AcpiDmTableInfoCsrt0); 763239340Sjkim if (ACPI_FAILURE (Status)) 764239340Sjkim { 765239340Sjkim return; 766239340Sjkim } 767239340Sjkim 768245582Sjkim /* Shared info subtable (One per resource group) */ 769245582Sjkim 770239340Sjkim SubOffset = sizeof (ACPI_CSRT_GROUP); 771245582Sjkim SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table, 772245582Sjkim Offset + SubOffset); 773239340Sjkim 774245582Sjkim AcpiOsPrintf ("\n"); 775245582Sjkim Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable, 776298714Sjkim sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1); 777245582Sjkim if (ACPI_FAILURE (Status)) 778245582Sjkim { 779245582Sjkim return; 780245582Sjkim } 781239340Sjkim 782245582Sjkim SubOffset += SubTable->SharedInfoLength; 783239340Sjkim 784245582Sjkim /* Sub-Subtables (Resource Descriptors) */ 785239340Sjkim 786239340Sjkim SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, 787239340Sjkim Offset + SubOffset); 788239340Sjkim 789239340Sjkim while ((SubOffset < SubTable->Length) && 790239340Sjkim ((Offset + SubOffset) < Table->Length)) 791239340Sjkim { 792239340Sjkim AcpiOsPrintf ("\n"); 793239340Sjkim Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable, 794298714Sjkim SubSubTable->Length, AcpiDmTableInfoCsrt2); 795239340Sjkim if (ACPI_FAILURE (Status)) 796239340Sjkim { 797239340Sjkim return; 798239340Sjkim } 799239340Sjkim 800239340Sjkim SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR); 801239340Sjkim 802239340Sjkim /* Resource-specific info buffer */ 803239340Sjkim 804239340Sjkim InfoLength = SubSubTable->Length - SubSubOffset; 805283092Sjkim if (InfoLength) 806283092Sjkim { 807283092Sjkim Status = AcpiDmDumpTable (Length, 808298714Sjkim Offset + SubOffset + SubSubOffset, Table, 809298714Sjkim InfoLength, AcpiDmTableInfoCsrt2a); 810283092Sjkim if (ACPI_FAILURE (Status)) 811283092Sjkim { 812283092Sjkim return; 813283092Sjkim } 814283092Sjkim SubSubOffset += InfoLength; 815283092Sjkim } 816239340Sjkim 817245582Sjkim /* Point to next sub-subtable */ 818239340Sjkim 819239340Sjkim SubOffset += SubSubTable->Length; 820239340Sjkim SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable, 821298714Sjkim SubSubTable->Length); 822239340Sjkim } 823239340Sjkim 824272444Sjkim /* Point to next subtable */ 825239340Sjkim 826239340Sjkim Offset += SubTable->Length; 827239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable, 828298714Sjkim SubTable->Length); 829239340Sjkim } 830239340Sjkim} 831239340Sjkim 832239340Sjkim 833239340Sjkim/******************************************************************************* 834239340Sjkim * 835239340Sjkim * FUNCTION: AcpiDmDumpDbg2 836239340Sjkim * 837239340Sjkim * PARAMETERS: Table - A DBG2 table 838239340Sjkim * 839239340Sjkim * RETURN: None 840239340Sjkim * 841239340Sjkim * DESCRIPTION: Format the contents of a DBG2. This table type consists 842239340Sjkim * of an open-ended number of subtables. 843239340Sjkim * 844239340Sjkim ******************************************************************************/ 845239340Sjkim 846239340Sjkimvoid 847239340SjkimAcpiDmDumpDbg2 ( 848239340Sjkim ACPI_TABLE_HEADER *Table) 849239340Sjkim{ 850239340Sjkim ACPI_STATUS Status; 851239340Sjkim ACPI_DBG2_DEVICE *SubTable; 852239340Sjkim UINT32 Length = Table->Length; 853239340Sjkim UINT32 Offset = sizeof (ACPI_TABLE_DBG2); 854239340Sjkim UINT32 i; 855239340Sjkim UINT32 ArrayOffset; 856239340Sjkim UINT32 AbsoluteOffset; 857239340Sjkim UINT8 *Array; 858239340Sjkim 859239340Sjkim 860239340Sjkim /* Main table */ 861239340Sjkim 862239340Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2); 863239340Sjkim if (ACPI_FAILURE (Status)) 864239340Sjkim { 865239340Sjkim return; 866239340Sjkim } 867239340Sjkim 868272444Sjkim /* Subtables */ 869239340Sjkim 870239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); 871239340Sjkim while (Offset < Table->Length) 872239340Sjkim { 873239340Sjkim AcpiOsPrintf ("\n"); 874239340Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 875298714Sjkim SubTable->Length, AcpiDmTableInfoDbg2Device); 876239340Sjkim if (ACPI_FAILURE (Status)) 877239340Sjkim { 878239340Sjkim return; 879239340Sjkim } 880239340Sjkim 881239340Sjkim /* Dump the BaseAddress array */ 882239340Sjkim 883239340Sjkim for (i = 0; i < SubTable->RegisterCount; i++) 884239340Sjkim { 885239340Sjkim ArrayOffset = SubTable->BaseAddressOffset + 886239340Sjkim (sizeof (ACPI_GENERIC_ADDRESS) * i); 887239340Sjkim AbsoluteOffset = Offset + ArrayOffset; 888239340Sjkim Array = (UINT8 *) SubTable + ArrayOffset; 889239340Sjkim 890239340Sjkim Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 891298714Sjkim SubTable->Length, AcpiDmTableInfoDbg2Addr); 892239340Sjkim if (ACPI_FAILURE (Status)) 893239340Sjkim { 894239340Sjkim return; 895239340Sjkim } 896239340Sjkim } 897239340Sjkim 898239340Sjkim /* Dump the AddressSize array */ 899239340Sjkim 900239340Sjkim for (i = 0; i < SubTable->RegisterCount; i++) 901239340Sjkim { 902239340Sjkim ArrayOffset = SubTable->AddressSizeOffset + 903239340Sjkim (sizeof (UINT32) * i); 904239340Sjkim AbsoluteOffset = Offset + ArrayOffset; 905239340Sjkim Array = (UINT8 *) SubTable + ArrayOffset; 906239340Sjkim 907239340Sjkim Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 908298714Sjkim SubTable->Length, AcpiDmTableInfoDbg2Size); 909239340Sjkim if (ACPI_FAILURE (Status)) 910239340Sjkim { 911239340Sjkim return; 912239340Sjkim } 913239340Sjkim } 914239340Sjkim 915239340Sjkim /* Dump the Namestring (required) */ 916239340Sjkim 917239340Sjkim AcpiOsPrintf ("\n"); 918239340Sjkim ArrayOffset = SubTable->NamepathOffset; 919239340Sjkim AbsoluteOffset = Offset + ArrayOffset; 920239340Sjkim Array = (UINT8 *) SubTable + ArrayOffset; 921239340Sjkim 922239340Sjkim Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 923298714Sjkim SubTable->Length, AcpiDmTableInfoDbg2Name); 924239340Sjkim if (ACPI_FAILURE (Status)) 925239340Sjkim { 926239340Sjkim return; 927239340Sjkim } 928239340Sjkim 929239340Sjkim /* Dump the OemData (optional) */ 930239340Sjkim 931272444Sjkim if (SubTable->OemDataOffset) 932272444Sjkim { 933283092Sjkim Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset, 934298714Sjkim Table, SubTable->OemDataLength, 935298714Sjkim AcpiDmTableInfoDbg2OemData); 936283092Sjkim if (ACPI_FAILURE (Status)) 937283092Sjkim { 938283092Sjkim return; 939283092Sjkim } 940272444Sjkim } 941239340Sjkim 942272444Sjkim /* Point to next subtable */ 943239340Sjkim 944239340Sjkim Offset += SubTable->Length; 945239340Sjkim SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable, 946298714Sjkim SubTable->Length); 947239340Sjkim } 948239340Sjkim} 949239340Sjkim 950239340Sjkim 951239340Sjkim/******************************************************************************* 952239340Sjkim * 953167802Sjkim * FUNCTION: AcpiDmDumpDmar 954167802Sjkim * 955167802Sjkim * PARAMETERS: Table - A DMAR table 956167802Sjkim * 957167802Sjkim * RETURN: None 958167802Sjkim * 959167802Sjkim * DESCRIPTION: Format the contents of a DMAR. This table type consists 960167802Sjkim * of an open-ended number of subtables. 961167802Sjkim * 962167802Sjkim ******************************************************************************/ 963167802Sjkim 964167802Sjkimvoid 965167802SjkimAcpiDmDumpDmar ( 966167802Sjkim ACPI_TABLE_HEADER *Table) 967167802Sjkim{ 968193529Sjkim ACPI_STATUS Status; 969167802Sjkim ACPI_DMAR_HEADER *SubTable; 970167802Sjkim UINT32 Length = Table->Length; 971167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_DMAR); 972167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 973167802Sjkim ACPI_DMAR_DEVICE_SCOPE *ScopeTable; 974167802Sjkim UINT32 ScopeOffset; 975167802Sjkim UINT8 *PciPath; 976167802Sjkim UINT32 PathOffset; 977167802Sjkim 978167802Sjkim 979167802Sjkim /* Main table */ 980167802Sjkim 981193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar); 982193529Sjkim if (ACPI_FAILURE (Status)) 983193529Sjkim { 984193529Sjkim return; 985193529Sjkim } 986167802Sjkim 987272444Sjkim /* Subtables */ 988167802Sjkim 989167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); 990167802Sjkim while (Offset < Table->Length) 991167802Sjkim { 992272444Sjkim /* Common subtable header */ 993167802Sjkim 994167802Sjkim AcpiOsPrintf ("\n"); 995193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 996298714Sjkim SubTable->Length, AcpiDmTableInfoDmarHdr); 997193529Sjkim if (ACPI_FAILURE (Status)) 998193529Sjkim { 999193529Sjkim return; 1000193529Sjkim } 1001298714Sjkim 1002252279Sjkim AcpiOsPrintf ("\n"); 1003167802Sjkim 1004167802Sjkim switch (SubTable->Type) 1005167802Sjkim { 1006167802Sjkim case ACPI_DMAR_TYPE_HARDWARE_UNIT: 1007250838Sjkim 1008167802Sjkim InfoTable = AcpiDmTableInfoDmar0; 1009167802Sjkim ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT); 1010167802Sjkim break; 1011250838Sjkim 1012167802Sjkim case ACPI_DMAR_TYPE_RESERVED_MEMORY: 1013250838Sjkim 1014167802Sjkim InfoTable = AcpiDmTableInfoDmar1; 1015167802Sjkim ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY); 1016167802Sjkim break; 1017250838Sjkim 1018272444Sjkim case ACPI_DMAR_TYPE_ROOT_ATS: 1019250838Sjkim 1020193529Sjkim InfoTable = AcpiDmTableInfoDmar2; 1021193529Sjkim ScopeOffset = sizeof (ACPI_DMAR_ATSR); 1022193529Sjkim break; 1023250838Sjkim 1024272444Sjkim case ACPI_DMAR_TYPE_HARDWARE_AFFINITY: 1025250838Sjkim 1026197104Sjkim InfoTable = AcpiDmTableInfoDmar3; 1027197104Sjkim ScopeOffset = sizeof (ACPI_DMAR_RHSA); 1028197104Sjkim break; 1029250838Sjkim 1030272444Sjkim case ACPI_DMAR_TYPE_NAMESPACE: 1031272444Sjkim 1032272444Sjkim InfoTable = AcpiDmTableInfoDmar4; 1033272444Sjkim ScopeOffset = sizeof (ACPI_DMAR_ANDD); 1034272444Sjkim break; 1035272444Sjkim 1036167802Sjkim default: 1037250838Sjkim 1038298714Sjkim AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", 1039298714Sjkim SubTable->Type); 1040167802Sjkim return; 1041167802Sjkim } 1042167802Sjkim 1043193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1044298714Sjkim SubTable->Length, InfoTable); 1045193529Sjkim if (ACPI_FAILURE (Status)) 1046193529Sjkim { 1047193529Sjkim return; 1048193529Sjkim } 1049167802Sjkim 1050272444Sjkim /* 1051272444Sjkim * Dump the optional device scope entries 1052272444Sjkim */ 1053272444Sjkim if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || 1054272444Sjkim (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE)) 1055272444Sjkim { 1056272444Sjkim /* These types do not support device scopes */ 1057193529Sjkim 1058272444Sjkim goto NextSubtable; 1059272444Sjkim } 1060272444Sjkim 1061193529Sjkim ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset); 1062193529Sjkim while (ScopeOffset < SubTable->Length) 1063167802Sjkim { 1064193529Sjkim AcpiOsPrintf ("\n"); 1065193529Sjkim Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, 1066298714Sjkim ScopeTable->Length, AcpiDmTableInfoDmarScope); 1067193529Sjkim if (ACPI_FAILURE (Status)) 1068167802Sjkim { 1069193529Sjkim return; 1070193529Sjkim } 1071252279Sjkim AcpiOsPrintf ("\n"); 1072167802Sjkim 1073193529Sjkim /* Dump the PCI Path entries for this device scope */ 1074167802Sjkim 1075193529Sjkim PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */ 1076167802Sjkim 1077193529Sjkim PciPath = ACPI_ADD_PTR (UINT8, ScopeTable, 1078193529Sjkim sizeof (ACPI_DMAR_DEVICE_SCOPE)); 1079167802Sjkim 1080193529Sjkim while (PathOffset < ScopeTable->Length) 1081193529Sjkim { 1082298714Sjkim AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, 1083298714Sjkim "PCI Path"); 1084209746Sjkim AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]); 1085167802Sjkim 1086193529Sjkim /* Point to next PCI Path entry */ 1087167802Sjkim 1088193529Sjkim PathOffset += 2; 1089193529Sjkim PciPath += 2; 1090252279Sjkim AcpiOsPrintf ("\n"); 1091193529Sjkim } 1092167802Sjkim 1093193529Sjkim /* Point to next device scope entry */ 1094167802Sjkim 1095193529Sjkim ScopeOffset += ScopeTable->Length; 1096193529Sjkim ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, 1097193529Sjkim ScopeTable, ScopeTable->Length); 1098167802Sjkim } 1099167802Sjkim 1100272444SjkimNextSubtable: 1101272444Sjkim /* Point to next subtable */ 1102167802Sjkim 1103167802Sjkim Offset += SubTable->Length; 1104298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, 1105298714Sjkim SubTable->Length); 1106167802Sjkim } 1107167802Sjkim} 1108167802Sjkim 1109167802Sjkim 1110167802Sjkim/******************************************************************************* 1111167802Sjkim * 1112283092Sjkim * FUNCTION: AcpiDmDumpDrtm 1113283092Sjkim * 1114283092Sjkim * PARAMETERS: Table - A DRTM table 1115283092Sjkim * 1116283092Sjkim * RETURN: None 1117283092Sjkim * 1118283092Sjkim * DESCRIPTION: Format the contents of a DRTM. 1119283092Sjkim * 1120283092Sjkim ******************************************************************************/ 1121283092Sjkim 1122283092Sjkimvoid 1123283092SjkimAcpiDmDumpDrtm ( 1124283092Sjkim ACPI_TABLE_HEADER *Table) 1125283092Sjkim{ 1126283092Sjkim ACPI_STATUS Status; 1127283092Sjkim UINT32 Offset; 1128283092Sjkim ACPI_DRTM_VTABLE_LIST *DrtmVtl; 1129283092Sjkim ACPI_DRTM_RESOURCE_LIST *DrtmRl; 1130283092Sjkim ACPI_DRTM_DPS_ID *DrtmDps; 1131283092Sjkim UINT32 Count; 1132283092Sjkim 1133283092Sjkim 1134283092Sjkim /* Main table */ 1135283092Sjkim 1136283092Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 1137298714Sjkim AcpiDmTableInfoDrtm); 1138283092Sjkim if (ACPI_FAILURE (Status)) 1139283092Sjkim { 1140283092Sjkim return; 1141283092Sjkim } 1142283092Sjkim 1143283092Sjkim Offset = sizeof (ACPI_TABLE_DRTM); 1144283092Sjkim 1145283092Sjkim /* Sub-tables */ 1146283092Sjkim 1147283092Sjkim /* Dump ValidatedTable length */ 1148283092Sjkim 1149283092Sjkim DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset); 1150283092Sjkim AcpiOsPrintf ("\n"); 1151283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, 1152298714Sjkim DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables), 1153298714Sjkim AcpiDmTableInfoDrtm0); 1154283092Sjkim if (ACPI_FAILURE (Status)) 1155283092Sjkim { 1156283092Sjkim return; 1157283092Sjkim } 1158298714Sjkim 1159283092Sjkim Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables); 1160283092Sjkim 1161283092Sjkim /* Dump Validated table addresses */ 1162283092Sjkim 1163283092Sjkim Count = 0; 1164283092Sjkim while ((Offset < Table->Length) && 1165283092Sjkim (DrtmVtl->ValidatedTableCount > Count)) 1166283092Sjkim { 1167283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, 1168298714Sjkim ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64), 1169298714Sjkim AcpiDmTableInfoDrtm0a); 1170283092Sjkim if (ACPI_FAILURE (Status)) 1171283092Sjkim { 1172283092Sjkim return; 1173283092Sjkim } 1174298714Sjkim 1175283092Sjkim Offset += sizeof (UINT64); 1176283092Sjkim Count++; 1177283092Sjkim } 1178283092Sjkim 1179283092Sjkim /* Dump ResourceList length */ 1180283092Sjkim 1181283092Sjkim DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset); 1182283092Sjkim AcpiOsPrintf ("\n"); 1183283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, 1184298714Sjkim DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources), 1185298714Sjkim AcpiDmTableInfoDrtm1); 1186283092Sjkim if (ACPI_FAILURE (Status)) 1187283092Sjkim { 1188285797Sjkim return; 1189283092Sjkim } 1190283092Sjkim 1191283092Sjkim Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources); 1192283092Sjkim 1193283092Sjkim /* Dump the Resource List */ 1194283092Sjkim 1195283092Sjkim Count = 0; 1196283092Sjkim while ((Offset < Table->Length) && 1197283092Sjkim (DrtmRl->ResourceCount > Count)) 1198283092Sjkim { 1199283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, 1200298714Sjkim ACPI_ADD_PTR (void, Table, Offset), 1201298714Sjkim sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a); 1202283092Sjkim if (ACPI_FAILURE (Status)) 1203283092Sjkim { 1204283092Sjkim return; 1205283092Sjkim } 1206283092Sjkim 1207283092Sjkim Offset += sizeof (ACPI_DRTM_RESOURCE); 1208283092Sjkim Count++; 1209283092Sjkim } 1210283092Sjkim 1211283092Sjkim /* Dump DPS */ 1212283092Sjkim 1213283092Sjkim DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset); 1214283092Sjkim AcpiOsPrintf ("\n"); 1215285797Sjkim (void) AcpiDmDumpTable (Table->Length, Offset, 1216298714Sjkim DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2); 1217283092Sjkim} 1218283092Sjkim 1219283092Sjkim 1220283092Sjkim/******************************************************************************* 1221283092Sjkim * 1222193529Sjkim * FUNCTION: AcpiDmDumpEinj 1223193529Sjkim * 1224193529Sjkim * PARAMETERS: Table - A EINJ table 1225193529Sjkim * 1226193529Sjkim * RETURN: None 1227193529Sjkim * 1228193529Sjkim * DESCRIPTION: Format the contents of a EINJ. This table type consists 1229193529Sjkim * of an open-ended number of subtables. 1230193529Sjkim * 1231193529Sjkim ******************************************************************************/ 1232193529Sjkim 1233193529Sjkimvoid 1234193529SjkimAcpiDmDumpEinj ( 1235193529Sjkim ACPI_TABLE_HEADER *Table) 1236193529Sjkim{ 1237193529Sjkim ACPI_STATUS Status; 1238193529Sjkim ACPI_WHEA_HEADER *SubTable; 1239193529Sjkim UINT32 Length = Table->Length; 1240193529Sjkim UINT32 Offset = sizeof (ACPI_TABLE_EINJ); 1241193529Sjkim 1242193529Sjkim 1243193529Sjkim /* Main table */ 1244193529Sjkim 1245193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj); 1246193529Sjkim if (ACPI_FAILURE (Status)) 1247193529Sjkim { 1248193529Sjkim return; 1249193529Sjkim } 1250193529Sjkim 1251272444Sjkim /* Subtables */ 1252193529Sjkim 1253193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1254193529Sjkim while (Offset < Table->Length) 1255193529Sjkim { 1256193529Sjkim AcpiOsPrintf ("\n"); 1257193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1258298714Sjkim sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0); 1259193529Sjkim if (ACPI_FAILURE (Status)) 1260193529Sjkim { 1261193529Sjkim return; 1262193529Sjkim } 1263193529Sjkim 1264272444Sjkim /* Point to next subtable (each subtable is of fixed length) */ 1265193529Sjkim 1266193529Sjkim Offset += sizeof (ACPI_WHEA_HEADER); 1267193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 1268298714Sjkim sizeof (ACPI_WHEA_HEADER)); 1269193529Sjkim } 1270193529Sjkim} 1271193529Sjkim 1272193529Sjkim 1273193529Sjkim/******************************************************************************* 1274193529Sjkim * 1275193529Sjkim * FUNCTION: AcpiDmDumpErst 1276193529Sjkim * 1277193529Sjkim * PARAMETERS: Table - A ERST table 1278193529Sjkim * 1279193529Sjkim * RETURN: None 1280193529Sjkim * 1281193529Sjkim * DESCRIPTION: Format the contents of a ERST. This table type consists 1282193529Sjkim * of an open-ended number of subtables. 1283193529Sjkim * 1284193529Sjkim ******************************************************************************/ 1285193529Sjkim 1286193529Sjkimvoid 1287193529SjkimAcpiDmDumpErst ( 1288193529Sjkim ACPI_TABLE_HEADER *Table) 1289193529Sjkim{ 1290193529Sjkim ACPI_STATUS Status; 1291193529Sjkim ACPI_WHEA_HEADER *SubTable; 1292193529Sjkim UINT32 Length = Table->Length; 1293193529Sjkim UINT32 Offset = sizeof (ACPI_TABLE_ERST); 1294193529Sjkim 1295193529Sjkim 1296193529Sjkim /* Main table */ 1297193529Sjkim 1298193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst); 1299193529Sjkim if (ACPI_FAILURE (Status)) 1300193529Sjkim { 1301193529Sjkim return; 1302193529Sjkim } 1303193529Sjkim 1304272444Sjkim /* Subtables */ 1305193529Sjkim 1306193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1307193529Sjkim while (Offset < Table->Length) 1308193529Sjkim { 1309193529Sjkim AcpiOsPrintf ("\n"); 1310193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1311298714Sjkim sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0); 1312193529Sjkim if (ACPI_FAILURE (Status)) 1313193529Sjkim { 1314193529Sjkim return; 1315193529Sjkim } 1316193529Sjkim 1317272444Sjkim /* Point to next subtable (each subtable is of fixed length) */ 1318193529Sjkim 1319193529Sjkim Offset += sizeof (ACPI_WHEA_HEADER); 1320193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 1321298714Sjkim sizeof (ACPI_WHEA_HEADER)); 1322193529Sjkim } 1323193529Sjkim} 1324193529Sjkim 1325193529Sjkim 1326193529Sjkim/******************************************************************************* 1327193529Sjkim * 1328228110Sjkim * FUNCTION: AcpiDmDumpFpdt 1329228110Sjkim * 1330228110Sjkim * PARAMETERS: Table - A FPDT table 1331228110Sjkim * 1332228110Sjkim * RETURN: None 1333228110Sjkim * 1334228110Sjkim * DESCRIPTION: Format the contents of a FPDT. This table type consists 1335228110Sjkim * of an open-ended number of subtables. 1336228110Sjkim * 1337228110Sjkim ******************************************************************************/ 1338228110Sjkim 1339228110Sjkimvoid 1340228110SjkimAcpiDmDumpFpdt ( 1341228110Sjkim ACPI_TABLE_HEADER *Table) 1342228110Sjkim{ 1343228110Sjkim ACPI_STATUS Status; 1344228110Sjkim ACPI_FPDT_HEADER *SubTable; 1345228110Sjkim UINT32 Length = Table->Length; 1346228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 1347228110Sjkim ACPI_DMTABLE_INFO *InfoTable; 1348228110Sjkim 1349228110Sjkim 1350228110Sjkim /* There is no main table (other than the standard ACPI header) */ 1351228110Sjkim 1352272444Sjkim /* Subtables */ 1353228110Sjkim 1354228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); 1355228110Sjkim while (Offset < Table->Length) 1356228110Sjkim { 1357272444Sjkim /* Common subtable header */ 1358228110Sjkim 1359228110Sjkim AcpiOsPrintf ("\n"); 1360228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1361298714Sjkim SubTable->Length, AcpiDmTableInfoFpdtHdr); 1362228110Sjkim if (ACPI_FAILURE (Status)) 1363228110Sjkim { 1364228110Sjkim return; 1365228110Sjkim } 1366228110Sjkim 1367228110Sjkim switch (SubTable->Type) 1368228110Sjkim { 1369228110Sjkim case ACPI_FPDT_TYPE_BOOT: 1370250838Sjkim 1371228110Sjkim InfoTable = AcpiDmTableInfoFpdt0; 1372228110Sjkim break; 1373250838Sjkim 1374228110Sjkim case ACPI_FPDT_TYPE_S3PERF: 1375250838Sjkim 1376228110Sjkim InfoTable = AcpiDmTableInfoFpdt1; 1377228110Sjkim break; 1378250838Sjkim 1379228110Sjkim default: 1380250838Sjkim 1381298714Sjkim AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", 1382298714Sjkim SubTable->Type); 1383228110Sjkim 1384228110Sjkim /* Attempt to continue */ 1385228110Sjkim 1386228110Sjkim if (!SubTable->Length) 1387228110Sjkim { 1388228110Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1389228110Sjkim return; 1390228110Sjkim } 1391228110Sjkim goto NextSubTable; 1392228110Sjkim } 1393228110Sjkim 1394228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1395298714Sjkim SubTable->Length, InfoTable); 1396228110Sjkim if (ACPI_FAILURE (Status)) 1397228110Sjkim { 1398228110Sjkim return; 1399228110Sjkim } 1400228110Sjkim 1401228110SjkimNextSubTable: 1402272444Sjkim /* Point to next subtable */ 1403228110Sjkim 1404228110Sjkim Offset += SubTable->Length; 1405298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, 1406298714Sjkim SubTable->Length); 1407228110Sjkim } 1408228110Sjkim} 1409228110Sjkim 1410228110Sjkim 1411228110Sjkim/******************************************************************************* 1412228110Sjkim * 1413272444Sjkim * FUNCTION: AcpiDmDumpGtdt 1414272444Sjkim * 1415272444Sjkim * PARAMETERS: Table - A GTDT table 1416272444Sjkim * 1417272444Sjkim * RETURN: None 1418272444Sjkim * 1419272444Sjkim * DESCRIPTION: Format the contents of a GTDT. This table type consists 1420272444Sjkim * of an open-ended number of subtables. 1421272444Sjkim * 1422272444Sjkim ******************************************************************************/ 1423272444Sjkim 1424272444Sjkimvoid 1425272444SjkimAcpiDmDumpGtdt ( 1426272444Sjkim ACPI_TABLE_HEADER *Table) 1427272444Sjkim{ 1428272444Sjkim ACPI_STATUS Status; 1429272444Sjkim ACPI_GTDT_HEADER *SubTable; 1430272444Sjkim UINT32 Length = Table->Length; 1431272444Sjkim UINT32 Offset = sizeof (ACPI_TABLE_GTDT); 1432272444Sjkim ACPI_DMTABLE_INFO *InfoTable; 1433272444Sjkim UINT32 SubTableLength; 1434272444Sjkim UINT32 GtCount; 1435272444Sjkim ACPI_GTDT_TIMER_ENTRY *GtxTable; 1436272444Sjkim 1437272444Sjkim 1438272444Sjkim /* Main table */ 1439272444Sjkim 1440272444Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt); 1441272444Sjkim if (ACPI_FAILURE (Status)) 1442272444Sjkim { 1443272444Sjkim return; 1444272444Sjkim } 1445272444Sjkim 1446272444Sjkim /* Subtables */ 1447272444Sjkim 1448272444Sjkim SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset); 1449272444Sjkim while (Offset < Table->Length) 1450272444Sjkim { 1451272444Sjkim /* Common subtable header */ 1452272444Sjkim 1453272444Sjkim AcpiOsPrintf ("\n"); 1454272444Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1455298714Sjkim SubTable->Length, AcpiDmTableInfoGtdtHdr); 1456272444Sjkim if (ACPI_FAILURE (Status)) 1457272444Sjkim { 1458272444Sjkim return; 1459272444Sjkim } 1460272444Sjkim 1461272444Sjkim GtCount = 0; 1462272444Sjkim switch (SubTable->Type) 1463272444Sjkim { 1464272444Sjkim case ACPI_GTDT_TYPE_TIMER_BLOCK: 1465272444Sjkim 1466272444Sjkim SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK); 1467272444Sjkim GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, 1468298714Sjkim SubTable))->TimerCount; 1469272444Sjkim 1470272444Sjkim InfoTable = AcpiDmTableInfoGtdt0; 1471272444Sjkim break; 1472272444Sjkim 1473272444Sjkim case ACPI_GTDT_TYPE_WATCHDOG: 1474272444Sjkim 1475272444Sjkim SubTableLength = sizeof (ACPI_GTDT_WATCHDOG); 1476272444Sjkim 1477272444Sjkim InfoTable = AcpiDmTableInfoGtdt1; 1478272444Sjkim break; 1479272444Sjkim 1480272444Sjkim default: 1481272444Sjkim 1482272444Sjkim /* Cannot continue on unknown type - no length */ 1483272444Sjkim 1484298714Sjkim AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", 1485298714Sjkim SubTable->Type); 1486272444Sjkim return; 1487272444Sjkim } 1488272444Sjkim 1489272444Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1490298714Sjkim SubTable->Length, InfoTable); 1491272444Sjkim if (ACPI_FAILURE (Status)) 1492272444Sjkim { 1493272444Sjkim return; 1494272444Sjkim } 1495272444Sjkim 1496272444Sjkim /* Point to end of current subtable (each subtable above is of fixed length) */ 1497272444Sjkim 1498272444Sjkim Offset += SubTableLength; 1499272444Sjkim 1500272444Sjkim /* If there are any Gt Timer Blocks from above, dump them now */ 1501272444Sjkim 1502272444Sjkim if (GtCount) 1503272444Sjkim { 1504298714Sjkim GtxTable = ACPI_ADD_PTR ( 1505298714Sjkim ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength); 1506272444Sjkim SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY); 1507272444Sjkim 1508272444Sjkim while (GtCount) 1509272444Sjkim { 1510272444Sjkim AcpiOsPrintf ("\n"); 1511272444Sjkim Status = AcpiDmDumpTable (Length, Offset, GtxTable, 1512298714Sjkim sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a); 1513272444Sjkim if (ACPI_FAILURE (Status)) 1514272444Sjkim { 1515272444Sjkim return; 1516272444Sjkim } 1517272444Sjkim Offset += sizeof (ACPI_GTDT_TIMER_ENTRY); 1518272444Sjkim GtxTable++; 1519272444Sjkim GtCount--; 1520272444Sjkim } 1521272444Sjkim } 1522272444Sjkim 1523272444Sjkim /* Point to next subtable */ 1524272444Sjkim 1525272444Sjkim SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength); 1526272444Sjkim } 1527272444Sjkim} 1528272444Sjkim 1529272444Sjkim 1530272444Sjkim/******************************************************************************* 1531272444Sjkim * 1532193529Sjkim * FUNCTION: AcpiDmDumpHest 1533193529Sjkim * 1534193529Sjkim * PARAMETERS: Table - A HEST table 1535193529Sjkim * 1536193529Sjkim * RETURN: None 1537193529Sjkim * 1538193529Sjkim * DESCRIPTION: Format the contents of a HEST. This table type consists 1539193529Sjkim * of an open-ended number of subtables. 1540193529Sjkim * 1541193529Sjkim ******************************************************************************/ 1542193529Sjkim 1543193529Sjkimvoid 1544193529SjkimAcpiDmDumpHest ( 1545193529Sjkim ACPI_TABLE_HEADER *Table) 1546193529Sjkim{ 1547193529Sjkim ACPI_STATUS Status; 1548193529Sjkim ACPI_HEST_HEADER *SubTable; 1549193529Sjkim UINT32 Length = Table->Length; 1550193529Sjkim UINT32 Offset = sizeof (ACPI_TABLE_HEST); 1551193529Sjkim ACPI_DMTABLE_INFO *InfoTable; 1552193529Sjkim UINT32 SubTableLength; 1553197104Sjkim UINT32 BankCount; 1554197104Sjkim ACPI_HEST_IA_ERROR_BANK *BankTable; 1555193529Sjkim 1556193529Sjkim 1557193529Sjkim /* Main table */ 1558193529Sjkim 1559193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest); 1560193529Sjkim if (ACPI_FAILURE (Status)) 1561193529Sjkim { 1562193529Sjkim return; 1563193529Sjkim } 1564193529Sjkim 1565272444Sjkim /* Subtables */ 1566193529Sjkim 1567193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); 1568193529Sjkim while (Offset < Table->Length) 1569193529Sjkim { 1570197104Sjkim BankCount = 0; 1571193529Sjkim switch (SubTable->Type) 1572193529Sjkim { 1573197104Sjkim case ACPI_HEST_TYPE_IA32_CHECK: 1574250838Sjkim 1575193529Sjkim InfoTable = AcpiDmTableInfoHest0; 1576197104Sjkim SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); 1577197104Sjkim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 1578298714Sjkim SubTable))->NumHardwareBanks; 1579193529Sjkim break; 1580193529Sjkim 1581197104Sjkim case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 1582250838Sjkim 1583193529Sjkim InfoTable = AcpiDmTableInfoHest1; 1584197104Sjkim SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED); 1585197104Sjkim BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 1586298714Sjkim SubTable))->NumHardwareBanks; 1587193529Sjkim break; 1588193529Sjkim 1589197104Sjkim case ACPI_HEST_TYPE_IA32_NMI: 1590250838Sjkim 1591197104Sjkim InfoTable = AcpiDmTableInfoHest2; 1592197104Sjkim SubTableLength = sizeof (ACPI_HEST_IA_NMI); 1593193529Sjkim break; 1594193529Sjkim 1595193529Sjkim case ACPI_HEST_TYPE_AER_ROOT_PORT: 1596250838Sjkim 1597193529Sjkim InfoTable = AcpiDmTableInfoHest6; 1598193529Sjkim SubTableLength = sizeof (ACPI_HEST_AER_ROOT); 1599193529Sjkim break; 1600193529Sjkim 1601193529Sjkim case ACPI_HEST_TYPE_AER_ENDPOINT: 1602250838Sjkim 1603193529Sjkim InfoTable = AcpiDmTableInfoHest7; 1604193529Sjkim SubTableLength = sizeof (ACPI_HEST_AER); 1605193529Sjkim break; 1606193529Sjkim 1607193529Sjkim case ACPI_HEST_TYPE_AER_BRIDGE: 1608250838Sjkim 1609193529Sjkim InfoTable = AcpiDmTableInfoHest8; 1610193529Sjkim SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE); 1611193529Sjkim break; 1612193529Sjkim 1613197104Sjkim case ACPI_HEST_TYPE_GENERIC_ERROR: 1614250838Sjkim 1615193529Sjkim InfoTable = AcpiDmTableInfoHest9; 1616193529Sjkim SubTableLength = sizeof (ACPI_HEST_GENERIC); 1617193529Sjkim break; 1618193529Sjkim 1619298714Sjkim case ACPI_HEST_TYPE_GENERIC_ERROR_V2: 1620298714Sjkim 1621298714Sjkim InfoTable = AcpiDmTableInfoHest10; 1622298714Sjkim SubTableLength = sizeof (ACPI_HEST_GENERIC_V2); 1623298714Sjkim break; 1624298714Sjkim 1625193529Sjkim default: 1626250838Sjkim 1627193529Sjkim /* Cannot continue on unknown type - no length */ 1628193529Sjkim 1629298714Sjkim AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", 1630298714Sjkim SubTable->Type); 1631193529Sjkim return; 1632193529Sjkim } 1633193529Sjkim 1634193529Sjkim AcpiOsPrintf ("\n"); 1635193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 1636298714Sjkim SubTableLength, InfoTable); 1637193529Sjkim if (ACPI_FAILURE (Status)) 1638193529Sjkim { 1639193529Sjkim return; 1640193529Sjkim } 1641193529Sjkim 1642197104Sjkim /* Point to end of current subtable (each subtable above is of fixed length) */ 1643193529Sjkim 1644193529Sjkim Offset += SubTableLength; 1645197104Sjkim 1646197104Sjkim /* If there are any (fixed-length) Error Banks from above, dump them now */ 1647197104Sjkim 1648197104Sjkim if (BankCount) 1649197104Sjkim { 1650298714Sjkim BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, 1651298714Sjkim SubTableLength); 1652197104Sjkim SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); 1653197104Sjkim 1654197104Sjkim while (BankCount) 1655197104Sjkim { 1656197104Sjkim AcpiOsPrintf ("\n"); 1657197104Sjkim Status = AcpiDmDumpTable (Length, Offset, BankTable, 1658298714Sjkim sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank); 1659197104Sjkim if (ACPI_FAILURE (Status)) 1660197104Sjkim { 1661197104Sjkim return; 1662197104Sjkim } 1663298714Sjkim 1664197104Sjkim Offset += sizeof (ACPI_HEST_IA_ERROR_BANK); 1665197104Sjkim BankTable++; 1666197104Sjkim BankCount--; 1667197104Sjkim } 1668197104Sjkim } 1669197104Sjkim 1670272444Sjkim /* Point to next subtable */ 1671197104Sjkim 1672193529Sjkim SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength); 1673193529Sjkim } 1674193529Sjkim} 1675193529Sjkim 1676193529Sjkim 1677193529Sjkim/******************************************************************************* 1678193529Sjkim * 1679283092Sjkim * FUNCTION: AcpiDmDumpIort 1680283092Sjkim * 1681283092Sjkim * PARAMETERS: Table - A IORT table 1682283092Sjkim * 1683283092Sjkim * RETURN: None 1684283092Sjkim * 1685283092Sjkim * DESCRIPTION: Format the contents of a IORT 1686283092Sjkim * 1687283092Sjkim ******************************************************************************/ 1688283092Sjkim 1689283092Sjkimvoid 1690283092SjkimAcpiDmDumpIort ( 1691283092Sjkim ACPI_TABLE_HEADER *Table) 1692283092Sjkim{ 1693283092Sjkim ACPI_STATUS Status; 1694283092Sjkim ACPI_TABLE_IORT *Iort; 1695283092Sjkim ACPI_IORT_NODE *IortNode; 1696283092Sjkim ACPI_IORT_ITS_GROUP *IortItsGroup = NULL; 1697283092Sjkim ACPI_IORT_SMMU *IortSmmu = NULL; 1698283092Sjkim UINT32 Offset; 1699283092Sjkim UINT32 NodeOffset; 1700283092Sjkim UINT32 Length; 1701283092Sjkim ACPI_DMTABLE_INFO *InfoTable; 1702283092Sjkim char *String; 1703283092Sjkim UINT32 i; 1704283092Sjkim 1705283092Sjkim 1706283092Sjkim /* Main table */ 1707283092Sjkim 1708283092Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort); 1709283092Sjkim if (ACPI_FAILURE (Status)) 1710283092Sjkim { 1711283092Sjkim return; 1712283092Sjkim } 1713283092Sjkim 1714283092Sjkim Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table); 1715283092Sjkim Offset = sizeof (ACPI_TABLE_IORT); 1716283092Sjkim 1717283092Sjkim /* Dump the OptionalPadding (optional) */ 1718283092Sjkim 1719283092Sjkim if (Iort->NodeOffset > Offset) 1720283092Sjkim { 1721283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, Table, 1722298714Sjkim Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad); 1723283092Sjkim if (ACPI_FAILURE (Status)) 1724283092Sjkim { 1725283092Sjkim return; 1726283092Sjkim } 1727283092Sjkim } 1728283092Sjkim 1729283092Sjkim Offset = Iort->NodeOffset; 1730283092Sjkim while (Offset < Table->Length) 1731283092Sjkim { 1732283092Sjkim /* Common subtable header */ 1733283092Sjkim 1734283092Sjkim IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset); 1735283092Sjkim AcpiOsPrintf ("\n"); 1736283092Sjkim Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData); 1737283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, 1738298714Sjkim IortNode, Length, AcpiDmTableInfoIortHdr); 1739283092Sjkim if (ACPI_FAILURE (Status)) 1740283092Sjkim { 1741283092Sjkim return; 1742283092Sjkim } 1743283092Sjkim 1744283092Sjkim NodeOffset = Length; 1745283092Sjkim 1746283092Sjkim switch (IortNode->Type) 1747283092Sjkim { 1748283092Sjkim case ACPI_IORT_NODE_ITS_GROUP: 1749283092Sjkim 1750283092Sjkim InfoTable = AcpiDmTableInfoIort0; 1751283092Sjkim Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers); 1752283092Sjkim IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset); 1753283092Sjkim break; 1754283092Sjkim 1755283092Sjkim case ACPI_IORT_NODE_NAMED_COMPONENT: 1756283092Sjkim 1757283092Sjkim InfoTable = AcpiDmTableInfoIort1; 1758283092Sjkim Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName); 1759283092Sjkim String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length); 1760284583Sjkim Length += strlen (String) + 1; 1761283092Sjkim break; 1762283092Sjkim 1763283092Sjkim case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: 1764283092Sjkim 1765283092Sjkim InfoTable = AcpiDmTableInfoIort2; 1766283092Sjkim Length = IortNode->Length - NodeOffset; 1767283092Sjkim break; 1768283092Sjkim 1769283092Sjkim case ACPI_IORT_NODE_SMMU: 1770283092Sjkim 1771283092Sjkim InfoTable = AcpiDmTableInfoIort3; 1772283092Sjkim Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts); 1773283092Sjkim IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset); 1774283092Sjkim break; 1775283092Sjkim 1776298714Sjkim case ACPI_IORT_NODE_SMMU_V3: 1777298714Sjkim 1778298714Sjkim InfoTable = AcpiDmTableInfoIort4; 1779298714Sjkim Length = IortNode->Length - NodeOffset; 1780298714Sjkim break; 1781298714Sjkim 1782283092Sjkim default: 1783283092Sjkim 1784283092Sjkim AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n", 1785283092Sjkim IortNode->Type); 1786283092Sjkim 1787283092Sjkim /* Attempt to continue */ 1788283092Sjkim 1789283092Sjkim if (!IortNode->Length) 1790283092Sjkim { 1791283092Sjkim AcpiOsPrintf ("Invalid zero length IORT node\n"); 1792283092Sjkim return; 1793283092Sjkim } 1794283092Sjkim goto NextSubTable; 1795283092Sjkim } 1796283092Sjkim 1797283092Sjkim /* Dump the node subtable header */ 1798283092Sjkim 1799283092Sjkim AcpiOsPrintf ("\n"); 1800283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1801298714Sjkim ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1802298714Sjkim Length, InfoTable); 1803283092Sjkim if (ACPI_FAILURE (Status)) 1804283092Sjkim { 1805283092Sjkim return; 1806283092Sjkim } 1807283092Sjkim 1808283092Sjkim NodeOffset += Length; 1809283092Sjkim 1810283092Sjkim /* Dump the node specific data */ 1811283092Sjkim 1812283092Sjkim switch (IortNode->Type) 1813283092Sjkim { 1814283092Sjkim case ACPI_IORT_NODE_ITS_GROUP: 1815283092Sjkim 1816283092Sjkim /* Validate IortItsGroup to avoid compiler warnings */ 1817283092Sjkim 1818283092Sjkim if (IortItsGroup) 1819283092Sjkim { 1820283092Sjkim for (i = 0; i < IortItsGroup->ItsCount; i++) 1821283092Sjkim { 1822283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1823298714Sjkim ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1824298714Sjkim 4, AcpiDmTableInfoIort0a); 1825283092Sjkim NodeOffset += 4; 1826283092Sjkim } 1827283092Sjkim } 1828283092Sjkim break; 1829283092Sjkim 1830283092Sjkim case ACPI_IORT_NODE_NAMED_COMPONENT: 1831283092Sjkim 1832283092Sjkim /* Dump the Padding (optional) */ 1833283092Sjkim 1834283092Sjkim if (IortNode->Length > NodeOffset) 1835283092Sjkim { 1836283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1837298714Sjkim Table, IortNode->Length - NodeOffset, 1838298714Sjkim AcpiDmTableInfoIort1a); 1839283092Sjkim if (ACPI_FAILURE (Status)) 1840283092Sjkim { 1841283092Sjkim return; 1842283092Sjkim } 1843283092Sjkim } 1844283092Sjkim break; 1845283092Sjkim 1846283092Sjkim case ACPI_IORT_NODE_SMMU: 1847283092Sjkim 1848283092Sjkim AcpiOsPrintf ("\n"); 1849283092Sjkim 1850283092Sjkim /* Validate IortSmmu to avoid compiler warnings */ 1851283092Sjkim 1852283092Sjkim if (IortSmmu) 1853283092Sjkim { 1854283092Sjkim Length = 2 * sizeof (UINT64); 1855283092Sjkim NodeOffset = IortSmmu->GlobalInterruptOffset; 1856283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1857298714Sjkim ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1858298714Sjkim Length, AcpiDmTableInfoIort3a); 1859285797Sjkim if (ACPI_FAILURE (Status)) 1860285797Sjkim { 1861285797Sjkim return; 1862285797Sjkim } 1863283092Sjkim 1864283092Sjkim NodeOffset = IortSmmu->ContextInterruptOffset; 1865283092Sjkim for (i = 0; i < IortSmmu->ContextInterruptCount; i++) 1866283092Sjkim { 1867283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1868298714Sjkim ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1869298714Sjkim 8, AcpiDmTableInfoIort3b); 1870285797Sjkim if (ACPI_FAILURE (Status)) 1871285797Sjkim { 1872285797Sjkim return; 1873285797Sjkim } 1874298714Sjkim 1875283092Sjkim NodeOffset += 8; 1876283092Sjkim } 1877283092Sjkim 1878283092Sjkim NodeOffset = IortSmmu->PmuInterruptOffset; 1879283092Sjkim for (i = 0; i < IortSmmu->PmuInterruptCount; i++) 1880283092Sjkim { 1881283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1882298714Sjkim ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1883298714Sjkim 8, AcpiDmTableInfoIort3c); 1884285797Sjkim if (ACPI_FAILURE (Status)) 1885285797Sjkim { 1886285797Sjkim return; 1887285797Sjkim } 1888298714Sjkim 1889283092Sjkim NodeOffset += 8; 1890283092Sjkim } 1891283092Sjkim } 1892283092Sjkim break; 1893283092Sjkim 1894283092Sjkim default: 1895283092Sjkim 1896283092Sjkim break; 1897283092Sjkim } 1898283092Sjkim 1899283092Sjkim /* Dump the ID mappings */ 1900283092Sjkim 1901283092Sjkim NodeOffset = IortNode->MappingOffset; 1902283092Sjkim for (i = 0; i < IortNode->MappingCount; i++) 1903283092Sjkim { 1904283092Sjkim AcpiOsPrintf ("\n"); 1905283092Sjkim Length = sizeof (ACPI_IORT_ID_MAPPING); 1906283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1907298714Sjkim ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1908298714Sjkim Length, AcpiDmTableInfoIortMap); 1909285797Sjkim if (ACPI_FAILURE (Status)) 1910285797Sjkim { 1911285797Sjkim return; 1912285797Sjkim } 1913298714Sjkim 1914283092Sjkim NodeOffset += Length; 1915283092Sjkim } 1916283092Sjkim 1917283092SjkimNextSubTable: 1918283092Sjkim /* Point to next node subtable */ 1919283092Sjkim 1920283092Sjkim Offset += IortNode->Length; 1921283092Sjkim IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length); 1922283092Sjkim } 1923283092Sjkim} 1924283092Sjkim 1925283092Sjkim 1926283092Sjkim/******************************************************************************* 1927283092Sjkim * 1928197104Sjkim * FUNCTION: AcpiDmDumpIvrs 1929197104Sjkim * 1930197104Sjkim * PARAMETERS: Table - A IVRS table 1931197104Sjkim * 1932197104Sjkim * RETURN: None 1933197104Sjkim * 1934197104Sjkim * DESCRIPTION: Format the contents of a IVRS 1935197104Sjkim * 1936197104Sjkim ******************************************************************************/ 1937197104Sjkim 1938197104Sjkimstatic UINT8 EntrySizes[] = {4,8,16,32}; 1939197104Sjkim 1940197104Sjkimvoid 1941197104SjkimAcpiDmDumpIvrs ( 1942197104Sjkim ACPI_TABLE_HEADER *Table) 1943197104Sjkim{ 1944197104Sjkim ACPI_STATUS Status; 1945197104Sjkim UINT32 Offset = sizeof (ACPI_TABLE_IVRS); 1946197104Sjkim UINT32 EntryOffset; 1947197104Sjkim UINT32 EntryLength; 1948197104Sjkim UINT32 EntryType; 1949197104Sjkim ACPI_IVRS_DE_HEADER *DeviceEntry; 1950197104Sjkim ACPI_IVRS_HEADER *SubTable; 1951197104Sjkim ACPI_DMTABLE_INFO *InfoTable; 1952197104Sjkim 1953197104Sjkim 1954197104Sjkim /* Main table */ 1955197104Sjkim 1956197104Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); 1957197104Sjkim if (ACPI_FAILURE (Status)) 1958197104Sjkim { 1959197104Sjkim return; 1960197104Sjkim } 1961197104Sjkim 1962272444Sjkim /* Subtables */ 1963197104Sjkim 1964197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); 1965197104Sjkim while (Offset < Table->Length) 1966197104Sjkim { 1967272444Sjkim /* Common subtable header */ 1968197104Sjkim 1969197104Sjkim AcpiOsPrintf ("\n"); 1970197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1971298714Sjkim SubTable->Length, AcpiDmTableInfoIvrsHdr); 1972197104Sjkim if (ACPI_FAILURE (Status)) 1973197104Sjkim { 1974197104Sjkim return; 1975197104Sjkim } 1976197104Sjkim 1977197104Sjkim switch (SubTable->Type) 1978197104Sjkim { 1979197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1980250838Sjkim 1981197104Sjkim InfoTable = AcpiDmTableInfoIvrs0; 1982197104Sjkim break; 1983250838Sjkim 1984197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1985197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1986197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1987250838Sjkim 1988197104Sjkim InfoTable = AcpiDmTableInfoIvrs1; 1989197104Sjkim break; 1990250838Sjkim 1991197104Sjkim default: 1992250838Sjkim 1993272444Sjkim AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n", 1994197104Sjkim SubTable->Type); 1995197104Sjkim 1996197104Sjkim /* Attempt to continue */ 1997197104Sjkim 1998197104Sjkim if (!SubTable->Length) 1999197104Sjkim { 2000197104Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 2001197104Sjkim return; 2002197104Sjkim } 2003197104Sjkim goto NextSubTable; 2004197104Sjkim } 2005197104Sjkim 2006197104Sjkim /* Dump the subtable */ 2007197104Sjkim 2008197104Sjkim AcpiOsPrintf ("\n"); 2009197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2010298714Sjkim SubTable->Length, InfoTable); 2011197104Sjkim if (ACPI_FAILURE (Status)) 2012197104Sjkim { 2013197104Sjkim return; 2014197104Sjkim } 2015197104Sjkim 2016197104Sjkim /* The hardware subtable can contain multiple device entries */ 2017197104Sjkim 2018197104Sjkim if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE) 2019197104Sjkim { 2020197104Sjkim EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); 2021197104Sjkim DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable, 2022298714Sjkim sizeof (ACPI_IVRS_HARDWARE)); 2023197104Sjkim 2024197104Sjkim while (EntryOffset < (Offset + SubTable->Length)) 2025197104Sjkim { 2026197104Sjkim AcpiOsPrintf ("\n"); 2027197104Sjkim /* 2028197104Sjkim * Upper 2 bits of Type encode the length of the device entry 2029197104Sjkim * 2030197104Sjkim * 00 = 4 byte 2031197104Sjkim * 01 = 8 byte 2032197104Sjkim * 10 = 16 byte - currently no entries defined 2033197104Sjkim * 11 = 32 byte - currently no entries defined 2034197104Sjkim */ 2035197104Sjkim EntryType = DeviceEntry->Type; 2036197104Sjkim EntryLength = EntrySizes [EntryType >> 6]; 2037197104Sjkim 2038197104Sjkim switch (EntryType) 2039197104Sjkim { 2040197104Sjkim /* 4-byte device entries */ 2041197104Sjkim 2042197104Sjkim case ACPI_IVRS_TYPE_PAD4: 2043197104Sjkim case ACPI_IVRS_TYPE_ALL: 2044197104Sjkim case ACPI_IVRS_TYPE_SELECT: 2045197104Sjkim case ACPI_IVRS_TYPE_START: 2046197104Sjkim case ACPI_IVRS_TYPE_END: 2047197104Sjkim 2048197104Sjkim InfoTable = AcpiDmTableInfoIvrs4; 2049197104Sjkim break; 2050197104Sjkim 2051197104Sjkim /* 8-byte entries, type A */ 2052197104Sjkim 2053197104Sjkim case ACPI_IVRS_TYPE_ALIAS_SELECT: 2054197104Sjkim case ACPI_IVRS_TYPE_ALIAS_START: 2055197104Sjkim 2056197104Sjkim InfoTable = AcpiDmTableInfoIvrs8a; 2057197104Sjkim break; 2058197104Sjkim 2059197104Sjkim /* 8-byte entries, type B */ 2060197104Sjkim 2061197104Sjkim case ACPI_IVRS_TYPE_PAD8: 2062197104Sjkim case ACPI_IVRS_TYPE_EXT_SELECT: 2063197104Sjkim case ACPI_IVRS_TYPE_EXT_START: 2064197104Sjkim 2065197104Sjkim InfoTable = AcpiDmTableInfoIvrs8b; 2066197104Sjkim break; 2067197104Sjkim 2068197104Sjkim /* 8-byte entries, type C */ 2069197104Sjkim 2070197104Sjkim case ACPI_IVRS_TYPE_SPECIAL: 2071197104Sjkim 2072197104Sjkim InfoTable = AcpiDmTableInfoIvrs8c; 2073197104Sjkim break; 2074197104Sjkim 2075197104Sjkim default: 2076197104Sjkim InfoTable = AcpiDmTableInfoIvrs4; 2077197104Sjkim AcpiOsPrintf ( 2078197104Sjkim "\n**** Unknown IVRS device entry type/length: " 2079204773Sjkim "0x%.2X/0x%X at offset 0x%.4X: (header below)\n", 2080197104Sjkim EntryType, EntryLength, EntryOffset); 2081197104Sjkim break; 2082197104Sjkim } 2083197104Sjkim 2084197104Sjkim /* Dump the Device Entry */ 2085197104Sjkim 2086197104Sjkim Status = AcpiDmDumpTable (Table->Length, EntryOffset, 2087298714Sjkim DeviceEntry, EntryLength, InfoTable); 2088285797Sjkim if (ACPI_FAILURE (Status)) 2089285797Sjkim { 2090285797Sjkim return; 2091285797Sjkim } 2092197104Sjkim 2093197104Sjkim EntryOffset += EntryLength; 2094197104Sjkim DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry, 2095298714Sjkim EntryLength); 2096197104Sjkim } 2097197104Sjkim } 2098197104Sjkim 2099197104SjkimNextSubTable: 2100272444Sjkim /* Point to next subtable */ 2101197104Sjkim 2102197104Sjkim Offset += SubTable->Length; 2103197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length); 2104197104Sjkim } 2105197104Sjkim} 2106197104Sjkim 2107197104Sjkim 2108197104Sjkim/******************************************************************************* 2109197104Sjkim * 2110272444Sjkim * FUNCTION: AcpiDmDumpLpit 2111272444Sjkim * 2112272444Sjkim * PARAMETERS: Table - A LPIT table 2113272444Sjkim * 2114272444Sjkim * RETURN: None 2115272444Sjkim * 2116272444Sjkim * DESCRIPTION: Format the contents of a LPIT. This table type consists 2117272444Sjkim * of an open-ended number of subtables. Note: There are no 2118272444Sjkim * entries in the main table. An LPIT consists of the table 2119272444Sjkim * header and then subtables only. 2120272444Sjkim * 2121272444Sjkim ******************************************************************************/ 2122272444Sjkim 2123272444Sjkimvoid 2124272444SjkimAcpiDmDumpLpit ( 2125272444Sjkim ACPI_TABLE_HEADER *Table) 2126272444Sjkim{ 2127272444Sjkim ACPI_STATUS Status; 2128272444Sjkim ACPI_LPIT_HEADER *SubTable; 2129272444Sjkim UINT32 Length = Table->Length; 2130272444Sjkim UINT32 Offset = sizeof (ACPI_TABLE_LPIT); 2131272444Sjkim ACPI_DMTABLE_INFO *InfoTable; 2132272444Sjkim UINT32 SubTableLength; 2133272444Sjkim 2134272444Sjkim 2135272444Sjkim /* Subtables */ 2136272444Sjkim 2137272444Sjkim SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); 2138272444Sjkim while (Offset < Table->Length) 2139272444Sjkim { 2140272444Sjkim /* Common subtable header */ 2141272444Sjkim 2142272444Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2143298714Sjkim sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr); 2144272444Sjkim if (ACPI_FAILURE (Status)) 2145272444Sjkim { 2146272444Sjkim return; 2147272444Sjkim } 2148272444Sjkim 2149272444Sjkim switch (SubTable->Type) 2150272444Sjkim { 2151272444Sjkim case ACPI_LPIT_TYPE_NATIVE_CSTATE: 2152272444Sjkim 2153272444Sjkim InfoTable = AcpiDmTableInfoLpit0; 2154272444Sjkim SubTableLength = sizeof (ACPI_LPIT_NATIVE); 2155272444Sjkim break; 2156272444Sjkim 2157272444Sjkim default: 2158272444Sjkim 2159272444Sjkim /* Cannot continue on unknown type - no length */ 2160272444Sjkim 2161298714Sjkim AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", 2162298714Sjkim SubTable->Type); 2163272444Sjkim return; 2164272444Sjkim } 2165272444Sjkim 2166272444Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2167298714Sjkim SubTableLength, InfoTable); 2168272444Sjkim if (ACPI_FAILURE (Status)) 2169272444Sjkim { 2170272444Sjkim return; 2171272444Sjkim } 2172298714Sjkim 2173272444Sjkim AcpiOsPrintf ("\n"); 2174272444Sjkim 2175272444Sjkim /* Point to next subtable */ 2176272444Sjkim 2177272444Sjkim Offset += SubTableLength; 2178272444Sjkim SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength); 2179272444Sjkim } 2180272444Sjkim} 2181272444Sjkim 2182272444Sjkim 2183272444Sjkim/******************************************************************************* 2184272444Sjkim * 2185167802Sjkim * FUNCTION: AcpiDmDumpMadt 2186167802Sjkim * 2187167802Sjkim * PARAMETERS: Table - A MADT table 2188167802Sjkim * 2189167802Sjkim * RETURN: None 2190167802Sjkim * 2191167802Sjkim * DESCRIPTION: Format the contents of a MADT. This table type consists 2192167802Sjkim * of an open-ended number of subtables. 2193167802Sjkim * 2194167802Sjkim ******************************************************************************/ 2195167802Sjkim 2196167802Sjkimvoid 2197167802SjkimAcpiDmDumpMadt ( 2198167802Sjkim ACPI_TABLE_HEADER *Table) 2199167802Sjkim{ 2200193529Sjkim ACPI_STATUS Status; 2201167802Sjkim ACPI_SUBTABLE_HEADER *SubTable; 2202167802Sjkim UINT32 Length = Table->Length; 2203167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MADT); 2204167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 2205167802Sjkim 2206167802Sjkim 2207167802Sjkim /* Main table */ 2208167802Sjkim 2209193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt); 2210193529Sjkim if (ACPI_FAILURE (Status)) 2211193529Sjkim { 2212193529Sjkim return; 2213193529Sjkim } 2214167802Sjkim 2215272444Sjkim /* Subtables */ 2216167802Sjkim 2217167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 2218167802Sjkim while (Offset < Table->Length) 2219167802Sjkim { 2220272444Sjkim /* Common subtable header */ 2221167802Sjkim 2222167802Sjkim AcpiOsPrintf ("\n"); 2223193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2224298714Sjkim SubTable->Length, AcpiDmTableInfoMadtHdr); 2225193529Sjkim if (ACPI_FAILURE (Status)) 2226193529Sjkim { 2227193529Sjkim return; 2228193529Sjkim } 2229167802Sjkim 2230167802Sjkim switch (SubTable->Type) 2231167802Sjkim { 2232167802Sjkim case ACPI_MADT_TYPE_LOCAL_APIC: 2233250838Sjkim 2234167802Sjkim InfoTable = AcpiDmTableInfoMadt0; 2235167802Sjkim break; 2236250838Sjkim 2237167802Sjkim case ACPI_MADT_TYPE_IO_APIC: 2238250838Sjkim 2239167802Sjkim InfoTable = AcpiDmTableInfoMadt1; 2240167802Sjkim break; 2241250838Sjkim 2242167802Sjkim case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 2243250838Sjkim 2244167802Sjkim InfoTable = AcpiDmTableInfoMadt2; 2245167802Sjkim break; 2246250838Sjkim 2247167802Sjkim case ACPI_MADT_TYPE_NMI_SOURCE: 2248250838Sjkim 2249167802Sjkim InfoTable = AcpiDmTableInfoMadt3; 2250167802Sjkim break; 2251250838Sjkim 2252167802Sjkim case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 2253250838Sjkim 2254167802Sjkim InfoTable = AcpiDmTableInfoMadt4; 2255167802Sjkim break; 2256250838Sjkim 2257167802Sjkim case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 2258250838Sjkim 2259167802Sjkim InfoTable = AcpiDmTableInfoMadt5; 2260167802Sjkim break; 2261250838Sjkim 2262167802Sjkim case ACPI_MADT_TYPE_IO_SAPIC: 2263250838Sjkim 2264167802Sjkim InfoTable = AcpiDmTableInfoMadt6; 2265167802Sjkim break; 2266250838Sjkim 2267167802Sjkim case ACPI_MADT_TYPE_LOCAL_SAPIC: 2268250838Sjkim 2269167802Sjkim InfoTable = AcpiDmTableInfoMadt7; 2270167802Sjkim break; 2271250838Sjkim 2272167802Sjkim case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 2273250838Sjkim 2274167802Sjkim InfoTable = AcpiDmTableInfoMadt8; 2275167802Sjkim break; 2276250838Sjkim 2277193529Sjkim case ACPI_MADT_TYPE_LOCAL_X2APIC: 2278250838Sjkim 2279193529Sjkim InfoTable = AcpiDmTableInfoMadt9; 2280193529Sjkim break; 2281250838Sjkim 2282193529Sjkim case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 2283250838Sjkim 2284193529Sjkim InfoTable = AcpiDmTableInfoMadt10; 2285193529Sjkim break; 2286250838Sjkim 2287228110Sjkim case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 2288250838Sjkim 2289228110Sjkim InfoTable = AcpiDmTableInfoMadt11; 2290228110Sjkim break; 2291250838Sjkim 2292228110Sjkim case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 2293250838Sjkim 2294228110Sjkim InfoTable = AcpiDmTableInfoMadt12; 2295228110Sjkim break; 2296250838Sjkim 2297272444Sjkim case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 2298272444Sjkim 2299272444Sjkim InfoTable = AcpiDmTableInfoMadt13; 2300272444Sjkim break; 2301272444Sjkim 2302272444Sjkim case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 2303272444Sjkim 2304272444Sjkim InfoTable = AcpiDmTableInfoMadt14; 2305272444Sjkim break; 2306272444Sjkim 2307283092Sjkim case ACPI_MADT_TYPE_GENERIC_TRANSLATOR: 2308283092Sjkim 2309283092Sjkim InfoTable = AcpiDmTableInfoMadt15; 2310283092Sjkim break; 2311283092Sjkim 2312167802Sjkim default: 2313250838Sjkim 2314298714Sjkim AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", 2315298714Sjkim SubTable->Type); 2316193529Sjkim 2317193529Sjkim /* Attempt to continue */ 2318193529Sjkim 2319193529Sjkim if (!SubTable->Length) 2320193529Sjkim { 2321193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 2322193529Sjkim return; 2323193529Sjkim } 2324298714Sjkim 2325193529Sjkim goto NextSubTable; 2326193529Sjkim } 2327193529Sjkim 2328193529Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2329298714Sjkim SubTable->Length, InfoTable); 2330193529Sjkim if (ACPI_FAILURE (Status)) 2331193529Sjkim { 2332167802Sjkim return; 2333167802Sjkim } 2334167802Sjkim 2335193529SjkimNextSubTable: 2336272444Sjkim /* Point to next subtable */ 2337167802Sjkim 2338167802Sjkim Offset += SubTable->Length; 2339298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, 2340298714Sjkim SubTable->Length); 2341167802Sjkim } 2342167802Sjkim} 2343167802Sjkim 2344167802Sjkim 2345167802Sjkim/******************************************************************************* 2346167802Sjkim * 2347167802Sjkim * FUNCTION: AcpiDmDumpMcfg 2348167802Sjkim * 2349167802Sjkim * PARAMETERS: Table - A MCFG Table 2350167802Sjkim * 2351167802Sjkim * RETURN: None 2352167802Sjkim * 2353167802Sjkim * DESCRIPTION: Format the contents of a MCFG table 2354167802Sjkim * 2355167802Sjkim ******************************************************************************/ 2356167802Sjkim 2357167802Sjkimvoid 2358167802SjkimAcpiDmDumpMcfg ( 2359167802Sjkim ACPI_TABLE_HEADER *Table) 2360167802Sjkim{ 2361193529Sjkim ACPI_STATUS Status; 2362167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MCFG); 2363167802Sjkim ACPI_MCFG_ALLOCATION *SubTable; 2364167802Sjkim 2365167802Sjkim 2366167802Sjkim /* Main table */ 2367167802Sjkim 2368193529Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); 2369193529Sjkim if (ACPI_FAILURE (Status)) 2370193529Sjkim { 2371193529Sjkim return; 2372193529Sjkim } 2373167802Sjkim 2374272444Sjkim /* Subtables */ 2375167802Sjkim 2376167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); 2377167802Sjkim while (Offset < Table->Length) 2378167802Sjkim { 2379167802Sjkim if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) 2380167802Sjkim { 2381209746Sjkim AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", 2382167802Sjkim sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); 2383167802Sjkim return; 2384167802Sjkim } 2385167802Sjkim 2386167802Sjkim AcpiOsPrintf ("\n"); 2387193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2388298714Sjkim sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); 2389193529Sjkim if (ACPI_FAILURE (Status)) 2390193529Sjkim { 2391193529Sjkim return; 2392193529Sjkim } 2393167802Sjkim 2394272444Sjkim /* Point to next subtable (each subtable is of fixed length) */ 2395167802Sjkim 2396167802Sjkim Offset += sizeof (ACPI_MCFG_ALLOCATION); 2397167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable, 2398298714Sjkim sizeof (ACPI_MCFG_ALLOCATION)); 2399167802Sjkim } 2400167802Sjkim} 2401167802Sjkim 2402167802Sjkim 2403167802Sjkim/******************************************************************************* 2404167802Sjkim * 2405228110Sjkim * FUNCTION: AcpiDmDumpMpst 2406228110Sjkim * 2407228110Sjkim * PARAMETERS: Table - A MPST Table 2408228110Sjkim * 2409228110Sjkim * RETURN: None 2410228110Sjkim * 2411228110Sjkim * DESCRIPTION: Format the contents of a MPST table 2412228110Sjkim * 2413228110Sjkim ******************************************************************************/ 2414228110Sjkim 2415228110Sjkimvoid 2416228110SjkimAcpiDmDumpMpst ( 2417228110Sjkim ACPI_TABLE_HEADER *Table) 2418228110Sjkim{ 2419228110Sjkim ACPI_STATUS Status; 2420228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MPST); 2421228110Sjkim ACPI_MPST_POWER_NODE *SubTable0; 2422228110Sjkim ACPI_MPST_POWER_STATE *SubTable0A; 2423228110Sjkim ACPI_MPST_COMPONENT *SubTable0B; 2424228110Sjkim ACPI_MPST_DATA_HDR *SubTable1; 2425228110Sjkim ACPI_MPST_POWER_DATA *SubTable2; 2426228110Sjkim UINT16 SubtableCount; 2427241973Sjkim UINT32 PowerStateCount; 2428241973Sjkim UINT32 ComponentCount; 2429228110Sjkim 2430228110Sjkim 2431228110Sjkim /* Main table */ 2432228110Sjkim 2433228110Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); 2434228110Sjkim if (ACPI_FAILURE (Status)) 2435228110Sjkim { 2436228110Sjkim return; 2437228110Sjkim } 2438228110Sjkim 2439228110Sjkim /* Subtable: Memory Power Node(s) */ 2440228110Sjkim 2441228110Sjkim SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; 2442228110Sjkim SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); 2443228110Sjkim 2444228110Sjkim while ((Offset < Table->Length) && SubtableCount) 2445228110Sjkim { 2446228110Sjkim AcpiOsPrintf ("\n"); 2447228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0, 2448298714Sjkim sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); 2449228110Sjkim if (ACPI_FAILURE (Status)) 2450228110Sjkim { 2451228110Sjkim return; 2452228110Sjkim } 2453228110Sjkim 2454228110Sjkim /* Extract the sub-subtable counts */ 2455228110Sjkim 2456228110Sjkim PowerStateCount = SubTable0->NumPowerStates; 2457228110Sjkim ComponentCount = SubTable0->NumPhysicalComponents; 2458228110Sjkim Offset += sizeof (ACPI_MPST_POWER_NODE); 2459228110Sjkim 2460228110Sjkim /* Sub-subtables - Memory Power State Structure(s) */ 2461228110Sjkim 2462228110Sjkim SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0, 2463228110Sjkim sizeof (ACPI_MPST_POWER_NODE)); 2464228110Sjkim 2465228110Sjkim while (PowerStateCount) 2466228110Sjkim { 2467228110Sjkim AcpiOsPrintf ("\n"); 2468228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A, 2469298714Sjkim sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); 2470228110Sjkim if (ACPI_FAILURE (Status)) 2471228110Sjkim { 2472228110Sjkim return; 2473228110Sjkim } 2474228110Sjkim 2475228110Sjkim SubTable0A++; 2476228110Sjkim PowerStateCount--; 2477228110Sjkim Offset += sizeof (ACPI_MPST_POWER_STATE); 2478228110Sjkim } 2479228110Sjkim 2480228110Sjkim /* Sub-subtables - Physical Component ID Structure(s) */ 2481228110Sjkim 2482228110Sjkim SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A); 2483228110Sjkim 2484228110Sjkim if (ComponentCount) 2485228110Sjkim { 2486228110Sjkim AcpiOsPrintf ("\n"); 2487228110Sjkim } 2488228110Sjkim 2489228110Sjkim while (ComponentCount) 2490228110Sjkim { 2491228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B, 2492298714Sjkim sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); 2493228110Sjkim if (ACPI_FAILURE (Status)) 2494228110Sjkim { 2495228110Sjkim return; 2496228110Sjkim } 2497228110Sjkim 2498228110Sjkim SubTable0B++; 2499228110Sjkim ComponentCount--; 2500228110Sjkim Offset += sizeof (ACPI_MPST_COMPONENT); 2501228110Sjkim } 2502228110Sjkim 2503228110Sjkim /* Point to next Memory Power Node subtable */ 2504228110Sjkim 2505228110Sjkim SubtableCount--; 2506228110Sjkim SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0, 2507228110Sjkim sizeof (ACPI_MPST_POWER_NODE) + 2508228110Sjkim (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) + 2509228110Sjkim (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents)); 2510228110Sjkim } 2511228110Sjkim 2512228110Sjkim /* Subtable: Count of Memory Power State Characteristic structures */ 2513228110Sjkim 2514228110Sjkim AcpiOsPrintf ("\n"); 2515228110Sjkim SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0); 2516228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1, 2517298714Sjkim sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); 2518228110Sjkim if (ACPI_FAILURE (Status)) 2519228110Sjkim { 2520228110Sjkim return; 2521228110Sjkim } 2522228110Sjkim 2523228110Sjkim SubtableCount = SubTable1->CharacteristicsCount; 2524228110Sjkim Offset += sizeof (ACPI_MPST_DATA_HDR); 2525228110Sjkim 2526228110Sjkim /* Subtable: Memory Power State Characteristics structure(s) */ 2527228110Sjkim 2528298714Sjkim SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, 2529298714Sjkim sizeof (ACPI_MPST_DATA_HDR)); 2530228110Sjkim 2531228110Sjkim while ((Offset < Table->Length) && SubtableCount) 2532228110Sjkim { 2533228110Sjkim AcpiOsPrintf ("\n"); 2534228110Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2, 2535298714Sjkim sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); 2536228110Sjkim if (ACPI_FAILURE (Status)) 2537228110Sjkim { 2538228110Sjkim return; 2539228110Sjkim } 2540228110Sjkim 2541228110Sjkim SubTable2++; 2542228110Sjkim SubtableCount--; 2543228110Sjkim Offset += sizeof (ACPI_MPST_POWER_DATA); 2544228110Sjkim } 2545228110Sjkim} 2546228110Sjkim 2547228110Sjkim 2548228110Sjkim/******************************************************************************* 2549228110Sjkim * 2550197104Sjkim * FUNCTION: AcpiDmDumpMsct 2551197104Sjkim * 2552197104Sjkim * PARAMETERS: Table - A MSCT table 2553197104Sjkim * 2554197104Sjkim * RETURN: None 2555197104Sjkim * 2556197104Sjkim * DESCRIPTION: Format the contents of a MSCT 2557197104Sjkim * 2558197104Sjkim ******************************************************************************/ 2559197104Sjkim 2560197104Sjkimvoid 2561197104SjkimAcpiDmDumpMsct ( 2562197104Sjkim ACPI_TABLE_HEADER *Table) 2563197104Sjkim{ 2564197104Sjkim ACPI_STATUS Status; 2565197104Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MSCT); 2566197104Sjkim ACPI_MSCT_PROXIMITY *SubTable; 2567197104Sjkim 2568197104Sjkim 2569197104Sjkim /* Main table */ 2570197104Sjkim 2571197104Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); 2572197104Sjkim if (ACPI_FAILURE (Status)) 2573197104Sjkim { 2574197104Sjkim return; 2575197104Sjkim } 2576197104Sjkim 2577272444Sjkim /* Subtables */ 2578197104Sjkim 2579197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); 2580197104Sjkim while (Offset < Table->Length) 2581197104Sjkim { 2582272444Sjkim /* Common subtable header */ 2583197104Sjkim 2584197104Sjkim AcpiOsPrintf ("\n"); 2585197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2586298714Sjkim sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); 2587197104Sjkim if (ACPI_FAILURE (Status)) 2588197104Sjkim { 2589197104Sjkim return; 2590197104Sjkim } 2591197104Sjkim 2592272444Sjkim /* Point to next subtable */ 2593197104Sjkim 2594197104Sjkim Offset += sizeof (ACPI_MSCT_PROXIMITY); 2595298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, 2596298714Sjkim sizeof (ACPI_MSCT_PROXIMITY)); 2597197104Sjkim } 2598197104Sjkim} 2599197104Sjkim 2600197104Sjkim 2601197104Sjkim/******************************************************************************* 2602197104Sjkim * 2603246849Sjkim * FUNCTION: AcpiDmDumpMtmr 2604246849Sjkim * 2605246849Sjkim * PARAMETERS: Table - A MTMR table 2606246849Sjkim * 2607246849Sjkim * RETURN: None 2608246849Sjkim * 2609246849Sjkim * DESCRIPTION: Format the contents of a MTMR 2610246849Sjkim * 2611246849Sjkim ******************************************************************************/ 2612246849Sjkim 2613246849Sjkimvoid 2614246849SjkimAcpiDmDumpMtmr ( 2615246849Sjkim ACPI_TABLE_HEADER *Table) 2616246849Sjkim{ 2617246849Sjkim ACPI_STATUS Status; 2618246849Sjkim UINT32 Offset = sizeof (ACPI_TABLE_MTMR); 2619246849Sjkim ACPI_MTMR_ENTRY *SubTable; 2620246849Sjkim 2621246849Sjkim 2622246849Sjkim /* Main table */ 2623246849Sjkim 2624246849Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr); 2625246849Sjkim if (ACPI_FAILURE (Status)) 2626246849Sjkim { 2627246849Sjkim return; 2628246849Sjkim } 2629246849Sjkim 2630272444Sjkim /* Subtables */ 2631246849Sjkim 2632246849Sjkim SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset); 2633246849Sjkim while (Offset < Table->Length) 2634246849Sjkim { 2635272444Sjkim /* Common subtable header */ 2636246849Sjkim 2637246849Sjkim AcpiOsPrintf ("\n"); 2638246849Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2639298714Sjkim sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0); 2640246849Sjkim if (ACPI_FAILURE (Status)) 2641246849Sjkim { 2642246849Sjkim return; 2643246849Sjkim } 2644246849Sjkim 2645272444Sjkim /* Point to next subtable */ 2646246849Sjkim 2647246849Sjkim Offset += sizeof (ACPI_MTMR_ENTRY); 2648298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, 2649298714Sjkim sizeof (ACPI_MTMR_ENTRY)); 2650246849Sjkim } 2651246849Sjkim} 2652246849Sjkim 2653246849Sjkim 2654246849Sjkim/******************************************************************************* 2655246849Sjkim * 2656283092Sjkim * FUNCTION: AcpiDmDumpNfit 2657283092Sjkim * 2658283092Sjkim * PARAMETERS: Table - A NFIT table 2659283092Sjkim * 2660283092Sjkim * RETURN: None 2661283092Sjkim * 2662283092Sjkim * DESCRIPTION: Format the contents of an NFIT. 2663283092Sjkim * 2664283092Sjkim ******************************************************************************/ 2665283092Sjkim 2666283092Sjkimvoid 2667283092SjkimAcpiDmDumpNfit ( 2668283092Sjkim ACPI_TABLE_HEADER *Table) 2669283092Sjkim{ 2670283092Sjkim ACPI_STATUS Status; 2671283092Sjkim UINT32 Offset = sizeof (ACPI_TABLE_NFIT); 2672283092Sjkim UINT32 FieldOffset = 0; 2673283092Sjkim UINT32 Length; 2674283092Sjkim ACPI_NFIT_HEADER *SubTable; 2675283092Sjkim ACPI_DMTABLE_INFO *InfoTable; 2676283092Sjkim ACPI_NFIT_INTERLEAVE *Interleave = NULL; 2677283092Sjkim ACPI_NFIT_SMBIOS *SmbiosInfo = NULL; 2678283092Sjkim ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; 2679283092Sjkim UINT32 i; 2680283092Sjkim 2681283092Sjkim 2682283092Sjkim /* Main table */ 2683283092Sjkim 2684283092Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit); 2685283092Sjkim if (ACPI_FAILURE (Status)) 2686283092Sjkim { 2687283092Sjkim return; 2688283092Sjkim } 2689283092Sjkim 2690283092Sjkim /* Subtables */ 2691283092Sjkim 2692283092Sjkim SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset); 2693283092Sjkim while (Offset < Table->Length) 2694283092Sjkim { 2695283092Sjkim /* NFIT subtable header */ 2696283092Sjkim 2697283092Sjkim AcpiOsPrintf ("\n"); 2698283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2699298714Sjkim SubTable->Length, AcpiDmTableInfoNfitHdr); 2700283092Sjkim if (ACPI_FAILURE (Status)) 2701283092Sjkim { 2702283092Sjkim return; 2703283092Sjkim } 2704283092Sjkim 2705283092Sjkim switch (SubTable->Type) 2706283092Sjkim { 2707283092Sjkim case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 2708283092Sjkim 2709283092Sjkim InfoTable = AcpiDmTableInfoNfit0; 2710283092Sjkim break; 2711283092Sjkim 2712283092Sjkim case ACPI_NFIT_TYPE_MEMORY_MAP: 2713283092Sjkim 2714283092Sjkim InfoTable = AcpiDmTableInfoNfit1; 2715283092Sjkim break; 2716283092Sjkim 2717283092Sjkim case ACPI_NFIT_TYPE_INTERLEAVE: 2718283092Sjkim 2719283092Sjkim /* Has a variable number of 32-bit values at the end */ 2720283092Sjkim 2721283092Sjkim InfoTable = AcpiDmTableInfoNfit2; 2722283092Sjkim Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable); 2723283092Sjkim FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE); 2724283092Sjkim break; 2725283092Sjkim 2726283092Sjkim case ACPI_NFIT_TYPE_SMBIOS: 2727283092Sjkim 2728283092Sjkim SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable); 2729283092Sjkim InfoTable = AcpiDmTableInfoNfit3; 2730283092Sjkim break; 2731283092Sjkim 2732283092Sjkim case ACPI_NFIT_TYPE_CONTROL_REGION: 2733283092Sjkim 2734283092Sjkim InfoTable = AcpiDmTableInfoNfit4; 2735283092Sjkim break; 2736283092Sjkim 2737283092Sjkim case ACPI_NFIT_TYPE_DATA_REGION: 2738283092Sjkim 2739283092Sjkim InfoTable = AcpiDmTableInfoNfit5; 2740283092Sjkim break; 2741283092Sjkim 2742283092Sjkim case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 2743283092Sjkim 2744283092Sjkim /* Has a variable number of 64-bit addresses at the end */ 2745283092Sjkim 2746283092Sjkim InfoTable = AcpiDmTableInfoNfit6; 2747283092Sjkim Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable); 2748283092Sjkim FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64); 2749283092Sjkim break; 2750283092Sjkim 2751283092Sjkim default: 2752298714Sjkim AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", 2753298714Sjkim SubTable->Type); 2754283092Sjkim 2755283092Sjkim /* Attempt to continue */ 2756283092Sjkim 2757283092Sjkim if (!SubTable->Length) 2758283092Sjkim { 2759283092Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 2760283092Sjkim return; 2761283092Sjkim } 2762283092Sjkim goto NextSubTable; 2763283092Sjkim } 2764283092Sjkim 2765283092Sjkim AcpiOsPrintf ("\n"); 2766283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2767298714Sjkim SubTable->Length, InfoTable); 2768283092Sjkim if (ACPI_FAILURE (Status)) 2769283092Sjkim { 2770283092Sjkim return; 2771283092Sjkim } 2772283092Sjkim 2773283092Sjkim /* Per-subtable variable-length fields */ 2774283092Sjkim 2775283092Sjkim switch (SubTable->Type) 2776283092Sjkim { 2777283092Sjkim case ACPI_NFIT_TYPE_INTERLEAVE: 2778283092Sjkim 2779283092Sjkim for (i = 0; i < Interleave->LineCount; i++) 2780283092Sjkim { 2781283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 2782298714Sjkim &Interleave->LineOffset[i], 2783298714Sjkim sizeof (UINT32), AcpiDmTableInfoNfit2a); 2784285797Sjkim if (ACPI_FAILURE (Status)) 2785285797Sjkim { 2786285797Sjkim return; 2787285797Sjkim } 2788285797Sjkim 2789283092Sjkim FieldOffset += sizeof (UINT32); 2790283092Sjkim } 2791283092Sjkim break; 2792283092Sjkim 2793283092Sjkim case ACPI_NFIT_TYPE_SMBIOS: 2794283092Sjkim 2795298714Sjkim Length = SubTable->Length - 2796298714Sjkim sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8); 2797298714Sjkim 2798283092Sjkim if (Length) 2799283092Sjkim { 2800283092Sjkim Status = AcpiDmDumpTable (Table->Length, 2801298714Sjkim sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8), 2802298714Sjkim SmbiosInfo, 2803298714Sjkim Length, AcpiDmTableInfoNfit3a); 2804283092Sjkim if (ACPI_FAILURE (Status)) 2805283092Sjkim { 2806283092Sjkim return; 2807283092Sjkim } 2808283092Sjkim } 2809283092Sjkim 2810283092Sjkim break; 2811283092Sjkim 2812283092Sjkim case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 2813283092Sjkim 2814283092Sjkim for (i = 0; i < Hint->HintCount; i++) 2815283092Sjkim { 2816283092Sjkim Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 2817298714Sjkim &Hint->HintAddress[i], 2818298714Sjkim sizeof (UINT64), AcpiDmTableInfoNfit6a); 2819285797Sjkim if (ACPI_FAILURE (Status)) 2820285797Sjkim { 2821285797Sjkim return; 2822285797Sjkim } 2823285797Sjkim 2824283092Sjkim FieldOffset += sizeof (UINT64); 2825283092Sjkim } 2826283092Sjkim break; 2827283092Sjkim 2828283092Sjkim default: 2829283092Sjkim break; 2830283092Sjkim } 2831283092Sjkim 2832283092SjkimNextSubTable: 2833283092Sjkim /* Point to next subtable */ 2834283092Sjkim 2835283092Sjkim Offset += SubTable->Length; 2836283092Sjkim SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length); 2837283092Sjkim } 2838283092Sjkim} 2839283092Sjkim 2840283092Sjkim 2841283092Sjkim/******************************************************************************* 2842283092Sjkim * 2843228110Sjkim * FUNCTION: AcpiDmDumpPcct 2844228110Sjkim * 2845228110Sjkim * PARAMETERS: Table - A PCCT table 2846228110Sjkim * 2847228110Sjkim * RETURN: None 2848228110Sjkim * 2849228110Sjkim * DESCRIPTION: Format the contents of a PCCT. This table type consists 2850228110Sjkim * of an open-ended number of subtables. 2851228110Sjkim * 2852228110Sjkim ******************************************************************************/ 2853228110Sjkim 2854228110Sjkimvoid 2855228110SjkimAcpiDmDumpPcct ( 2856228110Sjkim ACPI_TABLE_HEADER *Table) 2857228110Sjkim{ 2858228110Sjkim ACPI_STATUS Status; 2859228110Sjkim ACPI_PCCT_SUBSPACE *SubTable; 2860272444Sjkim ACPI_DMTABLE_INFO *InfoTable; 2861228110Sjkim UINT32 Length = Table->Length; 2862228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_PCCT); 2863228110Sjkim 2864228110Sjkim 2865228110Sjkim /* Main table */ 2866228110Sjkim 2867228110Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); 2868228110Sjkim if (ACPI_FAILURE (Status)) 2869228110Sjkim { 2870228110Sjkim return; 2871228110Sjkim } 2872228110Sjkim 2873272444Sjkim /* Subtables */ 2874228110Sjkim 2875228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); 2876228110Sjkim while (Offset < Table->Length) 2877228110Sjkim { 2878272444Sjkim /* Common subtable header */ 2879272444Sjkim 2880228110Sjkim AcpiOsPrintf ("\n"); 2881228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2882298714Sjkim SubTable->Header.Length, AcpiDmTableInfoPcctHdr); 2883228110Sjkim if (ACPI_FAILURE (Status)) 2884228110Sjkim { 2885228110Sjkim return; 2886228110Sjkim } 2887228110Sjkim 2888272444Sjkim switch (SubTable->Header.Type) 2889272444Sjkim { 2890272444Sjkim case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 2891228110Sjkim 2892272444Sjkim InfoTable = AcpiDmTableInfoPcct0; 2893272444Sjkim break; 2894272444Sjkim 2895272444Sjkim case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 2896272444Sjkim 2897272444Sjkim InfoTable = AcpiDmTableInfoPcct1; 2898272444Sjkim break; 2899272444Sjkim 2900298714Sjkim case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2: 2901298714Sjkim 2902298714Sjkim InfoTable = AcpiDmTableInfoPcct2; 2903298714Sjkim break; 2904298714Sjkim 2905272444Sjkim default: 2906272444Sjkim 2907272444Sjkim AcpiOsPrintf ( 2908272444Sjkim "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n", 2909272444Sjkim SubTable->Header.Type); 2910272444Sjkim return; 2911272444Sjkim } 2912272444Sjkim 2913272444Sjkim AcpiOsPrintf ("\n"); 2914272444Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2915298714Sjkim SubTable->Header.Length, InfoTable); 2916272444Sjkim if (ACPI_FAILURE (Status)) 2917272444Sjkim { 2918272444Sjkim return; 2919272444Sjkim } 2920272444Sjkim 2921272444Sjkim /* Point to next subtable */ 2922272444Sjkim 2923228110Sjkim Offset += SubTable->Header.Length; 2924228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable, 2925298714Sjkim SubTable->Header.Length); 2926228110Sjkim } 2927228110Sjkim} 2928228110Sjkim 2929228110Sjkim 2930228110Sjkim/******************************************************************************* 2931228110Sjkim * 2932228110Sjkim * FUNCTION: AcpiDmDumpPmtt 2933228110Sjkim * 2934228110Sjkim * PARAMETERS: Table - A PMTT table 2935228110Sjkim * 2936228110Sjkim * RETURN: None 2937228110Sjkim * 2938228110Sjkim * DESCRIPTION: Format the contents of a PMTT. This table type consists 2939228110Sjkim * of an open-ended number of subtables. 2940228110Sjkim * 2941228110Sjkim ******************************************************************************/ 2942228110Sjkim 2943228110Sjkimvoid 2944228110SjkimAcpiDmDumpPmtt ( 2945228110Sjkim ACPI_TABLE_HEADER *Table) 2946228110Sjkim{ 2947228110Sjkim ACPI_STATUS Status; 2948228110Sjkim ACPI_PMTT_HEADER *SubTable; 2949228110Sjkim ACPI_PMTT_HEADER *MemSubTable; 2950228110Sjkim ACPI_PMTT_HEADER *DimmSubTable; 2951228110Sjkim ACPI_PMTT_DOMAIN *DomainArray; 2952228110Sjkim UINT32 Length = Table->Length; 2953228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_PMTT); 2954228110Sjkim UINT32 MemOffset; 2955228110Sjkim UINT32 DimmOffset; 2956228110Sjkim UINT32 DomainOffset; 2957228110Sjkim UINT32 DomainCount; 2958228110Sjkim 2959228110Sjkim 2960228110Sjkim /* Main table */ 2961228110Sjkim 2962228110Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt); 2963228110Sjkim if (ACPI_FAILURE (Status)) 2964228110Sjkim { 2965228110Sjkim return; 2966228110Sjkim } 2967228110Sjkim 2968228110Sjkim /* Subtables */ 2969228110Sjkim 2970228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); 2971228110Sjkim while (Offset < Table->Length) 2972228110Sjkim { 2973228110Sjkim /* Common subtable header */ 2974228110Sjkim 2975228110Sjkim AcpiOsPrintf ("\n"); 2976228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2977298714Sjkim SubTable->Length, AcpiDmTableInfoPmttHdr); 2978228110Sjkim if (ACPI_FAILURE (Status)) 2979228110Sjkim { 2980228110Sjkim return; 2981228110Sjkim } 2982228110Sjkim 2983228110Sjkim /* Only Socket subtables are expected at this level */ 2984228110Sjkim 2985228110Sjkim if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET) 2986228110Sjkim { 2987228110Sjkim AcpiOsPrintf ( 2988228110Sjkim "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 2989228110Sjkim SubTable->Type); 2990228110Sjkim return; 2991228110Sjkim } 2992228110Sjkim 2993228110Sjkim /* Dump the fixed-length portion of the subtable */ 2994228110Sjkim 2995228110Sjkim Status = AcpiDmDumpTable (Length, Offset, SubTable, 2996298714Sjkim SubTable->Length, AcpiDmTableInfoPmtt0); 2997228110Sjkim if (ACPI_FAILURE (Status)) 2998228110Sjkim { 2999228110Sjkim return; 3000228110Sjkim } 3001228110Sjkim 3002228110Sjkim /* Walk the memory controller subtables */ 3003228110Sjkim 3004228110Sjkim MemOffset = sizeof (ACPI_PMTT_SOCKET); 3005228110Sjkim MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable, 3006228110Sjkim sizeof (ACPI_PMTT_SOCKET)); 3007228110Sjkim 3008228110Sjkim while (((Offset + MemOffset) < Table->Length) && 3009228110Sjkim (MemOffset < SubTable->Length)) 3010228110Sjkim { 3011228110Sjkim /* Common subtable header */ 3012228110Sjkim 3013228110Sjkim AcpiOsPrintf ("\n"); 3014228110Sjkim Status = AcpiDmDumpTable (Length, 3015298714Sjkim Offset + MemOffset, MemSubTable, 3016298714Sjkim MemSubTable->Length, AcpiDmTableInfoPmttHdr); 3017228110Sjkim if (ACPI_FAILURE (Status)) 3018228110Sjkim { 3019228110Sjkim return; 3020228110Sjkim } 3021228110Sjkim 3022228110Sjkim /* Only memory controller subtables are expected at this level */ 3023228110Sjkim 3024228110Sjkim if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER) 3025228110Sjkim { 3026228110Sjkim AcpiOsPrintf ( 3027228110Sjkim "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 3028228110Sjkim MemSubTable->Type); 3029228110Sjkim return; 3030228110Sjkim } 3031228110Sjkim 3032228110Sjkim /* Dump the fixed-length portion of the controller subtable */ 3033228110Sjkim 3034228110Sjkim Status = AcpiDmDumpTable (Length, 3035298714Sjkim Offset + MemOffset, MemSubTable, 3036298714Sjkim MemSubTable->Length, AcpiDmTableInfoPmtt1); 3037228110Sjkim if (ACPI_FAILURE (Status)) 3038228110Sjkim { 3039228110Sjkim return; 3040228110Sjkim } 3041228110Sjkim 3042228110Sjkim /* Walk the variable count of proximity domains */ 3043228110Sjkim 3044228110Sjkim DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount; 3045228110Sjkim DomainOffset = sizeof (ACPI_PMTT_CONTROLLER); 3046228110Sjkim DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable, 3047228110Sjkim sizeof (ACPI_PMTT_CONTROLLER)); 3048228110Sjkim 3049228110Sjkim while (((Offset + MemOffset + DomainOffset) < Table->Length) && 3050228110Sjkim ((MemOffset + DomainOffset) < SubTable->Length) && 3051228110Sjkim DomainCount) 3052228110Sjkim { 3053228110Sjkim Status = AcpiDmDumpTable (Length, 3054298714Sjkim Offset + MemOffset + DomainOffset, DomainArray, 3055298714Sjkim sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a); 3056228110Sjkim if (ACPI_FAILURE (Status)) 3057228110Sjkim { 3058228110Sjkim return; 3059228110Sjkim } 3060228110Sjkim 3061228110Sjkim DomainOffset += sizeof (ACPI_PMTT_DOMAIN); 3062228110Sjkim DomainArray++; 3063228110Sjkim DomainCount--; 3064228110Sjkim } 3065228110Sjkim 3066228110Sjkim if (DomainCount) 3067228110Sjkim { 3068228110Sjkim AcpiOsPrintf ( 3069272444Sjkim "\n**** DomainCount exceeds subtable length\n\n"); 3070228110Sjkim } 3071228110Sjkim 3072228110Sjkim /* Walk the physical component (DIMM) subtables */ 3073228110Sjkim 3074228110Sjkim DimmOffset = DomainOffset; 3075228110Sjkim DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable, 3076228110Sjkim DomainOffset); 3077228110Sjkim 3078228110Sjkim while (((Offset + MemOffset + DimmOffset) < Table->Length) && 3079228110Sjkim (DimmOffset < MemSubTable->Length)) 3080228110Sjkim { 3081228110Sjkim /* Common subtable header */ 3082228110Sjkim 3083228110Sjkim AcpiOsPrintf ("\n"); 3084228110Sjkim Status = AcpiDmDumpTable (Length, 3085298714Sjkim Offset + MemOffset + DimmOffset, DimmSubTable, 3086298714Sjkim DimmSubTable->Length, AcpiDmTableInfoPmttHdr); 3087228110Sjkim if (ACPI_FAILURE (Status)) 3088228110Sjkim { 3089228110Sjkim return; 3090228110Sjkim } 3091228110Sjkim 3092228110Sjkim /* Only DIMM subtables are expected at this level */ 3093228110Sjkim 3094228110Sjkim if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM) 3095228110Sjkim { 3096228110Sjkim AcpiOsPrintf ( 3097228110Sjkim "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 3098228110Sjkim DimmSubTable->Type); 3099228110Sjkim return; 3100228110Sjkim } 3101228110Sjkim 3102228110Sjkim /* Dump the fixed-length DIMM subtable */ 3103228110Sjkim 3104228110Sjkim Status = AcpiDmDumpTable (Length, 3105298714Sjkim Offset + MemOffset + DimmOffset, DimmSubTable, 3106298714Sjkim DimmSubTable->Length, AcpiDmTableInfoPmtt2); 3107228110Sjkim if (ACPI_FAILURE (Status)) 3108228110Sjkim { 3109228110Sjkim return; 3110228110Sjkim } 3111228110Sjkim 3112228110Sjkim /* Point to next DIMM subtable */ 3113228110Sjkim 3114228110Sjkim DimmOffset += DimmSubTable->Length; 3115228110Sjkim DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 3116228110Sjkim DimmSubTable, DimmSubTable->Length); 3117228110Sjkim } 3118228110Sjkim 3119228110Sjkim /* Point to next Controller subtable */ 3120228110Sjkim 3121228110Sjkim MemOffset += MemSubTable->Length; 3122228110Sjkim MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 3123228110Sjkim MemSubTable, MemSubTable->Length); 3124228110Sjkim } 3125228110Sjkim 3126228110Sjkim /* Point to next Socket subtable */ 3127228110Sjkim 3128228110Sjkim Offset += SubTable->Length; 3129228110Sjkim SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 3130228110Sjkim SubTable, SubTable->Length); 3131228110Sjkim } 3132228110Sjkim} 3133228110Sjkim 3134228110Sjkim 3135228110Sjkim/******************************************************************************* 3136228110Sjkim * 3137228110Sjkim * FUNCTION: AcpiDmDumpS3pt 3138228110Sjkim * 3139228110Sjkim * PARAMETERS: Table - A S3PT table 3140228110Sjkim * 3141228110Sjkim * RETURN: Length of the table 3142228110Sjkim * 3143228110Sjkim * DESCRIPTION: Format the contents of a S3PT 3144228110Sjkim * 3145228110Sjkim ******************************************************************************/ 3146228110Sjkim 3147228110SjkimUINT32 3148228110SjkimAcpiDmDumpS3pt ( 3149228110Sjkim ACPI_TABLE_HEADER *Tables) 3150228110Sjkim{ 3151228110Sjkim ACPI_STATUS Status; 3152228110Sjkim UINT32 Offset = sizeof (ACPI_TABLE_S3PT); 3153298714Sjkim ACPI_FPDT_HEADER *SubTable; 3154228110Sjkim ACPI_DMTABLE_INFO *InfoTable; 3155228110Sjkim ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); 3156228110Sjkim 3157228110Sjkim 3158228110Sjkim /* Main table */ 3159228110Sjkim 3160228110Sjkim Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt); 3161228110Sjkim if (ACPI_FAILURE (Status)) 3162228110Sjkim { 3163228110Sjkim return 0; 3164228110Sjkim } 3165228110Sjkim 3166298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset); 3167228110Sjkim while (Offset < S3ptTable->Length) 3168228110Sjkim { 3169272444Sjkim /* Common subtable header */ 3170228110Sjkim 3171228110Sjkim AcpiOsPrintf ("\n"); 3172228110Sjkim Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 3173298714Sjkim SubTable->Length, AcpiDmTableInfoS3ptHdr); 3174228110Sjkim if (ACPI_FAILURE (Status)) 3175228110Sjkim { 3176228110Sjkim return 0; 3177228110Sjkim } 3178228110Sjkim 3179228110Sjkim switch (SubTable->Type) 3180228110Sjkim { 3181228110Sjkim case ACPI_S3PT_TYPE_RESUME: 3182250838Sjkim 3183228110Sjkim InfoTable = AcpiDmTableInfoS3pt0; 3184228110Sjkim break; 3185250838Sjkim 3186228110Sjkim case ACPI_S3PT_TYPE_SUSPEND: 3187250838Sjkim 3188228110Sjkim InfoTable = AcpiDmTableInfoS3pt1; 3189228110Sjkim break; 3190250838Sjkim 3191228110Sjkim default: 3192250838Sjkim 3193298714Sjkim AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", 3194298714Sjkim SubTable->Type); 3195228110Sjkim 3196228110Sjkim /* Attempt to continue */ 3197228110Sjkim 3198228110Sjkim if (!SubTable->Length) 3199228110Sjkim { 3200228110Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 3201228110Sjkim return 0; 3202228110Sjkim } 3203228110Sjkim goto NextSubTable; 3204228110Sjkim } 3205228110Sjkim 3206228110Sjkim AcpiOsPrintf ("\n"); 3207228110Sjkim Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 3208298714Sjkim SubTable->Length, InfoTable); 3209228110Sjkim if (ACPI_FAILURE (Status)) 3210228110Sjkim { 3211228110Sjkim return 0; 3212228110Sjkim } 3213228110Sjkim 3214228110SjkimNextSubTable: 3215272444Sjkim /* Point to next subtable */ 3216228110Sjkim 3217228110Sjkim Offset += SubTable->Length; 3218298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length); 3219228110Sjkim } 3220228110Sjkim 3221228110Sjkim return (S3ptTable->Length); 3222228110Sjkim} 3223228110Sjkim 3224228110Sjkim 3225228110Sjkim/******************************************************************************* 3226228110Sjkim * 3227219707Sjkim * FUNCTION: AcpiDmDumpSlic 3228219707Sjkim * 3229219707Sjkim * PARAMETERS: Table - A SLIC table 3230219707Sjkim * 3231219707Sjkim * RETURN: None 3232219707Sjkim * 3233219707Sjkim * DESCRIPTION: Format the contents of a SLIC 3234219707Sjkim * 3235219707Sjkim ******************************************************************************/ 3236219707Sjkim 3237219707Sjkimvoid 3238219707SjkimAcpiDmDumpSlic ( 3239219707Sjkim ACPI_TABLE_HEADER *Table) 3240219707Sjkim{ 3241298714Sjkim 3242285797Sjkim (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table, 3243298714Sjkim Table->Length - sizeof (*Table), AcpiDmTableInfoSlic); 3244219707Sjkim} 3245219707Sjkim 3246219707Sjkim 3247219707Sjkim/******************************************************************************* 3248219707Sjkim * 3249167802Sjkim * FUNCTION: AcpiDmDumpSlit 3250167802Sjkim * 3251167802Sjkim * PARAMETERS: Table - An SLIT 3252167802Sjkim * 3253167802Sjkim * RETURN: None 3254167802Sjkim * 3255167802Sjkim * DESCRIPTION: Format the contents of a SLIT 3256167802Sjkim * 3257167802Sjkim ******************************************************************************/ 3258167802Sjkim 3259167802Sjkimvoid 3260167802SjkimAcpiDmDumpSlit ( 3261167802Sjkim ACPI_TABLE_HEADER *Table) 3262167802Sjkim{ 3263193529Sjkim ACPI_STATUS Status; 3264167802Sjkim UINT32 Offset; 3265167802Sjkim UINT8 *Row; 3266167802Sjkim UINT32 Localities; 3267167802Sjkim UINT32 i; 3268167802Sjkim UINT32 j; 3269167802Sjkim 3270167802Sjkim 3271167802Sjkim /* Main table */ 3272167802Sjkim 3273193529Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit); 3274193529Sjkim if (ACPI_FAILURE (Status)) 3275193529Sjkim { 3276193529Sjkim return; 3277193529Sjkim } 3278167802Sjkim 3279167802Sjkim /* Display the Locality NxN Matrix */ 3280167802Sjkim 3281167802Sjkim Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount; 3282167802Sjkim Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]); 3283167802Sjkim Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry; 3284167802Sjkim 3285167802Sjkim for (i = 0; i < Localities; i++) 3286167802Sjkim { 3287167802Sjkim /* Display one row of the matrix */ 3288167802Sjkim 3289167802Sjkim AcpiDmLineHeader2 (Offset, Localities, "Locality", i); 3290167802Sjkim for (j = 0; j < Localities; j++) 3291167802Sjkim { 3292167802Sjkim /* Check for beyond EOT */ 3293167802Sjkim 3294167802Sjkim if (Offset >= Table->Length) 3295167802Sjkim { 3296298714Sjkim AcpiOsPrintf ( 3297298714Sjkim "\n**** Not enough room in table for all localities\n"); 3298167802Sjkim return; 3299167802Sjkim } 3300167802Sjkim 3301209746Sjkim AcpiOsPrintf ("%2.2X", Row[j]); 3302167802Sjkim Offset++; 3303167802Sjkim 3304167802Sjkim /* Display up to 16 bytes per output row */ 3305167802Sjkim 3306209746Sjkim if ((j+1) < Localities) 3307167802Sjkim { 3308220663Sjkim AcpiOsPrintf (" "); 3309209746Sjkim 3310209746Sjkim if (j && (((j+1) % 16) == 0)) 3311209746Sjkim { 3312220663Sjkim AcpiOsPrintf ("\\\n"); /* With line continuation char */ 3313220663Sjkim AcpiDmLineHeader (Offset, 0, NULL); 3314209746Sjkim } 3315167802Sjkim } 3316167802Sjkim } 3317167802Sjkim 3318167802Sjkim /* Point to next row */ 3319167802Sjkim 3320167802Sjkim AcpiOsPrintf ("\n"); 3321167802Sjkim Row += Localities; 3322167802Sjkim } 3323167802Sjkim} 3324167802Sjkim 3325167802Sjkim 3326167802Sjkim/******************************************************************************* 3327167802Sjkim * 3328167802Sjkim * FUNCTION: AcpiDmDumpSrat 3329167802Sjkim * 3330167802Sjkim * PARAMETERS: Table - A SRAT table 3331167802Sjkim * 3332167802Sjkim * RETURN: None 3333167802Sjkim * 3334167802Sjkim * DESCRIPTION: Format the contents of a SRAT 3335167802Sjkim * 3336167802Sjkim ******************************************************************************/ 3337167802Sjkim 3338167802Sjkimvoid 3339167802SjkimAcpiDmDumpSrat ( 3340167802Sjkim ACPI_TABLE_HEADER *Table) 3341167802Sjkim{ 3342193529Sjkim ACPI_STATUS Status; 3343167802Sjkim UINT32 Offset = sizeof (ACPI_TABLE_SRAT); 3344167802Sjkim ACPI_SUBTABLE_HEADER *SubTable; 3345167802Sjkim ACPI_DMTABLE_INFO *InfoTable; 3346167802Sjkim 3347167802Sjkim 3348167802Sjkim /* Main table */ 3349167802Sjkim 3350193529Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat); 3351193529Sjkim if (ACPI_FAILURE (Status)) 3352193529Sjkim { 3353193529Sjkim return; 3354193529Sjkim } 3355167802Sjkim 3356272444Sjkim /* Subtables */ 3357167802Sjkim 3358167802Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 3359167802Sjkim while (Offset < Table->Length) 3360167802Sjkim { 3361272444Sjkim /* Common subtable header */ 3362193529Sjkim 3363193529Sjkim AcpiOsPrintf ("\n"); 3364193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3365298714Sjkim SubTable->Length, AcpiDmTableInfoSratHdr); 3366193529Sjkim if (ACPI_FAILURE (Status)) 3367193529Sjkim { 3368193529Sjkim return; 3369193529Sjkim } 3370193529Sjkim 3371167802Sjkim switch (SubTable->Type) 3372167802Sjkim { 3373167802Sjkim case ACPI_SRAT_TYPE_CPU_AFFINITY: 3374250838Sjkim 3375167802Sjkim InfoTable = AcpiDmTableInfoSrat0; 3376167802Sjkim break; 3377250838Sjkim 3378167802Sjkim case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 3379250838Sjkim 3380167802Sjkim InfoTable = AcpiDmTableInfoSrat1; 3381167802Sjkim break; 3382250838Sjkim 3383193529Sjkim case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 3384250838Sjkim 3385193529Sjkim InfoTable = AcpiDmTableInfoSrat2; 3386193529Sjkim break; 3387250838Sjkim 3388272444Sjkim case ACPI_SRAT_TYPE_GICC_AFFINITY: 3389272444Sjkim 3390272444Sjkim InfoTable = AcpiDmTableInfoSrat3; 3391272444Sjkim break; 3392272444Sjkim 3393167802Sjkim default: 3394298714Sjkim AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", 3395298714Sjkim SubTable->Type); 3396193529Sjkim 3397193529Sjkim /* Attempt to continue */ 3398193529Sjkim 3399193529Sjkim if (!SubTable->Length) 3400193529Sjkim { 3401193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 3402193529Sjkim return; 3403193529Sjkim } 3404193529Sjkim goto NextSubTable; 3405167802Sjkim } 3406167802Sjkim 3407167802Sjkim AcpiOsPrintf ("\n"); 3408193529Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3409298714Sjkim SubTable->Length, InfoTable); 3410193529Sjkim if (ACPI_FAILURE (Status)) 3411193529Sjkim { 3412193529Sjkim return; 3413193529Sjkim } 3414167802Sjkim 3415193529SjkimNextSubTable: 3416272444Sjkim /* Point to next subtable */ 3417167802Sjkim 3418167802Sjkim Offset += SubTable->Length; 3419298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, 3420298714Sjkim SubTable->Length); 3421167802Sjkim } 3422167802Sjkim} 3423167802Sjkim 3424197104Sjkim 3425197104Sjkim/******************************************************************************* 3426197104Sjkim * 3427283092Sjkim * FUNCTION: AcpiDmDumpStao 3428283092Sjkim * 3429283092Sjkim * PARAMETERS: Table - A STAO table 3430283092Sjkim * 3431283092Sjkim * RETURN: None 3432283092Sjkim * 3433283092Sjkim * DESCRIPTION: Format the contents of a STAO. This is a variable-length 3434283092Sjkim * table that contains an open-ended number of ASCII strings 3435283092Sjkim * at the end of the table. 3436283092Sjkim * 3437283092Sjkim ******************************************************************************/ 3438283092Sjkim 3439283092Sjkimvoid 3440283092SjkimAcpiDmDumpStao ( 3441283092Sjkim ACPI_TABLE_HEADER *Table) 3442283092Sjkim{ 3443283092Sjkim ACPI_STATUS Status; 3444283092Sjkim char *Namepath; 3445283092Sjkim UINT32 Length = Table->Length; 3446283092Sjkim UINT32 StringLength; 3447283092Sjkim UINT32 Offset = sizeof (ACPI_TABLE_STAO); 3448283092Sjkim 3449283092Sjkim 3450283092Sjkim /* Main table */ 3451283092Sjkim 3452283092Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao); 3453283092Sjkim if (ACPI_FAILURE (Status)) 3454283092Sjkim { 3455283092Sjkim return; 3456283092Sjkim } 3457283092Sjkim 3458283092Sjkim /* The rest of the table consists of Namepath strings */ 3459283092Sjkim 3460283092Sjkim while (Offset < Table->Length) 3461283092Sjkim { 3462283092Sjkim Namepath = ACPI_ADD_PTR (char, Table, Offset); 3463284583Sjkim StringLength = strlen (Namepath) + 1; 3464283092Sjkim 3465283092Sjkim AcpiDmLineHeader (Offset, StringLength, "Namestring"); 3466283092Sjkim AcpiOsPrintf ("\"%s\"\n", Namepath); 3467283092Sjkim 3468283092Sjkim /* Point to next namepath */ 3469283092Sjkim 3470283092Sjkim Offset += StringLength; 3471283092Sjkim } 3472283092Sjkim} 3473283092Sjkim 3474283092Sjkim 3475283092Sjkim/******************************************************************************* 3476283092Sjkim * 3477285797Sjkim * FUNCTION: AcpiDmDumpTcpa 3478285797Sjkim * 3479285797Sjkim * PARAMETERS: Table - A TCPA table 3480285797Sjkim * 3481285797Sjkim * RETURN: None 3482285797Sjkim * 3483285797Sjkim * DESCRIPTION: Format the contents of a TCPA. 3484285797Sjkim * 3485285797Sjkim * NOTE: There are two versions of the table with the same signature: 3486285797Sjkim * the client version and the server version. The common 3487285797Sjkim * PlatformClass field is used to differentiate the two types of 3488285797Sjkim * tables. 3489285797Sjkim * 3490285797Sjkim ******************************************************************************/ 3491285797Sjkim 3492285797Sjkimvoid 3493285797SjkimAcpiDmDumpTcpa ( 3494285797Sjkim ACPI_TABLE_HEADER *Table) 3495285797Sjkim{ 3496285797Sjkim UINT32 Offset = sizeof (ACPI_TABLE_TCPA_HDR); 3497285797Sjkim ACPI_TABLE_TCPA_HDR *CommonHeader = ACPI_CAST_PTR ( 3498285797Sjkim ACPI_TABLE_TCPA_HDR, Table); 3499285797Sjkim ACPI_TABLE_TCPA_HDR *SubTable = ACPI_ADD_PTR ( 3500285797Sjkim ACPI_TABLE_TCPA_HDR, Table, Offset); 3501285797Sjkim ACPI_STATUS Status; 3502285797Sjkim 3503285797Sjkim 3504285797Sjkim /* Main table */ 3505285797Sjkim 3506285797Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 3507285797Sjkim 0, AcpiDmTableInfoTcpaHdr); 3508285797Sjkim if (ACPI_FAILURE (Status)) 3509285797Sjkim { 3510285797Sjkim return; 3511285797Sjkim } 3512285797Sjkim 3513285797Sjkim /* 3514285797Sjkim * Examine the PlatformClass field to determine the table type. 3515285797Sjkim * Either a client or server table. Only one. 3516285797Sjkim */ 3517285797Sjkim switch (CommonHeader->PlatformClass) 3518285797Sjkim { 3519285797Sjkim case ACPI_TCPA_CLIENT_TABLE: 3520285797Sjkim 3521285797Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3522285797Sjkim Table->Length - Offset, AcpiDmTableInfoTcpaClient); 3523285797Sjkim break; 3524285797Sjkim 3525285797Sjkim case ACPI_TCPA_SERVER_TABLE: 3526285797Sjkim 3527285797Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3528285797Sjkim Table->Length - Offset, AcpiDmTableInfoTcpaServer); 3529285797Sjkim break; 3530285797Sjkim 3531285797Sjkim default: 3532285797Sjkim 3533285797Sjkim AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n", 3534285797Sjkim CommonHeader->PlatformClass); 3535285797Sjkim Status = AE_ERROR; 3536285797Sjkim break; 3537285797Sjkim } 3538285797Sjkim 3539285797Sjkim if (ACPI_FAILURE (Status)) 3540285797Sjkim { 3541285797Sjkim AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n"); 3542285797Sjkim } 3543285797Sjkim} 3544285797Sjkim 3545285797Sjkim 3546285797Sjkim/******************************************************************************* 3547285797Sjkim * 3548246849Sjkim * FUNCTION: AcpiDmDumpVrtc 3549246849Sjkim * 3550246849Sjkim * PARAMETERS: Table - A VRTC table 3551246849Sjkim * 3552246849Sjkim * RETURN: None 3553246849Sjkim * 3554246849Sjkim * DESCRIPTION: Format the contents of a VRTC 3555246849Sjkim * 3556246849Sjkim ******************************************************************************/ 3557246849Sjkim 3558246849Sjkimvoid 3559246849SjkimAcpiDmDumpVrtc ( 3560246849Sjkim ACPI_TABLE_HEADER *Table) 3561246849Sjkim{ 3562246849Sjkim ACPI_STATUS Status; 3563246849Sjkim UINT32 Offset = sizeof (ACPI_TABLE_VRTC); 3564246849Sjkim ACPI_VRTC_ENTRY *SubTable; 3565246849Sjkim 3566246849Sjkim 3567246849Sjkim /* Main table */ 3568246849Sjkim 3569246849Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc); 3570246849Sjkim if (ACPI_FAILURE (Status)) 3571246849Sjkim { 3572246849Sjkim return; 3573246849Sjkim } 3574246849Sjkim 3575272444Sjkim /* Subtables */ 3576246849Sjkim 3577246849Sjkim SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset); 3578246849Sjkim while (Offset < Table->Length) 3579246849Sjkim { 3580272444Sjkim /* Common subtable header */ 3581246849Sjkim 3582246849Sjkim AcpiOsPrintf ("\n"); 3583246849Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3584298714Sjkim sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0); 3585246849Sjkim if (ACPI_FAILURE (Status)) 3586246849Sjkim { 3587246849Sjkim return; 3588246849Sjkim } 3589246849Sjkim 3590272444Sjkim /* Point to next subtable */ 3591246849Sjkim 3592246849Sjkim Offset += sizeof (ACPI_VRTC_ENTRY); 3593298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, 3594298714Sjkim sizeof (ACPI_VRTC_ENTRY)); 3595246849Sjkim } 3596246849Sjkim} 3597246849Sjkim 3598246849Sjkim 3599246849Sjkim/******************************************************************************* 3600246849Sjkim * 3601197104Sjkim * FUNCTION: AcpiDmDumpWdat 3602197104Sjkim * 3603197104Sjkim * PARAMETERS: Table - A WDAT table 3604197104Sjkim * 3605197104Sjkim * RETURN: None 3606197104Sjkim * 3607197104Sjkim * DESCRIPTION: Format the contents of a WDAT 3608197104Sjkim * 3609197104Sjkim ******************************************************************************/ 3610197104Sjkim 3611197104Sjkimvoid 3612197104SjkimAcpiDmDumpWdat ( 3613197104Sjkim ACPI_TABLE_HEADER *Table) 3614197104Sjkim{ 3615197104Sjkim ACPI_STATUS Status; 3616197104Sjkim UINT32 Offset = sizeof (ACPI_TABLE_WDAT); 3617197104Sjkim ACPI_WDAT_ENTRY *SubTable; 3618197104Sjkim 3619197104Sjkim 3620197104Sjkim /* Main table */ 3621197104Sjkim 3622197104Sjkim Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat); 3623197104Sjkim if (ACPI_FAILURE (Status)) 3624197104Sjkim { 3625197104Sjkim return; 3626197104Sjkim } 3627197104Sjkim 3628272444Sjkim /* Subtables */ 3629197104Sjkim 3630197104Sjkim SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); 3631197104Sjkim while (Offset < Table->Length) 3632197104Sjkim { 3633272444Sjkim /* Common subtable header */ 3634197104Sjkim 3635197104Sjkim AcpiOsPrintf ("\n"); 3636197104Sjkim Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3637298714Sjkim sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); 3638197104Sjkim if (ACPI_FAILURE (Status)) 3639197104Sjkim { 3640197104Sjkim return; 3641197104Sjkim } 3642197104Sjkim 3643272444Sjkim /* Point to next subtable */ 3644197104Sjkim 3645197104Sjkim Offset += sizeof (ACPI_WDAT_ENTRY); 3646298714Sjkim SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, 3647298714Sjkim sizeof (ACPI_WDAT_ENTRY)); 3648197104Sjkim } 3649197104Sjkim} 3650283092Sjkim 3651298714Sjkim 3652283092Sjkim/******************************************************************************* 3653283092Sjkim * 3654283092Sjkim * FUNCTION: AcpiDmDumpWpbt 3655283092Sjkim * 3656283092Sjkim * PARAMETERS: Table - A WPBT table 3657283092Sjkim * 3658283092Sjkim * RETURN: None 3659283092Sjkim * 3660283092Sjkim * DESCRIPTION: Format the contents of a WPBT. This table type consists 3661283092Sjkim * of an open-ended arguments buffer at the end of the table. 3662283092Sjkim * 3663283092Sjkim ******************************************************************************/ 3664283092Sjkim 3665283092Sjkimvoid 3666283092SjkimAcpiDmDumpWpbt ( 3667283092Sjkim ACPI_TABLE_HEADER *Table) 3668283092Sjkim{ 3669283092Sjkim ACPI_STATUS Status; 3670283092Sjkim ACPI_TABLE_WPBT *SubTable; 3671283092Sjkim UINT32 Length = Table->Length; 3672283092Sjkim UINT16 ArgumentsLength; 3673283092Sjkim 3674283092Sjkim 3675283092Sjkim /* Dump the main table */ 3676283092Sjkim 3677283092Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt); 3678283092Sjkim if (ACPI_FAILURE (Status)) 3679283092Sjkim { 3680283092Sjkim return; 3681283092Sjkim } 3682283092Sjkim 3683283092Sjkim /* Extract the arguments buffer length from the main table */ 3684283092Sjkim 3685283092Sjkim SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table); 3686283092Sjkim ArgumentsLength = SubTable->ArgumentsLength; 3687283092Sjkim 3688283092Sjkim /* Dump the arguments buffer */ 3689283092Sjkim 3690285797Sjkim (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength, 3691283092Sjkim AcpiDmTableInfoWpbt0); 3692283092Sjkim} 3693