Home | History | Annotate | Line # | Download | only in compiler
dttable.c revision 1.3.2.2
      1      1.1    jruoho /******************************************************************************
      2      1.1    jruoho  *
      3      1.1    jruoho  * Module Name: dttable.c - handling for specific ACPI tables
      4      1.1    jruoho  *
      5      1.1    jruoho  *****************************************************************************/
      6      1.1    jruoho 
      7      1.2  christos /*
      8  1.3.2.1     skrll  * Copyright (C) 2000 - 2015, Intel Corp.
      9      1.1    jruoho  * All rights reserved.
     10      1.1    jruoho  *
     11      1.2  christos  * Redistribution and use in source and binary forms, with or without
     12      1.2  christos  * modification, are permitted provided that the following conditions
     13      1.2  christos  * are met:
     14      1.2  christos  * 1. Redistributions of source code must retain the above copyright
     15      1.2  christos  *    notice, this list of conditions, and the following disclaimer,
     16      1.2  christos  *    without modification.
     17      1.2  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18      1.2  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
     19      1.2  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
     20      1.2  christos  *    including a substantially similar Disclaimer requirement for further
     21      1.2  christos  *    binary redistribution.
     22      1.2  christos  * 3. Neither the names of the above-listed copyright holders nor the names
     23      1.2  christos  *    of any contributors may be used to endorse or promote products derived
     24      1.2  christos  *    from this software without specific prior written permission.
     25      1.2  christos  *
     26      1.2  christos  * Alternatively, this software may be distributed under the terms of the
     27      1.2  christos  * GNU General Public License ("GPL") version 2 as published by the Free
     28      1.2  christos  * Software Foundation.
     29      1.2  christos  *
     30      1.2  christos  * NO WARRANTY
     31      1.2  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32      1.2  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33      1.2  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34      1.2  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35      1.2  christos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36      1.2  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37      1.2  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38      1.2  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39      1.2  christos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40      1.2  christos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41      1.2  christos  * POSSIBILITY OF SUCH DAMAGES.
     42      1.2  christos  */
     43      1.1    jruoho 
     44      1.1    jruoho /* Compile all complex data tables */
     45      1.1    jruoho 
     46      1.1    jruoho #include "aslcompiler.h"
     47      1.1    jruoho #include "dtcompiler.h"
     48      1.1    jruoho 
     49      1.1    jruoho #define _COMPONENT          DT_COMPILER
     50      1.1    jruoho         ACPI_MODULE_NAME    ("dttable")
     51      1.1    jruoho 
     52      1.1    jruoho 
     53      1.1    jruoho /* TBD: merge these into dmtbinfo.c? */
     54      1.1    jruoho 
     55      1.1    jruoho static ACPI_DMTABLE_INFO           TableInfoAsfAddress[] =
     56      1.1    jruoho {
     57      1.1    jruoho     {ACPI_DMT_BUFFER,   0,               "Addresses", 0},
     58      1.1    jruoho     {ACPI_DMT_EXIT,     0,               NULL, 0}
     59      1.1    jruoho };
     60      1.1    jruoho 
     61      1.1    jruoho static ACPI_DMTABLE_INFO           TableInfoDmarPciPath[] =
     62      1.1    jruoho {
     63      1.1    jruoho     {ACPI_DMT_PCI_PATH, 0,               "PCI Path", 0},
     64      1.1    jruoho     {ACPI_DMT_EXIT,     0,               NULL, 0}
     65      1.1    jruoho };
     66      1.1    jruoho 
     67      1.1    jruoho 
     68      1.1    jruoho /* Local prototypes */
     69      1.1    jruoho 
     70      1.1    jruoho static ACPI_STATUS
     71      1.1    jruoho DtCompileTwoSubtables (
     72      1.1    jruoho     void                    **List,
     73      1.1    jruoho     ACPI_DMTABLE_INFO       *TableInfo1,
     74      1.1    jruoho     ACPI_DMTABLE_INFO       *TableInfo2);
     75      1.1    jruoho 
     76      1.1    jruoho 
     77      1.1    jruoho /******************************************************************************
     78      1.1    jruoho  *
     79      1.1    jruoho  * FUNCTION:    DtCompileTwoSubtables
     80      1.1    jruoho  *
     81      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
     82      1.1    jruoho  *              TableInfo1          - Info table 1
     83      1.1    jruoho  *              TableInfo1          - Info table 2
     84      1.1    jruoho  *
     85      1.1    jruoho  * RETURN:      Status
     86      1.1    jruoho  *
     87      1.1    jruoho  * DESCRIPTION: Compile tables with a header and one or more same subtables.
     88      1.1    jruoho  *              Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
     89      1.1    jruoho  *
     90      1.1    jruoho  *****************************************************************************/
     91      1.1    jruoho 
     92      1.1    jruoho static ACPI_STATUS
     93      1.1    jruoho DtCompileTwoSubtables (
     94      1.1    jruoho     void                    **List,
     95      1.1    jruoho     ACPI_DMTABLE_INFO       *TableInfo1,
     96      1.1    jruoho     ACPI_DMTABLE_INFO       *TableInfo2)
     97      1.1    jruoho {
     98      1.1    jruoho     ACPI_STATUS             Status;
     99      1.1    jruoho     DT_SUBTABLE             *Subtable;
    100      1.1    jruoho     DT_SUBTABLE             *ParentTable;
    101      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    102      1.1    jruoho 
    103      1.1    jruoho 
    104      1.1    jruoho     Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
    105      1.1    jruoho     if (ACPI_FAILURE (Status))
    106      1.1    jruoho     {
    107      1.1    jruoho         return (Status);
    108      1.1    jruoho     }
    109      1.1    jruoho 
    110      1.1    jruoho     ParentTable = DtPeekSubtable ();
    111      1.1    jruoho     DtInsertSubtable (ParentTable, Subtable);
    112      1.1    jruoho 
    113      1.1    jruoho     while (*PFieldList)
    114      1.1    jruoho     {
    115      1.1    jruoho         Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
    116      1.1    jruoho         if (ACPI_FAILURE (Status))
    117      1.1    jruoho         {
    118      1.1    jruoho             return (Status);
    119      1.1    jruoho         }
    120      1.1    jruoho 
    121      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
    122      1.1    jruoho     }
    123      1.1    jruoho 
    124      1.1    jruoho     return (AE_OK);
    125      1.1    jruoho }
    126      1.1    jruoho 
    127      1.1    jruoho 
    128      1.1    jruoho /******************************************************************************
    129      1.1    jruoho  *
    130      1.1    jruoho  * FUNCTION:    DtCompileFacs
    131      1.1    jruoho  *
    132      1.1    jruoho  * PARAMETERS:  PFieldList          - Current field list pointer
    133      1.1    jruoho  *
    134      1.1    jruoho  * RETURN:      Status
    135      1.1    jruoho  *
    136      1.1    jruoho  * DESCRIPTION: Compile FACS.
    137      1.1    jruoho  *
    138      1.1    jruoho  *****************************************************************************/
    139      1.1    jruoho 
    140      1.1    jruoho ACPI_STATUS
    141      1.1    jruoho DtCompileFacs (
    142      1.1    jruoho     DT_FIELD                **PFieldList)
    143      1.1    jruoho {
    144      1.1    jruoho     DT_SUBTABLE             *Subtable;
    145      1.1    jruoho     UINT8                   *ReservedBuffer;
    146      1.1    jruoho     ACPI_STATUS             Status;
    147      1.1    jruoho     UINT32                  ReservedSize;
    148      1.1    jruoho 
    149      1.1    jruoho 
    150      1.1    jruoho     Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
    151      1.1    jruoho                 &Gbl_RootTable, TRUE);
    152      1.1    jruoho     if (ACPI_FAILURE (Status))
    153      1.1    jruoho     {
    154      1.1    jruoho         return (Status);
    155      1.1    jruoho     }
    156      1.1    jruoho 
    157      1.1    jruoho     /* Large FACS reserved area at the end of the table */
    158      1.1    jruoho 
    159      1.1    jruoho     ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
    160      1.1    jruoho     ReservedBuffer = UtLocalCalloc (ReservedSize);
    161      1.1    jruoho 
    162      1.1    jruoho     DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
    163      1.1    jruoho 
    164      1.1    jruoho     ACPI_FREE (ReservedBuffer);
    165      1.1    jruoho     DtInsertSubtable (Gbl_RootTable, Subtable);
    166      1.1    jruoho     return (AE_OK);
    167      1.1    jruoho }
    168      1.1    jruoho 
    169      1.1    jruoho 
    170      1.1    jruoho /******************************************************************************
    171      1.1    jruoho  *
    172      1.1    jruoho  * FUNCTION:    DtCompileRsdp
    173      1.1    jruoho  *
    174      1.1    jruoho  * PARAMETERS:  PFieldList          - Current field list pointer
    175      1.1    jruoho  *
    176      1.1    jruoho  * RETURN:      Status
    177      1.1    jruoho  *
    178      1.1    jruoho  * DESCRIPTION: Compile RSDP.
    179      1.1    jruoho  *
    180      1.1    jruoho  *****************************************************************************/
    181      1.1    jruoho 
    182      1.1    jruoho ACPI_STATUS
    183      1.1    jruoho DtCompileRsdp (
    184      1.1    jruoho     DT_FIELD                **PFieldList)
    185      1.1    jruoho {
    186      1.1    jruoho     DT_SUBTABLE             *Subtable;
    187      1.2  christos     ACPI_TABLE_RSDP         *Rsdp;
    188      1.2  christos     ACPI_RSDP_EXTENSION     *RsdpExtension;
    189      1.1    jruoho     ACPI_STATUS             Status;
    190      1.1    jruoho 
    191      1.1    jruoho 
    192      1.2  christos     /* Compile the "common" RSDP (ACPI 1.0) */
    193      1.2  christos 
    194      1.1    jruoho     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
    195      1.1    jruoho                 &Gbl_RootTable, TRUE);
    196      1.1    jruoho     if (ACPI_FAILURE (Status))
    197      1.1    jruoho     {
    198      1.1    jruoho         return (Status);
    199      1.1    jruoho     }
    200      1.1    jruoho 
    201      1.2  christos     Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
    202      1.2  christos     DtSetTableChecksum (&Rsdp->Checksum);
    203      1.1    jruoho 
    204      1.2  christos     if (Rsdp->Revision > 0)
    205      1.1    jruoho     {
    206      1.2  christos         /* Compile the "extended" part of the RSDP as a subtable */
    207      1.2  christos 
    208      1.1    jruoho         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
    209      1.1    jruoho                     &Subtable, TRUE);
    210      1.1    jruoho         if (ACPI_FAILURE (Status))
    211      1.1    jruoho         {
    212      1.1    jruoho             return (Status);
    213      1.1    jruoho         }
    214      1.1    jruoho 
    215      1.1    jruoho         DtInsertSubtable (Gbl_RootTable, Subtable);
    216      1.2  christos 
    217      1.2  christos         /* Set length and extended checksum for entire RSDP */
    218      1.2  christos 
    219      1.2  christos         RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
    220      1.2  christos         RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
    221      1.2  christos         DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
    222      1.1    jruoho     }
    223      1.1    jruoho 
    224      1.1    jruoho     return (AE_OK);
    225      1.1    jruoho }
    226      1.1    jruoho 
    227      1.1    jruoho 
    228      1.1    jruoho /******************************************************************************
    229      1.1    jruoho  *
    230      1.1    jruoho  * FUNCTION:    DtCompileAsf
    231      1.1    jruoho  *
    232      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
    233      1.1    jruoho  *
    234      1.1    jruoho  * RETURN:      Status
    235      1.1    jruoho  *
    236      1.1    jruoho  * DESCRIPTION: Compile ASF!.
    237      1.1    jruoho  *
    238      1.1    jruoho  *****************************************************************************/
    239      1.1    jruoho 
    240      1.1    jruoho ACPI_STATUS
    241      1.1    jruoho DtCompileAsf (
    242      1.1    jruoho     void                    **List)
    243      1.1    jruoho {
    244      1.1    jruoho     ACPI_ASF_INFO           *AsfTable;
    245      1.1    jruoho     DT_SUBTABLE             *Subtable;
    246      1.1    jruoho     DT_SUBTABLE             *ParentTable;
    247      1.1    jruoho     ACPI_DMTABLE_INFO       *InfoTable;
    248      1.1    jruoho     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
    249      1.1    jruoho     UINT32                  DataCount = 0;
    250      1.1    jruoho     ACPI_STATUS             Status;
    251      1.1    jruoho     UINT32                  i;
    252      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    253      1.1    jruoho     DT_FIELD                *SubtableStart;
    254      1.1    jruoho 
    255      1.1    jruoho 
    256      1.1    jruoho     while (*PFieldList)
    257      1.1    jruoho     {
    258      1.1    jruoho         SubtableStart = *PFieldList;
    259      1.1    jruoho         Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
    260      1.1    jruoho                     &Subtable, TRUE);
    261      1.1    jruoho         if (ACPI_FAILURE (Status))
    262      1.1    jruoho         {
    263      1.1    jruoho             return (Status);
    264      1.1    jruoho         }
    265      1.1    jruoho 
    266      1.1    jruoho         ParentTable = DtPeekSubtable ();
    267      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
    268      1.1    jruoho         DtPushSubtable (Subtable);
    269      1.1    jruoho 
    270      1.1    jruoho         AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
    271      1.1    jruoho 
    272      1.1    jruoho         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
    273      1.1    jruoho         {
    274      1.1    jruoho         case ACPI_ASF_TYPE_INFO:
    275      1.2  christos 
    276      1.1    jruoho             InfoTable = AcpiDmTableInfoAsf0;
    277      1.1    jruoho             break;
    278      1.1    jruoho 
    279      1.1    jruoho         case ACPI_ASF_TYPE_ALERT:
    280      1.2  christos 
    281      1.1    jruoho             InfoTable = AcpiDmTableInfoAsf1;
    282      1.1    jruoho             break;
    283      1.1    jruoho 
    284      1.1    jruoho         case ACPI_ASF_TYPE_CONTROL:
    285      1.2  christos 
    286      1.1    jruoho             InfoTable = AcpiDmTableInfoAsf2;
    287      1.1    jruoho             break;
    288      1.1    jruoho 
    289      1.1    jruoho         case ACPI_ASF_TYPE_BOOT:
    290      1.2  christos 
    291      1.1    jruoho             InfoTable = AcpiDmTableInfoAsf3;
    292      1.1    jruoho             break;
    293      1.1    jruoho 
    294      1.1    jruoho         case ACPI_ASF_TYPE_ADDRESS:
    295      1.2  christos 
    296      1.1    jruoho             InfoTable = AcpiDmTableInfoAsf4;
    297      1.1    jruoho             break;
    298      1.1    jruoho 
    299      1.1    jruoho         default:
    300      1.2  christos 
    301      1.1    jruoho             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
    302      1.1    jruoho             return (AE_ERROR);
    303      1.1    jruoho         }
    304      1.1    jruoho 
    305      1.1    jruoho         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
    306      1.1    jruoho         if (ACPI_FAILURE (Status))
    307      1.1    jruoho         {
    308      1.1    jruoho             return (Status);
    309      1.1    jruoho         }
    310      1.1    jruoho 
    311      1.1    jruoho         ParentTable = DtPeekSubtable ();
    312      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
    313      1.1    jruoho 
    314      1.1    jruoho         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
    315      1.1    jruoho         {
    316      1.1    jruoho         case ACPI_ASF_TYPE_INFO:
    317      1.2  christos 
    318      1.1    jruoho             DataInfoTable = NULL;
    319      1.1    jruoho             break;
    320      1.1    jruoho 
    321      1.1    jruoho         case ACPI_ASF_TYPE_ALERT:
    322      1.2  christos 
    323      1.1    jruoho             DataInfoTable = AcpiDmTableInfoAsf1a;
    324      1.1    jruoho             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
    325      1.1    jruoho                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
    326      1.1    jruoho                             sizeof (ACPI_ASF_HEADER)))->Alerts;
    327      1.1    jruoho             break;
    328      1.1    jruoho 
    329      1.1    jruoho         case ACPI_ASF_TYPE_CONTROL:
    330      1.2  christos 
    331      1.1    jruoho             DataInfoTable = AcpiDmTableInfoAsf2a;
    332      1.1    jruoho             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
    333      1.1    jruoho                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
    334      1.1    jruoho                             sizeof (ACPI_ASF_HEADER)))->Controls;
    335      1.1    jruoho             break;
    336      1.1    jruoho 
    337      1.1    jruoho         case ACPI_ASF_TYPE_BOOT:
    338      1.2  christos 
    339      1.1    jruoho             DataInfoTable = NULL;
    340      1.1    jruoho             break;
    341      1.1    jruoho 
    342      1.1    jruoho         case ACPI_ASF_TYPE_ADDRESS:
    343      1.2  christos 
    344      1.1    jruoho             DataInfoTable = TableInfoAsfAddress;
    345      1.1    jruoho             DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
    346      1.1    jruoho                         ACPI_SUB_PTR (UINT8, Subtable->Buffer,
    347      1.1    jruoho                             sizeof (ACPI_ASF_HEADER)))->Devices;
    348      1.1    jruoho             break;
    349      1.1    jruoho 
    350      1.1    jruoho         default:
    351      1.2  christos 
    352      1.1    jruoho             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
    353      1.1    jruoho             return (AE_ERROR);
    354      1.1    jruoho         }
    355      1.1    jruoho 
    356      1.1    jruoho         if (DataInfoTable)
    357      1.1    jruoho         {
    358      1.1    jruoho             switch (AsfTable->Header.Type & 0x7F)
    359      1.1    jruoho             {
    360      1.1    jruoho             case ACPI_ASF_TYPE_ADDRESS:
    361      1.1    jruoho 
    362      1.1    jruoho                 while (DataCount > 0)
    363      1.1    jruoho                 {
    364      1.1    jruoho                     Status = DtCompileTable (PFieldList, DataInfoTable,
    365      1.1    jruoho                                 &Subtable, TRUE);
    366      1.1    jruoho                     if (ACPI_FAILURE (Status))
    367      1.1    jruoho                     {
    368      1.1    jruoho                         return (Status);
    369      1.1    jruoho                     }
    370      1.1    jruoho 
    371      1.1    jruoho                     DtInsertSubtable (ParentTable, Subtable);
    372      1.1    jruoho                     DataCount = DataCount - Subtable->Length;
    373      1.1    jruoho                 }
    374      1.1    jruoho                 break;
    375      1.1    jruoho 
    376      1.1    jruoho             default:
    377      1.1    jruoho 
    378      1.1    jruoho                 for (i = 0; i < DataCount; i++)
    379      1.1    jruoho                 {
    380      1.1    jruoho                     Status = DtCompileTable (PFieldList, DataInfoTable,
    381      1.1    jruoho                                 &Subtable, TRUE);
    382      1.1    jruoho                     if (ACPI_FAILURE (Status))
    383      1.1    jruoho                     {
    384      1.1    jruoho                         return (Status);
    385      1.1    jruoho                     }
    386      1.1    jruoho 
    387      1.1    jruoho                     DtInsertSubtable (ParentTable, Subtable);
    388      1.1    jruoho                 }
    389      1.1    jruoho                 break;
    390      1.1    jruoho             }
    391      1.1    jruoho         }
    392      1.1    jruoho 
    393      1.1    jruoho         DtPopSubtable ();
    394      1.1    jruoho     }
    395      1.1    jruoho 
    396      1.1    jruoho     return (AE_OK);
    397      1.1    jruoho }
    398      1.1    jruoho 
    399      1.1    jruoho 
    400      1.1    jruoho /******************************************************************************
    401      1.1    jruoho  *
    402      1.1    jruoho  * FUNCTION:    DtCompileCpep
    403      1.1    jruoho  *
    404      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
    405      1.1    jruoho  *
    406      1.1    jruoho  * RETURN:      Status
    407      1.1    jruoho  *
    408      1.1    jruoho  * DESCRIPTION: Compile CPEP.
    409      1.1    jruoho  *
    410      1.1    jruoho  *****************************************************************************/
    411      1.1    jruoho 
    412      1.1    jruoho ACPI_STATUS
    413      1.1    jruoho DtCompileCpep (
    414      1.1    jruoho     void                    **List)
    415      1.1    jruoho {
    416      1.1    jruoho     ACPI_STATUS             Status;
    417      1.1    jruoho 
    418      1.1    jruoho 
    419      1.1    jruoho     Status = DtCompileTwoSubtables (List,
    420      1.1    jruoho                  AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
    421      1.1    jruoho     return (Status);
    422      1.1    jruoho }
    423      1.1    jruoho 
    424      1.1    jruoho 
    425      1.1    jruoho /******************************************************************************
    426      1.1    jruoho  *
    427      1.2  christos  * FUNCTION:    DtCompileCsrt
    428      1.2  christos  *
    429      1.2  christos  * PARAMETERS:  List                - Current field list pointer
    430      1.2  christos  *
    431      1.2  christos  * RETURN:      Status
    432      1.2  christos  *
    433      1.2  christos  * DESCRIPTION: Compile CSRT.
    434      1.2  christos  *
    435      1.2  christos  *****************************************************************************/
    436      1.2  christos 
    437      1.2  christos ACPI_STATUS
    438      1.2  christos DtCompileCsrt (
    439      1.2  christos     void                    **List)
    440      1.2  christos {
    441      1.2  christos     ACPI_STATUS             Status = AE_OK;
    442      1.2  christos     DT_SUBTABLE             *Subtable;
    443      1.2  christos     DT_SUBTABLE             *ParentTable;
    444      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    445      1.2  christos     UINT32                  DescriptorCount;
    446      1.2  christos     UINT32                  GroupLength;
    447      1.2  christos 
    448      1.2  christos 
    449      1.3  christos     /* Subtables (Resource Groups) */
    450      1.2  christos 
    451  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
    452      1.2  christos     while (*PFieldList)
    453      1.2  christos     {
    454      1.2  christos         /* Resource group subtable */
    455      1.2  christos 
    456      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
    457      1.2  christos                     &Subtable, TRUE);
    458      1.2  christos         if (ACPI_FAILURE (Status))
    459      1.2  christos         {
    460      1.2  christos             return (Status);
    461      1.2  christos         }
    462      1.2  christos 
    463      1.2  christos         /* Compute the number of resource descriptors */
    464      1.2  christos 
    465      1.2  christos         GroupLength =
    466      1.2  christos             (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
    467      1.2  christos                 Subtable->Buffer))->Length -
    468      1.2  christos             (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
    469      1.2  christos                 Subtable->Buffer))->SharedInfoLength -
    470      1.2  christos             sizeof (ACPI_CSRT_GROUP);
    471      1.2  christos 
    472      1.2  christos         DescriptorCount = (GroupLength  /
    473      1.2  christos             sizeof (ACPI_CSRT_DESCRIPTOR));
    474      1.2  christos 
    475      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
    476      1.2  christos         DtPushSubtable (Subtable);
    477  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
    478      1.2  christos 
    479      1.2  christos         /* Shared info subtable (One per resource group) */
    480      1.2  christos 
    481      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
    482      1.2  christos                     &Subtable, TRUE);
    483      1.2  christos         if (ACPI_FAILURE (Status))
    484      1.2  christos         {
    485      1.2  christos             return (Status);
    486      1.2  christos         }
    487      1.2  christos 
    488      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
    489      1.2  christos 
    490      1.2  christos         /* Sub-Subtables (Resource Descriptors) */
    491      1.2  christos 
    492      1.2  christos         while (*PFieldList && DescriptorCount)
    493      1.2  christos         {
    494  1.3.2.2     skrll 
    495      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
    496      1.2  christos                         &Subtable, TRUE);
    497      1.2  christos             if (ACPI_FAILURE (Status))
    498      1.2  christos             {
    499      1.2  christos                 return (Status);
    500      1.2  christos             }
    501  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
    502      1.2  christos 
    503  1.3.2.2     skrll             DtPushSubtable (Subtable);
    504      1.2  christos             ParentTable = DtPeekSubtable ();
    505  1.3.2.2     skrll             if (*PFieldList)
    506  1.3.2.2     skrll             {
    507  1.3.2.2     skrll                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
    508  1.3.2.2     skrll                             &Subtable, TRUE);
    509  1.3.2.2     skrll                 if (ACPI_FAILURE (Status))
    510  1.3.2.2     skrll                 {
    511  1.3.2.2     skrll                     return (Status);
    512  1.3.2.2     skrll                 }
    513  1.3.2.2     skrll                 if (Subtable)
    514  1.3.2.2     skrll                 {
    515  1.3.2.2     skrll                     DtInsertSubtable (ParentTable, Subtable);
    516  1.3.2.2     skrll                 }
    517  1.3.2.2     skrll             }
    518  1.3.2.2     skrll             DtPopSubtable ();
    519  1.3.2.2     skrll             ParentTable = DtPeekSubtable ();
    520  1.3.2.2     skrll 
    521      1.2  christos             DescriptorCount--;
    522      1.2  christos         }
    523      1.2  christos 
    524      1.2  christos         DtPopSubtable ();
    525  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
    526      1.2  christos     }
    527      1.2  christos 
    528      1.2  christos     return (Status);
    529      1.2  christos }
    530      1.2  christos 
    531      1.2  christos 
    532      1.2  christos /******************************************************************************
    533      1.2  christos  *
    534      1.2  christos  * FUNCTION:    DtCompileDbg2
    535      1.2  christos  *
    536      1.2  christos  * PARAMETERS:  List                - Current field list pointer
    537      1.2  christos  *
    538      1.2  christos  * RETURN:      Status
    539      1.2  christos  *
    540      1.2  christos  * DESCRIPTION: Compile DBG2.
    541      1.2  christos  *
    542      1.2  christos  *****************************************************************************/
    543      1.2  christos 
    544      1.2  christos ACPI_STATUS
    545      1.2  christos DtCompileDbg2 (
    546      1.2  christos     void                    **List)
    547      1.2  christos {
    548      1.2  christos     ACPI_STATUS             Status;
    549      1.2  christos     DT_SUBTABLE             *Subtable;
    550      1.2  christos     DT_SUBTABLE             *ParentTable;
    551      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    552      1.2  christos     UINT32                  SubtableCount;
    553      1.2  christos     ACPI_DBG2_HEADER        *Dbg2Header;
    554      1.2  christos     ACPI_DBG2_DEVICE        *DeviceInfo;
    555      1.2  christos     UINT16                  CurrentOffset;
    556      1.2  christos     UINT32                  i;
    557      1.2  christos 
    558      1.2  christos 
    559      1.2  christos     /* Main table */
    560      1.2  christos 
    561      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE);
    562      1.2  christos     if (ACPI_FAILURE (Status))
    563      1.2  christos     {
    564      1.2  christos         return (Status);
    565      1.2  christos     }
    566      1.2  christos 
    567      1.2  christos     ParentTable = DtPeekSubtable ();
    568      1.2  christos     DtInsertSubtable (ParentTable, Subtable);
    569      1.2  christos 
    570      1.2  christos     /* Main table fields */
    571      1.2  christos 
    572      1.2  christos     Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
    573      1.2  christos     Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
    574      1.2  christos         ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
    575      1.2  christos 
    576      1.2  christos     SubtableCount = Dbg2Header->InfoCount;
    577      1.2  christos     DtPushSubtable (Subtable);
    578      1.2  christos 
    579      1.2  christos     /* Process all Device Information subtables (Count = InfoCount) */
    580      1.2  christos 
    581      1.2  christos     while (*PFieldList && SubtableCount)
    582      1.2  christos     {
    583      1.2  christos         /* Subtable: Debug Device Information */
    584      1.2  christos 
    585      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
    586      1.2  christos                     &Subtable, TRUE);
    587      1.2  christos         if (ACPI_FAILURE (Status))
    588      1.2  christos         {
    589      1.2  christos             return (Status);
    590      1.2  christos         }
    591      1.2  christos 
    592      1.2  christos         DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
    593      1.2  christos         CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
    594      1.2  christos 
    595      1.2  christos         ParentTable = DtPeekSubtable ();
    596      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
    597      1.2  christos         DtPushSubtable (Subtable);
    598      1.2  christos 
    599      1.2  christos         ParentTable = DtPeekSubtable ();
    600      1.2  christos 
    601      1.2  christos         /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
    602      1.2  christos 
    603      1.2  christos         DeviceInfo->BaseAddressOffset = CurrentOffset;
    604      1.2  christos         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
    605      1.2  christos         {
    606      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
    607      1.2  christos                         &Subtable, TRUE);
    608      1.2  christos             if (ACPI_FAILURE (Status))
    609      1.2  christos             {
    610      1.2  christos                 return (Status);
    611      1.2  christos             }
    612      1.2  christos 
    613      1.2  christos             CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
    614      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
    615      1.2  christos         }
    616      1.2  christos 
    617      1.2  christos         /* AddressSize array (Required, size = RegisterCount) */
    618      1.2  christos 
    619      1.2  christos         DeviceInfo->AddressSizeOffset = CurrentOffset;
    620      1.2  christos         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
    621      1.2  christos         {
    622      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
    623      1.2  christos                         &Subtable, TRUE);
    624      1.2  christos             if (ACPI_FAILURE (Status))
    625      1.2  christos             {
    626      1.2  christos                 return (Status);
    627      1.2  christos             }
    628      1.2  christos 
    629      1.2  christos             CurrentOffset += (UINT16) sizeof (UINT32);
    630      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
    631      1.2  christos         }
    632      1.2  christos 
    633      1.2  christos         /* NamespaceString device identifier (Required, size = NamePathLength) */
    634      1.2  christos 
    635      1.2  christos         DeviceInfo->NamepathOffset = CurrentOffset;
    636      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
    637      1.2  christos                     &Subtable, TRUE);
    638      1.2  christos         if (ACPI_FAILURE (Status))
    639      1.2  christos         {
    640      1.2  christos             return (Status);
    641      1.2  christos         }
    642      1.2  christos 
    643      1.2  christos         /* Update the device info header */
    644      1.2  christos 
    645      1.2  christos         DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
    646      1.2  christos         CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
    647      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
    648      1.2  christos 
    649      1.2  christos         /* OemData - Variable-length data (Optional, size = OemDataLength) */
    650      1.2  christos 
    651      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
    652      1.2  christos                     &Subtable, TRUE);
    653      1.2  christos         if (ACPI_FAILURE (Status))
    654      1.2  christos         {
    655      1.2  christos             return (Status);
    656      1.2  christos         }
    657      1.2  christos 
    658      1.2  christos         /* Update the device info header (zeros if no OEM data present) */
    659      1.2  christos 
    660      1.2  christos         DeviceInfo->OemDataOffset = 0;
    661      1.2  christos         DeviceInfo->OemDataLength = 0;
    662      1.2  christos 
    663      1.2  christos         /* Optional subtable (OemData) */
    664      1.2  christos 
    665      1.2  christos         if (Subtable && Subtable->Length)
    666      1.2  christos         {
    667      1.2  christos             DeviceInfo->OemDataOffset = CurrentOffset;
    668      1.2  christos             DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
    669      1.2  christos 
    670      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
    671      1.2  christos         }
    672      1.2  christos 
    673      1.2  christos         SubtableCount--;
    674      1.2  christos         DtPopSubtable (); /* Get next Device Information subtable */
    675      1.2  christos     }
    676      1.2  christos 
    677      1.2  christos     DtPopSubtable ();
    678      1.2  christos     return (AE_OK);
    679      1.2  christos }
    680      1.2  christos 
    681      1.2  christos 
    682      1.2  christos /******************************************************************************
    683      1.2  christos  *
    684      1.1    jruoho  * FUNCTION:    DtCompileDmar
    685      1.1    jruoho  *
    686      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
    687      1.1    jruoho  *
    688      1.1    jruoho  * RETURN:      Status
    689      1.1    jruoho  *
    690      1.1    jruoho  * DESCRIPTION: Compile DMAR.
    691      1.1    jruoho  *
    692      1.1    jruoho  *****************************************************************************/
    693      1.1    jruoho 
    694      1.1    jruoho ACPI_STATUS
    695      1.1    jruoho DtCompileDmar (
    696      1.1    jruoho     void                    **List)
    697      1.1    jruoho {
    698      1.1    jruoho     ACPI_STATUS             Status;
    699      1.1    jruoho     DT_SUBTABLE             *Subtable;
    700      1.1    jruoho     DT_SUBTABLE             *ParentTable;
    701      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    702      1.1    jruoho     DT_FIELD                *SubtableStart;
    703      1.1    jruoho     ACPI_DMTABLE_INFO       *InfoTable;
    704      1.1    jruoho     ACPI_DMAR_HEADER        *DmarHeader;
    705      1.2  christos     ACPI_DMAR_DEVICE_SCOPE  *DmarDeviceScope;
    706      1.2  christos     UINT32                  DeviceScopeLength;
    707      1.2  christos     UINT32                  PciPathLength;
    708      1.1    jruoho 
    709      1.1    jruoho 
    710      1.1    jruoho     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
    711      1.1    jruoho     if (ACPI_FAILURE (Status))
    712      1.1    jruoho     {
    713      1.1    jruoho         return (Status);
    714      1.1    jruoho     }
    715      1.1    jruoho 
    716      1.1    jruoho     ParentTable = DtPeekSubtable ();
    717      1.1    jruoho     DtInsertSubtable (ParentTable, Subtable);
    718      1.2  christos     DtPushSubtable (Subtable);
    719      1.1    jruoho 
    720      1.1    jruoho     while (*PFieldList)
    721      1.1    jruoho     {
    722      1.1    jruoho         /* DMAR Header */
    723      1.1    jruoho 
    724      1.1    jruoho         SubtableStart = *PFieldList;
    725      1.1    jruoho         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
    726      1.1    jruoho                     &Subtable, TRUE);
    727      1.1    jruoho         if (ACPI_FAILURE (Status))
    728      1.1    jruoho         {
    729      1.1    jruoho             return (Status);
    730      1.1    jruoho         }
    731      1.1    jruoho 
    732      1.1    jruoho         ParentTable = DtPeekSubtable ();
    733      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
    734      1.1    jruoho         DtPushSubtable (Subtable);
    735      1.1    jruoho 
    736      1.1    jruoho         DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
    737      1.1    jruoho 
    738      1.1    jruoho         switch (DmarHeader->Type)
    739      1.1    jruoho         {
    740      1.1    jruoho         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
    741      1.2  christos 
    742      1.1    jruoho             InfoTable = AcpiDmTableInfoDmar0;
    743      1.1    jruoho             break;
    744      1.2  christos 
    745      1.1    jruoho         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
    746      1.2  christos 
    747      1.1    jruoho             InfoTable = AcpiDmTableInfoDmar1;
    748      1.1    jruoho             break;
    749      1.2  christos 
    750      1.3  christos         case ACPI_DMAR_TYPE_ROOT_ATS:
    751      1.2  christos 
    752      1.1    jruoho             InfoTable = AcpiDmTableInfoDmar2;
    753      1.1    jruoho             break;
    754      1.2  christos 
    755      1.3  christos         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
    756      1.2  christos 
    757      1.1    jruoho             InfoTable = AcpiDmTableInfoDmar3;
    758      1.1    jruoho             break;
    759      1.2  christos 
    760      1.3  christos         case ACPI_DMAR_TYPE_NAMESPACE:
    761      1.3  christos 
    762      1.3  christos             InfoTable = AcpiDmTableInfoDmar4;
    763      1.3  christos             break;
    764      1.3  christos 
    765      1.1    jruoho         default:
    766      1.2  christos 
    767      1.1    jruoho             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
    768      1.1    jruoho             return (AE_ERROR);
    769      1.1    jruoho         }
    770      1.1    jruoho 
    771      1.1    jruoho         /* DMAR Subtable */
    772      1.1    jruoho 
    773      1.1    jruoho         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
    774      1.1    jruoho         if (ACPI_FAILURE (Status))
    775      1.1    jruoho         {
    776      1.1    jruoho             return (Status);
    777      1.1    jruoho         }
    778      1.1    jruoho 
    779      1.1    jruoho         ParentTable = DtPeekSubtable ();
    780      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
    781      1.1    jruoho 
    782      1.3  christos         /*
    783      1.3  christos          * Optional Device Scope subtables
    784      1.3  christos          */
    785      1.3  christos         if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
    786      1.3  christos             (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
    787      1.3  christos         {
    788      1.3  christos             /* These types do not support device scopes */
    789      1.3  christos 
    790      1.3  christos             DtPopSubtable ();
    791      1.3  christos             continue;
    792      1.3  christos         }
    793      1.1    jruoho 
    794      1.3  christos         DtPushSubtable (Subtable);
    795      1.2  christos         DeviceScopeLength = DmarHeader->Length - Subtable->Length -
    796      1.2  christos             ParentTable->Length;
    797      1.2  christos         while (DeviceScopeLength)
    798      1.1    jruoho         {
    799      1.1    jruoho             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
    800      1.1    jruoho                         &Subtable, FALSE);
    801      1.1    jruoho             if (Status == AE_NOT_FOUND)
    802      1.1    jruoho             {
    803      1.1    jruoho                 break;
    804      1.1    jruoho             }
    805      1.1    jruoho 
    806      1.1    jruoho             ParentTable = DtPeekSubtable ();
    807      1.1    jruoho             DtInsertSubtable (ParentTable, Subtable);
    808      1.1    jruoho             DtPushSubtable (Subtable);
    809      1.1    jruoho 
    810      1.2  christos             DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
    811      1.2  christos 
    812      1.1    jruoho             /* Optional PCI Paths */
    813      1.1    jruoho 
    814      1.2  christos             PciPathLength = DmarDeviceScope->Length - Subtable->Length;
    815      1.2  christos             while (PciPathLength)
    816      1.1    jruoho             {
    817      1.1    jruoho                 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
    818      1.1    jruoho                             &Subtable, FALSE);
    819      1.1    jruoho                 if (Status == AE_NOT_FOUND)
    820      1.1    jruoho                 {
    821      1.1    jruoho                     DtPopSubtable ();
    822      1.1    jruoho                     break;
    823      1.1    jruoho                 }
    824      1.1    jruoho 
    825      1.1    jruoho                 ParentTable = DtPeekSubtable ();
    826      1.1    jruoho                 DtInsertSubtable (ParentTable, Subtable);
    827      1.2  christos                 PciPathLength -= Subtable->Length;
    828      1.1    jruoho             }
    829      1.2  christos 
    830      1.2  christos             DtPopSubtable ();
    831      1.2  christos             DeviceScopeLength -= DmarDeviceScope->Length;
    832      1.1    jruoho         }
    833      1.1    jruoho 
    834      1.1    jruoho         DtPopSubtable ();
    835      1.2  christos         DtPopSubtable ();
    836      1.1    jruoho     }
    837      1.1    jruoho 
    838      1.1    jruoho     return (AE_OK);
    839      1.1    jruoho }
    840      1.1    jruoho 
    841      1.1    jruoho 
    842      1.1    jruoho /******************************************************************************
    843      1.1    jruoho  *
    844  1.3.2.2     skrll  * FUNCTION:    DtCompileDrtm
    845  1.3.2.2     skrll  *
    846  1.3.2.2     skrll  * PARAMETERS:  List                - Current field list pointer
    847  1.3.2.2     skrll  *
    848  1.3.2.2     skrll  * RETURN:      Status
    849  1.3.2.2     skrll  *
    850  1.3.2.2     skrll  * DESCRIPTION: Compile DRTM.
    851  1.3.2.2     skrll  *
    852  1.3.2.2     skrll  *****************************************************************************/
    853  1.3.2.2     skrll 
    854  1.3.2.2     skrll ACPI_STATUS
    855  1.3.2.2     skrll DtCompileDrtm (
    856  1.3.2.2     skrll     void                    **List)
    857  1.3.2.2     skrll {
    858  1.3.2.2     skrll     ACPI_STATUS             Status;
    859  1.3.2.2     skrll     DT_SUBTABLE             *Subtable;
    860  1.3.2.2     skrll     DT_SUBTABLE             *ParentTable;
    861  1.3.2.2     skrll     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    862  1.3.2.2     skrll     UINT32                  Count;
    863  1.3.2.2     skrll     /* ACPI_TABLE_DRTM         *Drtm; */
    864  1.3.2.2     skrll     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
    865  1.3.2.2     skrll     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
    866  1.3.2.2     skrll     /* ACPI_DRTM_DPS_ID        *DrtmDps; */
    867  1.3.2.2     skrll 
    868  1.3.2.2     skrll 
    869  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
    870  1.3.2.2     skrll 
    871  1.3.2.2     skrll     /* Compile DRTM header */
    872  1.3.2.2     skrll 
    873  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm,
    874  1.3.2.2     skrll                 &Subtable, TRUE);
    875  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
    876  1.3.2.2     skrll     {
    877  1.3.2.2     skrll         return (Status);
    878  1.3.2.2     skrll     }
    879  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
    880  1.3.2.2     skrll 
    881  1.3.2.2     skrll     /*
    882  1.3.2.2     skrll      * Using ACPI_SUB_PTR, We needn't define a seperate structure. Care
    883  1.3.2.2     skrll      * should be taken to avoid accessing ACPI_TABLE_HADER fields.
    884  1.3.2.2     skrll      */
    885  1.3.2.2     skrll #if 0
    886  1.3.2.2     skrll     Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM,
    887  1.3.2.2     skrll                     Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
    888  1.3.2.2     skrll #endif
    889  1.3.2.2     skrll     /* Compile VTL */
    890  1.3.2.2     skrll 
    891  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0,
    892  1.3.2.2     skrll                 &Subtable, TRUE);
    893  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
    894  1.3.2.2     skrll     {
    895  1.3.2.2     skrll         return (Status);
    896  1.3.2.2     skrll     }
    897  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
    898  1.3.2.2     skrll     DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer);
    899  1.3.2.2     skrll 
    900  1.3.2.2     skrll     DtPushSubtable (Subtable);
    901  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
    902  1.3.2.2     skrll     Count = 0;
    903  1.3.2.2     skrll     while (*PFieldList)
    904  1.3.2.2     skrll     {
    905  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a,
    906  1.3.2.2     skrll                     &Subtable, TRUE);
    907  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
    908  1.3.2.2     skrll         {
    909  1.3.2.2     skrll             return (Status);
    910  1.3.2.2     skrll         }
    911  1.3.2.2     skrll         if (!Subtable)
    912  1.3.2.2     skrll         {
    913  1.3.2.2     skrll             break;
    914  1.3.2.2     skrll         }
    915  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
    916  1.3.2.2     skrll         Count++;
    917  1.3.2.2     skrll     }
    918  1.3.2.2     skrll     DrtmVtl->ValidatedTableCount = Count;
    919  1.3.2.2     skrll     DtPopSubtable ();
    920  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
    921  1.3.2.2     skrll 
    922  1.3.2.2     skrll     /* Compile RL */
    923  1.3.2.2     skrll 
    924  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1,
    925  1.3.2.2     skrll                 &Subtable, TRUE);
    926  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
    927  1.3.2.2     skrll     {
    928  1.3.2.2     skrll         return (Status);
    929  1.3.2.2     skrll     }
    930  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
    931  1.3.2.2     skrll     DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer);
    932  1.3.2.2     skrll 
    933  1.3.2.2     skrll     DtPushSubtable (Subtable);
    934  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
    935  1.3.2.2     skrll     Count = 0;
    936  1.3.2.2     skrll     while (*PFieldList)
    937  1.3.2.2     skrll     {
    938  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a,
    939  1.3.2.2     skrll                     &Subtable, TRUE);
    940  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
    941  1.3.2.2     skrll         {
    942  1.3.2.2     skrll             return (Status);
    943  1.3.2.2     skrll         }
    944  1.3.2.2     skrll         if (!Subtable)
    945  1.3.2.2     skrll         {
    946  1.3.2.2     skrll             break;
    947  1.3.2.2     skrll         }
    948  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
    949  1.3.2.2     skrll         Count++;
    950  1.3.2.2     skrll     }
    951  1.3.2.2     skrll     DrtmRl->ResourceCount = Count;
    952  1.3.2.2     skrll     DtPopSubtable ();
    953  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
    954  1.3.2.2     skrll 
    955  1.3.2.2     skrll     /* Compile DPS */
    956  1.3.2.2     skrll 
    957  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2,
    958  1.3.2.2     skrll                 &Subtable, TRUE);
    959  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
    960  1.3.2.2     skrll     {
    961  1.3.2.2     skrll         return (Status);
    962  1.3.2.2     skrll     }
    963  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
    964  1.3.2.2     skrll     /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/
    965  1.3.2.2     skrll 
    966  1.3.2.2     skrll 
    967  1.3.2.2     skrll     return (AE_OK);
    968  1.3.2.2     skrll }
    969  1.3.2.2     skrll 
    970  1.3.2.2     skrll 
    971  1.3.2.2     skrll /******************************************************************************
    972  1.3.2.2     skrll  *
    973      1.1    jruoho  * FUNCTION:    DtCompileEinj
    974      1.1    jruoho  *
    975      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
    976      1.1    jruoho  *
    977      1.1    jruoho  * RETURN:      Status
    978      1.1    jruoho  *
    979      1.1    jruoho  * DESCRIPTION: Compile EINJ.
    980      1.1    jruoho  *
    981      1.1    jruoho  *****************************************************************************/
    982      1.1    jruoho 
    983      1.1    jruoho ACPI_STATUS
    984      1.1    jruoho DtCompileEinj (
    985      1.1    jruoho     void                    **List)
    986      1.1    jruoho {
    987      1.1    jruoho     ACPI_STATUS             Status;
    988      1.1    jruoho 
    989      1.1    jruoho 
    990      1.1    jruoho     Status = DtCompileTwoSubtables (List,
    991      1.1    jruoho                  AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
    992      1.1    jruoho     return (Status);
    993      1.1    jruoho }
    994      1.1    jruoho 
    995      1.1    jruoho 
    996      1.1    jruoho /******************************************************************************
    997      1.1    jruoho  *
    998      1.1    jruoho  * FUNCTION:    DtCompileErst
    999      1.1    jruoho  *
   1000      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   1001      1.1    jruoho  *
   1002      1.1    jruoho  * RETURN:      Status
   1003      1.1    jruoho  *
   1004      1.1    jruoho  * DESCRIPTION: Compile ERST.
   1005      1.1    jruoho  *
   1006      1.1    jruoho  *****************************************************************************/
   1007      1.1    jruoho 
   1008      1.1    jruoho ACPI_STATUS
   1009      1.1    jruoho DtCompileErst (
   1010      1.1    jruoho     void                    **List)
   1011      1.1    jruoho {
   1012      1.1    jruoho     ACPI_STATUS             Status;
   1013      1.1    jruoho 
   1014      1.1    jruoho 
   1015      1.1    jruoho     Status = DtCompileTwoSubtables (List,
   1016      1.1    jruoho                  AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
   1017      1.1    jruoho     return (Status);
   1018      1.1    jruoho }
   1019      1.1    jruoho 
   1020      1.1    jruoho 
   1021      1.1    jruoho /******************************************************************************
   1022      1.1    jruoho  *
   1023      1.1    jruoho  * FUNCTION:    DtCompileFadt
   1024      1.1    jruoho  *
   1025      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   1026      1.1    jruoho  *
   1027      1.1    jruoho  * RETURN:      Status
   1028      1.1    jruoho  *
   1029      1.1    jruoho  * DESCRIPTION: Compile FADT.
   1030      1.1    jruoho  *
   1031      1.1    jruoho  *****************************************************************************/
   1032      1.1    jruoho 
   1033      1.1    jruoho ACPI_STATUS
   1034      1.1    jruoho DtCompileFadt (
   1035      1.1    jruoho     void                    **List)
   1036      1.1    jruoho {
   1037      1.1    jruoho     ACPI_STATUS             Status;
   1038      1.1    jruoho     DT_SUBTABLE             *Subtable;
   1039      1.1    jruoho     DT_SUBTABLE             *ParentTable;
   1040      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1041      1.1    jruoho     ACPI_TABLE_HEADER       *Table;
   1042      1.1    jruoho     UINT8                   Revision;
   1043      1.1    jruoho 
   1044      1.1    jruoho 
   1045      1.1    jruoho     Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
   1046      1.1    jruoho                 &Subtable, TRUE);
   1047      1.1    jruoho     if (ACPI_FAILURE (Status))
   1048      1.1    jruoho     {
   1049      1.1    jruoho         return (Status);
   1050      1.1    jruoho     }
   1051      1.1    jruoho 
   1052      1.1    jruoho     ParentTable = DtPeekSubtable ();
   1053      1.1    jruoho     DtInsertSubtable (ParentTable, Subtable);
   1054      1.1    jruoho 
   1055      1.1    jruoho     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
   1056      1.1    jruoho     Revision = Table->Revision;
   1057      1.1    jruoho 
   1058      1.1    jruoho     if (Revision == 2)
   1059      1.1    jruoho     {
   1060      1.1    jruoho         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
   1061      1.1    jruoho                     &Subtable, TRUE);
   1062      1.1    jruoho         if (ACPI_FAILURE (Status))
   1063      1.1    jruoho         {
   1064      1.1    jruoho             return (Status);
   1065      1.1    jruoho         }
   1066      1.1    jruoho 
   1067      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   1068      1.1    jruoho     }
   1069      1.1    jruoho     else if (Revision >= 2)
   1070      1.1    jruoho     {
   1071      1.1    jruoho         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
   1072      1.1    jruoho                     &Subtable, TRUE);
   1073      1.1    jruoho         if (ACPI_FAILURE (Status))
   1074      1.1    jruoho         {
   1075      1.1    jruoho             return (Status);
   1076      1.1    jruoho         }
   1077      1.1    jruoho 
   1078      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   1079      1.2  christos 
   1080      1.2  christos         if (Revision >= 5)
   1081      1.2  christos         {
   1082      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
   1083      1.2  christos                         &Subtable, TRUE);
   1084      1.2  christos             if (ACPI_FAILURE (Status))
   1085      1.2  christos             {
   1086      1.2  christos                 return (Status);
   1087      1.2  christos             }
   1088      1.2  christos 
   1089      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   1090      1.2  christos         }
   1091  1.3.2.2     skrll 
   1092  1.3.2.2     skrll         if (Revision >= 6)
   1093  1.3.2.2     skrll         {
   1094  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6,
   1095  1.3.2.2     skrll                         &Subtable, TRUE);
   1096  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1097  1.3.2.2     skrll             {
   1098  1.3.2.2     skrll                 return (Status);
   1099  1.3.2.2     skrll             }
   1100  1.3.2.2     skrll 
   1101  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
   1102  1.3.2.2     skrll         }
   1103      1.1    jruoho     }
   1104      1.1    jruoho 
   1105      1.1    jruoho     return (AE_OK);
   1106      1.1    jruoho }
   1107      1.1    jruoho 
   1108      1.3  christos /******************************************************************************
   1109      1.3  christos  *
   1110      1.3  christos  * FUNCTION:    DtCompileGtdt
   1111      1.3  christos  *
   1112      1.3  christos  * PARAMETERS:  List                - Current field list pointer
   1113      1.3  christos  *
   1114      1.3  christos  * RETURN:      Status
   1115      1.3  christos  *
   1116      1.3  christos  * DESCRIPTION: Compile GTDT.
   1117      1.3  christos  *
   1118      1.3  christos  *****************************************************************************/
   1119      1.3  christos 
   1120      1.3  christos ACPI_STATUS
   1121      1.3  christos DtCompileGtdt (
   1122      1.3  christos     void                    **List)
   1123      1.3  christos {
   1124      1.3  christos     ACPI_STATUS             Status;
   1125      1.3  christos     DT_SUBTABLE             *Subtable;
   1126      1.3  christos     DT_SUBTABLE             *ParentTable;
   1127      1.3  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1128      1.3  christos     DT_FIELD                *SubtableStart;
   1129      1.3  christos     ACPI_SUBTABLE_HEADER    *GtdtHeader;
   1130      1.3  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1131      1.3  christos     UINT32                  GtCount;
   1132      1.3  christos 
   1133      1.3  christos 
   1134      1.3  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
   1135      1.3  christos                 &Subtable, TRUE);
   1136      1.3  christos     if (ACPI_FAILURE (Status))
   1137      1.3  christos     {
   1138      1.3  christos         return (Status);
   1139      1.3  christos     }
   1140      1.3  christos 
   1141      1.3  christos     ParentTable = DtPeekSubtable ();
   1142      1.3  christos     DtInsertSubtable (ParentTable, Subtable);
   1143      1.3  christos 
   1144      1.3  christos     while (*PFieldList)
   1145      1.3  christos     {
   1146      1.3  christos         SubtableStart = *PFieldList;
   1147      1.3  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
   1148      1.3  christos                     &Subtable, TRUE);
   1149      1.3  christos         if (ACPI_FAILURE (Status))
   1150      1.3  christos         {
   1151      1.3  christos             return (Status);
   1152      1.3  christos         }
   1153      1.3  christos 
   1154      1.3  christos         ParentTable = DtPeekSubtable ();
   1155      1.3  christos         DtInsertSubtable (ParentTable, Subtable);
   1156      1.3  christos         DtPushSubtable (Subtable);
   1157      1.3  christos 
   1158      1.3  christos         GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1159      1.3  christos 
   1160      1.3  christos         switch (GtdtHeader->Type)
   1161      1.3  christos         {
   1162      1.3  christos         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1163      1.3  christos 
   1164      1.3  christos             InfoTable = AcpiDmTableInfoGtdt0;
   1165      1.3  christos             break;
   1166      1.3  christos 
   1167      1.3  christos         case ACPI_GTDT_TYPE_WATCHDOG:
   1168      1.3  christos 
   1169      1.3  christos             InfoTable = AcpiDmTableInfoGtdt1;
   1170      1.3  christos             break;
   1171      1.3  christos 
   1172      1.3  christos         default:
   1173      1.3  christos 
   1174      1.3  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
   1175      1.3  christos             return (AE_ERROR);
   1176      1.3  christos         }
   1177      1.3  christos 
   1178      1.3  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   1179      1.3  christos         if (ACPI_FAILURE (Status))
   1180      1.3  christos         {
   1181      1.3  christos             return (Status);
   1182      1.3  christos         }
   1183      1.3  christos 
   1184      1.3  christos         ParentTable = DtPeekSubtable ();
   1185      1.3  christos         DtInsertSubtable (ParentTable, Subtable);
   1186      1.3  christos 
   1187      1.3  christos         /*
   1188      1.3  christos          * Additional GT block subtable data
   1189      1.3  christos          */
   1190      1.3  christos 
   1191      1.3  christos         switch (GtdtHeader->Type)
   1192      1.3  christos         {
   1193      1.3  christos         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1194      1.3  christos 
   1195      1.3  christos             DtPushSubtable (Subtable);
   1196      1.3  christos             ParentTable = DtPeekSubtable ();
   1197      1.3  christos 
   1198      1.3  christos             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   1199      1.3  christos                 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
   1200      1.3  christos             while (GtCount)
   1201      1.3  christos             {
   1202      1.3  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
   1203      1.3  christos                             &Subtable, TRUE);
   1204      1.3  christos                 if (ACPI_FAILURE (Status))
   1205      1.3  christos                 {
   1206      1.3  christos                     return (Status);
   1207      1.3  christos                 }
   1208      1.3  christos 
   1209      1.3  christos 
   1210      1.3  christos                 DtInsertSubtable (ParentTable, Subtable);
   1211      1.3  christos                 GtCount--;
   1212      1.3  christos             }
   1213      1.3  christos             DtPopSubtable ();
   1214      1.3  christos             break;
   1215      1.3  christos 
   1216      1.3  christos         default:
   1217      1.3  christos 
   1218      1.3  christos             break;
   1219      1.3  christos         }
   1220      1.3  christos 
   1221      1.3  christos         DtPopSubtable ();
   1222      1.3  christos     }
   1223      1.3  christos 
   1224      1.3  christos     return (AE_OK);
   1225      1.3  christos }
   1226      1.3  christos 
   1227      1.1    jruoho 
   1228      1.1    jruoho /******************************************************************************
   1229      1.1    jruoho  *
   1230      1.2  christos  * FUNCTION:    DtCompileFpdt
   1231      1.1    jruoho  *
   1232      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   1233      1.1    jruoho  *
   1234      1.1    jruoho  * RETURN:      Status
   1235      1.1    jruoho  *
   1236      1.2  christos  * DESCRIPTION: Compile FPDT.
   1237      1.1    jruoho  *
   1238      1.1    jruoho  *****************************************************************************/
   1239      1.1    jruoho 
   1240      1.1    jruoho ACPI_STATUS
   1241      1.2  christos DtCompileFpdt (
   1242      1.1    jruoho     void                    **List)
   1243      1.1    jruoho {
   1244      1.1    jruoho     ACPI_STATUS             Status;
   1245      1.2  christos     ACPI_FPDT_HEADER        *FpdtHeader;
   1246      1.1    jruoho     DT_SUBTABLE             *Subtable;
   1247      1.1    jruoho     DT_SUBTABLE             *ParentTable;
   1248      1.2  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1249      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1250      1.1    jruoho     DT_FIELD                *SubtableStart;
   1251      1.1    jruoho 
   1252      1.1    jruoho 
   1253      1.2  christos     while (*PFieldList)
   1254      1.1    jruoho     {
   1255      1.2  christos         SubtableStart = *PFieldList;
   1256      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
   1257      1.2  christos                     &Subtable, TRUE);
   1258      1.2  christos         if (ACPI_FAILURE (Status))
   1259      1.2  christos         {
   1260      1.2  christos             return (Status);
   1261      1.2  christos         }
   1262      1.1    jruoho 
   1263      1.2  christos         ParentTable = DtPeekSubtable ();
   1264      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   1265      1.2  christos         DtPushSubtable (Subtable);
   1266      1.1    jruoho 
   1267      1.2  christos         FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
   1268      1.1    jruoho 
   1269      1.2  christos         switch (FpdtHeader->Type)
   1270      1.1    jruoho         {
   1271      1.2  christos         case ACPI_FPDT_TYPE_BOOT:
   1272      1.2  christos 
   1273      1.2  christos             InfoTable = AcpiDmTableInfoFpdt0;
   1274      1.2  christos             break;
   1275      1.2  christos 
   1276      1.2  christos         case ACPI_FPDT_TYPE_S3PERF:
   1277      1.2  christos 
   1278      1.2  christos             InfoTable = AcpiDmTableInfoFpdt1;
   1279      1.2  christos             break;
   1280      1.2  christos 
   1281      1.2  christos         default:
   1282      1.2  christos 
   1283      1.2  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
   1284      1.2  christos             return (AE_ERROR);
   1285      1.2  christos             break;
   1286      1.2  christos         }
   1287      1.2  christos 
   1288      1.2  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   1289      1.2  christos         if (ACPI_FAILURE (Status))
   1290      1.2  christos         {
   1291      1.2  christos             return (Status);
   1292      1.2  christos         }
   1293      1.2  christos 
   1294      1.2  christos         ParentTable = DtPeekSubtable ();
   1295      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   1296      1.2  christos         DtPopSubtable ();
   1297      1.2  christos     }
   1298      1.2  christos 
   1299      1.2  christos     return (AE_OK);
   1300      1.2  christos }
   1301      1.2  christos 
   1302      1.2  christos 
   1303      1.2  christos /******************************************************************************
   1304      1.2  christos  *
   1305      1.2  christos  * FUNCTION:    DtCompileHest
   1306      1.2  christos  *
   1307      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   1308      1.2  christos  *
   1309      1.2  christos  * RETURN:      Status
   1310      1.2  christos  *
   1311      1.2  christos  * DESCRIPTION: Compile HEST.
   1312      1.2  christos  *
   1313      1.2  christos  *****************************************************************************/
   1314      1.2  christos 
   1315      1.2  christos ACPI_STATUS
   1316      1.2  christos DtCompileHest (
   1317      1.2  christos     void                    **List)
   1318      1.2  christos {
   1319      1.2  christos     ACPI_STATUS             Status;
   1320      1.2  christos     DT_SUBTABLE             *Subtable;
   1321      1.2  christos     DT_SUBTABLE             *ParentTable;
   1322      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1323      1.2  christos     DT_FIELD                *SubtableStart;
   1324      1.2  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1325      1.2  christos     UINT16                  Type;
   1326      1.2  christos     UINT32                  BankCount;
   1327      1.2  christos 
   1328      1.2  christos 
   1329      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
   1330      1.2  christos                 &Subtable, TRUE);
   1331      1.2  christos     if (ACPI_FAILURE (Status))
   1332      1.2  christos     {
   1333      1.2  christos         return (Status);
   1334      1.2  christos     }
   1335      1.2  christos 
   1336      1.2  christos     ParentTable = DtPeekSubtable ();
   1337      1.2  christos     DtInsertSubtable (ParentTable, Subtable);
   1338      1.2  christos 
   1339      1.2  christos     while (*PFieldList)
   1340      1.2  christos     {
   1341      1.2  christos         /* Get subtable type */
   1342      1.2  christos 
   1343      1.2  christos         SubtableStart = *PFieldList;
   1344      1.2  christos         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
   1345      1.2  christos 
   1346      1.2  christos         switch (Type)
   1347      1.2  christos         {
   1348      1.2  christos         case ACPI_HEST_TYPE_IA32_CHECK:
   1349      1.2  christos 
   1350      1.2  christos             InfoTable = AcpiDmTableInfoHest0;
   1351      1.1    jruoho             break;
   1352      1.1    jruoho 
   1353      1.1    jruoho         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1354      1.2  christos 
   1355      1.1    jruoho             InfoTable = AcpiDmTableInfoHest1;
   1356      1.1    jruoho             break;
   1357      1.1    jruoho 
   1358      1.1    jruoho         case ACPI_HEST_TYPE_IA32_NMI:
   1359      1.2  christos 
   1360      1.1    jruoho             InfoTable = AcpiDmTableInfoHest2;
   1361      1.1    jruoho             break;
   1362      1.1    jruoho 
   1363      1.1    jruoho         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   1364      1.2  christos 
   1365      1.1    jruoho             InfoTable = AcpiDmTableInfoHest6;
   1366      1.1    jruoho             break;
   1367      1.1    jruoho 
   1368      1.1    jruoho         case ACPI_HEST_TYPE_AER_ENDPOINT:
   1369      1.2  christos 
   1370      1.1    jruoho             InfoTable = AcpiDmTableInfoHest7;
   1371      1.1    jruoho             break;
   1372      1.1    jruoho 
   1373      1.1    jruoho         case ACPI_HEST_TYPE_AER_BRIDGE:
   1374      1.2  christos 
   1375      1.1    jruoho             InfoTable = AcpiDmTableInfoHest8;
   1376      1.1    jruoho             break;
   1377      1.1    jruoho 
   1378      1.1    jruoho         case ACPI_HEST_TYPE_GENERIC_ERROR:
   1379      1.2  christos 
   1380      1.1    jruoho             InfoTable = AcpiDmTableInfoHest9;
   1381      1.1    jruoho             break;
   1382      1.1    jruoho 
   1383      1.1    jruoho         default:
   1384      1.2  christos 
   1385      1.1    jruoho             /* Cannot continue on unknown type */
   1386      1.1    jruoho 
   1387      1.1    jruoho             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
   1388      1.1    jruoho             return (AE_ERROR);
   1389      1.1    jruoho         }
   1390      1.1    jruoho 
   1391      1.1    jruoho         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   1392      1.1    jruoho         if (ACPI_FAILURE (Status))
   1393      1.1    jruoho         {
   1394      1.1    jruoho             return (Status);
   1395      1.1    jruoho         }
   1396      1.1    jruoho 
   1397      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   1398      1.1    jruoho 
   1399      1.1    jruoho         /*
   1400      1.1    jruoho          * Additional subtable data - IA32 Error Bank(s)
   1401      1.1    jruoho          */
   1402      1.1    jruoho         BankCount = 0;
   1403      1.1    jruoho         switch (Type)
   1404      1.1    jruoho         {
   1405      1.1    jruoho         case ACPI_HEST_TYPE_IA32_CHECK:
   1406      1.2  christos 
   1407      1.1    jruoho             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   1408      1.1    jruoho                             Subtable->Buffer))->NumHardwareBanks;
   1409      1.1    jruoho             break;
   1410      1.1    jruoho 
   1411      1.1    jruoho         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1412      1.2  christos 
   1413      1.1    jruoho             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   1414      1.1    jruoho                             Subtable->Buffer))->NumHardwareBanks;
   1415      1.1    jruoho             break;
   1416      1.1    jruoho 
   1417      1.1    jruoho         default:
   1418      1.2  christos 
   1419      1.1    jruoho             break;
   1420      1.1    jruoho         }
   1421      1.1    jruoho 
   1422      1.1    jruoho         while (BankCount)
   1423      1.1    jruoho         {
   1424      1.1    jruoho             Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
   1425      1.1    jruoho                         &Subtable, TRUE);
   1426      1.1    jruoho             if (ACPI_FAILURE (Status))
   1427      1.1    jruoho             {
   1428      1.1    jruoho                 return (Status);
   1429      1.1    jruoho             }
   1430      1.1    jruoho 
   1431      1.1    jruoho             DtInsertSubtable (ParentTable, Subtable);
   1432      1.1    jruoho             BankCount--;
   1433      1.1    jruoho         }
   1434      1.1    jruoho     }
   1435      1.1    jruoho 
   1436      1.2  christos     return (AE_OK);
   1437      1.1    jruoho }
   1438      1.1    jruoho 
   1439      1.1    jruoho 
   1440      1.1    jruoho /******************************************************************************
   1441      1.1    jruoho  *
   1442  1.3.2.2     skrll  * FUNCTION:    DtCompileIort
   1443      1.1    jruoho  *
   1444      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   1445      1.1    jruoho  *
   1446      1.1    jruoho  * RETURN:      Status
   1447      1.1    jruoho  *
   1448  1.3.2.2     skrll  * DESCRIPTION: Compile IORT.
   1449      1.1    jruoho  *
   1450      1.1    jruoho  *****************************************************************************/
   1451      1.1    jruoho 
   1452      1.1    jruoho ACPI_STATUS
   1453  1.3.2.2     skrll DtCompileIort (
   1454      1.1    jruoho     void                    **List)
   1455      1.1    jruoho {
   1456      1.1    jruoho     ACPI_STATUS             Status;
   1457      1.1    jruoho     DT_SUBTABLE             *Subtable;
   1458      1.1    jruoho     DT_SUBTABLE             *ParentTable;
   1459      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1460      1.1    jruoho     DT_FIELD                *SubtableStart;
   1461  1.3.2.2     skrll     ACPI_TABLE_IORT         *Iort;
   1462  1.3.2.2     skrll     ACPI_IORT_NODE          *IortNode;
   1463  1.3.2.2     skrll     ACPI_IORT_ITS_GROUP     *IortItsGroup;
   1464  1.3.2.2     skrll     ACPI_IORT_SMMU          *IortSmmu;
   1465  1.3.2.2     skrll     UINT32                  NodeNumber;
   1466  1.3.2.2     skrll     UINT32                  NodeLength;
   1467  1.3.2.2     skrll     UINT32                  IdMappingNumber;
   1468  1.3.2.2     skrll     UINT32                  ItsNumber;
   1469  1.3.2.2     skrll     UINT32                  ContextIrptNumber;
   1470  1.3.2.2     skrll     UINT32                  PmuIrptNumber;
   1471  1.3.2.2     skrll     UINT32                  PaddingLength;
   1472      1.1    jruoho 
   1473      1.1    jruoho 
   1474  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
   1475  1.3.2.2     skrll 
   1476  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort,
   1477      1.1    jruoho                 &Subtable, TRUE);
   1478      1.1    jruoho     if (ACPI_FAILURE (Status))
   1479      1.1    jruoho     {
   1480      1.1    jruoho         return (Status);
   1481      1.1    jruoho     }
   1482      1.1    jruoho     DtInsertSubtable (ParentTable, Subtable);
   1483      1.1    jruoho 
   1484  1.3.2.2     skrll     /*
   1485  1.3.2.2     skrll      * Using ACPI_SUB_PTR, We needn't define a seperate structure. Care
   1486  1.3.2.2     skrll      * should be taken to avoid accessing ACPI_TABLE_HADER fields.
   1487  1.3.2.2     skrll      */
   1488  1.3.2.2     skrll     Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT,
   1489  1.3.2.2     skrll                     Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
   1490  1.3.2.2     skrll 
   1491  1.3.2.2     skrll     /*
   1492  1.3.2.2     skrll      * OptionalPadding - Variable-length data
   1493  1.3.2.2     skrll      * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT))
   1494  1.3.2.2     skrll      * Optionally allows the generic data types to be used for filling
   1495  1.3.2.2     skrll      * this field.
   1496  1.3.2.2     skrll      */
   1497  1.3.2.2     skrll     Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
   1498  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
   1499  1.3.2.2     skrll                     &Subtable, TRUE);
   1500  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
   1501  1.3.2.2     skrll     {
   1502  1.3.2.2     skrll         return (Status);
   1503  1.3.2.2     skrll     }
   1504  1.3.2.2     skrll     if (Subtable)
   1505  1.3.2.2     skrll     {
   1506  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
   1507  1.3.2.2     skrll         Iort->NodeOffset += Subtable->Length;
   1508  1.3.2.2     skrll     }
   1509  1.3.2.2     skrll     else
   1510  1.3.2.2     skrll     {
   1511  1.3.2.2     skrll         Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList),
   1512  1.3.2.2     skrll                     AcpiDmTableInfoIortHdr[0].Name, &PaddingLength);
   1513  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
   1514  1.3.2.2     skrll         {
   1515  1.3.2.2     skrll             return (Status);
   1516  1.3.2.2     skrll         }
   1517  1.3.2.2     skrll         Iort->NodeOffset += PaddingLength;
   1518  1.3.2.2     skrll     }
   1519  1.3.2.2     skrll 
   1520  1.3.2.2     skrll     NodeNumber = 0;
   1521      1.1    jruoho     while (*PFieldList)
   1522      1.1    jruoho     {
   1523      1.1    jruoho         SubtableStart = *PFieldList;
   1524  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
   1525      1.1    jruoho                     &Subtable, TRUE);
   1526      1.1    jruoho         if (ACPI_FAILURE (Status))
   1527      1.1    jruoho         {
   1528      1.1    jruoho             return (Status);
   1529      1.1    jruoho         }
   1530      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   1531  1.3.2.2     skrll         IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer);
   1532  1.3.2.2     skrll         NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
   1533      1.1    jruoho 
   1534  1.3.2.2     skrll         DtPushSubtable (Subtable);
   1535  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   1536      1.1    jruoho 
   1537  1.3.2.2     skrll         switch (IortNode->Type)
   1538      1.1    jruoho         {
   1539  1.3.2.2     skrll         case ACPI_IORT_NODE_ITS_GROUP:
   1540      1.2  christos 
   1541  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0,
   1542  1.3.2.2     skrll                         &Subtable, TRUE);
   1543  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1544  1.3.2.2     skrll             {
   1545  1.3.2.2     skrll                 return (Status);
   1546  1.3.2.2     skrll             }
   1547  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
   1548  1.3.2.2     skrll             IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer);
   1549  1.3.2.2     skrll             NodeLength += Subtable->Length;
   1550      1.1    jruoho 
   1551  1.3.2.2     skrll             ItsNumber = 0;
   1552  1.3.2.2     skrll             while (*PFieldList)
   1553  1.3.2.2     skrll             {
   1554  1.3.2.2     skrll                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a,
   1555  1.3.2.2     skrll                             &Subtable, TRUE);
   1556  1.3.2.2     skrll                 if (ACPI_FAILURE (Status))
   1557  1.3.2.2     skrll                 {
   1558  1.3.2.2     skrll                     return (Status);
   1559  1.3.2.2     skrll                 }
   1560  1.3.2.2     skrll                 if (!Subtable)
   1561  1.3.2.2     skrll                 {
   1562  1.3.2.2     skrll                     break;
   1563  1.3.2.2     skrll                 }
   1564  1.3.2.2     skrll                 DtInsertSubtable (ParentTable, Subtable);
   1565  1.3.2.2     skrll                 NodeLength += Subtable->Length;
   1566  1.3.2.2     skrll                 ItsNumber++;
   1567  1.3.2.2     skrll             }
   1568      1.2  christos 
   1569  1.3.2.2     skrll             IortItsGroup->ItsCount = ItsNumber;
   1570      1.1    jruoho             break;
   1571      1.1    jruoho 
   1572  1.3.2.2     skrll         case ACPI_IORT_NODE_NAMED_COMPONENT:
   1573      1.2  christos 
   1574  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1,
   1575  1.3.2.2     skrll                         &Subtable, TRUE);
   1576  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1577  1.3.2.2     skrll             {
   1578  1.3.2.2     skrll                 return (Status);
   1579  1.3.2.2     skrll             }
   1580  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
   1581  1.3.2.2     skrll             NodeLength += Subtable->Length;
   1582      1.1    jruoho 
   1583  1.3.2.2     skrll             /*
   1584  1.3.2.2     skrll              * Padding - Variable-length data
   1585  1.3.2.2     skrll              * Optionally allows the offset of the ID mappings to be used
   1586  1.3.2.2     skrll              * for filling this field.
   1587  1.3.2.2     skrll              */
   1588  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a,
   1589  1.3.2.2     skrll                             &Subtable, TRUE);
   1590  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1591  1.3.2.2     skrll             {
   1592  1.3.2.2     skrll                 return (Status);
   1593  1.3.2.2     skrll             }
   1594  1.3.2.2     skrll             if (Subtable)
   1595  1.3.2.2     skrll             {
   1596  1.3.2.2     skrll                 DtInsertSubtable (ParentTable, Subtable);
   1597  1.3.2.2     skrll                 NodeLength += Subtable->Length;
   1598  1.3.2.2     skrll             }
   1599  1.3.2.2     skrll             else
   1600  1.3.2.2     skrll             {
   1601  1.3.2.2     skrll                 if (NodeLength > IortNode->MappingOffset)
   1602  1.3.2.2     skrll                 {
   1603  1.3.2.2     skrll                     return (AE_BAD_DATA);
   1604  1.3.2.2     skrll                 }
   1605  1.3.2.2     skrll                 if (NodeLength < IortNode->MappingOffset)
   1606  1.3.2.2     skrll                 {
   1607  1.3.2.2     skrll                     Status = DtCompilePadding (
   1608  1.3.2.2     skrll                                 IortNode->MappingOffset - NodeLength,
   1609  1.3.2.2     skrll                                 &Subtable);
   1610  1.3.2.2     skrll                     if (ACPI_FAILURE (Status))
   1611  1.3.2.2     skrll                     {
   1612  1.3.2.2     skrll                         return (Status);
   1613  1.3.2.2     skrll                     }
   1614  1.3.2.2     skrll                     DtInsertSubtable (ParentTable, Subtable);
   1615  1.3.2.2     skrll                     NodeLength = IortNode->MappingOffset;
   1616  1.3.2.2     skrll                 }
   1617  1.3.2.2     skrll             }
   1618  1.3.2.2     skrll             break;
   1619      1.1    jruoho 
   1620  1.3.2.2     skrll         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
   1621      1.1    jruoho 
   1622  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2,
   1623  1.3.2.2     skrll                         &Subtable, TRUE);
   1624  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1625      1.1    jruoho             {
   1626  1.3.2.2     skrll                 return (Status);
   1627  1.3.2.2     skrll             }
   1628  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
   1629  1.3.2.2     skrll             NodeLength += Subtable->Length;
   1630  1.3.2.2     skrll             break;
   1631      1.1    jruoho 
   1632  1.3.2.2     skrll         case ACPI_IORT_NODE_SMMU:
   1633      1.1    jruoho 
   1634  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3,
   1635  1.3.2.2     skrll                         &Subtable, TRUE);
   1636  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1637  1.3.2.2     skrll             {
   1638  1.3.2.2     skrll                 return (Status);
   1639  1.3.2.2     skrll             }
   1640  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
   1641  1.3.2.2     skrll             IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer);
   1642  1.3.2.2     skrll             NodeLength += Subtable->Length;
   1643      1.1    jruoho 
   1644  1.3.2.2     skrll             /* Compile global interrupt array */
   1645  1.3.2.2     skrll 
   1646  1.3.2.2     skrll             IortSmmu->GlobalInterruptOffset = NodeLength;
   1647  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
   1648  1.3.2.2     skrll                         &Subtable, TRUE);
   1649  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1650  1.3.2.2     skrll             {
   1651  1.3.2.2     skrll                 return (Status);
   1652  1.3.2.2     skrll             }
   1653  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
   1654  1.3.2.2     skrll             NodeLength += Subtable->Length;
   1655  1.3.2.2     skrll 
   1656  1.3.2.2     skrll             /* Compile context interrupt array */
   1657  1.3.2.2     skrll 
   1658  1.3.2.2     skrll             ContextIrptNumber = 0;
   1659  1.3.2.2     skrll             IortSmmu->ContextInterruptOffset = NodeLength;
   1660  1.3.2.2     skrll             while (*PFieldList)
   1661  1.3.2.2     skrll             {
   1662  1.3.2.2     skrll                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
   1663  1.3.2.2     skrll                             &Subtable, TRUE);
   1664  1.3.2.2     skrll                 if (ACPI_FAILURE (Status))
   1665  1.3.2.2     skrll                 {
   1666  1.3.2.2     skrll                     return (Status);
   1667  1.3.2.2     skrll                 }
   1668  1.3.2.2     skrll                 if (!Subtable)
   1669  1.3.2.2     skrll                 {
   1670  1.3.2.2     skrll                     break;
   1671  1.3.2.2     skrll                 }
   1672  1.3.2.2     skrll                 DtInsertSubtable (ParentTable, Subtable);
   1673  1.3.2.2     skrll                 NodeLength += Subtable->Length;
   1674  1.3.2.2     skrll                 ContextIrptNumber++;
   1675  1.3.2.2     skrll             }
   1676  1.3.2.2     skrll             IortSmmu->ContextInterruptCount = ContextIrptNumber;
   1677  1.3.2.2     skrll 
   1678  1.3.2.2     skrll             /* Compile PMU interrupt array */
   1679  1.3.2.2     skrll 
   1680  1.3.2.2     skrll             PmuIrptNumber = 0;
   1681  1.3.2.2     skrll             IortSmmu->PmuInterruptOffset = NodeLength;
   1682  1.3.2.2     skrll             while (*PFieldList)
   1683  1.3.2.2     skrll             {
   1684  1.3.2.2     skrll                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
   1685  1.3.2.2     skrll                             &Subtable, TRUE);
   1686  1.3.2.2     skrll                 if (ACPI_FAILURE (Status))
   1687  1.3.2.2     skrll                 {
   1688  1.3.2.2     skrll                     return (Status);
   1689  1.3.2.2     skrll                 }
   1690  1.3.2.2     skrll                 if (!Subtable)
   1691  1.3.2.2     skrll                 {
   1692  1.3.2.2     skrll                     break;
   1693  1.3.2.2     skrll                 }
   1694  1.3.2.2     skrll                 DtInsertSubtable (ParentTable, Subtable);
   1695  1.3.2.2     skrll                 NodeLength += Subtable->Length;
   1696  1.3.2.2     skrll                 PmuIrptNumber++;
   1697  1.3.2.2     skrll             }
   1698  1.3.2.2     skrll             IortSmmu->PmuInterruptCount = PmuIrptNumber;
   1699  1.3.2.2     skrll             break;
   1700  1.3.2.2     skrll 
   1701  1.3.2.2     skrll         default:
   1702  1.3.2.2     skrll 
   1703  1.3.2.2     skrll             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
   1704  1.3.2.2     skrll             return (AE_ERROR);
   1705  1.3.2.2     skrll         }
   1706  1.3.2.2     skrll 
   1707  1.3.2.2     skrll         /* Compile Array of ID mappings */
   1708  1.3.2.2     skrll 
   1709  1.3.2.2     skrll         IortNode->MappingOffset = NodeLength;
   1710  1.3.2.2     skrll         IdMappingNumber = 0;
   1711  1.3.2.2     skrll         while (*PFieldList)
   1712  1.3.2.2     skrll         {
   1713  1.3.2.2     skrll             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap,
   1714  1.3.2.2     skrll                         &Subtable, TRUE);
   1715  1.3.2.2     skrll             if (ACPI_FAILURE (Status))
   1716  1.3.2.2     skrll             {
   1717  1.3.2.2     skrll                 return (Status);
   1718  1.3.2.2     skrll             }
   1719  1.3.2.2     skrll             if (!Subtable)
   1720  1.3.2.2     skrll             {
   1721  1.3.2.2     skrll                 break;
   1722  1.3.2.2     skrll             }
   1723  1.3.2.2     skrll             DtInsertSubtable (ParentTable, Subtable);
   1724  1.3.2.2     skrll             NodeLength += sizeof (ACPI_IORT_ID_MAPPING);
   1725  1.3.2.2     skrll             IdMappingNumber++;
   1726  1.3.2.2     skrll         }
   1727  1.3.2.2     skrll         IortNode->MappingCount = IdMappingNumber;
   1728  1.3.2.2     skrll 
   1729  1.3.2.2     skrll         /*
   1730  1.3.2.2     skrll          * Node length can be determined by DT_LENGTH option
   1731  1.3.2.2     skrll          * IortNode->Length = NodeLength;
   1732  1.3.2.2     skrll          */
   1733  1.3.2.2     skrll         DtPopSubtable ();
   1734  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   1735  1.3.2.2     skrll         NodeNumber++;
   1736  1.3.2.2     skrll     }
   1737  1.3.2.2     skrll     Iort->NodeCount = NodeNumber;
   1738  1.3.2.2     skrll 
   1739  1.3.2.2     skrll     return (AE_OK);
   1740  1.3.2.2     skrll }
   1741  1.3.2.2     skrll 
   1742  1.3.2.2     skrll 
   1743  1.3.2.2     skrll /******************************************************************************
   1744  1.3.2.2     skrll  *
   1745  1.3.2.2     skrll  * FUNCTION:    DtCompileIvrs
   1746  1.3.2.2     skrll  *
   1747  1.3.2.2     skrll  * PARAMETERS:  List                - Current field list pointer
   1748  1.3.2.2     skrll  *
   1749  1.3.2.2     skrll  * RETURN:      Status
   1750  1.3.2.2     skrll  *
   1751  1.3.2.2     skrll  * DESCRIPTION: Compile IVRS.
   1752  1.3.2.2     skrll  *
   1753  1.3.2.2     skrll  *****************************************************************************/
   1754  1.3.2.2     skrll 
   1755  1.3.2.2     skrll ACPI_STATUS
   1756  1.3.2.2     skrll DtCompileIvrs (
   1757  1.3.2.2     skrll     void                    **List)
   1758  1.3.2.2     skrll {
   1759  1.3.2.2     skrll     ACPI_STATUS             Status;
   1760  1.3.2.2     skrll     DT_SUBTABLE             *Subtable;
   1761  1.3.2.2     skrll     DT_SUBTABLE             *ParentTable;
   1762  1.3.2.2     skrll     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1763  1.3.2.2     skrll     DT_FIELD                *SubtableStart;
   1764  1.3.2.2     skrll     ACPI_DMTABLE_INFO       *InfoTable;
   1765  1.3.2.2     skrll     ACPI_IVRS_HEADER        *IvrsHeader;
   1766  1.3.2.2     skrll     UINT8                   EntryType;
   1767  1.3.2.2     skrll 
   1768  1.3.2.2     skrll 
   1769  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
   1770  1.3.2.2     skrll                 &Subtable, TRUE);
   1771  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
   1772  1.3.2.2     skrll     {
   1773  1.3.2.2     skrll         return (Status);
   1774  1.3.2.2     skrll     }
   1775  1.3.2.2     skrll 
   1776  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
   1777  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
   1778  1.3.2.2     skrll 
   1779  1.3.2.2     skrll     while (*PFieldList)
   1780  1.3.2.2     skrll     {
   1781  1.3.2.2     skrll         SubtableStart = *PFieldList;
   1782  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
   1783  1.3.2.2     skrll                     &Subtable, TRUE);
   1784  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
   1785  1.3.2.2     skrll         {
   1786  1.3.2.2     skrll             return (Status);
   1787  1.3.2.2     skrll         }
   1788  1.3.2.2     skrll 
   1789  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   1790  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
   1791  1.3.2.2     skrll         DtPushSubtable (Subtable);
   1792  1.3.2.2     skrll 
   1793  1.3.2.2     skrll         IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
   1794  1.3.2.2     skrll 
   1795  1.3.2.2     skrll         switch (IvrsHeader->Type)
   1796  1.3.2.2     skrll         {
   1797  1.3.2.2     skrll         case ACPI_IVRS_TYPE_HARDWARE:
   1798  1.3.2.2     skrll 
   1799  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoIvrs0;
   1800  1.3.2.2     skrll             break;
   1801  1.3.2.2     skrll 
   1802  1.3.2.2     skrll         case ACPI_IVRS_TYPE_MEMORY1:
   1803  1.3.2.2     skrll         case ACPI_IVRS_TYPE_MEMORY2:
   1804  1.3.2.2     skrll         case ACPI_IVRS_TYPE_MEMORY3:
   1805  1.3.2.2     skrll 
   1806  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoIvrs1;
   1807  1.3.2.2     skrll             break;
   1808  1.3.2.2     skrll 
   1809  1.3.2.2     skrll         default:
   1810  1.3.2.2     skrll 
   1811  1.3.2.2     skrll             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
   1812  1.3.2.2     skrll             return (AE_ERROR);
   1813  1.3.2.2     skrll         }
   1814  1.3.2.2     skrll 
   1815  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   1816  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
   1817  1.3.2.2     skrll         {
   1818  1.3.2.2     skrll             return (Status);
   1819  1.3.2.2     skrll         }
   1820  1.3.2.2     skrll 
   1821  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   1822  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
   1823  1.3.2.2     skrll 
   1824  1.3.2.2     skrll         if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
   1825  1.3.2.2     skrll         {
   1826  1.3.2.2     skrll             while (*PFieldList &&
   1827  1.3.2.2     skrll                     !strcmp ((*PFieldList)->Name, "Entry Type"))
   1828  1.3.2.2     skrll             {
   1829  1.3.2.2     skrll                 SubtableStart = *PFieldList;
   1830  1.3.2.2     skrll                 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
   1831  1.3.2.2     skrll 
   1832  1.3.2.2     skrll                 switch (EntryType)
   1833  1.3.2.2     skrll                 {
   1834  1.3.2.2     skrll                 /* 4-byte device entries */
   1835  1.3.2.2     skrll 
   1836  1.3.2.2     skrll                 case ACPI_IVRS_TYPE_PAD4:
   1837  1.3.2.2     skrll                 case ACPI_IVRS_TYPE_ALL:
   1838  1.3.2.2     skrll                 case ACPI_IVRS_TYPE_SELECT:
   1839  1.3.2.2     skrll                 case ACPI_IVRS_TYPE_START:
   1840  1.3.2.2     skrll                 case ACPI_IVRS_TYPE_END:
   1841  1.3.2.2     skrll 
   1842  1.3.2.2     skrll                     InfoTable = AcpiDmTableInfoIvrs4;
   1843  1.3.2.2     skrll                     break;
   1844      1.1    jruoho 
   1845      1.1    jruoho                 /* 8-byte entries, type A */
   1846      1.1    jruoho 
   1847      1.1    jruoho                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
   1848      1.1    jruoho                 case ACPI_IVRS_TYPE_ALIAS_START:
   1849      1.1    jruoho 
   1850      1.1    jruoho                     InfoTable = AcpiDmTableInfoIvrs8a;
   1851      1.1    jruoho                     break;
   1852      1.1    jruoho 
   1853      1.1    jruoho                 /* 8-byte entries, type B */
   1854      1.1    jruoho 
   1855      1.1    jruoho                 case ACPI_IVRS_TYPE_PAD8:
   1856      1.1    jruoho                 case ACPI_IVRS_TYPE_EXT_SELECT:
   1857      1.1    jruoho                 case ACPI_IVRS_TYPE_EXT_START:
   1858      1.1    jruoho 
   1859      1.1    jruoho                     InfoTable = AcpiDmTableInfoIvrs8b;
   1860      1.1    jruoho                     break;
   1861      1.1    jruoho 
   1862      1.1    jruoho                 /* 8-byte entries, type C */
   1863      1.1    jruoho 
   1864      1.1    jruoho                 case ACPI_IVRS_TYPE_SPECIAL:
   1865      1.1    jruoho 
   1866      1.1    jruoho                     InfoTable = AcpiDmTableInfoIvrs8c;
   1867      1.1    jruoho                     break;
   1868      1.1    jruoho 
   1869      1.1    jruoho                 default:
   1870      1.2  christos 
   1871      1.1    jruoho                     DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
   1872      1.1    jruoho                         "IVRS Device Entry");
   1873      1.1    jruoho                     return (AE_ERROR);
   1874      1.1    jruoho                 }
   1875      1.1    jruoho 
   1876      1.1    jruoho                 Status = DtCompileTable (PFieldList, InfoTable,
   1877      1.1    jruoho                             &Subtable, TRUE);
   1878      1.1    jruoho                 if (ACPI_FAILURE (Status))
   1879      1.1    jruoho                 {
   1880      1.1    jruoho                     return (Status);
   1881      1.1    jruoho                 }
   1882      1.1    jruoho 
   1883      1.1    jruoho                 DtInsertSubtable (ParentTable, Subtable);
   1884      1.1    jruoho             }
   1885      1.1    jruoho         }
   1886      1.1    jruoho 
   1887      1.1    jruoho         DtPopSubtable ();
   1888      1.1    jruoho     }
   1889      1.1    jruoho 
   1890      1.1    jruoho     return (AE_OK);
   1891      1.1    jruoho }
   1892      1.1    jruoho 
   1893      1.1    jruoho 
   1894      1.1    jruoho /******************************************************************************
   1895      1.1    jruoho  *
   1896      1.3  christos  * FUNCTION:    DtCompileLpit
   1897      1.3  christos  *
   1898      1.3  christos  * PARAMETERS:  List                - Current field list pointer
   1899      1.3  christos  *
   1900      1.3  christos  * RETURN:      Status
   1901      1.3  christos  *
   1902      1.3  christos  * DESCRIPTION: Compile LPIT.
   1903      1.3  christos  *
   1904      1.3  christos  *****************************************************************************/
   1905      1.3  christos 
   1906      1.3  christos ACPI_STATUS
   1907      1.3  christos DtCompileLpit (
   1908      1.3  christos     void                    **List)
   1909      1.3  christos {
   1910      1.3  christos     ACPI_STATUS             Status;
   1911      1.3  christos     DT_SUBTABLE             *Subtable;
   1912      1.3  christos     DT_SUBTABLE             *ParentTable;
   1913      1.3  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1914      1.3  christos     DT_FIELD                *SubtableStart;
   1915      1.3  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1916      1.3  christos     ACPI_LPIT_HEADER        *LpitHeader;
   1917      1.3  christos 
   1918      1.3  christos 
   1919      1.3  christos     /* Note: Main table consists only of the standard ACPI table header */
   1920      1.3  christos 
   1921      1.3  christos     while (*PFieldList)
   1922      1.3  christos     {
   1923      1.3  christos         SubtableStart = *PFieldList;
   1924      1.3  christos 
   1925      1.3  christos         /* LPIT Subtable header */
   1926      1.3  christos 
   1927      1.3  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
   1928      1.3  christos                     &Subtable, TRUE);
   1929      1.3  christos         if (ACPI_FAILURE (Status))
   1930      1.3  christos         {
   1931      1.3  christos             return (Status);
   1932      1.3  christos         }
   1933      1.3  christos 
   1934      1.3  christos         ParentTable = DtPeekSubtable ();
   1935      1.3  christos         DtInsertSubtable (ParentTable, Subtable);
   1936      1.3  christos         DtPushSubtable (Subtable);
   1937      1.3  christos 
   1938      1.3  christos         LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
   1939      1.3  christos 
   1940      1.3  christos         switch (LpitHeader->Type)
   1941      1.3  christos         {
   1942      1.3  christos         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
   1943      1.3  christos 
   1944      1.3  christos             InfoTable = AcpiDmTableInfoLpit0;
   1945      1.3  christos             break;
   1946      1.3  christos 
   1947      1.3  christos         default:
   1948      1.3  christos 
   1949      1.3  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
   1950      1.3  christos             return (AE_ERROR);
   1951      1.3  christos         }
   1952      1.3  christos 
   1953      1.3  christos         /* LPIT Subtable */
   1954      1.3  christos 
   1955      1.3  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   1956      1.3  christos         if (ACPI_FAILURE (Status))
   1957      1.3  christos         {
   1958      1.3  christos             return (Status);
   1959      1.3  christos         }
   1960      1.3  christos 
   1961      1.3  christos         ParentTable = DtPeekSubtable ();
   1962      1.3  christos         DtInsertSubtable (ParentTable, Subtable);
   1963      1.3  christos         DtPopSubtable ();
   1964      1.3  christos     }
   1965      1.3  christos 
   1966      1.3  christos     return (AE_OK);
   1967      1.3  christos }
   1968      1.3  christos 
   1969      1.3  christos 
   1970      1.3  christos /******************************************************************************
   1971      1.3  christos  *
   1972      1.1    jruoho  * FUNCTION:    DtCompileMadt
   1973      1.1    jruoho  *
   1974      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   1975      1.1    jruoho  *
   1976      1.1    jruoho  * RETURN:      Status
   1977      1.1    jruoho  *
   1978      1.1    jruoho  * DESCRIPTION: Compile MADT.
   1979      1.1    jruoho  *
   1980      1.1    jruoho  *****************************************************************************/
   1981      1.1    jruoho 
   1982      1.1    jruoho ACPI_STATUS
   1983      1.1    jruoho DtCompileMadt (
   1984      1.1    jruoho     void                    **List)
   1985      1.1    jruoho {
   1986      1.1    jruoho     ACPI_STATUS             Status;
   1987      1.1    jruoho     DT_SUBTABLE             *Subtable;
   1988      1.1    jruoho     DT_SUBTABLE             *ParentTable;
   1989      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1990      1.1    jruoho     DT_FIELD                *SubtableStart;
   1991      1.1    jruoho     ACPI_SUBTABLE_HEADER    *MadtHeader;
   1992      1.1    jruoho     ACPI_DMTABLE_INFO       *InfoTable;
   1993      1.1    jruoho 
   1994      1.1    jruoho 
   1995      1.1    jruoho     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
   1996      1.1    jruoho                 &Subtable, TRUE);
   1997      1.1    jruoho     if (ACPI_FAILURE (Status))
   1998      1.1    jruoho     {
   1999      1.1    jruoho         return (Status);
   2000      1.1    jruoho     }
   2001      1.1    jruoho 
   2002      1.1    jruoho     ParentTable = DtPeekSubtable ();
   2003      1.1    jruoho     DtInsertSubtable (ParentTable, Subtable);
   2004      1.1    jruoho 
   2005      1.1    jruoho     while (*PFieldList)
   2006      1.1    jruoho     {
   2007      1.1    jruoho         SubtableStart = *PFieldList;
   2008      1.1    jruoho         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
   2009      1.1    jruoho                     &Subtable, TRUE);
   2010      1.1    jruoho         if (ACPI_FAILURE (Status))
   2011      1.1    jruoho         {
   2012      1.1    jruoho             return (Status);
   2013      1.1    jruoho         }
   2014      1.1    jruoho 
   2015      1.1    jruoho         ParentTable = DtPeekSubtable ();
   2016      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   2017      1.1    jruoho         DtPushSubtable (Subtable);
   2018      1.1    jruoho 
   2019      1.1    jruoho         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   2020      1.1    jruoho 
   2021      1.1    jruoho         switch (MadtHeader->Type)
   2022      1.1    jruoho         {
   2023      1.1    jruoho         case ACPI_MADT_TYPE_LOCAL_APIC:
   2024      1.2  christos 
   2025      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt0;
   2026      1.1    jruoho             break;
   2027      1.2  christos 
   2028      1.1    jruoho         case ACPI_MADT_TYPE_IO_APIC:
   2029      1.2  christos 
   2030      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt1;
   2031      1.1    jruoho             break;
   2032      1.2  christos 
   2033      1.1    jruoho         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
   2034      1.2  christos 
   2035      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt2;
   2036      1.1    jruoho             break;
   2037      1.2  christos 
   2038      1.1    jruoho         case ACPI_MADT_TYPE_NMI_SOURCE:
   2039      1.2  christos 
   2040      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt3;
   2041      1.1    jruoho             break;
   2042      1.2  christos 
   2043      1.1    jruoho         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
   2044      1.2  christos 
   2045      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt4;
   2046      1.1    jruoho             break;
   2047      1.2  christos 
   2048      1.1    jruoho         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
   2049      1.2  christos 
   2050      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt5;
   2051      1.1    jruoho             break;
   2052      1.2  christos 
   2053      1.1    jruoho         case ACPI_MADT_TYPE_IO_SAPIC:
   2054      1.2  christos 
   2055      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt6;
   2056      1.1    jruoho             break;
   2057      1.2  christos 
   2058      1.1    jruoho         case ACPI_MADT_TYPE_LOCAL_SAPIC:
   2059      1.2  christos 
   2060      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt7;
   2061      1.1    jruoho             break;
   2062      1.2  christos 
   2063      1.1    jruoho         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
   2064      1.2  christos 
   2065      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt8;
   2066      1.1    jruoho             break;
   2067      1.2  christos 
   2068      1.1    jruoho         case ACPI_MADT_TYPE_LOCAL_X2APIC:
   2069      1.2  christos 
   2070      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt9;
   2071      1.1    jruoho             break;
   2072      1.2  christos 
   2073      1.1    jruoho         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
   2074      1.2  christos 
   2075      1.1    jruoho             InfoTable = AcpiDmTableInfoMadt10;
   2076      1.1    jruoho             break;
   2077      1.2  christos 
   2078      1.2  christos         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
   2079      1.2  christos 
   2080      1.2  christos             InfoTable = AcpiDmTableInfoMadt11;
   2081      1.2  christos             break;
   2082      1.2  christos 
   2083      1.2  christos         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
   2084      1.2  christos 
   2085      1.2  christos             InfoTable = AcpiDmTableInfoMadt12;
   2086      1.2  christos             break;
   2087      1.2  christos 
   2088      1.3  christos         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
   2089      1.3  christos 
   2090      1.3  christos             InfoTable = AcpiDmTableInfoMadt13;
   2091      1.3  christos             break;
   2092      1.3  christos 
   2093      1.3  christos         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
   2094      1.3  christos 
   2095      1.3  christos             InfoTable = AcpiDmTableInfoMadt14;
   2096      1.3  christos             break;
   2097      1.3  christos 
   2098  1.3.2.2     skrll         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
   2099  1.3.2.2     skrll 
   2100  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoMadt15;
   2101  1.3.2.2     skrll             break;
   2102  1.3.2.2     skrll 
   2103      1.1    jruoho         default:
   2104      1.2  christos 
   2105      1.1    jruoho             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
   2106      1.1    jruoho             return (AE_ERROR);
   2107      1.1    jruoho         }
   2108      1.1    jruoho 
   2109      1.1    jruoho         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   2110      1.1    jruoho         if (ACPI_FAILURE (Status))
   2111      1.1    jruoho         {
   2112      1.1    jruoho             return (Status);
   2113      1.1    jruoho         }
   2114      1.1    jruoho 
   2115      1.1    jruoho         ParentTable = DtPeekSubtable ();
   2116      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   2117      1.1    jruoho         DtPopSubtable ();
   2118      1.1    jruoho     }
   2119      1.1    jruoho 
   2120      1.1    jruoho     return (AE_OK);
   2121      1.1    jruoho }
   2122      1.1    jruoho 
   2123      1.1    jruoho 
   2124      1.1    jruoho /******************************************************************************
   2125      1.1    jruoho  *
   2126      1.1    jruoho  * FUNCTION:    DtCompileMcfg
   2127      1.1    jruoho  *
   2128      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   2129      1.1    jruoho  *
   2130      1.1    jruoho  * RETURN:      Status
   2131      1.1    jruoho  *
   2132      1.1    jruoho  * DESCRIPTION: Compile MCFG.
   2133      1.1    jruoho  *
   2134      1.1    jruoho  *****************************************************************************/
   2135      1.1    jruoho 
   2136      1.1    jruoho ACPI_STATUS
   2137      1.1    jruoho DtCompileMcfg (
   2138      1.1    jruoho     void                    **List)
   2139      1.1    jruoho {
   2140      1.1    jruoho     ACPI_STATUS             Status;
   2141      1.1    jruoho 
   2142      1.1    jruoho 
   2143      1.1    jruoho     Status = DtCompileTwoSubtables (List,
   2144      1.1    jruoho                  AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
   2145      1.1    jruoho     return (Status);
   2146      1.1    jruoho }
   2147      1.1    jruoho 
   2148      1.1    jruoho 
   2149      1.1    jruoho /******************************************************************************
   2150      1.1    jruoho  *
   2151      1.2  christos  * FUNCTION:    DtCompileMpst
   2152      1.2  christos  *
   2153      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   2154      1.2  christos  *
   2155      1.2  christos  * RETURN:      Status
   2156      1.2  christos  *
   2157      1.2  christos  * DESCRIPTION: Compile MPST.
   2158      1.2  christos  *
   2159      1.2  christos  *****************************************************************************/
   2160      1.2  christos 
   2161      1.2  christos ACPI_STATUS
   2162      1.2  christos DtCompileMpst (
   2163      1.2  christos     void                    **List)
   2164      1.2  christos {
   2165      1.2  christos     ACPI_STATUS             Status;
   2166      1.2  christos     DT_SUBTABLE             *Subtable;
   2167      1.2  christos     DT_SUBTABLE             *ParentTable;
   2168      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2169      1.2  christos     ACPI_MPST_CHANNEL       *MpstChannelInfo;
   2170      1.2  christos     ACPI_MPST_POWER_NODE    *MpstPowerNode;
   2171      1.2  christos     ACPI_MPST_DATA_HDR      *MpstDataHeader;
   2172      1.2  christos     UINT16                  SubtableCount;
   2173      1.2  christos     UINT32                  PowerStateCount;
   2174      1.2  christos     UINT32                  ComponentCount;
   2175      1.2  christos 
   2176      1.2  christos 
   2177      1.2  christos     /* Main table */
   2178      1.2  christos 
   2179      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
   2180      1.2  christos     if (ACPI_FAILURE (Status))
   2181      1.2  christos     {
   2182      1.2  christos         return (Status);
   2183      1.2  christos     }
   2184      1.2  christos 
   2185      1.2  christos     ParentTable = DtPeekSubtable ();
   2186      1.2  christos     DtInsertSubtable (ParentTable, Subtable);
   2187      1.2  christos     DtPushSubtable (Subtable);
   2188      1.2  christos 
   2189      1.2  christos     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
   2190      1.2  christos     SubtableCount = MpstChannelInfo->PowerNodeCount;
   2191      1.2  christos 
   2192      1.2  christos     while (*PFieldList && SubtableCount)
   2193      1.2  christos     {
   2194      1.2  christos         /* Subtable: Memory Power Node(s) */
   2195      1.2  christos 
   2196      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
   2197      1.2  christos                     &Subtable, TRUE);
   2198      1.2  christos         if (ACPI_FAILURE (Status))
   2199      1.2  christos         {
   2200      1.2  christos             return (Status);
   2201      1.2  christos         }
   2202      1.2  christos 
   2203      1.2  christos         ParentTable = DtPeekSubtable ();
   2204      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2205      1.2  christos         DtPushSubtable (Subtable);
   2206      1.2  christos 
   2207      1.2  christos         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
   2208      1.2  christos         PowerStateCount = MpstPowerNode->NumPowerStates;
   2209      1.2  christos         ComponentCount = MpstPowerNode->NumPhysicalComponents;
   2210      1.2  christos 
   2211      1.2  christos         ParentTable = DtPeekSubtable ();
   2212      1.2  christos 
   2213      1.2  christos         /* Sub-subtables - Memory Power State Structure(s) */
   2214      1.2  christos 
   2215      1.2  christos         while (*PFieldList && PowerStateCount)
   2216      1.2  christos         {
   2217      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
   2218      1.2  christos                         &Subtable, TRUE);
   2219      1.2  christos             if (ACPI_FAILURE (Status))
   2220      1.2  christos             {
   2221      1.2  christos                 return (Status);
   2222      1.2  christos             }
   2223      1.2  christos 
   2224      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   2225      1.2  christos             PowerStateCount--;
   2226      1.2  christos         }
   2227      1.2  christos 
   2228      1.2  christos         /* Sub-subtables - Physical Component ID Structure(s) */
   2229      1.2  christos 
   2230      1.2  christos         while (*PFieldList && ComponentCount)
   2231      1.2  christos         {
   2232      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
   2233      1.2  christos                         &Subtable, TRUE);
   2234      1.2  christos             if (ACPI_FAILURE (Status))
   2235      1.2  christos             {
   2236      1.2  christos                 return (Status);
   2237      1.2  christos             }
   2238      1.2  christos 
   2239      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   2240      1.2  christos             ComponentCount--;
   2241      1.2  christos         }
   2242      1.2  christos 
   2243      1.2  christos         SubtableCount--;
   2244      1.2  christos         DtPopSubtable ();
   2245      1.2  christos     }
   2246      1.2  christos 
   2247      1.2  christos     /* Subtable: Count of Memory Power State Characteristic structures */
   2248      1.2  christos 
   2249      1.2  christos     DtPopSubtable ();
   2250      1.2  christos 
   2251      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
   2252      1.2  christos     if (ACPI_FAILURE (Status))
   2253      1.2  christos     {
   2254      1.2  christos         return (Status);
   2255      1.2  christos     }
   2256      1.2  christos 
   2257      1.2  christos     ParentTable = DtPeekSubtable ();
   2258      1.2  christos     DtInsertSubtable (ParentTable, Subtable);
   2259      1.2  christos     DtPushSubtable (Subtable);
   2260      1.2  christos 
   2261      1.2  christos     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
   2262      1.2  christos     SubtableCount = MpstDataHeader->CharacteristicsCount;
   2263      1.2  christos 
   2264      1.2  christos     ParentTable = DtPeekSubtable ();
   2265      1.2  christos 
   2266      1.2  christos     /* Subtable: Memory Power State Characteristics structure(s) */
   2267      1.2  christos 
   2268      1.2  christos     while (*PFieldList && SubtableCount)
   2269      1.2  christos     {
   2270      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
   2271      1.2  christos                     &Subtable, TRUE);
   2272      1.2  christos         if (ACPI_FAILURE (Status))
   2273      1.2  christos         {
   2274      1.2  christos             return (Status);
   2275      1.2  christos         }
   2276      1.2  christos 
   2277      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2278      1.2  christos         SubtableCount--;
   2279      1.2  christos     }
   2280      1.2  christos 
   2281      1.2  christos     DtPopSubtable ();
   2282      1.2  christos     return (AE_OK);
   2283      1.2  christos }
   2284      1.2  christos 
   2285      1.2  christos 
   2286      1.2  christos /******************************************************************************
   2287      1.2  christos  *
   2288      1.1    jruoho  * FUNCTION:    DtCompileMsct
   2289      1.1    jruoho  *
   2290      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   2291      1.1    jruoho  *
   2292      1.1    jruoho  * RETURN:      Status
   2293      1.1    jruoho  *
   2294      1.1    jruoho  * DESCRIPTION: Compile MSCT.
   2295      1.1    jruoho  *
   2296      1.1    jruoho  *****************************************************************************/
   2297      1.1    jruoho 
   2298      1.1    jruoho ACPI_STATUS
   2299      1.1    jruoho DtCompileMsct (
   2300      1.1    jruoho     void                    **List)
   2301      1.1    jruoho {
   2302      1.1    jruoho     ACPI_STATUS             Status;
   2303      1.1    jruoho 
   2304      1.1    jruoho 
   2305      1.1    jruoho     Status = DtCompileTwoSubtables (List,
   2306      1.1    jruoho                  AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
   2307      1.1    jruoho     return (Status);
   2308      1.1    jruoho }
   2309      1.1    jruoho 
   2310      1.1    jruoho 
   2311      1.1    jruoho /******************************************************************************
   2312      1.1    jruoho  *
   2313      1.2  christos  * FUNCTION:    DtCompileMtmr
   2314      1.1    jruoho  *
   2315      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   2316      1.1    jruoho  *
   2317      1.1    jruoho  * RETURN:      Status
   2318      1.1    jruoho  *
   2319      1.2  christos  * DESCRIPTION: Compile MTMR.
   2320      1.1    jruoho  *
   2321      1.1    jruoho  *****************************************************************************/
   2322      1.1    jruoho 
   2323      1.1    jruoho ACPI_STATUS
   2324      1.2  christos DtCompileMtmr (
   2325      1.1    jruoho     void                    **List)
   2326      1.1    jruoho {
   2327      1.2  christos     ACPI_STATUS             Status;
   2328      1.1    jruoho 
   2329      1.1    jruoho 
   2330      1.2  christos     Status = DtCompileTwoSubtables (List,
   2331      1.2  christos                  AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
   2332      1.2  christos     return (Status);
   2333      1.1    jruoho }
   2334      1.1    jruoho 
   2335      1.1    jruoho 
   2336      1.1    jruoho /******************************************************************************
   2337      1.1    jruoho  *
   2338  1.3.2.2     skrll  * FUNCTION:    DtCompileNfit
   2339  1.3.2.2     skrll  *
   2340  1.3.2.2     skrll  * PARAMETERS:  List                - Current field list pointer
   2341  1.3.2.2     skrll  *
   2342  1.3.2.2     skrll  * RETURN:      Status
   2343  1.3.2.2     skrll  *
   2344  1.3.2.2     skrll  * DESCRIPTION: Compile NFIT.
   2345  1.3.2.2     skrll  *
   2346  1.3.2.2     skrll  *****************************************************************************/
   2347  1.3.2.2     skrll 
   2348  1.3.2.2     skrll ACPI_STATUS
   2349  1.3.2.2     skrll DtCompileNfit (
   2350  1.3.2.2     skrll     void                    **List)
   2351  1.3.2.2     skrll {
   2352  1.3.2.2     skrll     ACPI_STATUS             Status;
   2353  1.3.2.2     skrll     DT_SUBTABLE             *Subtable;
   2354  1.3.2.2     skrll     DT_SUBTABLE             *ParentTable;
   2355  1.3.2.2     skrll     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2356  1.3.2.2     skrll     DT_FIELD                *SubtableStart;
   2357  1.3.2.2     skrll     ACPI_NFIT_HEADER        *NfitHeader;
   2358  1.3.2.2     skrll     ACPI_DMTABLE_INFO       *InfoTable;
   2359  1.3.2.2     skrll     UINT32                  Count;
   2360  1.3.2.2     skrll     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
   2361  1.3.2.2     skrll     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
   2362  1.3.2.2     skrll 
   2363  1.3.2.2     skrll     /* Main table */
   2364  1.3.2.2     skrll 
   2365  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
   2366  1.3.2.2     skrll                 &Subtable, TRUE);
   2367  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
   2368  1.3.2.2     skrll     {
   2369  1.3.2.2     skrll         return (Status);
   2370  1.3.2.2     skrll     }
   2371  1.3.2.2     skrll 
   2372  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
   2373  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
   2374  1.3.2.2     skrll     DtPushSubtable (Subtable);
   2375  1.3.2.2     skrll 
   2376  1.3.2.2     skrll     /* Subtables */
   2377  1.3.2.2     skrll 
   2378  1.3.2.2     skrll     while (*PFieldList)
   2379  1.3.2.2     skrll     {
   2380  1.3.2.2     skrll         SubtableStart = *PFieldList;
   2381  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
   2382  1.3.2.2     skrll                     &Subtable, TRUE);
   2383  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
   2384  1.3.2.2     skrll         {
   2385  1.3.2.2     skrll             return (Status);
   2386  1.3.2.2     skrll         }
   2387  1.3.2.2     skrll 
   2388  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   2389  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
   2390  1.3.2.2     skrll         DtPushSubtable (Subtable);
   2391  1.3.2.2     skrll 
   2392  1.3.2.2     skrll         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
   2393  1.3.2.2     skrll 
   2394  1.3.2.2     skrll         switch (NfitHeader->Type)
   2395  1.3.2.2     skrll         {
   2396  1.3.2.2     skrll         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
   2397  1.3.2.2     skrll 
   2398  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoNfit0;
   2399  1.3.2.2     skrll             break;
   2400  1.3.2.2     skrll 
   2401  1.3.2.2     skrll         case ACPI_NFIT_TYPE_MEMORY_MAP:
   2402  1.3.2.2     skrll 
   2403  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoNfit1;
   2404  1.3.2.2     skrll             break;
   2405  1.3.2.2     skrll 
   2406  1.3.2.2     skrll         case ACPI_NFIT_TYPE_INTERLEAVE:
   2407  1.3.2.2     skrll 
   2408  1.3.2.2     skrll             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
   2409  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoNfit2;
   2410  1.3.2.2     skrll             break;
   2411  1.3.2.2     skrll 
   2412  1.3.2.2     skrll         case ACPI_NFIT_TYPE_SMBIOS:
   2413  1.3.2.2     skrll 
   2414  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoNfit3;
   2415  1.3.2.2     skrll             break;
   2416  1.3.2.2     skrll 
   2417  1.3.2.2     skrll         case ACPI_NFIT_TYPE_CONTROL_REGION:
   2418  1.3.2.2     skrll 
   2419  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoNfit4;
   2420  1.3.2.2     skrll             break;
   2421  1.3.2.2     skrll 
   2422  1.3.2.2     skrll         case ACPI_NFIT_TYPE_DATA_REGION:
   2423  1.3.2.2     skrll 
   2424  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoNfit5;
   2425  1.3.2.2     skrll             break;
   2426  1.3.2.2     skrll 
   2427  1.3.2.2     skrll         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   2428  1.3.2.2     skrll 
   2429  1.3.2.2     skrll             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
   2430  1.3.2.2     skrll             InfoTable = AcpiDmTableInfoNfit6;
   2431  1.3.2.2     skrll             break;
   2432  1.3.2.2     skrll 
   2433  1.3.2.2     skrll         default:
   2434  1.3.2.2     skrll 
   2435  1.3.2.2     skrll             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
   2436  1.3.2.2     skrll             return (AE_ERROR);
   2437  1.3.2.2     skrll         }
   2438  1.3.2.2     skrll 
   2439  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   2440  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
   2441  1.3.2.2     skrll         {
   2442  1.3.2.2     skrll             return (Status);
   2443  1.3.2.2     skrll         }
   2444  1.3.2.2     skrll 
   2445  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   2446  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
   2447  1.3.2.2     skrll         DtPopSubtable ();
   2448  1.3.2.2     skrll 
   2449  1.3.2.2     skrll         switch (NfitHeader->Type)
   2450  1.3.2.2     skrll         {
   2451  1.3.2.2     skrll         case ACPI_NFIT_TYPE_INTERLEAVE:
   2452  1.3.2.2     skrll 
   2453  1.3.2.2     skrll             Count = 0;
   2454  1.3.2.2     skrll             DtPushSubtable (Subtable);
   2455  1.3.2.2     skrll             while (*PFieldList)
   2456  1.3.2.2     skrll             {
   2457  1.3.2.2     skrll                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
   2458  1.3.2.2     skrll                             &Subtable, FALSE);
   2459  1.3.2.2     skrll                 if (ACPI_FAILURE (Status))
   2460  1.3.2.2     skrll                 {
   2461  1.3.2.2     skrll                     return (Status);
   2462  1.3.2.2     skrll                 }
   2463  1.3.2.2     skrll                 if (!Subtable)
   2464  1.3.2.2     skrll                 {
   2465  1.3.2.2     skrll                     DtPopSubtable ();
   2466  1.3.2.2     skrll                     break;
   2467  1.3.2.2     skrll                 }
   2468  1.3.2.2     skrll 
   2469  1.3.2.2     skrll                 ParentTable = DtPeekSubtable ();
   2470  1.3.2.2     skrll                 DtInsertSubtable (ParentTable, Subtable);
   2471  1.3.2.2     skrll                 Count++;
   2472  1.3.2.2     skrll             }
   2473  1.3.2.2     skrll 
   2474  1.3.2.2     skrll             Interleave->LineCount = Count;
   2475  1.3.2.2     skrll             DtPopSubtable ();
   2476  1.3.2.2     skrll             break;
   2477  1.3.2.2     skrll 
   2478  1.3.2.2     skrll         case ACPI_NFIT_TYPE_SMBIOS:
   2479  1.3.2.2     skrll 
   2480  1.3.2.2     skrll             if (*PFieldList)
   2481  1.3.2.2     skrll             {
   2482  1.3.2.2     skrll                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
   2483  1.3.2.2     skrll                             &Subtable, TRUE);
   2484  1.3.2.2     skrll                 if (ACPI_FAILURE (Status))
   2485  1.3.2.2     skrll                 {
   2486  1.3.2.2     skrll                     return (Status);
   2487  1.3.2.2     skrll                 }
   2488  1.3.2.2     skrll                 if (Subtable)
   2489  1.3.2.2     skrll                 {
   2490  1.3.2.2     skrll                     DtInsertSubtable (ParentTable, Subtable);
   2491  1.3.2.2     skrll                 }
   2492  1.3.2.2     skrll             }
   2493  1.3.2.2     skrll             break;
   2494  1.3.2.2     skrll 
   2495  1.3.2.2     skrll         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   2496  1.3.2.2     skrll 
   2497  1.3.2.2     skrll             Count = 0;
   2498  1.3.2.2     skrll             DtPushSubtable (Subtable);
   2499  1.3.2.2     skrll             while (*PFieldList)
   2500  1.3.2.2     skrll             {
   2501  1.3.2.2     skrll                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
   2502  1.3.2.2     skrll                             &Subtable, FALSE);
   2503  1.3.2.2     skrll                 if (ACPI_FAILURE (Status))
   2504  1.3.2.2     skrll                 {
   2505  1.3.2.2     skrll                     return (Status);
   2506  1.3.2.2     skrll                 }
   2507  1.3.2.2     skrll                 if (!Subtable)
   2508  1.3.2.2     skrll                 {
   2509  1.3.2.2     skrll                     DtPopSubtable ();
   2510  1.3.2.2     skrll                     break;
   2511  1.3.2.2     skrll                 }
   2512  1.3.2.2     skrll 
   2513  1.3.2.2     skrll                 ParentTable = DtPeekSubtable ();
   2514  1.3.2.2     skrll                 DtInsertSubtable (ParentTable, Subtable);
   2515  1.3.2.2     skrll                 Count++;
   2516  1.3.2.2     skrll             }
   2517  1.3.2.2     skrll 
   2518  1.3.2.2     skrll             Hint->HintCount = (UINT16) Count;
   2519  1.3.2.2     skrll             DtPopSubtable ();
   2520  1.3.2.2     skrll             break;
   2521  1.3.2.2     skrll 
   2522  1.3.2.2     skrll         default:
   2523  1.3.2.2     skrll             break;
   2524  1.3.2.2     skrll         }
   2525  1.3.2.2     skrll     }
   2526  1.3.2.2     skrll 
   2527  1.3.2.2     skrll     return (AE_OK);
   2528  1.3.2.2     skrll }
   2529  1.3.2.2     skrll 
   2530  1.3.2.2     skrll 
   2531  1.3.2.2     skrll /******************************************************************************
   2532  1.3.2.2     skrll  *
   2533      1.2  christos  * FUNCTION:    DtCompilePcct
   2534      1.1    jruoho  *
   2535      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   2536      1.1    jruoho  *
   2537      1.1    jruoho  * RETURN:      Status
   2538      1.1    jruoho  *
   2539      1.2  christos  * DESCRIPTION: Compile PCCT.
   2540      1.1    jruoho  *
   2541      1.1    jruoho  *****************************************************************************/
   2542      1.1    jruoho 
   2543      1.1    jruoho ACPI_STATUS
   2544      1.2  christos DtCompilePcct (
   2545      1.1    jruoho     void                    **List)
   2546      1.1    jruoho {
   2547      1.1    jruoho     ACPI_STATUS             Status;
   2548      1.1    jruoho     DT_SUBTABLE             *Subtable;
   2549      1.1    jruoho     DT_SUBTABLE             *ParentTable;
   2550      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2551      1.2  christos     DT_FIELD                *SubtableStart;
   2552      1.2  christos     ACPI_SUBTABLE_HEADER    *PcctHeader;
   2553      1.2  christos     ACPI_DMTABLE_INFO       *InfoTable;
   2554      1.1    jruoho 
   2555      1.1    jruoho 
   2556  1.3.2.2     skrll     /* Main table */
   2557  1.3.2.2     skrll 
   2558      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
   2559      1.1    jruoho                 &Subtable, TRUE);
   2560      1.1    jruoho     if (ACPI_FAILURE (Status))
   2561      1.1    jruoho     {
   2562      1.1    jruoho         return (Status);
   2563      1.1    jruoho     }
   2564      1.1    jruoho 
   2565      1.1    jruoho     ParentTable = DtPeekSubtable ();
   2566      1.1    jruoho     DtInsertSubtable (ParentTable, Subtable);
   2567      1.1    jruoho 
   2568  1.3.2.2     skrll     /* Subtables */
   2569  1.3.2.2     skrll 
   2570      1.2  christos     while (*PFieldList)
   2571      1.1    jruoho     {
   2572      1.2  christos         SubtableStart = *PFieldList;
   2573      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
   2574      1.2  christos                     &Subtable, TRUE);
   2575      1.2  christos         if (ACPI_FAILURE (Status))
   2576      1.1    jruoho         {
   2577      1.2  christos             return (Status);
   2578      1.1    jruoho         }
   2579      1.1    jruoho 
   2580      1.2  christos         ParentTable = DtPeekSubtable ();
   2581      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2582      1.2  christos         DtPushSubtable (Subtable);
   2583      1.2  christos 
   2584      1.2  christos         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   2585      1.2  christos 
   2586      1.2  christos         switch (PcctHeader->Type)
   2587      1.2  christos         {
   2588      1.2  christos         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   2589      1.2  christos 
   2590      1.2  christos             InfoTable = AcpiDmTableInfoPcct0;
   2591      1.2  christos             break;
   2592      1.2  christos 
   2593      1.3  christos         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   2594      1.3  christos 
   2595      1.3  christos             InfoTable = AcpiDmTableInfoPcct1;
   2596      1.3  christos             break;
   2597      1.3  christos 
   2598      1.2  christos         default:
   2599      1.2  christos 
   2600      1.2  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
   2601      1.2  christos             return (AE_ERROR);
   2602      1.2  christos         }
   2603      1.2  christos 
   2604      1.2  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   2605      1.2  christos         if (ACPI_FAILURE (Status))
   2606      1.2  christos         {
   2607      1.2  christos             return (Status);
   2608      1.2  christos         }
   2609      1.2  christos 
   2610      1.2  christos         ParentTable = DtPeekSubtable ();
   2611      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2612      1.2  christos         DtPopSubtable ();
   2613      1.2  christos     }
   2614      1.2  christos 
   2615      1.2  christos     return (AE_OK);
   2616      1.2  christos }
   2617      1.2  christos 
   2618      1.2  christos 
   2619      1.2  christos /******************************************************************************
   2620      1.2  christos  *
   2621      1.2  christos  * FUNCTION:    DtCompilePmtt
   2622      1.2  christos  *
   2623      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   2624      1.2  christos  *
   2625      1.2  christos  * RETURN:      Status
   2626      1.2  christos  *
   2627      1.2  christos  * DESCRIPTION: Compile PMTT.
   2628      1.2  christos  *
   2629      1.2  christos  *****************************************************************************/
   2630      1.2  christos 
   2631      1.2  christos ACPI_STATUS
   2632      1.2  christos DtCompilePmtt (
   2633      1.2  christos     void                    **List)
   2634      1.2  christos {
   2635      1.2  christos     ACPI_STATUS             Status;
   2636      1.2  christos     DT_SUBTABLE             *Subtable;
   2637      1.2  christos     DT_SUBTABLE             *ParentTable;
   2638      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2639      1.2  christos     DT_FIELD                *SubtableStart;
   2640      1.2  christos     ACPI_PMTT_HEADER        *PmttHeader;
   2641      1.2  christos     ACPI_PMTT_CONTROLLER    *PmttController;
   2642      1.2  christos     UINT16                  DomainCount;
   2643      1.2  christos     UINT8                   PrevType = ACPI_PMTT_TYPE_SOCKET;
   2644      1.2  christos 
   2645      1.2  christos 
   2646      1.2  christos     /* Main table */
   2647      1.2  christos 
   2648      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
   2649      1.2  christos     if (ACPI_FAILURE (Status))
   2650      1.2  christos     {
   2651      1.2  christos         return (Status);
   2652      1.2  christos     }
   2653      1.2  christos 
   2654      1.2  christos     ParentTable = DtPeekSubtable ();
   2655      1.2  christos     DtInsertSubtable (ParentTable, Subtable);
   2656      1.2  christos     DtPushSubtable (Subtable);
   2657      1.2  christos 
   2658      1.2  christos     while (*PFieldList)
   2659      1.2  christos     {
   2660      1.2  christos         SubtableStart = *PFieldList;
   2661      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
   2662      1.2  christos                     &Subtable, TRUE);
   2663      1.2  christos         if (ACPI_FAILURE (Status))
   2664      1.2  christos         {
   2665      1.2  christos             return (Status);
   2666      1.2  christos         }
   2667      1.2  christos 
   2668      1.2  christos         PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
   2669      1.2  christos         while (PrevType >= PmttHeader->Type)
   2670      1.2  christos         {
   2671      1.2  christos             DtPopSubtable ();
   2672      1.2  christos 
   2673      1.2  christos             if (PrevType == ACPI_PMTT_TYPE_SOCKET)
   2674      1.2  christos             {
   2675      1.2  christos                 break;
   2676      1.2  christos             }
   2677      1.2  christos             PrevType--;
   2678      1.2  christos         }
   2679      1.2  christos         PrevType = PmttHeader->Type;
   2680      1.2  christos 
   2681      1.2  christos         ParentTable = DtPeekSubtable ();
   2682      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2683      1.2  christos         DtPushSubtable (Subtable);
   2684      1.2  christos 
   2685      1.2  christos         switch (PmttHeader->Type)
   2686      1.2  christos         {
   2687      1.2  christos         case ACPI_PMTT_TYPE_SOCKET:
   2688      1.2  christos 
   2689      1.2  christos             /* Subtable: Socket Structure */
   2690      1.2  christos 
   2691      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
   2692      1.2  christos                     &Subtable, TRUE);
   2693      1.2  christos             if (ACPI_FAILURE (Status))
   2694      1.2  christos             {
   2695      1.2  christos                 return (Status);
   2696      1.2  christos             }
   2697      1.2  christos 
   2698      1.2  christos             ParentTable = DtPeekSubtable ();
   2699      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   2700      1.2  christos             break;
   2701      1.2  christos 
   2702      1.2  christos         case ACPI_PMTT_TYPE_CONTROLLER:
   2703      1.2  christos 
   2704      1.2  christos             /* Subtable: Memory Controller Structure */
   2705      1.2  christos 
   2706      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
   2707      1.2  christos                     &Subtable, TRUE);
   2708      1.2  christos             if (ACPI_FAILURE (Status))
   2709      1.2  christos             {
   2710      1.2  christos                 return (Status);
   2711      1.2  christos             }
   2712      1.2  christos 
   2713      1.2  christos             ParentTable = DtPeekSubtable ();
   2714      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   2715      1.2  christos 
   2716      1.2  christos             PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
   2717      1.2  christos                 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
   2718      1.2  christos             DomainCount = PmttController->DomainCount;
   2719      1.2  christos 
   2720      1.2  christos             while (DomainCount)
   2721      1.2  christos             {
   2722      1.2  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
   2723      1.2  christos                     &Subtable, TRUE);
   2724      1.2  christos                 if (ACPI_FAILURE (Status))
   2725      1.2  christos                 {
   2726      1.2  christos                     return (Status);
   2727      1.2  christos                 }
   2728      1.2  christos 
   2729      1.2  christos                 DtInsertSubtable (ParentTable, Subtable);
   2730      1.2  christos                 DomainCount--;
   2731      1.2  christos             }
   2732      1.2  christos             break;
   2733      1.2  christos 
   2734      1.2  christos         case ACPI_PMTT_TYPE_DIMM:
   2735      1.2  christos 
   2736      1.2  christos             /* Subtable: Physical Component Structure */
   2737      1.2  christos 
   2738      1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
   2739      1.2  christos                     &Subtable, TRUE);
   2740      1.2  christos             if (ACPI_FAILURE (Status))
   2741      1.2  christos             {
   2742      1.2  christos                 return (Status);
   2743      1.2  christos             }
   2744      1.2  christos 
   2745      1.2  christos             ParentTable = DtPeekSubtable ();
   2746      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   2747      1.2  christos             break;
   2748      1.2  christos 
   2749      1.2  christos         default:
   2750      1.2  christos 
   2751      1.2  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
   2752      1.2  christos             return (AE_ERROR);
   2753      1.2  christos         }
   2754      1.2  christos     }
   2755      1.2  christos 
   2756      1.2  christos     return (Status);
   2757      1.2  christos }
   2758      1.2  christos 
   2759      1.2  christos 
   2760      1.2  christos /******************************************************************************
   2761      1.2  christos  *
   2762      1.2  christos  * FUNCTION:    DtCompileRsdt
   2763      1.2  christos  *
   2764      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   2765      1.2  christos  *
   2766      1.2  christos  * RETURN:      Status
   2767      1.2  christos  *
   2768      1.2  christos  * DESCRIPTION: Compile RSDT.
   2769      1.2  christos  *
   2770      1.2  christos  *****************************************************************************/
   2771      1.2  christos 
   2772      1.2  christos ACPI_STATUS
   2773      1.2  christos DtCompileRsdt (
   2774      1.2  christos     void                    **List)
   2775      1.2  christos {
   2776      1.2  christos     DT_SUBTABLE             *Subtable;
   2777      1.2  christos     DT_SUBTABLE             *ParentTable;
   2778      1.2  christos     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   2779      1.2  christos     UINT32                  Address;
   2780      1.2  christos 
   2781      1.2  christos 
   2782      1.2  christos     ParentTable = DtPeekSubtable ();
   2783      1.2  christos 
   2784      1.2  christos     while (FieldList)
   2785      1.2  christos     {
   2786      1.2  christos         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
   2787      1.2  christos 
   2788      1.2  christos         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
   2789      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2790      1.2  christos         FieldList = FieldList->Next;
   2791      1.2  christos     }
   2792      1.2  christos 
   2793      1.2  christos     return (AE_OK);
   2794      1.2  christos }
   2795      1.2  christos 
   2796      1.2  christos 
   2797      1.2  christos /******************************************************************************
   2798      1.2  christos  *
   2799      1.2  christos  * FUNCTION:    DtCompileS3pt
   2800      1.2  christos  *
   2801      1.2  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2802      1.2  christos  *
   2803      1.2  christos  * RETURN:      Status
   2804      1.2  christos  *
   2805      1.2  christos  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
   2806      1.2  christos  *
   2807      1.2  christos  *****************************************************************************/
   2808      1.2  christos 
   2809      1.2  christos ACPI_STATUS
   2810      1.2  christos DtCompileS3pt (
   2811      1.2  christos     DT_FIELD                **PFieldList)
   2812      1.2  christos {
   2813      1.2  christos     ACPI_STATUS             Status;
   2814      1.2  christos     ACPI_S3PT_HEADER        *S3ptHeader;
   2815      1.2  christos     DT_SUBTABLE             *Subtable;
   2816      1.2  christos     DT_SUBTABLE             *ParentTable;
   2817      1.2  christos     ACPI_DMTABLE_INFO       *InfoTable;
   2818      1.2  christos     DT_FIELD                *SubtableStart;
   2819      1.2  christos 
   2820      1.2  christos 
   2821      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
   2822      1.2  christos                 &Gbl_RootTable, TRUE);
   2823      1.2  christos     if (ACPI_FAILURE (Status))
   2824      1.2  christos     {
   2825      1.2  christos         return (Status);
   2826      1.2  christos     }
   2827      1.2  christos 
   2828      1.2  christos     DtPushSubtable (Gbl_RootTable);
   2829      1.2  christos 
   2830      1.2  christos     while (*PFieldList)
   2831      1.2  christos     {
   2832      1.2  christos         SubtableStart = *PFieldList;
   2833      1.2  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
   2834      1.2  christos                     &Subtable, TRUE);
   2835      1.2  christos         if (ACPI_FAILURE (Status))
   2836      1.2  christos         {
   2837      1.2  christos             return (Status);
   2838      1.2  christos         }
   2839      1.2  christos 
   2840      1.2  christos         ParentTable = DtPeekSubtable ();
   2841      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2842      1.2  christos         DtPushSubtable (Subtable);
   2843      1.2  christos 
   2844      1.2  christos         S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
   2845      1.2  christos 
   2846      1.2  christos         switch (S3ptHeader->Type)
   2847      1.2  christos         {
   2848      1.2  christos         case ACPI_S3PT_TYPE_RESUME:
   2849      1.2  christos 
   2850      1.2  christos             InfoTable = AcpiDmTableInfoS3pt0;
   2851      1.2  christos             break;
   2852      1.2  christos 
   2853      1.2  christos         case ACPI_S3PT_TYPE_SUSPEND:
   2854      1.2  christos 
   2855      1.2  christos             InfoTable = AcpiDmTableInfoS3pt1;
   2856      1.2  christos             break;
   2857      1.2  christos 
   2858      1.2  christos         default:
   2859      1.2  christos 
   2860      1.2  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
   2861      1.2  christos             return (AE_ERROR);
   2862      1.2  christos         }
   2863      1.2  christos 
   2864      1.2  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   2865      1.2  christos         if (ACPI_FAILURE (Status))
   2866      1.2  christos         {
   2867      1.2  christos             return (Status);
   2868      1.2  christos         }
   2869      1.2  christos 
   2870      1.2  christos         ParentTable = DtPeekSubtable ();
   2871      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2872      1.2  christos         DtPopSubtable ();
   2873      1.2  christos     }
   2874      1.2  christos 
   2875      1.2  christos     return (AE_OK);
   2876      1.2  christos }
   2877      1.2  christos 
   2878      1.2  christos 
   2879      1.2  christos /******************************************************************************
   2880      1.2  christos  *
   2881      1.2  christos  * FUNCTION:    DtCompileSlic
   2882      1.2  christos  *
   2883      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   2884      1.2  christos  *
   2885      1.2  christos  * RETURN:      Status
   2886      1.2  christos  *
   2887      1.2  christos  * DESCRIPTION: Compile SLIC.
   2888      1.2  christos  *
   2889      1.2  christos  *****************************************************************************/
   2890      1.2  christos 
   2891      1.2  christos ACPI_STATUS
   2892      1.2  christos DtCompileSlic (
   2893      1.2  christos     void                    **List)
   2894      1.2  christos {
   2895      1.2  christos     ACPI_STATUS             Status;
   2896      1.2  christos     DT_SUBTABLE             *Subtable;
   2897      1.2  christos     DT_SUBTABLE             *ParentTable;
   2898      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2899      1.2  christos 
   2900      1.2  christos 
   2901      1.2  christos     while (*PFieldList)
   2902      1.2  christos     {
   2903  1.3.2.1     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
   2904      1.2  christos                     &Subtable, TRUE);
   2905      1.2  christos         if (ACPI_FAILURE (Status))
   2906      1.2  christos         {
   2907      1.2  christos             return (Status);
   2908      1.2  christos         }
   2909      1.2  christos 
   2910      1.2  christos         ParentTable = DtPeekSubtable ();
   2911      1.2  christos         DtInsertSubtable (ParentTable, Subtable);
   2912      1.2  christos         DtPushSubtable (Subtable);
   2913      1.2  christos         DtPopSubtable ();
   2914      1.2  christos     }
   2915      1.2  christos 
   2916      1.2  christos     return (AE_OK);
   2917      1.2  christos }
   2918      1.2  christos 
   2919      1.2  christos 
   2920      1.2  christos /******************************************************************************
   2921      1.2  christos  *
   2922      1.2  christos  * FUNCTION:    DtCompileSlit
   2923      1.2  christos  *
   2924      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   2925      1.2  christos  *
   2926      1.2  christos  * RETURN:      Status
   2927      1.2  christos  *
   2928      1.2  christos  * DESCRIPTION: Compile SLIT.
   2929      1.2  christos  *
   2930      1.2  christos  *****************************************************************************/
   2931      1.2  christos 
   2932      1.2  christos ACPI_STATUS
   2933      1.2  christos DtCompileSlit (
   2934      1.2  christos     void                    **List)
   2935      1.2  christos {
   2936      1.2  christos     ACPI_STATUS             Status;
   2937      1.2  christos     DT_SUBTABLE             *Subtable;
   2938      1.2  christos     DT_SUBTABLE             *ParentTable;
   2939      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2940      1.2  christos     DT_FIELD                *FieldList;
   2941      1.2  christos     UINT32                  Localities;
   2942      1.2  christos     UINT8                   *LocalityBuffer;
   2943      1.2  christos 
   2944      1.2  christos 
   2945      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
   2946      1.2  christos                 &Subtable, TRUE);
   2947      1.2  christos     if (ACPI_FAILURE (Status))
   2948      1.2  christos     {
   2949      1.2  christos         return (Status);
   2950      1.2  christos     }
   2951      1.2  christos 
   2952      1.2  christos     ParentTable = DtPeekSubtable ();
   2953      1.2  christos     DtInsertSubtable (ParentTable, Subtable);
   2954      1.2  christos 
   2955      1.2  christos     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
   2956      1.2  christos     LocalityBuffer = UtLocalCalloc (Localities);
   2957      1.2  christos 
   2958      1.2  christos     /* Compile each locality buffer */
   2959      1.2  christos 
   2960      1.2  christos     FieldList = *PFieldList;
   2961      1.2  christos     while (FieldList)
   2962      1.2  christos     {
   2963      1.2  christos         DtCompileBuffer (LocalityBuffer,
   2964      1.2  christos             FieldList->Value, FieldList, Localities);
   2965      1.2  christos 
   2966      1.1    jruoho         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
   2967      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   2968      1.2  christos         FieldList = FieldList->Next;
   2969      1.1    jruoho     }
   2970      1.1    jruoho 
   2971      1.1    jruoho     ACPI_FREE (LocalityBuffer);
   2972      1.1    jruoho     return (AE_OK);
   2973      1.1    jruoho }
   2974      1.1    jruoho 
   2975      1.1    jruoho 
   2976      1.1    jruoho /******************************************************************************
   2977      1.1    jruoho  *
   2978      1.1    jruoho  * FUNCTION:    DtCompileSrat
   2979      1.1    jruoho  *
   2980      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   2981      1.1    jruoho  *
   2982      1.1    jruoho  * RETURN:      Status
   2983      1.1    jruoho  *
   2984      1.1    jruoho  * DESCRIPTION: Compile SRAT.
   2985      1.1    jruoho  *
   2986      1.1    jruoho  *****************************************************************************/
   2987      1.1    jruoho 
   2988      1.1    jruoho ACPI_STATUS
   2989      1.1    jruoho DtCompileSrat (
   2990      1.1    jruoho     void                    **List)
   2991      1.1    jruoho {
   2992      1.1    jruoho     ACPI_STATUS             Status;
   2993      1.1    jruoho     DT_SUBTABLE             *Subtable;
   2994      1.1    jruoho     DT_SUBTABLE             *ParentTable;
   2995      1.1    jruoho     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2996      1.1    jruoho     DT_FIELD                *SubtableStart;
   2997      1.1    jruoho     ACPI_SUBTABLE_HEADER    *SratHeader;
   2998      1.1    jruoho     ACPI_DMTABLE_INFO       *InfoTable;
   2999      1.1    jruoho 
   3000      1.1    jruoho 
   3001      1.1    jruoho     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
   3002      1.1    jruoho                 &Subtable, TRUE);
   3003      1.1    jruoho     if (ACPI_FAILURE (Status))
   3004      1.1    jruoho     {
   3005      1.1    jruoho         return (Status);
   3006      1.1    jruoho     }
   3007      1.1    jruoho 
   3008      1.1    jruoho     ParentTable = DtPeekSubtable ();
   3009      1.1    jruoho     DtInsertSubtable (ParentTable, Subtable);
   3010      1.1    jruoho 
   3011      1.1    jruoho     while (*PFieldList)
   3012      1.1    jruoho     {
   3013      1.1    jruoho         SubtableStart = *PFieldList;
   3014      1.1    jruoho         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
   3015      1.1    jruoho                     &Subtable, TRUE);
   3016      1.1    jruoho         if (ACPI_FAILURE (Status))
   3017      1.1    jruoho         {
   3018      1.1    jruoho             return (Status);
   3019      1.1    jruoho         }
   3020      1.1    jruoho 
   3021      1.1    jruoho         ParentTable = DtPeekSubtable ();
   3022      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   3023      1.1    jruoho         DtPushSubtable (Subtable);
   3024      1.1    jruoho 
   3025      1.1    jruoho         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   3026      1.1    jruoho 
   3027      1.1    jruoho         switch (SratHeader->Type)
   3028      1.1    jruoho         {
   3029      1.1    jruoho         case ACPI_SRAT_TYPE_CPU_AFFINITY:
   3030      1.2  christos 
   3031      1.1    jruoho             InfoTable = AcpiDmTableInfoSrat0;
   3032      1.1    jruoho             break;
   3033      1.2  christos 
   3034      1.1    jruoho         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   3035      1.2  christos 
   3036      1.1    jruoho             InfoTable = AcpiDmTableInfoSrat1;
   3037      1.1    jruoho             break;
   3038      1.2  christos 
   3039      1.1    jruoho         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   3040      1.2  christos 
   3041      1.1    jruoho             InfoTable = AcpiDmTableInfoSrat2;
   3042      1.1    jruoho             break;
   3043      1.2  christos 
   3044      1.3  christos         case ACPI_SRAT_TYPE_GICC_AFFINITY:
   3045      1.3  christos 
   3046      1.3  christos             InfoTable = AcpiDmTableInfoSrat3;
   3047      1.3  christos             break;
   3048      1.3  christos 
   3049      1.1    jruoho         default:
   3050      1.2  christos 
   3051      1.1    jruoho             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
   3052      1.1    jruoho             return (AE_ERROR);
   3053      1.1    jruoho         }
   3054      1.1    jruoho 
   3055      1.1    jruoho         Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
   3056      1.1    jruoho         if (ACPI_FAILURE (Status))
   3057      1.1    jruoho         {
   3058      1.1    jruoho             return (Status);
   3059      1.1    jruoho         }
   3060      1.1    jruoho 
   3061      1.1    jruoho         ParentTable = DtPeekSubtable ();
   3062      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   3063      1.1    jruoho         DtPopSubtable ();
   3064      1.1    jruoho     }
   3065      1.1    jruoho 
   3066      1.1    jruoho     return (AE_OK);
   3067      1.1    jruoho }
   3068      1.1    jruoho 
   3069      1.1    jruoho 
   3070      1.1    jruoho /******************************************************************************
   3071      1.1    jruoho  *
   3072  1.3.2.2     skrll  * FUNCTION:    DtCompileStao
   3073  1.3.2.2     skrll  *
   3074  1.3.2.2     skrll  * PARAMETERS:  PFieldList          - Current field list pointer
   3075  1.3.2.2     skrll  *
   3076  1.3.2.2     skrll  * RETURN:      Status
   3077  1.3.2.2     skrll  *
   3078  1.3.2.2     skrll  * DESCRIPTION: Compile STAO.
   3079  1.3.2.2     skrll  *
   3080  1.3.2.2     skrll  *****************************************************************************/
   3081  1.3.2.2     skrll 
   3082  1.3.2.2     skrll ACPI_STATUS
   3083  1.3.2.2     skrll DtCompileStao (
   3084  1.3.2.2     skrll     void                    **List)
   3085  1.3.2.2     skrll {
   3086  1.3.2.2     skrll     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3087  1.3.2.2     skrll     DT_SUBTABLE             *Subtable;
   3088  1.3.2.2     skrll     DT_SUBTABLE             *ParentTable;
   3089  1.3.2.2     skrll     ACPI_STATUS             Status;
   3090  1.3.2.2     skrll 
   3091  1.3.2.2     skrll 
   3092  1.3.2.2     skrll     /* Compile the main table */
   3093  1.3.2.2     skrll 
   3094  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
   3095  1.3.2.2     skrll                 &Subtable, TRUE);
   3096  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
   3097  1.3.2.2     skrll     {
   3098  1.3.2.2     skrll         return (Status);
   3099  1.3.2.2     skrll     }
   3100  1.3.2.2     skrll 
   3101  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
   3102  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
   3103  1.3.2.2     skrll 
   3104  1.3.2.2     skrll     /* Compile each ASCII namestring as a subtable */
   3105  1.3.2.2     skrll 
   3106  1.3.2.2     skrll     while (*PFieldList)
   3107  1.3.2.2     skrll     {
   3108  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
   3109  1.3.2.2     skrll                     &Subtable, TRUE);
   3110  1.3.2.2     skrll         if (ACPI_FAILURE (Status))
   3111  1.3.2.2     skrll         {
   3112  1.3.2.2     skrll             return (Status);
   3113  1.3.2.2     skrll         }
   3114  1.3.2.2     skrll 
   3115  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   3116  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
   3117  1.3.2.2     skrll     }
   3118  1.3.2.2     skrll 
   3119  1.3.2.2     skrll     return (AE_OK);
   3120  1.3.2.2     skrll }
   3121  1.3.2.2     skrll 
   3122  1.3.2.2     skrll 
   3123  1.3.2.2     skrll /******************************************************************************
   3124  1.3.2.2     skrll  *
   3125  1.3.2.2     skrll  * FUNCTION:    DtCompileTcpa
   3126  1.3.2.2     skrll  *
   3127  1.3.2.2     skrll  * PARAMETERS:  PFieldList          - Current field list pointer
   3128  1.3.2.2     skrll  *
   3129  1.3.2.2     skrll  * RETURN:      Status
   3130  1.3.2.2     skrll  *
   3131  1.3.2.2     skrll  * DESCRIPTION: Compile TCPA.
   3132  1.3.2.2     skrll  *
   3133  1.3.2.2     skrll  *****************************************************************************/
   3134  1.3.2.2     skrll 
   3135  1.3.2.2     skrll ACPI_STATUS
   3136  1.3.2.2     skrll DtCompileTcpa (
   3137  1.3.2.2     skrll     void                    **List)
   3138  1.3.2.2     skrll {
   3139  1.3.2.2     skrll     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3140  1.3.2.2     skrll     DT_SUBTABLE             *Subtable;
   3141  1.3.2.2     skrll     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
   3142  1.3.2.2     skrll     DT_SUBTABLE             *ParentTable;
   3143  1.3.2.2     skrll     ACPI_STATUS             Status;
   3144  1.3.2.2     skrll 
   3145  1.3.2.2     skrll 
   3146  1.3.2.2     skrll     /* Compile the main table */
   3147  1.3.2.2     skrll 
   3148  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
   3149  1.3.2.2     skrll             &Subtable, TRUE);
   3150  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
   3151  1.3.2.2     skrll     {
   3152  1.3.2.2     skrll         return (Status);
   3153  1.3.2.2     skrll     }
   3154  1.3.2.2     skrll 
   3155  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
   3156  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
   3157  1.3.2.2     skrll 
   3158  1.3.2.2     skrll     /*
   3159  1.3.2.2     skrll      * Examine the PlatformClass field to determine the table type.
   3160  1.3.2.2     skrll      * Either a client or server table. Only one.
   3161  1.3.2.2     skrll      */
   3162  1.3.2.2     skrll     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
   3163  1.3.2.2     skrll 
   3164  1.3.2.2     skrll     switch (TcpaHeader->PlatformClass)
   3165  1.3.2.2     skrll     {
   3166  1.3.2.2     skrll     case ACPI_TCPA_CLIENT_TABLE:
   3167  1.3.2.2     skrll 
   3168  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
   3169  1.3.2.2     skrll                 &Subtable, TRUE);
   3170  1.3.2.2     skrll         break;
   3171  1.3.2.2     skrll 
   3172  1.3.2.2     skrll     case ACPI_TCPA_SERVER_TABLE:
   3173  1.3.2.2     skrll 
   3174  1.3.2.2     skrll         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
   3175  1.3.2.2     skrll                 &Subtable, TRUE);
   3176  1.3.2.2     skrll         break;
   3177  1.3.2.2     skrll 
   3178  1.3.2.2     skrll     default:
   3179  1.3.2.2     skrll 
   3180  1.3.2.2     skrll         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
   3181  1.3.2.2     skrll             TcpaHeader->PlatformClass);
   3182  1.3.2.2     skrll         Status = AE_ERROR;
   3183  1.3.2.2     skrll         break;
   3184  1.3.2.2     skrll     }
   3185  1.3.2.2     skrll 
   3186  1.3.2.2     skrll 
   3187  1.3.2.2     skrll         ParentTable = DtPeekSubtable ();
   3188  1.3.2.2     skrll         DtInsertSubtable (ParentTable, Subtable);
   3189  1.3.2.2     skrll 
   3190  1.3.2.2     skrll     return (Status);
   3191  1.3.2.2     skrll }
   3192  1.3.2.2     skrll 
   3193  1.3.2.2     skrll 
   3194  1.3.2.2     skrll /******************************************************************************
   3195  1.3.2.2     skrll  *
   3196      1.2  christos  * FUNCTION:    DtGetGenericTableInfo
   3197      1.2  christos  *
   3198      1.2  christos  * PARAMETERS:  Name                - Generic type name
   3199      1.2  christos  *
   3200      1.2  christos  * RETURN:      Info entry
   3201      1.2  christos  *
   3202      1.2  christos  * DESCRIPTION: Obtain table info for a generic name entry
   3203      1.2  christos  *
   3204      1.2  christos  *****************************************************************************/
   3205      1.2  christos 
   3206      1.2  christos ACPI_DMTABLE_INFO *
   3207      1.2  christos DtGetGenericTableInfo (
   3208      1.2  christos     char                    *Name)
   3209      1.2  christos {
   3210      1.2  christos     ACPI_DMTABLE_INFO       *Info;
   3211      1.2  christos     UINT32                  i;
   3212      1.2  christos 
   3213      1.2  christos 
   3214      1.2  christos     if (!Name)
   3215      1.2  christos     {
   3216      1.2  christos         return (NULL);
   3217      1.2  christos     }
   3218      1.2  christos 
   3219      1.2  christos     /* Search info table for name match */
   3220      1.2  christos 
   3221      1.2  christos     for (i = 0; ; i++)
   3222      1.2  christos     {
   3223      1.2  christos         Info = AcpiDmTableInfoGeneric[i];
   3224      1.2  christos         if (Info->Opcode == ACPI_DMT_EXIT)
   3225      1.2  christos         {
   3226      1.2  christos             Info = NULL;
   3227      1.2  christos             break;
   3228      1.2  christos         }
   3229      1.2  christos 
   3230      1.2  christos         /* Use caseless compare for generic keywords */
   3231      1.2  christos 
   3232      1.2  christos         if (!AcpiUtStricmp (Name, Info->Name))
   3233      1.2  christos         {
   3234      1.2  christos             break;
   3235      1.2  christos         }
   3236      1.2  christos     }
   3237      1.2  christos 
   3238      1.2  christos     return (Info);
   3239      1.2  christos }
   3240      1.2  christos 
   3241      1.2  christos 
   3242      1.2  christos /******************************************************************************
   3243      1.2  christos  *
   3244      1.2  christos  * FUNCTION:    DtCompileUefi
   3245      1.2  christos  *
   3246      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   3247      1.2  christos  *
   3248      1.2  christos  * RETURN:      Status
   3249      1.2  christos  *
   3250      1.2  christos  * DESCRIPTION: Compile UEFI.
   3251      1.2  christos  *
   3252      1.2  christos  *****************************************************************************/
   3253      1.2  christos 
   3254      1.2  christos ACPI_STATUS
   3255      1.2  christos DtCompileUefi (
   3256      1.2  christos     void                    **List)
   3257      1.2  christos {
   3258      1.2  christos     ACPI_STATUS             Status;
   3259      1.2  christos     DT_SUBTABLE             *Subtable;
   3260      1.2  christos     DT_SUBTABLE             *ParentTable;
   3261      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3262      1.2  christos     UINT16                  *DataOffset;
   3263      1.2  christos 
   3264      1.2  christos 
   3265      1.2  christos     /* Compile the predefined portion of the UEFI table */
   3266      1.2  christos 
   3267      1.2  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
   3268      1.2  christos                 &Subtable, TRUE);
   3269      1.2  christos     if (ACPI_FAILURE (Status))
   3270      1.2  christos     {
   3271      1.2  christos         return (Status);
   3272      1.2  christos     }
   3273      1.2  christos 
   3274      1.2  christos     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
   3275      1.2  christos     *DataOffset = sizeof (ACPI_TABLE_UEFI);
   3276      1.2  christos 
   3277      1.2  christos     ParentTable = DtPeekSubtable ();
   3278      1.2  christos     DtInsertSubtable (ParentTable, Subtable);
   3279      1.2  christos 
   3280      1.2  christos     /*
   3281      1.2  christos      * Compile the "generic" portion of the UEFI table. This
   3282      1.2  christos      * part of the table is not predefined and any of the generic
   3283      1.2  christos      * operators may be used.
   3284      1.2  christos      */
   3285      1.2  christos 
   3286  1.3.2.2     skrll     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
   3287      1.2  christos 
   3288      1.2  christos     return (AE_OK);
   3289      1.2  christos }
   3290      1.2  christos 
   3291      1.2  christos 
   3292      1.2  christos /******************************************************************************
   3293      1.2  christos  *
   3294      1.2  christos  * FUNCTION:    DtCompileVrtc
   3295      1.2  christos  *
   3296      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   3297      1.2  christos  *
   3298      1.2  christos  * RETURN:      Status
   3299      1.2  christos  *
   3300      1.2  christos  * DESCRIPTION: Compile VRTC.
   3301      1.2  christos  *
   3302      1.2  christos  *****************************************************************************/
   3303      1.2  christos 
   3304      1.2  christos ACPI_STATUS
   3305      1.2  christos DtCompileVrtc (
   3306      1.2  christos     void                    **List)
   3307      1.2  christos {
   3308      1.2  christos     ACPI_STATUS             Status;
   3309      1.2  christos 
   3310      1.2  christos 
   3311      1.2  christos     Status = DtCompileTwoSubtables (List,
   3312      1.2  christos                  AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
   3313      1.2  christos     return (Status);
   3314      1.2  christos }
   3315      1.2  christos 
   3316      1.2  christos 
   3317      1.2  christos /******************************************************************************
   3318      1.2  christos  *
   3319      1.1    jruoho  * FUNCTION:    DtCompileWdat
   3320      1.1    jruoho  *
   3321      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   3322      1.1    jruoho  *
   3323      1.1    jruoho  * RETURN:      Status
   3324      1.1    jruoho  *
   3325      1.1    jruoho  * DESCRIPTION: Compile WDAT.
   3326      1.1    jruoho  *
   3327      1.1    jruoho  *****************************************************************************/
   3328      1.1    jruoho 
   3329      1.1    jruoho ACPI_STATUS
   3330      1.1    jruoho DtCompileWdat (
   3331      1.1    jruoho     void                    **List)
   3332      1.1    jruoho {
   3333      1.1    jruoho     ACPI_STATUS             Status;
   3334      1.1    jruoho 
   3335      1.1    jruoho 
   3336      1.1    jruoho     Status = DtCompileTwoSubtables (List,
   3337      1.1    jruoho                  AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
   3338      1.1    jruoho     return (Status);
   3339      1.1    jruoho }
   3340      1.1    jruoho 
   3341      1.1    jruoho 
   3342      1.1    jruoho /******************************************************************************
   3343      1.1    jruoho  *
   3344  1.3.2.2     skrll  * FUNCTION:    DtCompileWpbt
   3345  1.3.2.2     skrll  *
   3346  1.3.2.2     skrll  * PARAMETERS:  List                - Current field list pointer
   3347  1.3.2.2     skrll  *
   3348  1.3.2.2     skrll  * RETURN:      Status
   3349  1.3.2.2     skrll  *
   3350  1.3.2.2     skrll  * DESCRIPTION: Compile WPBT.
   3351  1.3.2.2     skrll  *
   3352  1.3.2.2     skrll  *****************************************************************************/
   3353  1.3.2.2     skrll 
   3354  1.3.2.2     skrll ACPI_STATUS
   3355  1.3.2.2     skrll DtCompileWpbt (
   3356  1.3.2.2     skrll     void                    **List)
   3357  1.3.2.2     skrll {
   3358  1.3.2.2     skrll     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3359  1.3.2.2     skrll     DT_SUBTABLE             *Subtable;
   3360  1.3.2.2     skrll     DT_SUBTABLE             *ParentTable;
   3361  1.3.2.2     skrll     ACPI_TABLE_WPBT         *Table;
   3362  1.3.2.2     skrll     ACPI_STATUS             Status;
   3363  1.3.2.2     skrll     UINT16                  Length;
   3364  1.3.2.2     skrll 
   3365  1.3.2.2     skrll 
   3366  1.3.2.2     skrll     /* Compile the main table */
   3367  1.3.2.2     skrll 
   3368  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
   3369  1.3.2.2     skrll                 &Subtable, TRUE);
   3370  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
   3371  1.3.2.2     skrll     {
   3372  1.3.2.2     skrll         return (Status);
   3373  1.3.2.2     skrll     }
   3374  1.3.2.2     skrll 
   3375  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
   3376  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
   3377  1.3.2.2     skrll 
   3378  1.3.2.2     skrll     /* Compile the argument list subtable */
   3379  1.3.2.2     skrll 
   3380  1.3.2.2     skrll     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
   3381  1.3.2.2     skrll                 &Subtable, TRUE);
   3382  1.3.2.2     skrll     if (ACPI_FAILURE (Status))
   3383  1.3.2.2     skrll     {
   3384  1.3.2.2     skrll         return (Status);
   3385  1.3.2.2     skrll     }
   3386  1.3.2.2     skrll 
   3387  1.3.2.2     skrll     /* Extract the length of the Arguments buffer, insert into main table */
   3388  1.3.2.2     skrll 
   3389  1.3.2.2     skrll     Length = (UINT16) Subtable->TotalLength;
   3390  1.3.2.2     skrll     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
   3391  1.3.2.2     skrll     Table->ArgumentsLength = Length;
   3392  1.3.2.2     skrll 
   3393  1.3.2.2     skrll     ParentTable = DtPeekSubtable ();
   3394  1.3.2.2     skrll     DtInsertSubtable (ParentTable, Subtable);
   3395  1.3.2.2     skrll     return (AE_OK);
   3396  1.3.2.2     skrll }
   3397  1.3.2.2     skrll 
   3398  1.3.2.2     skrll 
   3399  1.3.2.2     skrll /******************************************************************************
   3400  1.3.2.2     skrll  *
   3401      1.1    jruoho  * FUNCTION:    DtCompileXsdt
   3402      1.1    jruoho  *
   3403      1.1    jruoho  * PARAMETERS:  List                - Current field list pointer
   3404      1.1    jruoho  *
   3405      1.1    jruoho  * RETURN:      Status
   3406      1.1    jruoho  *
   3407      1.1    jruoho  * DESCRIPTION: Compile XSDT.
   3408      1.1    jruoho  *
   3409      1.1    jruoho  *****************************************************************************/
   3410      1.1    jruoho 
   3411      1.1    jruoho ACPI_STATUS
   3412      1.1    jruoho DtCompileXsdt (
   3413      1.1    jruoho     void                    **List)
   3414      1.1    jruoho {
   3415      1.1    jruoho     DT_SUBTABLE             *Subtable;
   3416      1.1    jruoho     DT_SUBTABLE             *ParentTable;
   3417      1.1    jruoho     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   3418      1.1    jruoho     UINT64                  Address;
   3419      1.1    jruoho 
   3420  1.3.2.2     skrll 
   3421      1.1    jruoho     ParentTable = DtPeekSubtable ();
   3422      1.1    jruoho 
   3423      1.1    jruoho     while (FieldList)
   3424      1.1    jruoho     {
   3425      1.1    jruoho         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
   3426      1.1    jruoho 
   3427      1.1    jruoho         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
   3428      1.1    jruoho         DtInsertSubtable (ParentTable, Subtable);
   3429      1.1    jruoho         FieldList = FieldList->Next;
   3430      1.1    jruoho     }
   3431      1.1    jruoho 
   3432      1.1    jruoho     return (AE_OK);
   3433      1.1    jruoho }
   3434      1.2  christos 
   3435      1.2  christos 
   3436      1.2  christos /******************************************************************************
   3437      1.2  christos  *
   3438      1.2  christos  * FUNCTION:    DtCompileGeneric
   3439      1.2  christos  *
   3440      1.2  christos  * PARAMETERS:  List                - Current field list pointer
   3441  1.3.2.2     skrll  *              Name                - Field name to end generic compiling
   3442  1.3.2.2     skrll  *              Length              - Compiled table length to return
   3443      1.2  christos  *
   3444      1.2  christos  * RETURN:      Status
   3445      1.2  christos  *
   3446      1.2  christos  * DESCRIPTION: Compile generic unknown table.
   3447      1.2  christos  *
   3448      1.2  christos  *****************************************************************************/
   3449      1.2  christos 
   3450      1.2  christos ACPI_STATUS
   3451      1.2  christos DtCompileGeneric (
   3452  1.3.2.2     skrll     void                    **List,
   3453  1.3.2.2     skrll     char                    *Name,
   3454  1.3.2.2     skrll     UINT32                  *Length)
   3455      1.2  christos {
   3456      1.2  christos     ACPI_STATUS             Status;
   3457      1.2  christos     DT_SUBTABLE             *Subtable;
   3458      1.2  christos     DT_SUBTABLE             *ParentTable;
   3459      1.2  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3460      1.2  christos     ACPI_DMTABLE_INFO       *Info;
   3461      1.2  christos 
   3462      1.2  christos 
   3463      1.2  christos     ParentTable = DtPeekSubtable ();
   3464      1.2  christos 
   3465      1.2  christos     /*
   3466      1.2  christos      * Compile the "generic" portion of the table. This
   3467      1.2  christos      * part of the table is not predefined and any of the generic
   3468      1.2  christos      * operators may be used.
   3469      1.2  christos      */
   3470      1.2  christos 
   3471      1.2  christos     /* Find any and all labels in the entire generic portion */
   3472      1.2  christos 
   3473      1.2  christos     DtDetectAllLabels (*PFieldList);
   3474      1.2  christos 
   3475      1.2  christos     /* Now we can actually compile the parse tree */
   3476      1.2  christos 
   3477  1.3.2.2     skrll     if (Length)
   3478  1.3.2.2     skrll     {
   3479  1.3.2.2     skrll         *Length = 0;
   3480  1.3.2.2     skrll     }
   3481      1.2  christos     while (*PFieldList)
   3482      1.2  christos     {
   3483  1.3.2.2     skrll         if (Name && !strcmp ((*PFieldList)->Name, Name))
   3484  1.3.2.2     skrll         {
   3485  1.3.2.2     skrll             break;
   3486  1.3.2.2     skrll         }
   3487      1.2  christos         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
   3488      1.2  christos         if (!Info)
   3489      1.2  christos         {
   3490      1.2  christos             snprintf (MsgBuffer, sizeof(MsgBuffer), "Generic data type \"%s\" not found",
   3491      1.2  christos                 (*PFieldList)->Name);
   3492      1.2  christos             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3493      1.2  christos                 (*PFieldList), MsgBuffer);
   3494      1.2  christos 
   3495      1.2  christos             *PFieldList = (*PFieldList)->Next;
   3496      1.2  christos             continue;
   3497      1.2  christos         }
   3498      1.2  christos 
   3499      1.2  christos         Status = DtCompileTable (PFieldList, Info,
   3500      1.2  christos                     &Subtable, TRUE);
   3501      1.2  christos         if (ACPI_SUCCESS (Status))
   3502      1.2  christos         {
   3503      1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   3504  1.3.2.2     skrll             if (Length)
   3505  1.3.2.2     skrll             {
   3506  1.3.2.2     skrll                 *Length += Subtable->Length;
   3507  1.3.2.2     skrll             }
   3508      1.2  christos         }
   3509      1.2  christos         else
   3510      1.2  christos         {
   3511      1.2  christos             *PFieldList = (*PFieldList)->Next;
   3512      1.2  christos 
   3513      1.2  christos             if (Status == AE_NOT_FOUND)
   3514      1.2  christos             {
   3515      1.2  christos                 snprintf (MsgBuffer, sizeof(MsgBuffer), "Generic data type \"%s\" not found",
   3516      1.2  christos                     (*PFieldList)->Name);
   3517      1.2  christos                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3518      1.2  christos                     (*PFieldList), MsgBuffer);
   3519      1.2  christos             }
   3520      1.2  christos         }
   3521      1.2  christos     }
   3522      1.2  christos 
   3523      1.2  christos     return (AE_OK);
   3524      1.2  christos }
   3525