Home | History | Annotate | Line # | Download | only in compiler
dttable2.c revision 1.1.1.17.6.1
      1           1.1  christos /******************************************************************************
      2           1.1  christos  *
      3           1.1  christos  * Module Name: dttable2.c - handling for specific ACPI tables
      4           1.1  christos  *
      5           1.1  christos  *****************************************************************************/
      6           1.1  christos 
      7  1.1.1.17.6.1  perseant /******************************************************************************
      8  1.1.1.17.6.1  perseant  *
      9  1.1.1.17.6.1  perseant  * 1. Copyright Notice
     10  1.1.1.17.6.1  perseant  *
     11  1.1.1.17.6.1  perseant  * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
     12           1.1  christos  * All rights reserved.
     13           1.1  christos  *
     14  1.1.1.17.6.1  perseant  * 2. License
     15  1.1.1.17.6.1  perseant  *
     16  1.1.1.17.6.1  perseant  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  1.1.1.17.6.1  perseant  * rights. You may have additional license terms from the party that provided
     18  1.1.1.17.6.1  perseant  * you this software, covering your right to use that party's intellectual
     19  1.1.1.17.6.1  perseant  * property rights.
     20  1.1.1.17.6.1  perseant  *
     21  1.1.1.17.6.1  perseant  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  1.1.1.17.6.1  perseant  * copy of the source code appearing in this file ("Covered Code") an
     23  1.1.1.17.6.1  perseant  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  1.1.1.17.6.1  perseant  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  1.1.1.17.6.1  perseant  * make derivatives, distribute, use and display any portion of the Covered
     26  1.1.1.17.6.1  perseant  * Code in any form, with the right to sublicense such rights; and
     27  1.1.1.17.6.1  perseant  *
     28  1.1.1.17.6.1  perseant  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  1.1.1.17.6.1  perseant  * license (with the right to sublicense), under only those claims of Intel
     30  1.1.1.17.6.1  perseant  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  1.1.1.17.6.1  perseant  * offer to sell, and import the Covered Code and derivative works thereof
     32  1.1.1.17.6.1  perseant  * solely to the minimum extent necessary to exercise the above copyright
     33  1.1.1.17.6.1  perseant  * license, and in no event shall the patent license extend to any additions
     34  1.1.1.17.6.1  perseant  * to or modifications of the Original Intel Code. No other license or right
     35  1.1.1.17.6.1  perseant  * is granted directly or by implication, estoppel or otherwise;
     36  1.1.1.17.6.1  perseant  *
     37  1.1.1.17.6.1  perseant  * The above copyright and patent license is granted only if the following
     38  1.1.1.17.6.1  perseant  * conditions are met:
     39  1.1.1.17.6.1  perseant  *
     40  1.1.1.17.6.1  perseant  * 3. Conditions
     41  1.1.1.17.6.1  perseant  *
     42  1.1.1.17.6.1  perseant  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  1.1.1.17.6.1  perseant  * Redistribution of source code of any substantial portion of the Covered
     44  1.1.1.17.6.1  perseant  * Code or modification with rights to further distribute source must include
     45  1.1.1.17.6.1  perseant  * the above Copyright Notice, the above License, this list of Conditions,
     46  1.1.1.17.6.1  perseant  * and the following Disclaimer and Export Compliance provision. In addition,
     47  1.1.1.17.6.1  perseant  * Licensee must cause all Covered Code to which Licensee contributes to
     48  1.1.1.17.6.1  perseant  * contain a file documenting the changes Licensee made to create that Covered
     49  1.1.1.17.6.1  perseant  * Code and the date of any change. Licensee must include in that file the
     50  1.1.1.17.6.1  perseant  * documentation of any changes made by any predecessor Licensee. Licensee
     51  1.1.1.17.6.1  perseant  * must include a prominent statement that the modification is derived,
     52  1.1.1.17.6.1  perseant  * directly or indirectly, from Original Intel Code.
     53  1.1.1.17.6.1  perseant  *
     54  1.1.1.17.6.1  perseant  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  1.1.1.17.6.1  perseant  * Redistribution of source code of any substantial portion of the Covered
     56  1.1.1.17.6.1  perseant  * Code or modification without rights to further distribute source must
     57  1.1.1.17.6.1  perseant  * include the following Disclaimer and Export Compliance provision in the
     58  1.1.1.17.6.1  perseant  * documentation and/or other materials provided with distribution. In
     59  1.1.1.17.6.1  perseant  * addition, Licensee may not authorize further sublicense of source of any
     60  1.1.1.17.6.1  perseant  * portion of the Covered Code, and must include terms to the effect that the
     61  1.1.1.17.6.1  perseant  * license from Licensee to its licensee is limited to the intellectual
     62  1.1.1.17.6.1  perseant  * property embodied in the software Licensee provides to its licensee, and
     63  1.1.1.17.6.1  perseant  * not to intellectual property embodied in modifications its licensee may
     64  1.1.1.17.6.1  perseant  * make.
     65  1.1.1.17.6.1  perseant  *
     66  1.1.1.17.6.1  perseant  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  1.1.1.17.6.1  perseant  * substantial portion of the Covered Code or modification must reproduce the
     68  1.1.1.17.6.1  perseant  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  1.1.1.17.6.1  perseant  * provision in the documentation and/or other materials provided with the
     70  1.1.1.17.6.1  perseant  * distribution.
     71  1.1.1.17.6.1  perseant  *
     72  1.1.1.17.6.1  perseant  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  1.1.1.17.6.1  perseant  * Intel Code.
     74  1.1.1.17.6.1  perseant  *
     75  1.1.1.17.6.1  perseant  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  1.1.1.17.6.1  perseant  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  1.1.1.17.6.1  perseant  * other dealings in products derived from or relating to the Covered Code
     78  1.1.1.17.6.1  perseant  * without prior written authorization from Intel.
     79  1.1.1.17.6.1  perseant  *
     80  1.1.1.17.6.1  perseant  * 4. Disclaimer and Export Compliance
     81  1.1.1.17.6.1  perseant  *
     82  1.1.1.17.6.1  perseant  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  1.1.1.17.6.1  perseant  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  1.1.1.17.6.1  perseant  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  1.1.1.17.6.1  perseant  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  1.1.1.17.6.1  perseant  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  1.1.1.17.6.1  perseant  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  1.1.1.17.6.1  perseant  * PARTICULAR PURPOSE.
     89  1.1.1.17.6.1  perseant  *
     90  1.1.1.17.6.1  perseant  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  1.1.1.17.6.1  perseant  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  1.1.1.17.6.1  perseant  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  1.1.1.17.6.1  perseant  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  1.1.1.17.6.1  perseant  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  1.1.1.17.6.1  perseant  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  1.1.1.17.6.1  perseant  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  1.1.1.17.6.1  perseant  * LIMITED REMEDY.
     98  1.1.1.17.6.1  perseant  *
     99  1.1.1.17.6.1  perseant  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  1.1.1.17.6.1  perseant  * software or system incorporating such software without first obtaining any
    101  1.1.1.17.6.1  perseant  * required license or other approval from the U. S. Department of Commerce or
    102  1.1.1.17.6.1  perseant  * any other agency or department of the United States Government. In the
    103  1.1.1.17.6.1  perseant  * event Licensee exports any such software from the United States or
    104  1.1.1.17.6.1  perseant  * re-exports any such software from a foreign destination, Licensee shall
    105  1.1.1.17.6.1  perseant  * ensure that the distribution and export/re-export of the software is in
    106  1.1.1.17.6.1  perseant  * compliance with all laws, regulations, orders, or other restrictions of the
    107  1.1.1.17.6.1  perseant  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  1.1.1.17.6.1  perseant  * any of its subsidiaries will export/re-export any technical data, process,
    109  1.1.1.17.6.1  perseant  * software, or service, directly or indirectly, to any country for which the
    110  1.1.1.17.6.1  perseant  * United States government or any agency thereof requires an export license,
    111  1.1.1.17.6.1  perseant  * other governmental approval, or letter of assurance, without first obtaining
    112  1.1.1.17.6.1  perseant  * such license, approval or letter.
    113  1.1.1.17.6.1  perseant  *
    114  1.1.1.17.6.1  perseant  *****************************************************************************
    115  1.1.1.17.6.1  perseant  *
    116  1.1.1.17.6.1  perseant  * Alternatively, you may choose to be licensed under the terms of the
    117  1.1.1.17.6.1  perseant  * following license:
    118  1.1.1.17.6.1  perseant  *
    119           1.1  christos  * Redistribution and use in source and binary forms, with or without
    120           1.1  christos  * modification, are permitted provided that the following conditions
    121           1.1  christos  * are met:
    122           1.1  christos  * 1. Redistributions of source code must retain the above copyright
    123           1.1  christos  *    notice, this list of conditions, and the following disclaimer,
    124           1.1  christos  *    without modification.
    125           1.1  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126           1.1  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
    127           1.1  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
    128           1.1  christos  *    including a substantially similar Disclaimer requirement for further
    129           1.1  christos  *    binary redistribution.
    130           1.1  christos  * 3. Neither the names of the above-listed copyright holders nor the names
    131           1.1  christos  *    of any contributors may be used to endorse or promote products derived
    132           1.1  christos  *    from this software without specific prior written permission.
    133           1.1  christos  *
    134           1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135           1.1  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136      1.1.1.11  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137           1.1  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  1.1.1.17.6.1  perseant  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  1.1.1.17.6.1  perseant  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  1.1.1.17.6.1  perseant  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  1.1.1.17.6.1  perseant  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  1.1.1.17.6.1  perseant  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  1.1.1.17.6.1  perseant  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  1.1.1.17.6.1  perseant  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  1.1.1.17.6.1  perseant  *
    146  1.1.1.17.6.1  perseant  * Alternatively, you may choose to be licensed under the terms of the
    147  1.1.1.17.6.1  perseant  * GNU General Public License ("GPL") version 2 as published by the Free
    148  1.1.1.17.6.1  perseant  * Software Foundation.
    149  1.1.1.17.6.1  perseant  *
    150  1.1.1.17.6.1  perseant  *****************************************************************************/
    151           1.1  christos 
    152           1.1  christos /* Compile all complex data tables, signatures starting with L-Z */
    153           1.1  christos 
    154           1.1  christos #include "aslcompiler.h"
    155           1.1  christos 
    156           1.1  christos #define _COMPONENT          DT_COMPILER
    157           1.1  christos         ACPI_MODULE_NAME    ("dttable2")
    158           1.1  christos 
    159           1.1  christos 
    160           1.1  christos /******************************************************************************
    161           1.1  christos  *
    162           1.1  christos  * FUNCTION:    DtCompileLpit
    163           1.1  christos  *
    164           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    165           1.1  christos  *
    166           1.1  christos  * RETURN:      Status
    167           1.1  christos  *
    168           1.1  christos  * DESCRIPTION: Compile LPIT.
    169           1.1  christos  *
    170           1.1  christos  *****************************************************************************/
    171           1.1  christos 
    172           1.1  christos ACPI_STATUS
    173           1.1  christos DtCompileLpit (
    174           1.1  christos     void                    **List)
    175           1.1  christos {
    176           1.1  christos     ACPI_STATUS             Status;
    177           1.1  christos     DT_SUBTABLE             *Subtable;
    178           1.1  christos     DT_SUBTABLE             *ParentTable;
    179           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    180           1.1  christos     DT_FIELD                *SubtableStart;
    181           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
    182           1.1  christos     ACPI_LPIT_HEADER        *LpitHeader;
    183           1.1  christos 
    184           1.1  christos 
    185           1.1  christos     /* Note: Main table consists only of the standard ACPI table header */
    186           1.1  christos 
    187           1.1  christos     while (*PFieldList)
    188           1.1  christos     {
    189           1.1  christos         SubtableStart = *PFieldList;
    190           1.1  christos 
    191           1.1  christos         /* LPIT Subtable header */
    192           1.1  christos 
    193           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
    194       1.1.1.6  christos             &Subtable);
    195           1.1  christos         if (ACPI_FAILURE (Status))
    196           1.1  christos         {
    197           1.1  christos             return (Status);
    198           1.1  christos         }
    199           1.1  christos 
    200           1.1  christos         ParentTable = DtPeekSubtable ();
    201           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    202           1.1  christos         DtPushSubtable (Subtable);
    203           1.1  christos 
    204           1.1  christos         LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
    205           1.1  christos 
    206           1.1  christos         switch (LpitHeader->Type)
    207           1.1  christos         {
    208           1.1  christos         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
    209           1.1  christos 
    210           1.1  christos             InfoTable = AcpiDmTableInfoLpit0;
    211           1.1  christos             break;
    212           1.1  christos 
    213           1.1  christos         default:
    214           1.1  christos 
    215           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
    216           1.1  christos             return (AE_ERROR);
    217           1.1  christos         }
    218           1.1  christos 
    219           1.1  christos         /* LPIT Subtable */
    220           1.1  christos 
    221       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    222           1.1  christos         if (ACPI_FAILURE (Status))
    223           1.1  christos         {
    224           1.1  christos             return (Status);
    225           1.1  christos         }
    226           1.1  christos 
    227           1.1  christos         ParentTable = DtPeekSubtable ();
    228           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    229           1.1  christos         DtPopSubtable ();
    230           1.1  christos     }
    231           1.1  christos 
    232           1.1  christos     return (AE_OK);
    233           1.1  christos }
    234           1.1  christos 
    235           1.1  christos 
    236           1.1  christos /******************************************************************************
    237           1.1  christos  *
    238           1.1  christos  * FUNCTION:    DtCompileMadt
    239           1.1  christos  *
    240           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    241           1.1  christos  *
    242           1.1  christos  * RETURN:      Status
    243           1.1  christos  *
    244           1.1  christos  * DESCRIPTION: Compile MADT.
    245           1.1  christos  *
    246           1.1  christos  *****************************************************************************/
    247           1.1  christos 
    248           1.1  christos ACPI_STATUS
    249           1.1  christos DtCompileMadt (
    250           1.1  christos     void                    **List)
    251           1.1  christos {
    252           1.1  christos     ACPI_STATUS             Status;
    253           1.1  christos     DT_SUBTABLE             *Subtable;
    254           1.1  christos     DT_SUBTABLE             *ParentTable;
    255           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    256           1.1  christos     DT_FIELD                *SubtableStart;
    257  1.1.1.17.6.1  perseant     ACPI_TABLE_HEADER       *Table;
    258           1.1  christos     ACPI_SUBTABLE_HEADER    *MadtHeader;
    259           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
    260  1.1.1.17.6.1  perseant     UINT8                   Revision;
    261           1.1  christos 
    262           1.1  christos 
    263           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
    264       1.1.1.6  christos         &Subtable);
    265           1.1  christos     if (ACPI_FAILURE (Status))
    266           1.1  christos     {
    267           1.1  christos         return (Status);
    268           1.1  christos     }
    269           1.1  christos 
    270           1.1  christos     ParentTable = DtPeekSubtable ();
    271           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    272           1.1  christos 
    273  1.1.1.17.6.1  perseant     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
    274  1.1.1.17.6.1  perseant     Revision = Table->Revision;
    275  1.1.1.17.6.1  perseant 
    276           1.1  christos     while (*PFieldList)
    277           1.1  christos     {
    278           1.1  christos         SubtableStart = *PFieldList;
    279           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
    280       1.1.1.6  christos             &Subtable);
    281           1.1  christos         if (ACPI_FAILURE (Status))
    282           1.1  christos         {
    283           1.1  christos             return (Status);
    284           1.1  christos         }
    285           1.1  christos 
    286           1.1  christos         ParentTable = DtPeekSubtable ();
    287           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    288           1.1  christos         DtPushSubtable (Subtable);
    289           1.1  christos 
    290           1.1  christos         MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
    291           1.1  christos 
    292           1.1  christos         switch (MadtHeader->Type)
    293           1.1  christos         {
    294           1.1  christos         case ACPI_MADT_TYPE_LOCAL_APIC:
    295           1.1  christos 
    296           1.1  christos             InfoTable = AcpiDmTableInfoMadt0;
    297           1.1  christos             break;
    298           1.1  christos 
    299           1.1  christos         case ACPI_MADT_TYPE_IO_APIC:
    300           1.1  christos 
    301           1.1  christos             InfoTable = AcpiDmTableInfoMadt1;
    302           1.1  christos             break;
    303           1.1  christos 
    304           1.1  christos         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
    305           1.1  christos 
    306           1.1  christos             InfoTable = AcpiDmTableInfoMadt2;
    307           1.1  christos             break;
    308           1.1  christos 
    309           1.1  christos         case ACPI_MADT_TYPE_NMI_SOURCE:
    310           1.1  christos 
    311           1.1  christos             InfoTable = AcpiDmTableInfoMadt3;
    312           1.1  christos             break;
    313           1.1  christos 
    314           1.1  christos         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
    315           1.1  christos 
    316           1.1  christos             InfoTable = AcpiDmTableInfoMadt4;
    317           1.1  christos             break;
    318           1.1  christos 
    319           1.1  christos         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
    320           1.1  christos 
    321           1.1  christos             InfoTable = AcpiDmTableInfoMadt5;
    322           1.1  christos             break;
    323           1.1  christos 
    324           1.1  christos         case ACPI_MADT_TYPE_IO_SAPIC:
    325           1.1  christos 
    326           1.1  christos             InfoTable = AcpiDmTableInfoMadt6;
    327           1.1  christos             break;
    328           1.1  christos 
    329           1.1  christos         case ACPI_MADT_TYPE_LOCAL_SAPIC:
    330           1.1  christos 
    331           1.1  christos             InfoTable = AcpiDmTableInfoMadt7;
    332           1.1  christos             break;
    333           1.1  christos 
    334           1.1  christos         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
    335           1.1  christos 
    336           1.1  christos             InfoTable = AcpiDmTableInfoMadt8;
    337           1.1  christos             break;
    338           1.1  christos 
    339           1.1  christos         case ACPI_MADT_TYPE_LOCAL_X2APIC:
    340           1.1  christos 
    341           1.1  christos             InfoTable = AcpiDmTableInfoMadt9;
    342           1.1  christos             break;
    343           1.1  christos 
    344           1.1  christos         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
    345           1.1  christos 
    346           1.1  christos             InfoTable = AcpiDmTableInfoMadt10;
    347           1.1  christos             break;
    348           1.1  christos 
    349           1.1  christos         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
    350           1.1  christos 
    351  1.1.1.17.6.1  perseant             if (Revision > 6)
    352  1.1.1.17.6.1  perseant                     InfoTable = AcpiDmTableInfoMadt11b;
    353  1.1.1.17.6.1  perseant             else if (Revision == 6)
    354  1.1.1.17.6.1  perseant                     InfoTable = AcpiDmTableInfoMadt11a;
    355  1.1.1.17.6.1  perseant             else
    356  1.1.1.17.6.1  perseant                     InfoTable = AcpiDmTableInfoMadt11;
    357           1.1  christos             break;
    358           1.1  christos 
    359           1.1  christos         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
    360           1.1  christos 
    361           1.1  christos             InfoTable = AcpiDmTableInfoMadt12;
    362           1.1  christos             break;
    363           1.1  christos 
    364           1.1  christos         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
    365           1.1  christos 
    366           1.1  christos             InfoTable = AcpiDmTableInfoMadt13;
    367           1.1  christos             break;
    368           1.1  christos 
    369           1.1  christos         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
    370           1.1  christos 
    371  1.1.1.17.6.1  perseant             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a
    372  1.1.1.17.6.1  perseant                                      : AcpiDmTableInfoMadt14;
    373           1.1  christos             break;
    374           1.1  christos 
    375           1.1  christos         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
    376           1.1  christos 
    377  1.1.1.17.6.1  perseant             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a
    378  1.1.1.17.6.1  perseant                                      : AcpiDmTableInfoMadt15;
    379  1.1.1.17.6.1  perseant 
    380           1.1  christos             break;
    381           1.1  christos 
    382      1.1.1.11  christos         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
    383      1.1.1.11  christos 
    384      1.1.1.11  christos             InfoTable = AcpiDmTableInfoMadt16;
    385      1.1.1.11  christos             break;
    386      1.1.1.11  christos 
    387      1.1.1.17  christos         case ACPI_MADT_TYPE_CORE_PIC:
    388      1.1.1.17  christos 
    389      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt17;
    390      1.1.1.17  christos             break;
    391      1.1.1.17  christos 
    392      1.1.1.17  christos         case ACPI_MADT_TYPE_LIO_PIC:
    393      1.1.1.17  christos 
    394      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt18;
    395      1.1.1.17  christos             break;
    396      1.1.1.17  christos 
    397      1.1.1.17  christos         case ACPI_MADT_TYPE_HT_PIC:
    398      1.1.1.17  christos 
    399      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt19;
    400      1.1.1.17  christos             break;
    401      1.1.1.17  christos 
    402      1.1.1.17  christos         case ACPI_MADT_TYPE_EIO_PIC:
    403      1.1.1.17  christos 
    404      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt20;
    405      1.1.1.17  christos             break;
    406      1.1.1.17  christos 
    407      1.1.1.17  christos         case ACPI_MADT_TYPE_MSI_PIC:
    408      1.1.1.17  christos 
    409      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt21;
    410      1.1.1.17  christos             break;
    411      1.1.1.17  christos 
    412      1.1.1.17  christos         case ACPI_MADT_TYPE_BIO_PIC:
    413      1.1.1.17  christos 
    414      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt22;
    415      1.1.1.17  christos             break;
    416      1.1.1.17  christos 
    417      1.1.1.17  christos         case ACPI_MADT_TYPE_LPC_PIC:
    418      1.1.1.17  christos 
    419      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt23;
    420      1.1.1.17  christos             break;
    421      1.1.1.17  christos 
    422      1.1.1.17  christos         case ACPI_MADT_TYPE_RINTC:
    423      1.1.1.17  christos 
    424      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt24;
    425      1.1.1.17  christos             break;
    426      1.1.1.17  christos 
    427      1.1.1.17  christos         case ACPI_MADT_TYPE_IMSIC:
    428      1.1.1.17  christos 
    429      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt25;
    430      1.1.1.17  christos             break;
    431      1.1.1.17  christos 
    432      1.1.1.17  christos         case ACPI_MADT_TYPE_APLIC:
    433      1.1.1.17  christos 
    434      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt26;
    435      1.1.1.17  christos             break;
    436      1.1.1.17  christos 
    437      1.1.1.17  christos         case ACPI_MADT_TYPE_PLIC:
    438      1.1.1.17  christos 
    439      1.1.1.17  christos             InfoTable = AcpiDmTableInfoMadt27;
    440      1.1.1.17  christos             break;
    441      1.1.1.17  christos 
    442           1.1  christos         default:
    443           1.1  christos 
    444      1.1.1.15  christos             if (MadtHeader->Type >= ACPI_MADT_TYPE_OEM_RESERVED)
    445      1.1.1.15  christos             {
    446      1.1.1.17  christos                 InfoTable = AcpiDmTableInfoMadt128;
    447      1.1.1.15  christos             }
    448      1.1.1.15  christos             else
    449      1.1.1.15  christos             {
    450      1.1.1.15  christos                 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
    451      1.1.1.15  christos                 return (AE_ERROR);
    452      1.1.1.15  christos             }
    453      1.1.1.15  christos 
    454      1.1.1.15  christos             break;
    455           1.1  christos         }
    456           1.1  christos 
    457       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    458           1.1  christos         if (ACPI_FAILURE (Status))
    459           1.1  christos         {
    460           1.1  christos             return (Status);
    461           1.1  christos         }
    462           1.1  christos 
    463           1.1  christos         ParentTable = DtPeekSubtable ();
    464           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    465           1.1  christos         DtPopSubtable ();
    466           1.1  christos     }
    467           1.1  christos 
    468           1.1  christos     return (AE_OK);
    469           1.1  christos }
    470           1.1  christos 
    471           1.1  christos 
    472           1.1  christos /******************************************************************************
    473           1.1  christos  *
    474           1.1  christos  * FUNCTION:    DtCompileMcfg
    475           1.1  christos  *
    476           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    477           1.1  christos  *
    478           1.1  christos  * RETURN:      Status
    479           1.1  christos  *
    480           1.1  christos  * DESCRIPTION: Compile MCFG.
    481           1.1  christos  *
    482           1.1  christos  *****************************************************************************/
    483           1.1  christos 
    484           1.1  christos ACPI_STATUS
    485           1.1  christos DtCompileMcfg (
    486           1.1  christos     void                    **List)
    487           1.1  christos {
    488           1.1  christos     ACPI_STATUS             Status;
    489           1.1  christos 
    490           1.1  christos 
    491           1.1  christos     Status = DtCompileTwoSubtables (List,
    492           1.1  christos         AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
    493           1.1  christos     return (Status);
    494           1.1  christos }
    495           1.1  christos 
    496      1.1.1.17  christos /******************************************************************************
    497      1.1.1.17  christos  *
    498      1.1.1.17  christos  * FUNCTION:    DtCompileMpam
    499      1.1.1.17  christos  *
    500      1.1.1.17  christos  * PARAMETERS:  List                - Current field list pointer
    501      1.1.1.17  christos  *
    502      1.1.1.17  christos  * RETURN:      Status
    503      1.1.1.17  christos  *
    504      1.1.1.17  christos  * DESCRIPTION: Compile MPAM.
    505      1.1.1.17  christos  *
    506      1.1.1.17  christos  *****************************************************************************/
    507      1.1.1.17  christos 
    508      1.1.1.17  christos ACPI_STATUS
    509      1.1.1.17  christos DtCompileMpam (
    510      1.1.1.17  christos     void                    **List)
    511      1.1.1.17  christos {
    512      1.1.1.17  christos     ACPI_STATUS             Status;
    513      1.1.1.17  christos     DT_SUBTABLE             *ParentTable;
    514      1.1.1.17  christos     DT_SUBTABLE             *Subtable;
    515      1.1.1.17  christos     DT_FIELD                *SubtableStart;
    516      1.1.1.17  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    517      1.1.1.17  christos     ACPI_MPAM_MSC_NODE      *MpamMscNode;
    518      1.1.1.17  christos     ACPI_MPAM_RESOURCE_NODE *MpamResourceNode;
    519      1.1.1.17  christos     UINT32                  FuncDepsCount;
    520      1.1.1.17  christos     UINT32                  RisLength;
    521      1.1.1.17  christos     ACPI_DMTABLE_INFO       *InfoTable;
    522      1.1.1.17  christos 
    523      1.1.1.17  christos     ParentTable = DtPeekSubtable ();
    524      1.1.1.17  christos 
    525      1.1.1.17  christos     while (*PFieldList)
    526      1.1.1.17  christos     {
    527      1.1.1.17  christos         SubtableStart = *PFieldList;
    528      1.1.1.17  christos 
    529      1.1.1.17  christos         /* Main MSC Node table */
    530      1.1.1.17  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam0,
    531      1.1.1.17  christos             &Subtable);
    532      1.1.1.17  christos         if (ACPI_FAILURE (Status))
    533      1.1.1.17  christos         {
    534      1.1.1.17  christos             return (Status);
    535      1.1.1.17  christos         }
    536      1.1.1.17  christos 
    537      1.1.1.17  christos         MpamMscNode = ACPI_CAST_PTR (ACPI_MPAM_MSC_NODE, Subtable->Buffer);
    538      1.1.1.17  christos 
    539      1.1.1.17  christos         ParentTable = DtPeekSubtable ();
    540      1.1.1.17  christos         DtInsertSubtable (ParentTable, Subtable);
    541      1.1.1.17  christos         DtPushSubtable (Subtable);
    542      1.1.1.17  christos 
    543      1.1.1.17  christos         ParentTable = DtPeekSubtable ();
    544      1.1.1.17  christos 
    545      1.1.1.17  christos         /*
    546      1.1.1.17  christos          * RIS(es) per MSC node have variable lengths depending on how many RISes there and
    547      1.1.1.17  christos          * any how many functional dependencies per RIS. Calculate it in order
    548      1.1.1.17  christos          * to properly set the overall MSC length.
    549      1.1.1.17  christos          */
    550      1.1.1.17  christos         RisLength = 0;
    551      1.1.1.17  christos 
    552      1.1.1.17  christos         /* Iterate over RIS subtables per MSC node */
    553  1.1.1.17.6.1  perseant         for (UINT32 ris = 0; ris < MpamMscNode->NumResourceNodes; ris++)
    554      1.1.1.17  christos         {
    555      1.1.1.17  christos             /* Compile RIS subtable */
    556      1.1.1.17  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1,
    557      1.1.1.17  christos                 &Subtable);
    558      1.1.1.17  christos             if (ACPI_FAILURE (Status))
    559      1.1.1.17  christos             {
    560      1.1.1.17  christos                 return (Status);
    561      1.1.1.17  christos             }
    562      1.1.1.17  christos 
    563      1.1.1.17  christos             MpamResourceNode = ACPI_CAST_PTR (ACPI_MPAM_RESOURCE_NODE, Subtable->Buffer);
    564      1.1.1.17  christos             DtInsertSubtable (ParentTable, Subtable);
    565      1.1.1.17  christos             DtPushSubtable (Subtable);
    566      1.1.1.17  christos 
    567      1.1.1.17  christos             ParentTable = DtPeekSubtable ();
    568      1.1.1.17  christos 
    569      1.1.1.17  christos             switch (MpamResourceNode->LocatorType)
    570      1.1.1.17  christos             {
    571      1.1.1.17  christos                 case ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE:
    572      1.1.1.17  christos                     InfoTable = AcpiDmTableInfoMpam1A;
    573      1.1.1.17  christos                     break;
    574      1.1.1.17  christos                 case ACPI_MPAM_LOCATION_TYPE_MEMORY:
    575      1.1.1.17  christos                     InfoTable = AcpiDmTableInfoMpam1B;
    576      1.1.1.17  christos                     break;
    577      1.1.1.17  christos                 case ACPI_MPAM_LOCATION_TYPE_SMMU:
    578      1.1.1.17  christos                     InfoTable = AcpiDmTableInfoMpam1C;
    579      1.1.1.17  christos                     break;
    580      1.1.1.17  christos                 case ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE:
    581      1.1.1.17  christos                     InfoTable = AcpiDmTableInfoMpam1D;
    582      1.1.1.17  christos                     break;
    583      1.1.1.17  christos                 case ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE:
    584      1.1.1.17  christos                     InfoTable = AcpiDmTableInfoMpam1E;
    585      1.1.1.17  christos                     break;
    586      1.1.1.17  christos                 case ACPI_MPAM_LOCATION_TYPE_INTERCONNECT:
    587      1.1.1.17  christos                     InfoTable = AcpiDmTableInfoMpam1F;
    588      1.1.1.17  christos                     break;
    589      1.1.1.17  christos                 case ACPI_MPAM_LOCATION_TYPE_UNKNOWN:
    590      1.1.1.17  christos                     InfoTable = AcpiDmTableInfoMpam1G;
    591      1.1.1.17  christos                 default:
    592      1.1.1.17  christos                     DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "Resource Locator Type");
    593      1.1.1.17  christos                     return (AE_ERROR);
    594      1.1.1.17  christos             }
    595      1.1.1.17  christos 
    596      1.1.1.17  christos             /* Compile Resource Locator Table */
    597      1.1.1.17  christos             Status = DtCompileTable (PFieldList, InfoTable,
    598      1.1.1.17  christos                 &Subtable);
    599      1.1.1.17  christos 
    600      1.1.1.17  christos             if (ACPI_FAILURE (Status))
    601      1.1.1.17  christos             {
    602      1.1.1.17  christos                 return (Status);
    603      1.1.1.17  christos             }
    604      1.1.1.17  christos 
    605      1.1.1.17  christos             DtInsertSubtable (ParentTable, Subtable);
    606      1.1.1.17  christos 
    607      1.1.1.17  christos             /* Compile the number of functional dependencies per RIS */
    608      1.1.1.17  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam1Deps,
    609      1.1.1.17  christos                 &Subtable);
    610      1.1.1.17  christos 
    611      1.1.1.17  christos             if (ACPI_FAILURE (Status))
    612      1.1.1.17  christos             {
    613      1.1.1.17  christos                 return (Status);
    614      1.1.1.17  christos             }
    615      1.1.1.17  christos 
    616      1.1.1.17  christos             DtInsertSubtable (ParentTable, Subtable);
    617      1.1.1.17  christos             FuncDepsCount = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
    618      1.1.1.17  christos 
    619      1.1.1.17  christos             RisLength += sizeof(ACPI_MPAM_RESOURCE_NODE) +
    620      1.1.1.17  christos                 FuncDepsCount * sizeof(ACPI_MPAM_FUNC_DEPS);
    621      1.1.1.17  christos 
    622      1.1.1.17  christos             /* Iterate over functional dependencies per RIS */
    623      1.1.1.17  christos             for (UINT32 funcDep = 0; funcDep < FuncDepsCount; funcDep++)
    624      1.1.1.17  christos             {
    625      1.1.1.17  christos                 /* Compiler functional dependencies table */
    626      1.1.1.17  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpam2,
    627      1.1.1.17  christos                     &Subtable);
    628      1.1.1.17  christos 
    629      1.1.1.17  christos                 if (ACPI_FAILURE (Status))
    630      1.1.1.17  christos                 {
    631      1.1.1.17  christos                     return (Status);
    632      1.1.1.17  christos                 }
    633      1.1.1.17  christos 
    634      1.1.1.17  christos                 DtInsertSubtable (ParentTable, Subtable);
    635      1.1.1.17  christos             }
    636      1.1.1.17  christos 
    637      1.1.1.17  christos             DtPopSubtable ();
    638      1.1.1.17  christos         }
    639      1.1.1.17  christos 
    640      1.1.1.17  christos         /* Check if the length of the MSC is correct and override with the correct length */
    641      1.1.1.17  christos         if (MpamMscNode->Length != sizeof(ACPI_MPAM_MSC_NODE) + RisLength)
    642      1.1.1.17  christos         {
    643      1.1.1.17  christos             MpamMscNode->Length = (UINT16) (sizeof(ACPI_MPAM_MSC_NODE) + RisLength);
    644      1.1.1.17  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Overriding MSC->Length: %X\n", MpamMscNode->Length);
    645      1.1.1.17  christos         }
    646      1.1.1.17  christos 
    647      1.1.1.17  christos         DtPopSubtable ();
    648      1.1.1.17  christos     }
    649      1.1.1.17  christos 
    650      1.1.1.17  christos     return (AE_OK);
    651      1.1.1.17  christos }
    652      1.1.1.17  christos 
    653           1.1  christos 
    654           1.1  christos /******************************************************************************
    655           1.1  christos  *
    656           1.1  christos  * FUNCTION:    DtCompileMpst
    657           1.1  christos  *
    658           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    659           1.1  christos  *
    660           1.1  christos  * RETURN:      Status
    661           1.1  christos  *
    662           1.1  christos  * DESCRIPTION: Compile MPST.
    663           1.1  christos  *
    664           1.1  christos  *****************************************************************************/
    665           1.1  christos 
    666           1.1  christos ACPI_STATUS
    667           1.1  christos DtCompileMpst (
    668           1.1  christos     void                    **List)
    669           1.1  christos {
    670           1.1  christos     ACPI_STATUS             Status;
    671           1.1  christos     DT_SUBTABLE             *Subtable;
    672           1.1  christos     DT_SUBTABLE             *ParentTable;
    673           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    674           1.1  christos     ACPI_MPST_CHANNEL       *MpstChannelInfo;
    675           1.1  christos     ACPI_MPST_POWER_NODE    *MpstPowerNode;
    676           1.1  christos     ACPI_MPST_DATA_HDR      *MpstDataHeader;
    677           1.1  christos     UINT16                  SubtableCount;
    678           1.1  christos     UINT32                  PowerStateCount;
    679           1.1  christos     UINT32                  ComponentCount;
    680           1.1  christos 
    681           1.1  christos 
    682           1.1  christos     /* Main table */
    683           1.1  christos 
    684       1.1.1.6  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable);
    685           1.1  christos     if (ACPI_FAILURE (Status))
    686           1.1  christos     {
    687           1.1  christos         return (Status);
    688           1.1  christos     }
    689           1.1  christos 
    690           1.1  christos     ParentTable = DtPeekSubtable ();
    691           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    692           1.1  christos     DtPushSubtable (Subtable);
    693           1.1  christos 
    694           1.1  christos     MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
    695           1.1  christos     SubtableCount = MpstChannelInfo->PowerNodeCount;
    696           1.1  christos 
    697           1.1  christos     while (*PFieldList && SubtableCount)
    698           1.1  christos     {
    699           1.1  christos         /* Subtable: Memory Power Node(s) */
    700           1.1  christos 
    701           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
    702       1.1.1.6  christos             &Subtable);
    703           1.1  christos         if (ACPI_FAILURE (Status))
    704           1.1  christos         {
    705           1.1  christos             return (Status);
    706           1.1  christos         }
    707           1.1  christos 
    708           1.1  christos         ParentTable = DtPeekSubtable ();
    709           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    710           1.1  christos         DtPushSubtable (Subtable);
    711           1.1  christos 
    712           1.1  christos         MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
    713           1.1  christos         PowerStateCount = MpstPowerNode->NumPowerStates;
    714           1.1  christos         ComponentCount = MpstPowerNode->NumPhysicalComponents;
    715           1.1  christos 
    716           1.1  christos         ParentTable = DtPeekSubtable ();
    717           1.1  christos 
    718           1.1  christos         /* Sub-subtables - Memory Power State Structure(s) */
    719           1.1  christos 
    720           1.1  christos         while (*PFieldList && PowerStateCount)
    721           1.1  christos         {
    722           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
    723       1.1.1.6  christos                 &Subtable);
    724           1.1  christos             if (ACPI_FAILURE (Status))
    725           1.1  christos             {
    726           1.1  christos                 return (Status);
    727           1.1  christos             }
    728           1.1  christos 
    729           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
    730           1.1  christos             PowerStateCount--;
    731           1.1  christos         }
    732           1.1  christos 
    733           1.1  christos         /* Sub-subtables - Physical Component ID Structure(s) */
    734           1.1  christos 
    735           1.1  christos         while (*PFieldList && ComponentCount)
    736           1.1  christos         {
    737           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
    738       1.1.1.6  christos                 &Subtable);
    739           1.1  christos             if (ACPI_FAILURE (Status))
    740           1.1  christos             {
    741           1.1  christos                 return (Status);
    742           1.1  christos             }
    743           1.1  christos 
    744           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
    745           1.1  christos             ComponentCount--;
    746           1.1  christos         }
    747           1.1  christos 
    748           1.1  christos         SubtableCount--;
    749           1.1  christos         DtPopSubtable ();
    750           1.1  christos     }
    751           1.1  christos 
    752           1.1  christos     /* Subtable: Count of Memory Power State Characteristic structures */
    753           1.1  christos 
    754           1.1  christos     DtPopSubtable ();
    755           1.1  christos 
    756       1.1.1.6  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable);
    757           1.1  christos     if (ACPI_FAILURE (Status))
    758           1.1  christos     {
    759           1.1  christos         return (Status);
    760           1.1  christos     }
    761           1.1  christos 
    762           1.1  christos     ParentTable = DtPeekSubtable ();
    763           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    764           1.1  christos     DtPushSubtable (Subtable);
    765           1.1  christos 
    766           1.1  christos     MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
    767           1.1  christos     SubtableCount = MpstDataHeader->CharacteristicsCount;
    768           1.1  christos 
    769           1.1  christos     ParentTable = DtPeekSubtable ();
    770           1.1  christos 
    771           1.1  christos     /* Subtable: Memory Power State Characteristics structure(s) */
    772           1.1  christos 
    773           1.1  christos     while (*PFieldList && SubtableCount)
    774           1.1  christos     {
    775           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
    776       1.1.1.6  christos             &Subtable);
    777           1.1  christos         if (ACPI_FAILURE (Status))
    778           1.1  christos         {
    779           1.1  christos             return (Status);
    780           1.1  christos         }
    781           1.1  christos 
    782           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    783           1.1  christos         SubtableCount--;
    784           1.1  christos     }
    785           1.1  christos 
    786           1.1  christos     DtPopSubtable ();
    787           1.1  christos     return (AE_OK);
    788           1.1  christos }
    789           1.1  christos 
    790           1.1  christos 
    791           1.1  christos /******************************************************************************
    792           1.1  christos  *
    793           1.1  christos  * FUNCTION:    DtCompileMsct
    794           1.1  christos  *
    795           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    796           1.1  christos  *
    797           1.1  christos  * RETURN:      Status
    798           1.1  christos  *
    799           1.1  christos  * DESCRIPTION: Compile MSCT.
    800           1.1  christos  *
    801           1.1  christos  *****************************************************************************/
    802           1.1  christos 
    803           1.1  christos ACPI_STATUS
    804           1.1  christos DtCompileMsct (
    805           1.1  christos     void                    **List)
    806           1.1  christos {
    807           1.1  christos     ACPI_STATUS             Status;
    808           1.1  christos 
    809           1.1  christos 
    810           1.1  christos     Status = DtCompileTwoSubtables (List,
    811           1.1  christos         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
    812           1.1  christos     return (Status);
    813           1.1  christos }
    814           1.1  christos 
    815           1.1  christos 
    816           1.1  christos /******************************************************************************
    817           1.1  christos  *
    818           1.1  christos  * FUNCTION:    DtCompileNfit
    819           1.1  christos  *
    820           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    821           1.1  christos  *
    822           1.1  christos  * RETURN:      Status
    823           1.1  christos  *
    824           1.1  christos  * DESCRIPTION: Compile NFIT.
    825           1.1  christos  *
    826           1.1  christos  *****************************************************************************/
    827           1.1  christos 
    828           1.1  christos ACPI_STATUS
    829           1.1  christos DtCompileNfit (
    830           1.1  christos     void                    **List)
    831           1.1  christos {
    832           1.1  christos     ACPI_STATUS             Status;
    833           1.1  christos     DT_SUBTABLE             *Subtable;
    834           1.1  christos     DT_SUBTABLE             *ParentTable;
    835           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    836           1.1  christos     DT_FIELD                *SubtableStart;
    837           1.1  christos     ACPI_NFIT_HEADER        *NfitHeader;
    838           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
    839           1.1  christos     UINT32                  Count;
    840           1.1  christos     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
    841           1.1  christos     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
    842           1.1  christos 
    843           1.1  christos 
    844           1.1  christos     /* Main table */
    845           1.1  christos 
    846           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
    847       1.1.1.6  christos         &Subtable);
    848           1.1  christos     if (ACPI_FAILURE (Status))
    849           1.1  christos     {
    850           1.1  christos         return (Status);
    851           1.1  christos     }
    852           1.1  christos 
    853           1.1  christos     ParentTable = DtPeekSubtable ();
    854           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    855           1.1  christos     DtPushSubtable (Subtable);
    856           1.1  christos 
    857           1.1  christos     /* Subtables */
    858           1.1  christos 
    859           1.1  christos     while (*PFieldList)
    860           1.1  christos     {
    861           1.1  christos         SubtableStart = *PFieldList;
    862           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
    863       1.1.1.6  christos             &Subtable);
    864           1.1  christos         if (ACPI_FAILURE (Status))
    865           1.1  christos         {
    866           1.1  christos             return (Status);
    867           1.1  christos         }
    868           1.1  christos 
    869           1.1  christos         ParentTable = DtPeekSubtable ();
    870           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    871           1.1  christos         DtPushSubtable (Subtable);
    872           1.1  christos 
    873           1.1  christos         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
    874           1.1  christos 
    875           1.1  christos         switch (NfitHeader->Type)
    876           1.1  christos         {
    877           1.1  christos         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
    878           1.1  christos 
    879           1.1  christos             InfoTable = AcpiDmTableInfoNfit0;
    880           1.1  christos             break;
    881           1.1  christos 
    882           1.1  christos         case ACPI_NFIT_TYPE_MEMORY_MAP:
    883           1.1  christos 
    884           1.1  christos             InfoTable = AcpiDmTableInfoNfit1;
    885           1.1  christos             break;
    886           1.1  christos 
    887           1.1  christos         case ACPI_NFIT_TYPE_INTERLEAVE:
    888           1.1  christos 
    889           1.1  christos             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
    890           1.1  christos             InfoTable = AcpiDmTableInfoNfit2;
    891           1.1  christos             break;
    892           1.1  christos 
    893           1.1  christos         case ACPI_NFIT_TYPE_SMBIOS:
    894           1.1  christos 
    895           1.1  christos             InfoTable = AcpiDmTableInfoNfit3;
    896           1.1  christos             break;
    897           1.1  christos 
    898           1.1  christos         case ACPI_NFIT_TYPE_CONTROL_REGION:
    899           1.1  christos 
    900           1.1  christos             InfoTable = AcpiDmTableInfoNfit4;
    901           1.1  christos             break;
    902           1.1  christos 
    903           1.1  christos         case ACPI_NFIT_TYPE_DATA_REGION:
    904           1.1  christos 
    905           1.1  christos             InfoTable = AcpiDmTableInfoNfit5;
    906           1.1  christos             break;
    907           1.1  christos 
    908           1.1  christos         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
    909           1.1  christos 
    910           1.1  christos             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
    911           1.1  christos             InfoTable = AcpiDmTableInfoNfit6;
    912           1.1  christos             break;
    913           1.1  christos 
    914       1.1.1.5  christos         case ACPI_NFIT_TYPE_CAPABILITIES:
    915       1.1.1.5  christos 
    916       1.1.1.5  christos             InfoTable = AcpiDmTableInfoNfit7;
    917       1.1.1.5  christos             break;
    918       1.1.1.5  christos 
    919           1.1  christos         default:
    920           1.1  christos 
    921           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
    922           1.1  christos             return (AE_ERROR);
    923           1.1  christos         }
    924           1.1  christos 
    925       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    926           1.1  christos         if (ACPI_FAILURE (Status))
    927           1.1  christos         {
    928           1.1  christos             return (Status);
    929           1.1  christos         }
    930           1.1  christos 
    931           1.1  christos         ParentTable = DtPeekSubtable ();
    932           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    933           1.1  christos         DtPopSubtable ();
    934           1.1  christos 
    935           1.1  christos         switch (NfitHeader->Type)
    936           1.1  christos         {
    937           1.1  christos         case ACPI_NFIT_TYPE_INTERLEAVE:
    938           1.1  christos 
    939           1.1  christos             Count = 0;
    940           1.1  christos             DtPushSubtable (Subtable);
    941           1.1  christos             while (*PFieldList)
    942           1.1  christos             {
    943           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
    944       1.1.1.6  christos                     &Subtable);
    945           1.1  christos                 if (ACPI_FAILURE (Status))
    946           1.1  christos                 {
    947           1.1  christos                     return (Status);
    948           1.1  christos                 }
    949           1.1  christos 
    950           1.1  christos                 if (!Subtable)
    951           1.1  christos                 {
    952           1.1  christos                     DtPopSubtable ();
    953           1.1  christos                     break;
    954           1.1  christos                 }
    955           1.1  christos 
    956           1.1  christos                 ParentTable = DtPeekSubtable ();
    957           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
    958           1.1  christos                 Count++;
    959           1.1  christos             }
    960           1.1  christos 
    961           1.1  christos             Interleave->LineCount = Count;
    962           1.1  christos             break;
    963           1.1  christos 
    964           1.1  christos         case ACPI_NFIT_TYPE_SMBIOS:
    965           1.1  christos 
    966           1.1  christos             if (*PFieldList)
    967           1.1  christos             {
    968           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
    969       1.1.1.6  christos                     &Subtable);
    970           1.1  christos                 if (ACPI_FAILURE (Status))
    971           1.1  christos                 {
    972           1.1  christos                     return (Status);
    973           1.1  christos                 }
    974           1.1  christos 
    975           1.1  christos                 if (Subtable)
    976           1.1  christos                 {
    977           1.1  christos                     DtInsertSubtable (ParentTable, Subtable);
    978           1.1  christos                 }
    979           1.1  christos             }
    980           1.1  christos             break;
    981           1.1  christos 
    982           1.1  christos         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
    983           1.1  christos 
    984           1.1  christos             Count = 0;
    985           1.1  christos             DtPushSubtable (Subtable);
    986           1.1  christos             while (*PFieldList)
    987           1.1  christos             {
    988           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
    989       1.1.1.6  christos                     &Subtable);
    990           1.1  christos                 if (ACPI_FAILURE (Status))
    991           1.1  christos                 {
    992           1.1  christos                     return (Status);
    993           1.1  christos                 }
    994           1.1  christos 
    995           1.1  christos                 if (!Subtable)
    996           1.1  christos                 {
    997           1.1  christos                     DtPopSubtable ();
    998           1.1  christos                     break;
    999           1.1  christos                 }
   1000           1.1  christos 
   1001           1.1  christos                 ParentTable = DtPeekSubtable ();
   1002           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   1003           1.1  christos                 Count++;
   1004           1.1  christos             }
   1005           1.1  christos 
   1006           1.1  christos             Hint->HintCount = (UINT16) Count;
   1007           1.1  christos             break;
   1008           1.1  christos 
   1009           1.1  christos         default:
   1010           1.1  christos             break;
   1011           1.1  christos         }
   1012           1.1  christos     }
   1013           1.1  christos 
   1014           1.1  christos     return (AE_OK);
   1015           1.1  christos }
   1016           1.1  christos 
   1017           1.1  christos 
   1018           1.1  christos /******************************************************************************
   1019           1.1  christos  *
   1020           1.1  christos  * FUNCTION:    DtCompilePcct
   1021           1.1  christos  *
   1022           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1023           1.1  christos  *
   1024           1.1  christos  * RETURN:      Status
   1025           1.1  christos  *
   1026           1.1  christos  * DESCRIPTION: Compile PCCT.
   1027           1.1  christos  *
   1028           1.1  christos  *****************************************************************************/
   1029           1.1  christos 
   1030           1.1  christos ACPI_STATUS
   1031           1.1  christos DtCompilePcct (
   1032           1.1  christos     void                    **List)
   1033           1.1  christos {
   1034           1.1  christos     ACPI_STATUS             Status;
   1035           1.1  christos     DT_SUBTABLE             *Subtable;
   1036           1.1  christos     DT_SUBTABLE             *ParentTable;
   1037           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1038           1.1  christos     DT_FIELD                *SubtableStart;
   1039           1.1  christos     ACPI_SUBTABLE_HEADER    *PcctHeader;
   1040           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1041           1.1  christos 
   1042           1.1  christos 
   1043           1.1  christos     /* Main table */
   1044           1.1  christos 
   1045           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
   1046       1.1.1.6  christos         &Subtable);
   1047           1.1  christos     if (ACPI_FAILURE (Status))
   1048           1.1  christos     {
   1049           1.1  christos         return (Status);
   1050           1.1  christos     }
   1051           1.1  christos 
   1052           1.1  christos     ParentTable = DtPeekSubtable ();
   1053           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1054           1.1  christos 
   1055           1.1  christos     /* Subtables */
   1056           1.1  christos 
   1057           1.1  christos     while (*PFieldList)
   1058           1.1  christos     {
   1059           1.1  christos         SubtableStart = *PFieldList;
   1060           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
   1061       1.1.1.6  christos             &Subtable);
   1062           1.1  christos         if (ACPI_FAILURE (Status))
   1063           1.1  christos         {
   1064           1.1  christos             return (Status);
   1065           1.1  christos         }
   1066           1.1  christos 
   1067           1.1  christos         ParentTable = DtPeekSubtable ();
   1068           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1069           1.1  christos         DtPushSubtable (Subtable);
   1070           1.1  christos 
   1071           1.1  christos         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1072           1.1  christos 
   1073           1.1  christos         switch (PcctHeader->Type)
   1074           1.1  christos         {
   1075           1.1  christos         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   1076           1.1  christos 
   1077           1.1  christos             InfoTable = AcpiDmTableInfoPcct0;
   1078           1.1  christos             break;
   1079           1.1  christos 
   1080           1.1  christos         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   1081           1.1  christos 
   1082           1.1  christos             InfoTable = AcpiDmTableInfoPcct1;
   1083           1.1  christos             break;
   1084           1.1  christos 
   1085       1.1.1.2  christos         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
   1086       1.1.1.2  christos 
   1087       1.1.1.2  christos             InfoTable = AcpiDmTableInfoPcct2;
   1088       1.1.1.2  christos             break;
   1089       1.1.1.2  christos 
   1090       1.1.1.4  christos         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
   1091       1.1.1.4  christos 
   1092       1.1.1.4  christos             InfoTable = AcpiDmTableInfoPcct3;
   1093       1.1.1.4  christos             break;
   1094       1.1.1.4  christos 
   1095       1.1.1.4  christos         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
   1096       1.1.1.4  christos 
   1097       1.1.1.4  christos             InfoTable = AcpiDmTableInfoPcct4;
   1098       1.1.1.4  christos             break;
   1099       1.1.1.4  christos 
   1100      1.1.1.11  christos         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
   1101      1.1.1.11  christos 
   1102      1.1.1.11  christos             InfoTable = AcpiDmTableInfoPcct5;
   1103      1.1.1.11  christos             break;
   1104      1.1.1.11  christos 
   1105           1.1  christos         default:
   1106           1.1  christos 
   1107           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
   1108           1.1  christos             return (AE_ERROR);
   1109           1.1  christos         }
   1110           1.1  christos 
   1111       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1112           1.1  christos         if (ACPI_FAILURE (Status))
   1113           1.1  christos         {
   1114           1.1  christos             return (Status);
   1115           1.1  christos         }
   1116           1.1  christos 
   1117           1.1  christos         ParentTable = DtPeekSubtable ();
   1118           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1119           1.1  christos         DtPopSubtable ();
   1120           1.1  christos     }
   1121           1.1  christos 
   1122           1.1  christos     return (AE_OK);
   1123           1.1  christos }
   1124           1.1  christos 
   1125           1.1  christos 
   1126           1.1  christos /******************************************************************************
   1127           1.1  christos  *
   1128       1.1.1.5  christos  * FUNCTION:    DtCompilePdtt
   1129       1.1.1.5  christos  *
   1130       1.1.1.5  christos  * PARAMETERS:  List                - Current field list pointer
   1131       1.1.1.5  christos  *
   1132       1.1.1.5  christos  * RETURN:      Status
   1133       1.1.1.5  christos  *
   1134       1.1.1.5  christos  * DESCRIPTION: Compile PDTT.
   1135       1.1.1.5  christos  *
   1136       1.1.1.5  christos  *****************************************************************************/
   1137       1.1.1.5  christos 
   1138       1.1.1.5  christos ACPI_STATUS
   1139       1.1.1.5  christos DtCompilePdtt (
   1140       1.1.1.5  christos     void                    **List)
   1141       1.1.1.5  christos {
   1142       1.1.1.5  christos     ACPI_STATUS             Status;
   1143       1.1.1.5  christos     DT_SUBTABLE             *Subtable;
   1144       1.1.1.5  christos     DT_SUBTABLE             *ParentTable;
   1145       1.1.1.5  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1146       1.1.1.5  christos     ACPI_TABLE_PDTT         *PdttHeader;
   1147       1.1.1.5  christos     UINT32                  Count = 0;
   1148       1.1.1.5  christos 
   1149       1.1.1.5  christos 
   1150       1.1.1.5  christos     /* Main table */
   1151       1.1.1.5  christos 
   1152       1.1.1.6  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable);
   1153       1.1.1.5  christos     if (ACPI_FAILURE (Status))
   1154       1.1.1.5  christos     {
   1155       1.1.1.5  christos         return (Status);
   1156       1.1.1.5  christos     }
   1157       1.1.1.5  christos 
   1158       1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   1159       1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   1160       1.1.1.5  christos 
   1161       1.1.1.5  christos     PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
   1162       1.1.1.5  christos     PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
   1163       1.1.1.5  christos 
   1164       1.1.1.5  christos     /* There is only one type of subtable at this time, no need to decode */
   1165       1.1.1.5  christos 
   1166       1.1.1.5  christos     while (*PFieldList)
   1167       1.1.1.5  christos     {
   1168       1.1.1.5  christos         /* List of subchannel IDs, each 2 bytes */
   1169       1.1.1.5  christos 
   1170       1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
   1171       1.1.1.6  christos             &Subtable);
   1172       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   1173       1.1.1.5  christos         {
   1174       1.1.1.5  christos             return (Status);
   1175       1.1.1.5  christos         }
   1176       1.1.1.5  christos 
   1177       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   1178       1.1.1.5  christos         Count++;
   1179       1.1.1.5  christos     }
   1180       1.1.1.5  christos 
   1181       1.1.1.5  christos     PdttHeader->TriggerCount = (UINT8) Count;
   1182       1.1.1.5  christos     return (AE_OK);
   1183       1.1.1.5  christos }
   1184       1.1.1.5  christos 
   1185       1.1.1.5  christos 
   1186       1.1.1.5  christos /******************************************************************************
   1187       1.1.1.5  christos  *
   1188      1.1.1.11  christos  * FUNCTION:    DtCompilePhat
   1189      1.1.1.11  christos  *
   1190      1.1.1.11  christos  * PARAMETERS:  List                - Current field list pointer
   1191      1.1.1.11  christos  *
   1192      1.1.1.11  christos  * RETURN:      Status
   1193      1.1.1.11  christos  *
   1194      1.1.1.11  christos  * DESCRIPTION: Compile Phat.
   1195      1.1.1.11  christos  *
   1196      1.1.1.11  christos  *****************************************************************************/
   1197      1.1.1.11  christos 
   1198      1.1.1.11  christos ACPI_STATUS
   1199      1.1.1.11  christos DtCompilePhat (
   1200      1.1.1.11  christos     void                    **List)
   1201      1.1.1.11  christos {
   1202      1.1.1.11  christos     ACPI_STATUS             Status = AE_OK;
   1203      1.1.1.11  christos     DT_SUBTABLE             *Subtable;
   1204      1.1.1.11  christos     DT_SUBTABLE             *ParentTable;
   1205      1.1.1.11  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1206      1.1.1.11  christos     ACPI_PHAT_HEADER        *PhatHeader;
   1207      1.1.1.11  christos     ACPI_DMTABLE_INFO       *Info;
   1208      1.1.1.11  christos     ACPI_PHAT_VERSION_DATA  *VersionData;
   1209      1.1.1.16  christos     UINT32                  DeviceDataLength;
   1210      1.1.1.11  christos     UINT32                  RecordCount;
   1211      1.1.1.16  christos     DT_FIELD                *DataOffsetField;
   1212      1.1.1.16  christos     DT_FIELD                *DevicePathField;
   1213      1.1.1.16  christos     UINT32                  TableOffset = 0;
   1214      1.1.1.16  christos     UINT32                  DataOffsetValue;
   1215      1.1.1.16  christos     UINT32                  i;
   1216      1.1.1.11  christos 
   1217      1.1.1.11  christos 
   1218      1.1.1.16  christos     /* The table consists of subtables */
   1219      1.1.1.11  christos 
   1220      1.1.1.11  christos     while (*PFieldList)
   1221      1.1.1.11  christos     {
   1222      1.1.1.16  christos         /* Compile the common subtable header */
   1223      1.1.1.16  christos 
   1224      1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
   1225      1.1.1.11  christos         if (ACPI_FAILURE (Status))
   1226      1.1.1.11  christos         {
   1227      1.1.1.11  christos             return (Status);
   1228      1.1.1.11  christos         }
   1229      1.1.1.11  christos 
   1230      1.1.1.16  christos         TableOffset += Subtable->Length;
   1231      1.1.1.16  christos         DbgPrint (ASL_DEBUG_OUTPUT, "0 Subtable->Length: %X\n", Subtable->Length);
   1232      1.1.1.16  christos 
   1233      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   1234      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   1235      1.1.1.11  christos         DtPushSubtable (Subtable);
   1236      1.1.1.11  christos 
   1237      1.1.1.11  christos         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
   1238      1.1.1.11  christos 
   1239      1.1.1.11  christos         switch (PhatHeader->Type)
   1240      1.1.1.11  christos         {
   1241      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1242      1.1.1.11  christos 
   1243      1.1.1.16  christos             /* Compile the middle portion of the Firmware Version Data */
   1244      1.1.1.16  christos 
   1245      1.1.1.11  christos             Info = AcpiDmTableInfoPhat0;
   1246      1.1.1.11  christos             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
   1247      1.1.1.16  christos             DataOffsetField = NULL;
   1248      1.1.1.11  christos             break;
   1249      1.1.1.11  christos 
   1250      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1251      1.1.1.11  christos 
   1252      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "1 Offset: %X, Name: \"%s\" Length: %X\n",
   1253      1.1.1.16  christos                 (*PFieldList)->TableOffset, (*PFieldList)->Name, Subtable->Length);
   1254      1.1.1.16  christos 
   1255      1.1.1.16  christos             DataOffsetField = *PFieldList;
   1256      1.1.1.16  christos 
   1257      1.1.1.16  christos             /* Walk the field list to get to the "Device-specific data Offset" field */
   1258      1.1.1.16  christos 
   1259      1.1.1.16  christos             TableOffset = sizeof (ACPI_PHAT_HEALTH_DATA);
   1260      1.1.1.16  christos             for (i = 0; i < 3; i++)
   1261      1.1.1.16  christos             {
   1262      1.1.1.16  christos                 DataOffsetField = DataOffsetField->Next;
   1263      1.1.1.16  christos                 DbgPrint (ASL_DEBUG_OUTPUT, "2 Offset: %X, Name: \"%s\" Length: %X Value: %s:\n",
   1264      1.1.1.16  christos                     TableOffset, DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
   1265      1.1.1.16  christos             }
   1266      1.1.1.16  christos 
   1267      1.1.1.16  christos             /* Convert DataOffsetField->Value (a char * string) to an integer value */
   1268      1.1.1.16  christos 
   1269      1.1.1.16  christos             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
   1270      1.1.1.16  christos 
   1271      1.1.1.16  christos             /*
   1272      1.1.1.16  christos              * Get the next field (Device Path):
   1273      1.1.1.16  christos              * DataOffsetField points to "Device-Specific Offset", next field is
   1274      1.1.1.16  christos              * "Device Path".
   1275      1.1.1.16  christos              */
   1276      1.1.1.16  christos             DevicePathField = DataOffsetField->Next;
   1277      1.1.1.16  christos 
   1278      1.1.1.16  christos             /* Compute the size of the input ASCII string as a unicode string (*2 + 2) */
   1279      1.1.1.16  christos 
   1280      1.1.1.16  christos             DevicePathField->StringLength = (strlen ((const char *) DevicePathField->Value) * 2) + 2;
   1281      1.1.1.16  christos             TableOffset += DevicePathField->StringLength;
   1282      1.1.1.16  christos 
   1283      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "3 Offset: %X, Length: %X devicepathLength: %X\n",
   1284      1.1.1.16  christos                 TableOffset, Subtable->Length, DevicePathField->StringLength);
   1285      1.1.1.16  christos 
   1286      1.1.1.16  christos             /* Set the DataOffsetField to the current TableOffset */
   1287      1.1.1.16  christos             /* Must set the DataOffsetField here (not later) */
   1288      1.1.1.16  christos 
   1289      1.1.1.16  christos             if (DataOffsetValue != 0)
   1290      1.1.1.16  christos             {
   1291      1.1.1.16  christos                 snprintf (DataOffsetField->Value, Subtable->Length, "%X", TableOffset);
   1292      1.1.1.16  christos             }
   1293      1.1.1.16  christos 
   1294      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "4 Offset: %X, Length: %X\n", TableOffset, Subtable->Length);
   1295      1.1.1.16  christos 
   1296      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "5 TableOffset: %X, DataOffsetField->StringLength: "
   1297      1.1.1.16  christos                 "%X DevicePathField Length: %X DevicePathField->Value: %s, DataOffsetField->Value: %s DataOffsetField->ByteOffset %X\n",
   1298      1.1.1.16  christos                 TableOffset, DataOffsetField->StringLength, DevicePathField->StringLength,
   1299      1.1.1.16  christos                 DevicePathField->Value, DataOffsetField->Value, DataOffsetField->ByteOffset);
   1300      1.1.1.16  christos 
   1301      1.1.1.16  christos             /* Compile the middle portion of the Health Data Record */
   1302      1.1.1.16  christos 
   1303      1.1.1.11  christos             Info = AcpiDmTableInfoPhat1;
   1304      1.1.1.11  christos             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
   1305      1.1.1.11  christos             break;
   1306      1.1.1.11  christos 
   1307      1.1.1.11  christos         default:
   1308      1.1.1.11  christos 
   1309      1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
   1310      1.1.1.11  christos             return (AE_ERROR);
   1311      1.1.1.11  christos         }
   1312      1.1.1.11  christos 
   1313      1.1.1.16  christos         /* Compile either the Version Data or the Health Data */
   1314      1.1.1.16  christos 
   1315      1.1.1.11  christos         Status = DtCompileTable (PFieldList, Info, &Subtable);
   1316      1.1.1.11  christos         if (ACPI_FAILURE (Status))
   1317      1.1.1.11  christos         {
   1318      1.1.1.11  christos             return (Status);
   1319      1.1.1.11  christos         }
   1320      1.1.1.11  christos 
   1321      1.1.1.16  christos         DbgPrint (ASL_DEBUG_OUTPUT, "6 Offset: %X, Name: \"%s\" SubtableLength: %X\n",
   1322      1.1.1.16  christos             TableOffset /* - StartTableOffset*/, (*PFieldList)->Name, Subtable->Length);
   1323      1.1.1.16  christos 
   1324      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   1325      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   1326      1.1.1.11  christos 
   1327      1.1.1.11  christos         switch (PhatHeader->Type)
   1328      1.1.1.11  christos         {
   1329      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1330      1.1.1.11  christos 
   1331      1.1.1.11  christos             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
   1332      1.1.1.11  christos                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
   1333      1.1.1.11  christos             RecordCount = VersionData->ElementCount;
   1334      1.1.1.11  christos 
   1335      1.1.1.16  christos             /* Compile all of the Version Elements */
   1336      1.1.1.16  christos 
   1337      1.1.1.11  christos             while (RecordCount)
   1338      1.1.1.11  christos             {
   1339      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
   1340      1.1.1.11  christos                     &Subtable);
   1341      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   1342      1.1.1.11  christos                 {
   1343      1.1.1.11  christos                     return (Status);
   1344      1.1.1.11  christos                 }
   1345      1.1.1.16  christos 
   1346      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   1347      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   1348      1.1.1.11  christos 
   1349      1.1.1.16  christos                 TableOffset += Subtable->Length;
   1350      1.1.1.11  christos                 RecordCount--;
   1351      1.1.1.11  christos                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
   1352      1.1.1.11  christos             }
   1353      1.1.1.16  christos 
   1354      1.1.1.16  christos             DtPopSubtable ();
   1355      1.1.1.11  christos             break;
   1356      1.1.1.11  christos 
   1357      1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1358      1.1.1.11  christos 
   1359      1.1.1.16  christos             /* Compile the Device Path */
   1360      1.1.1.16  christos 
   1361      1.1.1.16  christos             DeviceDataLength = Subtable->Length;
   1362      1.1.1.16  christos             TableOffset += Subtable->Length;
   1363      1.1.1.16  christos 
   1364      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "7 Device Path Length: %X FieldName: \"%s\" FieldLength: "
   1365      1.1.1.16  christos                 "%s FieldValue: %s SubtableLength: %X TableOffset: %X\n", DeviceDataLength,
   1366      1.1.1.16  christos                 (*PFieldList)->Name, DataOffsetField->Value, (*PFieldList)->Value,
   1367      1.1.1.16  christos                 Subtable->Length, TableOffset);
   1368      1.1.1.11  christos 
   1369      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
   1370      1.1.1.11  christos             if (ACPI_FAILURE (Status))
   1371      1.1.1.11  christos             {
   1372      1.1.1.11  christos                 return (Status);
   1373      1.1.1.11  christos             }
   1374      1.1.1.11  christos             ParentTable = DtPeekSubtable ();
   1375      1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
   1376      1.1.1.11  christos 
   1377      1.1.1.16  christos             /* *PFieldList will be null if previous field was at the end-of-ParseTree (EOF) */
   1378      1.1.1.16  christos 
   1379      1.1.1.16  christos             if (!*PFieldList)
   1380      1.1.1.16  christos             {
   1381      1.1.1.16  christos                 DbgPrint (ASL_DEBUG_OUTPUT, "8 Exit on end-of-ParseTree\n");
   1382      1.1.1.16  christos                 return (AE_OK);
   1383      1.1.1.16  christos             }
   1384      1.1.1.16  christos 
   1385      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "9 Device Data Length: %X FieldName: \"%s"
   1386      1.1.1.16  christos                 " TableOffset: %X FieldLength: %X Field Value: %s SubtableLength: %X\n",
   1387      1.1.1.16  christos                 DeviceDataLength, (*PFieldList)->Name, TableOffset,
   1388      1.1.1.16  christos                 (*PFieldList)->StringLength, (*PFieldList)->Value, Subtable->Length);
   1389      1.1.1.16  christos 
   1390      1.1.1.11  christos             PhatHeader->Length += (UINT16) Subtable->Length;
   1391      1.1.1.11  christos 
   1392      1.1.1.16  christos             /* Convert DataOffsetField->Value (a hex char * string) to an integer value */
   1393      1.1.1.11  christos 
   1394      1.1.1.16  christos             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
   1395      1.1.1.16  christos 
   1396      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "10 Device-Specific Offset: %X Table Offset: %X\n",
   1397      1.1.1.16  christos                 DataOffsetValue, TableOffset);
   1398      1.1.1.16  christos             if (DataOffsetValue != 0)
   1399      1.1.1.11  christos             {
   1400      1.1.1.16  christos                 /* Compile Device-Specific Data - only if the Data Offset is non-zero */
   1401      1.1.1.16  christos 
   1402      1.1.1.16  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
   1403      1.1.1.16  christos                 if (ACPI_FAILURE (Status))
   1404      1.1.1.16  christos                 {
   1405      1.1.1.16  christos                     return (Status);
   1406      1.1.1.16  christos                 }
   1407      1.1.1.16  christos 
   1408      1.1.1.16  christos                 DbgPrint (ASL_DEBUG_OUTPUT, "11 Subtable: %p Table Offset: %X\n",
   1409      1.1.1.16  christos                     Subtable, TableOffset);
   1410      1.1.1.16  christos                 if (Subtable)
   1411      1.1.1.16  christos                 {
   1412      1.1.1.16  christos                     DbgPrint (ASL_DEBUG_OUTPUT, "12 Device Specific Offset: "
   1413      1.1.1.16  christos                         "%X FieldName \"%s\" SubtableLength %X\n",
   1414      1.1.1.16  christos                         DeviceDataLength, DataOffsetField->Name, Subtable->Length);
   1415      1.1.1.16  christos 
   1416      1.1.1.16  christos                     DeviceDataLength += Subtable->Length;
   1417      1.1.1.16  christos 
   1418      1.1.1.16  christos                     ParentTable = DtPeekSubtable ();
   1419      1.1.1.16  christos                     DtInsertSubtable (ParentTable, Subtable);
   1420      1.1.1.16  christos 
   1421      1.1.1.16  christos                     PhatHeader->Length += (UINT16) Subtable->Length;
   1422      1.1.1.16  christos                 }
   1423      1.1.1.11  christos             }
   1424      1.1.1.11  christos 
   1425      1.1.1.16  christos             DtPopSubtable ();
   1426      1.1.1.11  christos 
   1427      1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "13 FieldName: \"%s\" FieldLength: %X Field Value: %s\n",
   1428      1.1.1.16  christos                 DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
   1429      1.1.1.11  christos             break;
   1430      1.1.1.11  christos 
   1431      1.1.1.11  christos         default:
   1432      1.1.1.11  christos 
   1433      1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
   1434      1.1.1.11  christos             return (AE_ERROR);
   1435      1.1.1.11  christos         }
   1436      1.1.1.11  christos     }
   1437      1.1.1.11  christos 
   1438      1.1.1.11  christos     return (Status);
   1439      1.1.1.11  christos }
   1440      1.1.1.11  christos 
   1441      1.1.1.11  christos 
   1442      1.1.1.11  christos /******************************************************************************
   1443      1.1.1.11  christos  *
   1444           1.1  christos  * FUNCTION:    DtCompilePmtt
   1445           1.1  christos  *
   1446           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1447           1.1  christos  *
   1448           1.1  christos  * RETURN:      Status
   1449           1.1  christos  *
   1450           1.1  christos  * DESCRIPTION: Compile PMTT.
   1451           1.1  christos  *
   1452           1.1  christos  *****************************************************************************/
   1453           1.1  christos 
   1454           1.1  christos ACPI_STATUS
   1455           1.1  christos DtCompilePmtt (
   1456           1.1  christos     void                    **List)
   1457           1.1  christos {
   1458           1.1  christos     ACPI_STATUS             Status;
   1459           1.1  christos     DT_SUBTABLE             *Subtable;
   1460           1.1  christos     DT_SUBTABLE             *ParentTable;
   1461           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1462           1.1  christos     DT_FIELD                *SubtableStart;
   1463      1.1.1.11  christos     UINT16                  Type;
   1464           1.1  christos 
   1465           1.1  christos 
   1466           1.1  christos     /* Main table */
   1467           1.1  christos 
   1468       1.1.1.6  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable);
   1469           1.1  christos     if (ACPI_FAILURE (Status))
   1470           1.1  christos     {
   1471           1.1  christos         return (Status);
   1472           1.1  christos     }
   1473           1.1  christos 
   1474           1.1  christos     ParentTable = DtPeekSubtable ();
   1475           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1476           1.1  christos     DtPushSubtable (Subtable);
   1477           1.1  christos 
   1478      1.1.1.11  christos     /* Subtables */
   1479      1.1.1.11  christos 
   1480           1.1  christos     while (*PFieldList)
   1481           1.1  christos     {
   1482           1.1  christos         SubtableStart = *PFieldList;
   1483      1.1.1.11  christos         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
   1484           1.1  christos 
   1485      1.1.1.11  christos         switch (Type)
   1486           1.1  christos         {
   1487           1.1  christos         case ACPI_PMTT_TYPE_SOCKET:
   1488           1.1  christos 
   1489           1.1  christos             /* Subtable: Socket Structure */
   1490           1.1  christos 
   1491      1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
   1492      1.1.1.11  christos 
   1493           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
   1494       1.1.1.6  christos                 &Subtable);
   1495           1.1  christos             if (ACPI_FAILURE (Status))
   1496           1.1  christos             {
   1497           1.1  christos                 return (Status);
   1498           1.1  christos             }
   1499           1.1  christos 
   1500           1.1  christos             break;
   1501           1.1  christos 
   1502           1.1  christos         case ACPI_PMTT_TYPE_CONTROLLER:
   1503           1.1  christos 
   1504           1.1  christos             /* Subtable: Memory Controller Structure */
   1505           1.1  christos 
   1506      1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
   1507      1.1.1.11  christos 
   1508           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
   1509       1.1.1.6  christos                 &Subtable);
   1510           1.1  christos             if (ACPI_FAILURE (Status))
   1511           1.1  christos             {
   1512           1.1  christos                 return (Status);
   1513           1.1  christos             }
   1514           1.1  christos 
   1515      1.1.1.11  christos             break;
   1516           1.1  christos 
   1517      1.1.1.11  christos         case ACPI_PMTT_TYPE_DIMM:
   1518           1.1  christos 
   1519      1.1.1.11  christos             /* Subtable: Physical Component (DIMM) Structure */
   1520           1.1  christos 
   1521      1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
   1522      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
   1523      1.1.1.11  christos                 &Subtable);
   1524      1.1.1.11  christos             if (ACPI_FAILURE (Status))
   1525      1.1.1.11  christos             {
   1526      1.1.1.11  christos                 return (Status);
   1527           1.1  christos             }
   1528      1.1.1.11  christos 
   1529           1.1  christos             break;
   1530           1.1  christos 
   1531      1.1.1.11  christos         case ACPI_PMTT_TYPE_VENDOR:
   1532           1.1  christos 
   1533      1.1.1.11  christos             /* Subtable: Vendor-specific Structure */
   1534           1.1  christos 
   1535      1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
   1536      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
   1537       1.1.1.6  christos                 &Subtable);
   1538           1.1  christos             if (ACPI_FAILURE (Status))
   1539           1.1  christos             {
   1540           1.1  christos                 return (Status);
   1541           1.1  christos             }
   1542           1.1  christos 
   1543           1.1  christos             break;
   1544           1.1  christos 
   1545           1.1  christos         default:
   1546           1.1  christos 
   1547           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
   1548           1.1  christos             return (AE_ERROR);
   1549           1.1  christos         }
   1550      1.1.1.11  christos 
   1551      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   1552           1.1  christos     }
   1553           1.1  christos 
   1554           1.1  christos     return (Status);
   1555           1.1  christos }
   1556           1.1  christos 
   1557           1.1  christos 
   1558           1.1  christos /******************************************************************************
   1559           1.1  christos  *
   1560       1.1.1.4  christos  * FUNCTION:    DtCompilePptt
   1561       1.1.1.4  christos  *
   1562       1.1.1.4  christos  * PARAMETERS:  List                - Current field list pointer
   1563       1.1.1.4  christos  *
   1564       1.1.1.4  christos  * RETURN:      Status
   1565       1.1.1.4  christos  *
   1566       1.1.1.4  christos  * DESCRIPTION: Compile PPTT.
   1567       1.1.1.4  christos  *
   1568       1.1.1.4  christos  *****************************************************************************/
   1569       1.1.1.4  christos 
   1570       1.1.1.4  christos ACPI_STATUS
   1571       1.1.1.4  christos DtCompilePptt (
   1572       1.1.1.4  christos     void                    **List)
   1573       1.1.1.4  christos {
   1574       1.1.1.4  christos     ACPI_STATUS             Status;
   1575       1.1.1.4  christos     ACPI_SUBTABLE_HEADER    *PpttHeader;
   1576       1.1.1.4  christos     ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
   1577       1.1.1.4  christos     DT_SUBTABLE             *Subtable;
   1578       1.1.1.4  christos     DT_SUBTABLE             *ParentTable;
   1579       1.1.1.4  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1580       1.1.1.4  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1581       1.1.1.4  christos     DT_FIELD                *SubtableStart;
   1582      1.1.1.11  christos     ACPI_TABLE_HEADER       *PpttAcpiHeader;
   1583       1.1.1.4  christos 
   1584       1.1.1.4  christos 
   1585       1.1.1.4  christos     ParentTable = DtPeekSubtable ();
   1586       1.1.1.4  christos     while (*PFieldList)
   1587       1.1.1.4  christos     {
   1588       1.1.1.4  christos         SubtableStart = *PFieldList;
   1589       1.1.1.4  christos 
   1590       1.1.1.4  christos         /* Compile PPTT subtable header */
   1591       1.1.1.4  christos 
   1592       1.1.1.4  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
   1593       1.1.1.6  christos             &Subtable);
   1594       1.1.1.4  christos         if (ACPI_FAILURE (Status))
   1595       1.1.1.4  christos         {
   1596       1.1.1.4  christos             return (Status);
   1597       1.1.1.4  christos         }
   1598       1.1.1.4  christos         DtInsertSubtable (ParentTable, Subtable);
   1599       1.1.1.4  christos         PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1600       1.1.1.4  christos         PpttHeader->Length = (UINT8)(Subtable->Length);
   1601       1.1.1.4  christos 
   1602       1.1.1.4  christos         switch (PpttHeader->Type)
   1603       1.1.1.4  christos         {
   1604       1.1.1.4  christos         case ACPI_PPTT_TYPE_PROCESSOR:
   1605       1.1.1.4  christos 
   1606       1.1.1.4  christos             InfoTable = AcpiDmTableInfoPptt0;
   1607       1.1.1.4  christos             break;
   1608       1.1.1.4  christos 
   1609       1.1.1.4  christos         case ACPI_PPTT_TYPE_CACHE:
   1610       1.1.1.4  christos 
   1611       1.1.1.4  christos             InfoTable = AcpiDmTableInfoPptt1;
   1612       1.1.1.4  christos             break;
   1613       1.1.1.4  christos 
   1614       1.1.1.4  christos         case ACPI_PPTT_TYPE_ID:
   1615       1.1.1.4  christos 
   1616       1.1.1.4  christos             InfoTable = AcpiDmTableInfoPptt2;
   1617       1.1.1.4  christos             break;
   1618       1.1.1.4  christos 
   1619       1.1.1.4  christos         default:
   1620       1.1.1.4  christos 
   1621       1.1.1.4  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
   1622       1.1.1.4  christos             return (AE_ERROR);
   1623       1.1.1.4  christos         }
   1624       1.1.1.4  christos 
   1625       1.1.1.4  christos         /* Compile PPTT subtable body */
   1626       1.1.1.4  christos 
   1627       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1628       1.1.1.4  christos         if (ACPI_FAILURE (Status))
   1629       1.1.1.4  christos         {
   1630       1.1.1.4  christos             return (Status);
   1631       1.1.1.4  christos         }
   1632       1.1.1.4  christos         DtInsertSubtable (ParentTable, Subtable);
   1633       1.1.1.4  christos         PpttHeader->Length += (UINT8)(Subtable->Length);
   1634       1.1.1.4  christos 
   1635      1.1.1.17  christos         /* Compile PPTT subtable additional */
   1636       1.1.1.4  christos 
   1637       1.1.1.4  christos         switch (PpttHeader->Type)
   1638       1.1.1.4  christos         {
   1639       1.1.1.4  christos         case ACPI_PPTT_TYPE_PROCESSOR:
   1640       1.1.1.4  christos 
   1641       1.1.1.4  christos             PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
   1642       1.1.1.4  christos                 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
   1643       1.1.1.4  christos             if (PpttProcessor)
   1644       1.1.1.4  christos             {
   1645       1.1.1.4  christos                 /* Compile initiator proximity domain list */
   1646       1.1.1.4  christos 
   1647       1.1.1.4  christos                 PpttProcessor->NumberOfPrivResources = 0;
   1648       1.1.1.4  christos                 while (*PFieldList)
   1649       1.1.1.4  christos                 {
   1650       1.1.1.4  christos                     Status = DtCompileTable (PFieldList,
   1651       1.1.1.6  christos                         AcpiDmTableInfoPptt0a, &Subtable);
   1652       1.1.1.4  christos                     if (ACPI_FAILURE (Status))
   1653       1.1.1.4  christos                     {
   1654       1.1.1.4  christos                         return (Status);
   1655       1.1.1.4  christos                     }
   1656       1.1.1.4  christos                     if (!Subtable)
   1657       1.1.1.4  christos                     {
   1658       1.1.1.4  christos                         break;
   1659       1.1.1.4  christos                     }
   1660       1.1.1.4  christos 
   1661       1.1.1.4  christos                     DtInsertSubtable (ParentTable, Subtable);
   1662       1.1.1.4  christos                     PpttHeader->Length += (UINT8)(Subtable->Length);
   1663       1.1.1.4  christos                     PpttProcessor->NumberOfPrivResources++;
   1664       1.1.1.4  christos                 }
   1665       1.1.1.4  christos             }
   1666       1.1.1.4  christos             break;
   1667       1.1.1.4  christos 
   1668      1.1.1.11  christos         case ACPI_PPTT_TYPE_CACHE:
   1669      1.1.1.11  christos 
   1670      1.1.1.11  christos             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
   1671      1.1.1.11  christos                 AslGbl_RootTable->Buffer);
   1672      1.1.1.11  christos             if (PpttAcpiHeader->Revision < 3)
   1673      1.1.1.11  christos             {
   1674      1.1.1.11  christos                 break;
   1675      1.1.1.11  christos             }
   1676      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
   1677      1.1.1.11  christos                 &Subtable);
   1678      1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
   1679      1.1.1.11  christos             PpttHeader->Length += (UINT8)(Subtable->Length);
   1680      1.1.1.11  christos             break;
   1681      1.1.1.11  christos 
   1682       1.1.1.4  christos         default:
   1683       1.1.1.4  christos 
   1684       1.1.1.4  christos             break;
   1685       1.1.1.4  christos         }
   1686       1.1.1.4  christos     }
   1687       1.1.1.4  christos 
   1688       1.1.1.4  christos     return (AE_OK);
   1689       1.1.1.4  christos }
   1690       1.1.1.4  christos 
   1691       1.1.1.4  christos 
   1692       1.1.1.4  christos /******************************************************************************
   1693       1.1.1.4  christos  *
   1694      1.1.1.12  christos  * FUNCTION:    DtCompilePrmt
   1695      1.1.1.12  christos  *
   1696      1.1.1.12  christos  * PARAMETERS:  List                - Current field list pointer
   1697      1.1.1.12  christos  *
   1698      1.1.1.12  christos  * RETURN:      Status
   1699      1.1.1.12  christos  *
   1700      1.1.1.12  christos  * DESCRIPTION: Compile PRMT.
   1701      1.1.1.12  christos  *
   1702      1.1.1.12  christos  *****************************************************************************/
   1703      1.1.1.12  christos 
   1704      1.1.1.12  christos ACPI_STATUS
   1705      1.1.1.12  christos DtCompilePrmt (
   1706      1.1.1.12  christos     void                    **List)
   1707      1.1.1.12  christos {
   1708      1.1.1.12  christos     ACPI_STATUS             Status;
   1709      1.1.1.12  christos     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
   1710      1.1.1.12  christos     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
   1711      1.1.1.12  christos     DT_SUBTABLE             *Subtable;
   1712      1.1.1.12  christos     DT_SUBTABLE             *ParentTable;
   1713      1.1.1.12  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1714      1.1.1.12  christos     UINT32                  i, j;
   1715      1.1.1.12  christos 
   1716      1.1.1.12  christos     ParentTable = DtPeekSubtable ();
   1717      1.1.1.12  christos 
   1718      1.1.1.12  christos     /* Compile PRMT subtable header */
   1719      1.1.1.12  christos 
   1720      1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr,
   1721      1.1.1.12  christos         &Subtable);
   1722      1.1.1.12  christos     if (ACPI_FAILURE (Status))
   1723      1.1.1.12  christos     {
   1724      1.1.1.12  christos         return (Status);
   1725      1.1.1.12  christos     }
   1726      1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   1727      1.1.1.12  christos     PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer);
   1728      1.1.1.12  christos 
   1729      1.1.1.12  christos     for (i = 0; i < PrmtHeader->ModuleInfoCount; i++)
   1730      1.1.1.12  christos     {
   1731      1.1.1.12  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule,
   1732      1.1.1.12  christos             &Subtable);
   1733      1.1.1.12  christos         if (ACPI_FAILURE (Status))
   1734      1.1.1.12  christos         {
   1735      1.1.1.12  christos             return (Status);
   1736      1.1.1.12  christos         }
   1737      1.1.1.12  christos         DtInsertSubtable (ParentTable, Subtable);
   1738      1.1.1.12  christos         PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer);
   1739      1.1.1.12  christos 
   1740      1.1.1.12  christos         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++)
   1741      1.1.1.12  christos         {
   1742      1.1.1.12  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler,
   1743      1.1.1.12  christos                 &Subtable);
   1744      1.1.1.12  christos             if (ACPI_FAILURE (Status))
   1745      1.1.1.12  christos             {
   1746      1.1.1.12  christos                 return (Status);
   1747      1.1.1.12  christos             }
   1748      1.1.1.12  christos             DtInsertSubtable (ParentTable, Subtable);
   1749      1.1.1.12  christos         }
   1750      1.1.1.12  christos     }
   1751      1.1.1.12  christos 
   1752      1.1.1.12  christos     return (AE_OK);
   1753      1.1.1.12  christos }
   1754      1.1.1.12  christos 
   1755      1.1.1.12  christos 
   1756      1.1.1.12  christos /******************************************************************************
   1757      1.1.1.12  christos  *
   1758  1.1.1.17.6.1  perseant  * FUNCTION:    DtCompileRas2
   1759  1.1.1.17.6.1  perseant  *
   1760  1.1.1.17.6.1  perseant  * PARAMETERS:  List                - Current field list pointer
   1761  1.1.1.17.6.1  perseant  *
   1762  1.1.1.17.6.1  perseant  * RETURN:      Status
   1763  1.1.1.17.6.1  perseant  *
   1764  1.1.1.17.6.1  perseant  * DESCRIPTION: Compile RAS2.
   1765  1.1.1.17.6.1  perseant  *
   1766  1.1.1.17.6.1  perseant  *****************************************************************************/
   1767  1.1.1.17.6.1  perseant 
   1768  1.1.1.17.6.1  perseant ACPI_STATUS
   1769  1.1.1.17.6.1  perseant DtCompileRas2 (
   1770  1.1.1.17.6.1  perseant     void                    **List)
   1771  1.1.1.17.6.1  perseant {
   1772  1.1.1.17.6.1  perseant     ACPI_STATUS             Status;
   1773  1.1.1.17.6.1  perseant     DT_SUBTABLE             *Subtable;
   1774  1.1.1.17.6.1  perseant     DT_SUBTABLE             *ParentTable;
   1775  1.1.1.17.6.1  perseant     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1776  1.1.1.17.6.1  perseant     ACPI_TABLE_RAS2         *Ras2Header;
   1777  1.1.1.17.6.1  perseant     UINT32                  Count = 0;
   1778  1.1.1.17.6.1  perseant 
   1779  1.1.1.17.6.1  perseant 
   1780  1.1.1.17.6.1  perseant     /* Main table */
   1781  1.1.1.17.6.1  perseant 
   1782  1.1.1.17.6.1  perseant     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2, &Subtable);
   1783  1.1.1.17.6.1  perseant     if (ACPI_FAILURE (Status))
   1784  1.1.1.17.6.1  perseant     {
   1785  1.1.1.17.6.1  perseant         return (Status);
   1786  1.1.1.17.6.1  perseant     }
   1787  1.1.1.17.6.1  perseant 
   1788  1.1.1.17.6.1  perseant     ParentTable = DtPeekSubtable ();
   1789  1.1.1.17.6.1  perseant     DtInsertSubtable (ParentTable, Subtable);
   1790  1.1.1.17.6.1  perseant 
   1791  1.1.1.17.6.1  perseant     Ras2Header = ACPI_CAST_PTR (ACPI_TABLE_RAS2, ParentTable->Buffer);
   1792  1.1.1.17.6.1  perseant 
   1793  1.1.1.17.6.1  perseant     /* There is only one type of subtable at this time, no need to decode */
   1794  1.1.1.17.6.1  perseant 
   1795  1.1.1.17.6.1  perseant     while (*PFieldList)
   1796  1.1.1.17.6.1  perseant     {
   1797  1.1.1.17.6.1  perseant         /* List of RAS2 PCC descriptors, each 8 bytes */
   1798  1.1.1.17.6.1  perseant 
   1799  1.1.1.17.6.1  perseant         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2PccDesc,
   1800  1.1.1.17.6.1  perseant             &Subtable);
   1801  1.1.1.17.6.1  perseant         if (ACPI_FAILURE (Status))
   1802  1.1.1.17.6.1  perseant         {
   1803  1.1.1.17.6.1  perseant             return (Status);
   1804  1.1.1.17.6.1  perseant         }
   1805  1.1.1.17.6.1  perseant 
   1806  1.1.1.17.6.1  perseant         DtInsertSubtable (ParentTable, Subtable);
   1807  1.1.1.17.6.1  perseant         Count++;
   1808  1.1.1.17.6.1  perseant     }
   1809  1.1.1.17.6.1  perseant 
   1810  1.1.1.17.6.1  perseant     Ras2Header->NumPccDescs = (UINT8) Count;
   1811  1.1.1.17.6.1  perseant     return (AE_OK);
   1812  1.1.1.17.6.1  perseant }
   1813  1.1.1.17.6.1  perseant 
   1814  1.1.1.17.6.1  perseant 
   1815  1.1.1.17.6.1  perseant /******************************************************************************
   1816  1.1.1.17.6.1  perseant  *
   1817      1.1.1.12  christos  * FUNCTION:    DtCompileRgrt
   1818      1.1.1.12  christos  *
   1819      1.1.1.12  christos  * PARAMETERS:  List                - Current field list pointer
   1820      1.1.1.12  christos  *
   1821      1.1.1.12  christos  * RETURN:      Status
   1822      1.1.1.12  christos  *
   1823      1.1.1.12  christos  * DESCRIPTION: Compile RGRT.
   1824      1.1.1.12  christos  *
   1825      1.1.1.12  christos  *****************************************************************************/
   1826      1.1.1.12  christos 
   1827      1.1.1.12  christos ACPI_STATUS
   1828      1.1.1.12  christos DtCompileRgrt (
   1829      1.1.1.12  christos     void                    **List)
   1830      1.1.1.12  christos {
   1831      1.1.1.12  christos     ACPI_STATUS             Status;
   1832      1.1.1.12  christos     DT_SUBTABLE             *Subtable;
   1833      1.1.1.12  christos     DT_SUBTABLE             *ParentTable;
   1834      1.1.1.12  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1835      1.1.1.12  christos 
   1836      1.1.1.12  christos 
   1837      1.1.1.12  christos     /* Compile the main table */
   1838      1.1.1.12  christos 
   1839      1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt,
   1840      1.1.1.12  christos         &Subtable);
   1841      1.1.1.12  christos     if (ACPI_FAILURE (Status))
   1842      1.1.1.12  christos     {
   1843      1.1.1.12  christos         return (Status);
   1844      1.1.1.12  christos     }
   1845      1.1.1.12  christos 
   1846      1.1.1.12  christos     ParentTable = DtPeekSubtable ();
   1847      1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   1848      1.1.1.12  christos 
   1849      1.1.1.12  christos     /* Compile the "Subtable" -- actually just the binary (PNG) image */
   1850      1.1.1.12  christos 
   1851      1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0,
   1852      1.1.1.12  christos         &Subtable);
   1853      1.1.1.12  christos     if (ACPI_FAILURE (Status))
   1854      1.1.1.12  christos     {
   1855      1.1.1.12  christos         return (Status);
   1856      1.1.1.12  christos     }
   1857      1.1.1.12  christos 
   1858      1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   1859      1.1.1.12  christos     return (AE_OK);
   1860      1.1.1.12  christos }
   1861      1.1.1.12  christos 
   1862      1.1.1.12  christos 
   1863      1.1.1.12  christos /******************************************************************************
   1864      1.1.1.12  christos  *
   1865      1.1.1.17  christos  * FUNCTION:    DtCompileRhct
   1866      1.1.1.17  christos  *
   1867      1.1.1.17  christos  * PARAMETERS:  List                - Current field list pointer
   1868      1.1.1.17  christos  *
   1869      1.1.1.17  christos  * RETURN:      Status
   1870      1.1.1.17  christos  *
   1871      1.1.1.17  christos  * DESCRIPTION: Compile RHCT.
   1872      1.1.1.17  christos  *
   1873      1.1.1.17  christos  *****************************************************************************/
   1874      1.1.1.17  christos 
   1875      1.1.1.17  christos ACPI_STATUS
   1876      1.1.1.17  christos DtCompileRhct (
   1877      1.1.1.17  christos     void                    **List)
   1878      1.1.1.17  christos {
   1879      1.1.1.17  christos     ACPI_STATUS             Status;
   1880      1.1.1.17  christos     ACPI_RHCT_NODE_HEADER   *RhctHeader;
   1881      1.1.1.17  christos     ACPI_RHCT_HART_INFO     *RhctHartInfo = NULL;
   1882      1.1.1.17  christos     DT_SUBTABLE             *Subtable;
   1883      1.1.1.17  christos     DT_SUBTABLE             *ParentTable;
   1884      1.1.1.17  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1885      1.1.1.17  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1886      1.1.1.17  christos     DT_FIELD                *SubtableStart;
   1887      1.1.1.17  christos 
   1888      1.1.1.17  christos 
   1889      1.1.1.17  christos     /* Compile the main table */
   1890      1.1.1.17  christos 
   1891      1.1.1.17  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhct,
   1892      1.1.1.17  christos         &Subtable);
   1893      1.1.1.17  christos     if (ACPI_FAILURE (Status))
   1894      1.1.1.17  christos     {
   1895      1.1.1.17  christos         return (Status);
   1896      1.1.1.17  christos     }
   1897      1.1.1.17  christos 
   1898      1.1.1.17  christos     ParentTable = DtPeekSubtable ();
   1899      1.1.1.17  christos     while (*PFieldList)
   1900      1.1.1.17  christos     {
   1901      1.1.1.17  christos         SubtableStart = *PFieldList;
   1902      1.1.1.17  christos 
   1903      1.1.1.17  christos         /* Compile RHCT subtable header */
   1904      1.1.1.17  christos 
   1905      1.1.1.17  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhctNodeHdr,
   1906      1.1.1.17  christos             &Subtable);
   1907      1.1.1.17  christos         if (ACPI_FAILURE (Status))
   1908      1.1.1.17  christos         {
   1909      1.1.1.17  christos             return (Status);
   1910      1.1.1.17  christos         }
   1911      1.1.1.17  christos         DtInsertSubtable (ParentTable, Subtable);
   1912      1.1.1.17  christos         RhctHeader = ACPI_CAST_PTR (ACPI_RHCT_NODE_HEADER, Subtable->Buffer);
   1913      1.1.1.17  christos         RhctHeader->Length = (UINT16)(Subtable->Length);
   1914      1.1.1.17  christos 
   1915      1.1.1.17  christos         switch (RhctHeader->Type)
   1916      1.1.1.17  christos         {
   1917      1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_ISA_STRING:
   1918      1.1.1.17  christos 
   1919      1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctIsa1;
   1920      1.1.1.17  christos             break;
   1921      1.1.1.17  christos 
   1922      1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_HART_INFO:
   1923      1.1.1.17  christos 
   1924      1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctHartInfo1;
   1925      1.1.1.17  christos             break;
   1926      1.1.1.17  christos 
   1927      1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_CMO:
   1928      1.1.1.17  christos 
   1929      1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctCmo1;
   1930      1.1.1.17  christos             break;
   1931      1.1.1.17  christos 
   1932      1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_MMU:
   1933      1.1.1.17  christos 
   1934      1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctMmu1;
   1935      1.1.1.17  christos             break;
   1936      1.1.1.17  christos 
   1937      1.1.1.17  christos         default:
   1938      1.1.1.17  christos 
   1939      1.1.1.17  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "RHCT");
   1940      1.1.1.17  christos             return (AE_ERROR);
   1941      1.1.1.17  christos         }
   1942      1.1.1.17  christos 
   1943      1.1.1.17  christos         /* Compile RHCT subtable body */
   1944      1.1.1.17  christos 
   1945      1.1.1.17  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1946      1.1.1.17  christos         if (ACPI_FAILURE (Status))
   1947      1.1.1.17  christos         {
   1948      1.1.1.17  christos             return (Status);
   1949      1.1.1.17  christos         }
   1950      1.1.1.17  christos         DtInsertSubtable (ParentTable, Subtable);
   1951      1.1.1.17  christos         RhctHeader->Length += (UINT16)(Subtable->Length);
   1952      1.1.1.17  christos 
   1953      1.1.1.17  christos         /* Compile RHCT subtable additionals */
   1954      1.1.1.17  christos 
   1955      1.1.1.17  christos         switch (RhctHeader->Type)
   1956      1.1.1.17  christos         {
   1957      1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_HART_INFO:
   1958      1.1.1.17  christos 
   1959      1.1.1.17  christos             RhctHartInfo = ACPI_SUB_PTR (ACPI_RHCT_HART_INFO,
   1960      1.1.1.17  christos                 Subtable->Buffer, sizeof (ACPI_RHCT_NODE_HEADER));
   1961      1.1.1.17  christos             if (RhctHartInfo)
   1962      1.1.1.17  christos             {
   1963      1.1.1.17  christos 
   1964      1.1.1.17  christos                 RhctHartInfo->NumOffsets = 0;
   1965      1.1.1.17  christos                 while (*PFieldList)
   1966      1.1.1.17  christos                 {
   1967      1.1.1.17  christos                     Status = DtCompileTable (PFieldList,
   1968      1.1.1.17  christos                         AcpiDmTableInfoRhctHartInfo2, &Subtable);
   1969      1.1.1.17  christos                     if (ACPI_FAILURE (Status))
   1970      1.1.1.17  christos                     {
   1971      1.1.1.17  christos                         return (Status);
   1972      1.1.1.17  christos                     }
   1973      1.1.1.17  christos                     if (!Subtable)
   1974      1.1.1.17  christos                     {
   1975      1.1.1.17  christos                         break;
   1976      1.1.1.17  christos                     }
   1977      1.1.1.17  christos 
   1978      1.1.1.17  christos                     DtInsertSubtable (ParentTable, Subtable);
   1979      1.1.1.17  christos                     RhctHeader->Length += (UINT16)(Subtable->Length);
   1980      1.1.1.17  christos                     RhctHartInfo->NumOffsets++;
   1981      1.1.1.17  christos                 }
   1982      1.1.1.17  christos             }
   1983      1.1.1.17  christos             break;
   1984      1.1.1.17  christos 
   1985      1.1.1.17  christos         default:
   1986      1.1.1.17  christos 
   1987      1.1.1.17  christos             break;
   1988      1.1.1.17  christos         }
   1989      1.1.1.17  christos     }
   1990      1.1.1.17  christos 
   1991      1.1.1.17  christos     return (AE_OK);
   1992      1.1.1.17  christos }
   1993      1.1.1.17  christos 
   1994      1.1.1.17  christos 
   1995      1.1.1.17  christos /******************************************************************************
   1996      1.1.1.17  christos  *
   1997           1.1  christos  * FUNCTION:    DtCompileRsdt
   1998           1.1  christos  *
   1999           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2000           1.1  christos  *
   2001           1.1  christos  * RETURN:      Status
   2002           1.1  christos  *
   2003           1.1  christos  * DESCRIPTION: Compile RSDT.
   2004           1.1  christos  *
   2005           1.1  christos  *****************************************************************************/
   2006           1.1  christos 
   2007           1.1  christos ACPI_STATUS
   2008           1.1  christos DtCompileRsdt (
   2009           1.1  christos     void                    **List)
   2010           1.1  christos {
   2011           1.1  christos     DT_SUBTABLE             *Subtable;
   2012           1.1  christos     DT_SUBTABLE             *ParentTable;
   2013           1.1  christos     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   2014           1.1  christos     UINT32                  Address;
   2015           1.1  christos 
   2016           1.1  christos 
   2017           1.1  christos     ParentTable = DtPeekSubtable ();
   2018           1.1  christos 
   2019           1.1  christos     while (FieldList)
   2020           1.1  christos     {
   2021           1.1  christos         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
   2022           1.1  christos 
   2023           1.1  christos         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
   2024           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2025           1.1  christos         FieldList = FieldList->Next;
   2026           1.1  christos     }
   2027           1.1  christos 
   2028           1.1  christos     return (AE_OK);
   2029           1.1  christos }
   2030           1.1  christos 
   2031           1.1  christos 
   2032           1.1  christos /******************************************************************************
   2033           1.1  christos  *
   2034           1.1  christos  * FUNCTION:    DtCompileS3pt
   2035           1.1  christos  *
   2036           1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2037           1.1  christos  *
   2038           1.1  christos  * RETURN:      Status
   2039           1.1  christos  *
   2040           1.1  christos  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
   2041           1.1  christos  *
   2042           1.1  christos  *****************************************************************************/
   2043           1.1  christos 
   2044           1.1  christos ACPI_STATUS
   2045           1.1  christos DtCompileS3pt (
   2046           1.1  christos     DT_FIELD                **PFieldList)
   2047           1.1  christos {
   2048           1.1  christos     ACPI_STATUS             Status;
   2049       1.1.1.2  christos     ACPI_FPDT_HEADER        *S3ptHeader;
   2050           1.1  christos     DT_SUBTABLE             *Subtable;
   2051           1.1  christos     DT_SUBTABLE             *ParentTable;
   2052           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   2053           1.1  christos     DT_FIELD                *SubtableStart;
   2054           1.1  christos 
   2055           1.1  christos 
   2056           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
   2057       1.1.1.7  christos         &AslGbl_RootTable);
   2058           1.1  christos     if (ACPI_FAILURE (Status))
   2059           1.1  christos     {
   2060           1.1  christos         return (Status);
   2061           1.1  christos     }
   2062           1.1  christos 
   2063       1.1.1.7  christos     DtPushSubtable (AslGbl_RootTable);
   2064           1.1  christos 
   2065           1.1  christos     while (*PFieldList)
   2066           1.1  christos     {
   2067           1.1  christos         SubtableStart = *PFieldList;
   2068           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
   2069       1.1.1.6  christos             &Subtable);
   2070           1.1  christos         if (ACPI_FAILURE (Status))
   2071           1.1  christos         {
   2072           1.1  christos             return (Status);
   2073           1.1  christos         }
   2074           1.1  christos 
   2075           1.1  christos         ParentTable = DtPeekSubtable ();
   2076           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2077           1.1  christos         DtPushSubtable (Subtable);
   2078           1.1  christos 
   2079       1.1.1.2  christos         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
   2080           1.1  christos 
   2081           1.1  christos         switch (S3ptHeader->Type)
   2082           1.1  christos         {
   2083           1.1  christos         case ACPI_S3PT_TYPE_RESUME:
   2084           1.1  christos 
   2085           1.1  christos             InfoTable = AcpiDmTableInfoS3pt0;
   2086           1.1  christos             break;
   2087           1.1  christos 
   2088           1.1  christos         case ACPI_S3PT_TYPE_SUSPEND:
   2089           1.1  christos 
   2090           1.1  christos             InfoTable = AcpiDmTableInfoS3pt1;
   2091           1.1  christos             break;
   2092           1.1  christos 
   2093           1.1  christos         default:
   2094           1.1  christos 
   2095           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
   2096           1.1  christos             return (AE_ERROR);
   2097           1.1  christos         }
   2098           1.1  christos 
   2099       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2100           1.1  christos         if (ACPI_FAILURE (Status))
   2101           1.1  christos         {
   2102           1.1  christos             return (Status);
   2103           1.1  christos         }
   2104           1.1  christos 
   2105           1.1  christos         ParentTable = DtPeekSubtable ();
   2106           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2107           1.1  christos         DtPopSubtable ();
   2108           1.1  christos     }
   2109           1.1  christos 
   2110           1.1  christos     return (AE_OK);
   2111           1.1  christos }
   2112           1.1  christos 
   2113           1.1  christos 
   2114           1.1  christos /******************************************************************************
   2115           1.1  christos  *
   2116       1.1.1.5  christos  * FUNCTION:    DtCompileSdev
   2117       1.1.1.5  christos  *
   2118       1.1.1.5  christos  * PARAMETERS:  List                - Current field list pointer
   2119       1.1.1.5  christos  *
   2120       1.1.1.5  christos  * RETURN:      Status
   2121       1.1.1.5  christos  *
   2122       1.1.1.5  christos  * DESCRIPTION: Compile SDEV.
   2123       1.1.1.5  christos  *
   2124       1.1.1.5  christos  *****************************************************************************/
   2125       1.1.1.5  christos 
   2126       1.1.1.5  christos ACPI_STATUS
   2127       1.1.1.5  christos DtCompileSdev (
   2128       1.1.1.5  christos     void                    **List)
   2129       1.1.1.5  christos {
   2130      1.1.1.11  christos     ACPI_STATUS                 Status;
   2131      1.1.1.11  christos     ACPI_SDEV_HEADER            *SdevHeader;
   2132      1.1.1.11  christos     ACPI_SDEV_HEADER            *SecureComponentHeader;
   2133      1.1.1.11  christos     DT_SUBTABLE                 *Subtable;
   2134      1.1.1.11  christos     DT_SUBTABLE                 *ParentTable;
   2135      1.1.1.11  christos     ACPI_DMTABLE_INFO           *InfoTable;
   2136      1.1.1.11  christos     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
   2137      1.1.1.11  christos     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
   2138      1.1.1.11  christos     DT_FIELD                    *SubtableStart;
   2139      1.1.1.11  christos     ACPI_SDEV_PCIE              *Pcie = NULL;
   2140      1.1.1.11  christos     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
   2141      1.1.1.11  christos     UINT32                      EntryCount;
   2142      1.1.1.11  christos     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
   2143      1.1.1.11  christos     UINT16                      ComponentLength = 0;
   2144       1.1.1.5  christos 
   2145       1.1.1.5  christos 
   2146       1.1.1.5  christos     /* Subtables */
   2147       1.1.1.5  christos 
   2148       1.1.1.5  christos     while (*PFieldList)
   2149       1.1.1.5  christos     {
   2150       1.1.1.5  christos         /* Compile common SDEV subtable header */
   2151       1.1.1.5  christos 
   2152       1.1.1.5  christos         SubtableStart = *PFieldList;
   2153       1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
   2154       1.1.1.6  christos             &Subtable);
   2155       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   2156       1.1.1.5  christos         {
   2157       1.1.1.5  christos             return (Status);
   2158       1.1.1.5  christos         }
   2159       1.1.1.5  christos 
   2160       1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   2161       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   2162       1.1.1.5  christos         DtPushSubtable (Subtable);
   2163       1.1.1.5  christos 
   2164       1.1.1.5  christos         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   2165       1.1.1.5  christos         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
   2166       1.1.1.5  christos 
   2167       1.1.1.5  christos         switch (SdevHeader->Type)
   2168       1.1.1.5  christos         {
   2169       1.1.1.5  christos         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2170       1.1.1.5  christos 
   2171       1.1.1.5  christos             InfoTable = AcpiDmTableInfoSdev0;
   2172       1.1.1.5  christos             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
   2173      1.1.1.11  christos             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
   2174      1.1.1.11  christos                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
   2175       1.1.1.5  christos             break;
   2176       1.1.1.5  christos 
   2177       1.1.1.5  christos         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2178       1.1.1.5  christos 
   2179       1.1.1.5  christos             InfoTable = AcpiDmTableInfoSdev1;
   2180       1.1.1.5  christos             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
   2181       1.1.1.5  christos             break;
   2182       1.1.1.5  christos 
   2183       1.1.1.5  christos         default:
   2184       1.1.1.5  christos 
   2185       1.1.1.5  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   2186       1.1.1.5  christos             return (AE_ERROR);
   2187       1.1.1.5  christos         }
   2188       1.1.1.5  christos 
   2189       1.1.1.5  christos         /* Compile SDEV subtable body */
   2190       1.1.1.5  christos 
   2191       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2192       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   2193       1.1.1.5  christos         {
   2194       1.1.1.5  christos             return (Status);
   2195       1.1.1.5  christos         }
   2196       1.1.1.5  christos 
   2197       1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   2198       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   2199       1.1.1.5  christos 
   2200       1.1.1.5  christos         /* Optional data fields are appended to the main subtable body */
   2201       1.1.1.5  christos 
   2202       1.1.1.5  christos         switch (SdevHeader->Type)
   2203       1.1.1.5  christos         {
   2204       1.1.1.5  christos         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2205       1.1.1.5  christos 
   2206      1.1.1.11  christos             /*
   2207      1.1.1.11  christos              * Device Id Offset will be be calculated differently depending on
   2208      1.1.1.11  christos              * the presence of secure access components.
   2209      1.1.1.11  christos              */
   2210      1.1.1.11  christos             Namesp->DeviceIdOffset = 0;
   2211      1.1.1.11  christos             ComponentLength = 0;
   2212      1.1.1.11  christos 
   2213      1.1.1.11  christos             /* If the secure access component exists, get the structures */
   2214      1.1.1.11  christos 
   2215      1.1.1.11  christos             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
   2216      1.1.1.11  christos             {
   2217      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
   2218      1.1.1.11  christos                     &Subtable);
   2219      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   2220      1.1.1.11  christos                 {
   2221      1.1.1.11  christos                     return (Status);
   2222      1.1.1.11  christos                 }
   2223      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   2224      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   2225      1.1.1.11  christos 
   2226      1.1.1.11  christos                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2227      1.1.1.11  christos 
   2228      1.1.1.11  christos                 /* Compile a secure access component header */
   2229      1.1.1.11  christos 
   2230      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
   2231      1.1.1.11  christos                     &Subtable);
   2232      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   2233      1.1.1.11  christos                 {
   2234      1.1.1.11  christos                     return (Status);
   2235      1.1.1.11  christos                 }
   2236      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   2237      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   2238      1.1.1.11  christos 
   2239      1.1.1.11  christos                 /* Compile the secure access component */
   2240      1.1.1.11  christos 
   2241      1.1.1.11  christos                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   2242      1.1.1.11  christos                 switch (SecureComponentHeader->Type)
   2243      1.1.1.11  christos                 {
   2244      1.1.1.11  christos                 case ACPI_SDEV_TYPE_ID_COMPONENT:
   2245      1.1.1.11  christos 
   2246      1.1.1.11  christos                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
   2247      1.1.1.11  christos                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
   2248      1.1.1.11  christos                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
   2249      1.1.1.11  christos                     break;
   2250      1.1.1.11  christos 
   2251      1.1.1.11  christos                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
   2252      1.1.1.11  christos 
   2253      1.1.1.11  christos                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
   2254      1.1.1.11  christos                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
   2255      1.1.1.11  christos                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
   2256      1.1.1.11  christos                     break;
   2257      1.1.1.11  christos 
   2258      1.1.1.11  christos                 default:
   2259      1.1.1.11  christos 
   2260      1.1.1.11  christos                     /* Any other secure component types are undefined */
   2261      1.1.1.11  christos 
   2262      1.1.1.11  christos                     return (AE_ERROR);
   2263      1.1.1.11  christos                 }
   2264      1.1.1.11  christos 
   2265      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
   2266      1.1.1.11  christos                     &Subtable);
   2267      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   2268      1.1.1.11  christos                 {
   2269      1.1.1.11  christos                     return (Status);
   2270      1.1.1.11  christos                 }
   2271      1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   2272      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   2273      1.1.1.11  christos 
   2274      1.1.1.11  christos                 SecureComponent->SecureComponentOffset =
   2275      1.1.1.11  christos                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2276      1.1.1.11  christos                 SecureComponent->SecureComponentLength = ComponentLength;
   2277      1.1.1.11  christos 
   2278      1.1.1.11  christos 
   2279      1.1.1.11  christos                 /*
   2280      1.1.1.11  christos                  * Add the secure component to the subtable to be added for the
   2281      1.1.1.11  christos                  * the namespace subtable's length
   2282      1.1.1.11  christos                  */
   2283      1.1.1.11  christos                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2284      1.1.1.11  christos             }
   2285      1.1.1.11  christos 
   2286       1.1.1.5  christos             /* Append DeviceId namespace string */
   2287       1.1.1.5  christos 
   2288       1.1.1.5  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
   2289       1.1.1.6  christos                 &Subtable);
   2290       1.1.1.5  christos             if (ACPI_FAILURE (Status))
   2291       1.1.1.5  christos             {
   2292       1.1.1.5  christos                 return (Status);
   2293       1.1.1.5  christos             }
   2294       1.1.1.5  christos 
   2295       1.1.1.5  christos             if (!Subtable)
   2296       1.1.1.5  christos             {
   2297       1.1.1.5  christos                 break;
   2298       1.1.1.5  christos             }
   2299       1.1.1.5  christos 
   2300       1.1.1.5  christos             ParentTable = DtPeekSubtable ();
   2301       1.1.1.5  christos             DtInsertSubtable (ParentTable, Subtable);
   2302       1.1.1.5  christos 
   2303      1.1.1.11  christos             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
   2304      1.1.1.11  christos 
   2305       1.1.1.5  christos             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
   2306       1.1.1.5  christos 
   2307       1.1.1.5  christos             /* Append Vendor data */
   2308       1.1.1.5  christos 
   2309       1.1.1.5  christos             Namesp->VendorDataLength = 0;
   2310       1.1.1.5  christos             Namesp->VendorDataOffset = 0;
   2311       1.1.1.5  christos 
   2312       1.1.1.5  christos             if (*PFieldList)
   2313       1.1.1.5  christos             {
   2314       1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   2315       1.1.1.6  christos                     &Subtable);
   2316       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   2317       1.1.1.5  christos                 {
   2318       1.1.1.5  christos                     return (Status);
   2319       1.1.1.5  christos                 }
   2320       1.1.1.5  christos 
   2321       1.1.1.5  christos                 if (Subtable)
   2322       1.1.1.5  christos                 {
   2323       1.1.1.5  christos                     ParentTable = DtPeekSubtable ();
   2324       1.1.1.5  christos                     DtInsertSubtable (ParentTable, Subtable);
   2325       1.1.1.5  christos 
   2326       1.1.1.5  christos                     Namesp->VendorDataOffset =
   2327       1.1.1.5  christos                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
   2328       1.1.1.5  christos                     Namesp->VendorDataLength =
   2329       1.1.1.5  christos                         (UINT16) Subtable->Length;
   2330       1.1.1.9  christos 
   2331       1.1.1.9  christos                     /* Final size of entire namespace structure */
   2332       1.1.1.9  christos 
   2333       1.1.1.9  christos                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
   2334      1.1.1.11  christos                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
   2335       1.1.1.5  christos                 }
   2336       1.1.1.5  christos             }
   2337       1.1.1.5  christos 
   2338       1.1.1.5  christos             break;
   2339       1.1.1.5  christos 
   2340       1.1.1.5  christos         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2341       1.1.1.5  christos 
   2342       1.1.1.5  christos             /* Append the PCIe path info first */
   2343       1.1.1.5  christos 
   2344       1.1.1.5  christos             EntryCount = 0;
   2345       1.1.1.5  christos             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
   2346       1.1.1.5  christos             {
   2347       1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
   2348       1.1.1.6  christos                     &Subtable);
   2349       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   2350       1.1.1.5  christos                 {
   2351       1.1.1.5  christos                     return (Status);
   2352       1.1.1.5  christos                 }
   2353       1.1.1.5  christos 
   2354       1.1.1.5  christos                 if (!Subtable)
   2355       1.1.1.5  christos                 {
   2356       1.1.1.5  christos                     DtPopSubtable ();
   2357       1.1.1.5  christos                     break;
   2358       1.1.1.5  christos                 }
   2359       1.1.1.5  christos 
   2360       1.1.1.5  christos                 ParentTable = DtPeekSubtable ();
   2361       1.1.1.5  christos                 DtInsertSubtable (ParentTable, Subtable);
   2362       1.1.1.5  christos                 EntryCount++;
   2363       1.1.1.5  christos             }
   2364       1.1.1.5  christos 
   2365       1.1.1.5  christos             /* Path offset will point immediately after the main subtable */
   2366       1.1.1.5  christos 
   2367       1.1.1.5  christos             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
   2368       1.1.1.5  christos             Pcie->PathLength = (UINT16)
   2369       1.1.1.5  christos                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
   2370       1.1.1.5  christos 
   2371       1.1.1.5  christos             /* Append the Vendor Data last */
   2372       1.1.1.5  christos 
   2373       1.1.1.5  christos             Pcie->VendorDataLength = 0;
   2374       1.1.1.5  christos             Pcie->VendorDataOffset = 0;
   2375       1.1.1.5  christos 
   2376       1.1.1.5  christos             if (*PFieldList)
   2377       1.1.1.5  christos             {
   2378       1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   2379       1.1.1.6  christos                     &Subtable);
   2380       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   2381       1.1.1.5  christos                 {
   2382       1.1.1.5  christos                     return (Status);
   2383       1.1.1.5  christos                 }
   2384       1.1.1.5  christos 
   2385       1.1.1.5  christos                 if (Subtable)
   2386       1.1.1.5  christos                 {
   2387       1.1.1.5  christos                     ParentTable = DtPeekSubtable ();
   2388       1.1.1.5  christos                     DtInsertSubtable (ParentTable, Subtable);
   2389       1.1.1.5  christos 
   2390       1.1.1.5  christos                     Pcie->VendorDataOffset =
   2391       1.1.1.5  christos                         Pcie->PathOffset + Pcie->PathLength;
   2392       1.1.1.5  christos                     Pcie->VendorDataLength = (UINT16)
   2393       1.1.1.5  christos                         Subtable->Length;
   2394       1.1.1.5  christos                 }
   2395       1.1.1.5  christos             }
   2396       1.1.1.5  christos 
   2397       1.1.1.5  christos             SdevHeader->Length =
   2398       1.1.1.5  christos                 sizeof (ACPI_SDEV_PCIE) +
   2399       1.1.1.5  christos                 Pcie->PathLength + Pcie->VendorDataLength;
   2400       1.1.1.5  christos             break;
   2401       1.1.1.5  christos 
   2402       1.1.1.5  christos         default:
   2403       1.1.1.5  christos 
   2404       1.1.1.5  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   2405       1.1.1.5  christos             return (AE_ERROR);
   2406       1.1.1.5  christos         }
   2407       1.1.1.5  christos 
   2408       1.1.1.5  christos         DtPopSubtable ();
   2409       1.1.1.5  christos     }
   2410       1.1.1.5  christos 
   2411       1.1.1.5  christos     return (AE_OK);
   2412       1.1.1.5  christos }
   2413       1.1.1.5  christos 
   2414       1.1.1.5  christos 
   2415       1.1.1.5  christos /******************************************************************************
   2416       1.1.1.5  christos  *
   2417           1.1  christos  * FUNCTION:    DtCompileSlic
   2418           1.1  christos  *
   2419           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2420           1.1  christos  *
   2421           1.1  christos  * RETURN:      Status
   2422           1.1  christos  *
   2423           1.1  christos  * DESCRIPTION: Compile SLIC.
   2424           1.1  christos  *
   2425           1.1  christos  *****************************************************************************/
   2426           1.1  christos 
   2427           1.1  christos ACPI_STATUS
   2428           1.1  christos DtCompileSlic (
   2429           1.1  christos     void                    **List)
   2430           1.1  christos {
   2431           1.1  christos     ACPI_STATUS             Status;
   2432           1.1  christos     DT_SUBTABLE             *Subtable;
   2433           1.1  christos     DT_SUBTABLE             *ParentTable;
   2434           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2435           1.1  christos 
   2436           1.1  christos 
   2437           1.1  christos     while (*PFieldList)
   2438           1.1  christos     {
   2439           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
   2440       1.1.1.6  christos             &Subtable);
   2441           1.1  christos         if (ACPI_FAILURE (Status))
   2442           1.1  christos         {
   2443           1.1  christos             return (Status);
   2444           1.1  christos         }
   2445           1.1  christos 
   2446           1.1  christos         ParentTable = DtPeekSubtable ();
   2447           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2448           1.1  christos         DtPushSubtable (Subtable);
   2449           1.1  christos         DtPopSubtable ();
   2450           1.1  christos     }
   2451           1.1  christos 
   2452           1.1  christos     return (AE_OK);
   2453           1.1  christos }
   2454           1.1  christos 
   2455           1.1  christos 
   2456           1.1  christos /******************************************************************************
   2457           1.1  christos  *
   2458           1.1  christos  * FUNCTION:    DtCompileSlit
   2459           1.1  christos  *
   2460           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2461           1.1  christos  *
   2462           1.1  christos  * RETURN:      Status
   2463           1.1  christos  *
   2464           1.1  christos  * DESCRIPTION: Compile SLIT.
   2465           1.1  christos  *
   2466           1.1  christos  *****************************************************************************/
   2467           1.1  christos 
   2468           1.1  christos ACPI_STATUS
   2469           1.1  christos DtCompileSlit (
   2470           1.1  christos     void                    **List)
   2471           1.1  christos {
   2472           1.1  christos     ACPI_STATUS             Status;
   2473           1.1  christos     DT_SUBTABLE             *Subtable;
   2474           1.1  christos     DT_SUBTABLE             *ParentTable;
   2475           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2476           1.1  christos     DT_FIELD                *FieldList;
   2477       1.1.1.9  christos     DT_FIELD                *EndOfFieldList = NULL;
   2478           1.1  christos     UINT32                  Localities;
   2479       1.1.1.9  christos     UINT32                  LocalityListLength;
   2480           1.1  christos     UINT8                   *LocalityBuffer;
   2481           1.1  christos 
   2482           1.1  christos 
   2483           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
   2484       1.1.1.6  christos         &Subtable);
   2485           1.1  christos     if (ACPI_FAILURE (Status))
   2486           1.1  christos     {
   2487           1.1  christos         return (Status);
   2488           1.1  christos     }
   2489           1.1  christos 
   2490           1.1  christos     ParentTable = DtPeekSubtable ();
   2491           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2492           1.1  christos 
   2493           1.1  christos     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
   2494           1.1  christos     LocalityBuffer = UtLocalCalloc (Localities);
   2495       1.1.1.9  christos     LocalityListLength = 0;
   2496           1.1  christos 
   2497           1.1  christos     /* Compile each locality buffer */
   2498           1.1  christos 
   2499           1.1  christos     FieldList = *PFieldList;
   2500           1.1  christos     while (FieldList)
   2501           1.1  christos     {
   2502           1.1  christos         DtCompileBuffer (LocalityBuffer,
   2503           1.1  christos             FieldList->Value, FieldList, Localities);
   2504           1.1  christos 
   2505       1.1.1.9  christos         LocalityListLength++;
   2506           1.1  christos         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
   2507           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2508       1.1.1.9  christos         EndOfFieldList = FieldList;
   2509           1.1  christos         FieldList = FieldList->Next;
   2510           1.1  christos     }
   2511           1.1  christos 
   2512       1.1.1.9  christos     if (LocalityListLength != Localities)
   2513       1.1.1.9  christos     {
   2514       1.1.1.9  christos         sprintf(AslGbl_MsgBuffer,
   2515       1.1.1.9  christos             "Found %u entries, must match LocalityCount: %u",
   2516       1.1.1.9  christos             LocalityListLength, Localities);
   2517       1.1.1.9  christos         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
   2518       1.1.1.9  christos         ACPI_FREE (LocalityBuffer);
   2519       1.1.1.9  christos         return (AE_LIMIT);
   2520       1.1.1.9  christos     }
   2521       1.1.1.9  christos 
   2522           1.1  christos     ACPI_FREE (LocalityBuffer);
   2523           1.1  christos     return (AE_OK);
   2524           1.1  christos }
   2525           1.1  christos 
   2526           1.1  christos 
   2527           1.1  christos /******************************************************************************
   2528           1.1  christos  *
   2529           1.1  christos  * FUNCTION:    DtCompileSrat
   2530           1.1  christos  *
   2531           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2532           1.1  christos  *
   2533           1.1  christos  * RETURN:      Status
   2534           1.1  christos  *
   2535           1.1  christos  * DESCRIPTION: Compile SRAT.
   2536           1.1  christos  *
   2537           1.1  christos  *****************************************************************************/
   2538           1.1  christos 
   2539           1.1  christos ACPI_STATUS
   2540           1.1  christos DtCompileSrat (
   2541           1.1  christos     void                    **List)
   2542           1.1  christos {
   2543           1.1  christos     ACPI_STATUS             Status;
   2544           1.1  christos     DT_SUBTABLE             *Subtable;
   2545           1.1  christos     DT_SUBTABLE             *ParentTable;
   2546           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2547           1.1  christos     DT_FIELD                *SubtableStart;
   2548           1.1  christos     ACPI_SUBTABLE_HEADER    *SratHeader;
   2549           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   2550           1.1  christos 
   2551           1.1  christos 
   2552           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
   2553       1.1.1.6  christos         &Subtable);
   2554           1.1  christos     if (ACPI_FAILURE (Status))
   2555           1.1  christos     {
   2556           1.1  christos         return (Status);
   2557           1.1  christos     }
   2558           1.1  christos 
   2559           1.1  christos     ParentTable = DtPeekSubtable ();
   2560           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2561           1.1  christos 
   2562           1.1  christos     while (*PFieldList)
   2563           1.1  christos     {
   2564           1.1  christos         SubtableStart = *PFieldList;
   2565           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
   2566       1.1.1.6  christos             &Subtable);
   2567           1.1  christos         if (ACPI_FAILURE (Status))
   2568           1.1  christos         {
   2569           1.1  christos             return (Status);
   2570           1.1  christos         }
   2571           1.1  christos 
   2572           1.1  christos         ParentTable = DtPeekSubtable ();
   2573           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2574           1.1  christos         DtPushSubtable (Subtable);
   2575           1.1  christos 
   2576           1.1  christos         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   2577           1.1  christos 
   2578           1.1  christos         switch (SratHeader->Type)
   2579           1.1  christos         {
   2580           1.1  christos         case ACPI_SRAT_TYPE_CPU_AFFINITY:
   2581           1.1  christos 
   2582           1.1  christos             InfoTable = AcpiDmTableInfoSrat0;
   2583           1.1  christos             break;
   2584           1.1  christos 
   2585           1.1  christos         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   2586           1.1  christos 
   2587           1.1  christos             InfoTable = AcpiDmTableInfoSrat1;
   2588           1.1  christos             break;
   2589           1.1  christos 
   2590           1.1  christos         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   2591           1.1  christos 
   2592           1.1  christos             InfoTable = AcpiDmTableInfoSrat2;
   2593           1.1  christos             break;
   2594           1.1  christos 
   2595           1.1  christos         case ACPI_SRAT_TYPE_GICC_AFFINITY:
   2596           1.1  christos 
   2597           1.1  christos             InfoTable = AcpiDmTableInfoSrat3;
   2598           1.1  christos             break;
   2599           1.1  christos 
   2600       1.1.1.4  christos         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
   2601       1.1.1.4  christos 
   2602       1.1.1.4  christos             InfoTable = AcpiDmTableInfoSrat4;
   2603       1.1.1.4  christos             break;
   2604       1.1.1.4  christos 
   2605       1.1.1.8  christos         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
   2606       1.1.1.8  christos 
   2607       1.1.1.8  christos             InfoTable = AcpiDmTableInfoSrat5;
   2608       1.1.1.8  christos             break;
   2609       1.1.1.8  christos 
   2610      1.1.1.13  christos         case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY:
   2611      1.1.1.13  christos 
   2612      1.1.1.13  christos             InfoTable = AcpiDmTableInfoSrat6;
   2613      1.1.1.13  christos             break;
   2614      1.1.1.13  christos 
   2615  1.1.1.17.6.1  perseant         case ACPI_SRAT_TYPE_RINTC_AFFINITY:
   2616  1.1.1.17.6.1  perseant 
   2617  1.1.1.17.6.1  perseant             InfoTable = AcpiDmTableInfoSrat7;
   2618  1.1.1.17.6.1  perseant             break;
   2619  1.1.1.17.6.1  perseant 
   2620           1.1  christos         default:
   2621           1.1  christos 
   2622           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
   2623           1.1  christos             return (AE_ERROR);
   2624           1.1  christos         }
   2625           1.1  christos 
   2626       1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2627           1.1  christos         if (ACPI_FAILURE (Status))
   2628           1.1  christos         {
   2629           1.1  christos             return (Status);
   2630           1.1  christos         }
   2631           1.1  christos 
   2632           1.1  christos         ParentTable = DtPeekSubtable ();
   2633           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2634           1.1  christos         DtPopSubtable ();
   2635           1.1  christos     }
   2636           1.1  christos 
   2637           1.1  christos     return (AE_OK);
   2638           1.1  christos }
   2639           1.1  christos 
   2640           1.1  christos 
   2641           1.1  christos /******************************************************************************
   2642           1.1  christos  *
   2643           1.1  christos  * FUNCTION:    DtCompileStao
   2644           1.1  christos  *
   2645           1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2646           1.1  christos  *
   2647           1.1  christos  * RETURN:      Status
   2648           1.1  christos  *
   2649           1.1  christos  * DESCRIPTION: Compile STAO.
   2650           1.1  christos  *
   2651           1.1  christos  *****************************************************************************/
   2652           1.1  christos 
   2653           1.1  christos ACPI_STATUS
   2654           1.1  christos DtCompileStao (
   2655           1.1  christos     void                    **List)
   2656           1.1  christos {
   2657           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2658           1.1  christos     DT_SUBTABLE             *Subtable;
   2659           1.1  christos     DT_SUBTABLE             *ParentTable;
   2660           1.1  christos     ACPI_STATUS             Status;
   2661           1.1  christos 
   2662           1.1  christos 
   2663           1.1  christos     /* Compile the main table */
   2664           1.1  christos 
   2665           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
   2666       1.1.1.6  christos         &Subtable);
   2667           1.1  christos     if (ACPI_FAILURE (Status))
   2668           1.1  christos     {
   2669           1.1  christos         return (Status);
   2670           1.1  christos     }
   2671           1.1  christos 
   2672           1.1  christos     ParentTable = DtPeekSubtable ();
   2673           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2674           1.1  christos 
   2675           1.1  christos     /* Compile each ASCII namestring as a subtable */
   2676           1.1  christos 
   2677           1.1  christos     while (*PFieldList)
   2678           1.1  christos     {
   2679           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
   2680       1.1.1.6  christos             &Subtable);
   2681           1.1  christos         if (ACPI_FAILURE (Status))
   2682           1.1  christos         {
   2683           1.1  christos             return (Status);
   2684           1.1  christos         }
   2685           1.1  christos 
   2686           1.1  christos         ParentTable = DtPeekSubtable ();
   2687           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2688           1.1  christos     }
   2689           1.1  christos 
   2690           1.1  christos     return (AE_OK);
   2691           1.1  christos }
   2692           1.1  christos 
   2693           1.1  christos 
   2694      1.1.1.12  christos /******************************************************************************
   2695      1.1.1.12  christos  *
   2696      1.1.1.12  christos  * FUNCTION:    DtCompileSvkl
   2697      1.1.1.12  christos  *
   2698      1.1.1.12  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2699      1.1.1.12  christos  *
   2700      1.1.1.12  christos  * RETURN:      Status
   2701      1.1.1.12  christos  *
   2702      1.1.1.12  christos  * DESCRIPTION: Compile SVKL.
   2703      1.1.1.12  christos  *
   2704      1.1.1.12  christos  * NOTES: SVKL is essentially a flat table, with a small main table and
   2705      1.1.1.12  christos  *          a variable number of a single type of subtable.
   2706      1.1.1.12  christos  *
   2707      1.1.1.12  christos  *****************************************************************************/
   2708      1.1.1.12  christos 
   2709      1.1.1.12  christos ACPI_STATUS
   2710      1.1.1.12  christos DtCompileSvkl (
   2711      1.1.1.12  christos     void                    **List)
   2712      1.1.1.12  christos {
   2713      1.1.1.12  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2714      1.1.1.12  christos     DT_SUBTABLE             *Subtable;
   2715      1.1.1.12  christos     DT_SUBTABLE             *ParentTable;
   2716      1.1.1.12  christos     ACPI_STATUS             Status;
   2717      1.1.1.12  christos 
   2718      1.1.1.12  christos 
   2719      1.1.1.12  christos     /* Compile the main table */
   2720      1.1.1.12  christos 
   2721      1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
   2722      1.1.1.12  christos         &Subtable);
   2723      1.1.1.12  christos     if (ACPI_FAILURE (Status))
   2724      1.1.1.12  christos     {
   2725      1.1.1.12  christos         return (Status);
   2726      1.1.1.12  christos     }
   2727      1.1.1.12  christos 
   2728      1.1.1.12  christos     ParentTable = DtPeekSubtable ();
   2729      1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   2730      1.1.1.12  christos 
   2731      1.1.1.12  christos     /* Compile each subtable */
   2732      1.1.1.12  christos 
   2733      1.1.1.12  christos     while (*PFieldList)
   2734      1.1.1.12  christos     {
   2735      1.1.1.12  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
   2736      1.1.1.12  christos             &Subtable);
   2737      1.1.1.12  christos         if (ACPI_FAILURE (Status))
   2738      1.1.1.12  christos         {
   2739      1.1.1.12  christos             return (Status);
   2740      1.1.1.12  christos         }
   2741      1.1.1.12  christos 
   2742      1.1.1.12  christos         ParentTable = DtPeekSubtable ();
   2743      1.1.1.12  christos         DtInsertSubtable (ParentTable, Subtable);
   2744      1.1.1.12  christos     }
   2745      1.1.1.12  christos 
   2746      1.1.1.12  christos     return (AE_OK);
   2747      1.1.1.12  christos }
   2748      1.1.1.12  christos 
   2749      1.1.1.12  christos 
   2750           1.1  christos /******************************************************************************
   2751           1.1  christos  *
   2752           1.1  christos  * FUNCTION:    DtCompileTcpa
   2753           1.1  christos  *
   2754           1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2755           1.1  christos  *
   2756           1.1  christos  * RETURN:      Status
   2757           1.1  christos  *
   2758           1.1  christos  * DESCRIPTION: Compile TCPA.
   2759           1.1  christos  *
   2760           1.1  christos  *****************************************************************************/
   2761           1.1  christos 
   2762           1.1  christos ACPI_STATUS
   2763           1.1  christos DtCompileTcpa (
   2764           1.1  christos     void                    **List)
   2765           1.1  christos {
   2766           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2767           1.1  christos     DT_SUBTABLE             *Subtable;
   2768           1.1  christos     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
   2769           1.1  christos     DT_SUBTABLE             *ParentTable;
   2770           1.1  christos     ACPI_STATUS             Status;
   2771           1.1  christos 
   2772           1.1  christos 
   2773           1.1  christos     /* Compile the main table */
   2774           1.1  christos 
   2775           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
   2776       1.1.1.6  christos         &Subtable);
   2777           1.1  christos     if (ACPI_FAILURE (Status))
   2778           1.1  christos     {
   2779           1.1  christos         return (Status);
   2780           1.1  christos     }
   2781           1.1  christos 
   2782           1.1  christos     ParentTable = DtPeekSubtable ();
   2783           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2784           1.1  christos 
   2785           1.1  christos     /*
   2786           1.1  christos      * Examine the PlatformClass field to determine the table type.
   2787           1.1  christos      * Either a client or server table. Only one.
   2788           1.1  christos      */
   2789           1.1  christos     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
   2790           1.1  christos 
   2791           1.1  christos     switch (TcpaHeader->PlatformClass)
   2792           1.1  christos     {
   2793           1.1  christos     case ACPI_TCPA_CLIENT_TABLE:
   2794           1.1  christos 
   2795           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
   2796       1.1.1.6  christos             &Subtable);
   2797           1.1  christos         break;
   2798           1.1  christos 
   2799           1.1  christos     case ACPI_TCPA_SERVER_TABLE:
   2800           1.1  christos 
   2801           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
   2802       1.1.1.6  christos             &Subtable);
   2803           1.1  christos         break;
   2804           1.1  christos 
   2805           1.1  christos     default:
   2806           1.1  christos 
   2807           1.1  christos         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
   2808           1.1  christos             TcpaHeader->PlatformClass);
   2809           1.1  christos         Status = AE_ERROR;
   2810           1.1  christos         break;
   2811           1.1  christos     }
   2812           1.1  christos 
   2813           1.1  christos     ParentTable = DtPeekSubtable ();
   2814           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2815           1.1  christos     return (Status);
   2816           1.1  christos }
   2817           1.1  christos 
   2818           1.1  christos 
   2819           1.1  christos /******************************************************************************
   2820           1.1  christos  *
   2821       1.1.1.7  christos  * FUNCTION:    DtCompileTpm2Rev3
   2822       1.1.1.7  christos  *
   2823       1.1.1.7  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2824       1.1.1.7  christos  *
   2825       1.1.1.7  christos  * RETURN:      Status
   2826       1.1.1.7  christos  *
   2827       1.1.1.7  christos  * DESCRIPTION: Compile TPM2 revision 3
   2828       1.1.1.7  christos  *
   2829       1.1.1.7  christos  *****************************************************************************/
   2830       1.1.1.7  christos static ACPI_STATUS
   2831       1.1.1.7  christos DtCompileTpm2Rev3 (
   2832       1.1.1.7  christos     void                    **List)
   2833       1.1.1.7  christos {
   2834       1.1.1.7  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2835       1.1.1.7  christos     DT_SUBTABLE             *Subtable;
   2836       1.1.1.7  christos     ACPI_TABLE_TPM23        *Tpm23Header;
   2837       1.1.1.7  christos     DT_SUBTABLE             *ParentTable;
   2838       1.1.1.7  christos     ACPI_STATUS             Status = AE_OK;
   2839       1.1.1.7  christos 
   2840       1.1.1.7  christos 
   2841       1.1.1.7  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
   2842       1.1.1.7  christos         &Subtable);
   2843       1.1.1.7  christos 
   2844       1.1.1.7  christos     ParentTable = DtPeekSubtable ();
   2845       1.1.1.7  christos     DtInsertSubtable (ParentTable, Subtable);
   2846       1.1.1.7  christos     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
   2847       1.1.1.7  christos 
   2848       1.1.1.7  christos     /* Subtable type depends on the StartMethod */
   2849       1.1.1.7  christos 
   2850       1.1.1.7  christos     switch (Tpm23Header->StartMethod)
   2851       1.1.1.7  christos     {
   2852       1.1.1.7  christos     case ACPI_TPM23_ACPI_START_METHOD:
   2853       1.1.1.7  christos 
   2854       1.1.1.7  christos         /* Subtable specific to to ARM_SMC */
   2855       1.1.1.7  christos 
   2856       1.1.1.7  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
   2857       1.1.1.7  christos             &Subtable);
   2858       1.1.1.7  christos         if (ACPI_FAILURE (Status))
   2859       1.1.1.7  christos         {
   2860       1.1.1.7  christos             return (Status);
   2861       1.1.1.7  christos         }
   2862       1.1.1.7  christos 
   2863       1.1.1.7  christos         ParentTable = DtPeekSubtable ();
   2864       1.1.1.7  christos         DtInsertSubtable (ParentTable, Subtable);
   2865       1.1.1.7  christos         break;
   2866       1.1.1.7  christos 
   2867       1.1.1.7  christos     default:
   2868       1.1.1.7  christos         break;
   2869       1.1.1.7  christos     }
   2870       1.1.1.7  christos 
   2871       1.1.1.7  christos     return (Status);
   2872       1.1.1.7  christos }
   2873       1.1.1.7  christos 
   2874       1.1.1.7  christos 
   2875       1.1.1.7  christos /******************************************************************************
   2876       1.1.1.7  christos  *
   2877       1.1.1.5  christos  * FUNCTION:    DtCompileTpm2
   2878       1.1.1.5  christos  *
   2879       1.1.1.5  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2880       1.1.1.5  christos  *
   2881       1.1.1.5  christos  * RETURN:      Status
   2882       1.1.1.5  christos  *
   2883       1.1.1.5  christos  * DESCRIPTION: Compile TPM2.
   2884       1.1.1.5  christos  *
   2885       1.1.1.5  christos  *****************************************************************************/
   2886       1.1.1.5  christos 
   2887       1.1.1.5  christos ACPI_STATUS
   2888       1.1.1.5  christos DtCompileTpm2 (
   2889       1.1.1.5  christos     void                    **List)
   2890       1.1.1.5  christos {
   2891       1.1.1.5  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2892       1.1.1.5  christos     DT_SUBTABLE             *Subtable;
   2893       1.1.1.5  christos     ACPI_TABLE_TPM2         *Tpm2Header;
   2894       1.1.1.5  christos     DT_SUBTABLE             *ParentTable;
   2895       1.1.1.5  christos     ACPI_STATUS             Status = AE_OK;
   2896       1.1.1.7  christos     ACPI_TABLE_HEADER       *Header;
   2897       1.1.1.5  christos 
   2898       1.1.1.5  christos 
   2899       1.1.1.7  christos     ParentTable = DtPeekSubtable ();
   2900       1.1.1.7  christos 
   2901       1.1.1.7  christos     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
   2902       1.1.1.7  christos 
   2903       1.1.1.7  christos     if (Header->Revision == 3)
   2904       1.1.1.7  christos     {
   2905       1.1.1.7  christos         return (DtCompileTpm2Rev3 (List));
   2906       1.1.1.7  christos     }
   2907       1.1.1.7  christos 
   2908       1.1.1.5  christos     /* Compile the main table */
   2909       1.1.1.5  christos 
   2910       1.1.1.5  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
   2911       1.1.1.6  christos         &Subtable);
   2912       1.1.1.5  christos     if (ACPI_FAILURE (Status))
   2913       1.1.1.5  christos     {
   2914       1.1.1.5  christos         return (Status);
   2915       1.1.1.5  christos     }
   2916       1.1.1.5  christos 
   2917       1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   2918       1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   2919       1.1.1.5  christos 
   2920       1.1.1.5  christos     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
   2921       1.1.1.5  christos 
   2922       1.1.1.5  christos     /* Method parameters */
   2923       1.1.1.5  christos     /* Optional: Log area minimum length */
   2924       1.1.1.5  christos     /* Optional: Log area start address */
   2925       1.1.1.5  christos     /* TBD: Optional fields above not fully implemented (not optional at this time) */
   2926       1.1.1.5  christos 
   2927       1.1.1.5  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
   2928       1.1.1.6  christos         &Subtable);
   2929       1.1.1.5  christos     if (ACPI_FAILURE (Status))
   2930       1.1.1.5  christos     {
   2931       1.1.1.5  christos         return (Status);
   2932       1.1.1.5  christos     }
   2933       1.1.1.5  christos 
   2934       1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   2935       1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   2936       1.1.1.5  christos 
   2937       1.1.1.5  christos 
   2938       1.1.1.5  christos     /* Subtable type depends on the StartMethod */
   2939       1.1.1.5  christos 
   2940       1.1.1.5  christos     switch (Tpm2Header->StartMethod)
   2941       1.1.1.5  christos     {
   2942       1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
   2943       1.1.1.5  christos 
   2944       1.1.1.5  christos         /* Subtable specific to to ARM_SMC */
   2945       1.1.1.5  christos 
   2946       1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
   2947       1.1.1.6  christos             &Subtable);
   2948       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   2949       1.1.1.5  christos         {
   2950       1.1.1.5  christos             return (Status);
   2951       1.1.1.5  christos         }
   2952       1.1.1.5  christos 
   2953       1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   2954       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   2955       1.1.1.5  christos         break;
   2956       1.1.1.5  christos 
   2957       1.1.1.5  christos     case ACPI_TPM2_START_METHOD:
   2958       1.1.1.5  christos     case ACPI_TPM2_MEMORY_MAPPED:
   2959       1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER:
   2960       1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
   2961       1.1.1.5  christos         break;
   2962       1.1.1.5  christos 
   2963       1.1.1.5  christos     case ACPI_TPM2_RESERVED1:
   2964       1.1.1.5  christos     case ACPI_TPM2_RESERVED3:
   2965       1.1.1.5  christos     case ACPI_TPM2_RESERVED4:
   2966       1.1.1.5  christos     case ACPI_TPM2_RESERVED5:
   2967       1.1.1.5  christos     case ACPI_TPM2_RESERVED9:
   2968       1.1.1.5  christos     case ACPI_TPM2_RESERVED10:
   2969       1.1.1.5  christos 
   2970       1.1.1.5  christos         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
   2971       1.1.1.5  christos             Tpm2Header->StartMethod);
   2972       1.1.1.5  christos         Status = AE_ERROR;
   2973       1.1.1.5  christos         break;
   2974       1.1.1.5  christos 
   2975       1.1.1.5  christos     case ACPI_TPM2_NOT_ALLOWED:
   2976       1.1.1.5  christos     default:
   2977       1.1.1.5  christos 
   2978       1.1.1.5  christos         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
   2979       1.1.1.5  christos             Tpm2Header->StartMethod);
   2980       1.1.1.5  christos         Status = AE_ERROR;
   2981       1.1.1.5  christos         break;
   2982       1.1.1.5  christos     }
   2983       1.1.1.5  christos 
   2984       1.1.1.5  christos     return (Status);
   2985       1.1.1.5  christos }
   2986       1.1.1.5  christos 
   2987       1.1.1.5  christos 
   2988       1.1.1.5  christos /******************************************************************************
   2989       1.1.1.5  christos  *
   2990           1.1  christos  * FUNCTION:    DtGetGenericTableInfo
   2991           1.1  christos  *
   2992           1.1  christos  * PARAMETERS:  Name                - Generic type name
   2993           1.1  christos  *
   2994           1.1  christos  * RETURN:      Info entry
   2995           1.1  christos  *
   2996           1.1  christos  * DESCRIPTION: Obtain table info for a generic name entry
   2997           1.1  christos  *
   2998           1.1  christos  *****************************************************************************/
   2999           1.1  christos 
   3000           1.1  christos ACPI_DMTABLE_INFO *
   3001           1.1  christos DtGetGenericTableInfo (
   3002           1.1  christos     char                    *Name)
   3003           1.1  christos {
   3004           1.1  christos     ACPI_DMTABLE_INFO       *Info;
   3005           1.1  christos     UINT32                  i;
   3006           1.1  christos 
   3007           1.1  christos 
   3008           1.1  christos     if (!Name)
   3009           1.1  christos     {
   3010           1.1  christos         return (NULL);
   3011           1.1  christos     }
   3012           1.1  christos 
   3013           1.1  christos     /* Search info table for name match */
   3014           1.1  christos 
   3015           1.1  christos     for (i = 0; ; i++)
   3016           1.1  christos     {
   3017           1.1  christos         Info = AcpiDmTableInfoGeneric[i];
   3018           1.1  christos         if (Info->Opcode == ACPI_DMT_EXIT)
   3019           1.1  christos         {
   3020           1.1  christos             Info = NULL;
   3021           1.1  christos             break;
   3022           1.1  christos         }
   3023           1.1  christos 
   3024           1.1  christos         /* Use caseless compare for generic keywords */
   3025           1.1  christos 
   3026           1.1  christos         if (!AcpiUtStricmp (Name, Info->Name))
   3027           1.1  christos         {
   3028           1.1  christos             break;
   3029           1.1  christos         }
   3030           1.1  christos     }
   3031           1.1  christos 
   3032           1.1  christos     return (Info);
   3033           1.1  christos }
   3034           1.1  christos 
   3035           1.1  christos 
   3036           1.1  christos /******************************************************************************
   3037           1.1  christos  *
   3038           1.1  christos  * FUNCTION:    DtCompileUefi
   3039           1.1  christos  *
   3040           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3041           1.1  christos  *
   3042           1.1  christos  * RETURN:      Status
   3043           1.1  christos  *
   3044           1.1  christos  * DESCRIPTION: Compile UEFI.
   3045           1.1  christos  *
   3046           1.1  christos  *****************************************************************************/
   3047           1.1  christos 
   3048           1.1  christos ACPI_STATUS
   3049           1.1  christos DtCompileUefi (
   3050           1.1  christos     void                    **List)
   3051           1.1  christos {
   3052           1.1  christos     ACPI_STATUS             Status;
   3053           1.1  christos     DT_SUBTABLE             *Subtable;
   3054           1.1  christos     DT_SUBTABLE             *ParentTable;
   3055           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3056           1.1  christos     UINT16                  *DataOffset;
   3057           1.1  christos 
   3058           1.1  christos 
   3059           1.1  christos     /* Compile the predefined portion of the UEFI table */
   3060           1.1  christos 
   3061           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
   3062       1.1.1.6  christos         &Subtable);
   3063           1.1  christos     if (ACPI_FAILURE (Status))
   3064           1.1  christos     {
   3065           1.1  christos         return (Status);
   3066           1.1  christos     }
   3067           1.1  christos 
   3068           1.1  christos     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
   3069           1.1  christos     *DataOffset = sizeof (ACPI_TABLE_UEFI);
   3070           1.1  christos 
   3071           1.1  christos     ParentTable = DtPeekSubtable ();
   3072           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   3073           1.1  christos 
   3074           1.1  christos     /*
   3075           1.1  christos      * Compile the "generic" portion of the UEFI table. This
   3076           1.1  christos      * part of the table is not predefined and any of the generic
   3077           1.1  christos      * operators may be used.
   3078           1.1  christos      */
   3079           1.1  christos     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
   3080           1.1  christos     return (AE_OK);
   3081           1.1  christos }
   3082           1.1  christos 
   3083           1.1  christos 
   3084           1.1  christos /******************************************************************************
   3085           1.1  christos  *
   3086      1.1.1.11  christos  * FUNCTION:    DtCompileViot
   3087           1.1  christos  *
   3088           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3089           1.1  christos  *
   3090           1.1  christos  * RETURN:      Status
   3091           1.1  christos  *
   3092      1.1.1.11  christos  * DESCRIPTION: Compile VIOT.
   3093           1.1  christos  *
   3094           1.1  christos  *****************************************************************************/
   3095           1.1  christos 
   3096           1.1  christos ACPI_STATUS
   3097      1.1.1.11  christos DtCompileViot (
   3098           1.1  christos     void                    **List)
   3099           1.1  christos {
   3100           1.1  christos     ACPI_STATUS             Status;
   3101      1.1.1.11  christos     DT_SUBTABLE             *Subtable;
   3102      1.1.1.11  christos     DT_SUBTABLE             *ParentTable;
   3103      1.1.1.11  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3104      1.1.1.11  christos     DT_FIELD                *SubtableStart;
   3105      1.1.1.11  christos     ACPI_TABLE_VIOT         *Viot;
   3106      1.1.1.11  christos     ACPI_VIOT_HEADER        *ViotHeader;
   3107      1.1.1.11  christos     ACPI_DMTABLE_INFO       *InfoTable;
   3108      1.1.1.11  christos     UINT16                  NodeCount;
   3109           1.1  christos 
   3110      1.1.1.11  christos     ParentTable = DtPeekSubtable ();
   3111           1.1  christos 
   3112      1.1.1.11  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
   3113      1.1.1.11  christos     if (ACPI_FAILURE (Status))
   3114      1.1.1.11  christos     {
   3115      1.1.1.11  christos         return (Status);
   3116      1.1.1.11  christos     }
   3117      1.1.1.11  christos     DtInsertSubtable (ParentTable, Subtable);
   3118      1.1.1.11  christos 
   3119      1.1.1.11  christos     /*
   3120      1.1.1.11  christos      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
   3121      1.1.1.11  christos      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
   3122      1.1.1.11  christos      */
   3123      1.1.1.11  christos     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
   3124      1.1.1.11  christos         sizeof (ACPI_TABLE_HEADER));
   3125      1.1.1.11  christos 
   3126      1.1.1.11  christos     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
   3127      1.1.1.11  christos 
   3128      1.1.1.11  christos     NodeCount = 0;
   3129      1.1.1.11  christos     while (*PFieldList) {
   3130      1.1.1.11  christos         SubtableStart = *PFieldList;
   3131      1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
   3132      1.1.1.11  christos             &Subtable);
   3133      1.1.1.11  christos         if (ACPI_FAILURE (Status))
   3134      1.1.1.11  christos         {
   3135      1.1.1.11  christos             return (Status);
   3136      1.1.1.11  christos         }
   3137      1.1.1.11  christos 
   3138      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   3139      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   3140      1.1.1.11  christos         DtPushSubtable (Subtable);
   3141      1.1.1.11  christos 
   3142      1.1.1.11  christos         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
   3143      1.1.1.11  christos 
   3144      1.1.1.11  christos         switch (ViotHeader->Type)
   3145      1.1.1.11  christos         {
   3146      1.1.1.11  christos         case ACPI_VIOT_NODE_PCI_RANGE:
   3147      1.1.1.11  christos 
   3148      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot1;
   3149      1.1.1.11  christos             break;
   3150      1.1.1.11  christos 
   3151      1.1.1.11  christos         case ACPI_VIOT_NODE_MMIO:
   3152      1.1.1.11  christos 
   3153      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot2;
   3154      1.1.1.11  christos             break;
   3155      1.1.1.11  christos 
   3156      1.1.1.11  christos         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
   3157      1.1.1.11  christos 
   3158      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot3;
   3159      1.1.1.11  christos             break;
   3160      1.1.1.11  christos 
   3161      1.1.1.11  christos         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
   3162      1.1.1.11  christos 
   3163      1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot4;
   3164      1.1.1.11  christos             break;
   3165      1.1.1.11  christos 
   3166      1.1.1.11  christos         default:
   3167      1.1.1.11  christos 
   3168      1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
   3169      1.1.1.11  christos             return (AE_ERROR);
   3170      1.1.1.11  christos         }
   3171      1.1.1.11  christos 
   3172      1.1.1.11  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   3173      1.1.1.11  christos         if (ACPI_FAILURE (Status))
   3174      1.1.1.11  christos         {
   3175      1.1.1.11  christos             return (Status);
   3176      1.1.1.11  christos         }
   3177      1.1.1.11  christos 
   3178      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   3179      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   3180      1.1.1.11  christos         DtPopSubtable ();
   3181      1.1.1.11  christos         NodeCount++;
   3182      1.1.1.11  christos     }
   3183      1.1.1.11  christos 
   3184      1.1.1.11  christos     Viot->NodeCount = NodeCount;
   3185      1.1.1.11  christos     return (AE_OK);
   3186           1.1  christos }
   3187           1.1  christos 
   3188           1.1  christos 
   3189           1.1  christos /******************************************************************************
   3190           1.1  christos  *
   3191           1.1  christos  * FUNCTION:    DtCompileWdat
   3192           1.1  christos  *
   3193           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3194           1.1  christos  *
   3195           1.1  christos  * RETURN:      Status
   3196           1.1  christos  *
   3197           1.1  christos  * DESCRIPTION: Compile WDAT.
   3198           1.1  christos  *
   3199           1.1  christos  *****************************************************************************/
   3200           1.1  christos 
   3201           1.1  christos ACPI_STATUS
   3202           1.1  christos DtCompileWdat (
   3203           1.1  christos     void                    **List)
   3204           1.1  christos {
   3205           1.1  christos     ACPI_STATUS             Status;
   3206           1.1  christos 
   3207           1.1  christos 
   3208           1.1  christos     Status = DtCompileTwoSubtables (List,
   3209           1.1  christos         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
   3210           1.1  christos     return (Status);
   3211           1.1  christos }
   3212           1.1  christos 
   3213           1.1  christos 
   3214           1.1  christos /******************************************************************************
   3215           1.1  christos  *
   3216           1.1  christos  * FUNCTION:    DtCompileWpbt
   3217           1.1  christos  *
   3218           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3219           1.1  christos  *
   3220           1.1  christos  * RETURN:      Status
   3221           1.1  christos  *
   3222           1.1  christos  * DESCRIPTION: Compile WPBT.
   3223           1.1  christos  *
   3224           1.1  christos  *****************************************************************************/
   3225           1.1  christos 
   3226           1.1  christos ACPI_STATUS
   3227           1.1  christos DtCompileWpbt (
   3228           1.1  christos     void                    **List)
   3229           1.1  christos {
   3230           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3231           1.1  christos     DT_SUBTABLE             *Subtable;
   3232           1.1  christos     DT_SUBTABLE             *ParentTable;
   3233           1.1  christos     ACPI_TABLE_WPBT         *Table;
   3234           1.1  christos     ACPI_STATUS             Status;
   3235           1.1  christos 
   3236           1.1  christos 
   3237           1.1  christos     /* Compile the main table */
   3238           1.1  christos 
   3239      1.1.1.13  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable);
   3240           1.1  christos     if (ACPI_FAILURE (Status))
   3241           1.1  christos     {
   3242           1.1  christos         return (Status);
   3243           1.1  christos     }
   3244           1.1  christos 
   3245           1.1  christos     ParentTable = DtPeekSubtable ();
   3246           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   3247      1.1.1.13  christos     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
   3248      1.1.1.13  christos 
   3249      1.1.1.13  christos     /*
   3250      1.1.1.13  christos      * Exit now if there are no arguments specified. This is indicated by:
   3251      1.1.1.13  christos      * The "Command-line Arguments" field has not been specified (if specified,
   3252      1.1.1.13  christos      * it will be the last field in the field list -- after the main table).
   3253      1.1.1.13  christos      * Set the Argument Length in the main table to zero.
   3254      1.1.1.13  christos      */
   3255      1.1.1.13  christos     if (!*PFieldList)
   3256      1.1.1.13  christos     {
   3257      1.1.1.13  christos         Table->ArgumentsLength = 0;
   3258      1.1.1.13  christos         return (AE_OK);
   3259      1.1.1.13  christos     }
   3260           1.1  christos 
   3261           1.1  christos     /* Compile the argument list subtable */
   3262           1.1  christos 
   3263      1.1.1.13  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable);
   3264           1.1  christos     if (ACPI_FAILURE (Status))
   3265           1.1  christos     {
   3266           1.1  christos         return (Status);
   3267           1.1  christos     }
   3268           1.1  christos 
   3269           1.1  christos     /* Extract the length of the Arguments buffer, insert into main table */
   3270           1.1  christos 
   3271      1.1.1.13  christos     Table->ArgumentsLength = (UINT16) Subtable->TotalLength;
   3272           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   3273           1.1  christos     return (AE_OK);
   3274           1.1  christos }
   3275           1.1  christos 
   3276           1.1  christos 
   3277           1.1  christos /******************************************************************************
   3278           1.1  christos  *
   3279           1.1  christos  * FUNCTION:    DtCompileXsdt
   3280           1.1  christos  *
   3281           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3282           1.1  christos  *
   3283           1.1  christos  * RETURN:      Status
   3284           1.1  christos  *
   3285           1.1  christos  * DESCRIPTION: Compile XSDT.
   3286           1.1  christos  *
   3287           1.1  christos  *****************************************************************************/
   3288           1.1  christos 
   3289           1.1  christos ACPI_STATUS
   3290           1.1  christos DtCompileXsdt (
   3291           1.1  christos     void                    **List)
   3292           1.1  christos {
   3293           1.1  christos     DT_SUBTABLE             *Subtable;
   3294           1.1  christos     DT_SUBTABLE             *ParentTable;
   3295           1.1  christos     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   3296           1.1  christos     UINT64                  Address;
   3297           1.1  christos 
   3298           1.1  christos 
   3299           1.1  christos     ParentTable = DtPeekSubtable ();
   3300           1.1  christos 
   3301           1.1  christos     while (FieldList)
   3302           1.1  christos     {
   3303           1.1  christos         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
   3304           1.1  christos 
   3305           1.1  christos         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
   3306           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   3307           1.1  christos         FieldList = FieldList->Next;
   3308           1.1  christos     }
   3309           1.1  christos 
   3310           1.1  christos     return (AE_OK);
   3311           1.1  christos }
   3312           1.1  christos 
   3313           1.1  christos 
   3314           1.1  christos /******************************************************************************
   3315           1.1  christos  *
   3316           1.1  christos  * FUNCTION:    DtCompileGeneric
   3317           1.1  christos  *
   3318           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3319           1.1  christos  *              Name                - Field name to end generic compiling
   3320           1.1  christos  *              Length              - Compiled table length to return
   3321           1.1  christos  *
   3322           1.1  christos  * RETURN:      Status
   3323           1.1  christos  *
   3324           1.1  christos  * DESCRIPTION: Compile generic unknown table.
   3325           1.1  christos  *
   3326           1.1  christos  *****************************************************************************/
   3327           1.1  christos 
   3328           1.1  christos ACPI_STATUS
   3329           1.1  christos DtCompileGeneric (
   3330           1.1  christos     void                    **List,
   3331           1.1  christos     char                    *Name,
   3332           1.1  christos     UINT32                  *Length)
   3333           1.1  christos {
   3334           1.1  christos     ACPI_STATUS             Status;
   3335           1.1  christos     DT_SUBTABLE             *Subtable;
   3336           1.1  christos     DT_SUBTABLE             *ParentTable;
   3337           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3338           1.1  christos     ACPI_DMTABLE_INFO       *Info;
   3339           1.1  christos 
   3340           1.1  christos 
   3341           1.1  christos     ParentTable = DtPeekSubtable ();
   3342           1.1  christos 
   3343           1.1  christos     /*
   3344           1.1  christos      * Compile the "generic" portion of the table. This
   3345           1.1  christos      * part of the table is not predefined and any of the generic
   3346           1.1  christos      * operators may be used.
   3347           1.1  christos      */
   3348           1.1  christos 
   3349           1.1  christos     /* Find any and all labels in the entire generic portion */
   3350           1.1  christos 
   3351           1.1  christos     DtDetectAllLabels (*PFieldList);
   3352           1.1  christos 
   3353           1.1  christos     /* Now we can actually compile the parse tree */
   3354           1.1  christos 
   3355           1.1  christos     if (Length && *Length)
   3356           1.1  christos     {
   3357           1.1  christos         *Length = 0;
   3358           1.1  christos     }
   3359           1.1  christos     while (*PFieldList)
   3360           1.1  christos     {
   3361           1.1  christos         if (Name && !strcmp ((*PFieldList)->Name, Name))
   3362           1.1  christos         {
   3363           1.1  christos             break;
   3364           1.1  christos         }
   3365           1.1  christos 
   3366           1.1  christos         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
   3367           1.1  christos         if (!Info)
   3368           1.1  christos         {
   3369       1.1.1.7  christos             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   3370           1.1  christos                 (*PFieldList)->Name);
   3371           1.1  christos             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3372       1.1.1.7  christos                 (*PFieldList), AslGbl_MsgBuffer);
   3373           1.1  christos 
   3374           1.1  christos             *PFieldList = (*PFieldList)->Next;
   3375           1.1  christos             continue;
   3376           1.1  christos         }
   3377           1.1  christos 
   3378           1.1  christos         Status = DtCompileTable (PFieldList, Info,
   3379       1.1.1.6  christos             &Subtable);
   3380           1.1  christos         if (ACPI_SUCCESS (Status))
   3381           1.1  christos         {
   3382           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   3383           1.1  christos             if (Length)
   3384           1.1  christos             {
   3385           1.1  christos                 *Length += Subtable->Length;
   3386           1.1  christos             }
   3387           1.1  christos         }
   3388           1.1  christos         else
   3389           1.1  christos         {
   3390           1.1  christos             *PFieldList = (*PFieldList)->Next;
   3391           1.1  christos 
   3392           1.1  christos             if (Status == AE_NOT_FOUND)
   3393           1.1  christos             {
   3394       1.1.1.7  christos                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   3395           1.1  christos                     (*PFieldList)->Name);
   3396           1.1  christos                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3397       1.1.1.7  christos                     (*PFieldList), AslGbl_MsgBuffer);
   3398           1.1  christos             }
   3399           1.1  christos         }
   3400           1.1  christos     }
   3401           1.1  christos 
   3402           1.1  christos     return (AE_OK);
   3403           1.1  christos }
   3404