[BACK]Return to dmtbdump1.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / external / bsd / acpica / dist / common

Annotation of src/sys/external/bsd/acpica/dist/common/dmtbdump1.c, Revision 1.1.1.4.6.1

1.1       christos    1: /******************************************************************************
                      2:  *
                      3:  * Module Name: dmtbdump1 - Dump ACPI data tables that contain no AML code
                      4:  *
                      5:  *****************************************************************************/
                      6:
                      7: /*
1.1.1.4.6.1! thorpej     8:  * Copyright (C) 2000 - 2021, Intel Corp.
1.1       christos    9:  * All rights reserved.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions, and the following disclaimer,
                     16:  *    without modification.
                     17:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
                     18:  *    substantially similar to the "NO WARRANTY" disclaimer below
                     19:  *    ("Disclaimer") and any redistribution must be conditioned upon
                     20:  *    including a substantially similar Disclaimer requirement for further
                     21:  *    binary redistribution.
                     22:  * 3. Neither the names of the above-listed copyright holders nor the names
                     23:  *    of any contributors may be used to endorse or promote products derived
                     24:  *    from this software without specific prior written permission.
                     25:  *
                     26:  * Alternatively, this software may be distributed under the terms of the
                     27:  * GNU General Public License ("GPL") version 2 as published by the Free
                     28:  * Software Foundation.
                     29:  *
                     30:  * NO WARRANTY
                     31:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     32:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1.1.1.4.6.1! thorpej    33:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1.1       christos   34:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
                     35:  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     36:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     37:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     38:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     39:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
                     40:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     41:  * POSSIBILITY OF SUCH DAMAGES.
                     42:  */
                     43:
                     44: #include "acpi.h"
                     45: #include "accommon.h"
                     46: #include "acdisasm.h"
                     47: #include "actables.h"
                     48:
                     49: /* This module used for application-level code only */
                     50:
                     51: #define _COMPONENT          ACPI_CA_DISASSEMBLER
                     52:         ACPI_MODULE_NAME    ("dmtbdump1")
                     53:
                     54:
                     55: /*******************************************************************************
                     56:  *
                     57:  * FUNCTION:    AcpiDmDumpAsf
                     58:  *
                     59:  * PARAMETERS:  Table               - A ASF table
                     60:  *
                     61:  * RETURN:      None
                     62:  *
                     63:  * DESCRIPTION: Format the contents of a ASF table
                     64:  *
                     65:  ******************************************************************************/
                     66:
                     67: void
                     68: AcpiDmDumpAsf (
                     69:     ACPI_TABLE_HEADER       *Table)
                     70: {
                     71:     ACPI_STATUS             Status;
                     72:     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
                     73:     ACPI_ASF_INFO           *Subtable;
                     74:     ACPI_DMTABLE_INFO       *InfoTable;
                     75:     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
                     76:     UINT8                   *DataTable = NULL;
                     77:     UINT32                  DataCount = 0;
                     78:     UINT32                  DataLength = 0;
                     79:     UINT32                  DataOffset = 0;
                     80:     UINT32                  i;
                     81:     UINT8                   Type;
                     82:
                     83:
                     84:     /* No main table, only subtables */
                     85:
                     86:     Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
                     87:     while (Offset < Table->Length)
                     88:     {
                     89:         /* Common subtable header */
                     90:
                     91:         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
                     92:             Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
                     93:         if (ACPI_FAILURE (Status))
                     94:         {
                     95:             return;
                     96:         }
                     97:
                     98:         /* The actual type is the lower 7 bits of Type */
                     99:
                    100:         Type = (UINT8) (Subtable->Header.Type & 0x7F);
                    101:
                    102:         switch (Type)
                    103:         {
                    104:         case ACPI_ASF_TYPE_INFO:
                    105:
                    106:             InfoTable = AcpiDmTableInfoAsf0;
                    107:             break;
                    108:
                    109:         case ACPI_ASF_TYPE_ALERT:
                    110:
                    111:             InfoTable = AcpiDmTableInfoAsf1;
                    112:             DataInfoTable = AcpiDmTableInfoAsf1a;
                    113:             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
                    114:             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
                    115:             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
                    116:             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
                    117:             break;
                    118:
                    119:         case ACPI_ASF_TYPE_CONTROL:
                    120:
                    121:             InfoTable = AcpiDmTableInfoAsf2;
                    122:             DataInfoTable = AcpiDmTableInfoAsf2a;
                    123:             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
                    124:             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
                    125:             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
                    126:             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
                    127:             break;
                    128:
                    129:         case ACPI_ASF_TYPE_BOOT:
                    130:
                    131:             InfoTable = AcpiDmTableInfoAsf3;
                    132:             break;
                    133:
                    134:         case ACPI_ASF_TYPE_ADDRESS:
                    135:
                    136:             InfoTable = AcpiDmTableInfoAsf4;
                    137:             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
                    138:             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
                    139:             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
                    140:             break;
                    141:
                    142:         default:
                    143:
                    144:             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
                    145:                 Subtable->Header.Type);
                    146:             return;
                    147:         }
                    148:
                    149:         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
                    150:             Subtable->Header.Length, InfoTable);
                    151:         if (ACPI_FAILURE (Status))
                    152:         {
                    153:             return;
                    154:         }
                    155:
                    156:         /* Dump variable-length extra data */
                    157:
                    158:         switch (Type)
                    159:         {
                    160:         case ACPI_ASF_TYPE_ALERT:
                    161:         case ACPI_ASF_TYPE_CONTROL:
                    162:
                    163:             for (i = 0; i < DataCount; i++)
                    164:             {
                    165:                 AcpiOsPrintf ("\n");
                    166:                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
                    167:                     DataTable, DataLength, DataInfoTable);
                    168:                 if (ACPI_FAILURE (Status))
                    169:                 {
                    170:                     return;
                    171:                 }
                    172:
                    173:                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
                    174:                 DataOffset += DataLength;
                    175:             }
                    176:             break;
                    177:
                    178:         case ACPI_ASF_TYPE_ADDRESS:
                    179:
                    180:             for (i = 0; i < DataLength; i++)
                    181:             {
                    182:                 if (!(i % 16))
                    183:                 {
                    184:                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
                    185:                 }
                    186:
                    187:                 AcpiOsPrintf ("%2.2X ", *DataTable);
                    188:                 DataTable++;
                    189:                 DataOffset++;
                    190:
                    191:                 if (DataOffset > Table->Length)
                    192:                 {
                    193:                     AcpiOsPrintf (
                    194:                         "**** ACPI table terminates in the middle of a "
                    195:                         "data structure! (ASF! table)\n");
                    196:                     return;
                    197:                 }
                    198:             }
                    199:
                    200:             AcpiOsPrintf ("\n");
                    201:             break;
                    202:
                    203:         default:
                    204:
                    205:             break;
                    206:         }
                    207:
                    208:         AcpiOsPrintf ("\n");
                    209:
                    210:         /* Point to next subtable */
                    211:
                    212:         if (!Subtable->Header.Length)
                    213:         {
                    214:             AcpiOsPrintf ("Invalid zero subtable header length\n");
                    215:             return;
                    216:         }
                    217:
                    218:         Offset += Subtable->Header.Length;
                    219:         Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
                    220:             Subtable->Header.Length);
                    221:     }
                    222: }
                    223:
