Home | History | Annotate | Line # | Download | only in compiler
dttable1.c revision 1.1.1.11.2.1
      1           1.1  christos /******************************************************************************
      2           1.1  christos  *
      3           1.1  christos  * Module Name: dttable1.c - handling for specific ACPI tables
      4           1.1  christos  *
      5           1.1  christos  *****************************************************************************/
      6           1.1  christos 
      7           1.1  christos /*
      8      1.1.1.11  christos  * Copyright (C) 2000 - 2021, Intel Corp.
      9           1.1  christos  * All rights reserved.
     10           1.1  christos  *
     11           1.1  christos  * Redistribution and use in source and binary forms, with or without
     12           1.1  christos  * modification, are permitted provided that the following conditions
     13           1.1  christos  * are met:
     14           1.1  christos  * 1. Redistributions of source code must retain the above copyright
     15           1.1  christos  *    notice, this list of conditions, and the following disclaimer,
     16           1.1  christos  *    without modification.
     17           1.1  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18           1.1  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
     19           1.1  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
     20           1.1  christos  *    including a substantially similar Disclaimer requirement for further
     21           1.1  christos  *    binary redistribution.
     22           1.1  christos  * 3. Neither the names of the above-listed copyright holders nor the names
     23           1.1  christos  *    of any contributors may be used to endorse or promote products derived
     24           1.1  christos  *    from this software without specific prior written permission.
     25           1.1  christos  *
     26           1.1  christos  * Alternatively, this software may be distributed under the terms of the
     27           1.1  christos  * GNU General Public License ("GPL") version 2 as published by the Free
     28           1.1  christos  * Software Foundation.
     29           1.1  christos  *
     30           1.1  christos  * NO WARRANTY
     31           1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32           1.1  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33      1.1.1.11  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34           1.1  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35           1.1  christos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36           1.1  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37           1.1  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38           1.1  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39           1.1  christos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40           1.1  christos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41           1.1  christos  * POSSIBILITY OF SUCH DAMAGES.
     42           1.1  christos  */
     43           1.1  christos 
     44           1.1  christos /* Compile all complex data tables, signatures starting with A-I */
     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    ("dttable1")
     50           1.1  christos 
     51           1.1  christos 
     52           1.1  christos static ACPI_DMTABLE_INFO           TableInfoAsfAddress[] =
     53           1.1  christos {
     54           1.1  christos     {ACPI_DMT_BUFFER,   0,               "Addresses", 0},
     55           1.1  christos     {ACPI_DMT_EXIT,     0,               NULL, 0}
     56           1.1  christos };
     57           1.1  christos 
     58           1.1  christos static ACPI_DMTABLE_INFO           TableInfoDmarPciPath[] =
     59           1.1  christos {
     60           1.1  christos     {ACPI_DMT_PCI_PATH, 0,               "PCI Path", 0},
     61           1.1  christos     {ACPI_DMT_EXIT,     0,               NULL, 0}
     62           1.1  christos };
     63           1.1  christos 
     64           1.1  christos 
     65           1.1  christos /******************************************************************************
     66           1.1  christos  *
     67           1.1  christos  * FUNCTION:    DtCompileAsf
     68           1.1  christos  *
     69           1.1  christos  * PARAMETERS:  List                - Current field list pointer
     70           1.1  christos  *
     71           1.1  christos  * RETURN:      Status
     72           1.1  christos  *
     73           1.1  christos  * DESCRIPTION: Compile ASF!.
     74           1.1  christos  *
     75           1.1  christos  *****************************************************************************/
     76           1.1  christos 
     77           1.1  christos ACPI_STATUS
     78           1.1  christos DtCompileAsf (
     79           1.1  christos     void                    **List)
     80           1.1  christos {
     81           1.1  christos     ACPI_ASF_INFO           *AsfTable;
     82           1.1  christos     DT_SUBTABLE             *Subtable;
     83           1.1  christos     DT_SUBTABLE             *ParentTable;
     84           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
     85           1.1  christos     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
     86           1.1  christos     UINT32                  DataCount = 0;
     87           1.1  christos     ACPI_STATUS             Status;
     88           1.1  christos     UINT32                  i;
     89           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
     90           1.1  christos     DT_FIELD                *SubtableStart;
     91           1.1  christos 
     92           1.1  christos 
     93           1.1  christos     while (*PFieldList)
     94           1.1  christos     {
     95           1.1  christos         SubtableStart = *PFieldList;
     96           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
     97       1.1.1.7  christos             &Subtable);
     98           1.1  christos         if (ACPI_FAILURE (Status))
     99           1.1  christos         {
    100           1.1  christos             return (Status);
    101           1.1  christos         }
    102           1.1  christos 
    103           1.1  christos         ParentTable = DtPeekSubtable ();
    104           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    105           1.1  christos         DtPushSubtable (Subtable);
    106           1.1  christos 
    107           1.1  christos         AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
    108           1.1  christos 
    109           1.1  christos         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
    110           1.1  christos         {
    111           1.1  christos         case ACPI_ASF_TYPE_INFO:
    112           1.1  christos 
    113           1.1  christos             InfoTable = AcpiDmTableInfoAsf0;
    114           1.1  christos             break;
    115           1.1  christos 
    116           1.1  christos         case ACPI_ASF_TYPE_ALERT:
    117           1.1  christos 
    118           1.1  christos             InfoTable = AcpiDmTableInfoAsf1;
    119           1.1  christos             break;
    120           1.1  christos 
    121           1.1  christos         case ACPI_ASF_TYPE_CONTROL:
    122           1.1  christos 
    123           1.1  christos             InfoTable = AcpiDmTableInfoAsf2;
    124           1.1  christos             break;
    125           1.1  christos 
    126           1.1  christos         case ACPI_ASF_TYPE_BOOT:
    127           1.1  christos 
    128           1.1  christos             InfoTable = AcpiDmTableInfoAsf3;
    129           1.1  christos             break;
    130           1.1  christos 
    131           1.1  christos         case ACPI_ASF_TYPE_ADDRESS:
    132           1.1  christos 
    133           1.1  christos             InfoTable = AcpiDmTableInfoAsf4;
    134           1.1  christos             break;
    135           1.1  christos 
    136           1.1  christos         default:
    137           1.1  christos 
    138           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
    139           1.1  christos             return (AE_ERROR);
    140           1.1  christos         }
    141           1.1  christos 
    142       1.1.1.7  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    143           1.1  christos         if (ACPI_FAILURE (Status))
    144           1.1  christos         {
    145           1.1  christos             return (Status);
    146           1.1  christos         }
    147           1.1  christos 
    148           1.1  christos         ParentTable = DtPeekSubtable ();
    149           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    150           1.1  christos 
    151           1.1  christos         switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
    152           1.1  christos         {
    153           1.1  christos         case ACPI_ASF_TYPE_INFO:
    154           1.1  christos 
    155           1.1  christos             DataInfoTable = NULL;
    156           1.1  christos             break;
    157           1.1  christos 
    158           1.1  christos         case ACPI_ASF_TYPE_ALERT:
    159           1.1  christos 
    160           1.1  christos             DataInfoTable = AcpiDmTableInfoAsf1a;
    161           1.1  christos             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
    162           1.1  christos                 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
    163           1.1  christos                     sizeof (ACPI_ASF_HEADER)))->Alerts;
    164           1.1  christos             break;
    165           1.1  christos 
    166           1.1  christos         case ACPI_ASF_TYPE_CONTROL:
    167           1.1  christos 
    168           1.1  christos             DataInfoTable = AcpiDmTableInfoAsf2a;
    169           1.1  christos             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
    170           1.1  christos                 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
    171           1.1  christos                     sizeof (ACPI_ASF_HEADER)))->Controls;
    172           1.1  christos             break;
    173           1.1  christos 
    174           1.1  christos         case ACPI_ASF_TYPE_BOOT:
    175           1.1  christos 
    176           1.1  christos             DataInfoTable = NULL;
    177           1.1  christos             break;
    178           1.1  christos 
    179           1.1  christos         case ACPI_ASF_TYPE_ADDRESS:
    180           1.1  christos 
    181           1.1  christos             DataInfoTable = TableInfoAsfAddress;
    182           1.1  christos             DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
    183           1.1  christos                 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
    184           1.1  christos                     sizeof (ACPI_ASF_HEADER)))->Devices;
    185           1.1  christos             break;
    186           1.1  christos 
    187           1.1  christos         default:
    188           1.1  christos 
    189           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
    190           1.1  christos             return (AE_ERROR);
    191           1.1  christos         }
    192           1.1  christos 
    193           1.1  christos         if (DataInfoTable)
    194           1.1  christos         {
    195           1.1  christos             switch (AsfTable->Header.Type & 0x7F)
    196           1.1  christos             {
    197           1.1  christos             case ACPI_ASF_TYPE_ADDRESS:
    198           1.1  christos 
    199           1.1  christos                 while (DataCount > 0)
    200           1.1  christos                 {
    201           1.1  christos                     Status = DtCompileTable (PFieldList, DataInfoTable,
    202       1.1.1.7  christos                         &Subtable);
    203           1.1  christos                     if (ACPI_FAILURE (Status))
    204           1.1  christos                     {
    205           1.1  christos                         return (Status);
    206           1.1  christos                     }
    207           1.1  christos 
    208           1.1  christos                     DtInsertSubtable (ParentTable, Subtable);
    209           1.1  christos                     DataCount = DataCount - Subtable->Length;
    210           1.1  christos                 }
    211           1.1  christos                 break;
    212           1.1  christos 
    213           1.1  christos             default:
    214           1.1  christos 
    215           1.1  christos                 for (i = 0; i < DataCount; i++)
    216           1.1  christos                 {
    217           1.1  christos                     Status = DtCompileTable (PFieldList, DataInfoTable,
    218       1.1.1.7  christos                         &Subtable);
    219           1.1  christos                     if (ACPI_FAILURE (Status))
    220           1.1  christos                     {
    221           1.1  christos                         return (Status);
    222           1.1  christos                     }
    223           1.1  christos 
    224           1.1  christos                     DtInsertSubtable (ParentTable, Subtable);
    225           1.1  christos                 }
    226           1.1  christos                 break;
    227           1.1  christos             }
    228           1.1  christos         }
    229           1.1  christos 
    230           1.1  christos         DtPopSubtable ();
    231           1.1  christos     }
    232           1.1  christos 
    233           1.1  christos     return (AE_OK);
    234           1.1  christos }
    235           1.1  christos 
    236           1.1  christos 
    237           1.1  christos /******************************************************************************
    238           1.1  christos  *
    239      1.1.1.11  christos  * FUNCTION:    DtCompileCedt
    240      1.1.1.11  christos  *
    241      1.1.1.11  christos  * PARAMETERS:  List                - Current field list pointer
    242      1.1.1.11  christos  *
    243      1.1.1.11  christos  * RETURN:      Status
    244      1.1.1.11  christos  *
    245      1.1.1.11  christos  * DESCRIPTION: Compile CEDT.
    246      1.1.1.11  christos  *
    247      1.1.1.11  christos  *****************************************************************************/
    248      1.1.1.11  christos 
    249      1.1.1.11  christos ACPI_STATUS
    250      1.1.1.11  christos DtCompileCedt (
    251      1.1.1.11  christos     void                    **List)
    252      1.1.1.11  christos {
    253      1.1.1.11  christos     ACPI_STATUS             Status;
    254      1.1.1.11  christos     DT_SUBTABLE             *Subtable;
    255      1.1.1.11  christos     DT_SUBTABLE             *ParentTable;
    256      1.1.1.11  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    257      1.1.1.11  christos     ACPI_CEDT_HEADER        *CedtHeader;
    258      1.1.1.11  christos     DT_FIELD                *SubtableStart;
    259      1.1.1.11  christos 
    260      1.1.1.11  christos 
    261      1.1.1.11  christos     /* Walk the parse tree */
    262      1.1.1.11  christos 
    263      1.1.1.11  christos     while (*PFieldList)
    264      1.1.1.11  christos     {
    265      1.1.1.11  christos         SubtableStart = *PFieldList;
    266      1.1.1.11  christos 
    267      1.1.1.11  christos         /* CEDT Header */
    268      1.1.1.11  christos 
    269      1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedtHdr,
    270      1.1.1.11  christos             &Subtable);
    271      1.1.1.11  christos         if (ACPI_FAILURE (Status))
    272      1.1.1.11  christos         {
    273      1.1.1.11  christos             return (Status);
    274      1.1.1.11  christos         }
    275      1.1.1.11  christos 
    276      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
    277      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
    278      1.1.1.11  christos         DtPushSubtable (Subtable);
    279      1.1.1.11  christos 
    280      1.1.1.11  christos         CedtHeader = ACPI_CAST_PTR (ACPI_CEDT_HEADER, Subtable->Buffer);
    281      1.1.1.11  christos 
    282      1.1.1.11  christos         switch (CedtHeader->Type)
    283      1.1.1.11  christos         {
    284      1.1.1.11  christos         case ACPI_CEDT_TYPE_CHBS:
    285      1.1.1.11  christos 
    286      1.1.1.11  christos             break;
    287      1.1.1.11  christos 
    288      1.1.1.11  christos         default:
    289      1.1.1.11  christos 
    290      1.1.1.11  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CEDT");
    291      1.1.1.11  christos             return (AE_ERROR);
    292      1.1.1.11  christos         }
    293      1.1.1.11  christos 
    294      1.1.1.11  christos         /* CEDT Subtable */
    295      1.1.1.11  christos 
    296      1.1.1.11  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt0, &Subtable);
    297      1.1.1.11  christos         if (ACPI_FAILURE (Status))
    298      1.1.1.11  christos         {
    299      1.1.1.11  christos             return (Status);
    300      1.1.1.11  christos         }
    301      1.1.1.11  christos 
    302      1.1.1.11  christos         ParentTable = DtPeekSubtable ();
    303      1.1.1.11  christos         DtInsertSubtable (ParentTable, Subtable);
    304      1.1.1.11  christos         DtPopSubtable ();
    305      1.1.1.11  christos     }
    306      1.1.1.11  christos 
    307      1.1.1.11  christos     return (AE_OK);
    308      1.1.1.11  christos }
    309      1.1.1.11  christos 
    310      1.1.1.11  christos 
    311      1.1.1.11  christos /******************************************************************************
    312      1.1.1.11  christos  *
    313           1.1  christos  * FUNCTION:    DtCompileCpep
    314           1.1  christos  *
    315           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    316           1.1  christos  *
    317           1.1  christos  * RETURN:      Status
    318           1.1  christos  *
    319           1.1  christos  * DESCRIPTION: Compile CPEP.
    320           1.1  christos  *
    321           1.1  christos  *****************************************************************************/
    322           1.1  christos 
    323           1.1  christos ACPI_STATUS
    324           1.1  christos DtCompileCpep (
    325           1.1  christos     void                    **List)
    326           1.1  christos {
    327           1.1  christos     ACPI_STATUS             Status;
    328           1.1  christos 
    329           1.1  christos 
    330           1.1  christos     Status = DtCompileTwoSubtables (List,
    331           1.1  christos         AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
    332           1.1  christos     return (Status);
    333           1.1  christos }
    334           1.1  christos 
    335           1.1  christos 
    336           1.1  christos /******************************************************************************
    337           1.1  christos  *
    338           1.1  christos  * FUNCTION:    DtCompileCsrt
    339           1.1  christos  *
    340           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    341           1.1  christos  *
    342           1.1  christos  * RETURN:      Status
    343           1.1  christos  *
    344           1.1  christos  * DESCRIPTION: Compile CSRT.
    345           1.1  christos  *
    346           1.1  christos  *****************************************************************************/
    347           1.1  christos 
    348           1.1  christos ACPI_STATUS
    349           1.1  christos DtCompileCsrt (
    350           1.1  christos     void                    **List)
    351           1.1  christos {
    352           1.1  christos     ACPI_STATUS             Status = AE_OK;
    353           1.1  christos     DT_SUBTABLE             *Subtable;
    354           1.1  christos     DT_SUBTABLE             *ParentTable;
    355           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    356           1.1  christos     UINT32                  DescriptorCount;
    357           1.1  christos     UINT32                  GroupLength;
    358           1.1  christos 
    359           1.1  christos 
    360           1.1  christos     /* Subtables (Resource Groups) */
    361           1.1  christos 
    362           1.1  christos     ParentTable = DtPeekSubtable ();
    363           1.1  christos     while (*PFieldList)
    364           1.1  christos     {
    365           1.1  christos         /* Resource group subtable */
    366           1.1  christos 
    367           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
    368       1.1.1.7  christos             &Subtable);
    369           1.1  christos         if (ACPI_FAILURE (Status))
    370           1.1  christos         {
    371           1.1  christos             return (Status);
    372           1.1  christos         }
    373           1.1  christos 
    374           1.1  christos         /* Compute the number of resource descriptors */
    375           1.1  christos 
    376           1.1  christos         GroupLength =
    377           1.1  christos             (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
    378           1.1  christos                 Subtable->Buffer))->Length -
    379           1.1  christos             (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
    380           1.1  christos                 Subtable->Buffer))->SharedInfoLength -
    381           1.1  christos             sizeof (ACPI_CSRT_GROUP);
    382           1.1  christos 
    383           1.1  christos         DescriptorCount = (GroupLength  /
    384           1.1  christos             sizeof (ACPI_CSRT_DESCRIPTOR));
    385           1.1  christos 
    386           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    387           1.1  christos         DtPushSubtable (Subtable);
    388           1.1  christos         ParentTable = DtPeekSubtable ();
    389           1.1  christos 
    390           1.1  christos         /* Shared info subtable (One per resource group) */
    391           1.1  christos 
    392           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
    393       1.1.1.7  christos             &Subtable);
    394           1.1  christos         if (ACPI_FAILURE (Status))
    395           1.1  christos         {
    396           1.1  christos             return (Status);
    397           1.1  christos         }
    398           1.1  christos 
    399           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    400           1.1  christos 
    401           1.1  christos         /* Sub-Subtables (Resource Descriptors) */
    402           1.1  christos 
    403           1.1  christos         while (*PFieldList && DescriptorCount)
    404           1.1  christos         {
    405           1.1  christos 
    406           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
    407       1.1.1.7  christos                 &Subtable);
    408           1.1  christos             if (ACPI_FAILURE (Status))
    409           1.1  christos             {
    410           1.1  christos                 return (Status);
    411           1.1  christos             }
    412           1.1  christos 
    413           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
    414           1.1  christos 
    415           1.1  christos             DtPushSubtable (Subtable);
    416           1.1  christos             ParentTable = DtPeekSubtable ();
    417           1.1  christos             if (*PFieldList)
    418           1.1  christos             {
    419           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
    420       1.1.1.7  christos                     &Subtable);
    421           1.1  christos                 if (ACPI_FAILURE (Status))
    422           1.1  christos                 {
    423           1.1  christos                     return (Status);
    424           1.1  christos                 }
    425           1.1  christos                 if (Subtable)
    426           1.1  christos                 {
    427           1.1  christos                     DtInsertSubtable (ParentTable, Subtable);
    428           1.1  christos                 }
    429           1.1  christos             }
    430           1.1  christos 
    431           1.1  christos             DtPopSubtable ();
    432           1.1  christos             ParentTable = DtPeekSubtable ();
    433           1.1  christos             DescriptorCount--;
    434           1.1  christos         }
    435           1.1  christos 
    436           1.1  christos         DtPopSubtable ();
    437           1.1  christos         ParentTable = DtPeekSubtable ();
    438           1.1  christos     }
    439           1.1  christos 
    440           1.1  christos     return (Status);
    441           1.1  christos }
    442           1.1  christos 
    443           1.1  christos 
    444           1.1  christos /******************************************************************************
    445           1.1  christos  *
    446           1.1  christos  * FUNCTION:    DtCompileDbg2
    447           1.1  christos  *
    448           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    449           1.1  christos  *
    450           1.1  christos  * RETURN:      Status
    451           1.1  christos  *
    452           1.1  christos  * DESCRIPTION: Compile DBG2.
    453           1.1  christos  *
    454           1.1  christos  *****************************************************************************/
    455           1.1  christos 
    456           1.1  christos ACPI_STATUS
    457           1.1  christos DtCompileDbg2 (
    458           1.1  christos     void                    **List)
    459           1.1  christos {
    460           1.1  christos     ACPI_STATUS             Status;
    461           1.1  christos     DT_SUBTABLE             *Subtable;
    462           1.1  christos     DT_SUBTABLE             *ParentTable;
    463           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    464           1.1  christos     UINT32                  SubtableCount;
    465           1.1  christos     ACPI_DBG2_HEADER        *Dbg2Header;
    466           1.1  christos     ACPI_DBG2_DEVICE        *DeviceInfo;
    467           1.1  christos     UINT16                  CurrentOffset;
    468           1.1  christos     UINT32                  i;
    469           1.1  christos 
    470           1.1  christos 
    471           1.1  christos     /* Main table */
    472           1.1  christos 
    473       1.1.1.7  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable);
    474           1.1  christos     if (ACPI_FAILURE (Status))
    475           1.1  christos     {
    476           1.1  christos         return (Status);
    477           1.1  christos     }
    478           1.1  christos 
    479           1.1  christos     ParentTable = DtPeekSubtable ();
    480           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    481           1.1  christos 
    482           1.1  christos     /* Main table fields */
    483           1.1  christos 
    484           1.1  christos     Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
    485           1.1  christos     Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
    486           1.1  christos         ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
    487           1.1  christos 
    488           1.1  christos     SubtableCount = Dbg2Header->InfoCount;
    489           1.1  christos     DtPushSubtable (Subtable);
    490           1.1  christos 
    491           1.1  christos     /* Process all Device Information subtables (Count = InfoCount) */
    492           1.1  christos 
    493           1.1  christos     while (*PFieldList && SubtableCount)
    494           1.1  christos     {
    495           1.1  christos         /* Subtable: Debug Device Information */
    496           1.1  christos 
    497           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
    498       1.1.1.7  christos             &Subtable);
    499           1.1  christos         if (ACPI_FAILURE (Status))
    500           1.1  christos         {
    501           1.1  christos             return (Status);
    502           1.1  christos         }
    503           1.1  christos 
    504           1.1  christos         DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
    505           1.1  christos         CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
    506           1.1  christos 
    507           1.1  christos         ParentTable = DtPeekSubtable ();
    508           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    509           1.1  christos         DtPushSubtable (Subtable);
    510           1.1  christos 
    511           1.1  christos         ParentTable = DtPeekSubtable ();
    512           1.1  christos 
    513           1.1  christos         /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
    514           1.1  christos 
    515           1.1  christos         DeviceInfo->BaseAddressOffset = CurrentOffset;
    516           1.1  christos         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
    517           1.1  christos         {
    518           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
    519       1.1.1.7  christos                 &Subtable);
    520           1.1  christos             if (ACPI_FAILURE (Status))
    521           1.1  christos             {
    522           1.1  christos                 return (Status);
    523           1.1  christos             }
    524           1.1  christos 
    525           1.1  christos             CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
    526           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
    527           1.1  christos         }
    528           1.1  christos 
    529           1.1  christos         /* AddressSize array (Required, size = RegisterCount) */
    530           1.1  christos 
    531           1.1  christos         DeviceInfo->AddressSizeOffset = CurrentOffset;
    532           1.1  christos         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
    533           1.1  christos         {
    534           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
    535       1.1.1.7  christos                 &Subtable);
    536           1.1  christos             if (ACPI_FAILURE (Status))
    537           1.1  christos             {
    538           1.1  christos                 return (Status);
    539           1.1  christos             }
    540           1.1  christos 
    541           1.1  christos             CurrentOffset += (UINT16) sizeof (UINT32);
    542           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
    543           1.1  christos         }
    544           1.1  christos 
    545           1.1  christos         /* NamespaceString device identifier (Required, size = NamePathLength) */
    546           1.1  christos 
    547           1.1  christos         DeviceInfo->NamepathOffset = CurrentOffset;
    548           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
    549       1.1.1.7  christos             &Subtable);
    550           1.1  christos         if (ACPI_FAILURE (Status))
    551           1.1  christos         {
    552           1.1  christos             return (Status);
    553           1.1  christos         }
    554           1.1  christos 
    555           1.1  christos         /* Update the device info header */
    556           1.1  christos 
    557           1.1  christos         DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
    558           1.1  christos         CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
    559           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    560           1.1  christos 
    561           1.1  christos         /* OemData - Variable-length data (Optional, size = OemDataLength) */
    562           1.1  christos 
    563           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
    564       1.1.1.7  christos             &Subtable);
    565       1.1.1.7  christos         if (Status == AE_END_OF_TABLE)
    566       1.1.1.7  christos         {
    567       1.1.1.7  christos             /* optional field was not found and we're at the end of the file */
    568       1.1.1.7  christos 
    569       1.1.1.7  christos             goto subtableDone;
    570       1.1.1.7  christos         }
    571       1.1.1.7  christos         else if (ACPI_FAILURE (Status))
    572           1.1  christos         {
    573           1.1  christos             return (Status);
    574           1.1  christos         }
    575           1.1  christos 
    576           1.1  christos         /* Update the device info header (zeros if no OEM data present) */
    577           1.1  christos 
    578           1.1  christos         DeviceInfo->OemDataOffset = 0;
    579           1.1  christos         DeviceInfo->OemDataLength = 0;
    580           1.1  christos 
    581           1.1  christos         /* Optional subtable (OemData) */
    582           1.1  christos 
    583           1.1  christos         if (Subtable && Subtable->Length)
    584           1.1  christos         {
    585           1.1  christos             DeviceInfo->OemDataOffset = CurrentOffset;
    586           1.1  christos             DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
    587           1.1  christos 
    588           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
    589           1.1  christos         }
    590       1.1.1.7  christos subtableDone:
    591           1.1  christos         SubtableCount--;
    592           1.1  christos         DtPopSubtable (); /* Get next Device Information subtable */
    593           1.1  christos     }
    594           1.1  christos 
    595           1.1  christos     DtPopSubtable ();
    596           1.1  christos     return (AE_OK);
    597           1.1  christos }
    598           1.1  christos 
    599           1.1  christos 
    600           1.1  christos /******************************************************************************
    601           1.1  christos  *
    602           1.1  christos  * FUNCTION:    DtCompileDmar
    603           1.1  christos  *
    604           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    605           1.1  christos  *
    606           1.1  christos  * RETURN:      Status
    607           1.1  christos  *
    608           1.1  christos  * DESCRIPTION: Compile DMAR.
    609           1.1  christos  *
    610           1.1  christos  *****************************************************************************/
    611           1.1  christos 
    612           1.1  christos ACPI_STATUS
    613           1.1  christos DtCompileDmar (
    614           1.1  christos     void                    **List)
    615           1.1  christos {
    616           1.1  christos     ACPI_STATUS             Status;
    617           1.1  christos     DT_SUBTABLE             *Subtable;
    618           1.1  christos     DT_SUBTABLE             *ParentTable;
    619           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    620           1.1  christos     DT_FIELD                *SubtableStart;
    621           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
    622           1.1  christos     ACPI_DMAR_HEADER        *DmarHeader;
    623           1.1  christos     ACPI_DMAR_DEVICE_SCOPE  *DmarDeviceScope;
    624           1.1  christos     UINT32                  DeviceScopeLength;
    625           1.1  christos     UINT32                  PciPathLength;
    626           1.1  christos 
    627           1.1  christos 
    628       1.1.1.7  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable);
    629           1.1  christos     if (ACPI_FAILURE (Status))
    630           1.1  christos     {
    631           1.1  christos         return (Status);
    632           1.1  christos     }
    633           1.1  christos 
    634           1.1  christos     ParentTable = DtPeekSubtable ();
    635           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    636           1.1  christos     DtPushSubtable (Subtable);
    637           1.1  christos 
    638           1.1  christos     while (*PFieldList)
    639           1.1  christos     {
    640           1.1  christos         /* DMAR Header */
    641           1.1  christos 
    642           1.1  christos         SubtableStart = *PFieldList;
    643           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
    644       1.1.1.7  christos             &Subtable);
    645           1.1  christos         if (ACPI_FAILURE (Status))
    646           1.1  christos         {
    647           1.1  christos             return (Status);
    648           1.1  christos         }
    649           1.1  christos 
    650           1.1  christos         ParentTable = DtPeekSubtable ();
    651           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    652           1.1  christos         DtPushSubtable (Subtable);
    653           1.1  christos 
    654           1.1  christos         DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
    655           1.1  christos 
    656           1.1  christos         switch (DmarHeader->Type)
    657           1.1  christos         {
    658           1.1  christos         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
    659           1.1  christos 
    660           1.1  christos             InfoTable = AcpiDmTableInfoDmar0;
    661           1.1  christos             break;
    662           1.1  christos 
    663           1.1  christos         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
    664           1.1  christos 
    665           1.1  christos             InfoTable = AcpiDmTableInfoDmar1;
    666           1.1  christos             break;
    667           1.1  christos 
    668           1.1  christos         case ACPI_DMAR_TYPE_ROOT_ATS:
    669           1.1  christos 
    670           1.1  christos             InfoTable = AcpiDmTableInfoDmar2;
    671           1.1  christos             break;
    672           1.1  christos 
    673           1.1  christos         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
    674           1.1  christos 
    675           1.1  christos             InfoTable = AcpiDmTableInfoDmar3;
    676           1.1  christos             break;
    677           1.1  christos 
    678           1.1  christos         case ACPI_DMAR_TYPE_NAMESPACE:
    679           1.1  christos 
    680           1.1  christos             InfoTable = AcpiDmTableInfoDmar4;
    681           1.1  christos             break;
    682           1.1  christos 
    683           1.1  christos         default:
    684           1.1  christos 
    685           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
    686           1.1  christos             return (AE_ERROR);
    687           1.1  christos         }
    688           1.1  christos 
    689           1.1  christos         /* DMAR Subtable */
    690           1.1  christos 
    691       1.1.1.7  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
    692           1.1  christos         if (ACPI_FAILURE (Status))
    693           1.1  christos         {
    694           1.1  christos             return (Status);
    695           1.1  christos         }
    696           1.1  christos 
    697           1.1  christos         ParentTable = DtPeekSubtable ();
    698           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    699           1.1  christos 
    700           1.1  christos         /*
    701           1.1  christos          * Optional Device Scope subtables
    702           1.1  christos          */
    703           1.1  christos         if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
    704           1.1  christos             (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
    705           1.1  christos         {
    706           1.1  christos             /* These types do not support device scopes */
    707           1.1  christos 
    708           1.1  christos             DtPopSubtable ();
    709           1.1  christos             continue;
    710           1.1  christos         }
    711           1.1  christos 
    712           1.1  christos         DtPushSubtable (Subtable);
    713           1.1  christos         DeviceScopeLength = DmarHeader->Length - Subtable->Length -
    714           1.1  christos             ParentTable->Length;
    715           1.1  christos         while (DeviceScopeLength)
    716           1.1  christos         {
    717           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
    718       1.1.1.7  christos                 &Subtable);
    719           1.1  christos             if (Status == AE_NOT_FOUND)
    720           1.1  christos             {
    721           1.1  christos                 break;
    722           1.1  christos             }
    723           1.1  christos 
    724           1.1  christos             ParentTable = DtPeekSubtable ();
    725           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
    726           1.1  christos             DtPushSubtable (Subtable);
    727           1.1  christos 
    728           1.1  christos             DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
    729           1.1  christos 
    730           1.1  christos             /* Optional PCI Paths */
    731           1.1  christos 
    732           1.1  christos             PciPathLength = DmarDeviceScope->Length - Subtable->Length;
    733           1.1  christos             while (PciPathLength)
    734           1.1  christos             {
    735           1.1  christos                 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
    736       1.1.1.7  christos                     &Subtable);
    737           1.1  christos                 if (Status == AE_NOT_FOUND)
    738           1.1  christos                 {
    739           1.1  christos                     DtPopSubtable ();
    740           1.1  christos                     break;
    741           1.1  christos                 }
    742           1.1  christos 
    743           1.1  christos                 ParentTable = DtPeekSubtable ();
    744           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
    745           1.1  christos                 PciPathLength -= Subtable->Length;
    746           1.1  christos             }
    747           1.1  christos 
    748           1.1  christos             DtPopSubtable ();
    749           1.1  christos             DeviceScopeLength -= DmarDeviceScope->Length;
    750           1.1  christos         }
    751           1.1  christos 
    752           1.1  christos         DtPopSubtable ();
    753           1.1  christos         DtPopSubtable ();
    754           1.1  christos     }
    755           1.1  christos 
    756           1.1  christos     return (AE_OK);
    757           1.1  christos }
    758           1.1  christos 
    759           1.1  christos 
    760           1.1  christos /******************************************************************************
    761           1.1  christos  *
    762           1.1  christos  * FUNCTION:    DtCompileDrtm
    763           1.1  christos  *
    764           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    765           1.1  christos  *
    766           1.1  christos  * RETURN:      Status
    767           1.1  christos  *
    768           1.1  christos  * DESCRIPTION: Compile DRTM.
    769           1.1  christos  *
    770           1.1  christos  *****************************************************************************/
    771           1.1  christos 
    772           1.1  christos ACPI_STATUS
    773           1.1  christos DtCompileDrtm (
    774           1.1  christos     void                    **List)
    775           1.1  christos {
    776           1.1  christos     ACPI_STATUS             Status;
    777           1.1  christos     DT_SUBTABLE             *Subtable;
    778           1.1  christos     DT_SUBTABLE             *ParentTable;
    779           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    780           1.1  christos     UINT32                  Count;
    781           1.1  christos     /* ACPI_TABLE_DRTM         *Drtm; */
    782           1.1  christos     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
    783           1.1  christos     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
    784           1.1  christos     /* ACPI_DRTM_DPS_ID        *DrtmDps; */
    785           1.1  christos 
    786           1.1  christos 
    787           1.1  christos     ParentTable = DtPeekSubtable ();
    788           1.1  christos 
    789           1.1  christos     /* Compile DRTM header */
    790           1.1  christos 
    791           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm,
    792       1.1.1.7  christos         &Subtable);
    793           1.1  christos     if (ACPI_FAILURE (Status))
    794           1.1  christos     {
    795           1.1  christos         return (Status);
    796           1.1  christos     }
    797           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    798           1.1  christos 
    799           1.1  christos     /*
    800       1.1.1.9  christos      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
    801           1.1  christos      * should be taken to avoid accessing ACPI_TABLE_HADER fields.
    802           1.1  christos      */
    803           1.1  christos #if 0
    804           1.1  christos     Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM,
    805           1.1  christos         Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
    806           1.1  christos #endif
    807           1.1  christos     /* Compile VTL */
    808           1.1  christos 
    809           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0,
    810       1.1.1.7  christos         &Subtable);
    811           1.1  christos     if (ACPI_FAILURE (Status))
    812           1.1  christos     {
    813           1.1  christos         return (Status);
    814           1.1  christos     }
    815           1.1  christos 
    816           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    817           1.1  christos     DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer);
    818           1.1  christos 
    819           1.1  christos     DtPushSubtable (Subtable);
    820           1.1  christos     ParentTable = DtPeekSubtable ();
    821           1.1  christos     Count = 0;
    822           1.1  christos 
    823           1.1  christos     while (*PFieldList)
    824           1.1  christos     {
    825           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a,
    826       1.1.1.7  christos             &Subtable);
    827           1.1  christos         if (ACPI_FAILURE (Status))
    828           1.1  christos         {
    829           1.1  christos             return (Status);
    830           1.1  christos         }
    831           1.1  christos         if (!Subtable)
    832           1.1  christos         {
    833           1.1  christos             break;
    834           1.1  christos         }
    835           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    836           1.1  christos         Count++;
    837           1.1  christos     }
    838           1.1  christos 
    839           1.1  christos     DrtmVtl->ValidatedTableCount = Count;
    840           1.1  christos     DtPopSubtable ();
    841           1.1  christos     ParentTable = DtPeekSubtable ();
    842           1.1  christos 
    843           1.1  christos     /* Compile RL */
    844           1.1  christos 
    845           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1,
    846       1.1.1.7  christos         &Subtable);
    847           1.1  christos     if (ACPI_FAILURE (Status))
    848           1.1  christos     {
    849           1.1  christos         return (Status);
    850           1.1  christos     }
    851           1.1  christos 
    852           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    853           1.1  christos     DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer);
    854           1.1  christos 
    855           1.1  christos     DtPushSubtable (Subtable);
    856           1.1  christos     ParentTable = DtPeekSubtable ();
    857           1.1  christos     Count = 0;
    858           1.1  christos 
    859           1.1  christos     while (*PFieldList)
    860           1.1  christos     {
    861           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a,
    862       1.1.1.7  christos             &Subtable);
    863           1.1  christos         if (ACPI_FAILURE (Status))
    864           1.1  christos         {
    865           1.1  christos             return (Status);
    866           1.1  christos         }
    867           1.1  christos 
    868           1.1  christos         if (!Subtable)
    869           1.1  christos         {
    870           1.1  christos             break;
    871           1.1  christos         }
    872           1.1  christos 
    873           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
    874           1.1  christos         Count++;
    875           1.1  christos     }
    876           1.1  christos 
    877           1.1  christos     DrtmRl->ResourceCount = Count;
    878           1.1  christos     DtPopSubtable ();
    879           1.1  christos     ParentTable = DtPeekSubtable ();
    880           1.1  christos 
    881           1.1  christos     /* Compile DPS */
    882           1.1  christos 
    883           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2,
    884       1.1.1.7  christos         &Subtable);
    885           1.1  christos     if (ACPI_FAILURE (Status))
    886           1.1  christos     {
    887           1.1  christos         return (Status);
    888           1.1  christos     }
    889           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
    890           1.1  christos     /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/
    891           1.1  christos 
    892           1.1  christos 
    893           1.1  christos     return (AE_OK);
    894           1.1  christos }
    895           1.1  christos 
    896           1.1  christos 
    897           1.1  christos /******************************************************************************
    898           1.1  christos  *
    899           1.1  christos  * FUNCTION:    DtCompileEinj
    900           1.1  christos  *
    901           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    902           1.1  christos  *
    903           1.1  christos  * RETURN:      Status
    904           1.1  christos  *
    905           1.1  christos  * DESCRIPTION: Compile EINJ.
    906           1.1  christos  *
    907           1.1  christos  *****************************************************************************/
    908           1.1  christos 
    909           1.1  christos ACPI_STATUS
    910           1.1  christos DtCompileEinj (
    911           1.1  christos     void                    **List)
    912           1.1  christos {
    913           1.1  christos     ACPI_STATUS             Status;
    914           1.1  christos 
    915           1.1  christos 
    916           1.1  christos     Status = DtCompileTwoSubtables (List,
    917           1.1  christos         AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
    918           1.1  christos     return (Status);
    919           1.1  christos }
    920           1.1  christos 
    921           1.1  christos 
    922           1.1  christos /******************************************************************************
    923           1.1  christos  *
    924           1.1  christos  * FUNCTION:    DtCompileErst
    925           1.1  christos  *
    926           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    927           1.1  christos  *
    928           1.1  christos  * RETURN:      Status
    929           1.1  christos  *
    930           1.1  christos  * DESCRIPTION: Compile ERST.
    931           1.1  christos  *
    932           1.1  christos  *****************************************************************************/
    933           1.1  christos 
    934           1.1  christos ACPI_STATUS
    935           1.1  christos DtCompileErst (
    936           1.1  christos     void                    **List)
    937           1.1  christos {
    938           1.1  christos     ACPI_STATUS             Status;
    939           1.1  christos 
    940           1.1  christos 
    941           1.1  christos     Status = DtCompileTwoSubtables (List,
    942           1.1  christos         AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
    943           1.1  christos     return (Status);
    944           1.1  christos }
    945           1.1  christos 
    946           1.1  christos 
    947           1.1  christos /******************************************************************************
    948           1.1  christos  *
    949           1.1  christos  * FUNCTION:    DtCompileGtdt
    950           1.1  christos  *
    951           1.1  christos  * PARAMETERS:  List                - Current field list pointer
    952           1.1  christos  *
    953           1.1  christos  * RETURN:      Status
    954           1.1  christos  *
    955           1.1  christos  * DESCRIPTION: Compile GTDT.
    956           1.1  christos  *
    957           1.1  christos  *****************************************************************************/
    958           1.1  christos 
    959           1.1  christos ACPI_STATUS
    960           1.1  christos DtCompileGtdt (
    961           1.1  christos     void                    **List)
    962           1.1  christos {
    963           1.1  christos     ACPI_STATUS             Status;
    964           1.1  christos     DT_SUBTABLE             *Subtable;
    965           1.1  christos     DT_SUBTABLE             *ParentTable;
    966           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
    967           1.1  christos     DT_FIELD                *SubtableStart;
    968           1.1  christos     ACPI_SUBTABLE_HEADER    *GtdtHeader;
    969           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
    970           1.1  christos     UINT32                  GtCount;
    971       1.1.1.9  christos     ACPI_TABLE_HEADER       *Header;
    972       1.1.1.9  christos 
    973       1.1.1.9  christos 
    974       1.1.1.9  christos     ParentTable = DtPeekSubtable ();
    975           1.1  christos 
    976       1.1.1.9  christos     Header = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
    977       1.1.1.9  christos 
    978       1.1.1.9  christos     /* Compile the main table */
    979           1.1  christos 
    980           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
    981       1.1.1.7  christos         &Subtable);
    982           1.1  christos     if (ACPI_FAILURE (Status))
    983           1.1  christos     {
    984           1.1  christos         return (Status);
    985           1.1  christos     }
    986           1.1  christos 
    987       1.1.1.9  christos     /* GTDT revision 3 later contains 2 extra fields before subtables */
    988       1.1.1.9  christos 
    989       1.1.1.9  christos     if (Header->Revision > 2)
    990       1.1.1.9  christos     {
    991       1.1.1.9  christos         ParentTable = DtPeekSubtable ();
    992       1.1.1.9  christos         DtInsertSubtable (ParentTable, Subtable);
    993       1.1.1.9  christos 
    994       1.1.1.9  christos         Status = DtCompileTable (PFieldList,
    995       1.1.1.9  christos             AcpiDmTableInfoGtdtEl2, &Subtable);
    996       1.1.1.9  christos         if (ACPI_FAILURE (Status))
    997       1.1.1.9  christos         {
    998       1.1.1.9  christos             return (Status);
    999       1.1.1.9  christos         }
   1000       1.1.1.9  christos     }
   1001       1.1.1.9  christos 
   1002           1.1  christos     ParentTable = DtPeekSubtable ();
   1003           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1004           1.1  christos 
   1005           1.1  christos     while (*PFieldList)
   1006           1.1  christos     {
   1007           1.1  christos         SubtableStart = *PFieldList;
   1008           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
   1009       1.1.1.7  christos             &Subtable);
   1010           1.1  christos         if (ACPI_FAILURE (Status))
   1011           1.1  christos         {
   1012           1.1  christos             return (Status);
   1013           1.1  christos         }
   1014           1.1  christos 
   1015           1.1  christos         ParentTable = DtPeekSubtable ();
   1016           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1017           1.1  christos         DtPushSubtable (Subtable);
   1018           1.1  christos 
   1019           1.1  christos         GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
   1020           1.1  christos 
   1021           1.1  christos         switch (GtdtHeader->Type)
   1022           1.1  christos         {
   1023           1.1  christos         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1024           1.1  christos 
   1025           1.1  christos             InfoTable = AcpiDmTableInfoGtdt0;
   1026           1.1  christos             break;
   1027           1.1  christos 
   1028           1.1  christos         case ACPI_GTDT_TYPE_WATCHDOG:
   1029           1.1  christos 
   1030           1.1  christos             InfoTable = AcpiDmTableInfoGtdt1;
   1031           1.1  christos             break;
   1032           1.1  christos 
   1033           1.1  christos         default:
   1034           1.1  christos 
   1035           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
   1036           1.1  christos             return (AE_ERROR);
   1037           1.1  christos         }
   1038           1.1  christos 
   1039       1.1.1.7  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1040           1.1  christos         if (ACPI_FAILURE (Status))
   1041           1.1  christos         {
   1042           1.1  christos             return (Status);
   1043           1.1  christos         }
   1044           1.1  christos 
   1045           1.1  christos         ParentTable = DtPeekSubtable ();
   1046           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1047           1.1  christos 
   1048           1.1  christos         /*
   1049           1.1  christos          * Additional GT block subtable data
   1050           1.1  christos          */
   1051           1.1  christos 
   1052           1.1  christos         switch (GtdtHeader->Type)
   1053           1.1  christos         {
   1054           1.1  christos         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1055           1.1  christos 
   1056           1.1  christos             DtPushSubtable (Subtable);
   1057           1.1  christos             ParentTable = DtPeekSubtable ();
   1058           1.1  christos 
   1059           1.1  christos             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   1060           1.1  christos                 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
   1061           1.1  christos 
   1062           1.1  christos             while (GtCount)
   1063           1.1  christos             {
   1064           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
   1065       1.1.1.7  christos                     &Subtable);
   1066           1.1  christos                 if (ACPI_FAILURE (Status))
   1067           1.1  christos                 {
   1068           1.1  christos                     return (Status);
   1069           1.1  christos                 }
   1070           1.1  christos 
   1071           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   1072           1.1  christos                 GtCount--;
   1073           1.1  christos             }
   1074           1.1  christos 
   1075           1.1  christos             DtPopSubtable ();
   1076           1.1  christos             break;
   1077           1.1  christos 
   1078           1.1  christos         default:
   1079           1.1  christos 
   1080           1.1  christos             break;
   1081           1.1  christos         }
   1082           1.1  christos 
   1083           1.1  christos         DtPopSubtable ();
   1084           1.1  christos     }
   1085           1.1  christos 
   1086           1.1  christos     return (AE_OK);
   1087           1.1  christos }
   1088           1.1  christos 
   1089           1.1  christos 
   1090           1.1  christos /******************************************************************************
   1091           1.1  christos  *
   1092           1.1  christos  * FUNCTION:    DtCompileFpdt
   1093           1.1  christos  *
   1094           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1095           1.1  christos  *
   1096           1.1  christos  * RETURN:      Status
   1097           1.1  christos  *
   1098           1.1  christos  * DESCRIPTION: Compile FPDT.
   1099           1.1  christos  *
   1100           1.1  christos  *****************************************************************************/
   1101           1.1  christos 
   1102           1.1  christos ACPI_STATUS
   1103           1.1  christos DtCompileFpdt (
   1104           1.1  christos     void                    **List)
   1105           1.1  christos {
   1106           1.1  christos     ACPI_STATUS             Status;
   1107           1.1  christos     ACPI_FPDT_HEADER        *FpdtHeader;
   1108           1.1  christos     DT_SUBTABLE             *Subtable;
   1109           1.1  christos     DT_SUBTABLE             *ParentTable;
   1110           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1111           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1112           1.1  christos     DT_FIELD                *SubtableStart;
   1113           1.1  christos 
   1114           1.1  christos 
   1115           1.1  christos     while (*PFieldList)
   1116           1.1  christos     {
   1117           1.1  christos         SubtableStart = *PFieldList;
   1118           1.1  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
   1119       1.1.1.7  christos             &Subtable);
   1120           1.1  christos         if (ACPI_FAILURE (Status))
   1121           1.1  christos         {
   1122           1.1  christos             return (Status);
   1123           1.1  christos         }
   1124           1.1  christos 
   1125           1.1  christos         ParentTable = DtPeekSubtable ();
   1126           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1127           1.1  christos         DtPushSubtable (Subtable);
   1128           1.1  christos 
   1129           1.1  christos         FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
   1130           1.1  christos 
   1131           1.1  christos         switch (FpdtHeader->Type)
   1132           1.1  christos         {
   1133           1.1  christos         case ACPI_FPDT_TYPE_BOOT:
   1134           1.1  christos 
   1135           1.1  christos             InfoTable = AcpiDmTableInfoFpdt0;
   1136           1.1  christos             break;
   1137           1.1  christos 
   1138           1.1  christos         case ACPI_FPDT_TYPE_S3PERF:
   1139           1.1  christos 
   1140           1.1  christos             InfoTable = AcpiDmTableInfoFpdt1;
   1141           1.1  christos             break;
   1142           1.1  christos 
   1143           1.1  christos         default:
   1144           1.1  christos 
   1145           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
   1146           1.1  christos             return (AE_ERROR);
   1147           1.1  christos             break;
   1148           1.1  christos         }
   1149           1.1  christos 
   1150       1.1.1.7  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1151           1.1  christos         if (ACPI_FAILURE (Status))
   1152           1.1  christos         {
   1153           1.1  christos             return (Status);
   1154           1.1  christos         }
   1155           1.1  christos 
   1156           1.1  christos         ParentTable = DtPeekSubtable ();
   1157           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1158           1.1  christos         DtPopSubtable ();
   1159           1.1  christos     }
   1160           1.1  christos 
   1161           1.1  christos     return (AE_OK);
   1162           1.1  christos }
   1163           1.1  christos 
   1164           1.1  christos 
   1165           1.1  christos /******************************************************************************
   1166           1.1  christos  *
   1167           1.1  christos  * FUNCTION:    DtCompileHest
   1168           1.1  christos  *
   1169           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1170           1.1  christos  *
   1171           1.1  christos  * RETURN:      Status
   1172           1.1  christos  *
   1173           1.1  christos  * DESCRIPTION: Compile HEST.
   1174           1.1  christos  *
   1175           1.1  christos  *****************************************************************************/
   1176           1.1  christos 
   1177           1.1  christos ACPI_STATUS
   1178           1.1  christos DtCompileHest (
   1179           1.1  christos     void                    **List)
   1180           1.1  christos {
   1181           1.1  christos     ACPI_STATUS             Status;
   1182           1.1  christos     DT_SUBTABLE             *Subtable;
   1183           1.1  christos     DT_SUBTABLE             *ParentTable;
   1184           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1185           1.1  christos     DT_FIELD                *SubtableStart;
   1186           1.1  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1187           1.1  christos     UINT16                  Type;
   1188           1.1  christos     UINT32                  BankCount;
   1189           1.1  christos 
   1190           1.1  christos 
   1191           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
   1192       1.1.1.7  christos         &Subtable);
   1193           1.1  christos     if (ACPI_FAILURE (Status))
   1194           1.1  christos     {
   1195           1.1  christos         return (Status);
   1196           1.1  christos     }
   1197           1.1  christos 
   1198           1.1  christos     ParentTable = DtPeekSubtable ();
   1199           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1200           1.1  christos 
   1201           1.1  christos     while (*PFieldList)
   1202           1.1  christos     {
   1203           1.1  christos         /* Get subtable type */
   1204           1.1  christos 
   1205           1.1  christos         SubtableStart = *PFieldList;
   1206           1.1  christos         DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
   1207           1.1  christos 
   1208           1.1  christos         switch (Type)
   1209           1.1  christos         {
   1210           1.1  christos         case ACPI_HEST_TYPE_IA32_CHECK:
   1211           1.1  christos 
   1212           1.1  christos             InfoTable = AcpiDmTableInfoHest0;
   1213           1.1  christos             break;
   1214           1.1  christos 
   1215           1.1  christos         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1216           1.1  christos 
   1217           1.1  christos             InfoTable = AcpiDmTableInfoHest1;
   1218           1.1  christos             break;
   1219           1.1  christos 
   1220           1.1  christos         case ACPI_HEST_TYPE_IA32_NMI:
   1221           1.1  christos 
   1222           1.1  christos             InfoTable = AcpiDmTableInfoHest2;
   1223           1.1  christos             break;
   1224           1.1  christos 
   1225           1.1  christos         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   1226           1.1  christos 
   1227           1.1  christos             InfoTable = AcpiDmTableInfoHest6;
   1228           1.1  christos             break;
   1229           1.1  christos 
   1230           1.1  christos         case ACPI_HEST_TYPE_AER_ENDPOINT:
   1231           1.1  christos 
   1232           1.1  christos             InfoTable = AcpiDmTableInfoHest7;
   1233           1.1  christos             break;
   1234           1.1  christos 
   1235           1.1  christos         case ACPI_HEST_TYPE_AER_BRIDGE:
   1236           1.1  christos 
   1237           1.1  christos             InfoTable = AcpiDmTableInfoHest8;
   1238           1.1  christos             break;
   1239           1.1  christos 
   1240           1.1  christos         case ACPI_HEST_TYPE_GENERIC_ERROR:
   1241           1.1  christos 
   1242           1.1  christos             InfoTable = AcpiDmTableInfoHest9;
   1243           1.1  christos             break;
   1244           1.1  christos 
   1245       1.1.1.5  christos         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
   1246       1.1.1.5  christos 
   1247       1.1.1.5  christos             InfoTable = AcpiDmTableInfoHest10;
   1248       1.1.1.5  christos             break;
   1249       1.1.1.5  christos 
   1250       1.1.1.5  christos         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
   1251       1.1.1.5  christos 
   1252       1.1.1.5  christos             InfoTable = AcpiDmTableInfoHest11;
   1253       1.1.1.5  christos             break;
   1254       1.1.1.5  christos 
   1255           1.1  christos         default:
   1256           1.1  christos 
   1257           1.1  christos             /* Cannot continue on unknown type */
   1258           1.1  christos 
   1259           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
   1260           1.1  christos             return (AE_ERROR);
   1261           1.1  christos         }
   1262           1.1  christos 
   1263       1.1.1.7  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1264           1.1  christos         if (ACPI_FAILURE (Status))
   1265           1.1  christos         {
   1266           1.1  christos             return (Status);
   1267           1.1  christos         }
   1268           1.1  christos 
   1269           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1270           1.1  christos 
   1271           1.1  christos         /*
   1272           1.1  christos          * Additional subtable data - IA32 Error Bank(s)
   1273           1.1  christos          */
   1274           1.1  christos         BankCount = 0;
   1275           1.1  christos         switch (Type)
   1276           1.1  christos         {
   1277           1.1  christos         case ACPI_HEST_TYPE_IA32_CHECK:
   1278           1.1  christos 
   1279           1.1  christos             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   1280           1.1  christos                 Subtable->Buffer))->NumHardwareBanks;
   1281           1.1  christos             break;
   1282           1.1  christos 
   1283           1.1  christos         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1284           1.1  christos 
   1285           1.1  christos             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   1286           1.1  christos                 Subtable->Buffer))->NumHardwareBanks;
   1287           1.1  christos             break;
   1288           1.1  christos 
   1289       1.1.1.5  christos         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
   1290       1.1.1.5  christos 
   1291       1.1.1.5  christos             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
   1292       1.1.1.5  christos                 Subtable->Buffer))->NumHardwareBanks;
   1293       1.1.1.5  christos             break;
   1294       1.1.1.5  christos 
   1295           1.1  christos         default:
   1296           1.1  christos 
   1297           1.1  christos             break;
   1298           1.1  christos         }
   1299           1.1  christos 
   1300           1.1  christos         while (BankCount)
   1301           1.1  christos         {
   1302           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
   1303       1.1.1.7  christos                 &Subtable);
   1304           1.1  christos             if (ACPI_FAILURE (Status))
   1305           1.1  christos             {
   1306           1.1  christos                 return (Status);
   1307           1.1  christos             }
   1308           1.1  christos 
   1309           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   1310           1.1  christos             BankCount--;
   1311           1.1  christos         }
   1312           1.1  christos     }
   1313           1.1  christos 
   1314           1.1  christos     return (AE_OK);
   1315           1.1  christos }
   1316           1.1  christos 
   1317           1.1  christos 
   1318           1.1  christos /******************************************************************************
   1319           1.1  christos  *
   1320       1.1.1.5  christos  * FUNCTION:    DtCompileHmat
   1321       1.1.1.5  christos  *
   1322       1.1.1.5  christos  * PARAMETERS:  List                - Current field list pointer
   1323       1.1.1.5  christos  *
   1324       1.1.1.5  christos  * RETURN:      Status
   1325       1.1.1.5  christos  *
   1326       1.1.1.5  christos  * DESCRIPTION: Compile HMAT.
   1327       1.1.1.5  christos  *
   1328       1.1.1.5  christos  *****************************************************************************/
   1329       1.1.1.5  christos 
   1330       1.1.1.5  christos ACPI_STATUS
   1331       1.1.1.5  christos DtCompileHmat (
   1332       1.1.1.5  christos     void                    **List)
   1333       1.1.1.5  christos {
   1334       1.1.1.5  christos     ACPI_STATUS             Status;
   1335       1.1.1.5  christos     DT_SUBTABLE             *Subtable;
   1336       1.1.1.5  christos     DT_SUBTABLE             *ParentTable;
   1337       1.1.1.5  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1338       1.1.1.5  christos     DT_FIELD                *SubtableStart;
   1339       1.1.1.5  christos     DT_FIELD                *EntryStart;
   1340       1.1.1.5  christos     ACPI_HMAT_STRUCTURE     *HmatStruct;
   1341       1.1.1.5  christos     ACPI_HMAT_LOCALITY      *HmatLocality;
   1342       1.1.1.5  christos     ACPI_HMAT_CACHE         *HmatCache;
   1343       1.1.1.5  christos     ACPI_DMTABLE_INFO       *InfoTable;
   1344       1.1.1.5  christos     UINT32                  IntPDNumber;
   1345       1.1.1.5  christos     UINT32                  TgtPDNumber;
   1346       1.1.1.5  christos     UINT64                  EntryNumber;
   1347       1.1.1.5  christos     UINT16                  SMBIOSHandleNumber;
   1348       1.1.1.5  christos 
   1349       1.1.1.5  christos 
   1350       1.1.1.5  christos     ParentTable = DtPeekSubtable ();
   1351       1.1.1.5  christos 
   1352       1.1.1.5  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat,
   1353       1.1.1.7  christos         &Subtable);
   1354       1.1.1.5  christos     if (ACPI_FAILURE (Status))
   1355       1.1.1.5  christos     {
   1356       1.1.1.5  christos         return (Status);
   1357       1.1.1.5  christos     }
   1358       1.1.1.5  christos     DtInsertSubtable (ParentTable, Subtable);
   1359       1.1.1.5  christos 
   1360       1.1.1.5  christos     while (*PFieldList)
   1361       1.1.1.5  christos     {
   1362       1.1.1.5  christos         /* Compile HMAT structure header */
   1363       1.1.1.5  christos 
   1364       1.1.1.5  christos         SubtableStart = *PFieldList;
   1365       1.1.1.5  christos         Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr,
   1366       1.1.1.7  christos             &Subtable);
   1367       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   1368       1.1.1.5  christos         {
   1369       1.1.1.5  christos             return (Status);
   1370       1.1.1.5  christos         }
   1371       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   1372       1.1.1.5  christos 
   1373       1.1.1.5  christos         HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer);
   1374       1.1.1.5  christos         HmatStruct->Length = Subtable->Length;
   1375       1.1.1.5  christos 
   1376       1.1.1.5  christos         /* Compile HMAT structure body */
   1377       1.1.1.5  christos 
   1378       1.1.1.5  christos         switch (HmatStruct->Type)
   1379       1.1.1.5  christos         {
   1380       1.1.1.5  christos         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
   1381       1.1.1.5  christos 
   1382       1.1.1.5  christos             InfoTable = AcpiDmTableInfoHmat0;
   1383       1.1.1.5  christos             break;
   1384       1.1.1.5  christos 
   1385       1.1.1.5  christos         case ACPI_HMAT_TYPE_LOCALITY:
   1386       1.1.1.5  christos 
   1387       1.1.1.5  christos             InfoTable = AcpiDmTableInfoHmat1;
   1388       1.1.1.5  christos             break;
   1389       1.1.1.5  christos 
   1390       1.1.1.5  christos         case ACPI_HMAT_TYPE_CACHE:
   1391       1.1.1.5  christos 
   1392       1.1.1.5  christos             InfoTable = AcpiDmTableInfoHmat2;
   1393       1.1.1.5  christos             break;
   1394       1.1.1.5  christos 
   1395       1.1.1.5  christos         default:
   1396       1.1.1.5  christos 
   1397       1.1.1.5  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT");
   1398       1.1.1.5  christos             return (AE_ERROR);
   1399       1.1.1.5  christos         }
   1400       1.1.1.5  christos 
   1401       1.1.1.7  christos         Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
   1402       1.1.1.5  christos         if (ACPI_FAILURE (Status))
   1403       1.1.1.5  christos         {
   1404       1.1.1.5  christos             return (Status);
   1405       1.1.1.5  christos         }
   1406       1.1.1.5  christos         DtInsertSubtable (ParentTable, Subtable);
   1407       1.1.1.5  christos         HmatStruct->Length += Subtable->Length;
   1408       1.1.1.5  christos 
   1409       1.1.1.5  christos         /* Compile HMAT structure additionals */
   1410       1.1.1.5  christos 
   1411       1.1.1.5  christos         switch (HmatStruct->Type)
   1412       1.1.1.5  christos         {
   1413       1.1.1.5  christos         case ACPI_HMAT_TYPE_LOCALITY:
   1414       1.1.1.5  christos 
   1415       1.1.1.5  christos             HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY,
   1416       1.1.1.5  christos                 Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
   1417       1.1.1.5  christos 
   1418       1.1.1.5  christos             /* Compile initiator proximity domain list */
   1419       1.1.1.5  christos 
   1420       1.1.1.5  christos             IntPDNumber = 0;
   1421       1.1.1.5  christos             while (*PFieldList)
   1422       1.1.1.5  christos             {
   1423       1.1.1.5  christos                 Status = DtCompileTable (PFieldList,
   1424       1.1.1.7  christos                     AcpiDmTableInfoHmat1a, &Subtable);
   1425       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   1426       1.1.1.5  christos                 {
   1427       1.1.1.5  christos                     return (Status);
   1428       1.1.1.5  christos                 }
   1429       1.1.1.5  christos                 if (!Subtable)
   1430       1.1.1.5  christos                 {
   1431       1.1.1.5  christos                     break;
   1432       1.1.1.5  christos                 }
   1433       1.1.1.5  christos                 DtInsertSubtable (ParentTable, Subtable);
   1434       1.1.1.5  christos                 HmatStruct->Length += Subtable->Length;
   1435       1.1.1.5  christos                 IntPDNumber++;
   1436       1.1.1.5  christos             }
   1437       1.1.1.5  christos             HmatLocality->NumberOfInitiatorPDs = IntPDNumber;
   1438       1.1.1.5  christos 
   1439       1.1.1.5  christos             /* Compile target proximity domain list */
   1440       1.1.1.5  christos 
   1441       1.1.1.5  christos             TgtPDNumber = 0;
   1442       1.1.1.5  christos             while (*PFieldList)
   1443       1.1.1.5  christos             {
   1444       1.1.1.5  christos                 Status = DtCompileTable (PFieldList,
   1445       1.1.1.7  christos                     AcpiDmTableInfoHmat1b, &Subtable);
   1446       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   1447       1.1.1.5  christos                 {
   1448       1.1.1.5  christos                     return (Status);
   1449       1.1.1.5  christos                 }
   1450       1.1.1.5  christos                 if (!Subtable)
   1451       1.1.1.5  christos                 {
   1452       1.1.1.5  christos                     break;
   1453       1.1.1.5  christos                 }
   1454       1.1.1.5  christos                 DtInsertSubtable (ParentTable, Subtable);
   1455       1.1.1.5  christos                 HmatStruct->Length += Subtable->Length;
   1456       1.1.1.5  christos                 TgtPDNumber++;
   1457       1.1.1.5  christos             }
   1458       1.1.1.5  christos             HmatLocality->NumberOfTargetPDs = TgtPDNumber;
   1459       1.1.1.5  christos 
   1460       1.1.1.5  christos             /* Save start of the entries for reporting errors */
   1461       1.1.1.5  christos 
   1462       1.1.1.5  christos             EntryStart = *PFieldList;
   1463       1.1.1.5  christos 
   1464       1.1.1.5  christos             /* Compile latency/bandwidth entries */
   1465       1.1.1.5  christos 
   1466       1.1.1.5  christos             EntryNumber = 0;
   1467       1.1.1.5  christos             while (*PFieldList)
   1468       1.1.1.5  christos             {
   1469       1.1.1.5  christos                 Status = DtCompileTable (PFieldList,
   1470       1.1.1.7  christos                     AcpiDmTableInfoHmat1c, &Subtable);
   1471       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   1472       1.1.1.5  christos                 {
   1473       1.1.1.5  christos                     return (Status);
   1474       1.1.1.5  christos                 }
   1475       1.1.1.5  christos                 if (!Subtable)
   1476       1.1.1.5  christos                 {
   1477       1.1.1.5  christos                     break;
   1478       1.1.1.5  christos                 }
   1479       1.1.1.5  christos                 DtInsertSubtable (ParentTable, Subtable);
   1480       1.1.1.5  christos                 HmatStruct->Length += Subtable->Length;
   1481       1.1.1.5  christos                 EntryNumber++;
   1482       1.1.1.5  christos             }
   1483       1.1.1.5  christos 
   1484       1.1.1.5  christos             /* Validate number of entries */
   1485       1.1.1.5  christos 
   1486       1.1.1.5  christos             if (EntryNumber !=
   1487       1.1.1.5  christos                 ((UINT64)IntPDNumber * (UINT64)TgtPDNumber))
   1488       1.1.1.5  christos             {
   1489       1.1.1.5  christos                 DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT");
   1490       1.1.1.5  christos                 return (AE_ERROR);
   1491       1.1.1.5  christos             }
   1492       1.1.1.5  christos             break;
   1493       1.1.1.5  christos 
   1494       1.1.1.5  christos         case ACPI_HMAT_TYPE_CACHE:
   1495       1.1.1.5  christos 
   1496       1.1.1.5  christos             /* Compile SMBIOS handles */
   1497       1.1.1.5  christos 
   1498       1.1.1.5  christos             HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE,
   1499       1.1.1.5  christos                 Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
   1500       1.1.1.5  christos             SMBIOSHandleNumber = 0;
   1501       1.1.1.5  christos             while (*PFieldList)
   1502       1.1.1.5  christos             {
   1503       1.1.1.5  christos                 Status = DtCompileTable (PFieldList,
   1504       1.1.1.7  christos                     AcpiDmTableInfoHmat2a, &Subtable);
   1505       1.1.1.5  christos                 if (ACPI_FAILURE (Status))
   1506       1.1.1.5  christos                 {
   1507       1.1.1.5  christos                     return (Status);
   1508       1.1.1.5  christos                 }
   1509       1.1.1.5  christos                 if (!Subtable)
   1510       1.1.1.5  christos                 {
   1511       1.1.1.5  christos                     break;
   1512       1.1.1.5  christos                 }
   1513       1.1.1.5  christos                 DtInsertSubtable (ParentTable, Subtable);
   1514       1.1.1.5  christos                 HmatStruct->Length += Subtable->Length;
   1515       1.1.1.5  christos                 SMBIOSHandleNumber++;
   1516       1.1.1.5  christos             }
   1517       1.1.1.5  christos             HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber;
   1518       1.1.1.5  christos             break;
   1519       1.1.1.5  christos 
   1520       1.1.1.5  christos         default:
   1521       1.1.1.5  christos 
   1522       1.1.1.5  christos             break;
   1523       1.1.1.5  christos         }
   1524       1.1.1.5  christos     }
   1525       1.1.1.5  christos 
   1526       1.1.1.5  christos     return (AE_OK);
   1527       1.1.1.5  christos }
   1528       1.1.1.5  christos 
   1529       1.1.1.5  christos 
   1530       1.1.1.5  christos /******************************************************************************
   1531       1.1.1.5  christos  *
   1532           1.1  christos  * FUNCTION:    DtCompileIort
   1533           1.1  christos  *
   1534           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1535           1.1  christos  *
   1536           1.1  christos  * RETURN:      Status
   1537           1.1  christos  *
   1538           1.1  christos  * DESCRIPTION: Compile IORT.
   1539           1.1  christos  *
   1540           1.1  christos  *****************************************************************************/
   1541           1.1  christos 
   1542           1.1  christos ACPI_STATUS
   1543           1.1  christos DtCompileIort (
   1544           1.1  christos     void                    **List)
   1545           1.1  christos {
   1546           1.1  christos     ACPI_STATUS             Status;
   1547           1.1  christos     DT_SUBTABLE             *Subtable;
   1548           1.1  christos     DT_SUBTABLE             *ParentTable;
   1549           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1550           1.1  christos     DT_FIELD                *SubtableStart;
   1551      1.1.1.11  christos     ACPI_TABLE_HEADER       *Table;
   1552           1.1  christos     ACPI_TABLE_IORT         *Iort;
   1553           1.1  christos     ACPI_IORT_NODE          *IortNode;
   1554           1.1  christos     ACPI_IORT_ITS_GROUP     *IortItsGroup;
   1555           1.1  christos     ACPI_IORT_SMMU          *IortSmmu;
   1556      1.1.1.11  christos     ACPI_IORT_RMR           *IortRmr;
   1557           1.1  christos     UINT32                  NodeNumber;
   1558           1.1  christos     UINT32                  NodeLength;
   1559           1.1  christos     UINT32                  IdMappingNumber;
   1560           1.1  christos     UINT32                  ItsNumber;
   1561           1.1  christos     UINT32                  ContextIrptNumber;
   1562           1.1  christos     UINT32                  PmuIrptNumber;
   1563           1.1  christos     UINT32                  PaddingLength;
   1564      1.1.1.11  christos     UINT8                   Revision;
   1565      1.1.1.11  christos     UINT32                  RmrCount;
   1566           1.1  christos 
   1567           1.1  christos 
   1568           1.1  christos     ParentTable = DtPeekSubtable ();
   1569           1.1  christos 
   1570           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort,
   1571       1.1.1.7  christos         &Subtable);
   1572           1.1  christos     if (ACPI_FAILURE (Status))
   1573           1.1  christos     {
   1574           1.1  christos         return (Status);
   1575           1.1  christos     }
   1576           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1577           1.1  christos 
   1578      1.1.1.11  christos     Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
   1579      1.1.1.11  christos     Revision = Table->Revision;
   1580      1.1.1.11  christos 
   1581      1.1.1.11  christos     /* Both IORT Rev E and E.a have known issues and are not supported */
   1582      1.1.1.11  christos 
   1583      1.1.1.11  christos     if (Revision == 1 || Revision == 2)
   1584      1.1.1.11  christos     {
   1585      1.1.1.11  christos         DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision");
   1586      1.1.1.11  christos         return (AE_ERROR);
   1587      1.1.1.11  christos     }
   1588      1.1.1.11  christos 
   1589           1.1  christos     /*
   1590       1.1.1.2  christos      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
   1591       1.1.1.2  christos      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
   1592           1.1  christos      */
   1593           1.1  christos     Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT,
   1594           1.1  christos         Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
   1595           1.1  christos 
   1596           1.1  christos     /*
   1597           1.1  christos      * OptionalPadding - Variable-length data
   1598           1.1  christos      * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT))
   1599           1.1  christos      * Optionally allows the generic data types to be used for filling
   1600           1.1  christos      * this field.
   1601           1.1  christos      */
   1602           1.1  christos     Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
   1603           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
   1604       1.1.1.7  christos         &Subtable);
   1605           1.1  christos     if (ACPI_FAILURE (Status))
   1606           1.1  christos     {
   1607           1.1  christos         return (Status);
   1608           1.1  christos     }
   1609           1.1  christos     if (Subtable)
   1610           1.1  christos     {
   1611           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1612           1.1  christos         Iort->NodeOffset += Subtable->Length;
   1613           1.1  christos     }
   1614           1.1  christos     else
   1615           1.1  christos     {
   1616           1.1  christos         Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList),
   1617           1.1  christos             AcpiDmTableInfoIortHdr[0].Name, &PaddingLength);
   1618           1.1  christos         if (ACPI_FAILURE (Status))
   1619           1.1  christos         {
   1620           1.1  christos             return (Status);
   1621           1.1  christos         }
   1622           1.1  christos         Iort->NodeOffset += PaddingLength;
   1623           1.1  christos     }
   1624           1.1  christos 
   1625           1.1  christos     NodeNumber = 0;
   1626           1.1  christos     while (*PFieldList)
   1627           1.1  christos     {
   1628           1.1  christos         SubtableStart = *PFieldList;
   1629      1.1.1.11  christos         if (Revision == 0)
   1630      1.1.1.11  christos         {
   1631      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
   1632      1.1.1.11  christos                 &Subtable);
   1633      1.1.1.11  christos         }
   1634      1.1.1.11  christos         else if (Revision >= 3)
   1635      1.1.1.11  christos         {
   1636      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3,
   1637      1.1.1.11  christos                 &Subtable);
   1638      1.1.1.11  christos         }
   1639      1.1.1.11  christos 
   1640           1.1  christos         if (ACPI_FAILURE (Status))
   1641           1.1  christos         {
   1642           1.1  christos             return (Status);
   1643           1.1  christos         }
   1644           1.1  christos 
   1645           1.1  christos         DtInsertSubtable (ParentTable, Subtable);
   1646           1.1  christos         IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer);
   1647           1.1  christos         NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
   1648           1.1  christos 
   1649           1.1  christos         DtPushSubtable (Subtable);
   1650           1.1  christos         ParentTable = DtPeekSubtable ();
   1651           1.1  christos 
   1652           1.1  christos         switch (IortNode->Type)
   1653           1.1  christos         {
   1654           1.1  christos         case ACPI_IORT_NODE_ITS_GROUP:
   1655           1.1  christos 
   1656           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0,
   1657       1.1.1.7  christos                 &Subtable);
   1658           1.1  christos             if (ACPI_FAILURE (Status))
   1659           1.1  christos             {
   1660           1.1  christos                 return (Status);
   1661           1.1  christos             }
   1662           1.1  christos 
   1663           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   1664           1.1  christos             IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer);
   1665           1.1  christos             NodeLength += Subtable->Length;
   1666           1.1  christos 
   1667           1.1  christos             ItsNumber = 0;
   1668           1.1  christos             while (*PFieldList)
   1669           1.1  christos             {
   1670           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a,
   1671       1.1.1.7  christos                     &Subtable);
   1672           1.1  christos                 if (ACPI_FAILURE (Status))
   1673           1.1  christos                 {
   1674           1.1  christos                     return (Status);
   1675           1.1  christos                 }
   1676           1.1  christos                 if (!Subtable)
   1677           1.1  christos                 {
   1678           1.1  christos                     break;
   1679           1.1  christos                 }
   1680           1.1  christos 
   1681           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   1682           1.1  christos                 NodeLength += Subtable->Length;
   1683           1.1  christos                 ItsNumber++;
   1684           1.1  christos             }
   1685           1.1  christos 
   1686           1.1  christos             IortItsGroup->ItsCount = ItsNumber;
   1687           1.1  christos             break;
   1688           1.1  christos 
   1689           1.1  christos         case ACPI_IORT_NODE_NAMED_COMPONENT:
   1690           1.1  christos 
   1691           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1,
   1692       1.1.1.7  christos                 &Subtable);
   1693           1.1  christos             if (ACPI_FAILURE (Status))
   1694           1.1  christos             {
   1695           1.1  christos                 return (Status);
   1696           1.1  christos             }
   1697           1.1  christos 
   1698           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   1699           1.1  christos             NodeLength += Subtable->Length;
   1700           1.1  christos 
   1701           1.1  christos             /*
   1702           1.1  christos              * Padding - Variable-length data
   1703           1.1  christos              * Optionally allows the offset of the ID mappings to be used
   1704           1.1  christos              * for filling this field.
   1705           1.1  christos              */
   1706           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a,
   1707       1.1.1.7  christos                 &Subtable);
   1708           1.1  christos             if (ACPI_FAILURE (Status))
   1709           1.1  christos             {
   1710           1.1  christos                 return (Status);
   1711           1.1  christos             }
   1712           1.1  christos 
   1713           1.1  christos             if (Subtable)
   1714           1.1  christos             {
   1715           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   1716           1.1  christos                 NodeLength += Subtable->Length;
   1717           1.1  christos             }
   1718           1.1  christos             else
   1719           1.1  christos             {
   1720           1.1  christos                 if (NodeLength > IortNode->MappingOffset)
   1721           1.1  christos                 {
   1722           1.1  christos                     return (AE_BAD_DATA);
   1723           1.1  christos                 }
   1724           1.1  christos 
   1725           1.1  christos                 if (NodeLength < IortNode->MappingOffset)
   1726           1.1  christos                 {
   1727           1.1  christos                     Status = DtCompilePadding (
   1728           1.1  christos                         IortNode->MappingOffset - NodeLength,
   1729           1.1  christos                         &Subtable);
   1730           1.1  christos                     if (ACPI_FAILURE (Status))
   1731           1.1  christos                     {
   1732           1.1  christos                         return (Status);
   1733           1.1  christos                     }
   1734           1.1  christos 
   1735           1.1  christos                     DtInsertSubtable (ParentTable, Subtable);
   1736           1.1  christos                     NodeLength = IortNode->MappingOffset;
   1737           1.1  christos                 }
   1738           1.1  christos             }
   1739           1.1  christos             break;
   1740           1.1  christos 
   1741           1.1  christos         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
   1742           1.1  christos 
   1743           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2,
   1744       1.1.1.7  christos                 &Subtable);
   1745           1.1  christos             if (ACPI_FAILURE (Status))
   1746           1.1  christos             {
   1747           1.1  christos                 return (Status);
   1748           1.1  christos             }
   1749           1.1  christos 
   1750           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   1751           1.1  christos             NodeLength += Subtable->Length;
   1752           1.1  christos             break;
   1753           1.1  christos 
   1754           1.1  christos         case ACPI_IORT_NODE_SMMU:
   1755           1.1  christos 
   1756           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3,
   1757       1.1.1.7  christos                 &Subtable);
   1758           1.1  christos             if (ACPI_FAILURE (Status))
   1759           1.1  christos             {
   1760           1.1  christos                 return (Status);
   1761           1.1  christos             }
   1762           1.1  christos 
   1763           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   1764           1.1  christos             IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer);
   1765           1.1  christos             NodeLength += Subtable->Length;
   1766           1.1  christos 
   1767           1.1  christos             /* Compile global interrupt array */
   1768           1.1  christos 
   1769           1.1  christos             IortSmmu->GlobalInterruptOffset = NodeLength;
   1770           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
   1771       1.1.1.7  christos                 &Subtable);
   1772           1.1  christos             if (ACPI_FAILURE (Status))
   1773           1.1  christos             {
   1774           1.1  christos                 return (Status);
   1775           1.1  christos             }
   1776           1.1  christos 
   1777           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   1778           1.1  christos             NodeLength += Subtable->Length;
   1779           1.1  christos 
   1780           1.1  christos             /* Compile context interrupt array */
   1781           1.1  christos 
   1782           1.1  christos             ContextIrptNumber = 0;
   1783           1.1  christos             IortSmmu->ContextInterruptOffset = NodeLength;
   1784           1.1  christos             while (*PFieldList)
   1785           1.1  christos             {
   1786           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
   1787       1.1.1.7  christos                     &Subtable);
   1788           1.1  christos                 if (ACPI_FAILURE (Status))
   1789           1.1  christos                 {
   1790           1.1  christos                     return (Status);
   1791           1.1  christos                 }
   1792           1.1  christos 
   1793           1.1  christos                 if (!Subtable)
   1794           1.1  christos                 {
   1795           1.1  christos                     break;
   1796           1.1  christos                 }
   1797           1.1  christos 
   1798           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   1799           1.1  christos                 NodeLength += Subtable->Length;
   1800           1.1  christos                 ContextIrptNumber++;
   1801           1.1  christos             }
   1802           1.1  christos 
   1803           1.1  christos             IortSmmu->ContextInterruptCount = ContextIrptNumber;
   1804           1.1  christos 
   1805           1.1  christos             /* Compile PMU interrupt array */
   1806           1.1  christos 
   1807           1.1  christos             PmuIrptNumber = 0;
   1808           1.1  christos             IortSmmu->PmuInterruptOffset = NodeLength;
   1809           1.1  christos             while (*PFieldList)
   1810           1.1  christos             {
   1811           1.1  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
   1812       1.1.1.7  christos                     &Subtable);
   1813           1.1  christos                 if (ACPI_FAILURE (Status))
   1814           1.1  christos                 {
   1815           1.1  christos                     return (Status);
   1816           1.1  christos                 }
   1817           1.1  christos 
   1818           1.1  christos                 if (!Subtable)
   1819           1.1  christos                 {
   1820           1.1  christos                     break;
   1821           1.1  christos                 }
   1822           1.1  christos 
   1823           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   1824           1.1  christos                 NodeLength += Subtable->Length;
   1825           1.1  christos                 PmuIrptNumber++;
   1826           1.1  christos             }
   1827           1.1  christos 
   1828           1.1  christos             IortSmmu->PmuInterruptCount = PmuIrptNumber;
   1829           1.1  christos             break;
   1830           1.1  christos 
   1831       1.1.1.2  christos         case ACPI_IORT_NODE_SMMU_V3:
   1832       1.1.1.2  christos 
   1833       1.1.1.2  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort4,
   1834       1.1.1.7  christos                 &Subtable);
   1835       1.1.1.2  christos             if (ACPI_FAILURE (Status))
   1836       1.1.1.2  christos             {
   1837       1.1.1.2  christos                 return (Status);
   1838       1.1.1.2  christos             }
   1839       1.1.1.2  christos 
   1840       1.1.1.2  christos             DtInsertSubtable (ParentTable, Subtable);
   1841       1.1.1.2  christos             NodeLength += Subtable->Length;
   1842       1.1.1.2  christos             break;
   1843       1.1.1.2  christos 
   1844       1.1.1.8  christos         case ACPI_IORT_NODE_PMCG:
   1845       1.1.1.8  christos 
   1846       1.1.1.8  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort5,
   1847       1.1.1.8  christos                 &Subtable);
   1848       1.1.1.8  christos             if (ACPI_FAILURE (Status))
   1849       1.1.1.8  christos             {
   1850       1.1.1.8  christos                 return (Status);
   1851       1.1.1.8  christos             }
   1852       1.1.1.8  christos 
   1853       1.1.1.8  christos             DtInsertSubtable (ParentTable, Subtable);
   1854       1.1.1.8  christos             NodeLength += Subtable->Length;
   1855       1.1.1.8  christos             break;
   1856       1.1.1.8  christos 
   1857      1.1.1.11  christos         case ACPI_IORT_NODE_RMR:
   1858      1.1.1.11  christos 
   1859      1.1.1.11  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6,
   1860      1.1.1.11  christos                 &Subtable);
   1861      1.1.1.11  christos             if (ACPI_FAILURE (Status))
   1862      1.1.1.11  christos             {
   1863      1.1.1.11  christos                 return (Status);
   1864      1.1.1.11  christos             }
   1865      1.1.1.11  christos 
   1866      1.1.1.11  christos             DtInsertSubtable (ParentTable, Subtable);
   1867      1.1.1.11  christos             IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer);
   1868      1.1.1.11  christos             NodeLength += Subtable->Length;
   1869      1.1.1.11  christos 
   1870      1.1.1.11  christos             /* Compile RMR Descriptors */
   1871      1.1.1.11  christos 
   1872      1.1.1.11  christos             RmrCount = 0;
   1873      1.1.1.11  christos             IortRmr->RmrOffset = NodeLength;
   1874      1.1.1.11  christos             while (*PFieldList)
   1875      1.1.1.11  christos             {
   1876      1.1.1.11  christos                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a,
   1877      1.1.1.11  christos                     &Subtable);
   1878      1.1.1.11  christos                 if (ACPI_FAILURE (Status))
   1879      1.1.1.11  christos                 {
   1880      1.1.1.11  christos                     return (Status);
   1881      1.1.1.11  christos                 }
   1882      1.1.1.11  christos 
   1883      1.1.1.11  christos                 if (!Subtable)
   1884      1.1.1.11  christos                 {
   1885      1.1.1.11  christos                     break;
   1886      1.1.1.11  christos                 }
   1887      1.1.1.11  christos 
   1888      1.1.1.11  christos                 DtInsertSubtable (ParentTable, Subtable);
   1889      1.1.1.11  christos                 NodeLength += sizeof (ACPI_IORT_RMR_DESC);
   1890      1.1.1.11  christos                 RmrCount++;
   1891      1.1.1.11  christos             }
   1892      1.1.1.11  christos 
   1893      1.1.1.11  christos             IortRmr->RmrCount = RmrCount;
   1894      1.1.1.11  christos             break;
   1895      1.1.1.11  christos 
   1896      1.1.1.11  christos 	default:
   1897           1.1  christos 
   1898           1.1  christos             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
   1899           1.1  christos             return (AE_ERROR);
   1900           1.1  christos         }
   1901           1.1  christos 
   1902           1.1  christos         /* Compile Array of ID mappings */
   1903           1.1  christos 
   1904           1.1  christos         IortNode->MappingOffset = NodeLength;
   1905           1.1  christos         IdMappingNumber = 0;
   1906           1.1  christos         while (*PFieldList)
   1907           1.1  christos         {
   1908           1.1  christos             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap,
   1909       1.1.1.7  christos                 &Subtable);
   1910           1.1  christos             if (ACPI_FAILURE (Status))
   1911           1.1  christos             {
   1912           1.1  christos                 return (Status);
   1913           1.1  christos             }
   1914           1.1  christos 
   1915           1.1  christos             if (!Subtable)
   1916           1.1  christos             {
   1917           1.1  christos                 break;
   1918           1.1  christos             }
   1919           1.1  christos 
   1920           1.1  christos             DtInsertSubtable (ParentTable, Subtable);
   1921           1.1  christos             NodeLength += sizeof (ACPI_IORT_ID_MAPPING);
   1922           1.1  christos             IdMappingNumber++;
   1923           1.1  christos         }
   1924           1.1  christos 
   1925           1.1  christos         IortNode->MappingCount = IdMappingNumber;
   1926       1.1.1.4  christos         if (!IdMappingNumber)
   1927       1.1.1.4  christos         {
   1928       1.1.1.4  christos             IortNode->MappingOffset = 0;
   1929       1.1.1.4  christos         }
   1930           1.1  christos 
   1931           1.1  christos         /*
   1932           1.1  christos          * Node length can be determined by DT_LENGTH option
   1933           1.1  christos          * IortNode->Length = NodeLength;
   1934           1.1  christos          */
   1935           1.1  christos         DtPopSubtable ();
   1936           1.1  christos         ParentTable = DtPeekSubtable ();
   1937           1.1  christos         NodeNumber++;
   1938           1.1  christos     }
   1939           1.1  christos 
   1940           1.1  christos     Iort->NodeCount = NodeNumber;
   1941           1.1  christos     return (AE_OK);
   1942           1.1  christos }
   1943           1.1  christos 
   1944           1.1  christos 
   1945           1.1  christos /******************************************************************************
   1946           1.1  christos  *
   1947           1.1  christos  * FUNCTION:    DtCompileIvrs
   1948           1.1  christos  *
   1949           1.1  christos  * PARAMETERS:  List                - Current field list pointer
   1950           1.1  christos  *
   1951           1.1  christos  * RETURN:      Status
   1952           1.1  christos  *
   1953  1.1.1.11.2.1   thorpej  * DESCRIPTION: Compile IVRS. Notes:
   1954  1.1.1.11.2.1   thorpej  *              The IVRS is essentially a flat table, with the following
   1955  1.1.1.11.2.1   thorpej  *              structure:
   1956  1.1.1.11.2.1   thorpej  *              <Main ACPI Table Header>
   1957  1.1.1.11.2.1   thorpej  *              <Main subtable - virtualization info>
   1958  1.1.1.11.2.1   thorpej  *              <IVHD>
   1959  1.1.1.11.2.1   thorpej  *                  <Device Entries>
   1960  1.1.1.11.2.1   thorpej  *              ...
   1961  1.1.1.11.2.1   thorpej  *              <IVHD>
   1962  1.1.1.11.2.1   thorpej  *                  <Device Entries>
   1963  1.1.1.11.2.1   thorpej  *              <IVMD>
   1964  1.1.1.11.2.1   thorpej  *              ...
   1965           1.1  christos  *
   1966           1.1  christos  *****************************************************************************/
   1967           1.1  christos 
   1968           1.1  christos ACPI_STATUS
   1969           1.1  christos DtCompileIvrs (
   1970           1.1  christos     void                    **List)
   1971           1.1  christos {
   1972           1.1  christos     ACPI_STATUS             Status;
   1973           1.1  christos     DT_SUBTABLE             *Subtable;
   1974           1.1  christos     DT_SUBTABLE             *ParentTable;
   1975  1.1.1.11.2.1   thorpej     DT_SUBTABLE             *MainSubtable;
   1976           1.1  christos     DT_FIELD                **PFieldList = (DT_FIELD **) List;
   1977           1.1  christos     DT_FIELD                *SubtableStart;
   1978  1.1.1.11.2.1   thorpej     ACPI_DMTABLE_INFO       *InfoTable = NULL;
   1979  1.1.1.11.2.1   thorpej     UINT8                   SubtableType;
   1980  1.1.1.11.2.1   thorpej     UINT8                   Temp64[16];
   1981  1.1.1.11.2.1   thorpej     UINT8                   Temp8;
   1982           1.1  christos 
   1983           1.1  christos 
   1984  1.1.1.11.2.1   thorpej     /* Main table */
   1985  1.1.1.11.2.1   thorpej 
   1986           1.1  christos     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
   1987       1.1.1.7  christos         &Subtable);
   1988           1.1  christos     if (ACPI_FAILURE (Status))
   1989           1.1  christos     {
   1990           1.1  christos         return (Status);
   1991           1.1  christos     }
   1992           1.1  christos 
   1993           1.1  christos     ParentTable = DtPeekSubtable ();
   1994           1.1  christos     DtInsertSubtable (ParentTable, Subtable);
   1995  1.1.1.11.2.1   thorpej     DtPushSubtable (Subtable);
   1996  1.1.1.11.2.1   thorpej 
   1997  1.1.1.11.2.1   thorpej     /* Save a pointer to the main subtable */
   1998  1.1.1.11.2.1   thorpej 
   1999  1.1.1.11.2.1   thorpej     MainSubtable = Subtable;
   2000           1.1  christos 
   2001           1.1  christos     while (*PFieldList)
   2002           1.1  christos     {
   2003           1.1  christos         SubtableStart = *PFieldList;
   2004           1.1  christos 
   2005  1.1.1.11.2.1   thorpej         /* Compile the SubtableType integer */
   2006           1.1  christos 
   2007  1.1.1.11.2.1   thorpej         DtCompileInteger (&SubtableType, *PFieldList, 1, 0);
   2008           1.1  christos 
   2009  1.1.1.11.2.1   thorpej         switch (SubtableType)
   2010           1.1  christos         {
   2011  1.1.1.11.2.1   thorpej 
   2012  1.1.1.11.2.1   thorpej         /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */
   2013  1.1.1.11.2.1   thorpej 
   2014      1.1.1.10  christos         case ACPI_IVRS_TYPE_HARDWARE1:
   2015           1.1  christos 
   2016  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrsHware1;
   2017           1.1  christos             break;
   2018           1.1  christos 
   2019  1.1.1.11.2.1   thorpej         /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */
   2020  1.1.1.11.2.1   thorpej 
   2021      1.1.1.10  christos         case ACPI_IVRS_TYPE_HARDWARE2:
   2022  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_HARDWARE3:
   2023      1.1.1.10  christos 
   2024  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrsHware23;
   2025      1.1.1.10  christos             break;
   2026      1.1.1.10  christos 
   2027  1.1.1.11.2.1   thorpej         /* Types 20h, 21h, 22h, IVMD (I/O Virtualization Memory Definition Block) */
   2028  1.1.1.11.2.1   thorpej 
   2029           1.1  christos         case ACPI_IVRS_TYPE_MEMORY1:
   2030           1.1  christos         case ACPI_IVRS_TYPE_MEMORY2:
   2031           1.1  christos         case ACPI_IVRS_TYPE_MEMORY3:
   2032           1.1  christos 
   2033  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrsMemory;
   2034  1.1.1.11.2.1   thorpej             break;
   2035  1.1.1.11.2.1   thorpej 
   2036  1.1.1.11.2.1   thorpej         /* 4-byte device entries */
   2037  1.1.1.11.2.1   thorpej 
   2038  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_PAD4:
   2039  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_ALL:
   2040  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_SELECT:
   2041  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_START:
   2042  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_END:
   2043  1.1.1.11.2.1   thorpej 
   2044  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrs4;
   2045  1.1.1.11.2.1   thorpej             break;
   2046  1.1.1.11.2.1   thorpej 
   2047  1.1.1.11.2.1   thorpej         /* 8-byte device entries, type A */
   2048  1.1.1.11.2.1   thorpej 
   2049  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_ALIAS_SELECT:
   2050  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_ALIAS_START:
   2051  1.1.1.11.2.1   thorpej 
   2052  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrs8a;
   2053  1.1.1.11.2.1   thorpej             break;
   2054  1.1.1.11.2.1   thorpej 
   2055  1.1.1.11.2.1   thorpej         /* 8-byte device entries, type B */
   2056  1.1.1.11.2.1   thorpej 
   2057  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_EXT_SELECT:
   2058  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_EXT_START:
   2059  1.1.1.11.2.1   thorpej 
   2060  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrs8b;
   2061  1.1.1.11.2.1   thorpej             break;
   2062  1.1.1.11.2.1   thorpej 
   2063  1.1.1.11.2.1   thorpej         /* 8-byte device entries, type C */
   2064  1.1.1.11.2.1   thorpej 
   2065  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_SPECIAL:
   2066  1.1.1.11.2.1   thorpej 
   2067  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrs8c;
   2068  1.1.1.11.2.1   thorpej             break;
   2069  1.1.1.11.2.1   thorpej 
   2070  1.1.1.11.2.1   thorpej         /* Variable device entries, type F0h */
   2071  1.1.1.11.2.1   thorpej 
   2072  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_HID:
   2073  1.1.1.11.2.1   thorpej 
   2074  1.1.1.11.2.1   thorpej             InfoTable = AcpiDmTableInfoIvrsHid;
   2075           1.1  christos             break;
   2076           1.1  christos 
   2077           1.1  christos         default:
   2078           1.1  christos 
   2079  1.1.1.11.2.1   thorpej             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
   2080  1.1.1.11.2.1   thorpej                 "IVRS Device Entry");
   2081           1.1  christos             return (AE_ERROR);
   2082           1.1  christos         }
   2083           1.1  christos 
   2084  1.1.1.11.2.1   thorpej         /* Compile the InfoTable from above */
   2085  1.1.1.11.2.1   thorpej 
   2086  1.1.1.11.2.1   thorpej         Status = DtCompileTable (PFieldList, InfoTable,
   2087  1.1.1.11.2.1   thorpej             &Subtable);
   2088           1.1  christos         if (ACPI_FAILURE (Status))
   2089           1.1  christos         {
   2090           1.1  christos             return (Status);
   2091           1.1  christos         }
   2092           1.1  christos 
   2093           1.1  christos         ParentTable = DtPeekSubtable ();
   2094  1.1.1.11.2.1   thorpej         if (SubtableType != ACPI_IVRS_TYPE_HARDWARE1 &&
   2095  1.1.1.11.2.1   thorpej             SubtableType != ACPI_IVRS_TYPE_HARDWARE2 &&
   2096  1.1.1.11.2.1   thorpej             SubtableType != ACPI_IVRS_TYPE_HARDWARE3 &&
   2097  1.1.1.11.2.1   thorpej             SubtableType != ACPI_IVRS_TYPE_HID &&
   2098  1.1.1.11.2.1   thorpej             SubtableType != ACPI_IVRS_TYPE_MEMORY1 &&
   2099  1.1.1.11.2.1   thorpej             SubtableType != ACPI_IVRS_TYPE_MEMORY2 &&
   2100  1.1.1.11.2.1   thorpej             SubtableType != ACPI_IVRS_TYPE_MEMORY3)
   2101  1.1.1.11.2.1   thorpej         {
   2102  1.1.1.11.2.1   thorpej             if (ParentTable)
   2103  1.1.1.11.2.1   thorpej                 DtInsertSubtable (ParentTable, Subtable);
   2104  1.1.1.11.2.1   thorpej         }
   2105           1.1  christos 
   2106  1.1.1.11.2.1   thorpej         switch (SubtableType)
   2107           1.1  christos         {
   2108  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_HARDWARE1:
   2109  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_HARDWARE2:
   2110  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_HARDWARE3:
   2111  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_MEMORY1:
   2112  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_MEMORY2:
   2113  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_MEMORY3:
   2114  1.1.1.11.2.1   thorpej 
   2115  1.1.1.11.2.1   thorpej             /* Insert these IVHDs/IVMDs at the root subtable */
   2116  1.1.1.11.2.1   thorpej 
   2117  1.1.1.11.2.1   thorpej             DtInsertSubtable (MainSubtable, Subtable);
   2118  1.1.1.11.2.1   thorpej             DtPushSubtable (Subtable);
   2119  1.1.1.11.2.1   thorpej             ParentTable = MainSubtable;
   2120  1.1.1.11.2.1   thorpej             break;
   2121  1.1.1.11.2.1   thorpej 
   2122  1.1.1.11.2.1   thorpej         case ACPI_IVRS_TYPE_HID:
   2123  1.1.1.11.2.1   thorpej 
   2124  1.1.1.11.2.1   thorpej             /* Special handling for the HID named device entry (0xF0) */
   2125  1.1.1.11.2.1   thorpej 
   2126  1.1.1.11.2.1   thorpej             if (ParentTable)
   2127           1.1  christos             {
   2128  1.1.1.11.2.1   thorpej                 DtInsertSubtable (ParentTable, Subtable);
   2129  1.1.1.11.2.1   thorpej             }
   2130  1.1.1.11.2.1   thorpej 
   2131  1.1.1.11.2.1   thorpej             /*
   2132  1.1.1.11.2.1   thorpej              * Process the HID value. First, get the HID value as a string.
   2133  1.1.1.11.2.1   thorpej              */
   2134  1.1.1.11.2.1   thorpej             DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0);
   2135  1.1.1.11.2.1   thorpej 
   2136  1.1.1.11.2.1   thorpej                /*
   2137  1.1.1.11.2.1   thorpej                 * Determine if the HID is an integer or a string.
   2138  1.1.1.11.2.1   thorpej                 * An integer is defined to be 32 bits, with the upper 32 bits
   2139  1.1.1.11.2.1   thorpej                 * set to zero. (from the ACPI Spec): "The HID can be a 32-bit
   2140  1.1.1.11.2.1   thorpej                 * integer or a character string. If an integer, the lower
   2141  1.1.1.11.2.1   thorpej                 * 4 bytes of the field contain the integer and the upper
   2142  1.1.1.11.2.1   thorpej                 * 4 bytes are padded with 0".
   2143  1.1.1.11.2.1   thorpej                 */
   2144  1.1.1.11.2.1   thorpej             if (UtIsIdInteger ((UINT8 *) &Temp64))
   2145  1.1.1.11.2.1   thorpej             {
   2146  1.1.1.11.2.1   thorpej                 /* Compile the HID value as an integer */
   2147  1.1.1.11.2.1   thorpej 
   2148  1.1.1.11.2.1   thorpej                 DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0);
   2149           1.1  christos 
   2150  1.1.1.11.2.1   thorpej                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidInteger,
   2151  1.1.1.11.2.1   thorpej                     &Subtable);
   2152  1.1.1.11.2.1   thorpej                 if (ACPI_FAILURE (Status))
   2153           1.1  christos                 {
   2154  1.1.1.11.2.1   thorpej                     return (Status);
   2155  1.1.1.11.2.1   thorpej                 }
   2156  1.1.1.11.2.1   thorpej             }
   2157  1.1.1.11.2.1   thorpej             else
   2158  1.1.1.11.2.1   thorpej             {
   2159  1.1.1.11.2.1   thorpej                 /* Compile the HID value as a string */
   2160           1.1  christos 
   2161  1.1.1.11.2.1   thorpej                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHidString,
   2162  1.1.1.11.2.1   thorpej                     &Subtable);
   2163  1.1.1.11.2.1   thorpej                 if (ACPI_FAILURE (Status))
   2164  1.1.1.11.2.1   thorpej                 {
   2165  1.1.1.11.2.1   thorpej                     return (Status);
   2166  1.1.1.11.2.1   thorpej                 }
   2167  1.1.1.11.2.1   thorpej             }
   2168           1.1  christos 
   2169  1.1.1.11.2.1   thorpej             DtInsertSubtable (ParentTable, Subtable);
   2170           1.1  christos 
   2171  1.1.1.11.2.1   thorpej             /*
   2172  1.1.1.11.2.1   thorpej              * Process the CID value. First, get the CID value as a string.
   2173  1.1.1.11.2.1   thorpej              */
   2174  1.1.1.11.2.1   thorpej             DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 16, DT_FIELD_TYPE_STRING, 0);
   2175           1.1  christos 
   2176  1.1.1.11.2.1   thorpej             if (UtIsIdInteger ((UINT8 *) &Temp64))
   2177  1.1.1.11.2.1   thorpej             {
   2178  1.1.1.11.2.1   thorpej                 /* Compile the CID value as an integer */
   2179           1.1  christos 
   2180  1.1.1.11.2.1   thorpej                 DtCompileOneField ((UINT8 *) &Temp64, *PFieldList, 8, DT_FIELD_TYPE_INTEGER, 0);
   2181           1.1  christos 
   2182  1.1.1.11.2.1   thorpej                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidInteger,
   2183  1.1.1.11.2.1   thorpej                     &Subtable);
   2184  1.1.1.11.2.1   thorpej                 if (ACPI_FAILURE (Status))
   2185  1.1.1.11.2.1   thorpej                 {
   2186  1.1.1.11.2.1   thorpej                     return (Status);
   2187  1.1.1.11.2.1   thorpej                 }
   2188  1.1.1.11.2.1   thorpej             }
   2189  1.1.1.11.2.1   thorpej             else
   2190  1.1.1.11.2.1   thorpej             {
   2191  1.1.1.11.2.1   thorpej                 /* Compile the CID value as a string */
   2192           1.1  christos 
   2193  1.1.1.11.2.1   thorpej                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsCidString,
   2194  1.1.1.11.2.1   thorpej                     &Subtable);
   2195  1.1.1.11.2.1   thorpej                 if (ACPI_FAILURE (Status))
   2196  1.1.1.11.2.1   thorpej                 {
   2197  1.1.1.11.2.1   thorpej                     return (Status);
   2198  1.1.1.11.2.1   thorpej                 }
   2199  1.1.1.11.2.1   thorpej             }
   2200           1.1  christos 
   2201  1.1.1.11.2.1   thorpej             DtInsertSubtable (ParentTable, Subtable);
   2202           1.1  christos 
   2203  1.1.1.11.2.1   thorpej             /*
   2204  1.1.1.11.2.1   thorpej              * Process the UID value. First, get and decode the "UID Format" field (Integer).
   2205  1.1.1.11.2.1   thorpej              */
   2206  1.1.1.11.2.1   thorpej             if (!*PFieldList)
   2207  1.1.1.11.2.1   thorpej             {
   2208  1.1.1.11.2.1   thorpej                 return (AE_OK);
   2209  1.1.1.11.2.1   thorpej             }
   2210           1.1  christos 
   2211  1.1.1.11.2.1   thorpej             DtCompileOneField (&Temp8, *PFieldList, 1, DT_FIELD_TYPE_INTEGER, 0);
   2212           1.1  christos 
   2213  1.1.1.11.2.1   thorpej             switch (Temp8)
   2214  1.1.1.11.2.1   thorpej             {
   2215  1.1.1.11.2.1   thorpej             case ACPI_IVRS_UID_NOT_PRESENT:
   2216  1.1.1.11.2.1   thorpej                 break;
   2217           1.1  christos 
   2218  1.1.1.11.2.1   thorpej             case ACPI_IVRS_UID_IS_INTEGER:
   2219           1.1  christos 
   2220  1.1.1.11.2.1   thorpej                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidInteger,
   2221  1.1.1.11.2.1   thorpej                     &Subtable);
   2222  1.1.1.11.2.1   thorpej                 if (ACPI_FAILURE (Status))
   2223  1.1.1.11.2.1   thorpej                 {
   2224  1.1.1.11.2.1   thorpej                     return (Status);
   2225           1.1  christos                 }
   2226  1.1.1.11.2.1   thorpej                 DtInsertSubtable (ParentTable, Subtable);
   2227  1.1.1.11.2.1   thorpej                 break;
   2228           1.1  christos 
   2229  1.1.1.11.2.1   thorpej             case ACPI_IVRS_UID_IS_STRING:
   2230  1.1.1.11.2.1   thorpej 
   2231  1.1.1.11.2.1   thorpej                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsUidString,
   2232       1.1.1.7  christos                     &Subtable);
   2233           1.1  christos                 if (ACPI_FAILURE (Status))
   2234           1.1  christos                 {
   2235           1.1  christos                     return (Status);
   2236           1.1  christos                 }
   2237           1.1  christos                 DtInsertSubtable (ParentTable, Subtable);
   2238  1.1.1.11.2.1   thorpej                 break;
   2239  1.1.1.11.2.1   thorpej 
   2240  1.1.1.11.2.1   thorpej             default:
   2241  1.1.1.11.2.1   thorpej 
   2242  1.1.1.11.2.1   thorpej                 DtFatal (ASL_MSG_UNKNOWN_FORMAT, SubtableStart,
   2243  1.1.1.11.2.1   thorpej                     "IVRS Device Entry");
   2244  1.1.1.11.2.1   thorpej                 return (AE_ERROR);
   2245           1.1  christos             }
   2246           1.1  christos 
   2247  1.1.1.11.2.1   thorpej         default:
   2248  1.1.1.11.2.1   thorpej 
   2249  1.1.1.11.2.1   thorpej             /* All other subtable types come through here */
   2250  1.1.1.11.2.1   thorpej             break;
   2251  1.1.1.11.2.1   thorpej         }
   2252           1.1  christos     }
   2253           1.1  christos 
   2254           1.1  christos     return (AE_OK);
   2255           1.1  christos }
   2256