Home | History | Annotate | Line # | Download | only in compiler
dttable2.c revision 1.1
      1 /******************************************************************************
      2  *
      3  * Module Name: dttable2.c - handling for specific ACPI tables
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2016, 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 MERCHANTIBILITY 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 #include "dtcompiler.h"
     48 
     49 #define _COMPONENT          DT_COMPILER
     50         ACPI_MODULE_NAME    ("dttable2")
     51 
     52 
     53 /******************************************************************************
     54  *
     55  * FUNCTION:    DtCompileLpit
     56  *
     57  * PARAMETERS:  List                - Current field list pointer
     58  *
     59  * RETURN:      Status
     60  *
     61  * DESCRIPTION: Compile LPIT.
     62  *
     63  *****************************************************************************/
     64 
     65 ACPI_STATUS
     66 DtCompileLpit (
     67     void                    **List)
     68 {
     69     ACPI_STATUS             Status;
     70     DT_SUBTABLE             *Subtable;
     71     DT_SUBTABLE             *ParentTable;
     72     DT_FIELD                **PFieldList = (DT_FIELD **) List;
     73     DT_FIELD                *SubtableStart;
     74     ACPI_DMTABLE_INFO       *InfoTable;
     75     ACPI_LPIT_HEADER        *LpitHeader;
     76 
     77 
     78     /* Note: Main table consists only of the standard ACPI table header */
     79 
     80     while (*PFieldList)
     81     {
     82         SubtableStart = *PFieldList;
     83 
     84         /* LPIT Subtable header */
     85 
     86         Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
     87             &Subtable, TRUE);
     88         if (ACPI_FAILURE (Status))
     89         {
     90             return (Status);
     91         }
     92 
     93         ParentTable = DtPeekSubtable ();
     94         DtInsertSubtable (ParentTable, Subtable);
     95         DtPushSubtable (Subtable);
     96 
     97         LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
     98 
     99         switch (LpitHeader->Type)
    100         {
    101         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
    102 
    103             InfoTable = AcpiDmTableInfoLpit0;
    104             break;
    105 
    106         default:
    107 
    108             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
    109             return (AE_ERROR);
    110         }
    111 
    112         /* LPIT Subtable */
    113 
    114         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
    115         if (ACPI_FAILURE (Status))
    116         {
    117             return (Status);
    118         }
    119 
    120         ParentTable = DtPeekSubtable ();
    121         DtInsertSubtable (ParentTable, Subtable);
    122         DtPopSubtable ();
    123     }
    124 
    125     return (AE_OK);
    126 }
    127 
    128 
    129 /******************************************************************************
    130  *
    131  * FUNCTION:    DtCompileMadt
    132  *
    133  * PARAMETERS:  List                - Current field list pointer
    134  *
    135  * RETURN:      Status
    136  *
    137  * DESCRIPTION: Compile MADT.
    138  *
    139  *****************************************************************************/
    140 
    141 ACPI_STATUS
    142 DtCompileMadt (
    143     void                    **List)
    144 {
    145     ACPI_STATUS             Status;
    146     DT_SUBTABLE             *Subtable;
    147     DT_SUBTABLE             *ParentTable;
    148     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    149     DT_FIELD                *SubtableStart;
    150     ACPI_SUBTABLE_HEADER    *MadtHeader;
    151     ACPI_DMTABLE_INFO       *InfoTable;
    152 
    153 
    154     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
    155         &Subtable, TRUE);
    156     if (ACPI_FAILURE (Status))
    157     {
    158         return (Status);
    159     }
    160 
    161     ParentTable = DtPeekSubtable ();
    162     DtInsertSubtable (ParentTable, Subtable);
    163 
    164     while (*PFieldList)
    165     {
    166         SubtableStart = *PFieldList;
    167         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
    168             &Subtable, TRUE);
    169         if (ACPI_FAILURE (Status))
    170         {
    171             return (Status);
    172         }
    173 
    174         ParentTable = DtPeekSubtable ();
    175         DtInsertSubtable (ParentTable, Subtable);
    176         DtPushSubtable (Subtable);
    177 
    178         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
    179 
    180         switch (MadtHeader->Type)
    181         {
    182         case ACPI_MADT_TYPE_LOCAL_APIC:
    183 
    184             InfoTable = AcpiDmTableInfoMadt0;
    185             break;
    186 
    187         case ACPI_MADT_TYPE_IO_APIC:
    188 
    189             InfoTable = AcpiDmTableInfoMadt1;
    190             break;
    191 
    192         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
    193 
    194             InfoTable = AcpiDmTableInfoMadt2;
    195             break;
    196 
    197         case ACPI_MADT_TYPE_NMI_SOURCE:
    198 
    199             InfoTable = AcpiDmTableInfoMadt3;
    200             break;
    201 
    202         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
    203 
    204             InfoTable = AcpiDmTableInfoMadt4;
    205             break;
    206 
    207         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
    208 
    209             InfoTable = AcpiDmTableInfoMadt5;
    210             break;
    211 
    212         case ACPI_MADT_TYPE_IO_SAPIC:
    213 
    214             InfoTable = AcpiDmTableInfoMadt6;
    215             break;
    216 
    217         case ACPI_MADT_TYPE_LOCAL_SAPIC:
    218 
    219             InfoTable = AcpiDmTableInfoMadt7;
    220             break;
    221 
    222         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
    223 
    224             InfoTable = AcpiDmTableInfoMadt8;
    225             break;
    226 
    227         case ACPI_MADT_TYPE_LOCAL_X2APIC:
    228 
    229             InfoTable = AcpiDmTableInfoMadt9;
    230             break;
    231 
    232         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
    233 
    234             InfoTable = AcpiDmTableInfoMadt10;
    235             break;
    236 
    237         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
    238 
    239             InfoTable = AcpiDmTableInfoMadt11;
    240             break;
    241 
    242         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
    243 
    244             InfoTable = AcpiDmTableInfoMadt12;
    245             break;
    246 
    247         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
    248 
    249             InfoTable = AcpiDmTableInfoMadt13;
    250             break;
    251 
    252         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
    253 
    254             InfoTable = AcpiDmTableInfoMadt14;
    255             break;
    256 
    257         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
    258 
    259             InfoTable = AcpiDmTableInfoMadt15;
    260             break;
    261 
    262         default:
    263 
    264             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
    265             return (AE_ERROR);
    266         }
    267 
    268         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
    269         if (ACPI_FAILURE (Status))
    270         {
    271             return (Status);
    272         }
    273 
    274         ParentTable = DtPeekSubtable ();
    275         DtInsertSubtable (ParentTable, Subtable);
    276         DtPopSubtable ();
    277     }
    278 
    279     return (AE_OK);
    280 }
    281 
    282 
    283 /******************************************************************************
    284  *
    285  * FUNCTION:    DtCompileMcfg
    286  *
    287  * PARAMETERS:  List                - Current field list pointer
    288  *
    289  * RETURN:      Status
    290  *
    291  * DESCRIPTION: Compile MCFG.
    292  *
    293  *****************************************************************************/
    294 
    295 ACPI_STATUS
    296 DtCompileMcfg (
    297     void                    **List)
    298 {
    299     ACPI_STATUS             Status;
    300 
    301 
    302     Status = DtCompileTwoSubtables (List,
    303         AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
    304     return (Status);
    305 }
    306 
    307 
    308 /******************************************************************************
    309  *
    310  * FUNCTION:    DtCompileMpst
    311  *
    312  * PARAMETERS:  List                - Current field list pointer
    313  *
    314  * RETURN:      Status
    315  *
    316  * DESCRIPTION: Compile MPST.
    317  *
    318  *****************************************************************************/
    319 
    320 ACPI_STATUS
    321 DtCompileMpst (
    322     void                    **List)
    323 {
    324     ACPI_STATUS             Status;
    325     DT_SUBTABLE             *Subtable;
    326     DT_SUBTABLE             *ParentTable;
    327     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    328     ACPI_MPST_CHANNEL       *MpstChannelInfo;
    329     ACPI_MPST_POWER_NODE    *MpstPowerNode;
    330     ACPI_MPST_DATA_HDR      *MpstDataHeader;
    331     UINT16                  SubtableCount;
    332     UINT32                  PowerStateCount;
    333     UINT32                  ComponentCount;
    334 
    335 
    336     /* Main table */
    337 
    338     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
    339     if (ACPI_FAILURE (Status))
    340     {
    341         return (Status);
    342     }
    343 
    344     ParentTable = DtPeekSubtable ();
    345     DtInsertSubtable (ParentTable, Subtable);
    346     DtPushSubtable (Subtable);
    347 
    348     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
    349     SubtableCount = MpstChannelInfo->PowerNodeCount;
    350 
    351     while (*PFieldList && SubtableCount)
    352     {
    353         /* Subtable: Memory Power Node(s) */
    354 
    355         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
    356             &Subtable, TRUE);
    357         if (ACPI_FAILURE (Status))
    358         {
    359             return (Status);
    360         }
    361 
    362         ParentTable = DtPeekSubtable ();
    363         DtInsertSubtable (ParentTable, Subtable);
    364         DtPushSubtable (Subtable);
    365 
    366         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
    367         PowerStateCount = MpstPowerNode->NumPowerStates;
    368         ComponentCount = MpstPowerNode->NumPhysicalComponents;
    369 
    370         ParentTable = DtPeekSubtable ();
    371 
    372         /* Sub-subtables - Memory Power State Structure(s) */
    373 
    374         while (*PFieldList && PowerStateCount)
    375         {
    376             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
    377                 &Subtable, TRUE);
    378             if (ACPI_FAILURE (Status))
    379             {
    380                 return (Status);
    381             }
    382 
    383             DtInsertSubtable (ParentTable, Subtable);
    384             PowerStateCount--;
    385         }
    386 
    387         /* Sub-subtables - Physical Component ID Structure(s) */
    388 
    389         while (*PFieldList && ComponentCount)
    390         {
    391             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
    392                 &Subtable, TRUE);
    393             if (ACPI_FAILURE (Status))
    394             {
    395                 return (Status);
    396             }
    397 
    398             DtInsertSubtable (ParentTable, Subtable);
    399             ComponentCount--;
    400         }
    401 
    402         SubtableCount--;
    403         DtPopSubtable ();
    404     }
    405 
    406     /* Subtable: Count of Memory Power State Characteristic structures */
    407 
    408     DtPopSubtable ();
    409 
    410     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
    411     if (ACPI_FAILURE (Status))
    412     {
    413         return (Status);
    414     }
    415 
    416     ParentTable = DtPeekSubtable ();
    417     DtInsertSubtable (ParentTable, Subtable);
    418     DtPushSubtable (Subtable);
    419 
    420     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
    421     SubtableCount = MpstDataHeader->CharacteristicsCount;
    422 
    423     ParentTable = DtPeekSubtable ();
    424 
    425     /* Subtable: Memory Power State Characteristics structure(s) */
    426 
    427     while (*PFieldList && SubtableCount)
    428     {
    429         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
    430             &Subtable, TRUE);
    431         if (ACPI_FAILURE (Status))
    432         {
    433             return (Status);
    434         }
    435 
    436         DtInsertSubtable (ParentTable, Subtable);
    437         SubtableCount--;
    438     }
    439 
    440     DtPopSubtable ();
    441     return (AE_OK);
    442 }
    443 
    444 
    445 /******************************************************************************
    446  *
    447  * FUNCTION:    DtCompileMsct
    448  *
    449  * PARAMETERS:  List                - Current field list pointer
    450  *
    451  * RETURN:      Status
    452  *
    453  * DESCRIPTION: Compile MSCT.
    454  *
    455  *****************************************************************************/
    456 
    457 ACPI_STATUS
    458 DtCompileMsct (
    459     void                    **List)
    460 {
    461     ACPI_STATUS             Status;
    462 
    463 
    464     Status = DtCompileTwoSubtables (List,
    465         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
    466     return (Status);
    467 }
    468 
    469 
    470 /******************************************************************************
    471  *
    472  * FUNCTION:    DtCompileMtmr
    473  *
    474  * PARAMETERS:  List                - Current field list pointer
    475  *
    476  * RETURN:      Status
    477  *
    478  * DESCRIPTION: Compile MTMR.
    479  *
    480  *****************************************************************************/
    481 
    482 ACPI_STATUS
    483 DtCompileMtmr (
    484     void                    **List)
    485 {
    486     ACPI_STATUS             Status;
    487 
    488 
    489     Status = DtCompileTwoSubtables (List,
    490         AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
    491     return (Status);
    492 }
    493 
    494 
    495 /******************************************************************************
    496  *
    497  * FUNCTION:    DtCompileNfit
    498  *
    499  * PARAMETERS:  List                - Current field list pointer
    500  *
    501  * RETURN:      Status
    502  *
    503  * DESCRIPTION: Compile NFIT.
    504  *
    505  *****************************************************************************/
    506 
    507 ACPI_STATUS
    508 DtCompileNfit (
    509     void                    **List)
    510 {
    511     ACPI_STATUS             Status;
    512     DT_SUBTABLE             *Subtable;
    513     DT_SUBTABLE             *ParentTable;
    514     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    515     DT_FIELD                *SubtableStart;
    516     ACPI_NFIT_HEADER        *NfitHeader;
    517     ACPI_DMTABLE_INFO       *InfoTable;
    518     UINT32                  Count;
    519     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
    520     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
    521 
    522 
    523     /* Main table */
    524 
    525     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
    526         &Subtable, TRUE);
    527     if (ACPI_FAILURE (Status))
    528     {
    529         return (Status);
    530     }
    531 
    532     ParentTable = DtPeekSubtable ();
    533     DtInsertSubtable (ParentTable, Subtable);
    534     DtPushSubtable (Subtable);
    535 
    536     /* Subtables */
    537 
    538     while (*PFieldList)
    539     {
    540         SubtableStart = *PFieldList;
    541         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
    542             &Subtable, TRUE);
    543         if (ACPI_FAILURE (Status))
    544         {
    545             return (Status);
    546         }
    547 
    548         ParentTable = DtPeekSubtable ();
    549         DtInsertSubtable (ParentTable, Subtable);
    550         DtPushSubtable (Subtable);
    551 
    552         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
    553 
    554         switch (NfitHeader->Type)
    555         {
    556         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
    557 
    558             InfoTable = AcpiDmTableInfoNfit0;
    559             break;
    560 
    561         case ACPI_NFIT_TYPE_MEMORY_MAP:
    562 
    563             InfoTable = AcpiDmTableInfoNfit1;
    564             break;
    565 
    566         case ACPI_NFIT_TYPE_INTERLEAVE:
    567 
    568             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
    569             InfoTable = AcpiDmTableInfoNfit2;
    570             break;
    571 
    572         case ACPI_NFIT_TYPE_SMBIOS:
    573 
    574             InfoTable = AcpiDmTableInfoNfit3;
    575             break;
    576 
    577         case ACPI_NFIT_TYPE_CONTROL_REGION:
    578 
    579             InfoTable = AcpiDmTableInfoNfit4;
    580             break;
    581 
    582         case ACPI_NFIT_TYPE_DATA_REGION:
    583 
    584             InfoTable = AcpiDmTableInfoNfit5;
    585             break;
    586 
    587         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
    588 
    589             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
    590             InfoTable = AcpiDmTableInfoNfit6;
    591             break;
    592 
    593         default:
    594 
    595             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
    596             return (AE_ERROR);
    597         }
    598 
    599         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
    600         if (ACPI_FAILURE (Status))
    601         {
    602             return (Status);
    603         }
    604 
    605         ParentTable = DtPeekSubtable ();
    606         DtInsertSubtable (ParentTable, Subtable);
    607         DtPopSubtable ();
    608 
    609         switch (NfitHeader->Type)
    610         {
    611         case ACPI_NFIT_TYPE_INTERLEAVE:
    612 
    613             Count = 0;
    614             DtPushSubtable (Subtable);
    615             while (*PFieldList)
    616             {
    617                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
    618                     &Subtable, FALSE);
    619                 if (ACPI_FAILURE (Status))
    620                 {
    621                     return (Status);
    622                 }
    623 
    624                 if (!Subtable)
    625                 {
    626                     DtPopSubtable ();
    627                     break;
    628                 }
    629 
    630                 ParentTable = DtPeekSubtable ();
    631                 DtInsertSubtable (ParentTable, Subtable);
    632                 Count++;
    633             }
    634 
    635             Interleave->LineCount = Count;
    636             DtPopSubtable ();
    637             break;
    638 
    639         case ACPI_NFIT_TYPE_SMBIOS:
    640 
    641             if (*PFieldList)
    642             {
    643                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
    644                     &Subtable, TRUE);
    645                 if (ACPI_FAILURE (Status))
    646                 {
    647                     return (Status);
    648                 }
    649 
    650                 if (Subtable)
    651                 {
    652                     DtInsertSubtable (ParentTable, Subtable);
    653                 }
    654             }
    655             break;
    656 
    657         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
    658 
    659             Count = 0;
    660             DtPushSubtable (Subtable);
    661             while (*PFieldList)
    662             {
    663                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
    664                     &Subtable, FALSE);
    665                 if (ACPI_FAILURE (Status))
    666                 {
    667                     return (Status);
    668                 }
    669 
    670                 if (!Subtable)
    671                 {
    672                     DtPopSubtable ();
    673                     break;
    674                 }
    675 
    676                 ParentTable = DtPeekSubtable ();
    677                 DtInsertSubtable (ParentTable, Subtable);
    678                 Count++;
    679             }
    680 
    681             Hint->HintCount = (UINT16) Count;
    682             DtPopSubtable ();
    683             break;
    684 
    685         default:
    686             break;
    687         }
    688     }
    689 
    690     return (AE_OK);
    691 }
    692 
    693 
    694 /******************************************************************************
    695  *
    696  * FUNCTION:    DtCompilePcct
    697  *
    698  * PARAMETERS:  List                - Current field list pointer
    699  *
    700  * RETURN:      Status
    701  *
    702  * DESCRIPTION: Compile PCCT.
    703  *
    704  *****************************************************************************/
    705 
    706 ACPI_STATUS
    707 DtCompilePcct (
    708     void                    **List)
    709 {
    710     ACPI_STATUS             Status;
    711     DT_SUBTABLE             *Subtable;
    712     DT_SUBTABLE             *ParentTable;
    713     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    714     DT_FIELD                *SubtableStart;
    715     ACPI_SUBTABLE_HEADER    *PcctHeader;
    716     ACPI_DMTABLE_INFO       *InfoTable;
    717 
    718 
    719     /* Main table */
    720 
    721     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
    722         &Subtable, TRUE);
    723     if (ACPI_FAILURE (Status))
    724     {
    725         return (Status);
    726     }
    727 
    728     ParentTable = DtPeekSubtable ();
    729     DtInsertSubtable (ParentTable, Subtable);
    730 
    731     /* Subtables */
    732 
    733     while (*PFieldList)
    734     {
    735         SubtableStart = *PFieldList;
    736         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
    737             &Subtable, TRUE);
    738         if (ACPI_FAILURE (Status))
    739         {
    740             return (Status);
    741         }
    742 
    743         ParentTable = DtPeekSubtable ();
    744         DtInsertSubtable (ParentTable, Subtable);
    745         DtPushSubtable (Subtable);
    746 
    747         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
    748 
    749         switch (PcctHeader->Type)
    750         {
    751         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
    752 
    753             InfoTable = AcpiDmTableInfoPcct0;
    754             break;
    755 
    756         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
    757 
    758             InfoTable = AcpiDmTableInfoPcct1;
    759             break;
    760 
    761         default:
    762 
    763             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
    764             return (AE_ERROR);
    765         }
    766 
    767         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
    768         if (ACPI_FAILURE (Status))
    769         {
    770             return (Status);
    771         }
    772 
    773         ParentTable = DtPeekSubtable ();
    774         DtInsertSubtable (ParentTable, Subtable);
    775         DtPopSubtable ();
    776     }
    777 
    778     return (AE_OK);
    779 }
    780 
    781 
    782 /******************************************************************************
    783  *
    784  * FUNCTION:    DtCompilePmtt
    785  *
    786  * PARAMETERS:  List                - Current field list pointer
    787  *
    788  * RETURN:      Status
    789  *
    790  * DESCRIPTION: Compile PMTT.
    791  *
    792  *****************************************************************************/
    793 
    794 ACPI_STATUS
    795 DtCompilePmtt (
    796     void                    **List)
    797 {
    798     ACPI_STATUS             Status;
    799     DT_SUBTABLE             *Subtable;
    800     DT_SUBTABLE             *ParentTable;
    801     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    802     DT_FIELD                *SubtableStart;
    803     ACPI_PMTT_HEADER        *PmttHeader;
    804     ACPI_PMTT_CONTROLLER    *PmttController;
    805     UINT16                  DomainCount;
    806     UINT8                   PrevType = ACPI_PMTT_TYPE_SOCKET;
    807 
    808 
    809     /* Main table */
    810 
    811     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
    812     if (ACPI_FAILURE (Status))
    813     {
    814         return (Status);
    815     }
    816 
    817     ParentTable = DtPeekSubtable ();
    818     DtInsertSubtable (ParentTable, Subtable);
    819     DtPushSubtable (Subtable);
    820 
    821     while (*PFieldList)
    822     {
    823         SubtableStart = *PFieldList;
    824         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
    825             &Subtable, TRUE);
    826         if (ACPI_FAILURE (Status))
    827         {
    828             return (Status);
    829         }
    830 
    831         PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
    832         while (PrevType >= PmttHeader->Type)
    833         {
    834             DtPopSubtable ();
    835 
    836             if (PrevType == ACPI_PMTT_TYPE_SOCKET)
    837             {
    838                 break;
    839             }
    840 
    841             PrevType--;
    842         }
    843 
    844         PrevType = PmttHeader->Type;
    845 
    846         ParentTable = DtPeekSubtable ();
    847         DtInsertSubtable (ParentTable, Subtable);
    848         DtPushSubtable (Subtable);
    849 
    850         switch (PmttHeader->Type)
    851         {
    852         case ACPI_PMTT_TYPE_SOCKET:
    853 
    854             /* Subtable: Socket Structure */
    855 
    856             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
    857                 &Subtable, TRUE);
    858             if (ACPI_FAILURE (Status))
    859             {
    860                 return (Status);
    861             }
    862 
    863             ParentTable = DtPeekSubtable ();
    864             DtInsertSubtable (ParentTable, Subtable);
    865             break;
    866 
    867         case ACPI_PMTT_TYPE_CONTROLLER:
    868 
    869             /* Subtable: Memory Controller Structure */
    870 
    871             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
    872                 &Subtable, TRUE);
    873             if (ACPI_FAILURE (Status))
    874             {
    875                 return (Status);
    876             }
    877 
    878             ParentTable = DtPeekSubtable ();
    879             DtInsertSubtable (ParentTable, Subtable);
    880 
    881             PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
    882                 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
    883             DomainCount = PmttController->DomainCount;
    884 
    885             while (DomainCount)
    886             {
    887                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
    888                     &Subtable, TRUE);
    889                 if (ACPI_FAILURE (Status))
    890                 {
    891                     return (Status);
    892                 }
    893 
    894                 DtInsertSubtable (ParentTable, Subtable);
    895                 DomainCount--;
    896             }
    897             break;
    898 
    899         case ACPI_PMTT_TYPE_DIMM:
    900 
    901             /* Subtable: Physical Component Structure */
    902 
    903             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
    904                 &Subtable, TRUE);
    905             if (ACPI_FAILURE (Status))
    906             {
    907                 return (Status);
    908             }
    909 
    910             ParentTable = DtPeekSubtable ();
    911             DtInsertSubtable (ParentTable, Subtable);
    912             break;
    913 
    914         default:
    915 
    916             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
    917             return (AE_ERROR);
    918         }
    919     }
    920 
    921     return (Status);
    922 }
    923 
    924 
    925 /******************************************************************************
    926  *
    927  * FUNCTION:    DtCompileRsdt
    928  *
    929  * PARAMETERS:  List                - Current field list pointer
    930  *
    931  * RETURN:      Status
    932  *
    933  * DESCRIPTION: Compile RSDT.
    934  *
    935  *****************************************************************************/
    936 
    937 ACPI_STATUS
    938 DtCompileRsdt (
    939     void                    **List)
    940 {
    941     DT_SUBTABLE             *Subtable;
    942     DT_SUBTABLE             *ParentTable;
    943     DT_FIELD                *FieldList = *(DT_FIELD **) List;
    944     UINT32                  Address;
    945 
    946 
    947     ParentTable = DtPeekSubtable ();
    948 
    949     while (FieldList)
    950     {
    951         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
    952 
    953         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
    954         DtInsertSubtable (ParentTable, Subtable);
    955         FieldList = FieldList->Next;
    956     }
    957 
    958     return (AE_OK);
    959 }
    960 
    961 
    962 /******************************************************************************
    963  *
    964  * FUNCTION:    DtCompileS3pt
    965  *
    966  * PARAMETERS:  PFieldList          - Current field list pointer
    967  *
    968  * RETURN:      Status
    969  *
    970  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
    971  *
    972  *****************************************************************************/
    973 
    974 ACPI_STATUS
    975 DtCompileS3pt (
    976     DT_FIELD                **PFieldList)
    977 {
    978     ACPI_STATUS             Status;
    979     ACPI_S3PT_HEADER        *S3ptHeader;
    980     DT_SUBTABLE             *Subtable;
    981     DT_SUBTABLE             *ParentTable;
    982     ACPI_DMTABLE_INFO       *InfoTable;
    983     DT_FIELD                *SubtableStart;
    984 
    985 
    986     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
    987         &Gbl_RootTable, TRUE);
    988     if (ACPI_FAILURE (Status))
    989     {
    990         return (Status);
    991     }
    992 
    993     DtPushSubtable (Gbl_RootTable);
    994 
    995     while (*PFieldList)
    996     {
    997         SubtableStart = *PFieldList;
    998         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
    999             &Subtable, TRUE);
   1000         if (ACPI_FAILURE (Status))
   1001         {
   1002             return (Status);
   1003         }
   1004 
   1005         ParentTable = DtPeekSubtable ();
   1006         DtInsertSubtable (ParentTable, Subtable);
   1007         DtPushSubtable (Subtable);
   1008 
   1009         S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
   1010 
   1011         switch (S3ptHeader->Type)
   1012         {
   1013         case ACPI_S3PT_TYPE_RESUME:
   1014 
   1015             InfoTable = AcpiDmTableInfoS3pt0;
   1016             break;
   1017 
   1018         case ACPI_S3PT_TYPE_SUSPEND:
   1019 
   1020             InfoTable = AcpiDmTableInfoS3pt1;
   1021             break;
   1022 
   1023         default:
   1024 
   1025             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
   1026             return (AE_ERROR);
   1027         }
   1028 
   1029         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   1030         if (ACPI_FAILURE (Status))
   1031         {
   1032             return (Status);
   1033         }
   1034 
   1035         ParentTable = DtPeekSubtable ();
   1036         DtInsertSubtable (ParentTable, Subtable);
   1037         DtPopSubtable ();
   1038     }
   1039 
   1040     return (AE_OK);
   1041 }
   1042 
   1043 
   1044 /******************************************************************************
   1045  *
   1046  * FUNCTION:    DtCompileSlic
   1047  *
   1048  * PARAMETERS:  List                - Current field list pointer
   1049  *
   1050  * RETURN:      Status
   1051  *
   1052  * DESCRIPTION: Compile SLIC.
   1053  *
   1054  *****************************************************************************/
   1055 
   1056 ACPI_STATUS
   1057 DtCompileSlic (
   1058     void                    **List)
   1059 {
   1060     ACPI_STATUS             Status;
   1061     DT_SUBTABLE             *Subtable;
   1062     DT_SUBTABLE             *ParentTable;
   1063     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1064 
   1065 
   1066     while (*PFieldList)
   1067     {
   1068         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
   1069             &Subtable, TRUE);
   1070         if (ACPI_FAILURE (Status))
   1071         {
   1072             return (Status);
   1073         }
   1074 
   1075         ParentTable = DtPeekSubtable ();
   1076         DtInsertSubtable (ParentTable, Subtable);
   1077         DtPushSubtable (Subtable);
   1078         DtPopSubtable ();
   1079     }
   1080 
   1081     return (AE_OK);
   1082 }
   1083 
   1084 
   1085 /******************************************************************************
   1086  *
   1087  * FUNCTION:    DtCompileSlit
   1088  *
   1089  * PARAMETERS:  List                - Current field list pointer
   1090  *
   1091  * RETURN:      Status
   1092  *
   1093  * DESCRIPTION: Compile SLIT.
   1094  *
   1095  *****************************************************************************/
   1096 
   1097 ACPI_STATUS
   1098 DtCompileSlit (
   1099     void                    **List)
   1100 {
   1101     ACPI_STATUS             Status;
   1102     DT_SUBTABLE             *Subtable;
   1103     DT_SUBTABLE             *ParentTable;
   1104     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1105     DT_FIELD                *FieldList;
   1106     UINT32                  Localities;
   1107     UINT8                   *LocalityBuffer;
   1108 
   1109 
   1110     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
   1111         &Subtable, TRUE);
   1112     if (ACPI_FAILURE (Status))
   1113     {
   1114         return (Status);
   1115     }
   1116 
   1117     ParentTable = DtPeekSubtable ();
   1118     DtInsertSubtable (ParentTable, Subtable);
   1119 
   1120     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
   1121     LocalityBuffer = UtLocalCalloc (Localities);
   1122 
   1123     /* Compile each locality buffer */
   1124 
   1125     FieldList = *PFieldList;
   1126     while (FieldList)
   1127     {
   1128         DtCompileBuffer (LocalityBuffer,
   1129             FieldList->Value, FieldList, Localities);
   1130 
   1131         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
   1132         DtInsertSubtable (ParentTable, Subtable);
   1133         FieldList = FieldList->Next;
   1134     }
   1135 
   1136     ACPI_FREE (LocalityBuffer);
   1137     return (AE_OK);
   1138 }
   1139 
   1140 
   1141 /******************************************************************************
   1142  *
   1143  * FUNCTION:    DtCompileSrat
   1144  *
   1145  * PARAMETERS:  List                - Current field list pointer
   1146  *
   1147  * RETURN:      Status
   1148  *
   1149  * DESCRIPTION: Compile SRAT.
   1150  *
   1151  *****************************************************************************/
   1152 
   1153 ACPI_STATUS
   1154 DtCompileSrat (
   1155     void                    **List)
   1156 {
   1157     ACPI_STATUS             Status;
   1158     DT_SUBTABLE             *Subtable;
   1159     DT_SUBTABLE             *ParentTable;
   1160     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1161     DT_FIELD                *SubtableStart;
   1162     ACPI_SUBTABLE_HEADER    *SratHeader;
   1163     ACPI_DMTABLE_INFO       *InfoTable;
   1164 
   1165 
   1166     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
   1167         &Subtable, TRUE);
   1168     if (ACPI_FAILURE (Status))
   1169     {
   1170         return (Status);
   1171     }
   1172 
   1173     ParentTable = DtPeekSubtable ();
   1174     DtInsertSubtable (ParentTable, Subtable);
   1175 
   1176     while (*PFieldList)
   1177     {
   1178         SubtableStart = *PFieldList;
   1179         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
   1180             &Subtable, TRUE);
   1181         if (ACPI_FAILURE (Status))
   1182         {
   1183             return (Status);
   1184         }
   1185 
   1186         ParentTable = DtPeekSubtable ();
   1187         DtInsertSubtable (ParentTable, Subtable);
   1188         DtPushSubtable (Subtable);
   1189 
   1190         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1191 
   1192         switch (SratHeader->Type)
   1193         {
   1194         case ACPI_SRAT_TYPE_CPU_AFFINITY:
   1195 
   1196             InfoTable = AcpiDmTableInfoSrat0;
   1197             break;
   1198 
   1199         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   1200 
   1201             InfoTable = AcpiDmTableInfoSrat1;
   1202             break;
   1203 
   1204         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   1205 
   1206             InfoTable = AcpiDmTableInfoSrat2;
   1207             break;
   1208 
   1209         case ACPI_SRAT_TYPE_GICC_AFFINITY:
   1210 
   1211             InfoTable = AcpiDmTableInfoSrat3;
   1212             break;
   1213 
   1214         default:
   1215 
   1216             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
   1217             return (AE_ERROR);
   1218         }
   1219 
   1220         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   1221         if (ACPI_FAILURE (Status))
   1222         {
   1223             return (Status);
   1224         }
   1225 
   1226         ParentTable = DtPeekSubtable ();
   1227         DtInsertSubtable (ParentTable, Subtable);
   1228         DtPopSubtable ();
   1229     }
   1230 
   1231     return (AE_OK);
   1232 }
   1233 
   1234 
   1235 /******************************************************************************
   1236  *
   1237  * FUNCTION:    DtCompileStao
   1238  *
   1239  * PARAMETERS:  PFieldList          - Current field list pointer
   1240  *
   1241  * RETURN:      Status
   1242  *
   1243  * DESCRIPTION: Compile STAO.
   1244  *
   1245  *****************************************************************************/
   1246 
   1247 ACPI_STATUS
   1248 DtCompileStao (
   1249     void                    **List)
   1250 {
   1251     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1252     DT_SUBTABLE             *Subtable;
   1253     DT_SUBTABLE             *ParentTable;
   1254     ACPI_STATUS             Status;
   1255 
   1256 
   1257     /* Compile the main table */
   1258 
   1259     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
   1260         &Subtable, TRUE);
   1261     if (ACPI_FAILURE (Status))
   1262     {
   1263         return (Status);
   1264     }
   1265 
   1266     ParentTable = DtPeekSubtable ();
   1267     DtInsertSubtable (ParentTable, Subtable);
   1268 
   1269     /* Compile each ASCII namestring as a subtable */
   1270 
   1271     while (*PFieldList)
   1272     {
   1273         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
   1274             &Subtable, TRUE);
   1275         if (ACPI_FAILURE (Status))
   1276         {
   1277             return (Status);
   1278         }
   1279 
   1280         ParentTable = DtPeekSubtable ();
   1281         DtInsertSubtable (ParentTable, Subtable);
   1282     }
   1283 
   1284     return (AE_OK);
   1285 }
   1286 
   1287 
   1288 /******************************************************************************
   1289  *
   1290  * FUNCTION:    DtCompileTcpa
   1291  *
   1292  * PARAMETERS:  PFieldList          - Current field list pointer
   1293  *
   1294  * RETURN:      Status
   1295  *
   1296  * DESCRIPTION: Compile TCPA.
   1297  *
   1298  *****************************************************************************/
   1299 
   1300 ACPI_STATUS
   1301 DtCompileTcpa (
   1302     void                    **List)
   1303 {
   1304     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1305     DT_SUBTABLE             *Subtable;
   1306     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
   1307     DT_SUBTABLE             *ParentTable;
   1308     ACPI_STATUS             Status;
   1309 
   1310 
   1311     /* Compile the main table */
   1312 
   1313     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
   1314         &Subtable, TRUE);
   1315     if (ACPI_FAILURE (Status))
   1316     {
   1317         return (Status);
   1318     }
   1319 
   1320     ParentTable = DtPeekSubtable ();
   1321     DtInsertSubtable (ParentTable, Subtable);
   1322 
   1323     /*
   1324      * Examine the PlatformClass field to determine the table type.
   1325      * Either a client or server table. Only one.
   1326      */
   1327     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
   1328 
   1329     switch (TcpaHeader->PlatformClass)
   1330     {
   1331     case ACPI_TCPA_CLIENT_TABLE:
   1332 
   1333         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
   1334             &Subtable, TRUE);
   1335         break;
   1336 
   1337     case ACPI_TCPA_SERVER_TABLE:
   1338 
   1339         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
   1340             &Subtable, TRUE);
   1341         break;
   1342 
   1343     default:
   1344 
   1345         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
   1346             TcpaHeader->PlatformClass);
   1347         Status = AE_ERROR;
   1348         break;
   1349     }
   1350 
   1351     ParentTable = DtPeekSubtable ();
   1352     DtInsertSubtable (ParentTable, Subtable);
   1353     return (Status);
   1354 }
   1355 
   1356 
   1357 /******************************************************************************
   1358  *
   1359  * FUNCTION:    DtGetGenericTableInfo
   1360  *
   1361  * PARAMETERS:  Name                - Generic type name
   1362  *
   1363  * RETURN:      Info entry
   1364  *
   1365  * DESCRIPTION: Obtain table info for a generic name entry
   1366  *
   1367  *****************************************************************************/
   1368 
   1369 ACPI_DMTABLE_INFO *
   1370 DtGetGenericTableInfo (
   1371     char                    *Name)
   1372 {
   1373     ACPI_DMTABLE_INFO       *Info;
   1374     UINT32                  i;
   1375 
   1376 
   1377     if (!Name)
   1378     {
   1379         return (NULL);
   1380     }
   1381 
   1382     /* Search info table for name match */
   1383 
   1384     for (i = 0; ; i++)
   1385     {
   1386         Info = AcpiDmTableInfoGeneric[i];
   1387         if (Info->Opcode == ACPI_DMT_EXIT)
   1388         {
   1389             Info = NULL;
   1390             break;
   1391         }
   1392 
   1393         /* Use caseless compare for generic keywords */
   1394 
   1395         if (!AcpiUtStricmp (Name, Info->Name))
   1396         {
   1397             break;
   1398         }
   1399     }
   1400 
   1401     return (Info);
   1402 }
   1403 
   1404 
   1405 /******************************************************************************
   1406  *
   1407  * FUNCTION:    DtCompileUefi
   1408  *
   1409  * PARAMETERS:  List                - Current field list pointer
   1410  *
   1411  * RETURN:      Status
   1412  *
   1413  * DESCRIPTION: Compile UEFI.
   1414  *
   1415  *****************************************************************************/
   1416 
   1417 ACPI_STATUS
   1418 DtCompileUefi (
   1419     void                    **List)
   1420 {
   1421     ACPI_STATUS             Status;
   1422     DT_SUBTABLE             *Subtable;
   1423     DT_SUBTABLE             *ParentTable;
   1424     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1425     UINT16                  *DataOffset;
   1426 
   1427 
   1428     /* Compile the predefined portion of the UEFI table */
   1429 
   1430     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
   1431         &Subtable, TRUE);
   1432     if (ACPI_FAILURE (Status))
   1433     {
   1434         return (Status);
   1435     }
   1436 
   1437     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
   1438     *DataOffset = sizeof (ACPI_TABLE_UEFI);
   1439 
   1440     ParentTable = DtPeekSubtable ();
   1441     DtInsertSubtable (ParentTable, Subtable);
   1442 
   1443     /*
   1444      * Compile the "generic" portion of the UEFI table. This
   1445      * part of the table is not predefined and any of the generic
   1446      * operators may be used.
   1447      */
   1448     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
   1449     return (AE_OK);
   1450 }
   1451 
   1452 
   1453 /******************************************************************************
   1454  *
   1455  * FUNCTION:    DtCompileVrtc
   1456  *
   1457  * PARAMETERS:  List                - Current field list pointer
   1458  *
   1459  * RETURN:      Status
   1460  *
   1461  * DESCRIPTION: Compile VRTC.
   1462  *
   1463  *****************************************************************************/
   1464 
   1465 ACPI_STATUS
   1466 DtCompileVrtc (
   1467     void                    **List)
   1468 {
   1469     ACPI_STATUS             Status;
   1470 
   1471 
   1472     Status = DtCompileTwoSubtables (List,
   1473         AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
   1474     return (Status);
   1475 }
   1476 
   1477 
   1478 /******************************************************************************
   1479  *
   1480  * FUNCTION:    DtCompileWdat
   1481  *
   1482  * PARAMETERS:  List                - Current field list pointer
   1483  *
   1484  * RETURN:      Status
   1485  *
   1486  * DESCRIPTION: Compile WDAT.
   1487  *
   1488  *****************************************************************************/
   1489 
   1490 ACPI_STATUS
   1491 DtCompileWdat (
   1492     void                    **List)
   1493 {
   1494     ACPI_STATUS             Status;
   1495 
   1496 
   1497     Status = DtCompileTwoSubtables (List,
   1498         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
   1499     return (Status);
   1500 }
   1501 
   1502 
   1503 /******************************************************************************
   1504  *
   1505  * FUNCTION:    DtCompileWpbt
   1506  *
   1507  * PARAMETERS:  List                - Current field list pointer
   1508  *
   1509  * RETURN:      Status
   1510  *
   1511  * DESCRIPTION: Compile WPBT.
   1512  *
   1513  *****************************************************************************/
   1514 
   1515 ACPI_STATUS
   1516 DtCompileWpbt (
   1517     void                    **List)
   1518 {
   1519     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1520     DT_SUBTABLE             *Subtable;
   1521     DT_SUBTABLE             *ParentTable;
   1522     ACPI_TABLE_WPBT         *Table;
   1523     ACPI_STATUS             Status;
   1524     UINT16                  Length;
   1525 
   1526 
   1527     /* Compile the main table */
   1528 
   1529     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
   1530         &Subtable, TRUE);
   1531     if (ACPI_FAILURE (Status))
   1532     {
   1533         return (Status);
   1534     }
   1535 
   1536     ParentTable = DtPeekSubtable ();
   1537     DtInsertSubtable (ParentTable, Subtable);
   1538 
   1539     /* Compile the argument list subtable */
   1540 
   1541     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
   1542         &Subtable, TRUE);
   1543     if (ACPI_FAILURE (Status))
   1544     {
   1545         return (Status);
   1546     }
   1547 
   1548     /* Extract the length of the Arguments buffer, insert into main table */
   1549 
   1550     Length = (UINT16) Subtable->TotalLength;
   1551     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
   1552     Table->ArgumentsLength = Length;
   1553 
   1554     ParentTable = DtPeekSubtable ();
   1555     DtInsertSubtable (ParentTable, Subtable);
   1556     return (AE_OK);
   1557 }
   1558 
   1559 
   1560 /******************************************************************************
   1561  *
   1562  * FUNCTION:    DtCompileXsdt
   1563  *
   1564  * PARAMETERS:  List                - Current field list pointer
   1565  *
   1566  * RETURN:      Status
   1567  *
   1568  * DESCRIPTION: Compile XSDT.
   1569  *
   1570  *****************************************************************************/
   1571 
   1572 ACPI_STATUS
   1573 DtCompileXsdt (
   1574     void                    **List)
   1575 {
   1576     DT_SUBTABLE             *Subtable;
   1577     DT_SUBTABLE             *ParentTable;
   1578     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   1579     UINT64                  Address;
   1580 
   1581 
   1582     ParentTable = DtPeekSubtable ();
   1583 
   1584     while (FieldList)
   1585     {
   1586         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
   1587 
   1588         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
   1589         DtInsertSubtable (ParentTable, Subtable);
   1590         FieldList = FieldList->Next;
   1591     }
   1592 
   1593     return (AE_OK);
   1594 }
   1595 
   1596 
   1597 /******************************************************************************
   1598  *
   1599  * FUNCTION:    DtCompileGeneric
   1600  *
   1601  * PARAMETERS:  List                - Current field list pointer
   1602  *              Name                - Field name to end generic compiling
   1603  *              Length              - Compiled table length to return
   1604  *
   1605  * RETURN:      Status
   1606  *
   1607  * DESCRIPTION: Compile generic unknown table.
   1608  *
   1609  *****************************************************************************/
   1610 
   1611 ACPI_STATUS
   1612 DtCompileGeneric (
   1613     void                    **List,
   1614     char                    *Name,
   1615     UINT32                  *Length)
   1616 {
   1617     ACPI_STATUS             Status;
   1618     DT_SUBTABLE             *Subtable;
   1619     DT_SUBTABLE             *ParentTable;
   1620     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1621     ACPI_DMTABLE_INFO       *Info;
   1622 
   1623 
   1624     ParentTable = DtPeekSubtable ();
   1625 
   1626     /*
   1627      * Compile the "generic" portion of the table. This
   1628      * part of the table is not predefined and any of the generic
   1629      * operators may be used.
   1630      */
   1631 
   1632     /* Find any and all labels in the entire generic portion */
   1633 
   1634     DtDetectAllLabels (*PFieldList);
   1635 
   1636     /* Now we can actually compile the parse tree */
   1637 
   1638     if (Length && *Length)
   1639     {
   1640         *Length = 0;
   1641     }
   1642     while (*PFieldList)
   1643     {
   1644         if (Name && !strcmp ((*PFieldList)->Name, Name))
   1645         {
   1646             break;
   1647         }
   1648 
   1649         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
   1650         if (!Info)
   1651         {
   1652             sprintf (MsgBuffer, "Generic data type \"%s\" not found",
   1653                 (*PFieldList)->Name);
   1654             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   1655                 (*PFieldList), MsgBuffer);
   1656 
   1657             *PFieldList = (*PFieldList)->Next;
   1658             continue;
   1659         }
   1660 
   1661         Status = DtCompileTable (PFieldList, Info,
   1662             &Subtable, TRUE);
   1663         if (ACPI_SUCCESS (Status))
   1664         {
   1665             DtInsertSubtable (ParentTable, Subtable);
   1666             if (Length)
   1667             {
   1668                 *Length += Subtable->Length;
   1669             }
   1670         }
   1671         else
   1672         {
   1673             *PFieldList = (*PFieldList)->Next;
   1674 
   1675             if (Status == AE_NOT_FOUND)
   1676             {
   1677                 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
   1678                     (*PFieldList)->Name);
   1679                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   1680                     (*PFieldList), MsgBuffer);
   1681             }
   1682         }
   1683     }
   1684 
   1685     return (AE_OK);
   1686 }
   1687