1.1.1.4.6.1! thorpej   224: /*******************************************************************************
        !           225:  *
        !           226:  * FUNCTION:    AcpiDmDumpCedt
        !           227:  *
        !           228:  * PARAMETERS:  Table               - A CEDT table
        !           229:  *
        !           230:  * RETURN:      None
        !           231:  *
        !           232:  * DESCRIPTION: Format the contents of a CEDT. This table type consists
        !           233:  *              of an open-ended number of subtables.
        !           234:  *
        !           235:  ******************************************************************************/
        !           236:
        !           237: void
        !           238: AcpiDmDumpCedt (
        !           239:     ACPI_TABLE_HEADER       *Table)
        !           240: {
        !           241:     ACPI_STATUS             Status;
        !           242:     ACPI_CEDT_HEADER        *Subtable;
        !           243:     UINT32                  Length = Table->Length;
        !           244:     UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
        !           245:     ACPI_DMTABLE_INFO       *InfoTable;
        !           246:
        !           247:
        !           248:     /* There is no main table (other than the standard ACPI header) */
        !           249:
        !           250:     Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
        !           251:     while (Offset < Table->Length)
        !           252:     {
        !           253:         /* Common subtable header */
        !           254:
        !           255:         AcpiOsPrintf ("\n");
        !           256:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
        !           257:             Subtable->Length, AcpiDmTableInfoCedtHdr);
        !           258:         if (ACPI_FAILURE (Status))
        !           259:         {
        !           260:             return;
        !           261:         }
        !           262:
        !           263:         switch (Subtable->Type)
        !           264:         {
        !           265:         case ACPI_CEDT_TYPE_CHBS:
        !           266:
        !           267:             InfoTable = AcpiDmTableInfoCedt0;
        !           268:             break;
        !           269:
        !           270:         default:
        !           271:
        !           272:             AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
        !           273:                 Subtable->Type);
        !           274:
        !           275:             /* Attempt to continue */
        !           276:
        !           277:             if (!Subtable->Length)
        !           278:             {
        !           279:                 AcpiOsPrintf ("Invalid zero length subtable\n");
        !           280:                 return;
        !           281:             }
        !           282:             goto NextSubtable;
        !           283:         }
        !           284:
        !           285:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
        !           286:             Subtable->Length, InfoTable);
        !           287:         if (ACPI_FAILURE (Status))
        !           288:         {
        !           289:             return;
        !           290:         }
        !           291:
        !           292: NextSubtable:
        !           293:         /* Point to next subtable */
        !           294:
        !           295:         Offset += Subtable->Length;
        !           296:         Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
        !           297:             Subtable->Length);
        !           298:     }
        !           299: }
