Home | History | Annotate | Line # | Download | only in compiler
dttable2.c revision 1.1.1.15
      1 /******************************************************************************
      2  *
      3  * Module Name: dttable2.c - handling for specific ACPI tables
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2022, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 /* Compile all complex data tables, signatures starting with L-Z */
     45 
     46 #include "aslcompiler.h"
     47 
     48 #define _COMPONENT          DT_COMPILER
     49         ACPI_MODULE_NAME    ("dttable2")
     50 
     51 
     52 /******************************************************************************
     53  *
     54  * FUNCTION:    DtCompileLpit
     55  *
     56  * PARAMETERS:  List                - Current field list pointer
     57  *
     58  * RETURN:      Status
     59  *
     60  * DESCRIPTION: Compile LPIT.
     61  *
     62  *****************************************************************************/
     63 
     64 ACPI_STATUS
     65 DtCompileLpit (
     66     void                    **List)
     67 {
     68     ACPI_STATUS             Status;
     69     DT_SUBTABLE             *Subtable;
     70     DT_SUBTABLE             *ParentTable;
     71     DT_FIELD                **PFieldList = (DT_FIELD **) List;
     72     DT_FIELD                *SubtableStart;
     73     ACPI_DMTABLE_INFO       *InfoTable;
     74     ACPI_LPIT_HEADER        *LpitHeader;
     75 
     76 
     77     /* Note: Main table consists only of the standard ACPI table header */
     78 
     79     while (*PFieldList)
     80     {
     81         SubtableStart = *PFieldList;
     82 
     83         /* LPIT Subtable header */
     84 
     85         Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
     86             &Subtable);
     87         if (ACPI_FAILURE (Status))
     88         {
     89             return (Status);
     90         }
     91 
     92         ParentTable = DtPeekSubtable ();
     93         DtInsertSubtable (ParentTable, Subtable);
     94         DtPushSubtable (Subtable);
     95 
     96         LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
     97 
     98         switch (LpitHeader->Type)
     99         {
    100         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
    101 
    102             InfoTable = AcpiDmTableInfoLpit0;
    103             break;
    104 
    105         default:
    106 
    107             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
    108             return (AE_ERROR);
    109         }
    110 
    111         /* LPIT Subtable */
    112 
    113         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    114         if (ACPI_FAILURE (Status))
    115         {
    116             return (Status);
    117         }
    118 
    119         ParentTable = DtPeekSubtable ();
    120         DtInsertSubtable (ParentTable, Subtable);
    121         DtPopSubtable ();
    122     }
    123 
    124     return (AE_OK);
    125 }
    126 
    127 
    128 /******************************************************************************
    129  *
    130  * FUNCTION:    DtCompileMadt
    131  *
    132  * PARAMETERS:  List                - Current field list pointer
    133  *
    134  * RETURN:      Status
    135  *
    136  * DESCRIPTION: Compile MADT.
    137  *
    138  *****************************************************************************/
    139 
    140 ACPI_STATUS
    141 DtCompileMadt (
    142     void                    **List)
    143 {
    144     ACPI_STATUS             Status;
    145     DT_SUBTABLE             *Subtable;
    146     DT_SUBTABLE             *ParentTable;
    147     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    148     DT_FIELD                *SubtableStart;
    149     ACPI_SUBTABLE_HEADER    *MadtHeader;
    150     ACPI_DMTABLE_INFO       *InfoTable;
    151 
    152 
    153     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
    154         &Subtable);
    155     if (ACPI_FAILURE (Status))
    156     {
    157         return (Status);
    158     }
    159 
    160     ParentTable = DtPeekSubtable ();
    161     DtInsertSubtable (ParentTable, Subtable);
    162 
    163     while (*PFieldList)
    164     {
    165         SubtableStart = *PFieldList;
    166         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
    167             &Subtable);
    168         if (ACPI_FAILURE (Status))
    169         {
    170             return (Status);
    171         }
    172 
    173         ParentTable = DtPeekSubtable ();
    174         DtInsertSubtable (ParentTable, Subtable);
    175         DtPushSubtable (Subtable);
    176 
    177         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
    178 
    179         switch (MadtHeader->Type)
    180         {
    181         case ACPI_MADT_TYPE_LOCAL_APIC:
    182 
    183             InfoTable = AcpiDmTableInfoMadt0;
    184             break;
    185 
    186         case ACPI_MADT_TYPE_IO_APIC:
    187 
    188             InfoTable = AcpiDmTableInfoMadt1;
    189             break;
    190 
    191         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
    192 
    193             InfoTable = AcpiDmTableInfoMadt2;
    194             break;
    195 
    196         case ACPI_MADT_TYPE_NMI_SOURCE:
    197 
    198             InfoTable = AcpiDmTableInfoMadt3;
    199             break;
    200 
    201         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
    202 
    203             InfoTable = AcpiDmTableInfoMadt4;
    204             break;
    205 
    206         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
    207 
    208             InfoTable = AcpiDmTableInfoMadt5;
    209             break;
    210 
    211         case ACPI_MADT_TYPE_IO_SAPIC:
    212 
    213             InfoTable = AcpiDmTableInfoMadt6;
    214             break;
    215 
    216         case ACPI_MADT_TYPE_LOCAL_SAPIC:
    217 
    218             InfoTable = AcpiDmTableInfoMadt7;
    219             break;
    220 
    221         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
    222 
    223             InfoTable = AcpiDmTableInfoMadt8;
    224             break;
    225 
    226         case ACPI_MADT_TYPE_LOCAL_X2APIC:
    227 
    228             InfoTable = AcpiDmTableInfoMadt9;
    229             break;
    230 
    231         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
    232 
    233             InfoTable = AcpiDmTableInfoMadt10;
    234             break;
    235 
    236         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
    237 
    238             InfoTable = AcpiDmTableInfoMadt11;
    239             break;
    240 
    241         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
    242 
    243             InfoTable = AcpiDmTableInfoMadt12;
    244             break;
    245 
    246         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
    247 
    248             InfoTable = AcpiDmTableInfoMadt13;
    249             break;
    250 
    251         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
    252 
    253             InfoTable = AcpiDmTableInfoMadt14;
    254             break;
    255 
    256         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
    257 
    258             InfoTable = AcpiDmTableInfoMadt15;
    259             break;
    260 
    261         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
    262 
    263             InfoTable = AcpiDmTableInfoMadt16;
    264             break;
    265 
    266         default:
    267 
    268             if (MadtHeader->Type >= ACPI_MADT_TYPE_OEM_RESERVED)
    269             {
    270                 InfoTable = AcpiDmTableInfoMadt17;
    271             }
    272             else
    273             {
    274                 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
    275                 return (AE_ERROR);
    276             }
    277 
    278             break;
    279         }
    280 
    281         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    282         if (ACPI_FAILURE (Status))
    283         {
    284             return (Status);
    285         }
    286 
    287         ParentTable = DtPeekSubtable ();
    288         DtInsertSubtable (ParentTable, Subtable);
    289         DtPopSubtable ();
    290     }
    291 
    292     return (AE_OK);
    293 }
    294 
    295 
    296 /******************************************************************************
    297  *
    298  * FUNCTION:    DtCompileMcfg
    299  *
    300  * PARAMETERS:  List                - Current field list pointer
    301  *
    302  * RETURN:      Status
    303  *
    304  * DESCRIPTION: Compile MCFG.
    305  *
    306  *****************************************************************************/
    307 
    308 ACPI_STATUS
    309 DtCompileMcfg (
    310     void                    **List)
    311 {
    312     ACPI_STATUS             Status;
    313 
    314 
    315     Status = DtCompileTwoSubtables (List,
    316         AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
    317     return (Status);
    318 }
    319 
    320 
    321 /******************************************************************************
    322  *
    323  * FUNCTION:    DtCompileMpst
    324  *
    325  * PARAMETERS:  List                - Current field list pointer
    326  *
    327  * RETURN:      Status
    328  *
    329  * DESCRIPTION: Compile MPST.
    330  *
    331  *****************************************************************************/
    332 
    333 ACPI_STATUS
    334 DtCompileMpst (
    335     void                    **List)
    336 {
    337     ACPI_STATUS             Status;
    338     DT_SUBTABLE             *Subtable;
    339     DT_SUBTABLE             *ParentTable;
    340     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    341     ACPI_MPST_CHANNEL       *MpstChannelInfo;
    342     ACPI_MPST_POWER_NODE    *MpstPowerNode;
    343     ACPI_MPST_DATA_HDR      *MpstDataHeader;
    344     UINT16                  SubtableCount;
    345     UINT32                  PowerStateCount;
    346     UINT32                  ComponentCount;
    347 
    348 
    349     /* Main table */
    350 
    351     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable);
    352     if (ACPI_FAILURE (Status))
    353     {
    354         return (Status);
    355     }
    356 
    357     ParentTable = DtPeekSubtable ();
    358     DtInsertSubtable (ParentTable, Subtable);
    359     DtPushSubtable (Subtable);
    360 
    361     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
    362     SubtableCount = MpstChannelInfo->PowerNodeCount;
    363 
    364     while (*PFieldList && SubtableCount)
    365     {
    366         /* Subtable: Memory Power Node(s) */
    367 
    368         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
    369             &Subtable);
    370         if (ACPI_FAILURE (Status))
    371         {
    372             return (Status);
    373         }
    374 
    375         ParentTable = DtPeekSubtable ();
    376         DtInsertSubtable (ParentTable, Subtable);
    377         DtPushSubtable (Subtable);
    378 
    379         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
    380         PowerStateCount = MpstPowerNode->NumPowerStates;
    381         ComponentCount = MpstPowerNode->NumPhysicalComponents;
    382 
    383         ParentTable = DtPeekSubtable ();
    384 
    385         /* Sub-subtables - Memory Power State Structure(s) */
    386 
    387         while (*PFieldList && PowerStateCount)
    388         {
    389             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
    390                 &Subtable);
    391             if (ACPI_FAILURE (Status))
    392             {
    393                 return (Status);
    394             }
    395 
    396             DtInsertSubtable (ParentTable, Subtable);
    397             PowerStateCount--;
    398         }
    399 
    400         /* Sub-subtables - Physical Component ID Structure(s) */
    401 
    402         while (*PFieldList && ComponentCount)
    403         {
    404             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
    405                 &Subtable);
    406             if (ACPI_FAILURE (Status))
    407             {
    408                 return (Status);
    409             }
    410 
    411             DtInsertSubtable (ParentTable, Subtable);
    412             ComponentCount--;
    413         }
    414 
    415         SubtableCount--;
    416         DtPopSubtable ();
    417     }
    418 
    419     /* Subtable: Count of Memory Power State Characteristic structures */
    420 
    421     DtPopSubtable ();
    422 
    423     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable);
    424     if (ACPI_FAILURE (Status))
    425     {
    426         return (Status);
    427     }
    428 
    429     ParentTable = DtPeekSubtable ();
    430     DtInsertSubtable (ParentTable, Subtable);
    431     DtPushSubtable (Subtable);
    432 
    433     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
    434     SubtableCount = MpstDataHeader->CharacteristicsCount;
    435 
    436     ParentTable = DtPeekSubtable ();
    437 
    438     /* Subtable: Memory Power State Characteristics structure(s) */
    439 
    440     while (*PFieldList && SubtableCount)
    441     {
    442         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
    443             &Subtable);
    444         if (ACPI_FAILURE (Status))
    445         {
    446             return (Status);
    447         }
    448 
    449         DtInsertSubtable (ParentTable, Subtable);
    450         SubtableCount--;
    451     }
    452 
    453     DtPopSubtable ();
    454     return (AE_OK);
    455 }
    456 
    457 
    458 /******************************************************************************
    459  *
    460  * FUNCTION:    DtCompileMsct
    461  *
    462  * PARAMETERS:  List                - Current field list pointer
    463  *
    464  * RETURN:      Status
    465  *
    466  * DESCRIPTION: Compile MSCT.
    467  *
    468  *****************************************************************************/
    469 
    470 ACPI_STATUS
    471 DtCompileMsct (
    472     void                    **List)
    473 {
    474     ACPI_STATUS             Status;
    475 
    476 
    477     Status = DtCompileTwoSubtables (List,
    478         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
    479     return (Status);
    480 }
    481 
    482 
    483 /******************************************************************************
    484  *
    485  * FUNCTION:    DtCompileNfit
    486  *
    487  * PARAMETERS:  List                - Current field list pointer
    488  *
    489  * RETURN:      Status
    490  *
    491  * DESCRIPTION: Compile NFIT.
    492  *
    493  *****************************************************************************/
    494 
    495 ACPI_STATUS
    496 DtCompileNfit (
    497     void                    **List)
    498 {
    499     ACPI_STATUS             Status;
    500     DT_SUBTABLE             *Subtable;
    501     DT_SUBTABLE             *ParentTable;
    502     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    503     DT_FIELD                *SubtableStart;
    504     ACPI_NFIT_HEADER        *NfitHeader;
    505     ACPI_DMTABLE_INFO       *InfoTable;
    506     UINT32                  Count;
    507     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
    508     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
    509 
    510 
    511     /* Main table */
    512 
    513     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
    514         &Subtable);
    515     if (ACPI_FAILURE (Status))
    516     {
    517         return (Status);
    518     }
    519 
    520     ParentTable = DtPeekSubtable ();
    521     DtInsertSubtable (ParentTable, Subtable);
    522     DtPushSubtable (Subtable);
    523 
    524     /* Subtables */
    525 
    526     while (*PFieldList)
    527     {
    528         SubtableStart = *PFieldList;
    529         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
    530             &Subtable);
    531         if (ACPI_FAILURE (Status))
    532         {
    533             return (Status);
    534         }
    535 
    536         ParentTable = DtPeekSubtable ();
    537         DtInsertSubtable (ParentTable, Subtable);
    538         DtPushSubtable (Subtable);
    539 
    540         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
    541 
    542         switch (NfitHeader->Type)
    543         {
    544         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
    545 
    546             InfoTable = AcpiDmTableInfoNfit0;
    547             break;
    548 
    549         case ACPI_NFIT_TYPE_MEMORY_MAP:
    550 
    551             InfoTable = AcpiDmTableInfoNfit1;
    552             break;
    553 
    554         case ACPI_NFIT_TYPE_INTERLEAVE:
    555 
    556             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
    557             InfoTable = AcpiDmTableInfoNfit2;
    558             break;
    559 
    560         case ACPI_NFIT_TYPE_SMBIOS:
    561 
    562             InfoTable = AcpiDmTableInfoNfit3;
    563             break;
    564 
    565         case ACPI_NFIT_TYPE_CONTROL_REGION:
    566 
    567             InfoTable = AcpiDmTableInfoNfit4;
    568             break;
    569 
    570         case ACPI_NFIT_TYPE_DATA_REGION:
    571 
    572             InfoTable = AcpiDmTableInfoNfit5;
    573             break;
    574 
    575         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
    576 
    577             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
    578             InfoTable = AcpiDmTableInfoNfit6;
    579             break;
    580 
    581         case ACPI_NFIT_TYPE_CAPABILITIES:
    582 
    583             InfoTable = AcpiDmTableInfoNfit7;
    584             break;
    585 
    586         default:
    587 
    588             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
    589             return (AE_ERROR);
    590         }
    591 
    592         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    593         if (ACPI_FAILURE (Status))
    594         {
    595             return (Status);
    596         }
    597 
    598         ParentTable = DtPeekSubtable ();
    599         DtInsertSubtable (ParentTable, Subtable);
    600         DtPopSubtable ();
    601 
    602         switch (NfitHeader->Type)
    603         {
    604         case ACPI_NFIT_TYPE_INTERLEAVE:
    605 
    606             Count = 0;
    607             DtPushSubtable (Subtable);
    608             while (*PFieldList)
    609             {
    610                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
    611                     &Subtable);
    612                 if (ACPI_FAILURE (Status))
    613                 {
    614                     return (Status);
    615                 }
    616 
    617                 if (!Subtable)
    618                 {
    619                     DtPopSubtable ();
    620                     break;
    621                 }
    622 
    623                 ParentTable = DtPeekSubtable ();
    624                 DtInsertSubtable (ParentTable, Subtable);
    625                 Count++;
    626             }
    627 
    628             Interleave->LineCount = Count;
    629             break;
    630 
    631         case ACPI_NFIT_TYPE_SMBIOS:
    632 
    633             if (*PFieldList)
    634             {
    635                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
    636                     &Subtable);
    637                 if (ACPI_FAILURE (Status))
    638                 {
    639                     return (Status);
    640                 }
    641 
    642                 if (Subtable)
    643                 {
    644                     DtInsertSubtable (ParentTable, Subtable);
    645                 }
    646             }
    647             break;
    648 
    649         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
    650 
    651             Count = 0;
    652             DtPushSubtable (Subtable);
    653             while (*PFieldList)
    654             {
    655                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
    656                     &Subtable);
    657                 if (ACPI_FAILURE (Status))
    658                 {
    659                     return (Status);
    660                 }
    661 
    662                 if (!Subtable)
    663                 {
    664                     DtPopSubtable ();
    665                     break;
    666                 }
    667 
    668                 ParentTable = DtPeekSubtable ();
    669                 DtInsertSubtable (ParentTable, Subtable);
    670                 Count++;
    671             }
    672 
    673             Hint->HintCount = (UINT16) Count;
    674             break;
    675 
    676         default:
    677             break;
    678         }
    679     }
    680 
    681     return (AE_OK);
    682 }
    683 
    684 
    685 /******************************************************************************
    686  *
    687  * FUNCTION:    DtCompileNhlt
    688  *
    689  * PARAMETERS:  List                - Current field list pointer
    690  *
    691  * RETURN:      Status
    692  *
    693  * DESCRIPTION: Compile NHLT.
    694  *
    695  *****************************************************************************/
    696 
    697 ACPI_STATUS
    698 DtCompileNhlt (
    699     void                    **List)
    700 {
    701     ACPI_STATUS             Status;
    702     UINT32                  EndpointCount;
    703     UINT32                  MicrophoneCount;
    704     UINT32                  FormatsCount;
    705     DT_SUBTABLE             *Subtable;
    706     DT_SUBTABLE             *ParentTable;
    707     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    708     UINT32                  CapabilitiesSize;
    709     UINT8                   ArrayType;
    710     UINT8                   ConfigType;
    711     UINT8                   DeviceInfoCount;
    712     UINT32                  i;
    713     UINT32                  j;
    714     ACPI_TABLE_NHLT_ENDPOINT_COUNT      *MainTable;
    715     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A  *DevSpecific;
    716     ACPI_NHLT_VENDOR_MIC_COUNT          *MicCount;
    717     ACPI_NHLT_FORMATS_CONFIG            *FormatsConfig;
    718     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D  *ConfigSpecific;
    719     ACPI_NHLT_DEVICE_INFO_COUNT         *DeviceInfo;
    720 
    721 
    722     /* Main table */
    723 
    724     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt,
    725         &Subtable);
    726     if (ACPI_FAILURE (Status))
    727     {
    728         return (Status);
    729     }
    730 
    731     /* Get the Endpoint Descriptor count */
    732 
    733     ParentTable = DtPeekSubtable ();
    734     DtInsertSubtable (ParentTable, Subtable);
    735     DtPushSubtable (Subtable);
    736 
    737     MainTable = ACPI_CAST_PTR (ACPI_TABLE_NHLT_ENDPOINT_COUNT, Subtable->Buffer);
    738     EndpointCount = MainTable->EndpointCount;
    739 
    740     /* Subtables */
    741 
    742     while (*PFieldList)
    743     {
    744         /* Variable number of Endpoint descriptors */
    745 
    746         for (i = 0; i < EndpointCount; i++)
    747         {
    748             /* Do the Endpoint Descriptor */
    749 
    750             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt0,
    751                 &Subtable);
    752             if (ACPI_FAILURE (Status))
    753             {
    754                 return (Status);
    755             }
    756 
    757             ParentTable = DtPeekSubtable ();
    758             DtInsertSubtable (ParentTable, Subtable);
    759             DtPushSubtable (Subtable);
    760 
    761             /* Do the Device Specific table */
    762 
    763             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b,
    764                 &Subtable);
    765             if (ACPI_FAILURE (Status))
    766             {
    767                 return (Status);
    768             }
    769 
    770             ParentTable = DtPeekSubtable ();
    771             DtInsertSubtable (ParentTable, Subtable);
    772             DtPushSubtable (Subtable);
    773 
    774             DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable->Buffer);
    775             CapabilitiesSize = DevSpecific->CapabilitiesSize;
    776 
    777             ArrayType = 0;
    778             ConfigType = 0;
    779 
    780             switch (CapabilitiesSize)
    781             {
    782             case 0:
    783                 break;
    784 
    785             case 1:
    786 
    787                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5c,
    788                     &Subtable);
    789                 if (ACPI_FAILURE (Status))
    790                 {
    791                     return (Status);
    792                 }
    793 
    794                 ParentTable = DtPeekSubtable ();
    795                 DtInsertSubtable (ParentTable, Subtable);
    796                 break;
    797 
    798             case 2:
    799 
    800                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5,
    801                     &Subtable);
    802                 if (ACPI_FAILURE (Status))
    803                 {
    804                     return (Status);
    805                 }
    806 
    807                 ParentTable = DtPeekSubtable ();
    808                 DtInsertSubtable (ParentTable, Subtable);
    809                 break;
    810 
    811             case 3:
    812 
    813                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a,
    814                     &Subtable);
    815                 if (ACPI_FAILURE (Status))
    816                 {
    817                     return (Status);
    818                 }
    819 
    820                 ParentTable = DtPeekSubtable ();
    821                 DtInsertSubtable (ParentTable, Subtable);
    822 
    823                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
    824                 ArrayType = ConfigSpecific->ArrayType;
    825                 ConfigType = ConfigSpecific->ConfigType;
    826                 break;
    827 
    828             case 7:
    829 
    830                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5,
    831                     &Subtable);
    832                 if (ACPI_FAILURE (Status))
    833                 {
    834                     return (Status);
    835                 }
    836 
    837                 ParentTable = DtPeekSubtable ();
    838                 DtInsertSubtable (ParentTable, Subtable);
    839 
    840                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6b,
    841                     &Subtable);
    842                 if (ACPI_FAILURE (Status))
    843                 {
    844                     return (Status);
    845                 }
    846 
    847                 ParentTable = DtPeekSubtable ();
    848                 DtInsertSubtable (ParentTable, Subtable);
    849 
    850                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
    851                 ArrayType = ConfigSpecific->ArrayType;
    852                 ConfigType = ConfigSpecific->ConfigType;
    853                 break;
    854 
    855             default:
    856 
    857                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a,
    858                     &Subtable);
    859                 if (ACPI_FAILURE (Status))
    860                 {
    861                     return (Status);
    862                 }
    863 
    864                 ParentTable = DtPeekSubtable ();
    865                 DtInsertSubtable (ParentTable, Subtable);
    866 
    867                 ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer);
    868                 ArrayType = ConfigSpecific->ArrayType;
    869                 ConfigType = ConfigSpecific->ConfigType;
    870                 break;
    871 
    872             } /* switch (CapabilitiesSize) */
    873 
    874             if (CapabilitiesSize >= 3)
    875             {
    876                 /* Check for a vendor-defined mic array */
    877 
    878                 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY)
    879                 {
    880                     if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED)
    881                     {
    882                         /* Get the microphone count */
    883 
    884                         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6a,
    885                             &Subtable);
    886                         if (ACPI_FAILURE (Status))
    887                         {
    888                             return (Status);
    889                         }
    890 
    891                         MicCount = ACPI_CAST_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Subtable->Buffer);
    892                         MicrophoneCount = MicCount->MicrophoneCount;
    893 
    894                         ParentTable = DtPeekSubtable ();
    895                         DtInsertSubtable (ParentTable, Subtable);
    896 
    897                         /* Variable number of microphones */
    898 
    899                         for (j = 0; j < MicrophoneCount; j++)
    900                         {
    901                             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6,
    902                                 &Subtable);
    903                             if (ACPI_FAILURE (Status))
    904                             {
    905                                 return (Status);
    906                             }
    907 
    908                             ParentTable = DtPeekSubtable ();
    909                             DtInsertSubtable (ParentTable, Subtable);
    910                         }
    911 
    912                         /* Do the MIC_SNR_SENSITIVITY_EXTENSION, if present */
    913 
    914                         if (ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK)
    915                         {
    916                             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt9,
    917                                 &Subtable);
    918                             if (ACPI_FAILURE (Status))
    919                             {
    920                                 return (Status);
    921                             }
    922 
    923                             ParentTable = DtPeekSubtable ();
    924                             DtInsertSubtable (ParentTable, Subtable);
    925                         }
    926                     }
    927                 }
    928             }
    929 
    930             /* Get the formats count */
    931 
    932             DtPopSubtable ();
    933             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt4,
    934                 &Subtable);
    935             if (ACPI_FAILURE (Status))
    936             {
    937                 return (Status);
    938             }
    939 
    940             ParentTable = DtPeekSubtable ();
    941             DtInsertSubtable (ParentTable, Subtable);
    942 
    943             FormatsConfig = ACPI_CAST_PTR (ACPI_NHLT_FORMATS_CONFIG, Subtable->Buffer);
    944             FormatsCount = FormatsConfig->FormatsCount;
    945 
    946             /* Variable number of wave_format_extensible structs */
    947 
    948             for (j = 0; j < FormatsCount; j++)
    949             {
    950                 /* Do the main wave_format_extensible structure */
    951 
    952                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3,
    953                     &Subtable);
    954                 if (ACPI_FAILURE (Status))
    955                 {
    956                     return (Status);
    957                 }
    958 
    959                 ParentTable = DtPeekSubtable ();
    960                 DtInsertSubtable (ParentTable, Subtable);
    961                 DtPushSubtable (Subtable);
    962 
    963                 /* Do the capabilities list */
    964 
    965                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a,
    966                     &Subtable);
    967                 if (ACPI_FAILURE (Status))
    968                 {
    969                     return (Status);
    970                 }
    971 
    972                 DtPopSubtable ();
    973                 ParentTable = DtPeekSubtable ();
    974                 DtInsertSubtable (ParentTable, Subtable);
    975 
    976             } /* for (j = 0; j < FormatsCount; j++) */
    977 
    978             /*
    979              * If we are not done with the current Endpoint yet, then there must be
    980              * some non documeneted structure(s) yet to be processed. First, get
    981              * the count of such structure(s).
    982              */
    983             if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length")))
    984             {
    985                 /* Get the count of non documented structures */
    986 
    987                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7,
    988                     &Subtable);
    989                 if (ACPI_FAILURE (Status))
    990                 {
    991                     return (Status);
    992                 }
    993 
    994                 ParentTable = DtPeekSubtable ();
    995                 DtInsertSubtable (ParentTable, Subtable);
    996 
    997                 DeviceInfo = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_INFO_COUNT, Subtable->Buffer);
    998                 DeviceInfoCount = DeviceInfo->StructureCount;
    999 
   1000                 for (j = 0; j < DeviceInfoCount; j++)
   1001                 {
   1002                     /*
   1003                      * Compile the following Device Info fields:
   1004                      *  1) Device ID
   1005                      *  2) Device Instance ID
   1006                      *  3) Device Port ID
   1007                      */
   1008                     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7a,
   1009                         &Subtable);
   1010                     if (ACPI_FAILURE (Status))
   1011                     {
   1012                         return (Status);
   1013                     }
   1014 
   1015                     ParentTable = DtPeekSubtable ();
   1016                     DtInsertSubtable (ParentTable, Subtable);
   1017                 } /* for (j = 0; j < LinuxSpecificCount; j++) */
   1018 
   1019 
   1020                 /* Undocumented data at the end of endpoint */
   1021                 if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length")))
   1022                 {
   1023                     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b,
   1024                         &Subtable);
   1025                     if (ACPI_FAILURE (Status))
   1026                     {
   1027                         return (Status);
   1028                     }
   1029 
   1030                     ParentTable = DtPeekSubtable ();
   1031                     DtInsertSubtable (ParentTable, Subtable);
   1032                 }
   1033             }
   1034 
   1035             DtPopSubtable ();
   1036 
   1037         } /* for (i = 0; i < EndpointCount; i++) */
   1038 
   1039         /*
   1040          * All Endpoint Descriptors are completed.
   1041          * Do the table terminator specific config (not in NHLT spec, optional)
   1042          */
   1043         if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length")))
   1044         {
   1045             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b,
   1046                 &Subtable);
   1047             if (ACPI_FAILURE (Status))
   1048             {
   1049                 return (Status);
   1050             }
   1051 
   1052             ParentTable = DtPeekSubtable ();
   1053             DtInsertSubtable (ParentTable, Subtable);
   1054 
   1055             Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a,
   1056                 &Subtable);
   1057             if (ACPI_FAILURE (Status))
   1058             {
   1059                 return (Status);
   1060             }
   1061 
   1062             ParentTable = DtPeekSubtable ();
   1063             DtInsertSubtable (ParentTable, Subtable);
   1064         }
   1065 
   1066         return (AE_OK);
   1067     }
   1068 
   1069     return (AE_OK);
   1070 }
   1071 
   1072 
   1073 /******************************************************************************
   1074  *
   1075  * FUNCTION:    DtCompilePcct
   1076  *
   1077  * PARAMETERS:  List                - Current field list pointer
   1078  *
   1079  * RETURN:      Status
   1080  *
   1081  * DESCRIPTION: Compile PCCT.
   1082  *
   1083  *****************************************************************************/
   1084 
   1085 ACPI_STATUS
   1086 DtCompilePcct (
   1087     void                    **List)
   1088 {
   1089     ACPI_STATUS             Status;
   1090     DT_SUBTABLE             *Subtable;
   1091     DT_SUBTABLE             *ParentTable;
   1092     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1093     DT_FIELD                *SubtableStart;
   1094     ACPI_SUBTABLE_HEADER    *PcctHeader;
   1095     ACPI_DMTABLE_INFO       *InfoTable;
   1096 
   1097 
   1098     /* Main table */
   1099 
   1100     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
   1101         &Subtable);
   1102     if (ACPI_FAILURE (Status))
   1103     {
   1104         return (Status);
   1105     }
   1106 
   1107     ParentTable = DtPeekSubtable ();
   1108     DtInsertSubtable (ParentTable, Subtable);
   1109 
   1110     /* Subtables */
   1111 
   1112     while (*PFieldList)
   1113     {
   1114         SubtableStart = *PFieldList;
   1115         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
   1116             &Subtable);
   1117         if (ACPI_FAILURE (Status))
   1118         {
   1119             return (Status);
   1120         }
   1121 
   1122         ParentTable = DtPeekSubtable ();
   1123         DtInsertSubtable (ParentTable, Subtable);
   1124         DtPushSubtable (Subtable);
   1125 
   1126         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1127 
   1128         switch (PcctHeader->Type)
   1129         {
   1130         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   1131 
   1132             InfoTable = AcpiDmTableInfoPcct0;
   1133             break;
   1134 
   1135         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   1136 
   1137             InfoTable = AcpiDmTableInfoPcct1;
   1138             break;
   1139 
   1140         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
   1141 
   1142             InfoTable = AcpiDmTableInfoPcct2;
   1143             break;
   1144 
   1145         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
   1146 
   1147             InfoTable = AcpiDmTableInfoPcct3;
   1148             break;
   1149 
   1150         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
   1151 
   1152             InfoTable = AcpiDmTableInfoPcct4;
   1153             break;
   1154 
   1155         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
   1156 
   1157             InfoTable = AcpiDmTableInfoPcct5;
   1158             break;
   1159 
   1160         default:
   1161 
   1162             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
   1163             return (AE_ERROR);
   1164         }
   1165 
   1166         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1167         if (ACPI_FAILURE (Status))
   1168         {
   1169             return (Status);
   1170         }
   1171 
   1172         ParentTable = DtPeekSubtable ();
   1173         DtInsertSubtable (ParentTable, Subtable);
   1174         DtPopSubtable ();
   1175     }
   1176 
   1177     return (AE_OK);
   1178 }
   1179 
   1180 
   1181 /******************************************************************************
   1182  *
   1183  * FUNCTION:    DtCompilePdtt
   1184  *
   1185  * PARAMETERS:  List                - Current field list pointer
   1186  *
   1187  * RETURN:      Status
   1188  *
   1189  * DESCRIPTION: Compile PDTT.
   1190  *
   1191  *****************************************************************************/
   1192 
   1193 ACPI_STATUS
   1194 DtCompilePdtt (
   1195     void                    **List)
   1196 {
   1197     ACPI_STATUS             Status;
   1198     DT_SUBTABLE             *Subtable;
   1199     DT_SUBTABLE             *ParentTable;
   1200     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1201     ACPI_TABLE_PDTT         *PdttHeader;
   1202     UINT32                  Count = 0;
   1203 
   1204 
   1205     /* Main table */
   1206 
   1207     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable);
   1208     if (ACPI_FAILURE (Status))
   1209     {
   1210         return (Status);
   1211     }
   1212 
   1213     ParentTable = DtPeekSubtable ();
   1214     DtInsertSubtable (ParentTable, Subtable);
   1215 
   1216     PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
   1217     PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
   1218 
   1219     /* There is only one type of subtable at this time, no need to decode */
   1220 
   1221     while (*PFieldList)
   1222     {
   1223         /* List of subchannel IDs, each 2 bytes */
   1224 
   1225         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
   1226             &Subtable);
   1227         if (ACPI_FAILURE (Status))
   1228         {
   1229             return (Status);
   1230         }
   1231 
   1232         DtInsertSubtable (ParentTable, Subtable);
   1233         Count++;
   1234     }
   1235 
   1236     PdttHeader->TriggerCount = (UINT8) Count;
   1237     return (AE_OK);
   1238 }
   1239 
   1240 
   1241 /******************************************************************************
   1242  *
   1243  * FUNCTION:    DtCompilePhat
   1244  *
   1245  * PARAMETERS:  List                - Current field list pointer
   1246  *
   1247  * RETURN:      Status
   1248  *
   1249  * DESCRIPTION: Compile Phat.
   1250  *
   1251  *****************************************************************************/
   1252 
   1253 ACPI_STATUS
   1254 DtCompilePhat (
   1255     void                    **List)
   1256 {
   1257     ACPI_STATUS             Status = AE_OK;
   1258     DT_SUBTABLE             *Subtable;
   1259     DT_SUBTABLE             *ParentTable;
   1260     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1261     ACPI_PHAT_HEADER        *PhatHeader;
   1262     ACPI_DMTABLE_INFO       *Info;
   1263     ACPI_PHAT_VERSION_DATA  *VersionData;
   1264     UINT32                  RecordCount;
   1265 
   1266 
   1267     /* The table consist of subtables */
   1268 
   1269     while (*PFieldList)
   1270     {
   1271         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
   1272         if (ACPI_FAILURE (Status))
   1273         {
   1274             return (Status);
   1275         }
   1276 
   1277         ParentTable = DtPeekSubtable ();
   1278         DtInsertSubtable (ParentTable, Subtable);
   1279         DtPushSubtable (Subtable);
   1280 
   1281         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
   1282 
   1283         switch (PhatHeader->Type)
   1284         {
   1285         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1286 
   1287             Info = AcpiDmTableInfoPhat0;
   1288             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
   1289             break;
   1290 
   1291         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1292 
   1293             Info = AcpiDmTableInfoPhat1;
   1294             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
   1295             break;
   1296 
   1297         default:
   1298 
   1299             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
   1300             return (AE_ERROR);
   1301 
   1302             break;
   1303         }
   1304 
   1305         Status = DtCompileTable (PFieldList, Info, &Subtable);
   1306         if (ACPI_FAILURE (Status))
   1307         {
   1308             return (Status);
   1309         }
   1310 
   1311         ParentTable = DtPeekSubtable ();
   1312         DtInsertSubtable (ParentTable, Subtable);
   1313 
   1314         switch (PhatHeader->Type)
   1315         {
   1316         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1317 
   1318             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
   1319                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
   1320             RecordCount = VersionData->ElementCount;
   1321 
   1322             while (RecordCount)
   1323             {
   1324                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
   1325                     &Subtable);
   1326                 if (ACPI_FAILURE (Status))
   1327                 {
   1328                     return (Status);
   1329                 }
   1330                 ParentTable = DtPeekSubtable ();
   1331                 DtInsertSubtable (ParentTable, Subtable);
   1332 
   1333                 RecordCount--;
   1334                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
   1335             }
   1336             break;
   1337 
   1338         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1339 
   1340             /* Compile device path */
   1341 
   1342             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
   1343             if (ACPI_FAILURE (Status))
   1344             {
   1345                 return (Status);
   1346             }
   1347             ParentTable = DtPeekSubtable ();
   1348             DtInsertSubtable (ParentTable, Subtable);
   1349 
   1350             PhatHeader->Length += (UINT16) Subtable->Length;
   1351 
   1352             /* Compile vendor specific data */
   1353 
   1354             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
   1355             if (ACPI_FAILURE (Status))
   1356             {
   1357                 return (Status);
   1358             }
   1359             ParentTable = DtPeekSubtable ();
   1360             DtInsertSubtable (ParentTable, Subtable);
   1361 
   1362             PhatHeader->Length += (UINT16) Subtable->Length;
   1363 
   1364             break;
   1365 
   1366         default:
   1367 
   1368             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
   1369             return (AE_ERROR);
   1370         }
   1371     }
   1372 
   1373     return (Status);
   1374 }
   1375 
   1376 
   1377 /******************************************************************************
   1378  *
   1379  * FUNCTION:    DtCompilePmtt
   1380  *
   1381  * PARAMETERS:  List                - Current field list pointer
   1382  *
   1383  * RETURN:      Status
   1384  *
   1385  * DESCRIPTION: Compile PMTT.
   1386  *
   1387  *****************************************************************************/
   1388 
   1389 ACPI_STATUS
   1390 DtCompilePmtt (
   1391     void                    **List)
   1392 {
   1393     ACPI_STATUS             Status;
   1394     DT_SUBTABLE             *Subtable;
   1395     DT_SUBTABLE             *ParentTable;
   1396     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1397     DT_FIELD                *SubtableStart;
   1398     UINT16                  Type;
   1399 
   1400 
   1401     /* Main table */
   1402 
   1403     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable);
   1404     if (ACPI_FAILURE (Status))
   1405     {
   1406         return (Status);
   1407     }
   1408 
   1409     ParentTable = DtPeekSubtable ();
   1410     DtInsertSubtable (ParentTable, Subtable);
   1411     DtPushSubtable (Subtable);
   1412 
   1413     /* Subtables */
   1414 
   1415     while (*PFieldList)
   1416     {
   1417         SubtableStart = *PFieldList;
   1418         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
   1419 
   1420         switch (Type)
   1421         {
   1422         case ACPI_PMTT_TYPE_SOCKET:
   1423 
   1424             /* Subtable: Socket Structure */
   1425 
   1426             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
   1427 
   1428             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
   1429                 &Subtable);
   1430             if (ACPI_FAILURE (Status))
   1431             {
   1432                 return (Status);
   1433             }
   1434 
   1435             break;
   1436 
   1437         case ACPI_PMTT_TYPE_CONTROLLER:
   1438 
   1439             /* Subtable: Memory Controller Structure */
   1440 
   1441             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
   1442 
   1443             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
   1444                 &Subtable);
   1445             if (ACPI_FAILURE (Status))
   1446             {
   1447                 return (Status);
   1448             }
   1449 
   1450             break;
   1451 
   1452         case ACPI_PMTT_TYPE_DIMM:
   1453 
   1454             /* Subtable: Physical Component (DIMM) Structure */
   1455 
   1456             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
   1457             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
   1458                 &Subtable);
   1459             if (ACPI_FAILURE (Status))
   1460             {
   1461                 return (Status);
   1462             }
   1463 
   1464             break;
   1465 
   1466         case ACPI_PMTT_TYPE_VENDOR:
   1467 
   1468             /* Subtable: Vendor-specific Structure */
   1469 
   1470             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
   1471             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
   1472                 &Subtable);
   1473             if (ACPI_FAILURE (Status))
   1474             {
   1475                 return (Status);
   1476             }
   1477 
   1478             break;
   1479 
   1480         default:
   1481 
   1482             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
   1483             return (AE_ERROR);
   1484         }
   1485 
   1486         DtInsertSubtable (ParentTable, Subtable);
   1487     }
   1488 
   1489     return (Status);
   1490 }
   1491 
   1492 
   1493 /******************************************************************************
   1494  *
   1495  * FUNCTION:    DtCompilePptt
   1496  *
   1497  * PARAMETERS:  List                - Current field list pointer
   1498  *
   1499  * RETURN:      Status
   1500  *
   1501  * DESCRIPTION: Compile PPTT.
   1502  *
   1503  *****************************************************************************/
   1504 
   1505 ACPI_STATUS
   1506 DtCompilePptt (
   1507     void                    **List)
   1508 {
   1509     ACPI_STATUS             Status;
   1510     ACPI_SUBTABLE_HEADER    *PpttHeader;
   1511     ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
   1512     DT_SUBTABLE             *Subtable;
   1513     DT_SUBTABLE             *ParentTable;
   1514     ACPI_DMTABLE_INFO       *InfoTable;
   1515     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1516     DT_FIELD                *SubtableStart;
   1517     ACPI_TABLE_HEADER       *PpttAcpiHeader;
   1518 
   1519 
   1520     ParentTable = DtPeekSubtable ();
   1521     while (*PFieldList)
   1522     {
   1523         SubtableStart = *PFieldList;
   1524 
   1525         /* Compile PPTT subtable header */
   1526 
   1527         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
   1528             &Subtable);
   1529         if (ACPI_FAILURE (Status))
   1530         {
   1531             return (Status);
   1532         }
   1533         DtInsertSubtable (ParentTable, Subtable);
   1534         PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1535         PpttHeader->Length = (UINT8)(Subtable->Length);
   1536 
   1537         switch (PpttHeader->Type)
   1538         {
   1539         case ACPI_PPTT_TYPE_PROCESSOR:
   1540 
   1541             InfoTable = AcpiDmTableInfoPptt0;
   1542             break;
   1543 
   1544         case ACPI_PPTT_TYPE_CACHE:
   1545 
   1546             InfoTable = AcpiDmTableInfoPptt1;
   1547             break;
   1548 
   1549         case ACPI_PPTT_TYPE_ID:
   1550 
   1551             InfoTable = AcpiDmTableInfoPptt2;
   1552             break;
   1553 
   1554         default:
   1555 
   1556             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
   1557             return (AE_ERROR);
   1558         }
   1559 
   1560         /* Compile PPTT subtable body */
   1561 
   1562         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1563         if (ACPI_FAILURE (Status))
   1564         {
   1565             return (Status);
   1566         }
   1567         DtInsertSubtable (ParentTable, Subtable);
   1568         PpttHeader->Length += (UINT8)(Subtable->Length);
   1569 
   1570         /* Compile PPTT subtable additionals */
   1571 
   1572         switch (PpttHeader->Type)
   1573         {
   1574         case ACPI_PPTT_TYPE_PROCESSOR:
   1575 
   1576             PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
   1577                 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
   1578             if (PpttProcessor)
   1579             {
   1580                 /* Compile initiator proximity domain list */
   1581 
   1582                 PpttProcessor->NumberOfPrivResources = 0;
   1583                 while (*PFieldList)
   1584                 {
   1585                     Status = DtCompileTable (PFieldList,
   1586                         AcpiDmTableInfoPptt0a, &Subtable);
   1587                     if (ACPI_FAILURE (Status))
   1588                     {
   1589                         return (Status);
   1590                     }
   1591                     if (!Subtable)
   1592                     {
   1593                         break;
   1594                     }
   1595 
   1596                     DtInsertSubtable (ParentTable, Subtable);
   1597                     PpttHeader->Length += (UINT8)(Subtable->Length);
   1598                     PpttProcessor->NumberOfPrivResources++;
   1599                 }
   1600             }
   1601             break;
   1602 
   1603         case ACPI_PPTT_TYPE_CACHE:
   1604 
   1605             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
   1606                 AslGbl_RootTable->Buffer);
   1607             if (PpttAcpiHeader->Revision < 3)
   1608             {
   1609                 break;
   1610             }
   1611             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
   1612                 &Subtable);
   1613             DtInsertSubtable (ParentTable, Subtable);
   1614             PpttHeader->Length += (UINT8)(Subtable->Length);
   1615             break;
   1616 
   1617         default:
   1618 
   1619             break;
   1620         }
   1621     }
   1622 
   1623     return (AE_OK);
   1624 }
   1625 
   1626 
   1627 /******************************************************************************
   1628  *
   1629  * FUNCTION:    DtCompilePrmt
   1630  *
   1631  * PARAMETERS:  List                - Current field list pointer
   1632  *
   1633  * RETURN:      Status
   1634  *
   1635  * DESCRIPTION: Compile PRMT.
   1636  *
   1637  *****************************************************************************/
   1638 
   1639 ACPI_STATUS
   1640 DtCompilePrmt (
   1641     void                    **List)
   1642 {
   1643     ACPI_STATUS             Status;
   1644     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
   1645     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
   1646     DT_SUBTABLE             *Subtable;
   1647     DT_SUBTABLE             *ParentTable;
   1648     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1649     UINT32                  i, j;
   1650 
   1651     ParentTable = DtPeekSubtable ();
   1652 
   1653     /* Compile PRMT subtable header */
   1654 
   1655     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr,
   1656         &Subtable);
   1657     if (ACPI_FAILURE (Status))
   1658     {
   1659         return (Status);
   1660     }
   1661     DtInsertSubtable (ParentTable, Subtable);
   1662     PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer);
   1663 
   1664     for (i = 0; i < PrmtHeader->ModuleInfoCount; i++)
   1665     {
   1666         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule,
   1667             &Subtable);
   1668         if (ACPI_FAILURE (Status))
   1669         {
   1670             return (Status);
   1671         }
   1672         DtInsertSubtable (ParentTable, Subtable);
   1673         PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer);
   1674 
   1675         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++)
   1676         {
   1677             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler,
   1678                 &Subtable);
   1679             if (ACPI_FAILURE (Status))
   1680             {
   1681                 return (Status);
   1682             }
   1683             DtInsertSubtable (ParentTable, Subtable);
   1684         }
   1685     }
   1686 
   1687     return (AE_OK);
   1688 }
   1689 
   1690 
   1691 /******************************************************************************
   1692  *
   1693  * FUNCTION:    DtCompileRgrt
   1694  *
   1695  * PARAMETERS:  List                - Current field list pointer
   1696  *
   1697  * RETURN:      Status
   1698  *
   1699  * DESCRIPTION: Compile RGRT.
   1700  *
   1701  *****************************************************************************/
   1702 
   1703 ACPI_STATUS
   1704 DtCompileRgrt (
   1705     void                    **List)
   1706 {
   1707     ACPI_STATUS             Status;
   1708     DT_SUBTABLE             *Subtable;
   1709     DT_SUBTABLE             *ParentTable;
   1710     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1711 
   1712 
   1713     /* Compile the main table */
   1714 
   1715     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt,
   1716         &Subtable);
   1717     if (ACPI_FAILURE (Status))
   1718     {
   1719         return (Status);
   1720     }
   1721 
   1722     ParentTable = DtPeekSubtable ();
   1723     DtInsertSubtable (ParentTable, Subtable);
   1724 
   1725     /* Compile the "Subtable" -- actually just the binary (PNG) image */
   1726 
   1727     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0,
   1728         &Subtable);
   1729     if (ACPI_FAILURE (Status))
   1730     {
   1731         return (Status);
   1732     }
   1733 
   1734     DtInsertSubtable (ParentTable, Subtable);
   1735     return (AE_OK);
   1736 }
   1737 
   1738 
   1739 /******************************************************************************
   1740  *
   1741  * FUNCTION:    DtCompileRsdt
   1742  *
   1743  * PARAMETERS:  List                - Current field list pointer
   1744  *
   1745  * RETURN:      Status
   1746  *
   1747  * DESCRIPTION: Compile RSDT.
   1748  *
   1749  *****************************************************************************/
   1750 
   1751 ACPI_STATUS
   1752 DtCompileRsdt (
   1753     void                    **List)
   1754 {
   1755     DT_SUBTABLE             *Subtable;
   1756     DT_SUBTABLE             *ParentTable;
   1757     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   1758     UINT32                  Address;
   1759 
   1760 
   1761     ParentTable = DtPeekSubtable ();
   1762 
   1763     while (FieldList)
   1764     {
   1765         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
   1766 
   1767         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
   1768         DtInsertSubtable (ParentTable, Subtable);
   1769         FieldList = FieldList->Next;
   1770     }
   1771 
   1772     return (AE_OK);
   1773 }
   1774 
   1775 
   1776 /******************************************************************************
   1777  *
   1778  * FUNCTION:    DtCompileS3pt
   1779  *
   1780  * PARAMETERS:  PFieldList          - Current field list pointer
   1781  *
   1782  * RETURN:      Status
   1783  *
   1784  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
   1785  *
   1786  *****************************************************************************/
   1787 
   1788 ACPI_STATUS
   1789 DtCompileS3pt (
   1790     DT_FIELD                **PFieldList)
   1791 {
   1792     ACPI_STATUS             Status;
   1793     ACPI_FPDT_HEADER        *S3ptHeader;
   1794     DT_SUBTABLE             *Subtable;
   1795     DT_SUBTABLE             *ParentTable;
   1796     ACPI_DMTABLE_INFO       *InfoTable;
   1797     DT_FIELD                *SubtableStart;
   1798 
   1799 
   1800     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
   1801         &AslGbl_RootTable);
   1802     if (ACPI_FAILURE (Status))
   1803     {
   1804         return (Status);
   1805     }
   1806 
   1807     DtPushSubtable (AslGbl_RootTable);
   1808 
   1809     while (*PFieldList)
   1810     {
   1811         SubtableStart = *PFieldList;
   1812         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
   1813             &Subtable);
   1814         if (ACPI_FAILURE (Status))
   1815         {
   1816             return (Status);
   1817         }
   1818 
   1819         ParentTable = DtPeekSubtable ();
   1820         DtInsertSubtable (ParentTable, Subtable);
   1821         DtPushSubtable (Subtable);
   1822 
   1823         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
   1824 
   1825         switch (S3ptHeader->Type)
   1826         {
   1827         case ACPI_S3PT_TYPE_RESUME:
   1828 
   1829             InfoTable = AcpiDmTableInfoS3pt0;
   1830             break;
   1831 
   1832         case ACPI_S3PT_TYPE_SUSPEND:
   1833 
   1834             InfoTable = AcpiDmTableInfoS3pt1;
   1835             break;
   1836 
   1837         default:
   1838 
   1839             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
   1840             return (AE_ERROR);
   1841         }
   1842 
   1843         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1844         if (ACPI_FAILURE (Status))
   1845         {
   1846             return (Status);
   1847         }
   1848 
   1849         ParentTable = DtPeekSubtable ();
   1850         DtInsertSubtable (ParentTable, Subtable);
   1851         DtPopSubtable ();
   1852     }
   1853 
   1854     return (AE_OK);
   1855 }
   1856 
   1857 
   1858 /******************************************************************************
   1859  *
   1860  * FUNCTION:    DtCompileSdev
   1861  *
   1862  * PARAMETERS:  List                - Current field list pointer
   1863  *
   1864  * RETURN:      Status
   1865  *
   1866  * DESCRIPTION: Compile SDEV.
   1867  *
   1868  *****************************************************************************/
   1869 
   1870 ACPI_STATUS
   1871 DtCompileSdev (
   1872     void                    **List)
   1873 {
   1874     ACPI_STATUS                 Status;
   1875     ACPI_SDEV_HEADER            *SdevHeader;
   1876     ACPI_SDEV_HEADER            *SecureComponentHeader;
   1877     DT_SUBTABLE                 *Subtable;
   1878     DT_SUBTABLE                 *ParentTable;
   1879     ACPI_DMTABLE_INFO           *InfoTable;
   1880     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
   1881     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
   1882     DT_FIELD                    *SubtableStart;
   1883     ACPI_SDEV_PCIE              *Pcie = NULL;
   1884     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
   1885     UINT32                      EntryCount;
   1886     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
   1887     UINT16                      ComponentLength = 0;
   1888 
   1889 
   1890     /* Subtables */
   1891 
   1892     while (*PFieldList)
   1893     {
   1894         /* Compile common SDEV subtable header */
   1895 
   1896         SubtableStart = *PFieldList;
   1897         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
   1898             &Subtable);
   1899         if (ACPI_FAILURE (Status))
   1900         {
   1901             return (Status);
   1902         }
   1903 
   1904         ParentTable = DtPeekSubtable ();
   1905         DtInsertSubtable (ParentTable, Subtable);
   1906         DtPushSubtable (Subtable);
   1907 
   1908         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   1909         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
   1910 
   1911         switch (SdevHeader->Type)
   1912         {
   1913         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   1914 
   1915             InfoTable = AcpiDmTableInfoSdev0;
   1916             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
   1917             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
   1918                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
   1919             break;
   1920 
   1921         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   1922 
   1923             InfoTable = AcpiDmTableInfoSdev1;
   1924             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
   1925             break;
   1926 
   1927         default:
   1928 
   1929             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   1930             return (AE_ERROR);
   1931         }
   1932 
   1933         /* Compile SDEV subtable body */
   1934 
   1935         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1936         if (ACPI_FAILURE (Status))
   1937         {
   1938             return (Status);
   1939         }
   1940 
   1941         ParentTable = DtPeekSubtable ();
   1942         DtInsertSubtable (ParentTable, Subtable);
   1943 
   1944         /* Optional data fields are appended to the main subtable body */
   1945 
   1946         switch (SdevHeader->Type)
   1947         {
   1948         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   1949 
   1950             /*
   1951              * Device Id Offset will be be calculated differently depending on
   1952              * the presence of secure access components.
   1953              */
   1954             Namesp->DeviceIdOffset = 0;
   1955             ComponentLength = 0;
   1956 
   1957             /* If the secure access component exists, get the structures */
   1958 
   1959             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
   1960             {
   1961                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
   1962                     &Subtable);
   1963                 if (ACPI_FAILURE (Status))
   1964                 {
   1965                     return (Status);
   1966                 }
   1967                 ParentTable = DtPeekSubtable ();
   1968                 DtInsertSubtable (ParentTable, Subtable);
   1969 
   1970                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   1971 
   1972                 /* Compile a secure access component header */
   1973 
   1974                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
   1975                     &Subtable);
   1976                 if (ACPI_FAILURE (Status))
   1977                 {
   1978                     return (Status);
   1979                 }
   1980                 ParentTable = DtPeekSubtable ();
   1981                 DtInsertSubtable (ParentTable, Subtable);
   1982 
   1983                 /* Compile the secure access component */
   1984 
   1985                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   1986                 switch (SecureComponentHeader->Type)
   1987                 {
   1988                 case ACPI_SDEV_TYPE_ID_COMPONENT:
   1989 
   1990                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
   1991                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
   1992                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
   1993                     break;
   1994 
   1995                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
   1996 
   1997                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
   1998                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
   1999                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
   2000                     break;
   2001 
   2002                 default:
   2003 
   2004                     /* Any other secure component types are undefined */
   2005 
   2006                     return (AE_ERROR);
   2007                 }
   2008 
   2009                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
   2010                     &Subtable);
   2011                 if (ACPI_FAILURE (Status))
   2012                 {
   2013                     return (Status);
   2014                 }
   2015                 ParentTable = DtPeekSubtable ();
   2016                 DtInsertSubtable (ParentTable, Subtable);
   2017 
   2018                 SecureComponent->SecureComponentOffset =
   2019                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2020                 SecureComponent->SecureComponentLength = ComponentLength;
   2021 
   2022 
   2023                 /*
   2024                  * Add the secure component to the subtable to be added for the
   2025                  * the namespace subtable's length
   2026                  */
   2027                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2028             }
   2029 
   2030             /* Append DeviceId namespace string */
   2031 
   2032             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
   2033                 &Subtable);
   2034             if (ACPI_FAILURE (Status))
   2035             {
   2036                 return (Status);
   2037             }
   2038 
   2039             if (!Subtable)
   2040             {
   2041                 break;
   2042             }
   2043 
   2044             ParentTable = DtPeekSubtable ();
   2045             DtInsertSubtable (ParentTable, Subtable);
   2046 
   2047             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
   2048 
   2049             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
   2050 
   2051             /* Append Vendor data */
   2052 
   2053             Namesp->VendorDataLength = 0;
   2054             Namesp->VendorDataOffset = 0;
   2055 
   2056             if (*PFieldList)
   2057             {
   2058                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   2059                     &Subtable);
   2060                 if (ACPI_FAILURE (Status))
   2061                 {
   2062                     return (Status);
   2063                 }
   2064 
   2065                 if (Subtable)
   2066                 {
   2067                     ParentTable = DtPeekSubtable ();
   2068                     DtInsertSubtable (ParentTable, Subtable);
   2069 
   2070                     Namesp->VendorDataOffset =
   2071                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
   2072                     Namesp->VendorDataLength =
   2073                         (UINT16) Subtable->Length;
   2074 
   2075                     /* Final size of entire namespace structure */
   2076 
   2077                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
   2078                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
   2079                 }
   2080             }
   2081 
   2082             break;
   2083 
   2084         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2085 
   2086             /* Append the PCIe path info first */
   2087 
   2088             EntryCount = 0;
   2089             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
   2090             {
   2091                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
   2092                     &Subtable);
   2093                 if (ACPI_FAILURE (Status))
   2094                 {
   2095                     return (Status);
   2096                 }
   2097 
   2098                 if (!Subtable)
   2099                 {
   2100                     DtPopSubtable ();
   2101                     break;
   2102                 }
   2103 
   2104                 ParentTable = DtPeekSubtable ();
   2105                 DtInsertSubtable (ParentTable, Subtable);
   2106                 EntryCount++;
   2107             }
   2108 
   2109             /* Path offset will point immediately after the main subtable */
   2110 
   2111             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
   2112             Pcie->PathLength = (UINT16)
   2113                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
   2114 
   2115             /* Append the Vendor Data last */
   2116 
   2117             Pcie->VendorDataLength = 0;
   2118             Pcie->VendorDataOffset = 0;
   2119 
   2120             if (*PFieldList)
   2121             {
   2122                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   2123                     &Subtable);
   2124                 if (ACPI_FAILURE (Status))
   2125                 {
   2126                     return (Status);
   2127                 }
   2128 
   2129                 if (Subtable)
   2130                 {
   2131                     ParentTable = DtPeekSubtable ();
   2132                     DtInsertSubtable (ParentTable, Subtable);
   2133 
   2134                     Pcie->VendorDataOffset =
   2135                         Pcie->PathOffset + Pcie->PathLength;
   2136                     Pcie->VendorDataLength = (UINT16)
   2137                         Subtable->Length;
   2138                 }
   2139             }
   2140 
   2141             SdevHeader->Length =
   2142                 sizeof (ACPI_SDEV_PCIE) +
   2143                 Pcie->PathLength + Pcie->VendorDataLength;
   2144             break;
   2145 
   2146         default:
   2147 
   2148             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   2149             return (AE_ERROR);
   2150         }
   2151 
   2152         DtPopSubtable ();
   2153     }
   2154 
   2155     return (AE_OK);
   2156 }
   2157 
   2158 
   2159 /******************************************************************************
   2160  *
   2161  * FUNCTION:    DtCompileSlic
   2162  *
   2163  * PARAMETERS:  List                - Current field list pointer
   2164  *
   2165  * RETURN:      Status
   2166  *
   2167  * DESCRIPTION: Compile SLIC.
   2168  *
   2169  *****************************************************************************/
   2170 
   2171 ACPI_STATUS
   2172 DtCompileSlic (
   2173     void                    **List)
   2174 {
   2175     ACPI_STATUS             Status;
   2176     DT_SUBTABLE             *Subtable;
   2177     DT_SUBTABLE             *ParentTable;
   2178     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2179 
   2180 
   2181     while (*PFieldList)
   2182     {
   2183         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
   2184             &Subtable);
   2185         if (ACPI_FAILURE (Status))
   2186         {
   2187             return (Status);
   2188         }
   2189 
   2190         ParentTable = DtPeekSubtable ();
   2191         DtInsertSubtable (ParentTable, Subtable);
   2192         DtPushSubtable (Subtable);
   2193         DtPopSubtable ();
   2194     }
   2195 
   2196     return (AE_OK);
   2197 }
   2198 
   2199 
   2200 /******************************************************************************
   2201  *
   2202  * FUNCTION:    DtCompileSlit
   2203  *
   2204  * PARAMETERS:  List                - Current field list pointer
   2205  *
   2206  * RETURN:      Status
   2207  *
   2208  * DESCRIPTION: Compile SLIT.
   2209  *
   2210  *****************************************************************************/
   2211 
   2212 ACPI_STATUS
   2213 DtCompileSlit (
   2214     void                    **List)
   2215 {
   2216     ACPI_STATUS             Status;
   2217     DT_SUBTABLE             *Subtable;
   2218     DT_SUBTABLE             *ParentTable;
   2219     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2220     DT_FIELD                *FieldList;
   2221     DT_FIELD                *EndOfFieldList = NULL;
   2222     UINT32                  Localities;
   2223     UINT32                  LocalityListLength;
   2224     UINT8                   *LocalityBuffer;
   2225 
   2226 
   2227     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
   2228         &Subtable);
   2229     if (ACPI_FAILURE (Status))
   2230     {
   2231         return (Status);
   2232     }
   2233 
   2234     ParentTable = DtPeekSubtable ();
   2235     DtInsertSubtable (ParentTable, Subtable);
   2236 
   2237     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
   2238     LocalityBuffer = UtLocalCalloc (Localities);
   2239     LocalityListLength = 0;
   2240 
   2241     /* Compile each locality buffer */
   2242 
   2243     FieldList = *PFieldList;
   2244     while (FieldList)
   2245     {
   2246         DtCompileBuffer (LocalityBuffer,
   2247             FieldList->Value, FieldList, Localities);
   2248 
   2249         LocalityListLength++;
   2250         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
   2251         DtInsertSubtable (ParentTable, Subtable);
   2252         EndOfFieldList = FieldList;
   2253         FieldList = FieldList->Next;
   2254     }
   2255 
   2256     if (LocalityListLength != Localities)
   2257     {
   2258         sprintf(AslGbl_MsgBuffer,
   2259             "Found %u entries, must match LocalityCount: %u",
   2260             LocalityListLength, Localities);
   2261         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
   2262         ACPI_FREE (LocalityBuffer);
   2263         return (AE_LIMIT);
   2264     }
   2265 
   2266     ACPI_FREE (LocalityBuffer);
   2267     return (AE_OK);
   2268 }
   2269 
   2270 
   2271 /******************************************************************************
   2272  *
   2273  * FUNCTION:    DtCompileSrat
   2274  *
   2275  * PARAMETERS:  List                - Current field list pointer
   2276  *
   2277  * RETURN:      Status
   2278  *
   2279  * DESCRIPTION: Compile SRAT.
   2280  *
   2281  *****************************************************************************/
   2282 
   2283 ACPI_STATUS
   2284 DtCompileSrat (
   2285     void                    **List)
   2286 {
   2287     ACPI_STATUS             Status;
   2288     DT_SUBTABLE             *Subtable;
   2289     DT_SUBTABLE             *ParentTable;
   2290     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2291     DT_FIELD                *SubtableStart;
   2292     ACPI_SUBTABLE_HEADER    *SratHeader;
   2293     ACPI_DMTABLE_INFO       *InfoTable;
   2294 
   2295 
   2296     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
   2297         &Subtable);
   2298     if (ACPI_FAILURE (Status))
   2299     {
   2300         return (Status);
   2301     }
   2302 
   2303     ParentTable = DtPeekSubtable ();
   2304     DtInsertSubtable (ParentTable, Subtable);
   2305 
   2306     while (*PFieldList)
   2307     {
   2308         SubtableStart = *PFieldList;
   2309         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
   2310             &Subtable);
   2311         if (ACPI_FAILURE (Status))
   2312         {
   2313             return (Status);
   2314         }
   2315 
   2316         ParentTable = DtPeekSubtable ();
   2317         DtInsertSubtable (ParentTable, Subtable);
   2318         DtPushSubtable (Subtable);
   2319 
   2320         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   2321 
   2322         switch (SratHeader->Type)
   2323         {
   2324         case ACPI_SRAT_TYPE_CPU_AFFINITY:
   2325 
   2326             InfoTable = AcpiDmTableInfoSrat0;
   2327             break;
   2328 
   2329         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   2330 
   2331             InfoTable = AcpiDmTableInfoSrat1;
   2332             break;
   2333 
   2334         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   2335 
   2336             InfoTable = AcpiDmTableInfoSrat2;
   2337             break;
   2338 
   2339         case ACPI_SRAT_TYPE_GICC_AFFINITY:
   2340 
   2341             InfoTable = AcpiDmTableInfoSrat3;
   2342             break;
   2343 
   2344         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
   2345 
   2346             InfoTable = AcpiDmTableInfoSrat4;
   2347             break;
   2348 
   2349         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
   2350 
   2351             InfoTable = AcpiDmTableInfoSrat5;
   2352             break;
   2353 
   2354         case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY:
   2355 
   2356             InfoTable = AcpiDmTableInfoSrat6;
   2357             break;
   2358 
   2359         default:
   2360 
   2361             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
   2362             return (AE_ERROR);
   2363         }
   2364 
   2365         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2366         if (ACPI_FAILURE (Status))
   2367         {
   2368             return (Status);
   2369         }
   2370 
   2371         ParentTable = DtPeekSubtable ();
   2372         DtInsertSubtable (ParentTable, Subtable);
   2373         DtPopSubtable ();
   2374     }
   2375 
   2376     return (AE_OK);
   2377 }
   2378 
   2379 
   2380 /******************************************************************************
   2381  *
   2382  * FUNCTION:    DtCompileStao
   2383  *
   2384  * PARAMETERS:  PFieldList          - Current field list pointer
   2385  *
   2386  * RETURN:      Status
   2387  *
   2388  * DESCRIPTION: Compile STAO.
   2389  *
   2390  *****************************************************************************/
   2391 
   2392 ACPI_STATUS
   2393 DtCompileStao (
   2394     void                    **List)
   2395 {
   2396     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2397     DT_SUBTABLE             *Subtable;
   2398     DT_SUBTABLE             *ParentTable;
   2399     ACPI_STATUS             Status;
   2400 
   2401 
   2402     /* Compile the main table */
   2403 
   2404     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
   2405         &Subtable);
   2406     if (ACPI_FAILURE (Status))
   2407     {
   2408         return (Status);
   2409     }
   2410 
   2411     ParentTable = DtPeekSubtable ();
   2412     DtInsertSubtable (ParentTable, Subtable);
   2413 
   2414     /* Compile each ASCII namestring as a subtable */
   2415 
   2416     while (*PFieldList)
   2417     {
   2418         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
   2419             &Subtable);
   2420         if (ACPI_FAILURE (Status))
   2421         {
   2422             return (Status);
   2423         }
   2424 
   2425         ParentTable = DtPeekSubtable ();
   2426         DtInsertSubtable (ParentTable, Subtable);
   2427     }
   2428 
   2429     return (AE_OK);
   2430 }
   2431 
   2432 
   2433 /******************************************************************************
   2434  *
   2435  * FUNCTION:    DtCompileSvkl
   2436  *
   2437  * PARAMETERS:  PFieldList          - Current field list pointer
   2438  *
   2439  * RETURN:      Status
   2440  *
   2441  * DESCRIPTION: Compile SVKL.
   2442  *
   2443  * NOTES: SVKL is essentially a flat table, with a small main table and
   2444  *          a variable number of a single type of subtable.
   2445  *
   2446  *****************************************************************************/
   2447 
   2448 ACPI_STATUS
   2449 DtCompileSvkl (
   2450     void                    **List)
   2451 {
   2452     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2453     DT_SUBTABLE             *Subtable;
   2454     DT_SUBTABLE             *ParentTable;
   2455     ACPI_STATUS             Status;
   2456 
   2457 
   2458     /* Compile the main table */
   2459 
   2460     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
   2461         &Subtable);
   2462     if (ACPI_FAILURE (Status))
   2463     {
   2464         return (Status);
   2465     }
   2466 
   2467     ParentTable = DtPeekSubtable ();
   2468     DtInsertSubtable (ParentTable, Subtable);
   2469 
   2470     /* Compile each subtable */
   2471 
   2472     while (*PFieldList)
   2473     {
   2474         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
   2475             &Subtable);
   2476         if (ACPI_FAILURE (Status))
   2477         {
   2478             return (Status);
   2479         }
   2480 
   2481         ParentTable = DtPeekSubtable ();
   2482         DtInsertSubtable (ParentTable, Subtable);
   2483     }
   2484 
   2485     return (AE_OK);
   2486 }
   2487 
   2488 
   2489 /******************************************************************************
   2490  *
   2491  * FUNCTION:    DtCompileTcpa
   2492  *
   2493  * PARAMETERS:  PFieldList          - Current field list pointer
   2494  *
   2495  * RETURN:      Status
   2496  *
   2497  * DESCRIPTION: Compile TCPA.
   2498  *
   2499  *****************************************************************************/
   2500 
   2501 ACPI_STATUS
   2502 DtCompileTcpa (
   2503     void                    **List)
   2504 {
   2505     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2506     DT_SUBTABLE             *Subtable;
   2507     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
   2508     DT_SUBTABLE             *ParentTable;
   2509     ACPI_STATUS             Status;
   2510 
   2511 
   2512     /* Compile the main table */
   2513 
   2514     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
   2515         &Subtable);
   2516     if (ACPI_FAILURE (Status))
   2517     {
   2518         return (Status);
   2519     }
   2520 
   2521     ParentTable = DtPeekSubtable ();
   2522     DtInsertSubtable (ParentTable, Subtable);
   2523 
   2524     /*
   2525      * Examine the PlatformClass field to determine the table type.
   2526      * Either a client or server table. Only one.
   2527      */
   2528     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
   2529 
   2530     switch (TcpaHeader->PlatformClass)
   2531     {
   2532     case ACPI_TCPA_CLIENT_TABLE:
   2533 
   2534         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
   2535             &Subtable);
   2536         break;
   2537 
   2538     case ACPI_TCPA_SERVER_TABLE:
   2539 
   2540         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
   2541             &Subtable);
   2542         break;
   2543 
   2544     default:
   2545 
   2546         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
   2547             TcpaHeader->PlatformClass);
   2548         Status = AE_ERROR;
   2549         break;
   2550     }
   2551 
   2552     ParentTable = DtPeekSubtable ();
   2553     DtInsertSubtable (ParentTable, Subtable);
   2554     return (Status);
   2555 }
   2556 
   2557 
   2558 /******************************************************************************
   2559  *
   2560  * FUNCTION:    DtCompileTpm2Rev3
   2561  *
   2562  * PARAMETERS:  PFieldList          - Current field list pointer
   2563  *
   2564  * RETURN:      Status
   2565  *
   2566  * DESCRIPTION: Compile TPM2 revision 3
   2567  *
   2568  *****************************************************************************/
   2569 static ACPI_STATUS
   2570 DtCompileTpm2Rev3 (
   2571     void                    **List)
   2572 {
   2573     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2574     DT_SUBTABLE             *Subtable;
   2575     ACPI_TABLE_TPM23        *Tpm23Header;
   2576     DT_SUBTABLE             *ParentTable;
   2577     ACPI_STATUS             Status = AE_OK;
   2578 
   2579 
   2580     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
   2581         &Subtable);
   2582 
   2583     ParentTable = DtPeekSubtable ();
   2584     DtInsertSubtable (ParentTable, Subtable);
   2585     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
   2586 
   2587     /* Subtable type depends on the StartMethod */
   2588 
   2589     switch (Tpm23Header->StartMethod)
   2590     {
   2591     case ACPI_TPM23_ACPI_START_METHOD:
   2592 
   2593         /* Subtable specific to to ARM_SMC */
   2594 
   2595         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
   2596             &Subtable);
   2597         if (ACPI_FAILURE (Status))
   2598         {
   2599             return (Status);
   2600         }
   2601 
   2602         ParentTable = DtPeekSubtable ();
   2603         DtInsertSubtable (ParentTable, Subtable);
   2604         break;
   2605 
   2606     default:
   2607         break;
   2608     }
   2609 
   2610     return (Status);
   2611 }
   2612 
   2613 
   2614 /******************************************************************************
   2615  *
   2616  * FUNCTION:    DtCompileTpm2
   2617  *
   2618  * PARAMETERS:  PFieldList          - Current field list pointer
   2619  *
   2620  * RETURN:      Status
   2621  *
   2622  * DESCRIPTION: Compile TPM2.
   2623  *
   2624  *****************************************************************************/
   2625 
   2626 ACPI_STATUS
   2627 DtCompileTpm2 (
   2628     void                    **List)
   2629 {
   2630     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2631     DT_SUBTABLE             *Subtable;
   2632     ACPI_TABLE_TPM2         *Tpm2Header;
   2633     DT_SUBTABLE             *ParentTable;
   2634     ACPI_STATUS             Status = AE_OK;
   2635     ACPI_TABLE_HEADER       *Header;
   2636 
   2637 
   2638     ParentTable = DtPeekSubtable ();
   2639 
   2640     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
   2641 
   2642     if (Header->Revision == 3)
   2643     {
   2644         return (DtCompileTpm2Rev3 (List));
   2645     }
   2646 
   2647     /* Compile the main table */
   2648 
   2649     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
   2650         &Subtable);
   2651     if (ACPI_FAILURE (Status))
   2652     {
   2653         return (Status);
   2654     }
   2655 
   2656     ParentTable = DtPeekSubtable ();
   2657     DtInsertSubtable (ParentTable, Subtable);
   2658 
   2659     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
   2660 
   2661     /* Method parameters */
   2662     /* Optional: Log area minimum length */
   2663     /* Optional: Log area start address */
   2664     /* TBD: Optional fields above not fully implemented (not optional at this time) */
   2665 
   2666     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
   2667         &Subtable);
   2668     if (ACPI_FAILURE (Status))
   2669     {
   2670         return (Status);
   2671     }
   2672 
   2673     ParentTable = DtPeekSubtable ();
   2674     DtInsertSubtable (ParentTable, Subtable);
   2675 
   2676 
   2677     /* Subtable type depends on the StartMethod */
   2678 
   2679     switch (Tpm2Header->StartMethod)
   2680     {
   2681     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
   2682 
   2683         /* Subtable specific to to ARM_SMC */
   2684 
   2685         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
   2686             &Subtable);
   2687         if (ACPI_FAILURE (Status))
   2688         {
   2689             return (Status);
   2690         }
   2691 
   2692         ParentTable = DtPeekSubtable ();
   2693         DtInsertSubtable (ParentTable, Subtable);
   2694         break;
   2695 
   2696     case ACPI_TPM2_START_METHOD:
   2697     case ACPI_TPM2_MEMORY_MAPPED:
   2698     case ACPI_TPM2_COMMAND_BUFFER:
   2699     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
   2700         break;
   2701 
   2702     case ACPI_TPM2_RESERVED1:
   2703     case ACPI_TPM2_RESERVED3:
   2704     case ACPI_TPM2_RESERVED4:
   2705     case ACPI_TPM2_RESERVED5:
   2706     case ACPI_TPM2_RESERVED9:
   2707     case ACPI_TPM2_RESERVED10:
   2708 
   2709         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
   2710             Tpm2Header->StartMethod);
   2711         Status = AE_ERROR;
   2712         break;
   2713 
   2714     case ACPI_TPM2_NOT_ALLOWED:
   2715     default:
   2716 
   2717         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
   2718             Tpm2Header->StartMethod);
   2719         Status = AE_ERROR;
   2720         break;
   2721     }
   2722 
   2723     return (Status);
   2724 }
   2725 
   2726 
   2727 /******************************************************************************
   2728  *
   2729  * FUNCTION:    DtGetGenericTableInfo
   2730  *
   2731  * PARAMETERS:  Name                - Generic type name
   2732  *
   2733  * RETURN:      Info entry
   2734  *
   2735  * DESCRIPTION: Obtain table info for a generic name entry
   2736  *
   2737  *****************************************************************************/
   2738 
   2739 ACPI_DMTABLE_INFO *
   2740 DtGetGenericTableInfo (
   2741     char                    *Name)
   2742 {
   2743     ACPI_DMTABLE_INFO       *Info;
   2744     UINT32                  i;
   2745 
   2746 
   2747     if (!Name)
   2748     {
   2749         return (NULL);
   2750     }
   2751 
   2752     /* Search info table for name match */
   2753 
   2754     for (i = 0; ; i++)
   2755     {
   2756         Info = AcpiDmTableInfoGeneric[i];
   2757         if (Info->Opcode == ACPI_DMT_EXIT)
   2758         {
   2759             Info = NULL;
   2760             break;
   2761         }
   2762 
   2763         /* Use caseless compare for generic keywords */
   2764 
   2765         if (!AcpiUtStricmp (Name, Info->Name))
   2766         {
   2767             break;
   2768         }
   2769     }
   2770 
   2771     return (Info);
   2772 }
   2773 
   2774 
   2775 /******************************************************************************
   2776  *
   2777  * FUNCTION:    DtCompileUefi
   2778  *
   2779  * PARAMETERS:  List                - Current field list pointer
   2780  *
   2781  * RETURN:      Status
   2782  *
   2783  * DESCRIPTION: Compile UEFI.
   2784  *
   2785  *****************************************************************************/
   2786 
   2787 ACPI_STATUS
   2788 DtCompileUefi (
   2789     void                    **List)
   2790 {
   2791     ACPI_STATUS             Status;
   2792     DT_SUBTABLE             *Subtable;
   2793     DT_SUBTABLE             *ParentTable;
   2794     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2795     UINT16                  *DataOffset;
   2796 
   2797 
   2798     /* Compile the predefined portion of the UEFI table */
   2799 
   2800     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
   2801         &Subtable);
   2802     if (ACPI_FAILURE (Status))
   2803     {
   2804         return (Status);
   2805     }
   2806 
   2807     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
   2808     *DataOffset = sizeof (ACPI_TABLE_UEFI);
   2809 
   2810     ParentTable = DtPeekSubtable ();
   2811     DtInsertSubtable (ParentTable, Subtable);
   2812 
   2813     /*
   2814      * Compile the "generic" portion of the UEFI table. This
   2815      * part of the table is not predefined and any of the generic
   2816      * operators may be used.
   2817      */
   2818     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
   2819     return (AE_OK);
   2820 }
   2821 
   2822 
   2823 /******************************************************************************
   2824  *
   2825  * FUNCTION:    DtCompileViot
   2826  *
   2827  * PARAMETERS:  List                - Current field list pointer
   2828  *
   2829  * RETURN:      Status
   2830  *
   2831  * DESCRIPTION: Compile VIOT.
   2832  *
   2833  *****************************************************************************/
   2834 
   2835 ACPI_STATUS
   2836 DtCompileViot (
   2837     void                    **List)
   2838 {
   2839     ACPI_STATUS             Status;
   2840     DT_SUBTABLE             *Subtable;
   2841     DT_SUBTABLE             *ParentTable;
   2842     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2843     DT_FIELD                *SubtableStart;
   2844     ACPI_TABLE_VIOT         *Viot;
   2845     ACPI_VIOT_HEADER        *ViotHeader;
   2846     ACPI_DMTABLE_INFO       *InfoTable;
   2847     UINT16                  NodeCount;
   2848 
   2849     ParentTable = DtPeekSubtable ();
   2850 
   2851     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
   2852     if (ACPI_FAILURE (Status))
   2853     {
   2854         return (Status);
   2855     }
   2856     DtInsertSubtable (ParentTable, Subtable);
   2857 
   2858     /*
   2859      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
   2860      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
   2861      */
   2862     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
   2863         sizeof (ACPI_TABLE_HEADER));
   2864 
   2865     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
   2866 
   2867     NodeCount = 0;
   2868     while (*PFieldList) {
   2869         SubtableStart = *PFieldList;
   2870         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
   2871             &Subtable);
   2872         if (ACPI_FAILURE (Status))
   2873         {
   2874             return (Status);
   2875         }
   2876 
   2877         ParentTable = DtPeekSubtable ();
   2878         DtInsertSubtable (ParentTable, Subtable);
   2879         DtPushSubtable (Subtable);
   2880 
   2881         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
   2882 
   2883         switch (ViotHeader->Type)
   2884         {
   2885         case ACPI_VIOT_NODE_PCI_RANGE:
   2886 
   2887             InfoTable = AcpiDmTableInfoViot1;
   2888             break;
   2889 
   2890         case ACPI_VIOT_NODE_MMIO:
   2891 
   2892             InfoTable = AcpiDmTableInfoViot2;
   2893             break;
   2894 
   2895         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
   2896 
   2897             InfoTable = AcpiDmTableInfoViot3;
   2898             break;
   2899 
   2900         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
   2901 
   2902             InfoTable = AcpiDmTableInfoViot4;
   2903             break;
   2904 
   2905         default:
   2906 
   2907             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
   2908             return (AE_ERROR);
   2909         }
   2910 
   2911         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2912         if (ACPI_FAILURE (Status))
   2913         {
   2914             return (Status);
   2915         }
   2916 
   2917         ParentTable = DtPeekSubtable ();
   2918         DtInsertSubtable (ParentTable, Subtable);
   2919         DtPopSubtable ();
   2920         NodeCount++;
   2921     }
   2922 
   2923     Viot->NodeCount = NodeCount;
   2924     return (AE_OK);
   2925 }
   2926 
   2927 
   2928 /******************************************************************************
   2929  *
   2930  * FUNCTION:    DtCompileWdat
   2931  *
   2932  * PARAMETERS:  List                - Current field list pointer
   2933  *
   2934  * RETURN:      Status
   2935  *
   2936  * DESCRIPTION: Compile WDAT.
   2937  *
   2938  *****************************************************************************/
   2939 
   2940 ACPI_STATUS
   2941 DtCompileWdat (
   2942     void                    **List)
   2943 {
   2944     ACPI_STATUS             Status;
   2945 
   2946 
   2947     Status = DtCompileTwoSubtables (List,
   2948         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
   2949     return (Status);
   2950 }
   2951 
   2952 
   2953 /******************************************************************************
   2954  *
   2955  * FUNCTION:    DtCompileWpbt
   2956  *
   2957  * PARAMETERS:  List                - Current field list pointer
   2958  *
   2959  * RETURN:      Status
   2960  *
   2961  * DESCRIPTION: Compile WPBT.
   2962  *
   2963  *****************************************************************************/
   2964 
   2965 ACPI_STATUS
   2966 DtCompileWpbt (
   2967     void                    **List)
   2968 {
   2969     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2970     DT_SUBTABLE             *Subtable;
   2971     DT_SUBTABLE             *ParentTable;
   2972     ACPI_TABLE_WPBT         *Table;
   2973     ACPI_STATUS             Status;
   2974 
   2975 
   2976     /* Compile the main table */
   2977 
   2978     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable);
   2979     if (ACPI_FAILURE (Status))
   2980     {
   2981         return (Status);
   2982     }
   2983 
   2984     ParentTable = DtPeekSubtable ();
   2985     DtInsertSubtable (ParentTable, Subtable);
   2986     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
   2987 
   2988     /*
   2989      * Exit now if there are no arguments specified. This is indicated by:
   2990      * The "Command-line Arguments" field has not been specified (if specified,
   2991      * it will be the last field in the field list -- after the main table).
   2992      * Set the Argument Length in the main table to zero.
   2993      */
   2994     if (!*PFieldList)
   2995     {
   2996         Table->ArgumentsLength = 0;
   2997         return (AE_OK);
   2998     }
   2999 
   3000     /* Compile the argument list subtable */
   3001 
   3002     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable);
   3003     if (ACPI_FAILURE (Status))
   3004     {
   3005         return (Status);
   3006     }
   3007 
   3008     /* Extract the length of the Arguments buffer, insert into main table */
   3009 
   3010     Table->ArgumentsLength = (UINT16) Subtable->TotalLength;
   3011     DtInsertSubtable (ParentTable, Subtable);
   3012     return (AE_OK);
   3013 }
   3014 
   3015 
   3016 /******************************************************************************
   3017  *
   3018  * FUNCTION:    DtCompileXsdt
   3019  *
   3020  * PARAMETERS:  List                - Current field list pointer
   3021  *
   3022  * RETURN:      Status
   3023  *
   3024  * DESCRIPTION: Compile XSDT.
   3025  *
   3026  *****************************************************************************/
   3027 
   3028 ACPI_STATUS
   3029 DtCompileXsdt (
   3030     void                    **List)
   3031 {
   3032     DT_SUBTABLE             *Subtable;
   3033     DT_SUBTABLE             *ParentTable;
   3034     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   3035     UINT64                  Address;
   3036 
   3037 
   3038     ParentTable = DtPeekSubtable ();
   3039 
   3040     while (FieldList)
   3041     {
   3042         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
   3043 
   3044         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
   3045         DtInsertSubtable (ParentTable, Subtable);
   3046         FieldList = FieldList->Next;
   3047     }
   3048 
   3049     return (AE_OK);
   3050 }
   3051 
   3052 
   3053 /******************************************************************************
   3054  *
   3055  * FUNCTION:    DtCompileGeneric
   3056  *
   3057  * PARAMETERS:  List                - Current field list pointer
   3058  *              Name                - Field name to end generic compiling
   3059  *              Length              - Compiled table length to return
   3060  *
   3061  * RETURN:      Status
   3062  *
   3063  * DESCRIPTION: Compile generic unknown table.
   3064  *
   3065  *****************************************************************************/
   3066 
   3067 ACPI_STATUS
   3068 DtCompileGeneric (
   3069     void                    **List,
   3070     char                    *Name,
   3071     UINT32                  *Length)
   3072 {
   3073     ACPI_STATUS             Status;
   3074     DT_SUBTABLE             *Subtable;
   3075     DT_SUBTABLE             *ParentTable;
   3076     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3077     ACPI_DMTABLE_INFO       *Info;
   3078 
   3079 
   3080     ParentTable = DtPeekSubtable ();
   3081 
   3082     /*
   3083      * Compile the "generic" portion of the table. This
   3084      * part of the table is not predefined and any of the generic
   3085      * operators may be used.
   3086      */
   3087 
   3088     /* Find any and all labels in the entire generic portion */
   3089 
   3090     DtDetectAllLabels (*PFieldList);
   3091 
   3092     /* Now we can actually compile the parse tree */
   3093 
   3094     if (Length && *Length)
   3095     {
   3096         *Length = 0;
   3097     }
   3098     while (*PFieldList)
   3099     {
   3100         if (Name && !strcmp ((*PFieldList)->Name, Name))
   3101         {
   3102             break;
   3103         }
   3104 
   3105         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
   3106         if (!Info)
   3107         {
   3108             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   3109                 (*PFieldList)->Name);
   3110             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3111                 (*PFieldList), AslGbl_MsgBuffer);
   3112 
   3113             *PFieldList = (*PFieldList)->Next;
   3114             continue;
   3115         }
   3116 
   3117         Status = DtCompileTable (PFieldList, Info,
   3118             &Subtable);
   3119         if (ACPI_SUCCESS (Status))
   3120         {
   3121             DtInsertSubtable (ParentTable, Subtable);
   3122             if (Length)
   3123             {
   3124                 *Length += Subtable->Length;
   3125             }
   3126         }
   3127         else
   3128         {
   3129             *PFieldList = (*PFieldList)->Next;
   3130 
   3131             if (Status == AE_NOT_FOUND)
   3132             {
   3133                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   3134                     (*PFieldList)->Name);
   3135                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3136                     (*PFieldList), AslGbl_MsgBuffer);
   3137             }
   3138         }
   3139     }
   3140 
   3141     return (AE_OK);
   3142 }
   3143