Home | History | Annotate | Line # | Download | only in compiler
      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.19  christos /******************************************************************************
      8  1.1.1.19  christos  *
      9  1.1.1.19  christos  * 1. Copyright Notice
     10  1.1.1.19  christos  *
     11  1.1.1.20  christos  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     12       1.1  christos  * All rights reserved.
     13       1.1  christos  *
     14  1.1.1.19  christos  * 2. License
     15  1.1.1.19  christos  *
     16  1.1.1.19  christos  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  1.1.1.19  christos  * rights. You may have additional license terms from the party that provided
     18  1.1.1.19  christos  * you this software, covering your right to use that party's intellectual
     19  1.1.1.19  christos  * property rights.
     20  1.1.1.19  christos  *
     21  1.1.1.19  christos  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  1.1.1.19  christos  * copy of the source code appearing in this file ("Covered Code") an
     23  1.1.1.19  christos  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  1.1.1.19  christos  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  1.1.1.19  christos  * make derivatives, distribute, use and display any portion of the Covered
     26  1.1.1.19  christos  * Code in any form, with the right to sublicense such rights; and
     27  1.1.1.19  christos  *
     28  1.1.1.19  christos  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  1.1.1.19  christos  * license (with the right to sublicense), under only those claims of Intel
     30  1.1.1.19  christos  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  1.1.1.19  christos  * offer to sell, and import the Covered Code and derivative works thereof
     32  1.1.1.19  christos  * solely to the minimum extent necessary to exercise the above copyright
     33  1.1.1.19  christos  * license, and in no event shall the patent license extend to any additions
     34  1.1.1.19  christos  * to or modifications of the Original Intel Code. No other license or right
     35  1.1.1.19  christos  * is granted directly or by implication, estoppel or otherwise;
     36  1.1.1.19  christos  *
     37  1.1.1.19  christos  * The above copyright and patent license is granted only if the following
     38  1.1.1.19  christos  * conditions are met:
     39  1.1.1.19  christos  *
     40  1.1.1.19  christos  * 3. Conditions
     41  1.1.1.19  christos  *
     42  1.1.1.19  christos  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  1.1.1.19  christos  * Redistribution of source code of any substantial portion of the Covered
     44  1.1.1.19  christos  * Code or modification with rights to further distribute source must include
     45  1.1.1.19  christos  * the above Copyright Notice, the above License, this list of Conditions,
     46  1.1.1.19  christos  * and the following Disclaimer and Export Compliance provision. In addition,
     47  1.1.1.19  christos  * Licensee must cause all Covered Code to which Licensee contributes to
     48  1.1.1.19  christos  * contain a file documenting the changes Licensee made to create that Covered
     49  1.1.1.19  christos  * Code and the date of any change. Licensee must include in that file the
     50  1.1.1.19  christos  * documentation of any changes made by any predecessor Licensee. Licensee
     51  1.1.1.19  christos  * must include a prominent statement that the modification is derived,
     52  1.1.1.19  christos  * directly or indirectly, from Original Intel Code.
     53  1.1.1.19  christos  *
     54  1.1.1.19  christos  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  1.1.1.19  christos  * Redistribution of source code of any substantial portion of the Covered
     56  1.1.1.19  christos  * Code or modification without rights to further distribute source must
     57  1.1.1.19  christos  * include the following Disclaimer and Export Compliance provision in the
     58  1.1.1.19  christos  * documentation and/or other materials provided with distribution. In
     59  1.1.1.19  christos  * addition, Licensee may not authorize further sublicense of source of any
     60  1.1.1.19  christos  * portion of the Covered Code, and must include terms to the effect that the
     61  1.1.1.19  christos  * license from Licensee to its licensee is limited to the intellectual
     62  1.1.1.19  christos  * property embodied in the software Licensee provides to its licensee, and
     63  1.1.1.19  christos  * not to intellectual property embodied in modifications its licensee may
     64  1.1.1.19  christos  * make.
     65  1.1.1.19  christos  *
     66  1.1.1.19  christos  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  1.1.1.19  christos  * substantial portion of the Covered Code or modification must reproduce the
     68  1.1.1.19  christos  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  1.1.1.19  christos  * provision in the documentation and/or other materials provided with the
     70  1.1.1.19  christos  * distribution.
     71  1.1.1.19  christos  *
     72  1.1.1.19  christos  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  1.1.1.19  christos  * Intel Code.
     74  1.1.1.19  christos  *
     75  1.1.1.19  christos  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  1.1.1.19  christos  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  1.1.1.19  christos  * other dealings in products derived from or relating to the Covered Code
     78  1.1.1.19  christos  * without prior written authorization from Intel.
     79  1.1.1.19  christos  *
     80  1.1.1.19  christos  * 4. Disclaimer and Export Compliance
     81  1.1.1.19  christos  *
     82  1.1.1.19  christos  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  1.1.1.19  christos  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  1.1.1.19  christos  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  1.1.1.19  christos  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  1.1.1.19  christos  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  1.1.1.19  christos  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  1.1.1.19  christos  * PARTICULAR PURPOSE.
     89  1.1.1.19  christos  *
     90  1.1.1.19  christos  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  1.1.1.19  christos  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  1.1.1.19  christos  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  1.1.1.19  christos  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  1.1.1.19  christos  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  1.1.1.19  christos  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  1.1.1.19  christos  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  1.1.1.19  christos  * LIMITED REMEDY.
     98  1.1.1.19  christos  *
     99  1.1.1.19  christos  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  1.1.1.19  christos  * software or system incorporating such software without first obtaining any
    101  1.1.1.19  christos  * required license or other approval from the U. S. Department of Commerce or
    102  1.1.1.19  christos  * any other agency or department of the United States Government. In the
    103  1.1.1.19  christos  * event Licensee exports any such software from the United States or
    104  1.1.1.19  christos  * re-exports any such software from a foreign destination, Licensee shall
    105  1.1.1.19  christos  * ensure that the distribution and export/re-export of the software is in
    106  1.1.1.19  christos  * compliance with all laws, regulations, orders, or other restrictions of the
    107  1.1.1.19  christos  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  1.1.1.19  christos  * any of its subsidiaries will export/re-export any technical data, process,
    109  1.1.1.19  christos  * software, or service, directly or indirectly, to any country for which the
    110  1.1.1.19  christos  * United States government or any agency thereof requires an export license,
    111  1.1.1.19  christos  * other governmental approval, or letter of assurance, without first obtaining
    112  1.1.1.19  christos  * such license, approval or letter.
    113  1.1.1.19  christos  *
    114  1.1.1.19  christos  *****************************************************************************
    115  1.1.1.19  christos  *
    116  1.1.1.19  christos  * Alternatively, you may choose to be licensed under the terms of the
    117  1.1.1.19  christos  * following license:
    118  1.1.1.19  christos  *
    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.19  christos  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  1.1.1.19  christos  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  1.1.1.19  christos  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  1.1.1.19  christos  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  1.1.1.19  christos  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  1.1.1.19  christos  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  1.1.1.19  christos  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  1.1.1.19  christos  *
    146  1.1.1.19  christos  * Alternatively, you may choose to be licensed under the terms of the
    147  1.1.1.19  christos  * GNU General Public License ("GPL") version 2 as published by the Free
    148  1.1.1.19  christos  * Software Foundation.
    149  1.1.1.19  christos  *
    150  1.1.1.19  christos  *****************************************************************************/
    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.18  christos     ACPI_TABLE_HEADER       *Table;
    258       1.1  christos     ACPI_SUBTABLE_HEADER    *MadtHeader;
    259       1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
    260  1.1.1.18  christos     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.18  christos     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
    274  1.1.1.18  christos     Revision = Table->Revision;
    275  1.1.1.18  christos 
    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.18  christos             if (Revision > 6)
    352  1.1.1.18  christos                     InfoTable = AcpiDmTableInfoMadt11b;
    353  1.1.1.18  christos             else if (Revision == 6)
    354  1.1.1.18  christos                     InfoTable = AcpiDmTableInfoMadt11a;
    355  1.1.1.18  christos             else
    356  1.1.1.18  christos                     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.18  christos             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt14a
    372  1.1.1.18  christos                                      : 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.18  christos             InfoTable = Revision > 6 ? AcpiDmTableInfoMadt15a
    378  1.1.1.18  christos                                      : AcpiDmTableInfoMadt15;
    379  1.1.1.18  christos 
    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.18  christos         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.1.20  christos  * FUNCTION:    DtCompileMrrm
    794  1.1.1.20  christos  *
    795  1.1.1.20  christos  * PARAMETERS:  List                - Current field list pointer
    796  1.1.1.20  christos  *
    797  1.1.1.20  christos  * RETURN:      Status
    798  1.1.1.20  christos  *
    799  1.1.1.20  christos  * DESCRIPTION: Compile MRRM.
    800  1.1.1.20  christos  *
    801  1.1.1.20  christos  *****************************************************************************/
    802  1.1.1.20  christos 
    803  1.1.1.20  christos ACPI_STATUS
    804  1.1.1.20  christos DtCompileMrrm (
    805  1.1.1.20  christos     void                    **List)
    806  1.1.1.20  christos {
    807  1.1.1.20  christos     ACPI_STATUS             Status;
    808  1.1.1.20  christos     DT_SUBTABLE             *Subtable;
    809  1.1.1.20  christos     DT_SUBTABLE             *ParentTable;
    810  1.1.1.20  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    811  1.1.1.20  christos 
    812  1.1.1.20  christos     /* Main table */
    813  1.1.1.20  christos 
    814  1.1.1.20  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoMrrm,
    815  1.1.1.20  christos         &Subtable);
    816  1.1.1.20  christos     if (ACPI_FAILURE (Status))
    817  1.1.1.20  christos     {
    818  1.1.1.20  christos         return (Status);
    819  1.1.1.20  christos     }
    820  1.1.1.20  christos 
    821  1.1.1.20  christos     ParentTable = DtPeekSubtable ();
    822  1.1.1.20  christos     DtInsertSubtable (ParentTable, Subtable);
    823  1.1.1.20  christos 
    824  1.1.1.20  christos     /* Subtables (all are same type) */
    825  1.1.1.20  christos 
    826  1.1.1.20  christos     while (*PFieldList)
    827  1.1.1.20  christos     {
    828  1.1.1.20  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoMrrm0,
    829  1.1.1.20  christos             &Subtable);
    830  1.1.1.20  christos         if (ACPI_FAILURE (Status))
    831  1.1.1.20  christos         {
    832  1.1.1.20  christos             return (Status);
    833  1.1.1.20  christos         }
    834  1.1.1.20  christos 
    835  1.1.1.20  christos         DtInsertSubtable (ParentTable, Subtable);
    836  1.1.1.20  christos     }
    837  1.1.1.20  christos 
    838  1.1.1.20  christos     return (AE_OK);
    839  1.1.1.20  christos }
    840  1.1.1.20  christos 
    841  1.1.1.20  christos 
    842  1.1.1.20  christos /******************************************************************************
    843  1.1.1.20  christos  *
    844       1.1  christos  * FUNCTION:    DtCompileMsct
    845       1.1  christos  *
    846       1.1  christos  * PARAMETERS:  List                - Current field list pointer
    847       1.1  christos  *
    848       1.1  christos  * RETURN:      Status
    849       1.1  christos  *
    850       1.1  christos  * DESCRIPTION: Compile MSCT.
    851       1.1  christos  *
    852       1.1  christos  *****************************************************************************/
    853       1.1  christos 
    854       1.1  christos ACPI_STATUS
    855       1.1  christos DtCompileMsct (
    856       1.1  christos     void                    **List)
    857       1.1  christos {
    858       1.1  christos     ACPI_STATUS             Status;
    859       1.1  christos 
    860       1.1  christos 
    861       1.1  christos     Status = DtCompileTwoSubtables (List,
    862       1.1  christos         AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
    863       1.1  christos     return (Status);
    864       1.1  christos }
    865       1.1  christos 
    866       1.1  christos 
    867       1.1  christos /******************************************************************************
    868       1.1  christos  *
    869       1.1  christos  * FUNCTION:    DtCompileNfit
    870       1.1  christos  *
    871       1.1  christos  * PARAMETERS:  List                - Current field list pointer
    872       1.1  christos  *
    873       1.1  christos  * RETURN:      Status
    874       1.1  christos  *
    875       1.1  christos  * DESCRIPTION: Compile NFIT.
    876       1.1  christos  *
    877       1.1  christos  *****************************************************************************/
    878       1.1  christos 
    879       1.1  christos ACPI_STATUS
    880       1.1  christos DtCompileNfit (
    881       1.1  christos     void                    **List)
    882       1.1  christos {
    883       1.1  christos     ACPI_STATUS             Status;
    884       1.1  christos     DT_SUBTABLE             *Subtable;
    885       1.1  christos     DT_SUBTABLE             *ParentTable;
    886       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    887       1.1  christos     DT_FIELD                *SubtableStart;
    888       1.1  christos     ACPI_NFIT_HEADER        *NfitHeader;
    889       1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
    890       1.1  christos     UINT32                  Count;
    891       1.1  christos     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
    892       1.1  christos     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
    893       1.1  christos 
    894       1.1  christos 
    895       1.1  christos     /* Main table */
    896       1.1  christos 
    897       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
    898   1.1.1.6  christos         &Subtable);
    899       1.1  christos     if (ACPI_FAILURE (Status))
    900       1.1  christos     {
    901       1.1  christos         return (Status);
    902       1.1  christos     }
    903       1.1  christos 
    904       1.1  christos     ParentTable = DtPeekSubtable ();
    905       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    906       1.1  christos     DtPushSubtable (Subtable);
    907       1.1  christos 
    908       1.1  christos     /* Subtables */
    909       1.1  christos 
    910       1.1  christos     while (*PFieldList)
    911       1.1  christos     {
    912       1.1  christos         SubtableStart = *PFieldList;
    913       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
    914   1.1.1.6  christos             &Subtable);
    915       1.1  christos         if (ACPI_FAILURE (Status))
    916       1.1  christos         {
    917       1.1  christos             return (Status);
    918       1.1  christos         }
    919       1.1  christos 
    920       1.1  christos         ParentTable = DtPeekSubtable ();
    921       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    922       1.1  christos         DtPushSubtable (Subtable);
    923       1.1  christos 
    924       1.1  christos         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
    925       1.1  christos 
    926       1.1  christos         switch (NfitHeader->Type)
    927       1.1  christos         {
    928       1.1  christos         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
    929       1.1  christos 
    930       1.1  christos             InfoTable = AcpiDmTableInfoNfit0;
    931       1.1  christos             break;
    932       1.1  christos 
    933       1.1  christos         case ACPI_NFIT_TYPE_MEMORY_MAP:
    934       1.1  christos 
    935       1.1  christos             InfoTable = AcpiDmTableInfoNfit1;
    936       1.1  christos             break;
    937       1.1  christos 
    938       1.1  christos         case ACPI_NFIT_TYPE_INTERLEAVE:
    939       1.1  christos 
    940       1.1  christos             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
    941       1.1  christos             InfoTable = AcpiDmTableInfoNfit2;
    942       1.1  christos             break;
    943       1.1  christos 
    944       1.1  christos         case ACPI_NFIT_TYPE_SMBIOS:
    945       1.1  christos 
    946       1.1  christos             InfoTable = AcpiDmTableInfoNfit3;
    947       1.1  christos             break;
    948       1.1  christos 
    949       1.1  christos         case ACPI_NFIT_TYPE_CONTROL_REGION:
    950       1.1  christos 
    951       1.1  christos             InfoTable = AcpiDmTableInfoNfit4;
    952       1.1  christos             break;
    953       1.1  christos 
    954       1.1  christos         case ACPI_NFIT_TYPE_DATA_REGION:
    955       1.1  christos 
    956       1.1  christos             InfoTable = AcpiDmTableInfoNfit5;
    957       1.1  christos             break;
    958       1.1  christos 
    959       1.1  christos         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
    960       1.1  christos 
    961       1.1  christos             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
    962       1.1  christos             InfoTable = AcpiDmTableInfoNfit6;
    963       1.1  christos             break;
    964       1.1  christos 
    965   1.1.1.5  christos         case ACPI_NFIT_TYPE_CAPABILITIES:
    966   1.1.1.5  christos 
    967   1.1.1.5  christos             InfoTable = AcpiDmTableInfoNfit7;
    968   1.1.1.5  christos             break;
    969   1.1.1.5  christos 
    970       1.1  christos         default:
    971       1.1  christos 
    972       1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
    973       1.1  christos             return (AE_ERROR);
    974       1.1  christos         }
    975       1.1  christos 
    976   1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    977       1.1  christos         if (ACPI_FAILURE (Status))
    978       1.1  christos         {
    979       1.1  christos             return (Status);
    980       1.1  christos         }
    981       1.1  christos 
    982       1.1  christos         ParentTable = DtPeekSubtable ();
    983       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    984       1.1  christos         DtPopSubtable ();
    985       1.1  christos 
    986       1.1  christos         switch (NfitHeader->Type)
    987       1.1  christos         {
    988       1.1  christos         case ACPI_NFIT_TYPE_INTERLEAVE:
    989       1.1  christos 
    990       1.1  christos             Count = 0;
    991       1.1  christos             DtPushSubtable (Subtable);
    992       1.1  christos             while (*PFieldList)
    993       1.1  christos             {
    994       1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
    995   1.1.1.6  christos                     &Subtable);
    996       1.1  christos                 if (ACPI_FAILURE (Status))
    997       1.1  christos                 {
    998       1.1  christos                     return (Status);
    999       1.1  christos                 }
   1000       1.1  christos 
   1001       1.1  christos                 if (!Subtable)
   1002       1.1  christos                 {
   1003       1.1  christos                     DtPopSubtable ();
   1004       1.1  christos                     break;
   1005       1.1  christos                 }
   1006       1.1  christos 
   1007       1.1  christos                 ParentTable = DtPeekSubtable ();
   1008       1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   1009       1.1  christos                 Count++;
   1010       1.1  christos             }
   1011       1.1  christos 
   1012       1.1  christos             Interleave->LineCount = Count;
   1013       1.1  christos             break;
   1014       1.1  christos 
   1015       1.1  christos         case ACPI_NFIT_TYPE_SMBIOS:
   1016       1.1  christos 
   1017       1.1  christos             if (*PFieldList)
   1018       1.1  christos             {
   1019       1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
   1020   1.1.1.6  christos                     &Subtable);
   1021       1.1  christos                 if (ACPI_FAILURE (Status))
   1022       1.1  christos                 {
   1023       1.1  christos                     return (Status);
   1024       1.1  christos                 }
   1025       1.1  christos 
   1026       1.1  christos                 if (Subtable)
   1027       1.1  christos                 {
   1028       1.1  christos                     DtInsertSubtable (ParentTable, Subtable);
   1029       1.1  christos                 }
   1030       1.1  christos             }
   1031       1.1  christos             break;
   1032       1.1  christos 
   1033       1.1  christos         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   1034       1.1  christos 
   1035       1.1  christos             Count = 0;
   1036       1.1  christos             DtPushSubtable (Subtable);
   1037       1.1  christos             while (*PFieldList)
   1038       1.1  christos             {
   1039       1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
   1040   1.1.1.6  christos                     &Subtable);
   1041       1.1  christos                 if (ACPI_FAILURE (Status))
   1042       1.1  christos                 {
   1043       1.1  christos                     return (Status);
   1044       1.1  christos                 }
   1045       1.1  christos 
   1046       1.1  christos                 if (!Subtable)
   1047       1.1  christos                 {
   1048       1.1  christos                     DtPopSubtable ();
   1049       1.1  christos                     break;
   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                 Count++;
   1055       1.1  christos             }
   1056       1.1  christos 
   1057       1.1  christos             Hint->HintCount = (UINT16) Count;
   1058       1.1  christos             break;
   1059       1.1  christos 
   1060       1.1  christos         default:
   1061       1.1  christos             break;
   1062       1.1  christos         }
   1063       1.1  christos     }
   1064       1.1  christos 
   1065       1.1  christos     return (AE_OK);
   1066       1.1  christos }
   1067       1.1  christos 
   1068       1.1  christos 
   1069       1.1  christos /******************************************************************************
   1070       1.1  christos  *
   1071       1.1  christos  * FUNCTION:    DtCompilePcct
   1072       1.1  christos  *
   1073       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1074       1.1  christos  *
   1075       1.1  christos  * RETURN:      Status
   1076       1.1  christos  *
   1077       1.1  christos  * DESCRIPTION: Compile PCCT.
   1078       1.1  christos  *
   1079       1.1  christos  *****************************************************************************/
   1080       1.1  christos 
   1081       1.1  christos ACPI_STATUS
   1082       1.1  christos DtCompilePcct (
   1083       1.1  christos     void                    **List)
   1084       1.1  christos {
   1085       1.1  christos     ACPI_STATUS             Status;
   1086       1.1  christos     DT_SUBTABLE             *Subtable;
   1087       1.1  christos     DT_SUBTABLE             *ParentTable;
   1088       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1089       1.1  christos     DT_FIELD                *SubtableStart;
   1090       1.1  christos     ACPI_SUBTABLE_HEADER    *PcctHeader;
   1091       1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1092       1.1  christos 
   1093       1.1  christos 
   1094       1.1  christos     /* Main table */
   1095       1.1  christos 
   1096       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
   1097   1.1.1.6  christos         &Subtable);
   1098       1.1  christos     if (ACPI_FAILURE (Status))
   1099       1.1  christos     {
   1100       1.1  christos         return (Status);
   1101       1.1  christos     }
   1102       1.1  christos 
   1103       1.1  christos     ParentTable = DtPeekSubtable ();
   1104       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1105       1.1  christos 
   1106       1.1  christos     /* Subtables */
   1107       1.1  christos 
   1108       1.1  christos     while (*PFieldList)
   1109       1.1  christos     {
   1110       1.1  christos         SubtableStart = *PFieldList;
   1111       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
   1112   1.1.1.6  christos             &Subtable);
   1113       1.1  christos         if (ACPI_FAILURE (Status))
   1114       1.1  christos         {
   1115       1.1  christos             return (Status);
   1116       1.1  christos         }
   1117       1.1  christos 
   1118       1.1  christos         ParentTable = DtPeekSubtable ();
   1119       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1120       1.1  christos         DtPushSubtable (Subtable);
   1121       1.1  christos 
   1122       1.1  christos         PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1123       1.1  christos 
   1124       1.1  christos         switch (PcctHeader->Type)
   1125       1.1  christos         {
   1126       1.1  christos         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   1127       1.1  christos 
   1128       1.1  christos             InfoTable = AcpiDmTableInfoPcct0;
   1129       1.1  christos             break;
   1130       1.1  christos 
   1131       1.1  christos         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   1132       1.1  christos 
   1133       1.1  christos             InfoTable = AcpiDmTableInfoPcct1;
   1134       1.1  christos             break;
   1135       1.1  christos 
   1136   1.1.1.2  christos         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
   1137   1.1.1.2  christos 
   1138   1.1.1.2  christos             InfoTable = AcpiDmTableInfoPcct2;
   1139   1.1.1.2  christos             break;
   1140   1.1.1.2  christos 
   1141   1.1.1.4  christos         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
   1142   1.1.1.4  christos 
   1143   1.1.1.4  christos             InfoTable = AcpiDmTableInfoPcct3;
   1144   1.1.1.4  christos             break;
   1145   1.1.1.4  christos 
   1146   1.1.1.4  christos         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
   1147   1.1.1.4  christos 
   1148   1.1.1.4  christos             InfoTable = AcpiDmTableInfoPcct4;
   1149   1.1.1.4  christos             break;
   1150   1.1.1.4  christos 
   1151  1.1.1.11  christos         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
   1152  1.1.1.11  christos 
   1153  1.1.1.11  christos             InfoTable = AcpiDmTableInfoPcct5;
   1154  1.1.1.11  christos             break;
   1155  1.1.1.11  christos 
   1156       1.1  christos         default:
   1157       1.1  christos 
   1158       1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
   1159       1.1  christos             return (AE_ERROR);
   1160       1.1  christos         }
   1161       1.1  christos 
   1162   1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1163       1.1  christos         if (ACPI_FAILURE (Status))
   1164       1.1  christos         {
   1165       1.1  christos             return (Status);
   1166       1.1  christos         }
   1167       1.1  christos 
   1168       1.1  christos         ParentTable = DtPeekSubtable ();
   1169       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1170       1.1  christos         DtPopSubtable ();
   1171       1.1  christos     }
   1172       1.1  christos 
   1173       1.1  christos     return (AE_OK);
   1174       1.1  christos }
   1175       1.1  christos 
   1176       1.1  christos 
   1177       1.1  christos /******************************************************************************
   1178       1.1  christos  *
   1179   1.1.1.5  christos  * FUNCTION:    DtCompilePdtt
   1180   1.1.1.5  christos  *
   1181   1.1.1.5  christos  * PARAMETERS:  List                - Current field list pointer
   1182   1.1.1.5  christos  *
   1183   1.1.1.5  christos  * RETURN:      Status
   1184   1.1.1.5  christos  *
   1185   1.1.1.5  christos  * DESCRIPTION: Compile PDTT.
   1186   1.1.1.5  christos  *
   1187   1.1.1.5  christos  *****************************************************************************/
   1188   1.1.1.5  christos 
   1189   1.1.1.5  christos ACPI_STATUS
   1190   1.1.1.5  christos DtCompilePdtt (
   1191   1.1.1.5  christos     void                    **List)
   1192   1.1.1.5  christos {
   1193   1.1.1.5  christos     ACPI_STATUS             Status;
   1194   1.1.1.5  christos     DT_SUBTABLE             *Subtable;
   1195   1.1.1.5  christos     DT_SUBTABLE             *ParentTable;
   1196   1.1.1.5  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1197   1.1.1.5  christos     ACPI_TABLE_PDTT         *PdttHeader;
   1198   1.1.1.5  christos     UINT32                  Count = 0;
   1199   1.1.1.5  christos 
   1200   1.1.1.5  christos 
   1201   1.1.1.5  christos     /* Main table */
   1202   1.1.1.5  christos 
   1203   1.1.1.6  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable);
   1204   1.1.1.5  christos     if (ACPI_FAILURE (Status))
   1205   1.1.1.5  christos     {
   1206   1.1.1.5  christos         return (Status);
   1207   1.1.1.5  christos     }
   1208   1.1.1.5  christos 
   1209   1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   1210   1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   1211   1.1.1.5  christos 
   1212   1.1.1.5  christos     PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
   1213   1.1.1.5  christos     PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
   1214   1.1.1.5  christos 
   1215   1.1.1.5  christos     /* There is only one type of subtable at this time, no need to decode */
   1216   1.1.1.5  christos 
   1217   1.1.1.5  christos     while (*PFieldList)
   1218   1.1.1.5  christos     {
   1219   1.1.1.5  christos         /* List of subchannel IDs, each 2 bytes */
   1220   1.1.1.5  christos 
   1221   1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
   1222   1.1.1.6  christos             &Subtable);
   1223   1.1.1.5  christos         if (ACPI_FAILURE (Status))
   1224   1.1.1.5  christos         {
   1225   1.1.1.5  christos             return (Status);
   1226   1.1.1.5  christos         }
   1227   1.1.1.5  christos 
   1228   1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   1229   1.1.1.5  christos         Count++;
   1230   1.1.1.5  christos     }
   1231   1.1.1.5  christos 
   1232   1.1.1.5  christos     PdttHeader->TriggerCount = (UINT8) Count;
   1233   1.1.1.5  christos     return (AE_OK);
   1234   1.1.1.5  christos }
   1235   1.1.1.5  christos 
   1236   1.1.1.5  christos 
   1237   1.1.1.5  christos /******************************************************************************
   1238   1.1.1.5  christos  *
   1239  1.1.1.11  christos  * FUNCTION:    DtCompilePhat
   1240  1.1.1.11  christos  *
   1241  1.1.1.11  christos  * PARAMETERS:  List                - Current field list pointer
   1242  1.1.1.11  christos  *
   1243  1.1.1.11  christos  * RETURN:      Status
   1244  1.1.1.11  christos  *
   1245  1.1.1.11  christos  * DESCRIPTION: Compile Phat.
   1246  1.1.1.11  christos  *
   1247  1.1.1.11  christos  *****************************************************************************/
   1248  1.1.1.11  christos 
   1249  1.1.1.11  christos ACPI_STATUS
   1250  1.1.1.11  christos DtCompilePhat (
   1251  1.1.1.11  christos     void                    **List)
   1252  1.1.1.11  christos {
   1253  1.1.1.11  christos     ACPI_STATUS             Status = AE_OK;
   1254  1.1.1.11  christos     DT_SUBTABLE             *Subtable;
   1255  1.1.1.11  christos     DT_SUBTABLE             *ParentTable;
   1256  1.1.1.11  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1257  1.1.1.11  christos     ACPI_PHAT_HEADER        *PhatHeader;
   1258  1.1.1.11  christos     ACPI_DMTABLE_INFO       *Info;
   1259  1.1.1.11  christos     ACPI_PHAT_VERSION_DATA  *VersionData;
   1260  1.1.1.16  christos     UINT32                  DeviceDataLength;
   1261  1.1.1.11  christos     UINT32                  RecordCount;
   1262  1.1.1.16  christos     DT_FIELD                *DataOffsetField;
   1263  1.1.1.16  christos     DT_FIELD                *DevicePathField;
   1264  1.1.1.16  christos     UINT32                  TableOffset = 0;
   1265  1.1.1.16  christos     UINT32                  DataOffsetValue;
   1266  1.1.1.16  christos     UINT32                  i;
   1267  1.1.1.11  christos 
   1268  1.1.1.11  christos 
   1269  1.1.1.16  christos     /* The table consists of subtables */
   1270  1.1.1.11  christos 
   1271  1.1.1.11  christos     while (*PFieldList)
   1272  1.1.1.11  christos     {
   1273  1.1.1.16  christos         /* Compile the common subtable header */
   1274  1.1.1.16  christos 
   1275  1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
   1276  1.1.1.11  christos         if (ACPI_FAILURE (Status))
   1277  1.1.1.11  christos         {
   1278  1.1.1.11  christos             return (Status);
   1279  1.1.1.11  christos         }
   1280  1.1.1.11  christos 
   1281  1.1.1.16  christos         TableOffset += Subtable->Length;
   1282  1.1.1.16  christos         DbgPrint (ASL_DEBUG_OUTPUT, "0 Subtable->Length: %X\n", Subtable->Length);
   1283  1.1.1.16  christos 
   1284  1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   1285  1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   1286  1.1.1.11  christos         DtPushSubtable (Subtable);
   1287  1.1.1.11  christos 
   1288  1.1.1.11  christos         PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
   1289  1.1.1.11  christos 
   1290  1.1.1.11  christos         switch (PhatHeader->Type)
   1291  1.1.1.11  christos         {
   1292  1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1293  1.1.1.11  christos 
   1294  1.1.1.16  christos             /* Compile the middle portion of the Firmware Version Data */
   1295  1.1.1.16  christos 
   1296  1.1.1.11  christos             Info = AcpiDmTableInfoPhat0;
   1297  1.1.1.11  christos             PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
   1298  1.1.1.16  christos             DataOffsetField = NULL;
   1299  1.1.1.11  christos             break;
   1300  1.1.1.11  christos 
   1301  1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1302  1.1.1.11  christos 
   1303  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "1 Offset: %X, Name: \"%s\" Length: %X\n",
   1304  1.1.1.16  christos                 (*PFieldList)->TableOffset, (*PFieldList)->Name, Subtable->Length);
   1305  1.1.1.16  christos 
   1306  1.1.1.16  christos             DataOffsetField = *PFieldList;
   1307  1.1.1.16  christos 
   1308  1.1.1.16  christos             /* Walk the field list to get to the "Device-specific data Offset" field */
   1309  1.1.1.16  christos 
   1310  1.1.1.16  christos             TableOffset = sizeof (ACPI_PHAT_HEALTH_DATA);
   1311  1.1.1.16  christos             for (i = 0; i < 3; i++)
   1312  1.1.1.16  christos             {
   1313  1.1.1.16  christos                 DataOffsetField = DataOffsetField->Next;
   1314  1.1.1.16  christos                 DbgPrint (ASL_DEBUG_OUTPUT, "2 Offset: %X, Name: \"%s\" Length: %X Value: %s:\n",
   1315  1.1.1.16  christos                     TableOffset, DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
   1316  1.1.1.16  christos             }
   1317  1.1.1.16  christos 
   1318  1.1.1.16  christos             /* Convert DataOffsetField->Value (a char * string) to an integer value */
   1319  1.1.1.16  christos 
   1320  1.1.1.16  christos             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
   1321  1.1.1.16  christos 
   1322  1.1.1.16  christos             /*
   1323  1.1.1.16  christos              * Get the next field (Device Path):
   1324  1.1.1.16  christos              * DataOffsetField points to "Device-Specific Offset", next field is
   1325  1.1.1.16  christos              * "Device Path".
   1326  1.1.1.16  christos              */
   1327  1.1.1.16  christos             DevicePathField = DataOffsetField->Next;
   1328  1.1.1.16  christos 
   1329  1.1.1.16  christos             /* Compute the size of the input ASCII string as a unicode string (*2 + 2) */
   1330  1.1.1.16  christos 
   1331  1.1.1.16  christos             DevicePathField->StringLength = (strlen ((const char *) DevicePathField->Value) * 2) + 2;
   1332  1.1.1.16  christos             TableOffset += DevicePathField->StringLength;
   1333  1.1.1.16  christos 
   1334  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "3 Offset: %X, Length: %X devicepathLength: %X\n",
   1335  1.1.1.16  christos                 TableOffset, Subtable->Length, DevicePathField->StringLength);
   1336  1.1.1.16  christos 
   1337  1.1.1.16  christos             /* Set the DataOffsetField to the current TableOffset */
   1338  1.1.1.16  christos             /* Must set the DataOffsetField here (not later) */
   1339  1.1.1.16  christos 
   1340  1.1.1.16  christos             if (DataOffsetValue != 0)
   1341  1.1.1.16  christos             {
   1342  1.1.1.16  christos                 snprintf (DataOffsetField->Value, Subtable->Length, "%X", TableOffset);
   1343  1.1.1.16  christos             }
   1344  1.1.1.16  christos 
   1345  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "4 Offset: %X, Length: %X\n", TableOffset, Subtable->Length);
   1346  1.1.1.16  christos 
   1347  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "5 TableOffset: %X, DataOffsetField->StringLength: "
   1348  1.1.1.16  christos                 "%X DevicePathField Length: %X DevicePathField->Value: %s, DataOffsetField->Value: %s DataOffsetField->ByteOffset %X\n",
   1349  1.1.1.16  christos                 TableOffset, DataOffsetField->StringLength, DevicePathField->StringLength,
   1350  1.1.1.16  christos                 DevicePathField->Value, DataOffsetField->Value, DataOffsetField->ByteOffset);
   1351  1.1.1.16  christos 
   1352  1.1.1.16  christos             /* Compile the middle portion of the Health Data Record */
   1353  1.1.1.16  christos 
   1354  1.1.1.11  christos             Info = AcpiDmTableInfoPhat1;
   1355  1.1.1.11  christos             PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
   1356  1.1.1.11  christos             break;
   1357  1.1.1.11  christos 
   1358  1.1.1.11  christos         default:
   1359  1.1.1.11  christos 
   1360  1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
   1361  1.1.1.11  christos             return (AE_ERROR);
   1362  1.1.1.11  christos         }
   1363  1.1.1.11  christos 
   1364  1.1.1.16  christos         /* Compile either the Version Data or the Health Data */
   1365  1.1.1.16  christos 
   1366  1.1.1.11  christos         Status = DtCompileTable (PFieldList, Info, &Subtable);
   1367  1.1.1.11  christos         if (ACPI_FAILURE (Status))
   1368  1.1.1.11  christos         {
   1369  1.1.1.11  christos             return (Status);
   1370  1.1.1.11  christos         }
   1371  1.1.1.11  christos 
   1372  1.1.1.16  christos         DbgPrint (ASL_DEBUG_OUTPUT, "6 Offset: %X, Name: \"%s\" SubtableLength: %X\n",
   1373  1.1.1.16  christos             TableOffset /* - StartTableOffset*/, (*PFieldList)->Name, Subtable->Length);
   1374  1.1.1.16  christos 
   1375  1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   1376  1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   1377  1.1.1.11  christos 
   1378  1.1.1.11  christos         switch (PhatHeader->Type)
   1379  1.1.1.11  christos         {
   1380  1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   1381  1.1.1.11  christos 
   1382  1.1.1.11  christos             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
   1383  1.1.1.11  christos                 (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
   1384  1.1.1.11  christos             RecordCount = VersionData->ElementCount;
   1385  1.1.1.11  christos 
   1386  1.1.1.16  christos             /* Compile all of the Version Elements */
   1387  1.1.1.16  christos 
   1388  1.1.1.11  christos             while (RecordCount)
   1389  1.1.1.11  christos             {
   1390  1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
   1391  1.1.1.11  christos                     &Subtable);
   1392  1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   1393  1.1.1.11  christos                 {
   1394  1.1.1.11  christos                     return (Status);
   1395  1.1.1.11  christos                 }
   1396  1.1.1.16  christos 
   1397  1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   1398  1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   1399  1.1.1.11  christos 
   1400  1.1.1.16  christos                 TableOffset += Subtable->Length;
   1401  1.1.1.11  christos                 RecordCount--;
   1402  1.1.1.11  christos                 PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
   1403  1.1.1.11  christos             }
   1404  1.1.1.16  christos 
   1405  1.1.1.16  christos             DtPopSubtable ();
   1406  1.1.1.11  christos             break;
   1407  1.1.1.11  christos 
   1408  1.1.1.11  christos         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   1409  1.1.1.11  christos 
   1410  1.1.1.16  christos             /* Compile the Device Path */
   1411  1.1.1.16  christos 
   1412  1.1.1.16  christos             DeviceDataLength = Subtable->Length;
   1413  1.1.1.16  christos             TableOffset += Subtable->Length;
   1414  1.1.1.16  christos 
   1415  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "7 Device Path Length: %X FieldName: \"%s\" FieldLength: "
   1416  1.1.1.16  christos                 "%s FieldValue: %s SubtableLength: %X TableOffset: %X\n", DeviceDataLength,
   1417  1.1.1.16  christos                 (*PFieldList)->Name, DataOffsetField->Value, (*PFieldList)->Value,
   1418  1.1.1.16  christos                 Subtable->Length, TableOffset);
   1419  1.1.1.11  christos 
   1420  1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
   1421  1.1.1.11  christos             if (ACPI_FAILURE (Status))
   1422  1.1.1.11  christos             {
   1423  1.1.1.11  christos                 return (Status);
   1424  1.1.1.11  christos             }
   1425  1.1.1.11  christos             ParentTable = DtPeekSubtable ();
   1426  1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
   1427  1.1.1.11  christos 
   1428  1.1.1.16  christos             /* *PFieldList will be null if previous field was at the end-of-ParseTree (EOF) */
   1429  1.1.1.16  christos 
   1430  1.1.1.16  christos             if (!*PFieldList)
   1431  1.1.1.16  christos             {
   1432  1.1.1.16  christos                 DbgPrint (ASL_DEBUG_OUTPUT, "8 Exit on end-of-ParseTree\n");
   1433  1.1.1.16  christos                 return (AE_OK);
   1434  1.1.1.16  christos             }
   1435  1.1.1.16  christos 
   1436  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "9 Device Data Length: %X FieldName: \"%s"
   1437  1.1.1.16  christos                 " TableOffset: %X FieldLength: %X Field Value: %s SubtableLength: %X\n",
   1438  1.1.1.16  christos                 DeviceDataLength, (*PFieldList)->Name, TableOffset,
   1439  1.1.1.16  christos                 (*PFieldList)->StringLength, (*PFieldList)->Value, Subtable->Length);
   1440  1.1.1.16  christos 
   1441  1.1.1.11  christos             PhatHeader->Length += (UINT16) Subtable->Length;
   1442  1.1.1.11  christos 
   1443  1.1.1.16  christos             /* Convert DataOffsetField->Value (a hex char * string) to an integer value */
   1444  1.1.1.11  christos 
   1445  1.1.1.16  christos             sscanf (DataOffsetField->Value, "%X", &DataOffsetValue);
   1446  1.1.1.16  christos 
   1447  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "10 Device-Specific Offset: %X Table Offset: %X\n",
   1448  1.1.1.16  christos                 DataOffsetValue, TableOffset);
   1449  1.1.1.16  christos             if (DataOffsetValue != 0)
   1450  1.1.1.11  christos             {
   1451  1.1.1.16  christos                 /* Compile Device-Specific Data - only if the Data Offset is non-zero */
   1452  1.1.1.16  christos 
   1453  1.1.1.16  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
   1454  1.1.1.16  christos                 if (ACPI_FAILURE (Status))
   1455  1.1.1.16  christos                 {
   1456  1.1.1.16  christos                     return (Status);
   1457  1.1.1.16  christos                 }
   1458  1.1.1.16  christos 
   1459  1.1.1.16  christos                 DbgPrint (ASL_DEBUG_OUTPUT, "11 Subtable: %p Table Offset: %X\n",
   1460  1.1.1.16  christos                     Subtable, TableOffset);
   1461  1.1.1.16  christos                 if (Subtable)
   1462  1.1.1.16  christos                 {
   1463  1.1.1.16  christos                     DbgPrint (ASL_DEBUG_OUTPUT, "12 Device Specific Offset: "
   1464  1.1.1.16  christos                         "%X FieldName \"%s\" SubtableLength %X\n",
   1465  1.1.1.16  christos                         DeviceDataLength, DataOffsetField->Name, Subtable->Length);
   1466  1.1.1.16  christos 
   1467  1.1.1.16  christos                     DeviceDataLength += Subtable->Length;
   1468  1.1.1.16  christos 
   1469  1.1.1.16  christos                     ParentTable = DtPeekSubtable ();
   1470  1.1.1.16  christos                     DtInsertSubtable (ParentTable, Subtable);
   1471  1.1.1.16  christos 
   1472  1.1.1.16  christos                     PhatHeader->Length += (UINT16) Subtable->Length;
   1473  1.1.1.16  christos                 }
   1474  1.1.1.11  christos             }
   1475  1.1.1.11  christos 
   1476  1.1.1.16  christos             DtPopSubtable ();
   1477  1.1.1.11  christos 
   1478  1.1.1.16  christos             DbgPrint (ASL_DEBUG_OUTPUT, "13 FieldName: \"%s\" FieldLength: %X Field Value: %s\n",
   1479  1.1.1.16  christos                 DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value);
   1480  1.1.1.11  christos             break;
   1481  1.1.1.11  christos 
   1482  1.1.1.11  christos         default:
   1483  1.1.1.11  christos 
   1484  1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
   1485  1.1.1.11  christos             return (AE_ERROR);
   1486  1.1.1.11  christos         }
   1487  1.1.1.11  christos     }
   1488  1.1.1.11  christos 
   1489  1.1.1.11  christos     return (Status);
   1490  1.1.1.11  christos }
   1491  1.1.1.11  christos 
   1492  1.1.1.11  christos 
   1493  1.1.1.11  christos /******************************************************************************
   1494  1.1.1.11  christos  *
   1495       1.1  christos  * FUNCTION:    DtCompilePmtt
   1496       1.1  christos  *
   1497       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1498       1.1  christos  *
   1499       1.1  christos  * RETURN:      Status
   1500       1.1  christos  *
   1501       1.1  christos  * DESCRIPTION: Compile PMTT.
   1502       1.1  christos  *
   1503       1.1  christos  *****************************************************************************/
   1504       1.1  christos 
   1505       1.1  christos ACPI_STATUS
   1506       1.1  christos DtCompilePmtt (
   1507       1.1  christos     void                    **List)
   1508       1.1  christos {
   1509       1.1  christos     ACPI_STATUS             Status;
   1510       1.1  christos     DT_SUBTABLE             *Subtable;
   1511       1.1  christos     DT_SUBTABLE             *ParentTable;
   1512       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1513       1.1  christos     DT_FIELD                *SubtableStart;
   1514  1.1.1.11  christos     UINT16                  Type;
   1515       1.1  christos 
   1516       1.1  christos 
   1517       1.1  christos     /* Main table */
   1518       1.1  christos 
   1519   1.1.1.6  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable);
   1520       1.1  christos     if (ACPI_FAILURE (Status))
   1521       1.1  christos     {
   1522       1.1  christos         return (Status);
   1523       1.1  christos     }
   1524       1.1  christos 
   1525       1.1  christos     ParentTable = DtPeekSubtable ();
   1526       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1527       1.1  christos     DtPushSubtable (Subtable);
   1528       1.1  christos 
   1529  1.1.1.11  christos     /* Subtables */
   1530  1.1.1.11  christos 
   1531       1.1  christos     while (*PFieldList)
   1532       1.1  christos     {
   1533       1.1  christos         SubtableStart = *PFieldList;
   1534  1.1.1.11  christos         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
   1535       1.1  christos 
   1536  1.1.1.11  christos         switch (Type)
   1537       1.1  christos         {
   1538       1.1  christos         case ACPI_PMTT_TYPE_SOCKET:
   1539       1.1  christos 
   1540       1.1  christos             /* Subtable: Socket Structure */
   1541       1.1  christos 
   1542  1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
   1543  1.1.1.11  christos 
   1544       1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
   1545   1.1.1.6  christos                 &Subtable);
   1546       1.1  christos             if (ACPI_FAILURE (Status))
   1547       1.1  christos             {
   1548       1.1  christos                 return (Status);
   1549       1.1  christos             }
   1550       1.1  christos 
   1551       1.1  christos             break;
   1552       1.1  christos 
   1553       1.1  christos         case ACPI_PMTT_TYPE_CONTROLLER:
   1554       1.1  christos 
   1555       1.1  christos             /* Subtable: Memory Controller Structure */
   1556       1.1  christos 
   1557  1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
   1558  1.1.1.11  christos 
   1559       1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
   1560   1.1.1.6  christos                 &Subtable);
   1561       1.1  christos             if (ACPI_FAILURE (Status))
   1562       1.1  christos             {
   1563       1.1  christos                 return (Status);
   1564       1.1  christos             }
   1565       1.1  christos 
   1566  1.1.1.11  christos             break;
   1567       1.1  christos 
   1568  1.1.1.11  christos         case ACPI_PMTT_TYPE_DIMM:
   1569       1.1  christos 
   1570  1.1.1.11  christos             /* Subtable: Physical Component (DIMM) Structure */
   1571       1.1  christos 
   1572  1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
   1573  1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
   1574  1.1.1.11  christos                 &Subtable);
   1575  1.1.1.11  christos             if (ACPI_FAILURE (Status))
   1576  1.1.1.11  christos             {
   1577  1.1.1.11  christos                 return (Status);
   1578       1.1  christos             }
   1579  1.1.1.11  christos 
   1580       1.1  christos             break;
   1581       1.1  christos 
   1582  1.1.1.11  christos         case ACPI_PMTT_TYPE_VENDOR:
   1583       1.1  christos 
   1584  1.1.1.11  christos             /* Subtable: Vendor-specific Structure */
   1585       1.1  christos 
   1586  1.1.1.11  christos             DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
   1587  1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
   1588   1.1.1.6  christos                 &Subtable);
   1589       1.1  christos             if (ACPI_FAILURE (Status))
   1590       1.1  christos             {
   1591       1.1  christos                 return (Status);
   1592       1.1  christos             }
   1593       1.1  christos 
   1594       1.1  christos             break;
   1595       1.1  christos 
   1596       1.1  christos         default:
   1597       1.1  christos 
   1598       1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
   1599       1.1  christos             return (AE_ERROR);
   1600       1.1  christos         }
   1601  1.1.1.11  christos 
   1602  1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   1603       1.1  christos     }
   1604       1.1  christos 
   1605       1.1  christos     return (Status);
   1606       1.1  christos }
   1607       1.1  christos 
   1608       1.1  christos 
   1609       1.1  christos /******************************************************************************
   1610       1.1  christos  *
   1611   1.1.1.4  christos  * FUNCTION:    DtCompilePptt
   1612   1.1.1.4  christos  *
   1613   1.1.1.4  christos  * PARAMETERS:  List                - Current field list pointer
   1614   1.1.1.4  christos  *
   1615   1.1.1.4  christos  * RETURN:      Status
   1616   1.1.1.4  christos  *
   1617   1.1.1.4  christos  * DESCRIPTION: Compile PPTT.
   1618   1.1.1.4  christos  *
   1619   1.1.1.4  christos  *****************************************************************************/
   1620   1.1.1.4  christos 
   1621   1.1.1.4  christos ACPI_STATUS
   1622   1.1.1.4  christos DtCompilePptt (
   1623   1.1.1.4  christos     void                    **List)
   1624   1.1.1.4  christos {
   1625   1.1.1.4  christos     ACPI_STATUS             Status;
   1626   1.1.1.4  christos     ACPI_SUBTABLE_HEADER    *PpttHeader;
   1627   1.1.1.4  christos     ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
   1628   1.1.1.4  christos     DT_SUBTABLE             *Subtable;
   1629   1.1.1.4  christos     DT_SUBTABLE             *ParentTable;
   1630   1.1.1.4  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1631   1.1.1.4  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1632   1.1.1.4  christos     DT_FIELD                *SubtableStart;
   1633  1.1.1.11  christos     ACPI_TABLE_HEADER       *PpttAcpiHeader;
   1634   1.1.1.4  christos 
   1635   1.1.1.4  christos 
   1636   1.1.1.4  christos     ParentTable = DtPeekSubtable ();
   1637   1.1.1.4  christos     while (*PFieldList)
   1638   1.1.1.4  christos     {
   1639   1.1.1.4  christos         SubtableStart = *PFieldList;
   1640   1.1.1.4  christos 
   1641   1.1.1.4  christos         /* Compile PPTT subtable header */
   1642   1.1.1.4  christos 
   1643   1.1.1.4  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
   1644   1.1.1.6  christos             &Subtable);
   1645   1.1.1.4  christos         if (ACPI_FAILURE (Status))
   1646   1.1.1.4  christos         {
   1647   1.1.1.4  christos             return (Status);
   1648   1.1.1.4  christos         }
   1649   1.1.1.4  christos         DtInsertSubtable (ParentTable, Subtable);
   1650   1.1.1.4  christos         PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1651   1.1.1.4  christos         PpttHeader->Length = (UINT8)(Subtable->Length);
   1652   1.1.1.4  christos 
   1653   1.1.1.4  christos         switch (PpttHeader->Type)
   1654   1.1.1.4  christos         {
   1655   1.1.1.4  christos         case ACPI_PPTT_TYPE_PROCESSOR:
   1656   1.1.1.4  christos 
   1657   1.1.1.4  christos             InfoTable = AcpiDmTableInfoPptt0;
   1658   1.1.1.4  christos             break;
   1659   1.1.1.4  christos 
   1660   1.1.1.4  christos         case ACPI_PPTT_TYPE_CACHE:
   1661   1.1.1.4  christos 
   1662   1.1.1.4  christos             InfoTable = AcpiDmTableInfoPptt1;
   1663   1.1.1.4  christos             break;
   1664   1.1.1.4  christos 
   1665   1.1.1.4  christos         case ACPI_PPTT_TYPE_ID:
   1666   1.1.1.4  christos 
   1667   1.1.1.4  christos             InfoTable = AcpiDmTableInfoPptt2;
   1668   1.1.1.4  christos             break;
   1669   1.1.1.4  christos 
   1670   1.1.1.4  christos         default:
   1671   1.1.1.4  christos 
   1672   1.1.1.4  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
   1673   1.1.1.4  christos             return (AE_ERROR);
   1674   1.1.1.4  christos         }
   1675   1.1.1.4  christos 
   1676   1.1.1.4  christos         /* Compile PPTT subtable body */
   1677   1.1.1.4  christos 
   1678   1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1679   1.1.1.4  christos         if (ACPI_FAILURE (Status))
   1680   1.1.1.4  christos         {
   1681   1.1.1.4  christos             return (Status);
   1682   1.1.1.4  christos         }
   1683   1.1.1.4  christos         DtInsertSubtable (ParentTable, Subtable);
   1684   1.1.1.4  christos         PpttHeader->Length += (UINT8)(Subtable->Length);
   1685   1.1.1.4  christos 
   1686  1.1.1.17  christos         /* Compile PPTT subtable additional */
   1687   1.1.1.4  christos 
   1688   1.1.1.4  christos         switch (PpttHeader->Type)
   1689   1.1.1.4  christos         {
   1690   1.1.1.4  christos         case ACPI_PPTT_TYPE_PROCESSOR:
   1691   1.1.1.4  christos 
   1692   1.1.1.4  christos             PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
   1693   1.1.1.4  christos                 Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
   1694   1.1.1.4  christos             if (PpttProcessor)
   1695   1.1.1.4  christos             {
   1696   1.1.1.4  christos                 /* Compile initiator proximity domain list */
   1697   1.1.1.4  christos 
   1698   1.1.1.4  christos                 PpttProcessor->NumberOfPrivResources = 0;
   1699   1.1.1.4  christos                 while (*PFieldList)
   1700   1.1.1.4  christos                 {
   1701   1.1.1.4  christos                     Status = DtCompileTable (PFieldList,
   1702   1.1.1.6  christos                         AcpiDmTableInfoPptt0a, &Subtable);
   1703   1.1.1.4  christos                     if (ACPI_FAILURE (Status))
   1704   1.1.1.4  christos                     {
   1705   1.1.1.4  christos                         return (Status);
   1706   1.1.1.4  christos                     }
   1707   1.1.1.4  christos                     if (!Subtable)
   1708   1.1.1.4  christos                     {
   1709   1.1.1.4  christos                         break;
   1710   1.1.1.4  christos                     }
   1711   1.1.1.4  christos 
   1712   1.1.1.4  christos                     DtInsertSubtable (ParentTable, Subtable);
   1713   1.1.1.4  christos                     PpttHeader->Length += (UINT8)(Subtable->Length);
   1714   1.1.1.4  christos                     PpttProcessor->NumberOfPrivResources++;
   1715   1.1.1.4  christos                 }
   1716   1.1.1.4  christos             }
   1717   1.1.1.4  christos             break;
   1718   1.1.1.4  christos 
   1719  1.1.1.11  christos         case ACPI_PPTT_TYPE_CACHE:
   1720  1.1.1.11  christos 
   1721  1.1.1.11  christos             PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
   1722  1.1.1.11  christos                 AslGbl_RootTable->Buffer);
   1723  1.1.1.11  christos             if (PpttAcpiHeader->Revision < 3)
   1724  1.1.1.11  christos             {
   1725  1.1.1.11  christos                 break;
   1726  1.1.1.11  christos             }
   1727  1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
   1728  1.1.1.11  christos                 &Subtable);
   1729  1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
   1730  1.1.1.11  christos             PpttHeader->Length += (UINT8)(Subtable->Length);
   1731  1.1.1.11  christos             break;
   1732  1.1.1.11  christos 
   1733   1.1.1.4  christos         default:
   1734   1.1.1.4  christos 
   1735   1.1.1.4  christos             break;
   1736   1.1.1.4  christos         }
   1737   1.1.1.4  christos     }
   1738   1.1.1.4  christos 
   1739   1.1.1.4  christos     return (AE_OK);
   1740   1.1.1.4  christos }
   1741   1.1.1.4  christos 
   1742   1.1.1.4  christos 
   1743   1.1.1.4  christos /******************************************************************************
   1744   1.1.1.4  christos  *
   1745  1.1.1.12  christos  * FUNCTION:    DtCompilePrmt
   1746  1.1.1.12  christos  *
   1747  1.1.1.12  christos  * PARAMETERS:  List                - Current field list pointer
   1748  1.1.1.12  christos  *
   1749  1.1.1.12  christos  * RETURN:      Status
   1750  1.1.1.12  christos  *
   1751  1.1.1.12  christos  * DESCRIPTION: Compile PRMT.
   1752  1.1.1.12  christos  *
   1753  1.1.1.12  christos  *****************************************************************************/
   1754  1.1.1.12  christos 
   1755  1.1.1.12  christos ACPI_STATUS
   1756  1.1.1.12  christos DtCompilePrmt (
   1757  1.1.1.12  christos     void                    **List)
   1758  1.1.1.12  christos {
   1759  1.1.1.12  christos     ACPI_STATUS             Status;
   1760  1.1.1.12  christos     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
   1761  1.1.1.12  christos     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
   1762  1.1.1.12  christos     DT_SUBTABLE             *Subtable;
   1763  1.1.1.12  christos     DT_SUBTABLE             *ParentTable;
   1764  1.1.1.12  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1765  1.1.1.12  christos     UINT32                  i, j;
   1766  1.1.1.12  christos 
   1767  1.1.1.12  christos     ParentTable = DtPeekSubtable ();
   1768  1.1.1.12  christos 
   1769  1.1.1.12  christos     /* Compile PRMT subtable header */
   1770  1.1.1.12  christos 
   1771  1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHdr,
   1772  1.1.1.12  christos         &Subtable);
   1773  1.1.1.12  christos     if (ACPI_FAILURE (Status))
   1774  1.1.1.12  christos     {
   1775  1.1.1.12  christos         return (Status);
   1776  1.1.1.12  christos     }
   1777  1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   1778  1.1.1.12  christos     PrmtHeader = ACPI_CAST_PTR (ACPI_TABLE_PRMT_HEADER, Subtable->Buffer);
   1779  1.1.1.12  christos 
   1780  1.1.1.12  christos     for (i = 0; i < PrmtHeader->ModuleInfoCount; i++)
   1781  1.1.1.12  christos     {
   1782  1.1.1.12  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtModule,
   1783  1.1.1.12  christos             &Subtable);
   1784  1.1.1.12  christos         if (ACPI_FAILURE (Status))
   1785  1.1.1.12  christos         {
   1786  1.1.1.12  christos             return (Status);
   1787  1.1.1.12  christos         }
   1788  1.1.1.12  christos         DtInsertSubtable (ParentTable, Subtable);
   1789  1.1.1.12  christos         PrmtModuleInfo = ACPI_CAST_PTR (ACPI_PRMT_MODULE_INFO, Subtable->Buffer);
   1790  1.1.1.12  christos 
   1791  1.1.1.12  christos         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; j++)
   1792  1.1.1.12  christos         {
   1793  1.1.1.12  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPrmtHandler,
   1794  1.1.1.12  christos                 &Subtable);
   1795  1.1.1.12  christos             if (ACPI_FAILURE (Status))
   1796  1.1.1.12  christos             {
   1797  1.1.1.12  christos                 return (Status);
   1798  1.1.1.12  christos             }
   1799  1.1.1.12  christos             DtInsertSubtable (ParentTable, Subtable);
   1800  1.1.1.12  christos         }
   1801  1.1.1.12  christos     }
   1802  1.1.1.12  christos 
   1803  1.1.1.12  christos     return (AE_OK);
   1804  1.1.1.12  christos }
   1805  1.1.1.12  christos 
   1806  1.1.1.12  christos 
   1807  1.1.1.12  christos /******************************************************************************
   1808  1.1.1.12  christos  *
   1809  1.1.1.18  christos  * FUNCTION:    DtCompileRas2
   1810  1.1.1.18  christos  *
   1811  1.1.1.18  christos  * PARAMETERS:  List                - Current field list pointer
   1812  1.1.1.18  christos  *
   1813  1.1.1.18  christos  * RETURN:      Status
   1814  1.1.1.18  christos  *
   1815  1.1.1.18  christos  * DESCRIPTION: Compile RAS2.
   1816  1.1.1.18  christos  *
   1817  1.1.1.18  christos  *****************************************************************************/
   1818  1.1.1.18  christos 
   1819  1.1.1.18  christos ACPI_STATUS
   1820  1.1.1.18  christos DtCompileRas2 (
   1821  1.1.1.18  christos     void                    **List)
   1822  1.1.1.18  christos {
   1823  1.1.1.18  christos     ACPI_STATUS             Status;
   1824  1.1.1.18  christos     DT_SUBTABLE             *Subtable;
   1825  1.1.1.18  christos     DT_SUBTABLE             *ParentTable;
   1826  1.1.1.18  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1827  1.1.1.18  christos     ACPI_TABLE_RAS2         *Ras2Header;
   1828  1.1.1.18  christos     UINT32                  Count = 0;
   1829  1.1.1.18  christos 
   1830  1.1.1.18  christos 
   1831  1.1.1.18  christos     /* Main table */
   1832  1.1.1.18  christos 
   1833  1.1.1.18  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2, &Subtable);
   1834  1.1.1.18  christos     if (ACPI_FAILURE (Status))
   1835  1.1.1.18  christos     {
   1836  1.1.1.18  christos         return (Status);
   1837  1.1.1.18  christos     }
   1838  1.1.1.18  christos 
   1839  1.1.1.18  christos     ParentTable = DtPeekSubtable ();
   1840  1.1.1.18  christos     DtInsertSubtable (ParentTable, Subtable);
   1841  1.1.1.18  christos 
   1842  1.1.1.18  christos     Ras2Header = ACPI_CAST_PTR (ACPI_TABLE_RAS2, ParentTable->Buffer);
   1843  1.1.1.18  christos 
   1844  1.1.1.18  christos     /* There is only one type of subtable at this time, no need to decode */
   1845  1.1.1.18  christos 
   1846  1.1.1.18  christos     while (*PFieldList)
   1847  1.1.1.18  christos     {
   1848  1.1.1.18  christos         /* List of RAS2 PCC descriptors, each 8 bytes */
   1849  1.1.1.18  christos 
   1850  1.1.1.18  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRas2PccDesc,
   1851  1.1.1.18  christos             &Subtable);
   1852  1.1.1.18  christos         if (ACPI_FAILURE (Status))
   1853  1.1.1.18  christos         {
   1854  1.1.1.18  christos             return (Status);
   1855  1.1.1.18  christos         }
   1856  1.1.1.18  christos 
   1857  1.1.1.18  christos         DtInsertSubtable (ParentTable, Subtable);
   1858  1.1.1.18  christos         Count++;
   1859  1.1.1.18  christos     }
   1860  1.1.1.18  christos 
   1861  1.1.1.18  christos     Ras2Header->NumPccDescs = (UINT8) Count;
   1862  1.1.1.18  christos     return (AE_OK);
   1863  1.1.1.18  christos }
   1864  1.1.1.18  christos 
   1865  1.1.1.18  christos 
   1866  1.1.1.18  christos /******************************************************************************
   1867  1.1.1.18  christos  *
   1868  1.1.1.12  christos  * FUNCTION:    DtCompileRgrt
   1869  1.1.1.12  christos  *
   1870  1.1.1.12  christos  * PARAMETERS:  List                - Current field list pointer
   1871  1.1.1.12  christos  *
   1872  1.1.1.12  christos  * RETURN:      Status
   1873  1.1.1.12  christos  *
   1874  1.1.1.12  christos  * DESCRIPTION: Compile RGRT.
   1875  1.1.1.12  christos  *
   1876  1.1.1.12  christos  *****************************************************************************/
   1877  1.1.1.12  christos 
   1878  1.1.1.12  christos ACPI_STATUS
   1879  1.1.1.12  christos DtCompileRgrt (
   1880  1.1.1.12  christos     void                    **List)
   1881  1.1.1.12  christos {
   1882  1.1.1.12  christos     ACPI_STATUS             Status;
   1883  1.1.1.12  christos     DT_SUBTABLE             *Subtable;
   1884  1.1.1.12  christos     DT_SUBTABLE             *ParentTable;
   1885  1.1.1.12  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1886  1.1.1.12  christos 
   1887  1.1.1.12  christos 
   1888  1.1.1.12  christos     /* Compile the main table */
   1889  1.1.1.12  christos 
   1890  1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt,
   1891  1.1.1.12  christos         &Subtable);
   1892  1.1.1.12  christos     if (ACPI_FAILURE (Status))
   1893  1.1.1.12  christos     {
   1894  1.1.1.12  christos         return (Status);
   1895  1.1.1.12  christos     }
   1896  1.1.1.12  christos 
   1897  1.1.1.12  christos     ParentTable = DtPeekSubtable ();
   1898  1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   1899  1.1.1.12  christos 
   1900  1.1.1.12  christos     /* Compile the "Subtable" -- actually just the binary (PNG) image */
   1901  1.1.1.12  christos 
   1902  1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRgrt0,
   1903  1.1.1.12  christos         &Subtable);
   1904  1.1.1.12  christos     if (ACPI_FAILURE (Status))
   1905  1.1.1.12  christos     {
   1906  1.1.1.12  christos         return (Status);
   1907  1.1.1.12  christos     }
   1908  1.1.1.12  christos 
   1909  1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   1910  1.1.1.12  christos     return (AE_OK);
   1911  1.1.1.12  christos }
   1912  1.1.1.12  christos 
   1913  1.1.1.12  christos 
   1914  1.1.1.12  christos /******************************************************************************
   1915  1.1.1.12  christos  *
   1916  1.1.1.17  christos  * FUNCTION:    DtCompileRhct
   1917  1.1.1.17  christos  *
   1918  1.1.1.17  christos  * PARAMETERS:  List                - Current field list pointer
   1919  1.1.1.17  christos  *
   1920  1.1.1.17  christos  * RETURN:      Status
   1921  1.1.1.17  christos  *
   1922  1.1.1.17  christos  * DESCRIPTION: Compile RHCT.
   1923  1.1.1.17  christos  *
   1924  1.1.1.17  christos  *****************************************************************************/
   1925  1.1.1.17  christos 
   1926  1.1.1.17  christos ACPI_STATUS
   1927  1.1.1.17  christos DtCompileRhct (
   1928  1.1.1.17  christos     void                    **List)
   1929  1.1.1.17  christos {
   1930  1.1.1.17  christos     ACPI_STATUS             Status;
   1931  1.1.1.17  christos     ACPI_RHCT_NODE_HEADER   *RhctHeader;
   1932  1.1.1.20  christos     ACPI_RHCT_HART_INFO     *RhctHartInfo;
   1933  1.1.1.17  christos     DT_SUBTABLE             *Subtable;
   1934  1.1.1.17  christos     DT_SUBTABLE             *ParentTable;
   1935  1.1.1.17  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1936  1.1.1.17  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1937  1.1.1.17  christos     DT_FIELD                *SubtableStart;
   1938  1.1.1.20  christos     ACPI_TABLE_RHCT         *Table;
   1939  1.1.1.20  christos     BOOLEAN                 FirstNode = TRUE;
   1940  1.1.1.17  christos 
   1941  1.1.1.17  christos 
   1942  1.1.1.17  christos     /* Compile the main table */
   1943  1.1.1.17  christos 
   1944  1.1.1.20  christos     ParentTable = DtPeekSubtable ();
   1945  1.1.1.17  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhct,
   1946  1.1.1.17  christos         &Subtable);
   1947  1.1.1.17  christos     if (ACPI_FAILURE (Status))
   1948  1.1.1.17  christos     {
   1949  1.1.1.17  christos         return (Status);
   1950  1.1.1.17  christos     }
   1951  1.1.1.20  christos     DtInsertSubtable (ParentTable, Subtable);
   1952  1.1.1.20  christos     Table = ACPI_CAST_PTR (ACPI_TABLE_RHCT, ParentTable->Buffer);
   1953  1.1.1.20  christos     Table->NodeCount = 0;
   1954  1.1.1.20  christos     Table->NodeOffset = sizeof (ACPI_TABLE_RHCT);
   1955  1.1.1.17  christos 
   1956  1.1.1.17  christos     while (*PFieldList)
   1957  1.1.1.17  christos     {
   1958  1.1.1.17  christos         SubtableStart = *PFieldList;
   1959  1.1.1.17  christos 
   1960  1.1.1.17  christos         /* Compile RHCT subtable header */
   1961  1.1.1.17  christos 
   1962  1.1.1.17  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhctNodeHdr,
   1963  1.1.1.17  christos             &Subtable);
   1964  1.1.1.17  christos         if (ACPI_FAILURE (Status))
   1965  1.1.1.17  christos         {
   1966  1.1.1.17  christos             return (Status);
   1967  1.1.1.17  christos         }
   1968  1.1.1.17  christos         DtInsertSubtable (ParentTable, Subtable);
   1969  1.1.1.17  christos         RhctHeader = ACPI_CAST_PTR (ACPI_RHCT_NODE_HEADER, Subtable->Buffer);
   1970  1.1.1.20  christos 
   1971  1.1.1.20  christos         DtPushSubtable (Subtable);
   1972  1.1.1.20  christos         ParentTable = DtPeekSubtable ();
   1973  1.1.1.20  christos         Table->NodeCount++;
   1974  1.1.1.17  christos 
   1975  1.1.1.17  christos         switch (RhctHeader->Type)
   1976  1.1.1.17  christos         {
   1977  1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_ISA_STRING:
   1978  1.1.1.17  christos 
   1979  1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctIsa1;
   1980  1.1.1.17  christos             break;
   1981  1.1.1.17  christos 
   1982  1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_HART_INFO:
   1983  1.1.1.17  christos 
   1984  1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctHartInfo1;
   1985  1.1.1.17  christos             break;
   1986  1.1.1.17  christos 
   1987  1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_CMO:
   1988  1.1.1.17  christos 
   1989  1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctCmo1;
   1990  1.1.1.17  christos             break;
   1991  1.1.1.17  christos 
   1992  1.1.1.17  christos         case ACPI_RHCT_NODE_TYPE_MMU:
   1993  1.1.1.17  christos 
   1994  1.1.1.17  christos             InfoTable = AcpiDmTableInfoRhctMmu1;
   1995  1.1.1.17  christos             break;
   1996  1.1.1.17  christos 
   1997  1.1.1.17  christos         default:
   1998  1.1.1.17  christos 
   1999  1.1.1.17  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "RHCT");
   2000  1.1.1.17  christos             return (AE_ERROR);
   2001  1.1.1.17  christos         }
   2002  1.1.1.17  christos 
   2003  1.1.1.17  christos         /* Compile RHCT subtable body */
   2004  1.1.1.17  christos 
   2005  1.1.1.17  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2006  1.1.1.17  christos         if (ACPI_FAILURE (Status))
   2007  1.1.1.17  christos         {
   2008  1.1.1.17  christos             return (Status);
   2009  1.1.1.17  christos         }
   2010  1.1.1.17  christos         DtInsertSubtable (ParentTable, Subtable);
   2011  1.1.1.20  christos         if (FirstNode)
   2012  1.1.1.20  christos         {
   2013  1.1.1.20  christos             Table->NodeOffset = ACPI_PTR_DIFF(ParentTable->Buffer, Table);
   2014  1.1.1.20  christos             FirstNode = FALSE;
   2015  1.1.1.20  christos         }
   2016  1.1.1.17  christos 
   2017  1.1.1.17  christos         /* Compile RHCT subtable additionals */
   2018  1.1.1.17  christos 
   2019  1.1.1.17  christos         switch (RhctHeader->Type)
   2020  1.1.1.17  christos         {
   2021  1.1.1.20  christos         case ACPI_RHCT_NODE_TYPE_ISA_STRING:
   2022  1.1.1.17  christos 
   2023  1.1.1.20  christos             /*
   2024  1.1.1.20  christos              * Padding - Variable-length data
   2025  1.1.1.20  christos              * Optionally allows the padding of the ISA string to be used
   2026  1.1.1.20  christos              * for filling this field.
   2027  1.1.1.20  christos              */
   2028  1.1.1.20  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoRhctIsaPad,
   2029  1.1.1.20  christos                                      &Subtable);
   2030  1.1.1.20  christos             if (ACPI_FAILURE (Status))
   2031  1.1.1.20  christos             {
   2032  1.1.1.20  christos                 return (Status);
   2033  1.1.1.20  christos             }
   2034  1.1.1.20  christos             if (Subtable)
   2035  1.1.1.17  christos             {
   2036  1.1.1.20  christos                 DtInsertSubtable (ParentTable, Subtable);
   2037  1.1.1.20  christos             }
   2038  1.1.1.20  christos             break;
   2039  1.1.1.17  christos 
   2040  1.1.1.20  christos         case ACPI_RHCT_NODE_TYPE_HART_INFO:
   2041  1.1.1.17  christos 
   2042  1.1.1.20  christos             RhctHartInfo = ACPI_CAST_PTR (ACPI_RHCT_HART_INFO,
   2043  1.1.1.20  christos                 Subtable->Buffer);
   2044  1.1.1.20  christos             RhctHartInfo->NumOffsets = 0;
   2045  1.1.1.20  christos             while (*PFieldList)
   2046  1.1.1.20  christos             {
   2047  1.1.1.20  christos                 Status = DtCompileTable (PFieldList,
   2048  1.1.1.20  christos                     AcpiDmTableInfoRhctHartInfo2, &Subtable);
   2049  1.1.1.20  christos                 if (ACPI_FAILURE (Status))
   2050  1.1.1.20  christos                 {
   2051  1.1.1.20  christos                     return (Status);
   2052  1.1.1.17  christos                 }
   2053  1.1.1.20  christos                 if (!Subtable)
   2054  1.1.1.20  christos                 {
   2055  1.1.1.20  christos                     break;
   2056  1.1.1.20  christos                 }
   2057  1.1.1.20  christos                 DtInsertSubtable (ParentTable, Subtable);
   2058  1.1.1.20  christos                 RhctHartInfo->NumOffsets++;
   2059  1.1.1.17  christos             }
   2060  1.1.1.17  christos             break;
   2061  1.1.1.17  christos 
   2062  1.1.1.17  christos         default:
   2063  1.1.1.17  christos 
   2064  1.1.1.17  christos             break;
   2065  1.1.1.17  christos         }
   2066  1.1.1.20  christos 
   2067  1.1.1.20  christos         DtPopSubtable ();
   2068  1.1.1.20  christos         ParentTable = DtPeekSubtable ();
   2069  1.1.1.17  christos     }
   2070  1.1.1.17  christos 
   2071  1.1.1.17  christos     return (AE_OK);
   2072  1.1.1.17  christos }
   2073  1.1.1.17  christos 
   2074  1.1.1.17  christos 
   2075  1.1.1.17  christos /******************************************************************************
   2076  1.1.1.17  christos  *
   2077       1.1  christos  * FUNCTION:    DtCompileRsdt
   2078       1.1  christos  *
   2079       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2080       1.1  christos  *
   2081       1.1  christos  * RETURN:      Status
   2082       1.1  christos  *
   2083       1.1  christos  * DESCRIPTION: Compile RSDT.
   2084       1.1  christos  *
   2085       1.1  christos  *****************************************************************************/
   2086       1.1  christos 
   2087       1.1  christos ACPI_STATUS
   2088       1.1  christos DtCompileRsdt (
   2089       1.1  christos     void                    **List)
   2090       1.1  christos {
   2091       1.1  christos     DT_SUBTABLE             *Subtable;
   2092       1.1  christos     DT_SUBTABLE             *ParentTable;
   2093       1.1  christos     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   2094       1.1  christos     UINT32                  Address;
   2095       1.1  christos 
   2096       1.1  christos 
   2097       1.1  christos     ParentTable = DtPeekSubtable ();
   2098       1.1  christos 
   2099       1.1  christos     while (FieldList)
   2100       1.1  christos     {
   2101       1.1  christos         DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
   2102       1.1  christos 
   2103       1.1  christos         DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
   2104       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2105       1.1  christos         FieldList = FieldList->Next;
   2106       1.1  christos     }
   2107       1.1  christos 
   2108       1.1  christos     return (AE_OK);
   2109       1.1  christos }
   2110       1.1  christos 
   2111       1.1  christos 
   2112       1.1  christos /******************************************************************************
   2113       1.1  christos  *
   2114       1.1  christos  * FUNCTION:    DtCompileS3pt
   2115       1.1  christos  *
   2116       1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2117       1.1  christos  *
   2118       1.1  christos  * RETURN:      Status
   2119       1.1  christos  *
   2120       1.1  christos  * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
   2121       1.1  christos  *
   2122       1.1  christos  *****************************************************************************/
   2123       1.1  christos 
   2124       1.1  christos ACPI_STATUS
   2125       1.1  christos DtCompileS3pt (
   2126       1.1  christos     DT_FIELD                **PFieldList)
   2127       1.1  christos {
   2128       1.1  christos     ACPI_STATUS             Status;
   2129   1.1.1.2  christos     ACPI_FPDT_HEADER        *S3ptHeader;
   2130       1.1  christos     DT_SUBTABLE             *Subtable;
   2131       1.1  christos     DT_SUBTABLE             *ParentTable;
   2132       1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   2133       1.1  christos     DT_FIELD                *SubtableStart;
   2134       1.1  christos 
   2135       1.1  christos 
   2136       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
   2137   1.1.1.7  christos         &AslGbl_RootTable);
   2138       1.1  christos     if (ACPI_FAILURE (Status))
   2139       1.1  christos     {
   2140       1.1  christos         return (Status);
   2141       1.1  christos     }
   2142       1.1  christos 
   2143   1.1.1.7  christos     DtPushSubtable (AslGbl_RootTable);
   2144       1.1  christos 
   2145       1.1  christos     while (*PFieldList)
   2146       1.1  christos     {
   2147       1.1  christos         SubtableStart = *PFieldList;
   2148       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
   2149   1.1.1.6  christos             &Subtable);
   2150       1.1  christos         if (ACPI_FAILURE (Status))
   2151       1.1  christos         {
   2152       1.1  christos             return (Status);
   2153       1.1  christos         }
   2154       1.1  christos 
   2155       1.1  christos         ParentTable = DtPeekSubtable ();
   2156       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2157       1.1  christos         DtPushSubtable (Subtable);
   2158       1.1  christos 
   2159   1.1.1.2  christos         S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
   2160       1.1  christos 
   2161       1.1  christos         switch (S3ptHeader->Type)
   2162       1.1  christos         {
   2163       1.1  christos         case ACPI_S3PT_TYPE_RESUME:
   2164       1.1  christos 
   2165       1.1  christos             InfoTable = AcpiDmTableInfoS3pt0;
   2166       1.1  christos             break;
   2167       1.1  christos 
   2168       1.1  christos         case ACPI_S3PT_TYPE_SUSPEND:
   2169       1.1  christos 
   2170       1.1  christos             InfoTable = AcpiDmTableInfoS3pt1;
   2171       1.1  christos             break;
   2172       1.1  christos 
   2173       1.1  christos         default:
   2174       1.1  christos 
   2175       1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
   2176       1.1  christos             return (AE_ERROR);
   2177       1.1  christos         }
   2178       1.1  christos 
   2179   1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2180       1.1  christos         if (ACPI_FAILURE (Status))
   2181       1.1  christos         {
   2182       1.1  christos             return (Status);
   2183       1.1  christos         }
   2184       1.1  christos 
   2185       1.1  christos         ParentTable = DtPeekSubtable ();
   2186       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2187       1.1  christos         DtPopSubtable ();
   2188       1.1  christos     }
   2189       1.1  christos 
   2190       1.1  christos     return (AE_OK);
   2191       1.1  christos }
   2192       1.1  christos 
   2193       1.1  christos 
   2194       1.1  christos /******************************************************************************
   2195       1.1  christos  *
   2196   1.1.1.5  christos  * FUNCTION:    DtCompileSdev
   2197   1.1.1.5  christos  *
   2198   1.1.1.5  christos  * PARAMETERS:  List                - Current field list pointer
   2199   1.1.1.5  christos  *
   2200   1.1.1.5  christos  * RETURN:      Status
   2201   1.1.1.5  christos  *
   2202   1.1.1.5  christos  * DESCRIPTION: Compile SDEV.
   2203   1.1.1.5  christos  *
   2204   1.1.1.5  christos  *****************************************************************************/
   2205   1.1.1.5  christos 
   2206   1.1.1.5  christos ACPI_STATUS
   2207   1.1.1.5  christos DtCompileSdev (
   2208   1.1.1.5  christos     void                    **List)
   2209   1.1.1.5  christos {
   2210  1.1.1.11  christos     ACPI_STATUS                 Status;
   2211  1.1.1.11  christos     ACPI_SDEV_HEADER            *SdevHeader;
   2212  1.1.1.11  christos     ACPI_SDEV_HEADER            *SecureComponentHeader;
   2213  1.1.1.11  christos     DT_SUBTABLE                 *Subtable;
   2214  1.1.1.11  christos     DT_SUBTABLE                 *ParentTable;
   2215  1.1.1.11  christos     ACPI_DMTABLE_INFO           *InfoTable;
   2216  1.1.1.11  christos     ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
   2217  1.1.1.11  christos     DT_FIELD                    **PFieldList = (DT_FIELD **) List;
   2218  1.1.1.11  christos     DT_FIELD                    *SubtableStart;
   2219  1.1.1.11  christos     ACPI_SDEV_PCIE              *Pcie = NULL;
   2220  1.1.1.11  christos     ACPI_SDEV_NAMESPACE         *Namesp = NULL;
   2221  1.1.1.11  christos     UINT32                      EntryCount;
   2222  1.1.1.11  christos     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
   2223  1.1.1.11  christos     UINT16                      ComponentLength = 0;
   2224   1.1.1.5  christos 
   2225   1.1.1.5  christos 
   2226   1.1.1.5  christos     /* Subtables */
   2227   1.1.1.5  christos 
   2228   1.1.1.5  christos     while (*PFieldList)
   2229   1.1.1.5  christos     {
   2230   1.1.1.5  christos         /* Compile common SDEV subtable header */
   2231   1.1.1.5  christos 
   2232   1.1.1.5  christos         SubtableStart = *PFieldList;
   2233   1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
   2234   1.1.1.6  christos             &Subtable);
   2235   1.1.1.5  christos         if (ACPI_FAILURE (Status))
   2236   1.1.1.5  christos         {
   2237   1.1.1.5  christos             return (Status);
   2238   1.1.1.5  christos         }
   2239   1.1.1.5  christos 
   2240   1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   2241   1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   2242   1.1.1.5  christos         DtPushSubtable (Subtable);
   2243   1.1.1.5  christos 
   2244   1.1.1.5  christos         SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   2245   1.1.1.5  christos         SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
   2246   1.1.1.5  christos 
   2247   1.1.1.5  christos         switch (SdevHeader->Type)
   2248   1.1.1.5  christos         {
   2249   1.1.1.5  christos         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2250   1.1.1.5  christos 
   2251   1.1.1.5  christos             InfoTable = AcpiDmTableInfoSdev0;
   2252   1.1.1.5  christos             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
   2253  1.1.1.11  christos             SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
   2254  1.1.1.11  christos                 ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
   2255   1.1.1.5  christos             break;
   2256   1.1.1.5  christos 
   2257   1.1.1.5  christos         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2258   1.1.1.5  christos 
   2259   1.1.1.5  christos             InfoTable = AcpiDmTableInfoSdev1;
   2260   1.1.1.5  christos             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
   2261   1.1.1.5  christos             break;
   2262   1.1.1.5  christos 
   2263   1.1.1.5  christos         default:
   2264   1.1.1.5  christos 
   2265   1.1.1.5  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   2266   1.1.1.5  christos             return (AE_ERROR);
   2267   1.1.1.5  christos         }
   2268   1.1.1.5  christos 
   2269   1.1.1.5  christos         /* Compile SDEV subtable body */
   2270   1.1.1.5  christos 
   2271   1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2272   1.1.1.5  christos         if (ACPI_FAILURE (Status))
   2273   1.1.1.5  christos         {
   2274   1.1.1.5  christos             return (Status);
   2275   1.1.1.5  christos         }
   2276   1.1.1.5  christos 
   2277   1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   2278   1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   2279   1.1.1.5  christos 
   2280   1.1.1.5  christos         /* Optional data fields are appended to the main subtable body */
   2281   1.1.1.5  christos 
   2282   1.1.1.5  christos         switch (SdevHeader->Type)
   2283   1.1.1.5  christos         {
   2284   1.1.1.5  christos         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2285   1.1.1.5  christos 
   2286  1.1.1.11  christos             /*
   2287  1.1.1.11  christos              * Device Id Offset will be be calculated differently depending on
   2288  1.1.1.11  christos              * the presence of secure access components.
   2289  1.1.1.11  christos              */
   2290  1.1.1.11  christos             Namesp->DeviceIdOffset = 0;
   2291  1.1.1.11  christos             ComponentLength = 0;
   2292  1.1.1.11  christos 
   2293  1.1.1.11  christos             /* If the secure access component exists, get the structures */
   2294  1.1.1.11  christos 
   2295  1.1.1.11  christos             if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
   2296  1.1.1.11  christos             {
   2297  1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
   2298  1.1.1.11  christos                     &Subtable);
   2299  1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   2300  1.1.1.11  christos                 {
   2301  1.1.1.11  christos                     return (Status);
   2302  1.1.1.11  christos                 }
   2303  1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   2304  1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   2305  1.1.1.11  christos 
   2306  1.1.1.11  christos                 Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2307  1.1.1.11  christos 
   2308  1.1.1.11  christos                 /* Compile a secure access component header */
   2309  1.1.1.11  christos 
   2310  1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
   2311  1.1.1.11  christos                     &Subtable);
   2312  1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   2313  1.1.1.11  christos                 {
   2314  1.1.1.11  christos                     return (Status);
   2315  1.1.1.11  christos                 }
   2316  1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   2317  1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   2318  1.1.1.11  christos 
   2319  1.1.1.11  christos                 /* Compile the secure access component */
   2320  1.1.1.11  christos 
   2321  1.1.1.11  christos                 SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
   2322  1.1.1.11  christos                 switch (SecureComponentHeader->Type)
   2323  1.1.1.11  christos                 {
   2324  1.1.1.11  christos                 case ACPI_SDEV_TYPE_ID_COMPONENT:
   2325  1.1.1.11  christos 
   2326  1.1.1.11  christos                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
   2327  1.1.1.11  christos                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
   2328  1.1.1.11  christos                     ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
   2329  1.1.1.11  christos                     break;
   2330  1.1.1.11  christos 
   2331  1.1.1.11  christos                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
   2332  1.1.1.11  christos 
   2333  1.1.1.11  christos                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
   2334  1.1.1.11  christos                     Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
   2335  1.1.1.11  christos                     ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
   2336  1.1.1.11  christos                     break;
   2337  1.1.1.11  christos 
   2338  1.1.1.11  christos                 default:
   2339  1.1.1.11  christos 
   2340  1.1.1.11  christos                     /* Any other secure component types are undefined */
   2341  1.1.1.11  christos 
   2342  1.1.1.11  christos                     return (AE_ERROR);
   2343  1.1.1.11  christos                 }
   2344  1.1.1.11  christos 
   2345  1.1.1.11  christos                 Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
   2346  1.1.1.11  christos                     &Subtable);
   2347  1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   2348  1.1.1.11  christos                 {
   2349  1.1.1.11  christos                     return (Status);
   2350  1.1.1.11  christos                 }
   2351  1.1.1.11  christos                 ParentTable = DtPeekSubtable ();
   2352  1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   2353  1.1.1.11  christos 
   2354  1.1.1.11  christos                 SecureComponent->SecureComponentOffset =
   2355  1.1.1.11  christos                     sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2356  1.1.1.11  christos                 SecureComponent->SecureComponentLength = ComponentLength;
   2357  1.1.1.11  christos 
   2358  1.1.1.11  christos 
   2359  1.1.1.11  christos                 /*
   2360  1.1.1.11  christos                  * Add the secure component to the subtable to be added for the
   2361  1.1.1.11  christos                  * the namespace subtable's length
   2362  1.1.1.11  christos                  */
   2363  1.1.1.11  christos                 ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2364  1.1.1.11  christos             }
   2365  1.1.1.11  christos 
   2366   1.1.1.5  christos             /* Append DeviceId namespace string */
   2367   1.1.1.5  christos 
   2368   1.1.1.5  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
   2369   1.1.1.6  christos                 &Subtable);
   2370   1.1.1.5  christos             if (ACPI_FAILURE (Status))
   2371   1.1.1.5  christos             {
   2372   1.1.1.5  christos                 return (Status);
   2373   1.1.1.5  christos             }
   2374   1.1.1.5  christos 
   2375   1.1.1.5  christos             if (!Subtable)
   2376   1.1.1.5  christos             {
   2377   1.1.1.5  christos                 break;
   2378   1.1.1.5  christos             }
   2379   1.1.1.5  christos 
   2380   1.1.1.5  christos             ParentTable = DtPeekSubtable ();
   2381   1.1.1.5  christos             DtInsertSubtable (ParentTable, Subtable);
   2382   1.1.1.5  christos 
   2383  1.1.1.11  christos             Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
   2384  1.1.1.11  christos 
   2385   1.1.1.5  christos             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
   2386   1.1.1.5  christos 
   2387   1.1.1.5  christos             /* Append Vendor data */
   2388   1.1.1.5  christos 
   2389   1.1.1.5  christos             Namesp->VendorDataLength = 0;
   2390   1.1.1.5  christos             Namesp->VendorDataOffset = 0;
   2391   1.1.1.5  christos 
   2392   1.1.1.5  christos             if (*PFieldList)
   2393   1.1.1.5  christos             {
   2394   1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   2395   1.1.1.6  christos                     &Subtable);
   2396   1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   2397   1.1.1.5  christos                 {
   2398   1.1.1.5  christos                     return (Status);
   2399   1.1.1.5  christos                 }
   2400   1.1.1.5  christos 
   2401   1.1.1.5  christos                 if (Subtable)
   2402   1.1.1.5  christos                 {
   2403   1.1.1.5  christos                     ParentTable = DtPeekSubtable ();
   2404   1.1.1.5  christos                     DtInsertSubtable (ParentTable, Subtable);
   2405   1.1.1.5  christos 
   2406   1.1.1.5  christos                     Namesp->VendorDataOffset =
   2407   1.1.1.5  christos                         Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
   2408   1.1.1.5  christos                     Namesp->VendorDataLength =
   2409   1.1.1.5  christos                         (UINT16) Subtable->Length;
   2410   1.1.1.9  christos 
   2411   1.1.1.9  christos                     /* Final size of entire namespace structure */
   2412   1.1.1.9  christos 
   2413   1.1.1.9  christos                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
   2414  1.1.1.11  christos                         Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
   2415   1.1.1.5  christos                 }
   2416   1.1.1.5  christos             }
   2417   1.1.1.5  christos 
   2418   1.1.1.5  christos             break;
   2419   1.1.1.5  christos 
   2420   1.1.1.5  christos         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2421   1.1.1.5  christos 
   2422   1.1.1.5  christos             /* Append the PCIe path info first */
   2423   1.1.1.5  christos 
   2424   1.1.1.5  christos             EntryCount = 0;
   2425   1.1.1.5  christos             while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
   2426   1.1.1.5  christos             {
   2427   1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
   2428   1.1.1.6  christos                     &Subtable);
   2429   1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   2430   1.1.1.5  christos                 {
   2431   1.1.1.5  christos                     return (Status);
   2432   1.1.1.5  christos                 }
   2433   1.1.1.5  christos 
   2434   1.1.1.5  christos                 if (!Subtable)
   2435   1.1.1.5  christos                 {
   2436   1.1.1.5  christos                     DtPopSubtable ();
   2437   1.1.1.5  christos                     break;
   2438   1.1.1.5  christos                 }
   2439   1.1.1.5  christos 
   2440   1.1.1.5  christos                 ParentTable = DtPeekSubtable ();
   2441   1.1.1.5  christos                 DtInsertSubtable (ParentTable, Subtable);
   2442   1.1.1.5  christos                 EntryCount++;
   2443   1.1.1.5  christos             }
   2444   1.1.1.5  christos 
   2445   1.1.1.5  christos             /* Path offset will point immediately after the main subtable */
   2446   1.1.1.5  christos 
   2447   1.1.1.5  christos             Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
   2448   1.1.1.5  christos             Pcie->PathLength = (UINT16)
   2449   1.1.1.5  christos                 (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
   2450   1.1.1.5  christos 
   2451   1.1.1.5  christos             /* Append the Vendor Data last */
   2452   1.1.1.5  christos 
   2453   1.1.1.5  christos             Pcie->VendorDataLength = 0;
   2454   1.1.1.5  christos             Pcie->VendorDataOffset = 0;
   2455   1.1.1.5  christos 
   2456   1.1.1.5  christos             if (*PFieldList)
   2457   1.1.1.5  christos             {
   2458   1.1.1.5  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
   2459   1.1.1.6  christos                     &Subtable);
   2460   1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   2461   1.1.1.5  christos                 {
   2462   1.1.1.5  christos                     return (Status);
   2463   1.1.1.5  christos                 }
   2464   1.1.1.5  christos 
   2465   1.1.1.5  christos                 if (Subtable)
   2466   1.1.1.5  christos                 {
   2467   1.1.1.5  christos                     ParentTable = DtPeekSubtable ();
   2468   1.1.1.5  christos                     DtInsertSubtable (ParentTable, Subtable);
   2469   1.1.1.5  christos 
   2470   1.1.1.5  christos                     Pcie->VendorDataOffset =
   2471   1.1.1.5  christos                         Pcie->PathOffset + Pcie->PathLength;
   2472   1.1.1.5  christos                     Pcie->VendorDataLength = (UINT16)
   2473   1.1.1.5  christos                         Subtable->Length;
   2474   1.1.1.5  christos                 }
   2475   1.1.1.5  christos             }
   2476   1.1.1.5  christos 
   2477   1.1.1.5  christos             SdevHeader->Length =
   2478   1.1.1.5  christos                 sizeof (ACPI_SDEV_PCIE) +
   2479   1.1.1.5  christos                 Pcie->PathLength + Pcie->VendorDataLength;
   2480   1.1.1.5  christos             break;
   2481   1.1.1.5  christos 
   2482   1.1.1.5  christos         default:
   2483   1.1.1.5  christos 
   2484   1.1.1.5  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
   2485   1.1.1.5  christos             return (AE_ERROR);
   2486   1.1.1.5  christos         }
   2487   1.1.1.5  christos 
   2488   1.1.1.5  christos         DtPopSubtable ();
   2489   1.1.1.5  christos     }
   2490   1.1.1.5  christos 
   2491   1.1.1.5  christos     return (AE_OK);
   2492   1.1.1.5  christos }
   2493   1.1.1.5  christos 
   2494   1.1.1.5  christos 
   2495   1.1.1.5  christos /******************************************************************************
   2496   1.1.1.5  christos  *
   2497       1.1  christos  * FUNCTION:    DtCompileSlic
   2498       1.1  christos  *
   2499       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2500       1.1  christos  *
   2501       1.1  christos  * RETURN:      Status
   2502       1.1  christos  *
   2503       1.1  christos  * DESCRIPTION: Compile SLIC.
   2504       1.1  christos  *
   2505       1.1  christos  *****************************************************************************/
   2506       1.1  christos 
   2507       1.1  christos ACPI_STATUS
   2508       1.1  christos DtCompileSlic (
   2509       1.1  christos     void                    **List)
   2510       1.1  christos {
   2511       1.1  christos     ACPI_STATUS             Status;
   2512       1.1  christos     DT_SUBTABLE             *Subtable;
   2513       1.1  christos     DT_SUBTABLE             *ParentTable;
   2514       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2515       1.1  christos 
   2516       1.1  christos 
   2517       1.1  christos     while (*PFieldList)
   2518       1.1  christos     {
   2519       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
   2520   1.1.1.6  christos             &Subtable);
   2521       1.1  christos         if (ACPI_FAILURE (Status))
   2522       1.1  christos         {
   2523       1.1  christos             return (Status);
   2524       1.1  christos         }
   2525       1.1  christos 
   2526       1.1  christos         ParentTable = DtPeekSubtable ();
   2527       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2528       1.1  christos         DtPushSubtable (Subtable);
   2529       1.1  christos         DtPopSubtable ();
   2530       1.1  christos     }
   2531       1.1  christos 
   2532       1.1  christos     return (AE_OK);
   2533       1.1  christos }
   2534       1.1  christos 
   2535       1.1  christos 
   2536       1.1  christos /******************************************************************************
   2537       1.1  christos  *
   2538       1.1  christos  * FUNCTION:    DtCompileSlit
   2539       1.1  christos  *
   2540       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2541       1.1  christos  *
   2542       1.1  christos  * RETURN:      Status
   2543       1.1  christos  *
   2544       1.1  christos  * DESCRIPTION: Compile SLIT.
   2545       1.1  christos  *
   2546       1.1  christos  *****************************************************************************/
   2547       1.1  christos 
   2548       1.1  christos ACPI_STATUS
   2549       1.1  christos DtCompileSlit (
   2550       1.1  christos     void                    **List)
   2551       1.1  christos {
   2552       1.1  christos     ACPI_STATUS             Status;
   2553       1.1  christos     DT_SUBTABLE             *Subtable;
   2554       1.1  christos     DT_SUBTABLE             *ParentTable;
   2555       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2556       1.1  christos     DT_FIELD                *FieldList;
   2557   1.1.1.9  christos     DT_FIELD                *EndOfFieldList = NULL;
   2558       1.1  christos     UINT32                  Localities;
   2559   1.1.1.9  christos     UINT32                  LocalityListLength;
   2560       1.1  christos     UINT8                   *LocalityBuffer;
   2561       1.1  christos 
   2562       1.1  christos 
   2563       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
   2564   1.1.1.6  christos         &Subtable);
   2565       1.1  christos     if (ACPI_FAILURE (Status))
   2566       1.1  christos     {
   2567       1.1  christos         return (Status);
   2568       1.1  christos     }
   2569       1.1  christos 
   2570       1.1  christos     ParentTable = DtPeekSubtable ();
   2571       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2572       1.1  christos 
   2573       1.1  christos     Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
   2574       1.1  christos     LocalityBuffer = UtLocalCalloc (Localities);
   2575   1.1.1.9  christos     LocalityListLength = 0;
   2576       1.1  christos 
   2577       1.1  christos     /* Compile each locality buffer */
   2578       1.1  christos 
   2579       1.1  christos     FieldList = *PFieldList;
   2580       1.1  christos     while (FieldList)
   2581       1.1  christos     {
   2582       1.1  christos         DtCompileBuffer (LocalityBuffer,
   2583       1.1  christos             FieldList->Value, FieldList, Localities);
   2584       1.1  christos 
   2585   1.1.1.9  christos         LocalityListLength++;
   2586       1.1  christos         DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
   2587       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2588   1.1.1.9  christos         EndOfFieldList = FieldList;
   2589       1.1  christos         FieldList = FieldList->Next;
   2590       1.1  christos     }
   2591       1.1  christos 
   2592   1.1.1.9  christos     if (LocalityListLength != Localities)
   2593   1.1.1.9  christos     {
   2594   1.1.1.9  christos         sprintf(AslGbl_MsgBuffer,
   2595   1.1.1.9  christos             "Found %u entries, must match LocalityCount: %u",
   2596   1.1.1.9  christos             LocalityListLength, Localities);
   2597   1.1.1.9  christos         DtError (ASL_ERROR, ASL_MSG_ENTRY_LIST, EndOfFieldList, AslGbl_MsgBuffer);
   2598   1.1.1.9  christos         ACPI_FREE (LocalityBuffer);
   2599   1.1.1.9  christos         return (AE_LIMIT);
   2600   1.1.1.9  christos     }
   2601   1.1.1.9  christos 
   2602       1.1  christos     ACPI_FREE (LocalityBuffer);
   2603       1.1  christos     return (AE_OK);
   2604       1.1  christos }
   2605       1.1  christos 
   2606       1.1  christos 
   2607       1.1  christos /******************************************************************************
   2608       1.1  christos  *
   2609       1.1  christos  * FUNCTION:    DtCompileSrat
   2610       1.1  christos  *
   2611       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   2612       1.1  christos  *
   2613       1.1  christos  * RETURN:      Status
   2614       1.1  christos  *
   2615       1.1  christos  * DESCRIPTION: Compile SRAT.
   2616       1.1  christos  *
   2617       1.1  christos  *****************************************************************************/
   2618       1.1  christos 
   2619       1.1  christos ACPI_STATUS
   2620       1.1  christos DtCompileSrat (
   2621       1.1  christos     void                    **List)
   2622       1.1  christos {
   2623       1.1  christos     ACPI_STATUS             Status;
   2624       1.1  christos     DT_SUBTABLE             *Subtable;
   2625       1.1  christos     DT_SUBTABLE             *ParentTable;
   2626       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2627       1.1  christos     DT_FIELD                *SubtableStart;
   2628       1.1  christos     ACPI_SUBTABLE_HEADER    *SratHeader;
   2629       1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   2630       1.1  christos 
   2631       1.1  christos 
   2632       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
   2633   1.1.1.6  christos         &Subtable);
   2634       1.1  christos     if (ACPI_FAILURE (Status))
   2635       1.1  christos     {
   2636       1.1  christos         return (Status);
   2637       1.1  christos     }
   2638       1.1  christos 
   2639       1.1  christos     ParentTable = DtPeekSubtable ();
   2640       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2641       1.1  christos 
   2642       1.1  christos     while (*PFieldList)
   2643       1.1  christos     {
   2644       1.1  christos         SubtableStart = *PFieldList;
   2645       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
   2646   1.1.1.6  christos             &Subtable);
   2647       1.1  christos         if (ACPI_FAILURE (Status))
   2648       1.1  christos         {
   2649       1.1  christos             return (Status);
   2650       1.1  christos         }
   2651       1.1  christos 
   2652       1.1  christos         ParentTable = DtPeekSubtable ();
   2653       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2654       1.1  christos         DtPushSubtable (Subtable);
   2655       1.1  christos 
   2656       1.1  christos         SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   2657       1.1  christos 
   2658       1.1  christos         switch (SratHeader->Type)
   2659       1.1  christos         {
   2660       1.1  christos         case ACPI_SRAT_TYPE_CPU_AFFINITY:
   2661       1.1  christos 
   2662       1.1  christos             InfoTable = AcpiDmTableInfoSrat0;
   2663       1.1  christos             break;
   2664       1.1  christos 
   2665       1.1  christos         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   2666       1.1  christos 
   2667       1.1  christos             InfoTable = AcpiDmTableInfoSrat1;
   2668       1.1  christos             break;
   2669       1.1  christos 
   2670       1.1  christos         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   2671       1.1  christos 
   2672       1.1  christos             InfoTable = AcpiDmTableInfoSrat2;
   2673       1.1  christos             break;
   2674       1.1  christos 
   2675       1.1  christos         case ACPI_SRAT_TYPE_GICC_AFFINITY:
   2676       1.1  christos 
   2677       1.1  christos             InfoTable = AcpiDmTableInfoSrat3;
   2678       1.1  christos             break;
   2679       1.1  christos 
   2680   1.1.1.4  christos         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
   2681   1.1.1.4  christos 
   2682   1.1.1.4  christos             InfoTable = AcpiDmTableInfoSrat4;
   2683   1.1.1.4  christos             break;
   2684   1.1.1.4  christos 
   2685   1.1.1.8  christos         case ACPI_SRAT_TYPE_GENERIC_AFFINITY:
   2686   1.1.1.8  christos 
   2687   1.1.1.8  christos             InfoTable = AcpiDmTableInfoSrat5;
   2688   1.1.1.8  christos             break;
   2689   1.1.1.8  christos 
   2690  1.1.1.13  christos         case ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY:
   2691  1.1.1.13  christos 
   2692  1.1.1.13  christos             InfoTable = AcpiDmTableInfoSrat6;
   2693  1.1.1.13  christos             break;
   2694  1.1.1.13  christos 
   2695  1.1.1.18  christos         case ACPI_SRAT_TYPE_RINTC_AFFINITY:
   2696  1.1.1.18  christos 
   2697  1.1.1.18  christos             InfoTable = AcpiDmTableInfoSrat7;
   2698  1.1.1.18  christos             break;
   2699  1.1.1.18  christos 
   2700       1.1  christos         default:
   2701       1.1  christos 
   2702       1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
   2703       1.1  christos             return (AE_ERROR);
   2704       1.1  christos         }
   2705       1.1  christos 
   2706   1.1.1.6  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   2707       1.1  christos         if (ACPI_FAILURE (Status))
   2708       1.1  christos         {
   2709       1.1  christos             return (Status);
   2710       1.1  christos         }
   2711       1.1  christos 
   2712       1.1  christos         ParentTable = DtPeekSubtable ();
   2713       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2714       1.1  christos         DtPopSubtable ();
   2715       1.1  christos     }
   2716       1.1  christos 
   2717       1.1  christos     return (AE_OK);
   2718       1.1  christos }
   2719       1.1  christos 
   2720       1.1  christos 
   2721       1.1  christos /******************************************************************************
   2722       1.1  christos  *
   2723       1.1  christos  * FUNCTION:    DtCompileStao
   2724       1.1  christos  *
   2725       1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2726       1.1  christos  *
   2727       1.1  christos  * RETURN:      Status
   2728       1.1  christos  *
   2729       1.1  christos  * DESCRIPTION: Compile STAO.
   2730       1.1  christos  *
   2731       1.1  christos  *****************************************************************************/
   2732       1.1  christos 
   2733       1.1  christos ACPI_STATUS
   2734       1.1  christos DtCompileStao (
   2735       1.1  christos     void                    **List)
   2736       1.1  christos {
   2737       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2738       1.1  christos     DT_SUBTABLE             *Subtable;
   2739       1.1  christos     DT_SUBTABLE             *ParentTable;
   2740       1.1  christos     ACPI_STATUS             Status;
   2741       1.1  christos 
   2742       1.1  christos 
   2743       1.1  christos     /* Compile the main table */
   2744       1.1  christos 
   2745       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
   2746   1.1.1.6  christos         &Subtable);
   2747       1.1  christos     if (ACPI_FAILURE (Status))
   2748       1.1  christos     {
   2749       1.1  christos         return (Status);
   2750       1.1  christos     }
   2751       1.1  christos 
   2752       1.1  christos     ParentTable = DtPeekSubtable ();
   2753       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2754       1.1  christos 
   2755       1.1  christos     /* Compile each ASCII namestring as a subtable */
   2756       1.1  christos 
   2757       1.1  christos     while (*PFieldList)
   2758       1.1  christos     {
   2759       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
   2760   1.1.1.6  christos             &Subtable);
   2761       1.1  christos         if (ACPI_FAILURE (Status))
   2762       1.1  christos         {
   2763       1.1  christos             return (Status);
   2764       1.1  christos         }
   2765       1.1  christos 
   2766       1.1  christos         ParentTable = DtPeekSubtable ();
   2767       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   2768       1.1  christos     }
   2769       1.1  christos 
   2770       1.1  christos     return (AE_OK);
   2771       1.1  christos }
   2772       1.1  christos 
   2773       1.1  christos 
   2774  1.1.1.12  christos /******************************************************************************
   2775  1.1.1.12  christos  *
   2776  1.1.1.12  christos  * FUNCTION:    DtCompileSvkl
   2777  1.1.1.12  christos  *
   2778  1.1.1.12  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2779  1.1.1.12  christos  *
   2780  1.1.1.12  christos  * RETURN:      Status
   2781  1.1.1.12  christos  *
   2782  1.1.1.12  christos  * DESCRIPTION: Compile SVKL.
   2783  1.1.1.12  christos  *
   2784  1.1.1.12  christos  * NOTES: SVKL is essentially a flat table, with a small main table and
   2785  1.1.1.12  christos  *          a variable number of a single type of subtable.
   2786  1.1.1.12  christos  *
   2787  1.1.1.12  christos  *****************************************************************************/
   2788  1.1.1.12  christos 
   2789  1.1.1.12  christos ACPI_STATUS
   2790  1.1.1.12  christos DtCompileSvkl (
   2791  1.1.1.12  christos     void                    **List)
   2792  1.1.1.12  christos {
   2793  1.1.1.12  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2794  1.1.1.12  christos     DT_SUBTABLE             *Subtable;
   2795  1.1.1.12  christos     DT_SUBTABLE             *ParentTable;
   2796  1.1.1.12  christos     ACPI_STATUS             Status;
   2797  1.1.1.12  christos 
   2798  1.1.1.12  christos 
   2799  1.1.1.12  christos     /* Compile the main table */
   2800  1.1.1.12  christos 
   2801  1.1.1.12  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
   2802  1.1.1.12  christos         &Subtable);
   2803  1.1.1.12  christos     if (ACPI_FAILURE (Status))
   2804  1.1.1.12  christos     {
   2805  1.1.1.12  christos         return (Status);
   2806  1.1.1.12  christos     }
   2807  1.1.1.12  christos 
   2808  1.1.1.12  christos     ParentTable = DtPeekSubtable ();
   2809  1.1.1.12  christos     DtInsertSubtable (ParentTable, Subtable);
   2810  1.1.1.12  christos 
   2811  1.1.1.12  christos     /* Compile each subtable */
   2812  1.1.1.12  christos 
   2813  1.1.1.12  christos     while (*PFieldList)
   2814  1.1.1.12  christos     {
   2815  1.1.1.12  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
   2816  1.1.1.12  christos             &Subtable);
   2817  1.1.1.12  christos         if (ACPI_FAILURE (Status))
   2818  1.1.1.12  christos         {
   2819  1.1.1.12  christos             return (Status);
   2820  1.1.1.12  christos         }
   2821  1.1.1.12  christos 
   2822  1.1.1.12  christos         ParentTable = DtPeekSubtable ();
   2823  1.1.1.12  christos         DtInsertSubtable (ParentTable, Subtable);
   2824  1.1.1.12  christos     }
   2825  1.1.1.12  christos 
   2826  1.1.1.12  christos     return (AE_OK);
   2827  1.1.1.12  christos }
   2828  1.1.1.12  christos 
   2829  1.1.1.12  christos 
   2830       1.1  christos /******************************************************************************
   2831       1.1  christos  *
   2832       1.1  christos  * FUNCTION:    DtCompileTcpa
   2833       1.1  christos  *
   2834       1.1  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2835       1.1  christos  *
   2836       1.1  christos  * RETURN:      Status
   2837       1.1  christos  *
   2838       1.1  christos  * DESCRIPTION: Compile TCPA.
   2839       1.1  christos  *
   2840       1.1  christos  *****************************************************************************/
   2841       1.1  christos 
   2842       1.1  christos ACPI_STATUS
   2843       1.1  christos DtCompileTcpa (
   2844       1.1  christos     void                    **List)
   2845       1.1  christos {
   2846       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2847       1.1  christos     DT_SUBTABLE             *Subtable;
   2848       1.1  christos     ACPI_TABLE_TCPA_HDR     *TcpaHeader;
   2849       1.1  christos     DT_SUBTABLE             *ParentTable;
   2850       1.1  christos     ACPI_STATUS             Status;
   2851       1.1  christos 
   2852       1.1  christos 
   2853       1.1  christos     /* Compile the main table */
   2854       1.1  christos 
   2855       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
   2856   1.1.1.6  christos         &Subtable);
   2857       1.1  christos     if (ACPI_FAILURE (Status))
   2858       1.1  christos     {
   2859       1.1  christos         return (Status);
   2860       1.1  christos     }
   2861       1.1  christos 
   2862       1.1  christos     ParentTable = DtPeekSubtable ();
   2863       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2864       1.1  christos 
   2865       1.1  christos     /*
   2866       1.1  christos      * Examine the PlatformClass field to determine the table type.
   2867       1.1  christos      * Either a client or server table. Only one.
   2868       1.1  christos      */
   2869       1.1  christos     TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
   2870       1.1  christos 
   2871       1.1  christos     switch (TcpaHeader->PlatformClass)
   2872       1.1  christos     {
   2873       1.1  christos     case ACPI_TCPA_CLIENT_TABLE:
   2874       1.1  christos 
   2875       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
   2876   1.1.1.6  christos             &Subtable);
   2877       1.1  christos         break;
   2878       1.1  christos 
   2879       1.1  christos     case ACPI_TCPA_SERVER_TABLE:
   2880       1.1  christos 
   2881       1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
   2882   1.1.1.6  christos             &Subtable);
   2883       1.1  christos         break;
   2884       1.1  christos 
   2885       1.1  christos     default:
   2886       1.1  christos 
   2887       1.1  christos         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
   2888       1.1  christos             TcpaHeader->PlatformClass);
   2889       1.1  christos         Status = AE_ERROR;
   2890       1.1  christos         break;
   2891       1.1  christos     }
   2892       1.1  christos 
   2893       1.1  christos     ParentTable = DtPeekSubtable ();
   2894       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   2895       1.1  christos     return (Status);
   2896       1.1  christos }
   2897       1.1  christos 
   2898       1.1  christos 
   2899       1.1  christos /******************************************************************************
   2900       1.1  christos  *
   2901   1.1.1.7  christos  * FUNCTION:    DtCompileTpm2Rev3
   2902   1.1.1.7  christos  *
   2903   1.1.1.7  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2904   1.1.1.7  christos  *
   2905   1.1.1.7  christos  * RETURN:      Status
   2906   1.1.1.7  christos  *
   2907   1.1.1.7  christos  * DESCRIPTION: Compile TPM2 revision 3
   2908   1.1.1.7  christos  *
   2909   1.1.1.7  christos  *****************************************************************************/
   2910   1.1.1.7  christos static ACPI_STATUS
   2911   1.1.1.7  christos DtCompileTpm2Rev3 (
   2912   1.1.1.7  christos     void                    **List)
   2913   1.1.1.7  christos {
   2914   1.1.1.7  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2915   1.1.1.7  christos     DT_SUBTABLE             *Subtable;
   2916   1.1.1.7  christos     ACPI_TABLE_TPM23        *Tpm23Header;
   2917   1.1.1.7  christos     DT_SUBTABLE             *ParentTable;
   2918   1.1.1.7  christos     ACPI_STATUS             Status = AE_OK;
   2919   1.1.1.7  christos 
   2920   1.1.1.7  christos 
   2921   1.1.1.7  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23,
   2922   1.1.1.7  christos         &Subtable);
   2923   1.1.1.7  christos 
   2924   1.1.1.7  christos     ParentTable = DtPeekSubtable ();
   2925   1.1.1.7  christos     DtInsertSubtable (ParentTable, Subtable);
   2926   1.1.1.7  christos     Tpm23Header = ACPI_CAST_PTR (ACPI_TABLE_TPM23, ParentTable->Buffer);
   2927   1.1.1.7  christos 
   2928   1.1.1.7  christos     /* Subtable type depends on the StartMethod */
   2929   1.1.1.7  christos 
   2930   1.1.1.7  christos     switch (Tpm23Header->StartMethod)
   2931   1.1.1.7  christos     {
   2932   1.1.1.7  christos     case ACPI_TPM23_ACPI_START_METHOD:
   2933   1.1.1.7  christos 
   2934   1.1.1.7  christos         /* Subtable specific to to ARM_SMC */
   2935   1.1.1.7  christos 
   2936   1.1.1.7  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm23a,
   2937   1.1.1.7  christos             &Subtable);
   2938   1.1.1.7  christos         if (ACPI_FAILURE (Status))
   2939   1.1.1.7  christos         {
   2940   1.1.1.7  christos             return (Status);
   2941   1.1.1.7  christos         }
   2942   1.1.1.7  christos 
   2943   1.1.1.7  christos         ParentTable = DtPeekSubtable ();
   2944   1.1.1.7  christos         DtInsertSubtable (ParentTable, Subtable);
   2945   1.1.1.7  christos         break;
   2946   1.1.1.7  christos 
   2947   1.1.1.7  christos     default:
   2948   1.1.1.7  christos         break;
   2949   1.1.1.7  christos     }
   2950   1.1.1.7  christos 
   2951   1.1.1.7  christos     return (Status);
   2952   1.1.1.7  christos }
   2953   1.1.1.7  christos 
   2954   1.1.1.7  christos 
   2955   1.1.1.7  christos /******************************************************************************
   2956   1.1.1.7  christos  *
   2957   1.1.1.5  christos  * FUNCTION:    DtCompileTpm2
   2958   1.1.1.5  christos  *
   2959   1.1.1.5  christos  * PARAMETERS:  PFieldList          - Current field list pointer
   2960   1.1.1.5  christos  *
   2961   1.1.1.5  christos  * RETURN:      Status
   2962   1.1.1.5  christos  *
   2963   1.1.1.5  christos  * DESCRIPTION: Compile TPM2.
   2964   1.1.1.5  christos  *
   2965   1.1.1.5  christos  *****************************************************************************/
   2966   1.1.1.5  christos 
   2967   1.1.1.5  christos ACPI_STATUS
   2968   1.1.1.5  christos DtCompileTpm2 (
   2969   1.1.1.5  christos     void                    **List)
   2970   1.1.1.5  christos {
   2971   1.1.1.5  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   2972   1.1.1.5  christos     DT_SUBTABLE             *Subtable;
   2973   1.1.1.5  christos     ACPI_TABLE_TPM2         *Tpm2Header;
   2974   1.1.1.5  christos     DT_SUBTABLE             *ParentTable;
   2975   1.1.1.5  christos     ACPI_STATUS             Status = AE_OK;
   2976   1.1.1.7  christos     ACPI_TABLE_HEADER       *Header;
   2977   1.1.1.5  christos 
   2978   1.1.1.5  christos 
   2979   1.1.1.7  christos     ParentTable = DtPeekSubtable ();
   2980   1.1.1.7  christos 
   2981   1.1.1.7  christos     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
   2982   1.1.1.7  christos 
   2983   1.1.1.7  christos     if (Header->Revision == 3)
   2984   1.1.1.7  christos     {
   2985   1.1.1.7  christos         return (DtCompileTpm2Rev3 (List));
   2986   1.1.1.7  christos     }
   2987   1.1.1.7  christos 
   2988   1.1.1.5  christos     /* Compile the main table */
   2989   1.1.1.5  christos 
   2990   1.1.1.5  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
   2991   1.1.1.6  christos         &Subtable);
   2992   1.1.1.5  christos     if (ACPI_FAILURE (Status))
   2993   1.1.1.5  christos     {
   2994   1.1.1.5  christos         return (Status);
   2995   1.1.1.5  christos     }
   2996   1.1.1.5  christos 
   2997   1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   2998   1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   2999   1.1.1.5  christos 
   3000   1.1.1.5  christos     Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
   3001   1.1.1.5  christos 
   3002   1.1.1.5  christos     /* Method parameters */
   3003   1.1.1.5  christos     /* Optional: Log area minimum length */
   3004   1.1.1.5  christos     /* Optional: Log area start address */
   3005   1.1.1.5  christos     /* TBD: Optional fields above not fully implemented (not optional at this time) */
   3006   1.1.1.5  christos 
   3007   1.1.1.5  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
   3008   1.1.1.6  christos         &Subtable);
   3009   1.1.1.5  christos     if (ACPI_FAILURE (Status))
   3010   1.1.1.5  christos     {
   3011   1.1.1.5  christos         return (Status);
   3012   1.1.1.5  christos     }
   3013   1.1.1.5  christos 
   3014   1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   3015   1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   3016   1.1.1.5  christos 
   3017   1.1.1.5  christos 
   3018   1.1.1.5  christos     /* Subtable type depends on the StartMethod */
   3019   1.1.1.5  christos 
   3020   1.1.1.5  christos     switch (Tpm2Header->StartMethod)
   3021   1.1.1.5  christos     {
   3022   1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
   3023   1.1.1.5  christos 
   3024   1.1.1.5  christos         /* Subtable specific to to ARM_SMC */
   3025   1.1.1.5  christos 
   3026   1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
   3027   1.1.1.6  christos             &Subtable);
   3028   1.1.1.5  christos         if (ACPI_FAILURE (Status))
   3029   1.1.1.5  christos         {
   3030   1.1.1.5  christos             return (Status);
   3031   1.1.1.5  christos         }
   3032   1.1.1.5  christos 
   3033   1.1.1.5  christos         ParentTable = DtPeekSubtable ();
   3034   1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   3035   1.1.1.5  christos         break;
   3036   1.1.1.5  christos 
   3037   1.1.1.5  christos     case ACPI_TPM2_START_METHOD:
   3038   1.1.1.5  christos     case ACPI_TPM2_MEMORY_MAPPED:
   3039   1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER:
   3040   1.1.1.5  christos     case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
   3041   1.1.1.5  christos         break;
   3042   1.1.1.5  christos 
   3043   1.1.1.5  christos     case ACPI_TPM2_RESERVED1:
   3044   1.1.1.5  christos     case ACPI_TPM2_RESERVED3:
   3045   1.1.1.5  christos     case ACPI_TPM2_RESERVED4:
   3046   1.1.1.5  christos     case ACPI_TPM2_RESERVED5:
   3047   1.1.1.5  christos     case ACPI_TPM2_RESERVED9:
   3048   1.1.1.5  christos     case ACPI_TPM2_RESERVED10:
   3049   1.1.1.5  christos 
   3050   1.1.1.5  christos         AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
   3051   1.1.1.5  christos             Tpm2Header->StartMethod);
   3052   1.1.1.5  christos         Status = AE_ERROR;
   3053   1.1.1.5  christos         break;
   3054   1.1.1.5  christos 
   3055   1.1.1.5  christos     case ACPI_TPM2_NOT_ALLOWED:
   3056   1.1.1.5  christos     default:
   3057   1.1.1.5  christos 
   3058   1.1.1.5  christos         AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
   3059   1.1.1.5  christos             Tpm2Header->StartMethod);
   3060   1.1.1.5  christos         Status = AE_ERROR;
   3061   1.1.1.5  christos         break;
   3062   1.1.1.5  christos     }
   3063   1.1.1.5  christos 
   3064   1.1.1.5  christos     return (Status);
   3065   1.1.1.5  christos }
   3066   1.1.1.5  christos 
   3067   1.1.1.5  christos 
   3068   1.1.1.5  christos /******************************************************************************
   3069   1.1.1.5  christos  *
   3070       1.1  christos  * FUNCTION:    DtGetGenericTableInfo
   3071       1.1  christos  *
   3072       1.1  christos  * PARAMETERS:  Name                - Generic type name
   3073       1.1  christos  *
   3074       1.1  christos  * RETURN:      Info entry
   3075       1.1  christos  *
   3076       1.1  christos  * DESCRIPTION: Obtain table info for a generic name entry
   3077       1.1  christos  *
   3078       1.1  christos  *****************************************************************************/
   3079       1.1  christos 
   3080       1.1  christos ACPI_DMTABLE_INFO *
   3081       1.1  christos DtGetGenericTableInfo (
   3082       1.1  christos     char                    *Name)
   3083       1.1  christos {
   3084       1.1  christos     ACPI_DMTABLE_INFO       *Info;
   3085       1.1  christos     UINT32                  i;
   3086       1.1  christos 
   3087       1.1  christos 
   3088       1.1  christos     if (!Name)
   3089       1.1  christos     {
   3090       1.1  christos         return (NULL);
   3091       1.1  christos     }
   3092       1.1  christos 
   3093       1.1  christos     /* Search info table for name match */
   3094       1.1  christos 
   3095       1.1  christos     for (i = 0; ; i++)
   3096       1.1  christos     {
   3097       1.1  christos         Info = AcpiDmTableInfoGeneric[i];
   3098       1.1  christos         if (Info->Opcode == ACPI_DMT_EXIT)
   3099       1.1  christos         {
   3100       1.1  christos             Info = NULL;
   3101       1.1  christos             break;
   3102       1.1  christos         }
   3103       1.1  christos 
   3104       1.1  christos         /* Use caseless compare for generic keywords */
   3105       1.1  christos 
   3106       1.1  christos         if (!AcpiUtStricmp (Name, Info->Name))
   3107       1.1  christos         {
   3108       1.1  christos             break;
   3109       1.1  christos         }
   3110       1.1  christos     }
   3111       1.1  christos 
   3112       1.1  christos     return (Info);
   3113       1.1  christos }
   3114       1.1  christos 
   3115       1.1  christos 
   3116       1.1  christos /******************************************************************************
   3117       1.1  christos  *
   3118       1.1  christos  * FUNCTION:    DtCompileUefi
   3119       1.1  christos  *
   3120       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3121       1.1  christos  *
   3122       1.1  christos  * RETURN:      Status
   3123       1.1  christos  *
   3124       1.1  christos  * DESCRIPTION: Compile UEFI.
   3125       1.1  christos  *
   3126       1.1  christos  *****************************************************************************/
   3127       1.1  christos 
   3128       1.1  christos ACPI_STATUS
   3129       1.1  christos DtCompileUefi (
   3130       1.1  christos     void                    **List)
   3131       1.1  christos {
   3132       1.1  christos     ACPI_STATUS             Status;
   3133       1.1  christos     DT_SUBTABLE             *Subtable;
   3134       1.1  christos     DT_SUBTABLE             *ParentTable;
   3135       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3136       1.1  christos     UINT16                  *DataOffset;
   3137       1.1  christos 
   3138       1.1  christos 
   3139       1.1  christos     /* Compile the predefined portion of the UEFI table */
   3140       1.1  christos 
   3141       1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
   3142   1.1.1.6  christos         &Subtable);
   3143       1.1  christos     if (ACPI_FAILURE (Status))
   3144       1.1  christos     {
   3145       1.1  christos         return (Status);
   3146       1.1  christos     }
   3147       1.1  christos 
   3148       1.1  christos     DataOffset = (UINT16 *) (Subtable->Buffer + 16);
   3149       1.1  christos     *DataOffset = sizeof (ACPI_TABLE_UEFI);
   3150       1.1  christos 
   3151       1.1  christos     ParentTable = DtPeekSubtable ();
   3152       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   3153       1.1  christos 
   3154       1.1  christos     /*
   3155       1.1  christos      * Compile the "generic" portion of the UEFI table. This
   3156       1.1  christos      * part of the table is not predefined and any of the generic
   3157       1.1  christos      * operators may be used.
   3158       1.1  christos      */
   3159       1.1  christos     DtCompileGeneric ((void **) PFieldList, NULL, NULL);
   3160       1.1  christos     return (AE_OK);
   3161       1.1  christos }
   3162       1.1  christos 
   3163       1.1  christos 
   3164       1.1  christos /******************************************************************************
   3165       1.1  christos  *
   3166  1.1.1.11  christos  * FUNCTION:    DtCompileViot
   3167       1.1  christos  *
   3168       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3169       1.1  christos  *
   3170       1.1  christos  * RETURN:      Status
   3171       1.1  christos  *
   3172  1.1.1.11  christos  * DESCRIPTION: Compile VIOT.
   3173       1.1  christos  *
   3174       1.1  christos  *****************************************************************************/
   3175       1.1  christos 
   3176       1.1  christos ACPI_STATUS
   3177  1.1.1.11  christos DtCompileViot (
   3178       1.1  christos     void                    **List)
   3179       1.1  christos {
   3180       1.1  christos     ACPI_STATUS             Status;
   3181  1.1.1.11  christos     DT_SUBTABLE             *Subtable;
   3182  1.1.1.11  christos     DT_SUBTABLE             *ParentTable;
   3183  1.1.1.11  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3184  1.1.1.11  christos     DT_FIELD                *SubtableStart;
   3185  1.1.1.11  christos     ACPI_TABLE_VIOT         *Viot;
   3186  1.1.1.11  christos     ACPI_VIOT_HEADER        *ViotHeader;
   3187  1.1.1.11  christos     ACPI_DMTABLE_INFO       *InfoTable;
   3188  1.1.1.11  christos     UINT16                  NodeCount;
   3189       1.1  christos 
   3190  1.1.1.11  christos     ParentTable = DtPeekSubtable ();
   3191       1.1  christos 
   3192  1.1.1.11  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
   3193  1.1.1.11  christos     if (ACPI_FAILURE (Status))
   3194  1.1.1.11  christos     {
   3195  1.1.1.11  christos         return (Status);
   3196  1.1.1.11  christos     }
   3197  1.1.1.11  christos     DtInsertSubtable (ParentTable, Subtable);
   3198  1.1.1.11  christos 
   3199  1.1.1.11  christos     /*
   3200  1.1.1.11  christos      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
   3201  1.1.1.11  christos      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
   3202  1.1.1.11  christos      */
   3203  1.1.1.11  christos     Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
   3204  1.1.1.11  christos         sizeof (ACPI_TABLE_HEADER));
   3205  1.1.1.11  christos 
   3206  1.1.1.11  christos     Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
   3207  1.1.1.11  christos 
   3208  1.1.1.11  christos     NodeCount = 0;
   3209  1.1.1.11  christos     while (*PFieldList) {
   3210  1.1.1.11  christos         SubtableStart = *PFieldList;
   3211  1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
   3212  1.1.1.11  christos             &Subtable);
   3213  1.1.1.11  christos         if (ACPI_FAILURE (Status))
   3214  1.1.1.11  christos         {
   3215  1.1.1.11  christos             return (Status);
   3216  1.1.1.11  christos         }
   3217  1.1.1.11  christos 
   3218  1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   3219  1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   3220  1.1.1.11  christos         DtPushSubtable (Subtable);
   3221  1.1.1.11  christos 
   3222  1.1.1.11  christos         ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
   3223  1.1.1.11  christos 
   3224  1.1.1.11  christos         switch (ViotHeader->Type)
   3225  1.1.1.11  christos         {
   3226  1.1.1.11  christos         case ACPI_VIOT_NODE_PCI_RANGE:
   3227  1.1.1.11  christos 
   3228  1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot1;
   3229  1.1.1.11  christos             break;
   3230  1.1.1.11  christos 
   3231  1.1.1.11  christos         case ACPI_VIOT_NODE_MMIO:
   3232  1.1.1.11  christos 
   3233  1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot2;
   3234  1.1.1.11  christos             break;
   3235  1.1.1.11  christos 
   3236  1.1.1.11  christos         case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
   3237  1.1.1.11  christos 
   3238  1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot3;
   3239  1.1.1.11  christos             break;
   3240  1.1.1.11  christos 
   3241  1.1.1.11  christos         case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
   3242  1.1.1.11  christos 
   3243  1.1.1.11  christos             InfoTable = AcpiDmTableInfoViot4;
   3244  1.1.1.11  christos             break;
   3245  1.1.1.11  christos 
   3246  1.1.1.11  christos         default:
   3247  1.1.1.11  christos 
   3248  1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
   3249  1.1.1.11  christos             return (AE_ERROR);
   3250  1.1.1.11  christos         }
   3251  1.1.1.11  christos 
   3252  1.1.1.11  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   3253  1.1.1.11  christos         if (ACPI_FAILURE (Status))
   3254  1.1.1.11  christos         {
   3255  1.1.1.11  christos             return (Status);
   3256  1.1.1.11  christos         }
   3257  1.1.1.11  christos 
   3258  1.1.1.11  christos         ParentTable = DtPeekSubtable ();
   3259  1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
   3260  1.1.1.11  christos         DtPopSubtable ();
   3261  1.1.1.11  christos         NodeCount++;
   3262  1.1.1.11  christos     }
   3263  1.1.1.11  christos 
   3264  1.1.1.11  christos     Viot->NodeCount = NodeCount;
   3265  1.1.1.11  christos     return (AE_OK);
   3266       1.1  christos }
   3267       1.1  christos 
   3268       1.1  christos 
   3269       1.1  christos /******************************************************************************
   3270       1.1  christos  *
   3271       1.1  christos  * FUNCTION:    DtCompileWdat
   3272       1.1  christos  *
   3273       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3274       1.1  christos  *
   3275       1.1  christos  * RETURN:      Status
   3276       1.1  christos  *
   3277       1.1  christos  * DESCRIPTION: Compile WDAT.
   3278       1.1  christos  *
   3279       1.1  christos  *****************************************************************************/
   3280       1.1  christos 
   3281       1.1  christos ACPI_STATUS
   3282       1.1  christos DtCompileWdat (
   3283       1.1  christos     void                    **List)
   3284       1.1  christos {
   3285       1.1  christos     ACPI_STATUS             Status;
   3286       1.1  christos 
   3287       1.1  christos 
   3288       1.1  christos     Status = DtCompileTwoSubtables (List,
   3289       1.1  christos         AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
   3290       1.1  christos     return (Status);
   3291       1.1  christos }
   3292       1.1  christos 
   3293       1.1  christos 
   3294       1.1  christos /******************************************************************************
   3295       1.1  christos  *
   3296       1.1  christos  * FUNCTION:    DtCompileWpbt
   3297       1.1  christos  *
   3298       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3299       1.1  christos  *
   3300       1.1  christos  * RETURN:      Status
   3301       1.1  christos  *
   3302       1.1  christos  * DESCRIPTION: Compile WPBT.
   3303       1.1  christos  *
   3304       1.1  christos  *****************************************************************************/
   3305       1.1  christos 
   3306       1.1  christos ACPI_STATUS
   3307       1.1  christos DtCompileWpbt (
   3308       1.1  christos     void                    **List)
   3309       1.1  christos {
   3310       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3311       1.1  christos     DT_SUBTABLE             *Subtable;
   3312       1.1  christos     DT_SUBTABLE             *ParentTable;
   3313       1.1  christos     ACPI_TABLE_WPBT         *Table;
   3314       1.1  christos     ACPI_STATUS             Status;
   3315       1.1  christos 
   3316       1.1  christos 
   3317       1.1  christos     /* Compile the main table */
   3318       1.1  christos 
   3319  1.1.1.13  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt, &Subtable);
   3320       1.1  christos     if (ACPI_FAILURE (Status))
   3321       1.1  christos     {
   3322       1.1  christos         return (Status);
   3323       1.1  christos     }
   3324       1.1  christos 
   3325       1.1  christos     ParentTable = DtPeekSubtable ();
   3326       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   3327  1.1.1.13  christos     Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
   3328  1.1.1.13  christos 
   3329  1.1.1.13  christos     /*
   3330  1.1.1.13  christos      * Exit now if there are no arguments specified. This is indicated by:
   3331  1.1.1.13  christos      * The "Command-line Arguments" field has not been specified (if specified,
   3332  1.1.1.13  christos      * it will be the last field in the field list -- after the main table).
   3333  1.1.1.13  christos      * Set the Argument Length in the main table to zero.
   3334  1.1.1.13  christos      */
   3335  1.1.1.13  christos     if (!*PFieldList)
   3336  1.1.1.13  christos     {
   3337  1.1.1.13  christos         Table->ArgumentsLength = 0;
   3338  1.1.1.13  christos         return (AE_OK);
   3339  1.1.1.13  christos     }
   3340       1.1  christos 
   3341       1.1  christos     /* Compile the argument list subtable */
   3342       1.1  christos 
   3343  1.1.1.13  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0, &Subtable);
   3344       1.1  christos     if (ACPI_FAILURE (Status))
   3345       1.1  christos     {
   3346       1.1  christos         return (Status);
   3347       1.1  christos     }
   3348       1.1  christos 
   3349       1.1  christos     /* Extract the length of the Arguments buffer, insert into main table */
   3350       1.1  christos 
   3351  1.1.1.13  christos     Table->ArgumentsLength = (UINT16) Subtable->TotalLength;
   3352       1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   3353       1.1  christos     return (AE_OK);
   3354       1.1  christos }
   3355       1.1  christos 
   3356       1.1  christos 
   3357       1.1  christos /******************************************************************************
   3358       1.1  christos  *
   3359       1.1  christos  * FUNCTION:    DtCompileXsdt
   3360       1.1  christos  *
   3361       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3362       1.1  christos  *
   3363       1.1  christos  * RETURN:      Status
   3364       1.1  christos  *
   3365       1.1  christos  * DESCRIPTION: Compile XSDT.
   3366       1.1  christos  *
   3367       1.1  christos  *****************************************************************************/
   3368       1.1  christos 
   3369       1.1  christos ACPI_STATUS
   3370       1.1  christos DtCompileXsdt (
   3371       1.1  christos     void                    **List)
   3372       1.1  christos {
   3373       1.1  christos     DT_SUBTABLE             *Subtable;
   3374       1.1  christos     DT_SUBTABLE             *ParentTable;
   3375       1.1  christos     DT_FIELD                *FieldList = *(DT_FIELD **) List;
   3376       1.1  christos     UINT64                  Address;
   3377       1.1  christos 
   3378       1.1  christos 
   3379       1.1  christos     ParentTable = DtPeekSubtable ();
   3380       1.1  christos 
   3381       1.1  christos     while (FieldList)
   3382       1.1  christos     {
   3383       1.1  christos         DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
   3384       1.1  christos 
   3385       1.1  christos         DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
   3386       1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   3387       1.1  christos         FieldList = FieldList->Next;
   3388       1.1  christos     }
   3389       1.1  christos 
   3390       1.1  christos     return (AE_OK);
   3391       1.1  christos }
   3392       1.1  christos 
   3393       1.1  christos 
   3394       1.1  christos /******************************************************************************
   3395       1.1  christos  *
   3396       1.1  christos  * FUNCTION:    DtCompileGeneric
   3397       1.1  christos  *
   3398       1.1  christos  * PARAMETERS:  List                - Current field list pointer
   3399       1.1  christos  *              Name                - Field name to end generic compiling
   3400       1.1  christos  *              Length              - Compiled table length to return
   3401       1.1  christos  *
   3402       1.1  christos  * RETURN:      Status
   3403       1.1  christos  *
   3404       1.1  christos  * DESCRIPTION: Compile generic unknown table.
   3405       1.1  christos  *
   3406       1.1  christos  *****************************************************************************/
   3407       1.1  christos 
   3408       1.1  christos ACPI_STATUS
   3409       1.1  christos DtCompileGeneric (
   3410       1.1  christos     void                    **List,
   3411       1.1  christos     char                    *Name,
   3412       1.1  christos     UINT32                  *Length)
   3413       1.1  christos {
   3414       1.1  christos     ACPI_STATUS             Status;
   3415       1.1  christos     DT_SUBTABLE             *Subtable;
   3416       1.1  christos     DT_SUBTABLE             *ParentTable;
   3417       1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   3418       1.1  christos     ACPI_DMTABLE_INFO       *Info;
   3419       1.1  christos 
   3420       1.1  christos 
   3421       1.1  christos     ParentTable = DtPeekSubtable ();
   3422       1.1  christos 
   3423       1.1  christos     /*
   3424       1.1  christos      * Compile the "generic" portion of the table. This
   3425       1.1  christos      * part of the table is not predefined and any of the generic
   3426       1.1  christos      * operators may be used.
   3427       1.1  christos      */
   3428       1.1  christos 
   3429       1.1  christos     /* Find any and all labels in the entire generic portion */
   3430       1.1  christos 
   3431       1.1  christos     DtDetectAllLabels (*PFieldList);
   3432       1.1  christos 
   3433       1.1  christos     /* Now we can actually compile the parse tree */
   3434       1.1  christos 
   3435       1.1  christos     if (Length && *Length)
   3436       1.1  christos     {
   3437       1.1  christos         *Length = 0;
   3438       1.1  christos     }
   3439       1.1  christos     while (*PFieldList)
   3440       1.1  christos     {
   3441       1.1  christos         if (Name && !strcmp ((*PFieldList)->Name, Name))
   3442       1.1  christos         {
   3443       1.1  christos             break;
   3444       1.1  christos         }
   3445       1.1  christos 
   3446       1.1  christos         Info = DtGetGenericTableInfo ((*PFieldList)->Name);
   3447       1.1  christos         if (!Info)
   3448       1.1  christos         {
   3449   1.1.1.7  christos             sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   3450       1.1  christos                 (*PFieldList)->Name);
   3451       1.1  christos             DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3452   1.1.1.7  christos                 (*PFieldList), AslGbl_MsgBuffer);
   3453       1.1  christos 
   3454       1.1  christos             *PFieldList = (*PFieldList)->Next;
   3455       1.1  christos             continue;
   3456       1.1  christos         }
   3457       1.1  christos 
   3458       1.1  christos         Status = DtCompileTable (PFieldList, Info,
   3459   1.1.1.6  christos             &Subtable);
   3460       1.1  christos         if (ACPI_SUCCESS (Status))
   3461       1.1  christos         {
   3462       1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   3463       1.1  christos             if (Length)
   3464       1.1  christos             {
   3465       1.1  christos                 *Length += Subtable->Length;
   3466       1.1  christos             }
   3467       1.1  christos         }
   3468       1.1  christos         else
   3469       1.1  christos         {
   3470       1.1  christos             *PFieldList = (*PFieldList)->Next;
   3471       1.1  christos 
   3472       1.1  christos             if (Status == AE_NOT_FOUND)
   3473       1.1  christos             {
   3474   1.1.1.7  christos                 sprintf (AslGbl_MsgBuffer, "Generic data type \"%s\" not found",
   3475       1.1  christos                     (*PFieldList)->Name);
   3476       1.1  christos                 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
   3477   1.1.1.7  christos                     (*PFieldList), AslGbl_MsgBuffer);
   3478       1.1  christos             }
   3479       1.1  christos         }
   3480       1.1  christos     }
   3481       1.1  christos 
   3482       1.1  christos     return (AE_OK);
   3483       1.1  christos }
   3484