1.1       christos  300:
                    301: /*******************************************************************************
                    302:  *
                    303:  * FUNCTION:    AcpiDmDumpCpep
                    304:  *
                    305:  * PARAMETERS:  Table               - A CPEP table
                    306:  *
                    307:  * RETURN:      None
                    308:  *
                    309:  * DESCRIPTION: Format the contents of a CPEP. This table type consists
                    310:  *              of an open-ended number of subtables.
                    311:  *
                    312:  ******************************************************************************/
                    313:
                    314: void
                    315: AcpiDmDumpCpep (
                    316:     ACPI_TABLE_HEADER       *Table)
                    317: {
                    318:     ACPI_STATUS             Status;
                    319:     ACPI_CPEP_POLLING       *Subtable;
                    320:     UINT32                  Length = Table->Length;
                    321:     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
                    322:
                    323:
                    324:     /* Main table */
                    325:
                    326:     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
                    327:     if (ACPI_FAILURE (Status))
                    328:     {
                    329:         return;
                    330:     }
                    331:
                    332:     /* Subtables */
                    333:
                    334:     Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
                    335:     while (Offset < Table->Length)
                    336:     {
                    337:         AcpiOsPrintf ("\n");
                    338:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    339:             Subtable->Header.Length, AcpiDmTableInfoCpep0);
                    340:         if (ACPI_FAILURE (Status))
                    341:         {
                    342:             return;
                    343:         }
                    344:
                    345:         /* Point to next subtable */
                    346:
                    347:         Offset += Subtable->Header.Length;
                    348:         Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
                    349:             Subtable->Header.Length);
                    350:     }
                    351: }
                    352:
                    353:
                    354: /*******************************************************************************
                    355:  *
                    356:  * FUNCTION:    AcpiDmDumpCsrt
                    357:  *
                    358:  * PARAMETERS:  Table               - A CSRT table
                    359:  *
                    360:  * RETURN:      None
                    361:  *
                    362:  * DESCRIPTION: Format the contents of a CSRT. This table type consists
                    363:  *              of an open-ended number of subtables.
                    364:  *
                    365:  ******************************************************************************/
                    366:
                    367: void
                    368: AcpiDmDumpCsrt (
                    369:     ACPI_TABLE_HEADER       *Table)
                    370: {
                    371:     ACPI_STATUS             Status;
                    372:     ACPI_CSRT_GROUP         *Subtable;
                    373:     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
                    374:     ACPI_CSRT_DESCRIPTOR    *SubSubtable;
                    375:     UINT32                  Length = Table->Length;
                    376:     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
                    377:     UINT32                  SubOffset;
                    378:     UINT32                  SubSubOffset;
                    379:     UINT32                  InfoLength;
                    380:
                    381:
                    382:     /* The main table only contains the ACPI header, thus already handled */
                    383:
                    384:     /* Subtables (Resource Groups) */
                    385:
                    386:     Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
                    387:     while (Offset < Table->Length)
                    388:     {
                    389:         /* Resource group subtable */
                    390:
                    391:         AcpiOsPrintf ("\n");
                    392:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    393:             Subtable->Length, AcpiDmTableInfoCsrt0);
                    394:         if (ACPI_FAILURE (Status))
                    395:         {
                    396:             return;
                    397:         }
                    398:
                    399:         /* Shared info subtable (One per resource group) */
                    400:
                    401:         SubOffset = sizeof (ACPI_CSRT_GROUP);
                    402:         SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
                    403:             Offset + SubOffset);
                    404:
                    405:         AcpiOsPrintf ("\n");
                    406:         Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
                    407:             sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
                    408:         if (ACPI_FAILURE (Status))
                    409:         {
                    410:             return;
                    411:         }
                    412:
                    413:         SubOffset += Subtable->SharedInfoLength;
                    414:
                    415:         /* Sub-Subtables (Resource Descriptors) */
                    416:
                    417:         SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
                    418:             Offset + SubOffset);
                    419:
                    420:         while ((SubOffset < Subtable->Length) &&
                    421:               ((Offset + SubOffset) < Table->Length))
                    422:         {
                    423:             AcpiOsPrintf ("\n");
                    424:             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
                    425:                 SubSubtable->Length, AcpiDmTableInfoCsrt2);
                    426:             if (ACPI_FAILURE (Status))
                    427:             {
                    428:                 return;
                    429:             }
                    430:
                    431:             SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
                    432:
                    433:             /* Resource-specific info buffer */
                    434:
                    435:             InfoLength = SubSubtable->Length - SubSubOffset;
                    436:             if (InfoLength)
                    437:             {
                    438:                 Status = AcpiDmDumpTable (Length,
                    439:                     Offset + SubOffset + SubSubOffset, Table,
                    440:                     InfoLength, AcpiDmTableInfoCsrt2a);
                    441:                 if (ACPI_FAILURE (Status))
                    442:                 {
                    443:                     return;
                    444:                 }
                    445:             }
                    446:
                    447:             /* Point to next sub-subtable */
                    448:
                    449:             SubOffset += SubSubtable->Length;
                    450:             SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
                    451:                 SubSubtable->Length);
                    452:         }
                    453:
                    454:         /* Point to next subtable */
                    455:
                    456:         Offset += Subtable->Length;
                    457:         Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
                    458:             Subtable->Length);
                    459:     }
                    460: }
                    461:
                    462:
                    463: /*******************************************************************************
                    464:  *
                    465:  * FUNCTION:    AcpiDmDumpDbg2
                    466:  *
                    467:  * PARAMETERS:  Table               - A DBG2 table
                    468:  *
                    469:  * RETURN:      None
                    470:  *
                    471:  * DESCRIPTION: Format the contents of a DBG2. This table type consists
                    472:  *              of an open-ended number of subtables.
                    473:  *
                    474:  ******************************************************************************/
                    475:
                    476: void
                    477: AcpiDmDumpDbg2 (
                    478:     ACPI_TABLE_HEADER       *Table)
                    479: {
                    480:     ACPI_STATUS             Status;
                    481:     ACPI_DBG2_DEVICE        *Subtable;
                    482:     UINT32                  Length = Table->Length;
                    483:     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
                    484:     UINT32                  i;
                    485:     UINT32                  ArrayOffset;
                    486:     UINT32                  AbsoluteOffset;
                    487:     UINT8                   *Array;
                    488:
                    489:
                    490:     /* Main table */
                    491:
                    492:     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
                    493:     if (ACPI_FAILURE (Status))
                    494:     {
                    495:         return;
                    496:     }
                    497:
                    498:     /* Subtables */
                    499:
                    500:     Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
                    501:     while (Offset < Table->Length)
                    502:     {
                    503:         AcpiOsPrintf ("\n");
                    504:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    505:             Subtable->Length, AcpiDmTableInfoDbg2Device);
                    506:         if (ACPI_FAILURE (Status))
                    507:         {
                    508:             return;
                    509:         }
                    510:
                    511:         /* Dump the BaseAddress array */
                    512:
                    513:         for (i = 0; i < Subtable->RegisterCount; i++)
                    514:         {
                    515:             ArrayOffset = Subtable->BaseAddressOffset +
                    516:                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
                    517:             AbsoluteOffset = Offset + ArrayOffset;
                    518:             Array = (UINT8 *) Subtable + ArrayOffset;
                    519:
                    520:             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
                    521:                 Subtable->Length, AcpiDmTableInfoDbg2Addr);
                    522:             if (ACPI_FAILURE (Status))
                    523:             {
                    524:                 return;
                    525:             }
                    526:         }
                    527:
                    528:         /* Dump the AddressSize array */
                    529:
                    530:         for (i = 0; i < Subtable->RegisterCount; i++)
                    531:         {
                    532:             ArrayOffset = Subtable->AddressSizeOffset +
                    533:                 (sizeof (UINT32) * i);
                    534:             AbsoluteOffset = Offset + ArrayOffset;
                    535:             Array = (UINT8 *) Subtable + ArrayOffset;
                    536:
                    537:             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
                    538:                 Subtable->Length, AcpiDmTableInfoDbg2Size);
                    539:             if (ACPI_FAILURE (Status))
                    540:             {
                    541:                 return;
                    542:             }
                    543:         }
                    544:
                    545:         /* Dump the Namestring (required) */
                    546:
                    547:         AcpiOsPrintf ("\n");
                    548:         ArrayOffset = Subtable->NamepathOffset;
                    549:         AbsoluteOffset = Offset + ArrayOffset;
                    550:         Array = (UINT8 *) Subtable + ArrayOffset;
                    551:
                    552:         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
                    553:             Subtable->Length, AcpiDmTableInfoDbg2Name);
                    554:         if (ACPI_FAILURE (Status))
                    555:         {
                    556:             return;
                    557:         }
                    558:
                    559:         /* Dump the OemData (optional) */
                    560:
                    561:         if (Subtable->OemDataOffset)
                    562:         {
                    563:             Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
                    564:                 Table, Subtable->OemDataLength,
                    565:                 AcpiDmTableInfoDbg2OemData);
                    566:             if (ACPI_FAILURE (Status))
                    567:             {
                    568:                 return;
                    569:             }
                    570:         }
                    571:
                    572:         /* Point to next subtable */
                    573:
                    574:         Offset += Subtable->Length;
                    575:         Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
                    576:             Subtable->Length);
                    577:     }
                    578: }
                    579:
                    580:
                    581: /*******************************************************************************
                    582:  *
                    583:  * FUNCTION:    AcpiDmDumpDmar
                    584:  *
                    585:  * PARAMETERS:  Table               - A DMAR table
                    586:  *
                    587:  * RETURN:      None
                    588:  *
                    589:  * DESCRIPTION: Format the contents of a DMAR. This table type consists
                    590:  *              of an open-ended number of subtables.
                    591:  *
                    592:  ******************************************************************************/
                    593:
                    594: void
                    595: AcpiDmDumpDmar (
                    596:     ACPI_TABLE_HEADER       *Table)
                    597: {
                    598:     ACPI_STATUS             Status;
                    599:     ACPI_DMAR_HEADER        *Subtable;
                    600:     UINT32                  Length = Table->Length;
                    601:     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
                    602:     ACPI_DMTABLE_INFO       *InfoTable;
                    603:     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
                    604:     UINT32                  ScopeOffset;
                    605:     UINT8                   *PciPath;
                    606:     UINT32                  PathOffset;
                    607:
                    608:
                    609:     /* Main table */
                    610:
                    611:     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
                    612:     if (ACPI_FAILURE (Status))
                    613:     {
                    614:         return;
                    615:     }
                    616:
                    617:     /* Subtables */
                    618:
                    619:     Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
                    620:     while (Offset < Table->Length)
                    621:     {
                    622:         /* Common subtable header */
                    623:
                    624:         AcpiOsPrintf ("\n");
                    625:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    626:             Subtable->Length, AcpiDmTableInfoDmarHdr);
                    627:         if (ACPI_FAILURE (Status))
                    628:         {
                    629:             return;
                    630:         }
                    631:
                    632:         AcpiOsPrintf ("\n");
                    633:
                    634:         switch (Subtable->Type)
                    635:         {
                    636:         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
                    637:
                    638:             InfoTable = AcpiDmTableInfoDmar0;
                    639:             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
                    640:             break;
                    641:
                    642:         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
                    643:
                    644:             InfoTable = AcpiDmTableInfoDmar1;
                    645:             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
                    646:             break;
                    647:
                    648:         case ACPI_DMAR_TYPE_ROOT_ATS:
                    649:
                    650:             InfoTable = AcpiDmTableInfoDmar2;
                    651:             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
                    652:             break;
                    653:
                    654:         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
                    655:
                    656:             InfoTable = AcpiDmTableInfoDmar3;
                    657:             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
                    658:             break;
                    659:
                    660:         case ACPI_DMAR_TYPE_NAMESPACE:
                    661:
                    662:             InfoTable = AcpiDmTableInfoDmar4;
                    663:             ScopeOffset = sizeof (ACPI_DMAR_ANDD);
                    664:             break;
                    665:
                    666:         default:
                    667:
                    668:             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
                    669:                 Subtable->Type);
                    670:             return;
                    671:         }
                    672:
                    673:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    674:             Subtable->Length, InfoTable);
                    675:         if (ACPI_FAILURE (Status))
                    676:         {
                    677:             return;
                    678:         }
                    679:
                    680:         /*
                    681:          * Dump the optional device scope entries
                    682:          */
                    683:         if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
                    684:             (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
                    685:         {
                    686:             /* These types do not support device scopes */
                    687:
                    688:             goto NextSubtable;
                    689:         }
                    690:
                    691:         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
                    692:         while (ScopeOffset < Subtable->Length)
                    693:         {
                    694:             AcpiOsPrintf ("\n");
                    695:             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
                    696:                 ScopeTable->Length, AcpiDmTableInfoDmarScope);
                    697:             if (ACPI_FAILURE (Status))
                    698:             {
                    699:                 return;
                    700:             }
                    701:             AcpiOsPrintf ("\n");
                    702:
                    703:             /* Dump the PCI Path entries for this device scope */
                    704:
                    705:             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
                    706:
                    707:             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
                    708:                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
                    709:
                    710:             while (PathOffset < ScopeTable->Length)
                    711:             {
                    712:                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
                    713:                     "PCI Path");
                    714:                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
                    715:
                    716:                 /* Point to next PCI Path entry */
                    717:
                    718:                 PathOffset += 2;
                    719:                 PciPath += 2;
                    720:                 AcpiOsPrintf ("\n");
                    721:             }
                    722:
                    723:             /* Point to next device scope entry */
                    724:
                    725:             ScopeOffset += ScopeTable->Length;
                    726:             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
                    727:                 ScopeTable, ScopeTable->Length);
                    728:         }
                    729:
                    730: NextSubtable:
                    731:         /* Point to next subtable */
                    732:
                    733:         Offset += Subtable->Length;
                    734:         Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
                    735:             Subtable->Length);
                    736:     }
                    737: }
                    738:
                    739:
                    740: /*******************************************************************************
                    741:  *
                    742:  * FUNCTION:    AcpiDmDumpDrtm
                    743:  *
                    744:  * PARAMETERS:  Table               - A DRTM table
                    745:  *
                    746:  * RETURN:      None
                    747:  *
                    748:  * DESCRIPTION: Format the contents of a DRTM.
                    749:  *
                    750:  ******************************************************************************/
                    751:
                    752: void
                    753: AcpiDmDumpDrtm (
                    754:     ACPI_TABLE_HEADER       *Table)
                    755: {
                    756:     ACPI_STATUS             Status;
                    757:     UINT32                  Offset;
                    758:     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
                    759:     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
                    760:     ACPI_DRTM_DPS_ID        *DrtmDps;
                    761:     UINT32                  Count;
                    762:
                    763:
                    764:     /* Main table */
                    765:
                    766:     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
                    767:         AcpiDmTableInfoDrtm);
                    768:     if (ACPI_FAILURE (Status))
                    769:     {
                    770:         return;
                    771:     }
                    772:
                    773:     Offset = sizeof (ACPI_TABLE_DRTM);
                    774:
                    775:     /* Sub-tables */
                    776:
                    777:     /* Dump ValidatedTable length */
                    778:
                    779:     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
                    780:     AcpiOsPrintf ("\n");
                    781:     Status = AcpiDmDumpTable (Table->Length, Offset,
                    782:         DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
                    783:         AcpiDmTableInfoDrtm0);
                    784:     if (ACPI_FAILURE (Status))
                    785:     {
                    786:             return;
                    787:     }
                    788:
                    789:     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
                    790:
                    791:     /* Dump Validated table addresses */
                    792:
                    793:     Count = 0;
                    794:     while ((Offset < Table->Length) &&
                    795:             (DrtmVtl->ValidatedTableCount > Count))
                    796:     {
                    797:         Status = AcpiDmDumpTable (Table->Length, Offset,
                    798:             ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
                    799:             AcpiDmTableInfoDrtm0a);
                    800:         if (ACPI_FAILURE (Status))
                    801:         {
                    802:             return;
                    803:         }
                    804:
                    805:         Offset += sizeof (UINT64);
                    806:         Count++;
                    807:     }
                    808:
                    809:     /* Dump ResourceList length */
                    810:
                    811:     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
                    812:     AcpiOsPrintf ("\n");
                    813:     Status = AcpiDmDumpTable (Table->Length, Offset,
                    814:         DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
                    815:         AcpiDmTableInfoDrtm1);
                    816:     if (ACPI_FAILURE (Status))
                    817:     {
                    818:         return;
                    819:     }
                    820:
                    821:     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
                    822:
                    823:     /* Dump the Resource List */
                    824:
                    825:     Count = 0;
                    826:     while ((Offset < Table->Length) &&
                    827:            (DrtmRl->ResourceCount > Count))
                    828:     {
                    829:         Status = AcpiDmDumpTable (Table->Length, Offset,
                    830:             ACPI_ADD_PTR (void, Table, Offset),
                    831:             sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
                    832:         if (ACPI_FAILURE (Status))
                    833:         {
                    834:             return;
                    835:         }
                    836:
                    837:         Offset += sizeof (ACPI_DRTM_RESOURCE);
                    838:         Count++;
                    839:     }
                    840:
                    841:     /* Dump DPS */
                    842:
                    843:     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
                    844:     AcpiOsPrintf ("\n");
                    845:     (void) AcpiDmDumpTable (Table->Length, Offset,
                    846:         DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
                    847: }
                    848:
                    849:
                    850: /*******************************************************************************
                    851:  *
                    852:  * FUNCTION:    AcpiDmDumpEinj
                    853:  *
                    854:  * PARAMETERS:  Table               - A EINJ table
                    855:  *
                    856:  * RETURN:      None
                    857:  *
                    858:  * DESCRIPTION: Format the contents of a EINJ. This table type consists
                    859:  *              of an open-ended number of subtables.
                    860:  *
                    861:  ******************************************************************************/
                    862:
                    863: void
                    864: AcpiDmDumpEinj (
                    865:     ACPI_TABLE_HEADER       *Table)
                    866: {
                    867:     ACPI_STATUS             Status;
                    868:     ACPI_WHEA_HEADER        *Subtable;
                    869:     UINT32                  Length = Table->Length;
                    870:     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
                    871:
                    872:
                    873:     /* Main table */
                    874:
                    875:     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
                    876:     if (ACPI_FAILURE (Status))
                    877:     {
                    878:         return;
                    879:     }
                    880:
                    881:     /* Subtables */
                    882:
                    883:     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
                    884:     while (Offset < Table->Length)
                    885:     {
                    886:         AcpiOsPrintf ("\n");
                    887:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    888:             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
                    889:         if (ACPI_FAILURE (Status))
                    890:         {
                    891:             return;
                    892:         }
                    893:
                    894:         /* Point to next subtable (each subtable is of fixed length) */
                    895:
                    896:         Offset += sizeof (ACPI_WHEA_HEADER);
                    897:         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
                    898:             sizeof (ACPI_WHEA_HEADER));
                    899:     }
                    900: }
                    901:
                    902:
                    903: /*******************************************************************************
                    904:  *
                    905:  * FUNCTION:    AcpiDmDumpErst
                    906:  *
                    907:  * PARAMETERS:  Table               - A ERST table
                    908:  *
                    909:  * RETURN:      None
                    910:  *
                    911:  * DESCRIPTION: Format the contents of a ERST. This table type consists
                    912:  *              of an open-ended number of subtables.
                    913:  *
                    914:  ******************************************************************************/
                    915:
                    916: void
                    917: AcpiDmDumpErst (
                    918:     ACPI_TABLE_HEADER       *Table)
                    919: {
                    920:     ACPI_STATUS             Status;
                    921:     ACPI_WHEA_HEADER        *Subtable;
                    922:     UINT32                  Length = Table->Length;
                    923:     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
                    924:
                    925:
                    926:     /* Main table */
                    927:
                    928:     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
                    929:     if (ACPI_FAILURE (Status))
                    930:     {
                    931:         return;
                    932:     }
                    933:
                    934:     /* Subtables */
                    935:
                    936:     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
                    937:     while (Offset < Table->Length)
                    938:     {
                    939:         AcpiOsPrintf ("\n");
                    940:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    941:             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
                    942:         if (ACPI_FAILURE (Status))
                    943:         {
                    944:             return;
                    945:         }
                    946:
                    947:         /* Point to next subtable (each subtable is of fixed length) */
                    948:
                    949:         Offset += sizeof (ACPI_WHEA_HEADER);
                    950:         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
                    951:             sizeof (ACPI_WHEA_HEADER));
                    952:     }
                    953: }
                    954:
                    955:
                    956: /*******************************************************************************
                    957:  *
                    958:  * FUNCTION:    AcpiDmDumpFpdt
                    959:  *
                    960:  * PARAMETERS:  Table               - A FPDT table
                    961:  *
                    962:  * RETURN:      None
                    963:  *
                    964:  * DESCRIPTION: Format the contents of a FPDT. This table type consists
                    965:  *              of an open-ended number of subtables.
                    966:  *
                    967:  ******************************************************************************/
                    968:
                    969: void
                    970: AcpiDmDumpFpdt (
                    971:     ACPI_TABLE_HEADER       *Table)
                    972: {
                    973:     ACPI_STATUS             Status;
                    974:     ACPI_FPDT_HEADER        *Subtable;
                    975:     UINT32                  Length = Table->Length;
                    976:     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
                    977:     ACPI_DMTABLE_INFO       *InfoTable;
                    978:
                    979:
                    980:     /* There is no main table (other than the standard ACPI header) */
                    981:
                    982:     /* Subtables */
                    983:
                    984:     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
                    985:     while (Offset < Table->Length)
                    986:     {
                    987:         /* Common subtable header */
                    988:
                    989:         AcpiOsPrintf ("\n");
                    990:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                    991:             Subtable->Length, AcpiDmTableInfoFpdtHdr);
                    992:         if (ACPI_FAILURE (Status))
                    993:         {
                    994:             return;
                    995:         }
                    996:
                    997:         switch (Subtable->Type)
                    998:         {
                    999:         case ACPI_FPDT_TYPE_BOOT:
                   1000:
                   1001:             InfoTable = AcpiDmTableInfoFpdt0;
                   1002:             break;
                   1003:
                   1004:         case ACPI_FPDT_TYPE_S3PERF:
                   1005:
                   1006:             InfoTable = AcpiDmTableInfoFpdt1;
                   1007:             break;
                   1008:
                   1009:         default:
                   1010:
                   1011:             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
                   1012:                 Subtable->Type);
                   1013:
                   1014:             /* Attempt to continue */
                   1015:
                   1016:             if (!Subtable->Length)
                   1017:             {
                   1018:                 AcpiOsPrintf ("Invalid zero length subtable\n");
                   1019:                 return;
                   1020:             }
                   1021:             goto NextSubtable;
                   1022:         }
                   1023:
                   1024:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                   1025:             Subtable->Length, InfoTable);
                   1026:         if (ACPI_FAILURE (Status))
                   1027:         {
                   1028:             return;
                   1029:         }
                   1030:
                   1031: NextSubtable:
                   1032:         /* Point to next subtable */
                   1033:
                   1034:         Offset += Subtable->Length;
                   1035:         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
                   1036:             Subtable->Length);
                   1037:     }
                   1038: }
                   1039:
                   1040:
                   1041: /*******************************************************************************
                   1042:  *
                   1043:  * FUNCTION:    AcpiDmDumpGtdt
                   1044:  *
                   1045:  * PARAMETERS:  Table               - A GTDT table
                   1046:  *
                   1047:  * RETURN:      None
                   1048:  *
                   1049:  * DESCRIPTION: Format the contents of a GTDT. This table type consists
                   1050:  *              of an open-ended number of subtables.
                   1051:  *
                   1052:  ******************************************************************************/
                   1053:
                   1054: void
                   1055: AcpiDmDumpGtdt (
                   1056:     ACPI_TABLE_HEADER       *Table)
                   1057: {
                   1058:     ACPI_STATUS             Status;
                   1059:     ACPI_GTDT_HEADER        *Subtable;
                   1060:     UINT32                  Length = Table->Length;
                   1061:     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
                   1062:     ACPI_DMTABLE_INFO       *InfoTable;
                   1063:     UINT32                  SubtableLength;
                   1064:     UINT32                  GtCount;
                   1065:     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
                   1066:
                   1067:
                   1068:     /* Main table */
                   1069:
                   1070:     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
                   1071:     if (ACPI_FAILURE (Status))
                   1072:     {
                   1073:         return;
                   1074:     }
                   1075:
1.1.1.2   christos 1076:     /* Rev 3 fields */
1.1       christos 1077:
                   1078:     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1.1.1.2   christos 1079:
                   1080:     if (Table->Revision > 2)
                   1081:     {
                   1082:         SubtableLength = sizeof (ACPI_GTDT_EL2);
                   1083:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                   1084:             SubtableLength, AcpiDmTableInfoGtdtEl2);
                   1085:         if (ACPI_FAILURE (Status))
                   1086:         {
                   1087:             return;
                   1088:         }
                   1089:         Offset += SubtableLength;
                   1090:     }
                   1091:
                   1092:     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
                   1093:
                   1094:     /* Subtables */
                   1095:
