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