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