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