Home | History | Annotate | Line # | Download | only in compiler
dttable2.c revision 1.1.1.11.2.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.11  christos  * 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.11  christos  * 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.11  christos         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
    262      1.1.1.11  christos 
    263      1.1.1.11  christos             InfoTable = AcpiDmTableInfoMadt16;
    264      1.1.1.11  christos             break;
    265      1.1.1.11  christos 
    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.11  christos         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
    759      1.1.1.11  christos 
    760      1.1.1.11  christos             InfoTable = AcpiDmTableInfoPcct5;
    761      1.1.1.11  christos             break;
    762      1.1.1.11  christos 
    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.11  christos  * FUNCTION:    DtCompilePhat
    847      1.1.1.11  christos  *
    848      1.1.1.11  christos  * PARAMETERS:  List                - Current field list pointer
    849      1.1.1.11  christos  *
    850      1.1.1.11  christos  * RETURN:      Status
    851      1.1.1.11  christos  *
    852      1.1.1.11  christos  * DESCRIPTION: Compile Phat.
    853      1.1.1.11  christos  *
    854      1.1.1.11  christos  *****************************************************************************/
    855      1.1.1.11  christos 
    856      1.1.1.11  christos ACPI_STATUS
    857      1.1.1.11  christos DtCompilePhat (
    858      1.1.1.11  christos     void                    **List)
    859      1.1.1.11  christos {
    860      1.1.1.11  christos     ACPI_STATUS             Status = AE_OK;
    861      1.1.1.11  christos     DT_SUBTABLE             *Subtable;
    862      1.1.1.11  christos     DT_SUBTABLE             *ParentTable;
    863      1.1.1.11  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    864      1.1.1.11  christos     ACPI_PHAT_HEADER        *PhatHeader;
    865      1.1.1.11  christos     ACPI_DMTABLE_INFO       *Info;
    866      1.1.1.11  christos     ACPI_PHAT_VERSION_DATA  *VersionData;
    867      1.1.1.11  christos     UINT32                  RecordCount;
    868      1.1.1.11  christos 
    869      1.1.1.11  christos 
    870      1.1.1.11  christos     /* The table consist of subtables */
    871      1.1.1.11  christos 
    872      1.1.1.11  christos     while (*PFieldList)
    873      1.1.1.11  christos     {
    874      1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
    875      1.1.1.11  christos         if (ACPI_FAILURE (Status))
    876      1.1.1.11  christos         {
    877      1.1.1.11  christos             return (Status);
    878      1.1.1.11  christos         }
    879      1.1.1.11  christos 
    880      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
    881      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
    882      1.1.1.11  christos         DtPushSubtable (Subtable);
    883      1.1.1.11  christos 
    884      1.1.1.11  christos         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
    885      1.1.1.11  christos 
    886      1.1.1.11  christos         switch (PhatHeader->Type)
    887      1.1.1.11  christos         {
    888      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
    889      1.1.1.11  christos 
    890      1.1.1.11  christos             Info = AcpiDmTableInfoPhat0;
    891      1.1.1.11  christos             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
    892      1.1.1.11  christos             break;
    893      1.1.1.11  christos 
    894      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
    895      1.1.1.11  christos 
    896      1.1.1.11  christos             Info = AcpiDmTableInfoPhat1;
    897      1.1.1.11  christos             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
    898      1.1.1.11  christos             break;
    899      1.1.1.11  christos 
    900      1.1.1.11  christos         default:
    901      1.1.1.11  christos 
    902      1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
    903      1.1.1.11  christos             return (AE_ERROR);
    904      1.1.1.11  christos 
    905      1.1.1.11  christos             break;
    906      1.1.1.11  christos         }
    907      1.1.1.11  christos 
    908      1.1.1.11  christos         Status = DtCompileTable (PFieldList, Info, &Subtable);
    909      1.1.1.11  christos         if (ACPI_FAILURE (Status))
    910      1.1.1.11  christos         {
    911      1.1.1.11  christos             return (Status);
    912      1.1.1.11  christos         }
    913      1.1.1.11  christos 
    914      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
    915      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
    916      1.1.1.11  christos 
    917      1.1.1.11  christos         switch (PhatHeader->Type)
    918      1.1.1.11  christos         {
    919      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
    920      1.1.1.11  christos 
    921      1.1.1.11  christos             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
    922      1.1.1.11  christos                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
    923      1.1.1.11  christos             RecordCount = VersionData->ElementCount;
    924      1.1.1.11  christos 
    925      1.1.1.11  christos             while (RecordCount)
    926      1.1.1.11  christos             {
    927      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
    928      1.1.1.11  christos                     &Subtable);
    929      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
    930      1.1.1.11  christos                 {
    931      1.1.1.11  christos                     return (Status);
    932      1.1.1.11  christos                 }
    933      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
    934      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
    935      1.1.1.11  christos 
    936      1.1.1.11  christos                 RecordCount--;
    937      1.1.1.11  christos                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
    938      1.1.1.11  christos             }
    939      1.1.1.11  christos             break;
    940      1.1.1.11  christos 
    941      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
    942      1.1.1.11  christos 
    943      1.1.1.11  christos             /* Compile device path */
    944      1.1.1.11  christos 
    945      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
    946      1.1.1.11  christos             if (ACPI_FAILURE (Status))
    947      1.1.1.11  christos             {
    948      1.1.1.11  christos                 return (Status);
    949      1.1.1.11  christos             }
    950      1.1.1.11  christos             ParentTable = DtPeekSubtable ();
    951      1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
    952      1.1.1.11  christos 
    953      1.1.1.11  christos             PhatHeader->Length += (UINT16) Subtable->Length;
    954      1.1.1.11  christos 
    955      1.1.1.11  christos             /* Compile vendor specific data */
    956      1.1.1.11  christos 
    957      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
    958      1.1.1.11  christos             if (ACPI_FAILURE (Status))
    959      1.1.1.11  christos             {
    960      1.1.1.11  christos                 return (Status);
    961      1.1.1.11  christos             }
    962      1.1.1.11  christos             ParentTable = DtPeekSubtable ();
    963      1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
    964      1.1.1.11  christos 
    965      1.1.1.11  christos             PhatHeader->Length += (UINT16) Subtable->Length;
    966      1.1.1.11  christos 
    967      1.1.1.11  christos             break;
    968      1.1.1.11  christos 
    969      1.1.1.11  christos         default:
    970      1.1.1.11  christos 
    971      1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
    972      1.1.1.11  christos             return (AE_ERROR);
    973      1.1.1.11  christos         }
    974      1.1.1.11  christos     }
    975      1.1.1.11  christos 
    976      1.1.1.11  christos     return (Status);
    977      1.1.1.11  christos }
    978      1.1.1.11  christos 
    979      1.1.1.11  christos 
    980      1.1.1.11  christos /******************************************************************************
    981      1.1.1.11  christos  *
    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.11  christos     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.11  christos     /* Subtables */
   1017      1.1.1.11  christos 
   1018           1.1  christos     while (*PFieldList)
   1019           1.1  christos     {
   1020           1.1  christos         SubtableStart = *PFieldList;
   1021      1.1.1.11  christos         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
   1022           1.1  christos 
   1023      1.1.1.11  christos         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.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
   1030      1.1.1.11  christos 
   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.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
   1045      1.1.1.11  christos 
   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.11  christos             break;
   1054           1.1  christos 
   1055      1.1.1.11  christos         case ACPI_PMTT_TYPE_DIMM:
   1056           1.1  christos 
   1057      1.1.1.11  christos             /* Subtable: Physical Component (DIMM) Structure */
   1058           1.1  christos 
   1059      1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
   1060      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
   1061      1.1.1.11  christos                 &Subtable);
   1062      1.1.1.11  christos             if (ACPI_FAILURE (Status))
   1063      1.1.1.11  christos             {
   1064      1.1.1.11  christos                 return (Status);
   1065           1.1  christos             }
   1066      1.1.1.11  christos 
   1067           1.1  christos             break;
   1068           1.1  christos 
   1069      1.1.1.11  christos         case ACPI_PMTT_TYPE_VENDOR:
   1070           1.1  christos 
   1071      1.1.1.11  christos             /* Subtable: Vendor-specific Structure */
   1072           1.1  christos 
   1073      1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
   1074      1.1.1.11  christos             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.11  christos 
   1089      1.1.1.11  christos         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.11  christos     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.11  christos         case ACPI_PPTT_TYPE_CACHE:
   1207      1.1.1.11  christos 
   1208      1.1.1.11  christos             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
   1209      1.1.1.11  christos                 AslGbl_RootTable->Buffer);
   1210      1.1.1.11  christos             if (PpttAcpiHeader->Revision < 3)
   1211      1.1.1.11  christos             {
   1212      1.1.1.11  christos                 break;
   1213      1.1.1.11  christos             }
   1214      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
   1215      1.1.1.11  christos                 &Subtable);
   1216      1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
   1217      1.1.1.11  christos             PpttHeader->Length += (UINT8)(Subtable->Length);
   1218      1.1.1.11  christos             break;
   1219      1.1.1.11  christos 
   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.1.11.2.1   thorpej  * FUNCTION:    DtCompilePrmt
   1233  1.1.1.11.2.1   thorpej  *
   1234  1.1.1.11.2.1   thorpej  * PARAMETERS:  List                - Current field list pointer
   1235  1.1.1.11.2.1   thorpej  *
   1236  1.1.1.11.2.1   thorpej  * RETURN:      Status
   1237  1.1.1.11.2.1   thorpej  *
   1238  1.1.1.11.2.1   thorpej  * DESCRIPTION: Compile PRMT.
   1239  1.1.1.11.2.1   thorpej  *
   1240  1.1.1.11.2.1   thorpej  *****************************************************************************/
   1241  1.1.1.11.2.1   thorpej 
   1242  1.1.1.11.2.1   thorpej ACPI_STATUS
   1243  1.1.1.11.2.1   thorpej DtCompilePrmt (
   1244  1.1.1.11.2.1   thorpej     void                    **List)
   1245  1.1.1.11.2.1   thorpej {
   1246  1.1.1.11.2.1   thorpej     ACPI_STATUS             Status;
   1247  1.1.1.11.2.1   thorpej     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
   1248  1.1.1.11.2.1   thorpej     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
   1249  1.1.1.11.2.1   thorpej     DT_SUBTABLE             *Subtable;
   1250  1.1.1.11.2.1   thorpej     DT_SUBTABLE             *ParentTable;
   1251  1.1.1.11.2.1   thorpej     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1252  1.1.1.11.2.1   thorpej     UINT32                  i, j;
   1253  1.1.1.11.2.1   thorpej 
   1254  1.1.1.11.2.1   thorpej     ParentTable = DtPeekSubtable ();
   1255  1.1.1.11.2.1   thorpej 
   1256  1.1.1.11.2.1   thorpej     /* Compile PRMT subtable header */
   1257  1.1.1.11.2.1   thorpej 
   1258  1.1.1.11.2.1   thorpej     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr,
   1259  1.1.1.11.2.1   thorpej         &Subtable);
   1260  1.1.1.11.2.1   thorpej     if (ACPI_FAILURE (Status))
   1261  1.1.1.11.2.1   thorpej     {
   1262  1.1.1.11.2.1   thorpej         return (Status);
   1263  1.1.1.11.2.1   thorpej     }
   1264  1.1.1.11.2.1   thorpej     DtInsertSubtable (ParentTable, Subtable);
   1265  1.1.1.11.2.1   thorpej     PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer);
   1266  1.1.1.11.2.1   thorpej 
   1267  1.1.1.11.2.1   thorpej     for (i = 0; i < PrmtHeader->ModuleInfoCount; i++)
   1268  1.1.1.11.2.1   thorpej     {
   1269  1.1.1.11.2.1   thorpej         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule,
   1270  1.1.1.11.2.1   thorpej             &Subtable);
   1271  1.1.1.11.2.1   thorpej         if (ACPI_FAILURE (Status))
   1272  1.1.1.11.2.1   thorpej         {
   1273  1.1.1.11.2.1   thorpej             return (Status);
   1274  1.1.1.11.2.1   thorpej         }
   1275  1.1.1.11.2.1   thorpej         DtInsertSubtable (ParentTable, Subtable);
   1276  1.1.1.11.2.1   thorpej         PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer);
   1277  1.1.1.11.2.1   thorpej 
   1278  1.1.1.11.2.1   thorpej         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++)
   1279  1.1.1.11.2.1   thorpej         {
   1280  1.1.1.11.2.1   thorpej             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler,
   1281  1.1.1.11.2.1   thorpej                 &Subtable);
   1282  1.1.1.11.2.1   thorpej             if (ACPI_FAILURE (Status))
   1283  1.1.1.11.2.1   thorpej             {
   1284  1.1.1.11.2.1   thorpej                 return (Status);
   1285  1.1.1.11.2.1   thorpej             }
   1286  1.1.1.11.2.1   thorpej             DtInsertSubtable (ParentTable, Subtable);
   1287  1.1.1.11.2.1   thorpej         }
   1288  1.1.1.11.2.1   thorpej     }
   1289  1.1.1.11.2.1   thorpej 
   1290  1.1.1.11.2.1   thorpej     return (AE_OK);
   1291  1.1.1.11.2.1   thorpej }
   1292  1.1.1.11.2.1   thorpej 
   1293  1.1.1.11.2.1   thorpej 
   1294  1.1.1.11.2.1   thorpej /******************************************************************************
   1295  1.1.1.11.2.1   thorpej  *
   1296  1.1.1.11.2.1   thorpej  * FUNCTION:    DtCompileRgrt
   1297  1.1.1.11.2.1   thorpej  *
   1298  1.1.1.11.2.1   thorpej  * PARAMETERS:  List                - Current field list pointer
   1299  1.1.1.11.2.1   thorpej  *
   1300  1.1.1.11.2.1   thorpej  * RETURN:      Status
   1301  1.1.1.11.2.1   thorpej  *
   1302  1.1.1.11.2.1   thorpej  * DESCRIPTION: Compile RGRT.
   1303  1.1.1.11.2.1   thorpej  *
   1304  1.1.1.11.2.1   thorpej  *****************************************************************************/
   1305  1.1.1.11.2.1   thorpej 
   1306  1.1.1.11.2.1   thorpej ACPI_STATUS
   1307  1.1.1.11.2.1   thorpej DtCompileRgrt (
   1308  1.1.1.11.2.1   thorpej     void                    **List)
   1309  1.1.1.11.2.1   thorpej {
   1310  1.1.1.11.2.1   thorpej     ACPI_STATUS             Status;
   1311  1.1.1.11.2.1   thorpej     DT_SUBTABLE             *Subtable;
   1312  1.1.1.11.2.1   thorpej     DT_SUBTABLE             *ParentTable;
   1313  1.1.1.11.2.1   thorpej     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1314  1.1.1.11.2.1   thorpej 
   1315  1.1.1.11.2.1   thorpej 
   1316  1.1.1.11.2.1   thorpej     /* Compile the main table */
   1317  1.1.1.11.2.1   thorpej 
   1318  1.1.1.11.2.1   thorpej     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt,
   1319  1.1.1.11.2.1   thorpej         &Subtable);
   1320  1.1.1.11.2.1   thorpej     if (ACPI_FAILURE (Status))
   1321  1.1.1.11.2.1   thorpej     {
   1322  1.1.1.11.2.1   thorpej         return (Status);
   1323  1.1.1.11.2.1   thorpej     }
   1324  1.1.1.11.2.1   thorpej 
   1325  1.1.1.11.2.1   thorpej     ParentTable = DtPeekSubtable ();
   1326  1.1.1.11.2.1   thorpej     DtInsertSubtable (ParentTable, Subtable);
   1327  1.1.1.11.2.1   thorpej 
   1328  1.1.1.11.2.1   thorpej     /* Compile the "Subtable" -- actually just the binary (PNG) image */
   1329  1.1.1.11.2.1   thorpej 
   1330  1.1.1.11.2.1   thorpej     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0,
   1331  1.1.1.11.2.1   thorpej         &Subtable);
   1332  1.1.1.11.2.1   thorpej     if (ACPI_FAILURE (Status))
   1333  1.1.1.11.2.1   thorpej     {
   1334  1.1.1.11.2.1   thorpej         return (Status);
   1335  1.1.1.11.2.1   thorpej     }
   1336  1.1.1.11.2.1   thorpej 
   1337  1.1.1.11.2.1   thorpej     DtInsertSubtable (ParentTable, Subtable);
   1338  1.1.1.11.2.1   thorpej     return (AE_OK);
   1339  1.1.1.11.2.1   thorpej }
   1340  1.1.1.11.2.1   thorpej 
   1341  1.1.1.11.2.1   thorpej 
   1342  1.1.1.11.2.1   thorpej /******************************************************************************
   1343  1.1.1.11.2.1   thorpej  *
   1344           1.1  christos  * FUNCTION:    DtCompileRsdt
   1345           1.1  christos  *
   1346           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1347           1.1  christos  *
   1348           1.1  christos  * RETURN:      Status
   1349           1.1  christos  *
   1350           1.1  christos  * DESCRIPTION: Compile RSDT.
   1351           1.1  christos  *
   1352           1.1  christos  *****************************************************************************/
   1353           1.1  christos 
   1354           1.1  christos ACPI_STATUS
   1355           1.1  christos DtCompileRsdt (
   1356           1.1  christos     void                    **List)
   1357           1.1  christos {
   1358           1.1  christos     DT_SUBTABLE             *Subtable;
   1359           1.1  christos     DT_SUBTABLE             *ParentTable;
   1360           1.1  christos     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   1361           1.1  christos     UINT32                  Address;
   1362           1.1  christos 
   1363           1.1  christos 
   1364           1.1  christos     ParentTable = DtPeekSubtable ();
   1365           1.1  christos 
   1366           1.1  christos     while (FieldList)
   1367           1.1  christos     {
   1368           1.1  christos         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
   1369           1.1  christos 
   1370           1.1  christos         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
   1371           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1372           1.1  christos         FieldList = FieldList->Next;
   1373           1.1  christos     }
   1374           1.1  christos 
   1375           1.1  christos     return (AE_OK);
   1376           1.1  christos }
   1377           1.1  christos 
   1378           1.1  christos 
   1379           1.1  christos /******************************************************************************
   1380           1.1  christos  *
   1381           1.1  christos  * FUNCTION:    DtCompileS3pt
   1382           1.1  christos  *
   1383           1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   1384           1.1  christos  *
   1385           1.1  christos  * RETURN:      Status
   1386           1.1  christos  *
   1387           1.1  christos  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
   1388           1.1  christos  *
   1389           1.1  christos  *****************************************************************************/
   1390           1.1  christos 
   1391           1.1  christos ACPI_STATUS
   1392           1.1  christos DtCompileS3pt (
   1393           1.1  christos     DT_FIELD                **PFieldList)
   1394           1.1  christos {
   1395           1.1  christos     ACPI_STATUS             Status;
   1396       1.1.1.2  christos     ACPI_FPDT_HEADER        *S3ptHeader;
   1397           1.1  christos     DT_SUBTABLE             *Subtable;
   1398           1.1  christos     DT_SUBTABLE             *ParentTable;
   1399           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1400           1.1  christos     DT_FIELD                *SubtableStart;
   1401           1.1  christos 
   1402           1.1  christos 
   1403           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
   1404       1.1.1.7  christos         &AslGbl_RootTable);
   1405           1.1  christos     if (ACPI_FAILURE (Status))
   1406           1.1  christos     {
   1407           1.1  christos         return (Status);
   1408           1.1  christos     }
   1409           1.1  christos 
   1410       1.1.1.7  christos     DtPushSubtable (AslGbl_RootTable);
   1411           1.1  christos 
   1412           1.1  christos     while (*PFieldList)
   1413           1.1  christos     {
   1414           1.1  christos         SubtableStart = *PFieldList;
   1415           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
   1416       1.1.1.6  christos             &Subtable);
   1417           1.1  christos         if (ACPI_FAILURE (Status))
   1418           1.1  christos         {
   1419           1.1  christos             return (Status);
   1420           1.1  christos         }
   1421           1.1  christos 
   1422           1.1  christos         ParentTable = DtPeekSubtable ();
   1423           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1424           1.1  christos         DtPushSubtable (Subtable);
   1425           1.1  christos 
   1426       1.1.1.2  christos         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
   1427           1.1  christos 
   1428           1.1  christos         switch (S3ptHeader->Type)
   1429           1.1  christos         {
   1430           1.1  christos         case ACPI_S3PT_TYPE_RESUME:
   1431           1.1  christos 
   1432           1.1  christos             InfoTable = AcpiDmTableInfoS3pt0;
   1433           1.1  christos             break;
   1434           1.1  christos 
   1435           1.1  christos         case ACPI_S3PT_TYPE_SUSPEND:
   1436           1.1  christos 
   1437           1.1  christos             InfoTable = AcpiDmTableInfoS3pt1;
   1438           1.1  christos             break;
   1439           1.1  christos 
   1440           1.1  christos         default:
   1441           1.1  christos 
   1442           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
   1443           1.1  christos             return (AE_ERROR);
   1444           1.1  christos         }
   1445           1.1  christos 
   1446       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1447           1.1  christos         if (ACPI_FAILURE (Status))
   1448           1.1  christos         {
   1449           1.1  christos             return (Status);
   1450           1.1  christos         }
   1451           1.1  christos 
   1452           1.1  christos         ParentTable = DtPeekSubtable ();
   1453           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1454           1.1  christos         DtPopSubtable ();
   1455           1.1  christos     }
   1456           1.1  christos 
   1457           1.1  christos     return (AE_OK);
   1458           1.1  christos }
   1459           1.1  christos 
   1460           1.1  christos 
   1461           1.1  christos /******************************************************************************
   1462           1.1  christos  *
   1463       1.1.1.5  christos  * FUNCTION:    DtCompileSdev
   1464       1.1.1.5  christos  *
   1465       1.1.1.5  christos  * PARAMETERS:  List                - Current field list pointer
   1466       1.1.1.5  christos  *
   1467       1.1.1.5  christos  * RETURN:      Status
   1468       1.1.1.5  christos  *
   1469       1.1.1.5  christos  * DESCRIPTION: Compile SDEV.
   1470       1.1.1.5  christos  *
   1471       1.1.1.5  christos  *****************************************************************************/
   1472       1.1.1.5  christos 
   1473       1.1.1.5  christos ACPI_STATUS
   1474       1.1.1.5  christos DtCompileSdev (
   1475       1.1.1.5  christos     void                    **List)
   1476       1.1.1.5  christos {
   1477      1.1.1.11  christos     ACPI_STATUS                 Status;
   1478      1.1.1.11  christos     ACPI_SDEV_HEADER            *SdevHeader;
   1479      1.1.1.11  christos     ACPI_SDEV_HEADER            *SecureComponentHeader;
   1480      1.1.1.11  christos     DT_SUBTABLE                 *Subtable;
   1481      1.1.1.11  christos     DT_SUBTABLE                 *ParentTable;
   1482      1.1.1.11  christos     ACPI_DMTABLE_INFO           *InfoTable;
   1483      1.1.1.11  christos     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
   1484      1.1.1.11  christos     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
   1485      1.1.1.11  christos     DT_FIELD                    *SubtableStart;
   1486      1.1.1.11  christos     ACPI_SDEV_PCIE              *Pcie = NULL;
   1487      1.1.1.11  christos     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
   1488      1.1.1.11  christos     UINT32                      EntryCount;
   1489      1.1.1.11  christos     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
   1490      1.1.1.11  christos     UINT16                      ComponentLength = 0;
   1491       1.1.1.5  christos 
   1492       1.1.1.5  christos 
   1493       1.1.1.5  christos     /* Subtables */
   1494       1.1.1.5  christos 
   1495       1.1.1.5  christos     while (*PFieldList)
   1496       1.1.1.5  christos     {
   1497       1.1.1.5  christos         /* Compile common SDEV subtable header */
   1498       1.1.1.5  christos 
   1499       1.1.1.5  christos         SubtableStart = *PFieldList;
   1500       1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
   1501       1.1.1.6  christos             &Subtable);
   1502       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   1503       1.1.1.5  christos         {
   1504       1.1.1.5  christos             return (Status);
   1505       1.1.1.5  christos         }
   1506       1.1.1.5  christos 
   1507       1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   1508       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   1509       1.1.1.5  christos         DtPushSubtable (Subtable);
   1510       1.1.1.5  christos 
   1511       1.1.1.5  christos         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   1512       1.1.1.5  christos         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
   1513       1.1.1.5  christos 
   1514       1.1.1.5  christos         switch (SdevHeader->Type)
   1515       1.1.1.5  christos         {
   1516       1.1.1.5  christos         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   1517       1.1.1.5  christos 
   1518       1.1.1.5  christos             InfoTable = AcpiDmTableInfoSdev0;
   1519       1.1.1.5  christos             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
   1520      1.1.1.11  christos             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
   1521      1.1.1.11  christos                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
   1522       1.1.1.5  christos             break;
   1523       1.1.1.5  christos 
   1524       1.1.1.5  christos         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   1525       1.1.1.5  christos 
   1526       1.1.1.5  christos             InfoTable = AcpiDmTableInfoSdev1;
   1527       1.1.1.5  christos             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
   1528       1.1.1.5  christos             break;
   1529       1.1.1.5  christos 
   1530       1.1.1.5  christos         default:
   1531       1.1.1.5  christos 
   1532       1.1.1.5  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   1533       1.1.1.5  christos             return (AE_ERROR);
   1534       1.1.1.5  christos         }
   1535       1.1.1.5  christos 
   1536       1.1.1.5  christos         /* Compile SDEV subtable body */
   1537       1.1.1.5  christos 
   1538       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1539       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   1540       1.1.1.5  christos         {
   1541       1.1.1.5  christos             return (Status);
   1542       1.1.1.5  christos         }
   1543       1.1.1.5  christos 
   1544       1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   1545       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   1546       1.1.1.5  christos 
   1547       1.1.1.5  christos         /* Optional data fields are appended to the main subtable body */
   1548       1.1.1.5  christos 
   1549       1.1.1.5  christos         switch (SdevHeader->Type)
   1550       1.1.1.5  christos         {
   1551       1.1.1.5  christos         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   1552       1.1.1.5  christos 
   1553      1.1.1.11  christos             /*
   1554      1.1.1.11  christos              * Device Id Offset will be be calculated differently depending on
   1555      1.1.1.11  christos              * the presence of secure access components.
   1556      1.1.1.11  christos              */
   1557      1.1.1.11  christos             Namesp->DeviceIdOffset = 0;
   1558      1.1.1.11  christos             ComponentLength = 0;
   1559      1.1.1.11  christos 
   1560      1.1.1.11  christos             /* If the secure access component exists, get the structures */
   1561      1.1.1.11  christos 
   1562      1.1.1.11  christos             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
   1563      1.1.1.11  christos             {
   1564      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
   1565      1.1.1.11  christos                     &Subtable);
   1566      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   1567      1.1.1.11  christos                 {
   1568      1.1.1.11  christos                     return (Status);
   1569      1.1.1.11  christos                 }
   1570      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   1571      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   1572      1.1.1.11  christos 
   1573      1.1.1.11  christos                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   1574      1.1.1.11  christos 
   1575      1.1.1.11  christos                 /* Compile a secure access component header */
   1576      1.1.1.11  christos 
   1577      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
   1578      1.1.1.11  christos                     &Subtable);
   1579      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   1580      1.1.1.11  christos                 {
   1581      1.1.1.11  christos                     return (Status);
   1582      1.1.1.11  christos                 }
   1583      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   1584      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   1585      1.1.1.11  christos 
   1586      1.1.1.11  christos                 /* Compile the secure access component */
   1587      1.1.1.11  christos 
   1588      1.1.1.11  christos                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   1589      1.1.1.11  christos                 switch (SecureComponentHeader->Type)
   1590      1.1.1.11  christos                 {
   1591      1.1.1.11  christos                 case ACPI_SDEV_TYPE_ID_COMPONENT:
   1592      1.1.1.11  christos 
   1593      1.1.1.11  christos                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
   1594      1.1.1.11  christos                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
   1595      1.1.1.11  christos                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
   1596      1.1.1.11  christos                     break;
   1597      1.1.1.11  christos 
   1598      1.1.1.11  christos                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
   1599      1.1.1.11  christos 
   1600      1.1.1.11  christos                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
   1601      1.1.1.11  christos                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
   1602      1.1.1.11  christos                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
   1603      1.1.1.11  christos                     break;
   1604      1.1.1.11  christos 
   1605      1.1.1.11  christos                 default:
   1606      1.1.1.11  christos 
   1607      1.1.1.11  christos                     /* Any other secure component types are undefined */
   1608      1.1.1.11  christos 
   1609      1.1.1.11  christos                     return (AE_ERROR);
   1610      1.1.1.11  christos                 }
   1611      1.1.1.11  christos 
   1612      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
   1613      1.1.1.11  christos                     &Subtable);
   1614      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   1615      1.1.1.11  christos                 {
   1616      1.1.1.11  christos                     return (Status);
   1617      1.1.1.11  christos                 }
   1618      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   1619      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   1620      1.1.1.11  christos 
   1621      1.1.1.11  christos                 SecureComponent->SecureComponentOffset =
   1622      1.1.1.11  christos                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
   1623      1.1.1.11  christos                 SecureComponent->SecureComponentLength = ComponentLength;
   1624      1.1.1.11  christos 
   1625      1.1.1.11  christos 
   1626      1.1.1.11  christos                 /*
   1627      1.1.1.11  christos                  * Add the secure component to the subtable to be added for the
   1628      1.1.1.11  christos                  * the namespace subtable's length
   1629      1.1.1.11  christos                  */
   1630      1.1.1.11  christos                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   1631      1.1.1.11  christos             }
   1632      1.1.1.11  christos 
   1633       1.1.1.5  christos             /* Append DeviceId namespace string */
   1634       1.1.1.5  christos 
   1635       1.1.1.5  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
   1636       1.1.1.6  christos                 &Subtable);
   1637       1.1.1.5  christos             if (ACPI_FAILURE (Status))
   1638       1.1.1.5  christos             {
   1639       1.1.1.5  christos                 return (Status);
   1640       1.1.1.5  christos             }
   1641       1.1.1.5  christos 
   1642       1.1.1.5  christos             if (!Subtable)
   1643       1.1.1.5  christos             {
   1644       1.1.1.5  christos                 break;
   1645       1.1.1.5  christos             }
   1646       1.1.1.5  christos 
   1647       1.1.1.5  christos             ParentTable = DtPeekSubtable ();
   1648       1.1.1.5  christos             DtInsertSubtable (ParentTable, Subtable);
   1649       1.1.1.5  christos 
   1650      1.1.1.11  christos             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
   1651      1.1.1.11  christos 
   1652       1.1.1.5  christos             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
   1653       1.1.1.5  christos 
   1654       1.1.1.5  christos             /* Append Vendor data */
   1655       1.1.1.5  christos 
   1656       1.1.1.5  christos             Namesp->VendorDataLength = 0;
   1657       1.1.1.5  christos             Namesp->VendorDataOffset = 0;
   1658       1.1.1.5  christos 
   1659       1.1.1.5  christos             if (*PFieldList)
   1660       1.1.1.5  christos             {
   1661       1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   1662       1.1.1.6  christos                     &Subtable);
   1663       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   1664       1.1.1.5  christos                 {
   1665       1.1.1.5  christos                     return (Status);
   1666       1.1.1.5  christos                 }
   1667       1.1.1.5  christos 
   1668       1.1.1.5  christos                 if (Subtable)
   1669       1.1.1.5  christos                 {
   1670       1.1.1.5  christos                     ParentTable = DtPeekSubtable ();
   1671       1.1.1.5  christos                     DtInsertSubtable (ParentTable, Subtable);
   1672       1.1.1.5  christos 
   1673       1.1.1.5  christos                     Namesp->VendorDataOffset =
   1674       1.1.1.5  christos                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
   1675       1.1.1.5  christos                     Namesp->VendorDataLength =
   1676       1.1.1.5  christos                         (UINT16) Subtable->Length;
   1677       1.1.1.9  christos 
   1678       1.1.1.9  christos                     /* Final size of entire namespace structure */
   1679       1.1.1.9  christos 
   1680       1.1.1.9  christos                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
   1681      1.1.1.11  christos                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
   1682       1.1.1.5  christos                 }
   1683       1.1.1.5  christos             }
   1684       1.1.1.5  christos 
   1685       1.1.1.5  christos             break;
   1686       1.1.1.5  christos 
   1687       1.1.1.5  christos         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   1688       1.1.1.5  christos 
   1689       1.1.1.5  christos             /* Append the PCIe path info first */
   1690       1.1.1.5  christos 
   1691       1.1.1.5  christos             EntryCount = 0;
   1692       1.1.1.5  christos             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
   1693       1.1.1.5  christos             {
   1694       1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
   1695       1.1.1.6  christos                     &Subtable);
   1696       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   1697       1.1.1.5  christos                 {
   1698       1.1.1.5  christos                     return (Status);
   1699       1.1.1.5  christos                 }
   1700       1.1.1.5  christos 
   1701       1.1.1.5  christos                 if (!Subtable)
   1702       1.1.1.5  christos                 {
   1703       1.1.1.5  christos                     DtPopSubtable ();
   1704       1.1.1.5  christos                     break;
   1705       1.1.1.5  christos                 }
   1706       1.1.1.5  christos 
   1707       1.1.1.5  christos                 ParentTable = DtPeekSubtable ();
   1708       1.1.1.5  christos                 DtInsertSubtable (ParentTable, Subtable);
   1709       1.1.1.5  christos                 EntryCount++;
   1710       1.1.1.5  christos             }
   1711       1.1.1.5  christos 
   1712       1.1.1.5  christos             /* Path offset will point immediately after the main subtable */
   1713       1.1.1.5  christos 
   1714       1.1.1.5  christos             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
   1715       1.1.1.5  christos             Pcie->PathLength = (UINT16)
   1716       1.1.1.5  christos                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
   1717       1.1.1.5  christos 
   1718       1.1.1.5  christos             /* Append the Vendor Data last */
   1719       1.1.1.5  christos 
   1720       1.1.1.5  christos             Pcie->VendorDataLength = 0;
   1721       1.1.1.5  christos             Pcie->VendorDataOffset = 0;
   1722       1.1.1.5  christos 
   1723       1.1.1.5  christos             if (*PFieldList)
   1724       1.1.1.5  christos             {
   1725       1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   1726       1.1.1.6  christos                     &Subtable);
   1727       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   1728       1.1.1.5  christos                 {
   1729       1.1.1.5  christos                     return (Status);
   1730       1.1.1.5  christos                 }
   1731       1.1.1.5  christos 
   1732       1.1.1.5  christos                 if (Subtable)
   1733       1.1.1.5  christos                 {
   1734       1.1.1.5  christos                     ParentTable = DtPeekSubtable ();
   1735       1.1.1.5  christos                     DtInsertSubtable (ParentTable, Subtable);
   1736       1.1.1.5  christos 
   1737       1.1.1.5  christos                     Pcie->VendorDataOffset =
   1738       1.1.1.5  christos                         Pcie->PathOffset + Pcie->PathLength;
   1739       1.1.1.5  christos                     Pcie->VendorDataLength = (UINT16)
   1740       1.1.1.5  christos                         Subtable->Length;
   1741       1.1.1.5  christos                 }
   1742       1.1.1.5  christos             }
   1743       1.1.1.5  christos 
   1744       1.1.1.5  christos             SdevHeader->Length =
   1745       1.1.1.5  christos                 sizeof (ACPI_SDEV_PCIE) +
   1746       1.1.1.5  christos                 Pcie->PathLength + Pcie->VendorDataLength;
   1747       1.1.1.5  christos             break;
   1748       1.1.1.5  christos 
   1749       1.1.1.5  christos         default:
   1750       1.1.1.5  christos 
   1751       1.1.1.5  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   1752       1.1.1.5  christos             return (AE_ERROR);
   1753       1.1.1.5  christos         }
   1754       1.1.1.5  christos 
   1755       1.1.1.5  christos         DtPopSubtable ();
   1756       1.1.1.5  christos     }
   1757       1.1.1.5  christos 
   1758       1.1.1.5  christos     return (AE_OK);
   1759       1.1.1.5  christos }
   1760       1.1.1.5  christos 
   1761       1.1.1.5  christos 
   1762       1.1.1.5  christos /******************************************************************************
   1763       1.1.1.5  christos  *
   1764           1.1  christos  * FUNCTION:    DtCompileSlic
   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 SLIC.
   1771           1.1  christos  *
   1772           1.1  christos  *****************************************************************************/
   1773           1.1  christos 
   1774           1.1  christos ACPI_STATUS
   1775           1.1  christos DtCompileSlic (
   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 
   1783           1.1  christos 
   1784           1.1  christos     while (*PFieldList)
   1785           1.1  christos     {
   1786           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
   1787       1.1.1.6  christos             &Subtable);
   1788           1.1  christos         if (ACPI_FAILURE (Status))
   1789           1.1  christos         {
   1790           1.1  christos             return (Status);
   1791           1.1  christos         }
   1792           1.1  christos 
   1793           1.1  christos         ParentTable = DtPeekSubtable ();
   1794           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1795           1.1  christos         DtPushSubtable (Subtable);
   1796           1.1  christos         DtPopSubtable ();
   1797           1.1  christos     }
   1798           1.1  christos 
   1799           1.1  christos     return (AE_OK);
   1800           1.1  christos }
   1801           1.1  christos 
   1802           1.1  christos 
   1803           1.1  christos /******************************************************************************
   1804           1.1  christos  *
   1805           1.1  christos  * FUNCTION:    DtCompileSlit
   1806           1.1  christos  *
   1807           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1808           1.1  christos  *
   1809           1.1  christos  * RETURN:      Status
   1810           1.1  christos  *
   1811           1.1  christos  * DESCRIPTION: Compile SLIT.
   1812           1.1  christos  *
   1813           1.1  christos  *****************************************************************************/
   1814           1.1  christos 
   1815           1.1  christos ACPI_STATUS
   1816           1.1  christos DtCompileSlit (
   1817           1.1  christos     void                    **List)
   1818           1.1  christos {
   1819           1.1  christos     ACPI_STATUS             Status;
   1820           1.1  christos     DT_SUBTABLE             *Subtable;
   1821           1.1  christos     DT_SUBTABLE             *ParentTable;
   1822           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1823           1.1  christos     DT_FIELD                *FieldList;
   1824       1.1.1.9  christos     DT_FIELD                *EndOfFieldList = NULL;
   1825           1.1  christos     UINT32                  Localities;
   1826       1.1.1.9  christos     UINT32                  LocalityListLength;
   1827           1.1  christos     UINT8                   *LocalityBuffer;
   1828           1.1  christos 
   1829           1.1  christos 
   1830           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
   1831       1.1.1.6  christos         &Subtable);
   1832           1.1  christos     if (ACPI_FAILURE (Status))
   1833           1.1  christos     {
   1834           1.1  christos         return (Status);
   1835           1.1  christos     }
   1836           1.1  christos 
   1837           1.1  christos     ParentTable = DtPeekSubtable ();
   1838           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1839           1.1  christos 
   1840           1.1  christos     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
   1841           1.1  christos     LocalityBuffer = UtLocalCalloc (Localities);
   1842       1.1.1.9  christos     LocalityListLength = 0;
   1843           1.1  christos 
   1844           1.1  christos     /* Compile each locality buffer */
   1845           1.1  christos 
   1846           1.1  christos     FieldList = *PFieldList;
   1847           1.1  christos     while (FieldList)
   1848           1.1  christos     {
   1849           1.1  christos         DtCompileBuffer (LocalityBuffer,
   1850           1.1  christos             FieldList->Value, FieldList, Localities);
   1851           1.1  christos 
   1852       1.1.1.9  christos         LocalityListLength++;
   1853           1.1  christos         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
   1854           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1855       1.1.1.9  christos         EndOfFieldList = FieldList;
   1856           1.1  christos         FieldList = FieldList->Next;
   1857           1.1  christos     }
   1858           1.1  christos 
   1859       1.1.1.9  christos     if (LocalityListLength != Localities)
   1860       1.1.1.9  christos     {
   1861       1.1.1.9  christos         sprintf(AslGbl_MsgBuffer,
   1862       1.1.1.9  christos             "Found %u entries, must match LocalityCount: %u",
   1863       1.1.1.9  christos             LocalityListLength, Localities);
   1864       1.1.1.9  christos         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
   1865       1.1.1.9  christos         ACPI_FREE (LocalityBuffer);
   1866       1.1.1.9  christos         return (AE_LIMIT);
   1867       1.1.1.9  christos     }
   1868       1.1.1.9  christos 
   1869           1.1  christos     ACPI_FREE (LocalityBuffer);
   1870           1.1  christos     return (AE_OK);
   1871           1.1  christos }
   1872           1.1  christos 
   1873           1.1  christos 
   1874           1.1  christos /******************************************************************************
   1875           1.1  christos  *
   1876           1.1  christos  * FUNCTION:    DtCompileSrat
   1877           1.1  christos  *
   1878           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1879           1.1  christos  *
   1880           1.1  christos  * RETURN:      Status
   1881           1.1  christos  *
   1882           1.1  christos  * DESCRIPTION: Compile SRAT.
   1883           1.1  christos  *
   1884           1.1  christos  *****************************************************************************/
   1885           1.1  christos 
   1886           1.1  christos ACPI_STATUS
   1887           1.1  christos DtCompileSrat (
   1888           1.1  christos     void                    **List)
   1889           1.1  christos {
   1890           1.1  christos     ACPI_STATUS             Status;
   1891           1.1  christos     DT_SUBTABLE             *Subtable;
   1892           1.1  christos     DT_SUBTABLE             *ParentTable;
   1893           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1894           1.1  christos     DT_FIELD                *SubtableStart;
   1895           1.1  christos     ACPI_SUBTABLE_HEADER    *SratHeader;
   1896           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1897           1.1  christos 
   1898           1.1  christos 
   1899           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
   1900       1.1.1.6  christos         &Subtable);
   1901           1.1  christos     if (ACPI_FAILURE (Status))
   1902           1.1  christos     {
   1903           1.1  christos         return (Status);
   1904           1.1  christos     }
   1905           1.1  christos 
   1906           1.1  christos     ParentTable = DtPeekSubtable ();
   1907           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1908           1.1  christos 
   1909           1.1  christos     while (*PFieldList)
   1910           1.1  christos     {
   1911           1.1  christos         SubtableStart = *PFieldList;
   1912           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
   1913       1.1.1.6  christos             &Subtable);
   1914           1.1  christos         if (ACPI_FAILURE (Status))
   1915           1.1  christos         {
   1916           1.1  christos             return (Status);
   1917           1.1  christos         }
   1918           1.1  christos 
   1919           1.1  christos         ParentTable = DtPeekSubtable ();
   1920           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1921           1.1  christos         DtPushSubtable (Subtable);
   1922           1.1  christos 
   1923           1.1  christos         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1924           1.1  christos 
   1925           1.1  christos         switch (SratHeader->Type)
   1926           1.1  christos         {
   1927           1.1  christos         case ACPI_SRAT_TYPE_CPU_AFFINITY:
   1928           1.1  christos 
   1929           1.1  christos             InfoTable = AcpiDmTableInfoSrat0;
   1930           1.1  christos             break;
   1931           1.1  christos 
   1932           1.1  christos         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   1933           1.1  christos 
   1934           1.1  christos             InfoTable = AcpiDmTableInfoSrat1;
   1935           1.1  christos             break;
   1936           1.1  christos 
   1937           1.1  christos         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   1938           1.1  christos 
   1939           1.1  christos             InfoTable = AcpiDmTableInfoSrat2;
   1940           1.1  christos             break;
   1941           1.1  christos 
   1942           1.1  christos         case ACPI_SRAT_TYPE_GICC_AFFINITY:
   1943           1.1  christos 
   1944           1.1  christos             InfoTable = AcpiDmTableInfoSrat3;
   1945           1.1  christos             break;
   1946           1.1  christos 
   1947       1.1.1.4  christos         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
   1948       1.1.1.4  christos 
   1949       1.1.1.4  christos             InfoTable = AcpiDmTableInfoSrat4;
   1950       1.1.1.4  christos             break;
   1951       1.1.1.4  christos 
   1952       1.1.1.8  christos         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
   1953       1.1.1.8  christos 
   1954       1.1.1.8  christos             InfoTable = AcpiDmTableInfoSrat5;
   1955       1.1.1.8  christos             break;
   1956       1.1.1.8  christos 
   1957           1.1  christos         default:
   1958           1.1  christos 
   1959           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
   1960           1.1  christos             return (AE_ERROR);
   1961           1.1  christos         }
   1962           1.1  christos 
   1963       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1964           1.1  christos         if (ACPI_FAILURE (Status))
   1965           1.1  christos         {
   1966           1.1  christos             return (Status);
   1967           1.1  christos         }
   1968           1.1  christos 
   1969           1.1  christos         ParentTable = DtPeekSubtable ();
   1970           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1971           1.1  christos         DtPopSubtable ();
   1972           1.1  christos     }
   1973           1.1  christos 
   1974           1.1  christos     return (AE_OK);
   1975           1.1  christos }
   1976           1.1  christos 
   1977           1.1  christos 
   1978           1.1  christos /******************************************************************************
   1979           1.1  christos  *
   1980           1.1  christos  * FUNCTION:    DtCompileStao
   1981           1.1  christos  *
   1982           1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   1983           1.1  christos  *
   1984           1.1  christos  * RETURN:      Status
   1985           1.1  christos  *
   1986           1.1  christos  * DESCRIPTION: Compile STAO.
   1987           1.1  christos  *
   1988           1.1  christos  *****************************************************************************/
   1989           1.1  christos 
   1990           1.1  christos ACPI_STATUS
   1991           1.1  christos DtCompileStao (
   1992           1.1  christos     void                    **List)
   1993           1.1  christos {
   1994           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1995           1.1  christos     DT_SUBTABLE             *Subtable;
   1996           1.1  christos     DT_SUBTABLE             *ParentTable;
   1997           1.1  christos     ACPI_STATUS             Status;
   1998           1.1  christos 
   1999           1.1  christos 
   2000           1.1  christos     /* Compile the main table */
   2001           1.1  christos 
   2002           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
   2003       1.1.1.6  christos         &Subtable);
   2004           1.1  christos     if (ACPI_FAILURE (Status))
   2005           1.1  christos     {
   2006           1.1  christos         return (Status);
   2007           1.1  christos     }
   2008           1.1  christos 
   2009           1.1  christos     ParentTable = DtPeekSubtable ();
   2010           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2011           1.1  christos 
   2012           1.1  christos     /* Compile each ASCII namestring as a subtable */
   2013           1.1  christos 
   2014           1.1  christos     while (*PFieldList)
   2015           1.1  christos     {
   2016           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
   2017       1.1.1.6  christos             &Subtable);
   2018           1.1  christos         if (ACPI_FAILURE (Status))
   2019           1.1  christos         {
   2020           1.1  christos             return (Status);
   2021           1.1  christos         }
   2022           1.1  christos 
   2023           1.1  christos         ParentTable = DtPeekSubtable ();
   2024           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2025           1.1  christos     }
   2026           1.1  christos 
   2027           1.1  christos     return (AE_OK);
   2028           1.1  christos }
   2029           1.1  christos 
   2030           1.1  christos 
   2031  1.1.1.11.2.1   thorpej 
   2032  1.1.1.11.2.1   thorpej /******************************************************************************
   2033  1.1.1.11.2.1   thorpej  *
   2034  1.1.1.11.2.1   thorpej  * FUNCTION:    DtCompileSvkl
   2035  1.1.1.11.2.1   thorpej  *
   2036  1.1.1.11.2.1   thorpej  * PARAMETERS:  PFieldList          - Current field list pointer
   2037  1.1.1.11.2.1   thorpej  *
   2038  1.1.1.11.2.1   thorpej  * RETURN:      Status
   2039  1.1.1.11.2.1   thorpej  *
   2040  1.1.1.11.2.1   thorpej  * DESCRIPTION: Compile SVKL.
   2041  1.1.1.11.2.1   thorpej  *
   2042  1.1.1.11.2.1   thorpej  * NOTES: SVKL is essentially a flat table, with a small main table and
   2043  1.1.1.11.2.1   thorpej  *          a variable number of a single type of subtable.
   2044  1.1.1.11.2.1   thorpej  *
   2045  1.1.1.11.2.1   thorpej  *****************************************************************************/
   2046  1.1.1.11.2.1   thorpej 
   2047  1.1.1.11.2.1   thorpej ACPI_STATUS
   2048  1.1.1.11.2.1   thorpej DtCompileSvkl (
   2049  1.1.1.11.2.1   thorpej     void                    **List)
   2050  1.1.1.11.2.1   thorpej {
   2051  1.1.1.11.2.1   thorpej     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2052  1.1.1.11.2.1   thorpej     DT_SUBTABLE             *Subtable;
   2053  1.1.1.11.2.1   thorpej     DT_SUBTABLE             *ParentTable;
   2054  1.1.1.11.2.1   thorpej     ACPI_STATUS             Status;
   2055  1.1.1.11.2.1   thorpej 
   2056  1.1.1.11.2.1   thorpej 
   2057  1.1.1.11.2.1   thorpej     /* Compile the main table */
   2058  1.1.1.11.2.1   thorpej 
   2059  1.1.1.11.2.1   thorpej     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
   2060  1.1.1.11.2.1   thorpej         &Subtable);
   2061  1.1.1.11.2.1   thorpej     if (ACPI_FAILURE (Status))
   2062  1.1.1.11.2.1   thorpej     {
   2063  1.1.1.11.2.1   thorpej         return (Status);
   2064  1.1.1.11.2.1   thorpej     }
   2065  1.1.1.11.2.1   thorpej 
   2066  1.1.1.11.2.1   thorpej     ParentTable = DtPeekSubtable ();
   2067  1.1.1.11.2.1   thorpej     DtInsertSubtable (ParentTable, Subtable);
   2068  1.1.1.11.2.1   thorpej 
   2069  1.1.1.11.2.1   thorpej     /* Compile each subtable */
   2070  1.1.1.11.2.1   thorpej 
   2071  1.1.1.11.2.1   thorpej     while (*PFieldList)
   2072  1.1.1.11.2.1   thorpej     {
   2073  1.1.1.11.2.1   thorpej         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
   2074  1.1.1.11.2.1   thorpej             &Subtable);
   2075  1.1.1.11.2.1   thorpej         if (ACPI_FAILURE (Status))
   2076  1.1.1.11.2.1   thorpej         {
   2077  1.1.1.11.2.1   thorpej             return (Status);
   2078  1.1.1.11.2.1   thorpej         }
   2079  1.1.1.11.2.1   thorpej 
   2080  1.1.1.11.2.1   thorpej         ParentTable = DtPeekSubtable ();
   2081  1.1.1.11.2.1   thorpej         DtInsertSubtable (ParentTable, Subtable);
   2082  1.1.1.11.2.1   thorpej     }
   2083  1.1.1.11.2.1   thorpej 
   2084  1.1.1.11.2.1   thorpej     return (AE_OK);
   2085  1.1.1.11.2.1   thorpej }
   2086  1.1.1.11.2.1   thorpej 
   2087  1.1.1.11.2.1   thorpej 
   2088           1.1  christos /******************************************************************************
   2089           1.1  christos  *
   2090           1.1  christos  * FUNCTION:    DtCompileTcpa
   2091           1.1  christos  *
   2092           1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2093           1.1  christos  *
   2094           1.1  christos  * RETURN:      Status
   2095           1.1  christos  *
   2096           1.1  christos  * DESCRIPTION: Compile TCPA.
   2097           1.1  christos  *
   2098           1.1  christos  *****************************************************************************/
   2099           1.1  christos 
   2100           1.1  christos ACPI_STATUS
   2101           1.1  christos DtCompileTcpa (
   2102           1.1  christos     void                    **List)
   2103           1.1  christos {
   2104           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2105           1.1  christos     DT_SUBTABLE             *Subtable;
   2106           1.1  christos     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
   2107           1.1  christos     DT_SUBTABLE             *ParentTable;
   2108           1.1  christos     ACPI_STATUS             Status;
   2109           1.1  christos 
   2110           1.1  christos 
   2111           1.1  christos     /* Compile the main table */
   2112           1.1  christos 
   2113           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
   2114       1.1.1.6  christos         &Subtable);
   2115           1.1  christos     if (ACPI_FAILURE (Status))
   2116           1.1  christos     {
   2117           1.1  christos         return (Status);
   2118           1.1  christos     }
   2119           1.1  christos 
   2120           1.1  christos     ParentTable = DtPeekSubtable ();
   2121           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2122           1.1  christos 
   2123           1.1  christos     /*
   2124           1.1  christos      * Examine the PlatformClass field to determine the table type.
   2125           1.1  christos      * Either a client or server table. Only one.
   2126           1.1  christos      */
   2127           1.1  christos     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
   2128           1.1  christos 
   2129           1.1  christos     switch (TcpaHeader->PlatformClass)
   2130           1.1  christos     {
   2131           1.1  christos     case ACPI_TCPA_CLIENT_TABLE:
   2132           1.1  christos 
   2133           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
   2134       1.1.1.6  christos             &Subtable);
   2135           1.1  christos         break;
   2136           1.1  christos 
   2137           1.1  christos     case ACPI_TCPA_SERVER_TABLE:
   2138           1.1  christos 
   2139           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
   2140       1.1.1.6  christos             &Subtable);
   2141           1.1  christos         break;
   2142           1.1  christos 
   2143           1.1  christos     default:
   2144           1.1  christos 
   2145           1.1  christos         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
   2146           1.1  christos             TcpaHeader->PlatformClass);
   2147           1.1  christos         Status = AE_ERROR;
   2148           1.1  christos         break;
   2149           1.1  christos     }
   2150           1.1  christos 
   2151           1.1  christos     ParentTable = DtPeekSubtable ();
   2152           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2153           1.1  christos     return (Status);
   2154           1.1  christos }
   2155           1.1  christos 
   2156           1.1  christos 
   2157           1.1  christos /******************************************************************************
   2158           1.1  christos  *
   2159       1.1.1.7  christos  * FUNCTION:    DtCompileTpm2Rev3
   2160       1.1.1.7  christos  *
   2161       1.1.1.7  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2162       1.1.1.7  christos  *
   2163       1.1.1.7  christos  * RETURN:      Status
   2164       1.1.1.7  christos  *
   2165       1.1.1.7  christos  * DESCRIPTION: Compile TPM2 revision 3
   2166       1.1.1.7  christos  *
   2167       1.1.1.7  christos  *****************************************************************************/
   2168       1.1.1.7  christos static ACPI_STATUS
   2169       1.1.1.7  christos DtCompileTpm2Rev3 (
   2170       1.1.1.7  christos     void                    **List)
   2171       1.1.1.7  christos {
   2172       1.1.1.7  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2173       1.1.1.7  christos     DT_SUBTABLE             *Subtable;
   2174       1.1.1.7  christos     ACPI_TABLE_TPM23        *Tpm23Header;
   2175       1.1.1.7  christos     DT_SUBTABLE             *ParentTable;
   2176       1.1.1.7  christos     ACPI_STATUS             Status = AE_OK;
   2177       1.1.1.7  christos 
   2178       1.1.1.7  christos 
   2179       1.1.1.7  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
   2180       1.1.1.7  christos         &Subtable);
   2181       1.1.1.7  christos 
   2182       1.1.1.7  christos     ParentTable = DtPeekSubtable ();
   2183       1.1.1.7  christos     DtInsertSubtable (ParentTable, Subtable);
   2184       1.1.1.7  christos     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
   2185       1.1.1.7  christos 
   2186       1.1.1.7  christos     /* Subtable type depends on the StartMethod */
   2187       1.1.1.7  christos 
   2188       1.1.1.7  christos     switch (Tpm23Header->StartMethod)
   2189       1.1.1.7  christos     {
   2190       1.1.1.7  christos     case ACPI_TPM23_ACPI_START_METHOD:
   2191       1.1.1.7  christos 
   2192       1.1.1.7  christos         /* Subtable specific to to ARM_SMC */
   2193       1.1.1.7  christos 
   2194       1.1.1.7  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
   2195       1.1.1.7  christos             &Subtable);
   2196       1.1.1.7  christos         if (ACPI_FAILURE (Status))
   2197       1.1.1.7  christos         {
   2198       1.1.1.7  christos             return (Status);
   2199       1.1.1.7  christos         }
   2200       1.1.1.7  christos 
   2201       1.1.1.7  christos         ParentTable = DtPeekSubtable ();
   2202       1.1.1.7  christos         DtInsertSubtable (ParentTable, Subtable);
   2203       1.1.1.7  christos         break;
   2204       1.1.1.7  christos 
   2205       1.1.1.7  christos     default:
   2206       1.1.1.7  christos         break;
   2207       1.1.1.7  christos     }
   2208       1.1.1.7  christos 
   2209       1.1.1.7  christos     return (Status);
   2210       1.1.1.7  christos }
   2211       1.1.1.7  christos 
   2212       1.1.1.7  christos 
   2213       1.1.1.7  christos /******************************************************************************
   2214       1.1.1.7  christos  *
   2215       1.1.1.5  christos  * FUNCTION:    DtCompileTpm2
   2216       1.1.1.5  christos  *
   2217       1.1.1.5  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2218       1.1.1.5  christos  *
   2219       1.1.1.5  christos  * RETURN:      Status
   2220       1.1.1.5  christos  *
   2221       1.1.1.5  christos  * DESCRIPTION: Compile TPM2.
   2222       1.1.1.5  christos  *
   2223       1.1.1.5  christos  *****************************************************************************/
   2224       1.1.1.5  christos 
   2225       1.1.1.5  christos ACPI_STATUS
   2226       1.1.1.5  christos DtCompileTpm2 (
   2227       1.1.1.5  christos     void                    **List)
   2228       1.1.1.5  christos {
   2229       1.1.1.5  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2230       1.1.1.5  christos     DT_SUBTABLE             *Subtable;
   2231       1.1.1.5  christos     ACPI_TABLE_TPM2         *Tpm2Header;
   2232       1.1.1.5  christos     DT_SUBTABLE             *ParentTable;
   2233       1.1.1.5  christos     ACPI_STATUS             Status = AE_OK;
   2234       1.1.1.7  christos     ACPI_TABLE_HEADER       *Header;
   2235       1.1.1.5  christos 
   2236       1.1.1.5  christos 
   2237       1.1.1.7  christos     ParentTable = DtPeekSubtable ();
   2238       1.1.1.7  christos 
   2239       1.1.1.7  christos     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
   2240       1.1.1.7  christos 
   2241       1.1.1.7  christos     if (Header->Revision == 3)
   2242       1.1.1.7  christos     {
   2243       1.1.1.7  christos         return (DtCompileTpm2Rev3 (List));
   2244       1.1.1.7  christos     }
   2245       1.1.1.7  christos 
   2246       1.1.1.5  christos     /* Compile the main table */
   2247       1.1.1.5  christos 
   2248       1.1.1.5  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
   2249       1.1.1.6  christos         &Subtable);
   2250       1.1.1.5  christos     if (ACPI_FAILURE (Status))
   2251       1.1.1.5  christos     {
   2252       1.1.1.5  christos         return (Status);
   2253       1.1.1.5  christos     }
   2254       1.1.1.5  christos 
   2255       1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   2256       1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   2257       1.1.1.5  christos 
   2258       1.1.1.5  christos     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
   2259       1.1.1.5  christos 
   2260       1.1.1.5  christos     /* Method parameters */
   2261       1.1.1.5  christos     /* Optional: Log area minimum length */
   2262       1.1.1.5  christos     /* Optional: Log area start address */
   2263       1.1.1.5  christos     /* TBD: Optional fields above not fully implemented (not optional at this time) */
   2264       1.1.1.5  christos 
   2265       1.1.1.5  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
   2266       1.1.1.6  christos         &Subtable);
   2267       1.1.1.5  christos     if (ACPI_FAILURE (Status))
   2268       1.1.1.5  christos     {
   2269       1.1.1.5  christos         return (Status);
   2270       1.1.1.5  christos     }
   2271       1.1.1.5  christos 
   2272       1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   2273       1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   2274       1.1.1.5  christos 
   2275       1.1.1.5  christos 
   2276       1.1.1.5  christos     /* Subtable type depends on the StartMethod */
   2277       1.1.1.5  christos 
   2278       1.1.1.5  christos     switch (Tpm2Header->StartMethod)
   2279       1.1.1.5  christos     {
   2280       1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
   2281       1.1.1.5  christos 
   2282       1.1.1.5  christos         /* Subtable specific to to ARM_SMC */
   2283       1.1.1.5  christos 
   2284       1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
   2285       1.1.1.6  christos             &Subtable);
   2286       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   2287       1.1.1.5  christos         {
   2288       1.1.1.5  christos             return (Status);
   2289       1.1.1.5  christos         }
   2290       1.1.1.5  christos 
   2291       1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   2292       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   2293       1.1.1.5  christos         break;
   2294       1.1.1.5  christos 
   2295       1.1.1.5  christos     case ACPI_TPM2_START_METHOD:
   2296       1.1.1.5  christos     case ACPI_TPM2_MEMORY_MAPPED:
   2297       1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER:
   2298       1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
   2299       1.1.1.5  christos         break;
   2300       1.1.1.5  christos 
   2301       1.1.1.5  christos     case ACPI_TPM2_RESERVED1:
   2302       1.1.1.5  christos     case ACPI_TPM2_RESERVED3:
   2303       1.1.1.5  christos     case ACPI_TPM2_RESERVED4:
   2304       1.1.1.5  christos     case ACPI_TPM2_RESERVED5:
   2305       1.1.1.5  christos     case ACPI_TPM2_RESERVED9:
   2306       1.1.1.5  christos     case ACPI_TPM2_RESERVED10:
   2307       1.1.1.5  christos 
   2308       1.1.1.5  christos         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
   2309       1.1.1.5  christos             Tpm2Header->StartMethod);
   2310       1.1.1.5  christos         Status = AE_ERROR;
   2311       1.1.1.5  christos         break;
   2312       1.1.1.5  christos 
   2313       1.1.1.5  christos     case ACPI_TPM2_NOT_ALLOWED:
   2314       1.1.1.5  christos     default:
   2315       1.1.1.5  christos 
   2316       1.1.1.5  christos         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
   2317       1.1.1.5  christos             Tpm2Header->StartMethod);
   2318       1.1.1.5  christos         Status = AE_ERROR;
   2319       1.1.1.5  christos         break;
   2320       1.1.1.5  christos     }
   2321       1.1.1.5  christos 
   2322       1.1.1.5  christos     return (Status);
   2323       1.1.1.5  christos }
   2324       1.1.1.5  christos 
   2325       1.1.1.5  christos 
   2326       1.1.1.5  christos /******************************************************************************
   2327       1.1.1.5  christos  *
   2328           1.1  christos  * FUNCTION:    DtGetGenericTableInfo
   2329           1.1  christos  *
   2330           1.1  christos  * PARAMETERS:  Name                - Generic type name
   2331           1.1  christos  *
   2332           1.1  christos  * RETURN:      Info entry
   2333           1.1  christos  *
   2334           1.1  christos  * DESCRIPTION: Obtain table info for a generic name entry
   2335           1.1  christos  *
   2336           1.1  christos  *****************************************************************************/
   2337           1.1  christos 
   2338           1.1  christos ACPI_DMTABLE_INFO *
   2339           1.1  christos DtGetGenericTableInfo (
   2340           1.1  christos     char                    *Name)
   2341           1.1  christos {
   2342           1.1  christos     ACPI_DMTABLE_INFO       *Info;
   2343           1.1  christos     UINT32                  i;
   2344           1.1  christos 
   2345           1.1  christos 
   2346           1.1  christos     if (!Name)
   2347           1.1  christos     {
   2348           1.1  christos         return (NULL);
   2349           1.1  christos     }
   2350           1.1  christos 
   2351           1.1  christos     /* Search info table for name match */
   2352           1.1  christos 
   2353           1.1  christos     for (i = 0; ; i++)
   2354           1.1  christos     {
   2355           1.1  christos         Info = AcpiDmTableInfoGeneric[i];
   2356           1.1  christos         if (Info->Opcode == ACPI_DMT_EXIT)
   2357           1.1  christos         {
   2358           1.1  christos             Info = NULL;
   2359           1.1  christos             break;
   2360           1.1  christos         }
   2361           1.1  christos 
   2362           1.1  christos         /* Use caseless compare for generic keywords */
   2363           1.1  christos 
   2364           1.1  christos         if (!AcpiUtStricmp (Name, Info->Name))
   2365           1.1  christos         {
   2366           1.1  christos             break;
   2367           1.1  christos         }
   2368           1.1  christos     }
   2369           1.1  christos 
   2370           1.1  christos     return (Info);
   2371           1.1  christos }
   2372           1.1  christos 
   2373           1.1  christos 
   2374           1.1  christos /******************************************************************************
   2375           1.1  christos  *
   2376           1.1  christos  * FUNCTION:    DtCompileUefi
   2377           1.1  christos  *
   2378           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2379           1.1  christos  *
   2380           1.1  christos  * RETURN:      Status
   2381           1.1  christos  *
   2382           1.1  christos  * DESCRIPTION: Compile UEFI.
   2383           1.1  christos  *
   2384           1.1  christos  *****************************************************************************/
   2385           1.1  christos 
   2386           1.1  christos ACPI_STATUS
   2387           1.1  christos DtCompileUefi (
   2388           1.1  christos     void                    **List)
   2389           1.1  christos {
   2390           1.1  christos     ACPI_STATUS             Status;
   2391           1.1  christos     DT_SUBTABLE             *Subtable;
   2392           1.1  christos     DT_SUBTABLE             *ParentTable;
   2393           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2394           1.1  christos     UINT16                  *DataOffset;
   2395           1.1  christos 
   2396           1.1  christos 
   2397           1.1  christos     /* Compile the predefined portion of the UEFI table */
   2398           1.1  christos 
   2399           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
   2400       1.1.1.6  christos         &Subtable);
   2401           1.1  christos     if (ACPI_FAILURE (Status))
   2402           1.1  christos     {
   2403           1.1  christos         return (Status);
   2404           1.1  christos     }
   2405           1.1  christos 
   2406           1.1  christos     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
   2407           1.1  christos     *DataOffset = sizeof (ACPI_TABLE_UEFI);
   2408           1.1  christos 
   2409           1.1  christos     ParentTable = DtPeekSubtable ();
   2410           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2411           1.1  christos 
   2412           1.1  christos     /*
   2413           1.1  christos      * Compile the "generic" portion of the UEFI table. This
   2414           1.1  christos      * part of the table is not predefined and any of the generic
   2415           1.1  christos      * operators may be used.
   2416           1.1  christos      */
   2417           1.1  christos     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
   2418           1.1  christos     return (AE_OK);
   2419           1.1  christos }
   2420           1.1  christos 
   2421           1.1  christos 
   2422           1.1  christos /******************************************************************************
   2423           1.1  christos  *
   2424      1.1.1.11  christos  * FUNCTION:    DtCompileViot
   2425           1.1  christos  *
   2426           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2427           1.1  christos  *
   2428           1.1  christos  * RETURN:      Status
   2429           1.1  christos  *
   2430      1.1.1.11  christos  * DESCRIPTION: Compile VIOT.
   2431           1.1  christos  *
   2432           1.1  christos  *****************************************************************************/
   2433           1.1  christos 
   2434           1.1  christos ACPI_STATUS
   2435      1.1.1.11  christos DtCompileViot (
   2436           1.1  christos     void                    **List)
   2437           1.1  christos {
   2438           1.1  christos     ACPI_STATUS             Status;
   2439      1.1.1.11  christos     DT_SUBTABLE             *Subtable;
   2440      1.1.1.11  christos     DT_SUBTABLE             *ParentTable;
   2441      1.1.1.11  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2442      1.1.1.11  christos     DT_FIELD                *SubtableStart;
   2443      1.1.1.11  christos     ACPI_TABLE_VIOT         *Viot;
   2444      1.1.1.11  christos     ACPI_VIOT_HEADER        *ViotHeader;
   2445      1.1.1.11  christos     ACPI_DMTABLE_INFO       *InfoTable;
   2446      1.1.1.11  christos     UINT16                  NodeCount;
   2447           1.1  christos 
   2448      1.1.1.11  christos     ParentTable = DtPeekSubtable ();
   2449           1.1  christos 
   2450      1.1.1.11  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
   2451      1.1.1.11  christos     if (ACPI_FAILURE (Status))
   2452      1.1.1.11  christos     {
   2453      1.1.1.11  christos         return (Status);
   2454      1.1.1.11  christos     }
   2455      1.1.1.11  christos     DtInsertSubtable (ParentTable, Subtable);
   2456      1.1.1.11  christos 
   2457      1.1.1.11  christos     /*
   2458      1.1.1.11  christos      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
   2459      1.1.1.11  christos      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
   2460      1.1.1.11  christos      */
   2461      1.1.1.11  christos     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
   2462      1.1.1.11  christos         sizeof (ACPI_TABLE_HEADER));
   2463      1.1.1.11  christos 
   2464      1.1.1.11  christos     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
   2465      1.1.1.11  christos 
   2466      1.1.1.11  christos     NodeCount = 0;
   2467      1.1.1.11  christos     while (*PFieldList) {
   2468      1.1.1.11  christos         SubtableStart = *PFieldList;
   2469      1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
   2470      1.1.1.11  christos             &Subtable);
   2471      1.1.1.11  christos         if (ACPI_FAILURE (Status))
   2472      1.1.1.11  christos         {
   2473      1.1.1.11  christos             return (Status);
   2474      1.1.1.11  christos         }
   2475      1.1.1.11  christos 
   2476      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   2477      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   2478      1.1.1.11  christos         DtPushSubtable (Subtable);
   2479      1.1.1.11  christos 
   2480      1.1.1.11  christos         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
   2481      1.1.1.11  christos 
   2482      1.1.1.11  christos         switch (ViotHeader->Type)
   2483      1.1.1.11  christos         {
   2484      1.1.1.11  christos         case ACPI_VIOT_NODE_PCI_RANGE:
   2485      1.1.1.11  christos 
   2486      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot1;
   2487      1.1.1.11  christos             break;
   2488      1.1.1.11  christos 
   2489      1.1.1.11  christos         case ACPI_VIOT_NODE_MMIO:
   2490      1.1.1.11  christos 
   2491      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot2;
   2492      1.1.1.11  christos             break;
   2493      1.1.1.11  christos 
   2494      1.1.1.11  christos         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
   2495      1.1.1.11  christos 
   2496      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot3;
   2497      1.1.1.11  christos             break;
   2498      1.1.1.11  christos 
   2499      1.1.1.11  christos         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
   2500      1.1.1.11  christos 
   2501      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot4;
   2502      1.1.1.11  christos             break;
   2503      1.1.1.11  christos 
   2504      1.1.1.11  christos         default:
   2505      1.1.1.11  christos 
   2506      1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
   2507      1.1.1.11  christos             return (AE_ERROR);
   2508      1.1.1.11  christos         }
   2509      1.1.1.11  christos 
   2510      1.1.1.11  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2511      1.1.1.11  christos         if (ACPI_FAILURE (Status))
   2512      1.1.1.11  christos         {
   2513      1.1.1.11  christos             return (Status);
   2514      1.1.1.11  christos         }
   2515      1.1.1.11  christos 
   2516      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   2517      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   2518      1.1.1.11  christos         DtPopSubtable ();
   2519      1.1.1.11  christos         NodeCount++;
   2520      1.1.1.11  christos     }
   2521      1.1.1.11  christos 
   2522      1.1.1.11  christos     Viot->NodeCount = NodeCount;
   2523      1.1.1.11  christos     return (AE_OK);
   2524           1.1  christos }
   2525           1.1  christos 
   2526           1.1  christos 
   2527           1.1  christos /******************************************************************************
   2528           1.1  christos  *
   2529           1.1  christos  * FUNCTION:    DtCompileWdat
   2530           1.1  christos  *
   2531           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2532           1.1  christos  *
   2533           1.1  christos  * RETURN:      Status
   2534           1.1  christos  *
   2535           1.1  christos  * DESCRIPTION: Compile WDAT.
   2536           1.1  christos  *
   2537           1.1  christos  *****************************************************************************/
   2538           1.1  christos 
   2539           1.1  christos ACPI_STATUS
   2540           1.1  christos DtCompileWdat (
   2541           1.1  christos     void                    **List)
   2542           1.1  christos {
   2543           1.1  christos     ACPI_STATUS             Status;
   2544           1.1  christos 
   2545           1.1  christos 
   2546           1.1  christos     Status = DtCompileTwoSubtables (List,
   2547           1.1  christos         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
   2548           1.1  christos     return (Status);
   2549           1.1  christos }
   2550           1.1  christos 
   2551           1.1  christos 
   2552           1.1  christos /******************************************************************************
   2553           1.1  christos  *
   2554           1.1  christos  * FUNCTION:    DtCompileWpbt
   2555           1.1  christos  *
   2556           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2557           1.1  christos  *
   2558           1.1  christos  * RETURN:      Status
   2559           1.1  christos  *
   2560           1.1  christos  * DESCRIPTION: Compile WPBT.
   2561           1.1  christos  *
   2562           1.1  christos  *****************************************************************************/
   2563           1.1  christos 
   2564           1.1  christos ACPI_STATUS
   2565           1.1  christos DtCompileWpbt (
   2566           1.1  christos     void                    **List)
   2567           1.1  christos {
   2568           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2569           1.1  christos     DT_SUBTABLE             *Subtable;
   2570           1.1  christos     DT_SUBTABLE             *ParentTable;
   2571           1.1  christos     ACPI_TABLE_WPBT         *Table;
   2572           1.1  christos     ACPI_STATUS             Status;
   2573           1.1  christos     UINT16                  Length;
   2574           1.1  christos 
   2575           1.1  christos 
   2576           1.1  christos     /* Compile the main table */
   2577           1.1  christos 
   2578           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
   2579       1.1.1.6  christos         &Subtable);
   2580           1.1  christos     if (ACPI_FAILURE (Status))
   2581           1.1  christos     {
   2582           1.1  christos         return (Status);
   2583           1.1  christos     }
   2584           1.1  christos 
   2585           1.1  christos     ParentTable = DtPeekSubtable ();
   2586           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2587           1.1  christos 
   2588           1.1  christos     /* Compile the argument list subtable */
   2589           1.1  christos 
   2590           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
   2591       1.1.1.6  christos         &Subtable);
   2592           1.1  christos     if (ACPI_FAILURE (Status))
   2593           1.1  christos     {
   2594           1.1  christos         return (Status);
   2595           1.1  christos     }
   2596           1.1  christos 
   2597           1.1  christos     /* Extract the length of the Arguments buffer, insert into main table */
   2598           1.1  christos 
   2599           1.1  christos     Length = (UINT16) Subtable->TotalLength;
   2600           1.1  christos     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
   2601           1.1  christos     Table->ArgumentsLength = Length;
   2602           1.1  christos 
   2603           1.1  christos     ParentTable = DtPeekSubtable ();
   2604           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2605           1.1  christos     return (AE_OK);
   2606           1.1  christos }
   2607           1.1  christos 
   2608           1.1  christos 
   2609           1.1  christos /******************************************************************************
   2610           1.1  christos  *
   2611           1.1  christos  * FUNCTION:    DtCompileXsdt
   2612           1.1  christos  *
   2613           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2614           1.1  christos  *
   2615           1.1  christos  * RETURN:      Status
   2616           1.1  christos  *
   2617           1.1  christos  * DESCRIPTION: Compile XSDT.
   2618           1.1  christos  *
   2619           1.1  christos  *****************************************************************************/
   2620           1.1  christos 
   2621           1.1  christos ACPI_STATUS
   2622           1.1  christos DtCompileXsdt (
   2623           1.1  christos     void                    **List)
   2624           1.1  christos {
   2625           1.1  christos     DT_SUBTABLE             *Subtable;
   2626           1.1  christos     DT_SUBTABLE             *ParentTable;
   2627           1.1  christos     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   2628           1.1  christos     UINT64                  Address;
   2629           1.1  christos 
   2630           1.1  christos 
   2631           1.1  christos     ParentTable = DtPeekSubtable ();
   2632           1.1  christos 
   2633           1.1  christos     while (FieldList)
   2634           1.1  christos     {
   2635           1.1  christos         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
   2636           1.1  christos 
   2637           1.1  christos         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
   2638           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2639           1.1  christos         FieldList = FieldList->Next;
   2640           1.1  christos     }
   2641           1.1  christos 
   2642           1.1  christos     return (AE_OK);
   2643           1.1  christos }
   2644           1.1  christos 
   2645           1.1  christos 
   2646           1.1  christos /******************************************************************************
   2647           1.1  christos  *
   2648           1.1  christos  * FUNCTION:    DtCompileGeneric
   2649           1.1  christos  *
   2650           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2651           1.1  christos  *              Name                - Field name to end generic compiling
   2652           1.1  christos  *              Length              - Compiled table length to return
   2653           1.1  christos  *
   2654           1.1  christos  * RETURN:      Status
   2655           1.1  christos  *
   2656           1.1  christos  * DESCRIPTION: Compile generic unknown table.
   2657           1.1  christos  *
   2658           1.1  christos  *****************************************************************************/
   2659           1.1  christos 
   2660           1.1  christos ACPI_STATUS
   2661           1.1  christos DtCompileGeneric (
   2662           1.1  christos     void                    **List,
   2663           1.1  christos     char                    *Name,
   2664           1.1  christos     UINT32                  *Length)
   2665           1.1  christos {
   2666           1.1  christos     ACPI_STATUS             Status;
   2667           1.1  christos     DT_SUBTABLE             *Subtable;
   2668           1.1  christos     DT_SUBTABLE             *ParentTable;
   2669           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2670           1.1  christos     ACPI_DMTABLE_INFO       *Info;
   2671           1.1  christos 
   2672           1.1  christos 
   2673           1.1  christos     ParentTable = DtPeekSubtable ();
   2674           1.1  christos 
   2675           1.1  christos     /*
   2676           1.1  christos      * Compile the "generic" portion of the table. This
   2677           1.1  christos      * part of the table is not predefined and any of the generic
   2678           1.1  christos      * operators may be used.
   2679           1.1  christos      */
   2680           1.1  christos 
   2681           1.1  christos     /* Find any and all labels in the entire generic portion */
   2682           1.1  christos 
   2683           1.1  christos     DtDetectAllLabels (*PFieldList);
   2684           1.1  christos 
   2685           1.1  christos     /* Now we can actually compile the parse tree */
   2686           1.1  christos 
   2687           1.1  christos     if (Length && *Length)
   2688           1.1  christos     {
   2689           1.1  christos         *Length = 0;
   2690           1.1  christos     }
   2691           1.1  christos     while (*PFieldList)
   2692           1.1  christos     {
   2693           1.1  christos         if (Name && !strcmp ((*PFieldList)->Name, Name))
   2694           1.1  christos         {
   2695           1.1  christos             break;
   2696           1.1  christos         }
   2697           1.1  christos 
   2698           1.1  christos         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
   2699           1.1  christos         if (!Info)
   2700           1.1  christos         {
   2701       1.1.1.7  christos             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   2702           1.1  christos                 (*PFieldList)->Name);
   2703           1.1  christos             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   2704       1.1.1.7  christos                 (*PFieldList), AslGbl_MsgBuffer);
   2705           1.1  christos 
   2706           1.1  christos             *PFieldList = (*PFieldList)->Next;
   2707           1.1  christos             continue;
   2708           1.1  christos         }
   2709           1.1  christos 
   2710           1.1  christos         Status = DtCompileTable (PFieldList, Info,
   2711       1.1.1.6  christos             &Subtable);
   2712           1.1  christos         if (ACPI_SUCCESS (Status))
   2713           1.1  christos         {
   2714           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   2715           1.1  christos             if (Length)
   2716           1.1  christos             {
   2717           1.1  christos                 *Length += Subtable->Length;
   2718           1.1  christos             }
   2719           1.1  christos         }
   2720           1.1  christos         else
   2721           1.1  christos         {
   2722           1.1  christos             *PFieldList = (*PFieldList)->Next;
   2723           1.1  christos 
   2724           1.1  christos             if (Status == AE_NOT_FOUND)
   2725           1.1  christos             {
   2726       1.1.1.7  christos                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   2727           1.1  christos                     (*PFieldList)->Name);
   2728           1.1  christos                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   2729       1.1.1.7  christos                     (*PFieldList), AslGbl_MsgBuffer);
   2730           1.1  christos             }
   2731           1.1  christos         }
   2732           1.1  christos     }
   2733           1.1  christos 
   2734           1.1  christos     return (AE_OK);
   2735           1.1  christos }
   2736