1.1       christos 1096:     while (Offset < Table->Length)
                   1097:     {
                   1098:         /* Common subtable header */
                   1099:
                   1100:         AcpiOsPrintf ("\n");
                   1101:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                   1102:             Subtable->Length, AcpiDmTableInfoGtdtHdr);
                   1103:         if (ACPI_FAILURE (Status))
                   1104:         {
                   1105:             return;
                   1106:         }
                   1107:
                   1108:         GtCount = 0;
                   1109:         switch (Subtable->Type)
                   1110:         {
                   1111:         case ACPI_GTDT_TYPE_TIMER_BLOCK:
                   1112:
                   1113:             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
                   1114:             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
                   1115:                 Subtable))->TimerCount;
                   1116:
                   1117:             InfoTable = AcpiDmTableInfoGtdt0;
                   1118:             break;
                   1119:
                   1120:         case ACPI_GTDT_TYPE_WATCHDOG:
                   1121:
                   1122:             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
                   1123:
                   1124:             InfoTable = AcpiDmTableInfoGtdt1;
                   1125:             break;
                   1126:
                   1127:         default:
                   1128:
                   1129:             /* Cannot continue on unknown type - no length */
                   1130:
                   1131:             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
                   1132:                 Subtable->Type);
                   1133:             return;
                   1134:         }
                   1135:
                   1136:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                   1137:             Subtable->Length, InfoTable);
                   1138:         if (ACPI_FAILURE (Status))
                   1139:         {
                   1140:             return;
                   1141:         }
                   1142:
                   1143:         /* Point to end of current subtable (each subtable above is of fixed length) */
                   1144:
                   1145:         Offset += SubtableLength;
                   1146:
                   1147:         /* If there are any Gt Timer Blocks from above, dump them now */
                   1148:
                   1149:         if (GtCount)
                   1150:         {
                   1151:             GtxTable = ACPI_ADD_PTR (
                   1152:                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
                   1153:             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
                   1154:
                   1155:             while (GtCount)
                   1156:             {
                   1157:                 AcpiOsPrintf ("\n");
                   1158:                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
                   1159:                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
                   1160:                 if (ACPI_FAILURE (Status))
                   1161:                 {
                   1162:                     return;
                   1163:                 }
                   1164:                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
                   1165:                 GtxTable++;
                   1166:                 GtCount--;
                   1167:             }
                   1168:         }
                   1169:
                   1170:         /* Point to next subtable */
                   1171:
                   1172:         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
                   1173:     }
                   1174: }
                   1175:
                   1176:
                   1177: /*******************************************************************************
                   1178:  *
                   1179:  * FUNCTION:    AcpiDmDumpHest
                   1180:  *
                   1181:  * PARAMETERS:  Table               - A HEST table
                   1182:  *
                   1183:  * RETURN:      None
                   1184:  *
                   1185:  * DESCRIPTION: Format the contents of a HEST. This table type consists
                   1186:  *              of an open-ended number of subtables.
                   1187:  *
                   1188:  ******************************************************************************/
                   1189:
                   1190: void
                   1191: AcpiDmDumpHest (
                   1192:     ACPI_TABLE_HEADER       *Table)
                   1193: {
                   1194:     ACPI_STATUS             Status;
                   1195:     ACPI_HEST_HEADER        *Subtable;
                   1196:     UINT32                  Length = Table->Length;
                   1197:     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
                   1198:     ACPI_DMTABLE_INFO       *InfoTable;
                   1199:     UINT32                  SubtableLength;
                   1200:     UINT32                  BankCount;
                   1201:     ACPI_HEST_IA_ERROR_BANK *BankTable;
                   1202:
                   1203:
                   1204:     /* Main table */
                   1205:
                   1206:     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
                   1207:     if (ACPI_FAILURE (Status))
                   1208:     {
                   1209:         return;
                   1210:     }
                   1211:
                   1212:     /* Subtables */
                   1213:
                   1214:     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
                   1215:     while (Offset < Table->Length)
                   1216:     {
                   1217:         BankCount = 0;
                   1218:         switch (Subtable->Type)
                   1219:         {
                   1220:         case ACPI_HEST_TYPE_IA32_CHECK:
                   1221:
                   1222:             InfoTable = AcpiDmTableInfoHest0;
                   1223:             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
                   1224:             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
                   1225:                 Subtable))->NumHardwareBanks;
                   1226:             break;
                   1227:
                   1228:         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
                   1229:
                   1230:             InfoTable = AcpiDmTableInfoHest1;
                   1231:             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
                   1232:             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
                   1233:                 Subtable))->NumHardwareBanks;
                   1234:             break;
                   1235:
                   1236:         case ACPI_HEST_TYPE_IA32_NMI:
                   1237:
                   1238:             InfoTable = AcpiDmTableInfoHest2;
                   1239:             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
                   1240:             break;
                   1241:
                   1242:         case ACPI_HEST_TYPE_AER_ROOT_PORT:
                   1243:
                   1244:             InfoTable = AcpiDmTableInfoHest6;
                   1245:             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
                   1246:             break;
                   1247:
                   1248:         case ACPI_HEST_TYPE_AER_ENDPOINT:
                   1249:
                   1250:             InfoTable = AcpiDmTableInfoHest7;
                   1251:             SubtableLength = sizeof (ACPI_HEST_AER);
                   1252:             break;
                   1253:
                   1254:         case ACPI_HEST_TYPE_AER_BRIDGE:
                   1255:
                   1256:             InfoTable = AcpiDmTableInfoHest8;
                   1257:             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
                   1258:             break;
                   1259:
                   1260:         case ACPI_HEST_TYPE_GENERIC_ERROR:
                   1261:
                   1262:             InfoTable = AcpiDmTableInfoHest9;
                   1263:             SubtableLength = sizeof (ACPI_HEST_GENERIC);
                   1264:             break;
                   1265:
                   1266:         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
                   1267:
                   1268:             InfoTable = AcpiDmTableInfoHest10;
                   1269:             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
                   1270:             break;
                   1271:
                   1272:         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
                   1273:
                   1274:             InfoTable = AcpiDmTableInfoHest11;
                   1275:             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
                   1276:             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
                   1277:                 Subtable))->NumHardwareBanks;
                   1278:             break;
                   1279:
                   1280:         default:
                   1281:
                   1282:             /* Cannot continue on unknown type - no length */
                   1283:
                   1284:             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
                   1285:                 Subtable->Type);
                   1286:             return;
                   1287:         }
                   1288:
                   1289:         AcpiOsPrintf ("\n");
                   1290:         Status = AcpiDmDumpTable (Length, Offset, Subtable,
                   1291:             SubtableLength, InfoTable);
                   1292:         if (ACPI_FAILURE (Status))
                   1293:         {
                   1294:             return;
                   1295:         }
                   1296:
                   1297:         /* Point to end of current subtable (each subtable above is of fixed length) */
                   1298:
                   1299:         Offset += SubtableLength;
                   1300:
                   1301:         /* If there are any (fixed-length) Error Banks from above, dump them now */
                   1302:
                   1303:         if (BankCount)
                   1304:         {
                   1305:             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
                   1306:                 SubtableLength);
                   1307:             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
                   1308:
                   1309:             while (BankCount)
                   1310:             {
                   1311:                 AcpiOsPrintf ("\n");
                   1312:                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
                   1313:                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
                   1314:                 if (ACPI_FAILURE (Status))
                   1315:                 {
                   1316:                     return;
                   1317:                 }
                   1318:
                   1319:                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
                   1320:                 BankTable++;
                   1321:                 BankCount--;
                   1322:             }
                   1323:         }
                   1324:
                   1325:         /* Point to next subtable */
                   1326:
                   1327:         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
                   1328:     }
                   1329: }
                   1330:
                   1331:
                   1332: /*******************************************************************************
                   1333:  *
                   1334:  * FUNCTION:    AcpiDmDumpHmat
                   1335:  *
                   1336:  * PARAMETERS:  Table               - A HMAT table
                   1337:  *
                   1338:  * RETURN:      None
                   1339:  *
                   1340:  * DESCRIPTION: Format the contents of a HMAT.
                   1341:  *
                   1342:  ******************************************************************************/
                   1343:
                   1344: void
                   1345: AcpiDmDumpHmat (
                   1346:     ACPI_TABLE_HEADER       *Table)
                   1347: {
                   1348:     ACPI_STATUS             Status;
                   1349:     ACPI_HMAT_STRUCTURE     *HmatStruct;
                   1350:     ACPI_HMAT_LOCALITY      *HmatLocality;
                   1351:     ACPI_HMAT_CACHE         *HmatCache;
                   1352:     UINT32                  Offset;
                   1353:     UINT32                  SubtableOffset;
                   1354:     UINT32                  Length;
                   1355:     ACPI_DMTABLE_INFO       *InfoTable;
                   1356:     UINT32                  i, j;
                   1357:
                   1358:
                   1359:     /* Main table */
                   1360:
                   1361:     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
                   1362:     if (ACPI_FAILURE (Status))
                   1363:     {
                   1364:         return;
                   1365:     }
                   1366:     Offset = sizeof (ACPI_TABLE_HMAT);
                   1367:
                   1368:     while (Offset < Table->Length)
                   1369:     {
                   1370:         AcpiOsPrintf ("\n");
                   1371:
                   1372:         /* Dump HMAT structure header */
                   1373:
                   1374:         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
                   1375:         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
                   1376:         {
                   1377:             AcpiOsPrintf ("Invalid HMAT structure length\n");
                   1378:             return;
                   1379:         }
                   1380:         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
                   1381:             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
                   1382:         if (ACPI_FAILURE (Status))
                   1383:         {
                   1384:             return;
                   1385:         }
                   1386:
                   1387:         switch (HmatStruct->Type)
                   1388:         {
                   1389:         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
                   1390:
                   1391:             InfoTable = AcpiDmTableInfoHmat0;
1.1.1.2   christos 1392:             Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
1.1       christos 1393:             break;
                   1394:
                   1395:         case ACPI_HMAT_TYPE_LOCALITY:
                   1396:
                   1397:             InfoTable = AcpiDmTableInfoHmat1;
                   1398:             Length = sizeof (ACPI_HMAT_LOCALITY);
                   1399:             break;
                   1400:
                   1401:         case ACPI_HMAT_TYPE_CACHE:
                   1402:
                   1403:             InfoTable = AcpiDmTableInfoHmat2;
                   1404:             Length = sizeof (ACPI_HMAT_CACHE);
                   1405:             break;
                   1406:
                   1407:         default:
                   1408:
                   1409:             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
                   1410:                 HmatStruct->Type);
                   1411:
                   1412:             /* Attempt to continue */
                   1413:
                   1414:             goto NextSubtable;
                   1415:         }
                   1416:
                   1417:         /* Dump HMAT structure body */
                   1418:
                   1419:         if (HmatStruct->Length < Length)
                   1420:         {
                   1421:             AcpiOsPrintf ("Invalid HMAT structure length\n");
                   1422:             return;
                   1423:         }
                   1424:         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
                   1425:             HmatStruct->Length, InfoTable);
                   1426:         if (ACPI_FAILURE (Status))
                   1427:         {
                   1428:             return;
                   1429:         }
                   1430:
                   1431:         /* Dump HMAT structure additionals */
                   1432:
                   1433:         switch (HmatStruct->Type)
                   1434:         {
                   1435:         case ACPI_HMAT_TYPE_LOCALITY:
                   1436:
                   1437:             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
                   1438:             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
                   1439:
                   1440:             /* Dump initiator proximity domains */
                   1441:
                   1442:             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                   1443:                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
                   1444:             {
                   1445:                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
                   1446:                 return;
                   1447:             }
                   1448:             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
                   1449:             {
                   1450:                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
                   1451:                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                   1452:                     4, AcpiDmTableInfoHmat1a);
1.1.1.3   christos 1453:                 if (ACPI_FAILURE (Status))
                   1454:                 {
                   1455:                     return;
                   1456:                 }
                   1457:
1.1       christos 1458:                 SubtableOffset += 4;
                   1459:             }
                   1460:
                   1461:             /* Dump target proximity domains */
                   1462:
                   1463:             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                   1464:                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
                   1465:             {
                   1466:                 AcpiOsPrintf ("Invalid target proximity domain number\n");
                   1467:                 return;
                   1468:             }
                   1469:             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
                   1470:             {
                   1471:                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
                   1472:                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                   1473:                     4, AcpiDmTableInfoHmat1b);
1.1.1.3   christos 1474:                 if (ACPI_FAILURE (Status))
                   1475:                 {
                   1476:                     return;
                   1477:                 }
                   1478:
1.1       christos 1479:                 SubtableOffset += 4;
                   1480:             }
                   1481:
                   1482:             /* Dump latency/bandwidth entris */
                   1483:
                   1484:             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                   1485:                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
                   1486:                          HmatLocality->NumberOfTargetPDs * 2))
                   1487:             {
                   1488:                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
                   1489:                 return;
                   1490:             }
                   1491:             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
                   1492:             {
                   1493:                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
                   1494:                 {
                   1495:                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
                   1496:                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                   1497:                         2, AcpiDmTableInfoHmat1c);
1.1.1.3   christos 1498:                     if (ACPI_FAILURE(Status))
                   1499:                     {
                   1500:                         return;
                   1501:                     }
                   1502:
1.1       christos 1503:                     SubtableOffset += 2;
                   1504:                 }
                   1505:             }
                   1506:             break;
                   1507:
                   1508:         case ACPI_HMAT_TYPE_CACHE:
                   1509:
                   1510:             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
                   1511:             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
                   1512:
                   1513:             /* Dump SMBIOS handles */
                   1514:
                   1515:             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                   1516:                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
                   1517:             {
                   1518:                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
                   1519:                 return;
                   1520:             }
                   1521:             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
                   1522:             {
                   1523:                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
                   1524:                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                   1525:                     2, AcpiDmTableInfoHmat2a);
1.1.1.3   christos 1526:                 if (ACPI_FAILURE (Status))
                   1527:                 {
                   1528:                     return;
                   1529:                 }
                   1530:
1.1       christos 1531:                 SubtableOffset += 2;
                   1532:             }
                   1533:             break;
                   1534:
                   1535:         default:
                   1536:
                   1537:             break;
                   1538:         }
                   1539:
                   1540: NextSubtable:
                   1541:         /* Point to next HMAT structure subtable */
                   1542:
                   1543:         Offset += (HmatStruct->Length);
                   1544:     }
                   1545: }

CVSweb <webmaster@jp.NetBSD.org>