Home | History | Annotate | Line # | Download | only in include
actbl2.h revision 1.1.1.26
      1 /******************************************************************************
      2  *
      3  * Name: actbl2.h - ACPI Table Definitions (tables not in ACPI spec)
      4  *
      5  *****************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 #ifndef __ACTBL2_H__
    153 #define __ACTBL2_H__
    154 
    155 
    156 /*******************************************************************************
    157  *
    158  * Additional ACPI Tables (2)
    159  *
    160  * These tables are not consumed directly by the ACPICA subsystem, but are
    161  * included here to support device drivers and the AML disassembler.
    162  *
    163  ******************************************************************************/
    164 
    165 
    166 /*
    167  * Values for description table header signatures for tables defined in this
    168  * file. Useful because they make it more difficult to inadvertently type in
    169  * the wrong signature.
    170  */
    171 #define ACPI_SIG_AGDI           "AGDI"      /* Arm Generic Diagnostic Dump and Reset Device Interface */
    172 #define ACPI_SIG_APMT           "APMT"      /* Arm Performance Monitoring Unit table */
    173 #define ACPI_SIG_BDAT           "BDAT"      /* BIOS Data ACPI Table */
    174 #define ACPI_SIG_CCEL           "CCEL"      /* CC Event Log Table */
    175 #define ACPI_SIG_CDAT           "CDAT"      /* Coherent Device Attribute Table */
    176 #define ACPI_SIG_IORT           "IORT"      /* IO Remapping Table */
    177 #define ACPI_SIG_IVRS           "IVRS"      /* I/O Virtualization Reporting Structure */
    178 #define ACPI_SIG_LPIT           "LPIT"      /* Low Power Idle Table */
    179 #define ACPI_SIG_MADT           "APIC"      /* Multiple APIC Description Table */
    180 #define ACPI_SIG_MCFG           "MCFG"      /* PCI Memory Mapped Configuration table */
    181 #define ACPI_SIG_MCHI           "MCHI"      /* Management Controller Host Interface table */
    182 #define ACPI_SIG_MPAM           "MPAM"      /* Memory System Resource Partitioning and Monitoring Table */
    183 #define ACPI_SIG_MPST           "MPST"      /* Memory Power State Table */
    184 #define ACPI_SIG_MSDM           "MSDM"      /* Microsoft Data Management Table */
    185 #define ACPI_SIG_NFIT           "NFIT"      /* NVDIMM Firmware Interface Table */
    186 #define ACPI_SIG_NHLT           "NHLT"      /* Non HD Audio Link Table */
    187 #define ACPI_SIG_PCCT           "PCCT"      /* Platform Communications Channel Table */
    188 #define ACPI_SIG_PDTT           "PDTT"      /* Platform Debug Trigger Table */
    189 #define ACPI_SIG_PHAT           "PHAT"      /* Platform Health Assessment Table */
    190 #define ACPI_SIG_PMTT           "PMTT"      /* Platform Memory Topology Table */
    191 #define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
    192 #define ACPI_SIG_PRMT           "PRMT"      /* Platform Runtime Mechanism Table */
    193 #define ACPI_SIG_RASF           "RASF"      /* RAS Feature table */
    194 #define ACPI_SIG_RAS2           "RAS2"      /* RAS2 Feature table */
    195 #define ACPI_SIG_RGRT           "RGRT"      /* Regulatory Graphics Resource Table */
    196 #define ACPI_SIG_RHCT           "RHCT"      /* RISC-V Hart Capabilities Table */
    197 #define ACPI_SIG_SBST           "SBST"      /* Smart Battery Specification Table */
    198 #define ACPI_SIG_SDEI           "SDEI"      /* Software Delegated Exception Interface Table */
    199 #define ACPI_SIG_SDEV           "SDEV"      /* Secure Devices table */
    200 #define ACPI_SIG_SVKL           "SVKL"      /* Storage Volume Key Location Table */
    201 #define ACPI_SIG_TDEL           "TDEL"      /* TD Event Log Table */
    202 
    203 
    204 /*
    205  * All tables must be byte-packed to match the ACPI specification, since
    206  * the tables are provided by the system BIOS.
    207  */
    208 #pragma pack(1)
    209 
    210 /*
    211  * Note: C bitfields are not used for this reason:
    212  *
    213  * "Bitfields are great and easy to read, but unfortunately the C language
    214  * does not specify the layout of bitfields in memory, which means they are
    215  * essentially useless for dealing with packed data in on-disk formats or
    216  * binary wire protocols." (Or ACPI tables and buffers.) "If you ask me,
    217  * this decision was a design error in C. Ritchie could have picked an order
    218  * and stuck with it." Norman Ramsey.
    219  * See http://stackoverflow.com/a/1053662/41661
    220  */
    221 
    222 
    223 /*******************************************************************************
    224  *
    225  * AEST - Arm Error Source Table
    226  *
    227  * Conforms to: ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document
    228  * September 2020.
    229  *
    230  ******************************************************************************/
    231 
    232 typedef struct acpi_table_aest
    233 {
    234     ACPI_TABLE_HEADER       Header;
    235 
    236 } ACPI_TABLE_AEST;
    237 
    238 /* Common Subtable header - one per Node Structure (Subtable) */
    239 
    240 typedef struct acpi_aest_hdr
    241 {
    242     UINT8                   Type;
    243     UINT16                  Length;
    244     UINT8                   Reserved;
    245     UINT32                  NodeSpecificOffset;
    246     UINT32                  NodeInterfaceOffset;
    247     UINT32                  NodeInterruptOffset;
    248     UINT32                  NodeInterruptCount;
    249     UINT64                  TimestampRate;
    250     UINT64                  Reserved1;
    251     UINT64                  ErrorInjectionRate;
    252 
    253 } ACPI_AEST_HEADER;
    254 
    255 /* Values for Type above */
    256 
    257 #define ACPI_AEST_PROCESSOR_ERROR_NODE      0
    258 #define ACPI_AEST_MEMORY_ERROR_NODE         1
    259 #define ACPI_AEST_SMMU_ERROR_NODE           2
    260 #define ACPI_AEST_VENDOR_ERROR_NODE         3
    261 #define ACPI_AEST_GIC_ERROR_NODE            4
    262 #define ACPI_AEST_PCIE_ERROR_NODE           5
    263 #define ACPI_AEST_PROXY_ERROR_NODE          6
    264 #define ACPI_AEST_NODE_TYPE_RESERVED        7 /* 7 and above are reserved */
    265 
    266 
    267 /*
    268  * AEST subtables (Error nodes)
    269  */
    270 
    271 /* 0: Processor Error */
    272 
    273 typedef struct acpi_aest_processor
    274 {
    275     UINT32                  ProcessorId;
    276     UINT8                   ResourceType;
    277     UINT8                   Reserved;
    278     UINT8                   Flags;
    279     UINT8                   Revision;
    280     UINT64                  ProcessorAffinity;
    281 
    282 } ACPI_AEST_PROCESSOR;
    283 
    284 /* Values for ResourceType above, related structs below */
    285 
    286 #define ACPI_AEST_CACHE_RESOURCE            0
    287 #define ACPI_AEST_TLB_RESOURCE              1
    288 #define ACPI_AEST_GENERIC_RESOURCE          2
    289 #define ACPI_AEST_RESOURCE_RESERVED         3   /* 3 and above are reserved */
    290 
    291 /* 0R: Processor Cache Resource Substructure */
    292 
    293 typedef struct acpi_aest_processor_cache
    294 {
    295     UINT32                  CacheReference;
    296     UINT32                  Reserved;
    297 
    298 } ACPI_AEST_PROCESSOR_CACHE;
    299 
    300 /* Values for CacheType above */
    301 
    302 #define ACPI_AEST_CACHE_DATA                0
    303 #define ACPI_AEST_CACHE_INSTRUCTION         1
    304 #define ACPI_AEST_CACHE_UNIFIED             2
    305 #define ACPI_AEST_CACHE_RESERVED            3   /* 3 and above are reserved */
    306 
    307 /* 1R: Processor TLB Resource Substructure */
    308 
    309 typedef struct acpi_aest_processor_tlb
    310 {
    311     UINT32                  TlbLevel;
    312     UINT32                  Reserved;
    313 
    314 } ACPI_AEST_PROCESSOR_TLB;
    315 
    316 /* 2R: Processor Generic Resource Substructure */
    317 
    318 typedef struct acpi_aest_processor_generic
    319 {
    320     UINT32                   Resource;
    321 
    322 } ACPI_AEST_PROCESSOR_GENERIC;
    323 
    324 /* 1: Memory Error */
    325 
    326 typedef struct acpi_aest_memory
    327 {
    328     UINT32                  SratProximityDomain;
    329 
    330 } ACPI_AEST_MEMORY;
    331 
    332 /* 2: Smmu Error */
    333 
    334 typedef struct acpi_aest_smmu
    335 {
    336     UINT32                  IortNodeReference;
    337     UINT32                  SubcomponentReference;
    338 
    339 } ACPI_AEST_SMMU;
    340 
    341 /* 3: Vendor Defined */
    342 
    343 typedef struct acpi_aest_vendor
    344 {
    345     UINT32                  AcpiHid;
    346     UINT32                  AcpiUid;
    347     UINT8                   VendorSpecificData[16];
    348 
    349 } ACPI_AEST_VENDOR;
    350 
    351 /* 3: Vendor Defined V2 */
    352 
    353 typedef struct acpi_aest_vendor_v2
    354 {
    355     UINT64                  AcpiHid;
    356     UINT32                  AcpiUid;
    357     UINT8                   VendorSpecificData[16];
    358 
    359 } ACPI_AEST_VENDOR_V2;
    360 
    361 /* 4: Gic Error */
    362 
    363 typedef struct acpi_aest_gic
    364 {
    365     UINT32                  InterfaceType;
    366     UINT32                  InstanceId;
    367 
    368 } ACPI_AEST_GIC;
    369 
    370 /* Values for InterfaceType above */
    371 
    372 #define ACPI_AEST_GIC_CPU                   0
    373 #define ACPI_AEST_GIC_DISTRIBUTOR           1
    374 #define ACPI_AEST_GIC_REDISTRIBUTOR         2
    375 #define ACPI_AEST_GIC_ITS                   3
    376 #define ACPI_AEST_GIC_RESERVED              4   /* 4 and above are reserved */
    377 
    378 /* 5: PCIe Error */
    379 
    380 typedef struct acpi_aest_pcie
    381 {
    382     UINT32                  IortNodeReference;
    383 
    384 } ACPI_AEST_PCIE;
    385 
    386 
    387 /* 6: Proxy Error */
    388 
    389 typedef struct acpi_aest_proxy
    390 {
    391     UINT64                  NodeAddress;
    392 
    393 } ACPI_AEST_PROXY;
    394 
    395 /* Node Interface Structure */
    396 
    397 typedef struct acpi_aest_node_interface
    398 {
    399     UINT8                   Type;
    400     UINT8                   Reserved[3];
    401     UINT32                  Flags;
    402     UINT64                  Address;
    403     UINT32                  ErrorRecordIndex;
    404     UINT32                  ErrorRecordCount;
    405     UINT64                  ErrorRecordImplemented;
    406     UINT64                  ErrorStatusReporting;
    407     UINT64                  AddressingMode;
    408 
    409 } ACPI_AEST_NODE_INTERFACE;
    410 
    411 /* Node Interface Structure V2*/
    412 
    413 typedef struct acpi_aest_node_interface_header
    414 {
    415     UINT8                   Type;
    416     UINT8                   GroupFormat;
    417     UINT8                   Reserved[2];
    418     UINT32                  Flags;
    419     UINT64                  Address;
    420     UINT32                  ErrorRecordIndex;
    421     UINT32                  ErrorRecordCount;
    422 
    423 } ACPI_AEST_NODE_INTERFACE_HEADER;
    424 
    425 #define ACPI_AEST_NODE_GROUP_FORMAT_4K             0
    426 #define ACPI_AEST_NODE_GROUP_FORMAT_16K            1
    427 #define ACPI_AEST_NODE_GROUP_FORMAT_64K            2
    428 
    429 typedef struct acpi_aest_node_interface_common
    430 {
    431     UINT32                             ErrorNodeDevice;
    432     UINT32                             ProcessorAffinity;
    433     UINT64                             ErrorGroupRegisterBase;
    434     UINT64                             FaultInjectRegisterBase;
    435     UINT64                             InterruptConfigRegisterBase;
    436 
    437 } ACPI_AEST_NODE_INTERFACE_COMMON;
    438 
    439 typedef struct acpi_aest_node_interface_4k
    440 {
    441     UINT64                             ErrorRecordImplemented;
    442     UINT64                             ErrorStatusReporting;
    443     UINT64                             AddressingMode;
    444     ACPI_AEST_NODE_INTERFACE_COMMON    Common;
    445 
    446 } ACPI_AEST_NODE_INTERFACE_4K;
    447 
    448 typedef struct acpi_aest_node_interface_16k
    449 {
    450     UINT64                             ErrorRecordImplemented[4];
    451     UINT64                             ErrorStatusReporting[4];
    452     UINT64                             AddressingMode[4];
    453     ACPI_AEST_NODE_INTERFACE_COMMON    Common;
    454 
    455 } ACPI_AEST_NODE_INTERFACE_16K;
    456 
    457 typedef struct acpi_aest_node_interface_64k
    458 {
    459     INT64                              ErrorRecordImplemented[14];
    460     UINT64                             ErrorStatusReporting[14];
    461     UINT64                             AddressingMode[14];
    462     ACPI_AEST_NODE_INTERFACE_COMMON    Common;
    463 
    464 } ACPI_AEST_NODE_INTERFACE_64K;
    465 
    466 /* Values for Type field above */
    467 
    468 #define ACPI_AEST_NODE_SYSTEM_REGISTER                    0
    469 #define ACPI_AEST_NODE_MEMORY_MAPPED                      1
    470 #define ACPI_AEST_NODE_SINGLE_RECORD_MEMORY_MAPPED        2
    471 #define ACPI_AEST_XFACE_RESERVED                          3   /* 2 and above are reserved */
    472 
    473 /* Node Interrupt Structure */
    474 
    475 typedef struct acpi_aest_node_interrupt
    476 {
    477     UINT8                   Type;
    478     UINT8                   Reserved[2];
    479     UINT8                   Flags;
    480     UINT32                  Gsiv;
    481     UINT8                   IortId;
    482     UINT8                   Reserved1[3];
    483 
    484 } ACPI_AEST_NODE_INTERRUPT;
    485 
    486 /* Node Interrupt Structure V2 */
    487 
    488 typedef struct acpi_aest_node_interrupt_v2
    489 {
    490     UINT8                   Type;
    491     UINT8                   Reserved[2];
    492     UINT8                   Flags;
    493     UINT32                  Gsiv;
    494     UINT8                   Reserved1[4];
    495 
    496 } ACPI_AEST_NODE_INTERRUPT_V2;
    497 
    498 /* Values for Type field above */
    499 
    500 #define ACPI_AEST_NODE_FAULT_HANDLING       0
    501 #define ACPI_AEST_NODE_ERROR_RECOVERY       1
    502 #define ACPI_AEST_XRUPT_RESERVED            2   /* 2 and above are reserved */
    503 
    504 
    505 /*******************************************************************************
    506  * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface
    507  *
    508  * Conforms to "ACPI for Arm Components 1.1, Platform Design Document"
    509  * ARM DEN0093 v1.1
    510  *
    511  ******************************************************************************/
    512 typedef struct acpi_table_agdi
    513 {
    514     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
    515     UINT8                   Flags;
    516     UINT8                   Reserved[3];
    517     UINT32                  SdeiEvent;
    518     UINT32                  Gsiv;
    519 
    520 } ACPI_TABLE_AGDI;
    521 
    522 /* Mask for Flags field above */
    523 
    524 #define ACPI_AGDI_SIGNALING_MODE (1)
    525 
    526 
    527 /*******************************************************************************
    528  *
    529  * APMT - ARM Performance Monitoring Unit Table
    530  *
    531  * Conforms to:
    532  * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
    533  * ARM DEN0117 v1.0 November 25, 2021
    534  *
    535  ******************************************************************************/
    536 
    537 typedef struct acpi_table_apmt {
    538     ACPI_TABLE_HEADER Header;    /* Common ACPI table header */
    539 } ACPI_TABLE_APMT;
    540 
    541 #define ACPI_APMT_NODE_ID_LENGTH                4
    542 
    543 /*
    544  * APMT subtables
    545  */
    546 typedef struct acpi_apmt_node {
    547     UINT16                       Length;
    548     UINT8                        Flags;
    549     UINT8                        Type;
    550     UINT32                       Id;
    551     UINT64                       InstPrimary;
    552     UINT32                       InstSecondary;
    553     UINT64                       BaseAddress0;
    554     UINT64                       BaseAddress1;
    555     UINT32                       OvflwIrq;
    556     UINT32                       Reserved;
    557     UINT32                       OvflwIrqFlags;
    558     UINT32                       ProcAffinity;
    559     UINT32                       ImplId;
    560 } ACPI_APMT_NODE;
    561 
    562 /* Masks for Flags field above */
    563 
    564 #define ACPI_APMT_FLAGS_DUAL_PAGE               (1<<0)
    565 #define ACPI_APMT_FLAGS_AFFINITY                (1<<1)
    566 #define ACPI_APMT_FLAGS_ATOMIC                  (1<<2)
    567 
    568 /* Values for Flags dual page field above */
    569 
    570 #define ACPI_APMT_FLAGS_DUAL_PAGE_NSUPP         (0<<0)
    571 #define ACPI_APMT_FLAGS_DUAL_PAGE_SUPP          (1<<0)
    572 
    573 /* Values for Flags processor affinity field above */
    574 #define ACPI_APMT_FLAGS_AFFINITY_PROC           (0<<1)
    575 #define ACPI_APMT_FLAGS_AFFINITY_PROC_CONTAINER (1<<1)
    576 
    577 /* Values for Flags 64-bit atomic field above */
    578 #define ACPI_APMT_FLAGS_ATOMIC_NSUPP            (0<<2)
    579 #define ACPI_APMT_FLAGS_ATOMIC_SUPP             (1<<2)
    580 
    581 /* Values for Type field above */
    582 
    583 enum acpi_apmt_node_type {
    584     ACPI_APMT_NODE_TYPE_MC                      = 0x00,
    585     ACPI_APMT_NODE_TYPE_SMMU                    = 0x01,
    586     ACPI_APMT_NODE_TYPE_PCIE_ROOT               = 0x02,
    587     ACPI_APMT_NODE_TYPE_ACPI                    = 0x03,
    588     ACPI_APMT_NODE_TYPE_CACHE                   = 0x04,
    589     ACPI_APMT_NODE_TYPE_COUNT
    590 };
    591 
    592 /* Masks for ovflw_irq_flags field above */
    593 
    594 #define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE          (1<<0)
    595 #define ACPI_APMT_OVFLW_IRQ_FLAGS_TYPE          (1<<1)
    596 
    597 /* Values for ovflw_irq_flags mode field above */
    598 
    599 #define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE_LEVEL    (0<<0)
    600 #define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE_EDGE     (1<<0)
    601 
    602 /* Values for ovflw_irq_flags type field above */
    603 
    604 #define ACPI_APMT_OVFLW_IRQ_FLAGS_TYPE_WIRED    (0<<1)
    605 
    606 
    607 /*******************************************************************************
    608  *
    609  * BDAT - BIOS Data ACPI Table
    610  *
    611  * Conforms to "BIOS Data ACPI Table", Interface Specification v4.0 Draft 5
    612  * Nov 2020
    613  *
    614  ******************************************************************************/
    615 
    616 typedef struct acpi_table_bdat
    617 {
    618     ACPI_TABLE_HEADER       Header;
    619     ACPI_GENERIC_ADDRESS    Gas;
    620 
    621 } ACPI_TABLE_BDAT;
    622 
    623 /*******************************************************************************
    624  *
    625  * CCEL - CC-Event Log
    626  *        From: "Guest-Host-Communication Interface (GHCI) for Intel
    627  *        Trust Domain Extensions (Intel TDX)". Feb 2022
    628  *
    629  ******************************************************************************/
    630 
    631 typedef struct acpi_table_ccel
    632 {
    633     ACPI_TABLE_HEADER       Header; /* Common ACPI table header */
    634     UINT8                   CCType;
    635     UINT8                   CCSubType;
    636     UINT16                  Reserved;
    637     UINT64                  LogAreaMinimumLength;
    638     UINT64                  LogAreaStartAddress;
    639 
    640 } ACPI_TABLE_CCEL;
    641 
    642 /*******************************************************************************
    643  *
    644  * IORT - IO Remapping Table
    645  *
    646  * Conforms to "IO Remapping Table System Software on ARM Platforms",
    647  * Document number: ARM DEN 0049E.f, Apr 2024
    648  *
    649  ******************************************************************************/
    650 
    651 typedef struct acpi_table_iort
    652 {
    653     ACPI_TABLE_HEADER       Header;
    654     UINT32                  NodeCount;
    655     UINT32                  NodeOffset;
    656     UINT32                  Reserved;
    657 
    658 } ACPI_TABLE_IORT;
    659 
    660 
    661 /*
    662  * IORT subtables
    663  */
    664 typedef struct acpi_iort_node
    665 {
    666     UINT8                   Type;
    667     UINT16                  Length;
    668     UINT8                   Revision;
    669     UINT32                  Identifier;
    670     UINT32                  MappingCount;
    671     UINT32                  MappingOffset;
    672     char                    NodeData[];
    673 
    674 } ACPI_IORT_NODE;
    675 
    676 /* Values for subtable Type above */
    677 
    678 enum AcpiIortNodeType
    679 {
    680     ACPI_IORT_NODE_ITS_GROUP            = 0x00,
    681     ACPI_IORT_NODE_NAMED_COMPONENT      = 0x01,
    682     ACPI_IORT_NODE_PCI_ROOT_COMPLEX     = 0x02,
    683     ACPI_IORT_NODE_SMMU                 = 0x03,
    684     ACPI_IORT_NODE_SMMU_V3              = 0x04,
    685     ACPI_IORT_NODE_PMCG                 = 0x05,
    686     ACPI_IORT_NODE_RMR                  = 0x06,
    687 };
    688 
    689 
    690 typedef struct acpi_iort_id_mapping
    691 {
    692     UINT32                  InputBase;          /* Lowest value in input range */
    693     UINT32                  IdCount;            /* Number of IDs */
    694     UINT32                  OutputBase;         /* Lowest value in output range */
    695     UINT32                  OutputReference;    /* A reference to the output node */
    696     UINT32                  Flags;
    697 
    698 } ACPI_IORT_ID_MAPPING;
    699 
    700 /* Masks for Flags field above for IORT subtable */
    701 
    702 #define ACPI_IORT_ID_SINGLE_MAPPING (1)
    703 
    704 
    705 typedef struct acpi_iort_memory_access
    706 {
    707     UINT32                  CacheCoherency;
    708     UINT8                   Hints;
    709     UINT16                  Reserved;
    710     UINT8                   MemoryFlags;
    711 
    712 } ACPI_IORT_MEMORY_ACCESS;
    713 
    714 /* Values for CacheCoherency field above */
    715 
    716 #define ACPI_IORT_NODE_COHERENT         0x00000001  /* The device node is fully coherent */
    717 #define ACPI_IORT_NODE_NOT_COHERENT     0x00000000  /* The device node is not coherent */
    718 
    719 /* Masks for Hints field above */
    720 
    721 #define ACPI_IORT_HT_TRANSIENT          (1)
    722 #define ACPI_IORT_HT_WRITE              (1<<1)
    723 #define ACPI_IORT_HT_READ               (1<<2)
    724 #define ACPI_IORT_HT_OVERRIDE           (1<<3)
    725 
    726 /* Masks for MemoryFlags field above */
    727 
    728 #define ACPI_IORT_MF_COHERENCY          (1)
    729 #define ACPI_IORT_MF_ATTRIBUTES         (1<<1)
    730 #define ACPI_IORT_MF_CANWBS             (1<<2)
    731 
    732 
    733 /*
    734  * IORT node specific subtables
    735  */
    736 typedef struct acpi_iort_its_group
    737 {
    738     UINT32                  ItsCount;
    739     UINT32                  Identifiers[];          /* GIC ITS identifier array */
    740 
    741 } ACPI_IORT_ITS_GROUP;
    742 
    743 
    744 typedef struct acpi_iort_named_component
    745 {
    746     UINT32                  NodeFlags;
    747     UINT64                  MemoryProperties;       /* Memory access properties */
    748     UINT8                   MemoryAddressLimit;     /* Memory address size limit */
    749     char                    DeviceName[];           /* Path of namespace object */
    750 
    751 } ACPI_IORT_NAMED_COMPONENT;
    752 
    753 /* Masks for Flags field above */
    754 
    755 #define ACPI_IORT_NC_STALL_SUPPORTED    (1)
    756 #define ACPI_IORT_NC_PASID_BITS         (31<<1)
    757 
    758 typedef struct acpi_iort_root_complex
    759 {
    760     UINT64                  MemoryProperties;       /* Memory access properties */
    761     UINT32                  AtsAttribute;
    762     UINT32                  PciSegmentNumber;
    763     UINT8                   MemoryAddressLimit;     /* Memory address size limit */
    764     UINT16                  PasidCapabilities;      /* PASID Capabilities */
    765     UINT8                   Reserved[];             /* Reserved, must be zero */
    766 
    767 } ACPI_IORT_ROOT_COMPLEX;
    768 
    769 /* Masks for AtsAttribute field above */
    770 
    771 #define ACPI_IORT_ATS_SUPPORTED         (1)     /* The root complex ATS support */
    772 #define ACPI_IORT_PRI_SUPPORTED         (1<<1)  /* The root complex PRI support */
    773 #define ACPI_IORT_PASID_FWD_SUPPORTED   (1<<2)  /* The root complex PASID forward support */
    774 
    775 /* Masks for PasidCapabilities field above */
    776 #define ACPI_IORT_PASID_MAX_WIDTH       (0x1F)  /* Bits 0-4 */
    777 
    778 typedef struct acpi_iort_smmu
    779 {
    780     UINT64                  BaseAddress;            /* SMMU base address */
    781     UINT64                  Span;                   /* Length of memory range */
    782     UINT32                  Model;
    783     UINT32                  Flags;
    784     UINT32                  GlobalInterruptOffset;
    785     UINT32                  ContextInterruptCount;
    786     UINT32                  ContextInterruptOffset;
    787     UINT32                  PmuInterruptCount;
    788     UINT32                  PmuInterruptOffset;
    789     UINT64                  Interrupts[];           /* Interrupt array */
    790 
    791 } ACPI_IORT_SMMU;
    792 
    793 /* Values for Model field above */
    794 
    795 #define ACPI_IORT_SMMU_V1               0x00000000  /* Generic SMMUv1 */
    796 #define ACPI_IORT_SMMU_V2               0x00000001  /* Generic SMMUv2 */
    797 #define ACPI_IORT_SMMU_CORELINK_MMU400  0x00000002  /* ARM Corelink MMU-400 */
    798 #define ACPI_IORT_SMMU_CORELINK_MMU500  0x00000003  /* ARM Corelink MMU-500 */
    799 #define ACPI_IORT_SMMU_CORELINK_MMU401  0x00000004  /* ARM Corelink MMU-401 */
    800 #define ACPI_IORT_SMMU_CAVIUM_THUNDERX  0x00000005  /* Cavium ThunderX SMMUv2 */
    801 
    802 /* Masks for Flags field above */
    803 
    804 #define ACPI_IORT_SMMU_DVM_SUPPORTED    (1)
    805 #define ACPI_IORT_SMMU_COHERENT_WALK    (1<<1)
    806 
    807 /* Global interrupt format */
    808 
    809 typedef struct acpi_iort_smmu_gsi
    810 {
    811     UINT32                  NSgIrpt;
    812     UINT32                  NSgIrptFlags;
    813     UINT32                  NSgCfgIrpt;
    814     UINT32                  NSgCfgIrptFlags;
    815 
    816 } ACPI_IORT_SMMU_GSI;
    817 
    818 
    819 typedef struct acpi_iort_smmu_v3
    820 {
    821     UINT64                  BaseAddress;            /* SMMUv3 base address */
    822     UINT32                  Flags;
    823     UINT32                  Reserved;
    824     UINT64                  VatosAddress;
    825     UINT32                  Model;
    826     UINT32                  EventGsiv;
    827     UINT32                  PriGsiv;
    828     UINT32                  GerrGsiv;
    829     UINT32                  SyncGsiv;
    830     UINT32                  Pxm;
    831     UINT32                  IdMappingIndex;
    832 
    833 } ACPI_IORT_SMMU_V3;
    834 
    835 /* Values for Model field above */
    836 
    837 #define ACPI_IORT_SMMU_V3_GENERIC           0x00000000  /* Generic SMMUv3 */
    838 #define ACPI_IORT_SMMU_V3_HISILICON_HI161X  0x00000001  /* HiSilicon Hi161x SMMUv3 */
    839 #define ACPI_IORT_SMMU_V3_CAVIUM_CN99XX     0x00000002  /* Cavium CN99xx SMMUv3 */
    840 
    841 /* Masks for Flags field above */
    842 
    843 #define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE   (1)
    844 #define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE     (3<<1)
    845 #define ACPI_IORT_SMMU_V3_PXM_VALID         (1<<3)
    846 #define ACPI_IORT_SMMU_V3_DEVICEID_VALID    (1<<4)
    847 
    848 typedef struct acpi_iort_pmcg
    849 {
    850     UINT64                  Page0BaseAddress;
    851     UINT32                  OverflowGsiv;
    852     UINT32                  NodeReference;
    853     UINT64                  Page1BaseAddress;
    854 
    855 } ACPI_IORT_PMCG;
    856 
    857 typedef struct acpi_iort_rmr {
    858     UINT32 Flags;
    859     UINT32 RmrCount;
    860     UINT32 RmrOffset;
    861 
    862 } ACPI_IORT_RMR;
    863 
    864 /* Masks for Flags field above */
    865 #define ACPI_IORT_RMR_REMAP_PERMITTED      (1)
    866 #define ACPI_IORT_RMR_ACCESS_PRIVILEGE     (1<<1)
    867 
    868 /*
    869  * Macro to access the Access Attributes in flags field above:
    870  *  Access Attributes is encoded in bits 9:2
    871  */
    872 #define ACPI_IORT_RMR_ACCESS_ATTRIBUTES(flags)          (((flags) >> 2) & 0xFF)
    873 
    874 /* Values for above Access Attributes */
    875 
    876 #define ACPI_IORT_RMR_ATTR_DEVICE_NGNRNE   0x00
    877 #define ACPI_IORT_RMR_ATTR_DEVICE_NGNRE    0x01
    878 #define ACPI_IORT_RMR_ATTR_DEVICE_NGRE     0x02
    879 #define ACPI_IORT_RMR_ATTR_DEVICE_GRE      0x03
    880 #define ACPI_IORT_RMR_ATTR_NORMAL_NC       0x04
    881 #define ACPI_IORT_RMR_ATTR_NORMAL_IWB_OWB  0x05
    882 
    883 typedef struct acpi_iort_rmr_desc {
    884     UINT64 BaseAddress;
    885     UINT64 Length;
    886     UINT32 Reserved;
    887 
    888 } ACPI_IORT_RMR_DESC;
    889 
    890 /*******************************************************************************
    891  *
    892  * IVRS - I/O Virtualization Reporting Structure
    893  *        Version 1
    894  *
    895  * Conforms to "AMD I/O Virtualization Technology (IOMMU) Specification",
    896  * Revision 1.26, February 2009.
    897  *
    898  ******************************************************************************/
    899 
    900 typedef struct acpi_table_ivrs
    901 {
    902     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
    903     UINT32                  Info;               /* Common virtualization info */
    904     UINT64                  Reserved;
    905 
    906 } ACPI_TABLE_IVRS;
    907 
    908 /* Values for Info field above */
    909 
    910 #define ACPI_IVRS_PHYSICAL_SIZE     0x00007F00  /* 7 bits, physical address size */
    911 #define ACPI_IVRS_VIRTUAL_SIZE      0x003F8000  /* 7 bits, virtual address size */
    912 #define ACPI_IVRS_ATS_RESERVED      0x00400000  /* ATS address translation range reserved */
    913 
    914 
    915 /* IVRS subtable header */
    916 
    917 typedef struct acpi_ivrs_header
    918 {
    919     UINT8                   Type;               /* Subtable type */
    920     UINT8                   Flags;
    921     UINT16                  Length;             /* Subtable length */
    922     UINT16                  DeviceId;           /* ID of IOMMU */
    923 
    924 } ACPI_IVRS_HEADER;
    925 
    926 /* Values for subtable Type above */
    927 
    928 enum AcpiIvrsType
    929 {
    930     ACPI_IVRS_TYPE_HARDWARE1        = 0x10,
    931     ACPI_IVRS_TYPE_HARDWARE2        = 0x11,
    932     ACPI_IVRS_TYPE_HARDWARE3        = 0x40,
    933     ACPI_IVRS_TYPE_MEMORY1          = 0x20,
    934     ACPI_IVRS_TYPE_MEMORY2          = 0x21,
    935     ACPI_IVRS_TYPE_MEMORY3          = 0x22
    936 };
    937 
    938 /* Masks for Flags field above for IVHD subtable */
    939 
    940 #define ACPI_IVHD_TT_ENABLE         (1)
    941 #define ACPI_IVHD_PASS_PW           (1<<1)
    942 #define ACPI_IVHD_RES_PASS_PW       (1<<2)
    943 #define ACPI_IVHD_ISOC              (1<<3)
    944 #define ACPI_IVHD_IOTLB             (1<<4)
    945 
    946 /* Masks for Flags field above for IVMD subtable */
    947 
    948 #define ACPI_IVMD_UNITY             (1)
    949 #define ACPI_IVMD_READ              (1<<1)
    950 #define ACPI_IVMD_WRITE             (1<<2)
    951 #define ACPI_IVMD_EXCLUSION_RANGE   (1<<3)
    952 
    953 
    954 /*
    955  * IVRS subtables, correspond to Type in ACPI_IVRS_HEADER
    956  */
    957 
    958 /* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */
    959 
    960 typedef struct acpi_ivrs_hardware_10
    961 {
    962     ACPI_IVRS_HEADER        Header;
    963     UINT16                  CapabilityOffset;   /* Offset for IOMMU control fields */
    964     UINT64                  BaseAddress;        /* IOMMU control registers */
    965     UINT16                  PciSegmentGroup;
    966     UINT16                  Info;               /* MSI number and unit ID */
    967     UINT32                  FeatureReporting;
    968 
    969 } ACPI_IVRS_HARDWARE1;
    970 
    971 /* 0x11: I/O Virtualization Hardware Definition Block (IVHD) */
    972 
    973 typedef struct acpi_ivrs_hardware_11
    974 {
    975     ACPI_IVRS_HEADER        Header;
    976     UINT16                  CapabilityOffset;   /* Offset for IOMMU control fields */
    977     UINT64                  BaseAddress;        /* IOMMU control registers */
    978     UINT16                  PciSegmentGroup;
    979     UINT16                  Info;               /* MSI number and unit ID */
    980     UINT32                  Attributes;
    981     UINT64                  EfrRegisterImage;
    982     UINT64                  Reserved;
    983 } ACPI_IVRS_HARDWARE2;
    984 
    985 /* Masks for Info field above */
    986 
    987 #define ACPI_IVHD_MSI_NUMBER_MASK   0x001F      /* 5 bits, MSI message number */
    988 #define ACPI_IVHD_UNIT_ID_MASK      0x1F00      /* 5 bits, UnitID */
    989 
    990 
    991 /*
    992  * Device Entries for IVHD subtable, appear after ACPI_IVRS_HARDWARE structure.
    993  * Upper two bits of the Type field are the (encoded) length of the structure.
    994  * Currently, only 4 and 8 byte entries are defined. 16 and 32 byte entries
    995  * are reserved for future use but not defined.
    996  */
    997 typedef struct acpi_ivrs_de_header
    998 {
    999     UINT8                   Type;
   1000     UINT16                  Id;
   1001     UINT8                   DataSetting;
   1002 
   1003 } ACPI_IVRS_DE_HEADER;
   1004 
   1005 /* Length of device entry is in the top two bits of Type field above */
   1006 
   1007 #define ACPI_IVHD_ENTRY_LENGTH      0xC0
   1008 
   1009 /* Values for device entry Type field above */
   1010 
   1011 enum AcpiIvrsDeviceEntryType
   1012 {
   1013     /* 4-byte device entries, all use ACPI_IVRS_DEVICE4 */
   1014 
   1015     ACPI_IVRS_TYPE_PAD4             = 0,
   1016     ACPI_IVRS_TYPE_ALL              = 1,
   1017     ACPI_IVRS_TYPE_SELECT           = 2,
   1018     ACPI_IVRS_TYPE_START            = 3,
   1019     ACPI_IVRS_TYPE_END              = 4,
   1020 
   1021     /* 8-byte device entries */
   1022 
   1023     ACPI_IVRS_TYPE_PAD8             = 64,
   1024     ACPI_IVRS_TYPE_NOT_USED         = 65,
   1025     ACPI_IVRS_TYPE_ALIAS_SELECT     = 66, /* Uses ACPI_IVRS_DEVICE8A */
   1026     ACPI_IVRS_TYPE_ALIAS_START      = 67, /* Uses ACPI_IVRS_DEVICE8A */
   1027     ACPI_IVRS_TYPE_EXT_SELECT       = 70, /* Uses ACPI_IVRS_DEVICE8B */
   1028     ACPI_IVRS_TYPE_EXT_START        = 71, /* Uses ACPI_IVRS_DEVICE8B */
   1029     ACPI_IVRS_TYPE_SPECIAL          = 72, /* Uses ACPI_IVRS_DEVICE8C */
   1030 
   1031     /* Variable-length device entries */
   1032 
   1033     ACPI_IVRS_TYPE_HID              = 240 /* Uses ACPI_IVRS_DEVICE_HID */
   1034 };
   1035 
   1036 /* Values for Data field above */
   1037 
   1038 #define ACPI_IVHD_INIT_PASS         (1)
   1039 #define ACPI_IVHD_EINT_PASS         (1<<1)
   1040 #define ACPI_IVHD_NMI_PASS          (1<<2)
   1041 #define ACPI_IVHD_SYSTEM_MGMT       (3<<4)
   1042 #define ACPI_IVHD_LINT0_PASS        (1<<6)
   1043 #define ACPI_IVHD_LINT1_PASS        (1<<7)
   1044 
   1045 
   1046 /* Types 0-4: 4-byte device entry */
   1047 
   1048 typedef struct acpi_ivrs_device4
   1049 {
   1050     ACPI_IVRS_DE_HEADER     Header;
   1051 
   1052 } ACPI_IVRS_DEVICE4;
   1053 
   1054 /* Types 66-67: 8-byte device entry */
   1055 
   1056 typedef struct acpi_ivrs_device8a
   1057 {
   1058     ACPI_IVRS_DE_HEADER     Header;
   1059     UINT8                   Reserved1;
   1060     UINT16                  UsedId;
   1061     UINT8                   Reserved2;
   1062 
   1063 } ACPI_IVRS_DEVICE8A;
   1064 
   1065 /* Types 70-71: 8-byte device entry */
   1066 
   1067 typedef struct acpi_ivrs_device8b
   1068 {
   1069     ACPI_IVRS_DE_HEADER     Header;
   1070     UINT32                  ExtendedData;
   1071 
   1072 } ACPI_IVRS_DEVICE8B;
   1073 
   1074 /* Values for ExtendedData above */
   1075 
   1076 #define ACPI_IVHD_ATS_DISABLED      (1<<31)
   1077 
   1078 /* Type 72: 8-byte device entry */
   1079 
   1080 typedef struct acpi_ivrs_device8c
   1081 {
   1082     ACPI_IVRS_DE_HEADER     Header;
   1083     UINT8                   Handle;
   1084     UINT16                  UsedId;
   1085     UINT8                   Variety;
   1086 
   1087 } ACPI_IVRS_DEVICE8C;
   1088 
   1089 /* Values for Variety field above */
   1090 
   1091 #define ACPI_IVHD_IOAPIC            1
   1092 #define ACPI_IVHD_HPET              2
   1093 
   1094 /* Type 240: variable-length device entry */
   1095 
   1096 typedef struct acpi_ivrs_device_hid
   1097 {
   1098     ACPI_IVRS_DE_HEADER     Header;
   1099     UINT64                  AcpiHid;
   1100     UINT64                  AcpiCid;
   1101     UINT8                   UidType;
   1102     UINT8                   UidLength;
   1103 
   1104 } ACPI_IVRS_DEVICE_HID;
   1105 
   1106 /* Values for UidType above */
   1107 
   1108 #define ACPI_IVRS_UID_NOT_PRESENT   0
   1109 #define ACPI_IVRS_UID_IS_INTEGER    1
   1110 #define ACPI_IVRS_UID_IS_STRING     2
   1111 
   1112 /* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */
   1113 
   1114 typedef struct acpi_ivrs_memory
   1115 {
   1116     ACPI_IVRS_HEADER        Header;
   1117     UINT16                  AuxData;
   1118     UINT64                  Reserved;
   1119     UINT64                  StartAddress;
   1120     UINT64                  MemoryLength;
   1121 
   1122 } ACPI_IVRS_MEMORY;
   1123 
   1124 
   1125 /*******************************************************************************
   1126  *
   1127  * LPIT - Low Power Idle Table
   1128  *
   1129  * Conforms to "ACPI Low Power Idle Table (LPIT)" July 2014.
   1130  *
   1131  ******************************************************************************/
   1132 
   1133 typedef struct acpi_table_lpit
   1134 {
   1135     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   1136 
   1137 } ACPI_TABLE_LPIT;
   1138 
   1139 
   1140 /* LPIT subtable header */
   1141 
   1142 typedef struct acpi_lpit_header
   1143 {
   1144     UINT32                  Type;               /* Subtable type */
   1145     UINT32                  Length;             /* Subtable length */
   1146     UINT16                  UniqueId;
   1147     UINT16                  Reserved;
   1148     UINT32                  Flags;
   1149 
   1150 } ACPI_LPIT_HEADER;
   1151 
   1152 /* Values for subtable Type above */
   1153 
   1154 enum AcpiLpitType
   1155 {
   1156     ACPI_LPIT_TYPE_NATIVE_CSTATE    = 0x00,
   1157     ACPI_LPIT_TYPE_RESERVED         = 0x01      /* 1 and above are reserved */
   1158 };
   1159 
   1160 /* Masks for Flags field above  */
   1161 
   1162 #define ACPI_LPIT_STATE_DISABLED    (1)
   1163 #define ACPI_LPIT_NO_COUNTER        (1<<1)
   1164 
   1165 /*
   1166  * LPIT subtables, correspond to Type in ACPI_LPIT_HEADER
   1167  */
   1168 
   1169 /* 0x00: Native C-state instruction based LPI structure */
   1170 
   1171 typedef struct acpi_lpit_native
   1172 {
   1173     ACPI_LPIT_HEADER        Header;
   1174     ACPI_GENERIC_ADDRESS    EntryTrigger;
   1175     UINT32                  Residency;
   1176     UINT32                  Latency;
   1177     ACPI_GENERIC_ADDRESS    ResidencyCounter;
   1178     UINT64                  CounterFrequency;
   1179 
   1180 } ACPI_LPIT_NATIVE;
   1181 
   1182 
   1183 /*******************************************************************************
   1184  *
   1185  * MADT - Multiple APIC Description Table
   1186  *        Version 3
   1187  *
   1188  ******************************************************************************/
   1189 
   1190 typedef struct acpi_table_madt
   1191 {
   1192     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   1193     UINT32                  Address;            /* Physical address of local APIC */
   1194     UINT32                  Flags;
   1195 
   1196 } ACPI_TABLE_MADT;
   1197 
   1198 /* Masks for Flags field above */
   1199 
   1200 #define ACPI_MADT_PCAT_COMPAT       (1)         /* 00: System also has dual 8259s */
   1201 
   1202 /* Values for PCATCompat flag */
   1203 
   1204 #define ACPI_MADT_DUAL_PIC          1
   1205 #define ACPI_MADT_MULTIPLE_APIC     0
   1206 
   1207 
   1208 /* Values for MADT subtable type in ACPI_SUBTABLE_HEADER */
   1209 
   1210 enum AcpiMadtType
   1211 {
   1212     ACPI_MADT_TYPE_LOCAL_APIC               = 0,
   1213     ACPI_MADT_TYPE_IO_APIC                  = 1,
   1214     ACPI_MADT_TYPE_INTERRUPT_OVERRIDE       = 2,
   1215     ACPI_MADT_TYPE_NMI_SOURCE               = 3,
   1216     ACPI_MADT_TYPE_LOCAL_APIC_NMI           = 4,
   1217     ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE      = 5,
   1218     ACPI_MADT_TYPE_IO_SAPIC                 = 6,
   1219     ACPI_MADT_TYPE_LOCAL_SAPIC              = 7,
   1220     ACPI_MADT_TYPE_INTERRUPT_SOURCE         = 8,
   1221     ACPI_MADT_TYPE_LOCAL_X2APIC             = 9,
   1222     ACPI_MADT_TYPE_LOCAL_X2APIC_NMI         = 10,
   1223     ACPI_MADT_TYPE_GENERIC_INTERRUPT        = 11,
   1224     ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR      = 12,
   1225     ACPI_MADT_TYPE_GENERIC_MSI_FRAME        = 13,
   1226     ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR    = 14,
   1227     ACPI_MADT_TYPE_GENERIC_TRANSLATOR       = 15,
   1228     ACPI_MADT_TYPE_MULTIPROC_WAKEUP         = 16,
   1229     ACPI_MADT_TYPE_CORE_PIC                 = 17,
   1230     ACPI_MADT_TYPE_LIO_PIC                  = 18,
   1231     ACPI_MADT_TYPE_HT_PIC                   = 19,
   1232     ACPI_MADT_TYPE_EIO_PIC                  = 20,
   1233     ACPI_MADT_TYPE_MSI_PIC                  = 21,
   1234     ACPI_MADT_TYPE_BIO_PIC                  = 22,
   1235     ACPI_MADT_TYPE_LPC_PIC                  = 23,
   1236     ACPI_MADT_TYPE_RINTC                    = 24,
   1237     ACPI_MADT_TYPE_IMSIC                    = 25,
   1238     ACPI_MADT_TYPE_APLIC                    = 26,
   1239     ACPI_MADT_TYPE_PLIC                     = 27,
   1240     ACPI_MADT_TYPE_RESERVED                 = 28,   /* 28 to 0x7F are reserved */
   1241     ACPI_MADT_TYPE_OEM_RESERVED             = 0x80  /* 0x80 to 0xFF are reserved for OEM use */
   1242 };
   1243 
   1244 
   1245 /*
   1246  * MADT Subtables, correspond to Type in ACPI_SUBTABLE_HEADER
   1247  */
   1248 
   1249 /* 0: Processor Local APIC */
   1250 
   1251 typedef struct acpi_madt_local_apic
   1252 {
   1253     ACPI_SUBTABLE_HEADER    Header;
   1254     UINT8                   ProcessorId;        /* ACPI processor id */
   1255     UINT8                   Id;                 /* Processor's local APIC id */
   1256     UINT32                  LapicFlags;
   1257 
   1258 } ACPI_MADT_LOCAL_APIC;
   1259 
   1260 
   1261 /* 1: IO APIC */
   1262 
   1263 typedef struct acpi_madt_io_apic
   1264 {
   1265     ACPI_SUBTABLE_HEADER    Header;
   1266     UINT8                   Id;                 /* I/O APIC ID */
   1267     UINT8                   Reserved;           /* Reserved - must be zero */
   1268     UINT32                  Address;            /* APIC physical address */
   1269     UINT32                  GlobalIrqBase;      /* Global system interrupt where INTI lines start */
   1270 
   1271 } ACPI_MADT_IO_APIC;
   1272 
   1273 
   1274 /* 2: Interrupt Override */
   1275 
   1276 typedef struct acpi_madt_interrupt_override
   1277 {
   1278     ACPI_SUBTABLE_HEADER    Header;
   1279     UINT8                   Bus;                /* 0 - ISA */
   1280     UINT8                   SourceIrq;          /* Interrupt source (IRQ) */
   1281     UINT32                  GlobalIrq;          /* Global system interrupt */
   1282     UINT16                  IntiFlags;
   1283 
   1284 } ACPI_MADT_INTERRUPT_OVERRIDE;
   1285 
   1286 
   1287 /* 3: NMI Source */
   1288 
   1289 typedef struct acpi_madt_nmi_source
   1290 {
   1291     ACPI_SUBTABLE_HEADER    Header;
   1292     UINT16                  IntiFlags;
   1293     UINT32                  GlobalIrq;          /* Global system interrupt */
   1294 
   1295 } ACPI_MADT_NMI_SOURCE;
   1296 
   1297 
   1298 /* 4: Local APIC NMI */
   1299 
   1300 typedef struct acpi_madt_local_apic_nmi
   1301 {
   1302     ACPI_SUBTABLE_HEADER    Header;
   1303     UINT8                   ProcessorId;        /* ACPI processor id */
   1304     UINT16                  IntiFlags;
   1305     UINT8                   Lint;               /* LINTn to which NMI is connected */
   1306 
   1307 } ACPI_MADT_LOCAL_APIC_NMI;
   1308 
   1309 
   1310 /* 5: Address Override */
   1311 
   1312 typedef struct acpi_madt_local_apic_override
   1313 {
   1314     ACPI_SUBTABLE_HEADER    Header;
   1315     UINT16                  Reserved;           /* Reserved, must be zero */
   1316     UINT64                  Address;            /* APIC physical address */
   1317 
   1318 } ACPI_MADT_LOCAL_APIC_OVERRIDE;
   1319 
   1320 
   1321 /* 6: I/O Sapic */
   1322 
   1323 typedef struct acpi_madt_io_sapic
   1324 {
   1325     ACPI_SUBTABLE_HEADER    Header;
   1326     UINT8                   Id;                 /* I/O SAPIC ID */
   1327     UINT8                   Reserved;           /* Reserved, must be zero */
   1328     UINT32                  GlobalIrqBase;      /* Global interrupt for SAPIC start */
   1329     UINT64                  Address;            /* SAPIC physical address */
   1330 
   1331 } ACPI_MADT_IO_SAPIC;
   1332 
   1333 
   1334 /* 7: Local Sapic */
   1335 
   1336 typedef struct acpi_madt_local_sapic
   1337 {
   1338     ACPI_SUBTABLE_HEADER    Header;
   1339     UINT8                   ProcessorId;        /* ACPI processor id */
   1340     UINT8                   Id;                 /* SAPIC ID */
   1341     UINT8                   Eid;                /* SAPIC EID */
   1342     UINT8                   Reserved[3];        /* Reserved, must be zero */
   1343     UINT32                  LapicFlags;
   1344     UINT32                  Uid;                /* Numeric UID - ACPI 3.0 */
   1345     char                    UidString[];        /* String UID  - ACPI 3.0 */
   1346 
   1347 } ACPI_MADT_LOCAL_SAPIC;
   1348 
   1349 
   1350 /* 8: Platform Interrupt Source */
   1351 
   1352 typedef struct acpi_madt_interrupt_source
   1353 {
   1354     ACPI_SUBTABLE_HEADER    Header;
   1355     UINT16                  IntiFlags;
   1356     UINT8                   Type;               /* 1=PMI, 2=INIT, 3=corrected */
   1357     UINT8                   Id;                 /* Processor ID */
   1358     UINT8                   Eid;                /* Processor EID */
   1359     UINT8                   IoSapicVector;      /* Vector value for PMI interrupts */
   1360     UINT32                  GlobalIrq;          /* Global system interrupt */
   1361     UINT32                  Flags;              /* Interrupt Source Flags */
   1362 
   1363 } ACPI_MADT_INTERRUPT_SOURCE;
   1364 
   1365 /* Masks for Flags field above */
   1366 
   1367 #define ACPI_MADT_CPEI_OVERRIDE     (1)
   1368 
   1369 
   1370 /* 9: Processor Local X2APIC (ACPI 4.0) */
   1371 
   1372 typedef struct acpi_madt_local_x2apic
   1373 {
   1374     ACPI_SUBTABLE_HEADER    Header;
   1375     UINT16                  Reserved;           /* Reserved - must be zero */
   1376     UINT32                  LocalApicId;        /* Processor x2APIC ID  */
   1377     UINT32                  LapicFlags;
   1378     UINT32                  Uid;                /* ACPI processor UID */
   1379 
   1380 } ACPI_MADT_LOCAL_X2APIC;
   1381 
   1382 
   1383 /* 10: Local X2APIC NMI (ACPI 4.0) */
   1384 
   1385 typedef struct acpi_madt_local_x2apic_nmi
   1386 {
   1387     ACPI_SUBTABLE_HEADER    Header;
   1388     UINT16                  IntiFlags;
   1389     UINT32                  Uid;                /* ACPI processor UID */
   1390     UINT8                   Lint;               /* LINTn to which NMI is connected */
   1391     UINT8                   Reserved[3];        /* Reserved - must be zero */
   1392 
   1393 } ACPI_MADT_LOCAL_X2APIC_NMI;
   1394 
   1395 
   1396 /* 11: Generic Interrupt - GICC (ACPI 5.0 + ACPI 6.0 + ACPI 6.3 + ACPI 6.5 changes) */
   1397 
   1398 typedef struct acpi_madt_generic_interrupt
   1399 {
   1400     ACPI_SUBTABLE_HEADER    Header;
   1401     UINT16                  Reserved;           /* Reserved - must be zero */
   1402     UINT32                  CpuInterfaceNumber;
   1403     UINT32                  Uid;
   1404     UINT32                  Flags;
   1405     UINT32                  ParkingVersion;
   1406     UINT32                  PerformanceInterrupt;
   1407     UINT64                  ParkedAddress;
   1408     UINT64                  BaseAddress;
   1409     UINT64                  GicvBaseAddress;
   1410     UINT64                  GichBaseAddress;
   1411     UINT32                  VgicInterrupt;
   1412     UINT64                  GicrBaseAddress;
   1413     UINT64                  ArmMpidr;
   1414     UINT8                   EfficiencyClass;
   1415     UINT8                   Reserved2[1];
   1416     UINT16                  SpeInterrupt;       /* ACPI 6.3 */
   1417     UINT16                  TrbeInterrupt;      /* ACPI 6.5 */
   1418 
   1419 } ACPI_MADT_GENERIC_INTERRUPT;
   1420 
   1421 /* Masks for Flags field above */
   1422 
   1423 /* ACPI_MADT_ENABLED                    (1)      Processor is usable if set */
   1424 #define ACPI_MADT_PERFORMANCE_IRQ_MODE  (1<<1)  /* 01: Performance Interrupt Mode */
   1425 #define ACPI_MADT_VGIC_IRQ_MODE         (1<<2)  /* 02: VGIC Maintenance Interrupt mode */
   1426 #define ACPI_MADT_GICC_ONLINE_CAPABLE   (1<<3)  /* 03: Processor is online capable  */
   1427 #define ACPI_MADT_GICC_NON_COHERENT     (1<<4)  /* 04: GIC redistributor is not coherent */
   1428 
   1429 /* 12: Generic Distributor (ACPI 5.0 + ACPI 6.0 changes) */
   1430 
   1431 typedef struct acpi_madt_generic_distributor
   1432 {
   1433     ACPI_SUBTABLE_HEADER    Header;
   1434     UINT16                  Reserved;           /* Reserved - must be zero */
   1435     UINT32                  GicId;
   1436     UINT64                  BaseAddress;
   1437     UINT32                  GlobalIrqBase;
   1438     UINT8                   Version;
   1439     UINT8                   Reserved2[3];       /* Reserved - must be zero */
   1440 
   1441 } ACPI_MADT_GENERIC_DISTRIBUTOR;
   1442 
   1443 /* Values for Version field above */
   1444 
   1445 enum AcpiMadtGicVersion
   1446 {
   1447     ACPI_MADT_GIC_VERSION_NONE          = 0,
   1448     ACPI_MADT_GIC_VERSION_V1            = 1,
   1449     ACPI_MADT_GIC_VERSION_V2            = 2,
   1450     ACPI_MADT_GIC_VERSION_V3            = 3,
   1451     ACPI_MADT_GIC_VERSION_V4            = 4,
   1452     ACPI_MADT_GIC_VERSION_RESERVED      = 5     /* 5 and greater are reserved */
   1453 };
   1454 
   1455 
   1456 /* 13: Generic MSI Frame (ACPI 5.1) */
   1457 
   1458 typedef struct acpi_madt_generic_msi_frame
   1459 {
   1460     ACPI_SUBTABLE_HEADER    Header;
   1461     UINT16                  Reserved;           /* Reserved - must be zero */
   1462     UINT32                  MsiFrameId;
   1463     UINT64                  BaseAddress;
   1464     UINT32                  Flags;
   1465     UINT16                  SpiCount;
   1466     UINT16                  SpiBase;
   1467 
   1468 } ACPI_MADT_GENERIC_MSI_FRAME;
   1469 
   1470 /* Masks for Flags field above */
   1471 
   1472 #define ACPI_MADT_OVERRIDE_SPI_VALUES   (1)
   1473 
   1474 
   1475 /* 14: Generic Redistributor (ACPI 5.1) */
   1476 
   1477 typedef struct acpi_madt_generic_redistributor
   1478 {
   1479     ACPI_SUBTABLE_HEADER    Header;
   1480     UINT8                   Flags;
   1481     UINT8                   Reserved;           /* reserved - must be zero */
   1482     UINT64                  BaseAddress;
   1483     UINT32                  Length;
   1484 
   1485 } ACPI_MADT_GENERIC_REDISTRIBUTOR;
   1486 
   1487 #define ACPI_MADT_GICR_NON_COHERENT     (1)
   1488 
   1489 /* 15: Generic Translator (ACPI 6.0) */
   1490 
   1491 typedef struct acpi_madt_generic_translator
   1492 {
   1493     ACPI_SUBTABLE_HEADER    Header;
   1494     UINT8                   Flags;
   1495     UINT8                   Reserved;           /* reserved - must be zero */
   1496     UINT32                  TranslationId;
   1497     UINT64                  BaseAddress;
   1498     UINT32                  Reserved2;
   1499 
   1500 } ACPI_MADT_GENERIC_TRANSLATOR;
   1501 
   1502 #define ACPI_MADT_ITS_NON_COHERENT      (1)
   1503 
   1504 /* 16: Multiprocessor wakeup (ACPI 6.4) */
   1505 
   1506 typedef struct acpi_madt_multiproc_wakeup
   1507 {
   1508     ACPI_SUBTABLE_HEADER    Header;
   1509     UINT16                  MailboxVersion;
   1510     UINT32                  Reserved;           /* reserved - must be zero */
   1511     UINT64                  BaseAddress;
   1512 
   1513 } ACPI_MADT_MULTIPROC_WAKEUP;
   1514 
   1515 #define ACPI_MULTIPROC_WAKEUP_MB_OS_SIZE        2032
   1516 #define ACPI_MULTIPROC_WAKEUP_MB_FIRMWARE_SIZE  2048
   1517 
   1518 typedef struct acpi_madt_multiproc_wakeup_mailbox
   1519 {
   1520     UINT16                  Command;
   1521     UINT16                  Reserved; /* reserved - must be zero */
   1522     UINT32                  ApicId;
   1523     UINT64                  WakeupVector;
   1524     UINT8                   ReservedOs[ACPI_MULTIPROC_WAKEUP_MB_OS_SIZE]; /* reserved for OS use */
   1525     UINT8                   ReservedFirmware[ACPI_MULTIPROC_WAKEUP_MB_FIRMWARE_SIZE]; /* reserved for firmware use */
   1526 
   1527 } ACPI_MADT_MULTIPROC_WAKEUP_MAILBOX;
   1528 
   1529 #define ACPI_MP_WAKE_COMMAND_WAKEUP    1
   1530 
   1531 /* 17: CPU Core Interrupt Controller (ACPI 6.5) */
   1532 
   1533 typedef struct acpi_madt_core_pic {
   1534     ACPI_SUBTABLE_HEADER    Header;
   1535     UINT8                   Version;
   1536     UINT32                  ProcessorId;
   1537     UINT32                  CoreId;
   1538     UINT32                  Flags;
   1539 } ACPI_MADT_CORE_PIC;
   1540 
   1541 /* Values for Version field above */
   1542 
   1543 enum AcpiMadtCorePicVersion {
   1544     ACPI_MADT_CORE_PIC_VERSION_NONE     = 0,
   1545     ACPI_MADT_CORE_PIC_VERSION_V1       = 1,
   1546     ACPI_MADT_CORE_PIC_VERSION_RESERVED = 2	/* 2 and greater are reserved */
   1547 };
   1548 
   1549 /* 18: Legacy I/O Interrupt Controller (ACPI 6.5) */
   1550 
   1551 typedef struct acpi_madt_lio_pic {
   1552     ACPI_SUBTABLE_HEADER    Header;
   1553     UINT8                   Version;
   1554     UINT64                  Address;
   1555     UINT16                  Size;
   1556     UINT8                   Cascade[2];
   1557     UINT32                  CascadeMap[2];
   1558 } ACPI_MADT_LIO_PIC;
   1559 
   1560 /* Values for Version field above */
   1561 
   1562 enum AcpiMadtLioPicVersion {
   1563     ACPI_MADT_LIO_PIC_VERSION_NONE      = 0,
   1564     ACPI_MADT_LIO_PIC_VERSION_V1        = 1,
   1565     ACPI_MADT_LIO_PIC_VERSION_RESERVED  = 2	/* 2 and greater are reserved */
   1566 };
   1567 
   1568 /* 19: HT Interrupt Controller (ACPI 6.5) */
   1569 
   1570 typedef struct acpi_madt_ht_pic {
   1571     ACPI_SUBTABLE_HEADER    Header;
   1572     UINT8                   Version;
   1573     UINT64                  Address;
   1574     UINT16                  Size;
   1575     UINT8                   Cascade[8];
   1576 } ACPI_MADT_HT_PIC;
   1577 
   1578 /* Values for Version field above */
   1579 
   1580 enum AcpiMadtHtPicVersion {
   1581     ACPI_MADT_HT_PIC_VERSION_NONE       = 0,
   1582     ACPI_MADT_HT_PIC_VERSION_V1         = 1,
   1583     ACPI_MADT_HT_PIC_VERSION_RESERVED   = 2	/* 2 and greater are reserved */
   1584 };
   1585 
   1586 /* 20: Extend I/O Interrupt Controller (ACPI 6.5) */
   1587 
   1588 typedef struct acpi_madt_eio_pic {
   1589     ACPI_SUBTABLE_HEADER    Header;
   1590     UINT8                   Version;
   1591     UINT8                   Cascade;
   1592     UINT8                   Node;
   1593     UINT64                  NodeMap;
   1594 } ACPI_MADT_EIO_PIC;
   1595 
   1596 /* Values for Version field above */
   1597 
   1598 enum AcpiMadtEioPicVersion {
   1599     ACPI_MADT_EIO_PIC_VERSION_NONE      = 0,
   1600     ACPI_MADT_EIO_PIC_VERSION_V1        = 1,
   1601     ACPI_MADT_EIO_PIC_VERSION_RESERVED  = 2	/* 2 and greater are reserved */
   1602 };
   1603 
   1604 /* 21: MSI Interrupt Controller (ACPI 6.5) */
   1605 
   1606 typedef struct acpi_madt_msi_pic {
   1607     ACPI_SUBTABLE_HEADER    Header;
   1608     UINT8                   Version;
   1609     UINT64                  MsgAddress;
   1610     UINT32                  Start;
   1611     UINT32                  Count;
   1612 } ACPI_MADT_MSI_PIC;
   1613 
   1614 /* Values for Version field above */
   1615 
   1616 enum AcpiMadtMsiPicVersion {
   1617     ACPI_MADT_MSI_PIC_VERSION_NONE      = 0,
   1618     ACPI_MADT_MSI_PIC_VERSION_V1        = 1,
   1619     ACPI_MADT_MSI_PIC_VERSION_RESERVED  = 2	/* 2 and greater are reserved */
   1620 };
   1621 
   1622 /* 22: Bridge I/O Interrupt Controller (ACPI 6.5) */
   1623 
   1624 typedef struct acpi_madt_bio_pic {
   1625     ACPI_SUBTABLE_HEADER    Header;
   1626     UINT8                   Version;
   1627     UINT64                  Address;
   1628     UINT16                  Size;
   1629     UINT16                  Id;
   1630     UINT16                  GsiBase;
   1631 } ACPI_MADT_BIO_PIC;
   1632 
   1633 /* Values for Version field above */
   1634 
   1635 enum AcpiMadtBioPicVersion {
   1636     ACPI_MADT_BIO_PIC_VERSION_NONE        = 0,
   1637     ACPI_MADT_BIO_PIC_VERSION_V1          = 1,
   1638     ACPI_MADT_BIO_PIC_VERSION_RESERVED    = 2	/* 2 and greater are reserved */
   1639 };
   1640 
   1641 /* 23: LPC Interrupt Controller (ACPI 6.5) */
   1642 
   1643 typedef struct acpi_madt_lpc_pic {
   1644     ACPI_SUBTABLE_HEADER    Header;
   1645     UINT8                   Version;
   1646     UINT64                  Address;
   1647     UINT16                  Size;
   1648     UINT8                   Cascade;
   1649 } ACPI_MADT_LPC_PIC;
   1650 
   1651 /* Values for Version field above */
   1652 
   1653 enum AcpiMadtLpcPicVersion {
   1654     ACPI_MADT_LPC_PIC_VERSION_NONE       = 0,
   1655     ACPI_MADT_LPC_PIC_VERSION_V1         = 1,
   1656     ACPI_MADT_LPC_PIC_VERSION_RESERVED   = 2	/* 2 and greater are reserved */
   1657 };
   1658 
   1659 /* 24: RISC-V INTC */
   1660 typedef struct acpi_madt_rintc {
   1661     ACPI_SUBTABLE_HEADER    Header;
   1662     UINT8                   Version;
   1663     UINT8                   Reserved;
   1664     UINT32                  Flags;
   1665     UINT64                  HartId;
   1666     UINT32                  Uid;                /* ACPI processor UID */
   1667     UINT32                  ExtIntcId;          /* External INTC Id */
   1668     UINT64                  ImsicAddr;          /* IMSIC base address */
   1669     UINT32                  ImsicSize;          /* IMSIC size */
   1670 } ACPI_MADT_RINTC;
   1671 
   1672 /* Values for RISC-V INTC Version field above */
   1673 
   1674 enum AcpiMadtRintcVersion {
   1675     ACPI_MADT_RINTC_VERSION_NONE       = 0,
   1676     ACPI_MADT_RINTC_VERSION_V1         = 1,
   1677     ACPI_MADT_RINTC_VERSION_RESERVED   = 2	/* 2 and greater are reserved */
   1678 };
   1679 
   1680 /* 25: RISC-V IMSIC */
   1681 typedef struct acpi_madt_imsic {
   1682     ACPI_SUBTABLE_HEADER    Header;
   1683     UINT8                   Version;
   1684     UINT8                   Reserved;
   1685     UINT32                  Flags;
   1686     UINT16                  NumIds;
   1687     UINT16                  NumGuestIds;
   1688     UINT8                   GuestIndexBits;
   1689     UINT8                   HartIndexBits;
   1690     UINT8                   GroupIndexBits;
   1691     UINT8                   GroupIndexShift;
   1692 } ACPI_MADT_IMSIC;
   1693 
   1694 /* 26: RISC-V APLIC */
   1695 typedef struct acpi_madt_aplic {
   1696     ACPI_SUBTABLE_HEADER    Header;
   1697     UINT8                   Version;
   1698     UINT8                   Id;
   1699     UINT32                  Flags;
   1700     UINT8                   HwId[8];
   1701     UINT16                  NumIdcs;
   1702     UINT16                  NumSources;
   1703     UINT32                  GsiBase;
   1704     UINT64                  BaseAddr;
   1705     UINT32                  Size;
   1706 } ACPI_MADT_APLIC;
   1707 
   1708 /* 27: RISC-V PLIC */
   1709 typedef struct acpi_madt_plic {
   1710     ACPI_SUBTABLE_HEADER    Header;
   1711     UINT8                   Version;
   1712     UINT8                   Id;
   1713     UINT8                   HwId[8];
   1714     UINT16                  NumIrqs;
   1715     UINT16                  MaxPrio;
   1716     UINT32                  Flags;
   1717     UINT32                  Size;
   1718     UINT64                  BaseAddr;
   1719     UINT32                  GsiBase;
   1720 } ACPI_MADT_PLIC;
   1721 
   1722 
   1723 /* 80: OEM data */
   1724 
   1725 typedef struct acpi_madt_oem_data
   1726 {
   1727     ACPI_FLEX_ARRAY(UINT8,  OemData);
   1728 } ACPI_MADT_OEM_DATA;
   1729 
   1730 
   1731 /*
   1732  * Common flags fields for MADT subtables
   1733  */
   1734 
   1735 /* MADT Local APIC flags */
   1736 
   1737 #define ACPI_MADT_ENABLED           (1)         /* 00: Processor is usable if set */
   1738 #define ACPI_MADT_ONLINE_CAPABLE    (2)         /* 01: System HW supports enabling processor at runtime */
   1739 
   1740 /* MADT MPS INTI flags (IntiFlags) */
   1741 
   1742 #define ACPI_MADT_POLARITY_MASK     (3)         /* 00-01: Polarity of APIC I/O input signals */
   1743 #define ACPI_MADT_TRIGGER_MASK      (3<<2)      /* 02-03: Trigger mode of APIC input signals */
   1744 
   1745 /* Values for MPS INTI flags */
   1746 
   1747 #define ACPI_MADT_POLARITY_CONFORMS       0
   1748 #define ACPI_MADT_POLARITY_ACTIVE_HIGH    1
   1749 #define ACPI_MADT_POLARITY_RESERVED       2
   1750 #define ACPI_MADT_POLARITY_ACTIVE_LOW     3
   1751 
   1752 #define ACPI_MADT_TRIGGER_CONFORMS        (0)
   1753 #define ACPI_MADT_TRIGGER_EDGE            (1<<2)
   1754 #define ACPI_MADT_TRIGGER_RESERVED        (2<<2)
   1755 #define ACPI_MADT_TRIGGER_LEVEL           (3<<2)
   1756 
   1757 
   1758 /*******************************************************************************
   1759  *
   1760  * MCFG - PCI Memory Mapped Configuration table and subtable
   1761  *        Version 1
   1762  *
   1763  * Conforms to "PCI Firmware Specification", Revision 3.0, June 20, 2005
   1764  *
   1765  ******************************************************************************/
   1766 
   1767 typedef struct acpi_table_mcfg
   1768 {
   1769     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   1770     UINT8                   Reserved[8];
   1771 
   1772 } ACPI_TABLE_MCFG;
   1773 
   1774 
   1775 /* Subtable */
   1776 
   1777 typedef struct acpi_mcfg_allocation
   1778 {
   1779     UINT64                  Address;            /* Base address, processor-relative */
   1780     UINT16                  PciSegment;         /* PCI segment group number */
   1781     UINT8                   StartBusNumber;     /* Starting PCI Bus number */
   1782     UINT8                   EndBusNumber;       /* Final PCI Bus number */
   1783     UINT32                  Reserved;
   1784 
   1785 } ACPI_MCFG_ALLOCATION;
   1786 
   1787 
   1788 /*******************************************************************************
   1789  *
   1790  * MCHI - Management Controller Host Interface Table
   1791  *        Version 1
   1792  *
   1793  * Conforms to "Management Component Transport Protocol (MCTP) Host
   1794  * Interface Specification", Revision 1.0.0a, October 13, 2009
   1795  *
   1796  ******************************************************************************/
   1797 
   1798 typedef struct acpi_table_mchi
   1799 {
   1800     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   1801     UINT8                   InterfaceType;
   1802     UINT8                   Protocol;
   1803     UINT64                  ProtocolData;
   1804     UINT8                   InterruptType;
   1805     UINT8                   Gpe;
   1806     UINT8                   PciDeviceFlag;
   1807     UINT32                  GlobalInterrupt;
   1808     ACPI_GENERIC_ADDRESS    ControlRegister;
   1809     UINT8                   PciSegment;
   1810     UINT8                   PciBus;
   1811     UINT8                   PciDevice;
   1812     UINT8                   PciFunction;
   1813 
   1814 } ACPI_TABLE_MCHI;
   1815 
   1816 /*******************************************************************************
   1817  *
   1818  * MPAM - Memory System Resource Partitioning and Monitoring
   1819  *
   1820  * Conforms to "ACPI for Memory System Resource Partitioning and Monitoring 2.0"
   1821  * Document number: ARM DEN 0065, December, 2022.
   1822  *
   1823  ******************************************************************************/
   1824 
   1825 /* MPAM RIS locator types. Table 11, Location types */
   1826 enum AcpiMpamLocatorType {
   1827     ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE    = 0,
   1828     ACPI_MPAM_LOCATION_TYPE_MEMORY             = 1,
   1829     ACPI_MPAM_LOCATION_TYPE_SMMU               = 2,
   1830     ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE       = 3,
   1831     ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE        = 4,
   1832     ACPI_MPAM_LOCATION_TYPE_INTERCONNECT       = 5,
   1833     ACPI_MPAM_LOCATION_TYPE_UNKNOWN            = 0xFF
   1834 };
   1835 
   1836 /* MPAM Functional dependency descriptor. Table 10 */
   1837 typedef struct acpi_mpam_func_deps
   1838 {
   1839     UINT32                        Producer;
   1840     UINT32                        Reserved;
   1841 } ACPI_MPAM_FUNC_DEPS;
   1842 
   1843 /* MPAM Processor cache locator descriptor. Table 13 */
   1844 typedef struct acpi_mpam_resource_cache_locator
   1845 {
   1846     UINT64                        CacheReference;
   1847     UINT32                        Reserved;
   1848 } ACPI_MPAM_RESOURCE_CACHE_LOCATOR;
   1849 
   1850 /* MPAM Memory locator descriptor. Table 14 */
   1851 typedef struct acpi_mpam_resource_memory_locator
   1852 {
   1853     UINT64                        ProximityDomain;
   1854     UINT32                        Reserved;
   1855 } ACPI_MPAM_RESOURCE_MEMORY_LOCATOR;
   1856 
   1857 /* MPAM SMMU locator descriptor. Table 15 */
   1858 typedef struct acpi_mpam_resource_smmu_locator
   1859 {
   1860     UINT64                        SmmuInterface;
   1861     UINT32                        Reserved;
   1862 } ACPI_MPAM_RESOURCE_SMMU_INTERFACE;
   1863 
   1864 /* MPAM Memory-side cache locator descriptor. Table 16 */
   1865 typedef struct acpi_mpam_resource_memcache_locator
   1866 {
   1867     UINT8                         Reserved[7];
   1868     UINT8                         Level;
   1869     UINT32                        Reference;
   1870 } ACPI_MPAM_RESOURCE_MEMCACHE_INTERFACE;
   1871 
   1872 /* MPAM ACPI device locator descriptor. Table 17 */
   1873 typedef struct acpi_mpam_resource_acpi_locator
   1874 {
   1875     UINT64                        AcpiHwId;
   1876     UINT32                        AcpiUniqueId;
   1877 } ACPI_MPAM_RESOURCE_ACPI_INTERFACE;
   1878 
   1879 /* MPAM Interconnect locator descriptor. Table 18 */
   1880 typedef struct acpi_mpam_resource_interconnect_locator
   1881 {
   1882     UINT64                        InterConnectDescTblOff;
   1883     UINT32                        Reserved;
   1884 } ACPI_MPAM_RESOURCE_INTERCONNECT_INTERFACE;
   1885 
   1886 /* MPAM Locator structure. Table 12 */
   1887 typedef struct acpi_mpam_resource_generic_locator
   1888 {
   1889     UINT64                        Descriptor1;
   1890     UINT32                        Descriptor2;
   1891 } ACPI_MPAM_RESOURCE_GENERIC_LOCATOR;
   1892 
   1893 typedef union acpi_mpam_resource_locator
   1894 {
   1895     ACPI_MPAM_RESOURCE_CACHE_LOCATOR             CacheLocator;
   1896     ACPI_MPAM_RESOURCE_MEMORY_LOCATOR            MemoryLocator;
   1897     ACPI_MPAM_RESOURCE_SMMU_INTERFACE            SmmuLocator;
   1898     ACPI_MPAM_RESOURCE_MEMCACHE_INTERFACE        MemCacheLocator;
   1899     ACPI_MPAM_RESOURCE_ACPI_INTERFACE            AcpiLocator;
   1900     ACPI_MPAM_RESOURCE_INTERCONNECT_INTERFACE    InterconnectIfcLocator;
   1901     ACPI_MPAM_RESOURCE_GENERIC_LOCATOR           GenericLocator;
   1902 } ACPI_MPAM_RESOURCE_LOCATOR;
   1903 
   1904 /* Memory System Component Resource Node Structure Table 9 */
   1905 typedef struct acpi_mpam_resource_node
   1906 {
   1907     UINT32                        Identifier;
   1908     UINT8                         RISIndex;
   1909     UINT16                        Reserved1;
   1910     UINT8                         LocatorType;
   1911     ACPI_MPAM_RESOURCE_LOCATOR    Locator;
   1912     UINT32                        NumFunctionalDeps;
   1913 } ACPI_MPAM_RESOURCE_NODE;
   1914 
   1915 /* Memory System Component (MSC) Node Structure. Table 4 */
   1916 typedef struct acpi_mpam_msc_node
   1917 {
   1918     UINT16                     Length;
   1919     UINT8                      InterfaceType;
   1920     UINT8                      Reserved;
   1921     UINT32                     Identifier;
   1922     UINT64                     BaseAddress;
   1923     UINT32                     MMIOSize;
   1924     UINT32                     OverflowInterrupt;
   1925     UINT32                     OverflowInterruptFlags;
   1926     UINT32                     Reserved1;
   1927     UINT32                     OverflowInterruptAffinity;
   1928     UINT32                     ErrorInterrupt;
   1929     UINT32                     ErrorInterruptFlags;
   1930     UINT32                     Reserved2;
   1931     UINT32                     ErrorInterruptAffinity;
   1932     UINT32                     MaxNrdyUsec;
   1933     UINT64                     HardwareIdLinkedDevice;
   1934     UINT32                     InstanceIdLinkedDevice;
   1935     UINT32                     NumResourceNodes;
   1936 } ACPI_MPAM_MSC_NODE;
   1937 
   1938 typedef struct acpi_table_mpam
   1939 {
   1940     ACPI_TABLE_HEADER         Header;          /* Common ACPI table header */
   1941 } ACPI_TABLE_MPAM;
   1942 
   1943 /*******************************************************************************
   1944  *
   1945  * MPST - Memory Power State Table (ACPI 5.0)
   1946  *        Version 1
   1947  *
   1948  ******************************************************************************/
   1949 
   1950 #define ACPI_MPST_CHANNEL_INFO \
   1951     UINT8                   ChannelId; \
   1952     UINT8                   Reserved1[3]; \
   1953     UINT16                  PowerNodeCount; \
   1954     UINT16                  Reserved2;
   1955 
   1956 /* Main table */
   1957 
   1958 typedef struct acpi_table_mpst
   1959 {
   1960     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   1961     ACPI_MPST_CHANNEL_INFO                      /* Platform Communication Channel */
   1962 
   1963 } ACPI_TABLE_MPST;
   1964 
   1965 
   1966 /* Memory Platform Communication Channel Info */
   1967 
   1968 typedef struct acpi_mpst_channel
   1969 {
   1970     ACPI_MPST_CHANNEL_INFO                      /* Platform Communication Channel */
   1971 
   1972 } ACPI_MPST_CHANNEL;
   1973 
   1974 
   1975 /* Memory Power Node Structure */
   1976 
   1977 typedef struct acpi_mpst_power_node
   1978 {
   1979     UINT8                   Flags;
   1980     UINT8                   Reserved1;
   1981     UINT16                  NodeId;
   1982     UINT32                  Length;
   1983     UINT64                  RangeAddress;
   1984     UINT64                  RangeLength;
   1985     UINT32                  NumPowerStates;
   1986     UINT32                  NumPhysicalComponents;
   1987 
   1988 } ACPI_MPST_POWER_NODE;
   1989 
   1990 /* Values for Flags field above */
   1991 
   1992 #define ACPI_MPST_ENABLED               1
   1993 #define ACPI_MPST_POWER_MANAGED         2
   1994 #define ACPI_MPST_HOT_PLUG_CAPABLE      4
   1995 
   1996 
   1997 /* Memory Power State Structure (follows POWER_NODE above) */
   1998 
   1999 typedef struct acpi_mpst_power_state
   2000 {
   2001     UINT8                   PowerState;
   2002     UINT8                   InfoIndex;
   2003 
   2004 } ACPI_MPST_POWER_STATE;
   2005 
   2006 
   2007 /* Physical Component ID Structure (follows POWER_STATE above) */
   2008 
   2009 typedef struct acpi_mpst_component
   2010 {
   2011     UINT16                  ComponentId;
   2012 
   2013 } ACPI_MPST_COMPONENT;
   2014 
   2015 
   2016 /* Memory Power State Characteristics Structure (follows all POWER_NODEs) */
   2017 
   2018 typedef struct acpi_mpst_data_hdr
   2019 {
   2020     UINT16                  CharacteristicsCount;
   2021     UINT16                  Reserved;
   2022 
   2023 } ACPI_MPST_DATA_HDR;
   2024 
   2025 typedef struct acpi_mpst_power_data
   2026 {
   2027     UINT8                   StructureId;
   2028     UINT8                   Flags;
   2029     UINT16                  Reserved1;
   2030     UINT32                  AveragePower;
   2031     UINT32                  PowerSaving;
   2032     UINT64                  ExitLatency;
   2033     UINT64                  Reserved2;
   2034 
   2035 } ACPI_MPST_POWER_DATA;
   2036 
   2037 /* Values for Flags field above */
   2038 
   2039 #define ACPI_MPST_PRESERVE              1
   2040 #define ACPI_MPST_AUTOENTRY             2
   2041 #define ACPI_MPST_AUTOEXIT              4
   2042 
   2043 
   2044 /* Shared Memory Region (not part of an ACPI table) */
   2045 
   2046 typedef struct acpi_mpst_shared
   2047 {
   2048     UINT32                  Signature;
   2049     UINT16                  PccCommand;
   2050     UINT16                  PccStatus;
   2051     UINT32                  CommandRegister;
   2052     UINT32                  StatusRegister;
   2053     UINT32                  PowerStateId;
   2054     UINT32                  PowerNodeId;
   2055     UINT64                  EnergyConsumed;
   2056     UINT64                  AveragePower;
   2057 
   2058 } ACPI_MPST_SHARED;
   2059 
   2060 
   2061 /*******************************************************************************
   2062  *
   2063  * MSCT - Maximum System Characteristics Table (ACPI 4.0)
   2064  *        Version 1
   2065  *
   2066  ******************************************************************************/
   2067 
   2068 typedef struct acpi_table_msct
   2069 {
   2070     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   2071     UINT32                  ProximityOffset;    /* Location of proximity info struct(s) */
   2072     UINT32                  MaxProximityDomains;/* Max number of proximity domains */
   2073     UINT32                  MaxClockDomains;    /* Max number of clock domains */
   2074     UINT64                  MaxAddress;         /* Max physical address in system */
   2075 
   2076 } ACPI_TABLE_MSCT;
   2077 
   2078 
   2079 /* Subtable - Maximum Proximity Domain Information. Version 1 */
   2080 
   2081 typedef struct acpi_msct_proximity
   2082 {
   2083     UINT8                   Revision;
   2084     UINT8                   Length;
   2085     UINT32                  RangeStart;         /* Start of domain range */
   2086     UINT32                  RangeEnd;           /* End of domain range */
   2087     UINT32                  ProcessorCapacity;
   2088     UINT64                  MemoryCapacity;     /* In bytes */
   2089 
   2090 } ACPI_MSCT_PROXIMITY;
   2091 
   2092 
   2093 /*******************************************************************************
   2094  *
   2095  * MSDM - Microsoft Data Management table
   2096  *
   2097  * Conforms to "Microsoft Software Licensing Tables (SLIC and MSDM)",
   2098  * November 29, 2011. Copyright 2011 Microsoft
   2099  *
   2100  ******************************************************************************/
   2101 
   2102 /* Basic MSDM table is only the common ACPI header */
   2103 
   2104 typedef struct acpi_table_msdm
   2105 {
   2106     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   2107 
   2108 } ACPI_TABLE_MSDM;
   2109 
   2110 
   2111 /*******************************************************************************
   2112  *
   2113  * NFIT - NVDIMM Interface Table (ACPI 6.0+)
   2114  *        Version 1
   2115  *
   2116  ******************************************************************************/
   2117 
   2118 typedef struct acpi_table_nfit
   2119 {
   2120     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   2121     UINT32                  Reserved;           /* Reserved, must be zero */
   2122 
   2123 } ACPI_TABLE_NFIT;
   2124 
   2125 /* Subtable header for NFIT */
   2126 
   2127 typedef struct acpi_nfit_header
   2128 {
   2129     UINT16                   Type;
   2130     UINT16                   Length;
   2131 
   2132 } ACPI_NFIT_HEADER;
   2133 
   2134 
   2135 /* Values for subtable type in ACPI_NFIT_HEADER */
   2136 
   2137 enum AcpiNfitType
   2138 {
   2139     ACPI_NFIT_TYPE_SYSTEM_ADDRESS       = 0,
   2140     ACPI_NFIT_TYPE_MEMORY_MAP           = 1,
   2141     ACPI_NFIT_TYPE_INTERLEAVE           = 2,
   2142     ACPI_NFIT_TYPE_SMBIOS               = 3,
   2143     ACPI_NFIT_TYPE_CONTROL_REGION       = 4,
   2144     ACPI_NFIT_TYPE_DATA_REGION          = 5,
   2145     ACPI_NFIT_TYPE_FLUSH_ADDRESS        = 6,
   2146     ACPI_NFIT_TYPE_CAPABILITIES         = 7,
   2147     ACPI_NFIT_TYPE_RESERVED             = 8     /* 8 and greater are reserved */
   2148 };
   2149 
   2150 /*
   2151  * NFIT Subtables
   2152  */
   2153 
   2154 /* 0: System Physical Address Range Structure */
   2155 
   2156 typedef struct acpi_nfit_system_address
   2157 {
   2158     ACPI_NFIT_HEADER        Header;
   2159     UINT16                  RangeIndex;
   2160     UINT16                  Flags;
   2161     UINT32                  Reserved;           /* Reserved, must be zero */
   2162     UINT32                  ProximityDomain;
   2163     UINT8                   RangeGuid[16];
   2164     UINT64                  Address;
   2165     UINT64                  Length;
   2166     UINT64                  MemoryMapping;
   2167     UINT64                  LocationCookie;     /* ACPI 6.4 */
   2168 
   2169 } ACPI_NFIT_SYSTEM_ADDRESS;
   2170 
   2171 /* Flags */
   2172 
   2173 #define ACPI_NFIT_ADD_ONLINE_ONLY       (1)     /* 00: Add/Online Operation Only */
   2174 #define ACPI_NFIT_PROXIMITY_VALID       (1<<1)  /* 01: Proximity Domain Valid */
   2175 #define ACPI_NFIT_LOCATION_COOKIE_VALID (1<<2)  /* 02: SPA location cookie valid (ACPI 6.4) */
   2176 
   2177 /* Range Type GUIDs appear in the include/acuuid.h file */
   2178 
   2179 
   2180 /* 1: Memory Device to System Address Range Map Structure */
   2181 
   2182 typedef struct acpi_nfit_memory_map
   2183 {
   2184     ACPI_NFIT_HEADER        Header;
   2185     UINT32                  DeviceHandle;
   2186     UINT16                  PhysicalId;
   2187     UINT16                  RegionId;
   2188     UINT16                  RangeIndex;
   2189     UINT16                  RegionIndex;
   2190     UINT64                  RegionSize;
   2191     UINT64                  RegionOffset;
   2192     UINT64                  Address;
   2193     UINT16                  InterleaveIndex;
   2194     UINT16                  InterleaveWays;
   2195     UINT16                  Flags;
   2196     UINT16                  Reserved;           /* Reserved, must be zero */
   2197 
   2198 } ACPI_NFIT_MEMORY_MAP;
   2199 
   2200 /* Flags */
   2201 
   2202 #define ACPI_NFIT_MEM_SAVE_FAILED       (1)     /* 00: Last SAVE to Memory Device failed */
   2203 #define ACPI_NFIT_MEM_RESTORE_FAILED    (1<<1)  /* 01: Last RESTORE from Memory Device failed */
   2204 #define ACPI_NFIT_MEM_FLUSH_FAILED      (1<<2)  /* 02: Platform flush failed */
   2205 #define ACPI_NFIT_MEM_NOT_ARMED         (1<<3)  /* 03: Memory Device is not armed */
   2206 #define ACPI_NFIT_MEM_HEALTH_OBSERVED   (1<<4)  /* 04: Memory Device observed SMART/health events */
   2207 #define ACPI_NFIT_MEM_HEALTH_ENABLED    (1<<5)  /* 05: SMART/health events enabled */
   2208 #define ACPI_NFIT_MEM_MAP_FAILED        (1<<6)  /* 06: Mapping to SPA failed */
   2209 
   2210 
   2211 /* 2: Interleave Structure */
   2212 
   2213 typedef struct acpi_nfit_interleave
   2214 {
   2215     ACPI_NFIT_HEADER        Header;
   2216     UINT16                  InterleaveIndex;
   2217     UINT16                  Reserved;           /* Reserved, must be zero */
   2218     UINT32                  LineCount;
   2219     UINT32                  LineSize;
   2220     UINT32                  LineOffset[];       /* Variable length */
   2221 
   2222 } ACPI_NFIT_INTERLEAVE;
   2223 
   2224 
   2225 /* 3: SMBIOS Management Information Structure */
   2226 
   2227 typedef struct acpi_nfit_smbios
   2228 {
   2229     ACPI_NFIT_HEADER        Header;
   2230     UINT32                  Reserved;           /* Reserved, must be zero */
   2231     UINT8                   Data[];             /* Variable length */
   2232 
   2233 } ACPI_NFIT_SMBIOS;
   2234 
   2235 
   2236 /* 4: NVDIMM Control Region Structure */
   2237 
   2238 typedef struct acpi_nfit_control_region
   2239 {
   2240     ACPI_NFIT_HEADER        Header;
   2241     UINT16                  RegionIndex;
   2242     UINT16                  VendorId;
   2243     UINT16                  DeviceId;
   2244     UINT16                  RevisionId;
   2245     UINT16                  SubsystemVendorId;
   2246     UINT16                  SubsystemDeviceId;
   2247     UINT16                  SubsystemRevisionId;
   2248     UINT8                   ValidFields;
   2249     UINT8                   ManufacturingLocation;
   2250     UINT16                  ManufacturingDate;
   2251     UINT8                   Reserved[2];        /* Reserved, must be zero */
   2252     UINT32                  SerialNumber;
   2253     UINT16                  Code;
   2254     UINT16                  Windows;
   2255     UINT64                  WindowSize;
   2256     UINT64                  CommandOffset;
   2257     UINT64                  CommandSize;
   2258     UINT64                  StatusOffset;
   2259     UINT64                  StatusSize;
   2260     UINT16                  Flags;
   2261     UINT8                   Reserved1[6];       /* Reserved, must be zero */
   2262 
   2263 } ACPI_NFIT_CONTROL_REGION;
   2264 
   2265 /* Flags */
   2266 
   2267 #define ACPI_NFIT_CONTROL_BUFFERED          (1)     /* Block Data Windows implementation is buffered */
   2268 
   2269 /* ValidFields bits */
   2270 
   2271 #define ACPI_NFIT_CONTROL_MFG_INFO_VALID    (1)     /* Manufacturing fields are valid */
   2272 
   2273 
   2274 /* 5: NVDIMM Block Data Window Region Structure */
   2275 
   2276 typedef struct acpi_nfit_data_region
   2277 {
   2278     ACPI_NFIT_HEADER        Header;
   2279     UINT16                  RegionIndex;
   2280     UINT16                  Windows;
   2281     UINT64                  Offset;
   2282     UINT64                  Size;
   2283     UINT64                  Capacity;
   2284     UINT64                  StartAddress;
   2285 
   2286 } ACPI_NFIT_DATA_REGION;
   2287 
   2288 
   2289 /* 6: Flush Hint Address Structure */
   2290 
   2291 typedef struct acpi_nfit_flush_address
   2292 {
   2293     ACPI_NFIT_HEADER        Header;
   2294     UINT32                  DeviceHandle;
   2295     UINT16                  HintCount;
   2296     UINT8                   Reserved[6];        /* Reserved, must be zero */
   2297     UINT64                  HintAddress[];      /* Variable length */
   2298 
   2299 } ACPI_NFIT_FLUSH_ADDRESS;
   2300 
   2301 
   2302 /* 7: Platform Capabilities Structure */
   2303 
   2304 typedef struct acpi_nfit_capabilities
   2305 {
   2306     ACPI_NFIT_HEADER        Header;
   2307     UINT8                   HighestCapability;
   2308     UINT8                   Reserved[3];       /* Reserved, must be zero */
   2309     UINT32                  Capabilities;
   2310     UINT32                  Reserved2;
   2311 
   2312 } ACPI_NFIT_CAPABILITIES;
   2313 
   2314 /* Capabilities Flags */
   2315 
   2316 #define ACPI_NFIT_CAPABILITY_CACHE_FLUSH       (1)     /* 00: Cache Flush to NVDIMM capable */
   2317 #define ACPI_NFIT_CAPABILITY_MEM_FLUSH         (1<<1)  /* 01: Memory Flush to NVDIMM capable */
   2318 #define ACPI_NFIT_CAPABILITY_MEM_MIRRORING     (1<<2)  /* 02: Memory Mirroring capable */
   2319 
   2320 
   2321 /*
   2322  * NFIT/DVDIMM device handle support - used as the _ADR for each NVDIMM
   2323  */
   2324 typedef struct nfit_device_handle
   2325 {
   2326     UINT32                  Handle;
   2327 
   2328 } NFIT_DEVICE_HANDLE;
   2329 
   2330 /* Device handle construction and extraction macros */
   2331 
   2332 #define ACPI_NFIT_DIMM_NUMBER_MASK              0x0000000F
   2333 #define ACPI_NFIT_CHANNEL_NUMBER_MASK           0x000000F0
   2334 #define ACPI_NFIT_MEMORY_ID_MASK                0x00000F00
   2335 #define ACPI_NFIT_SOCKET_ID_MASK                0x0000F000
   2336 #define ACPI_NFIT_NODE_ID_MASK                  0x0FFF0000
   2337 
   2338 #define ACPI_NFIT_DIMM_NUMBER_OFFSET            0
   2339 #define ACPI_NFIT_CHANNEL_NUMBER_OFFSET         4
   2340 #define ACPI_NFIT_MEMORY_ID_OFFSET              8
   2341 #define ACPI_NFIT_SOCKET_ID_OFFSET              12
   2342 #define ACPI_NFIT_NODE_ID_OFFSET                16
   2343 
   2344 /* Macro to construct a NFIT/NVDIMM device handle */
   2345 
   2346 #define ACPI_NFIT_BUILD_DEVICE_HANDLE(dimm, channel, memory, socket, node) \
   2347     ((dimm)                                         | \
   2348     ((channel) << ACPI_NFIT_CHANNEL_NUMBER_OFFSET)  | \
   2349     ((memory)  << ACPI_NFIT_MEMORY_ID_OFFSET)       | \
   2350     ((socket)  << ACPI_NFIT_SOCKET_ID_OFFSET)       | \
   2351     ((node)    << ACPI_NFIT_NODE_ID_OFFSET))
   2352 
   2353 /* Macros to extract individual fields from a NFIT/NVDIMM device handle */
   2354 
   2355 #define ACPI_NFIT_GET_DIMM_NUMBER(handle) \
   2356     ((handle) & ACPI_NFIT_DIMM_NUMBER_MASK)
   2357 
   2358 #define ACPI_NFIT_GET_CHANNEL_NUMBER(handle) \
   2359     (((handle) & ACPI_NFIT_CHANNEL_NUMBER_MASK) >> ACPI_NFIT_CHANNEL_NUMBER_OFFSET)
   2360 
   2361 #define ACPI_NFIT_GET_MEMORY_ID(handle) \
   2362     (((handle) & ACPI_NFIT_MEMORY_ID_MASK)      >> ACPI_NFIT_MEMORY_ID_OFFSET)
   2363 
   2364 #define ACPI_NFIT_GET_SOCKET_ID(handle) \
   2365     (((handle) & ACPI_NFIT_SOCKET_ID_MASK)      >> ACPI_NFIT_SOCKET_ID_OFFSET)
   2366 
   2367 #define ACPI_NFIT_GET_NODE_ID(handle) \
   2368     (((handle) & ACPI_NFIT_NODE_ID_MASK)        >> ACPI_NFIT_NODE_ID_OFFSET)
   2369 
   2370 
   2371 /*******************************************************************************
   2372  *
   2373  * NHLT - Non HDAudio Link Table
   2374  *        Version 1
   2375  *
   2376  ******************************************************************************/
   2377 
   2378 typedef struct acpi_table_nhlt
   2379 {
   2380     ACPI_TABLE_HEADER              Header;          /* Common ACPI table header */
   2381     UINT8                          EndpointsCount;
   2382     /*
   2383      * ACPI_NHLT_ENDPOINT          Endpoints[];
   2384      * ACPI_NHLT_CONFIG            OEDConfig;
   2385      */
   2386 
   2387 } ACPI_TABLE_NHLT;
   2388 
   2389 typedef struct acpi_nhlt_endpoint
   2390 {
   2391     UINT32                         Length;
   2392     UINT8                          LinkType;
   2393     UINT8                          InstanceId;
   2394     UINT16                         VendorId;
   2395     UINT16                         DeviceId;
   2396     UINT16                         RevisionId;
   2397     UINT32                         SubsystemId;
   2398     UINT8                          DeviceType;
   2399     UINT8                          Direction;
   2400     UINT8                          VirtualBusId;
   2401     /*
   2402      * ACPI_NHLT_CONFIG            DeviceConfig;
   2403      * ACPI_NHLT_FORMATS_CONFIG    FormatsConfig;
   2404      * ACPI_NHLT_DEVICES_INFO      DevicesInfo;
   2405      */
   2406 
   2407 } ACPI_NHLT_ENDPOINT;
   2408 
   2409 /* Values for LinkType field above */
   2410 
   2411 #define ACPI_NHLT_LINKTYPE_HDA               0
   2412 #define ACPI_NHLT_LINKTYPE_DSP               1
   2413 #define ACPI_NHLT_LINKTYPE_PDM               2
   2414 #define ACPI_NHLT_LINKTYPE_SSP               3
   2415 #define ACPI_NHLT_LINKTYPE_SLIMBUS           4
   2416 #define ACPI_NHLT_LINKTYPE_SDW               5
   2417 #define ACPI_NHLT_LINKTYPE_UAOL              6
   2418 
   2419 /* Values for DeviceId field above */
   2420 
   2421 #define ACPI_NHLT_DEVICEID_DMIC              0xAE20
   2422 #define ACPI_NHLT_DEVICEID_BT                0xAE30
   2423 #define ACPI_NHLT_DEVICEID_I2S               0xAE34
   2424 
   2425 /* Values for DeviceType field above */
   2426 
   2427 /* Device types unique to endpoint of LinkType=PDM */
   2428 #define ACPI_NHLT_DEVICETYPE_PDM             0
   2429 #define ACPI_NHLT_DEVICETYPE_PDM_SKL         1
   2430 /* Device types unique to endpoint of LinkType=SSP */
   2431 #define ACPI_NHLT_DEVICETYPE_BT              0
   2432 #define ACPI_NHLT_DEVICETYPE_FM              1
   2433 #define ACPI_NHLT_DEVICETYPE_MODEM           2
   2434 #define ACPI_NHLT_DEVICETYPE_CODEC           4
   2435 
   2436 /* Values for Direction field above */
   2437 
   2438 #define ACPI_NHLT_DIR_RENDER                 0
   2439 #define ACPI_NHLT_DIR_CAPTURE                1
   2440 
   2441 typedef struct acpi_nhlt_config
   2442 {
   2443     UINT32                         CapabilitiesSize;
   2444     UINT8                          Capabilities[1];
   2445 
   2446 } ACPI_NHLT_CONFIG;
   2447 
   2448 typedef struct acpi_nhlt_gendevice_config
   2449 {
   2450     UINT8                          VirtualSlot;
   2451     UINT8                          ConfigType;
   2452 
   2453 } ACPI_NHLT_GENDEVICE_CONFIG;
   2454 
   2455 /* Values for ConfigType field above */
   2456 
   2457 #define ACPI_NHLT_CONFIGTYPE_GENERIC         0
   2458 #define ACPI_NHLT_CONFIGTYPE_MICARRAY        1
   2459 
   2460 typedef struct acpi_nhlt_micdevice_config
   2461 {
   2462     UINT8                          VirtualSlot;
   2463     UINT8                          ConfigType;
   2464     UINT8                          ArrayType;
   2465 
   2466 } ACPI_NHLT_MICDEVICE_CONFIG;
   2467 
   2468 /* Values for ArrayType field above */
   2469 
   2470 #define ACPI_NHLT_ARRAYTYPE_LINEAR2_SMALL    0xA
   2471 #define ACPI_NHLT_ARRAYTYPE_LINEAR2_BIG      0xB
   2472 #define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO1     0xC
   2473 #define ACPI_NHLT_ARRAYTYPE_PLANAR4_LSHAPED  0xD
   2474 #define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO2     0xE
   2475 #define ACPI_NHLT_ARRAYTYPE_VENDOR           0xF
   2476 
   2477 typedef struct acpi_nhlt_vendor_mic_config
   2478 {
   2479     UINT8                          Type;
   2480     UINT8                          Panel;
   2481     UINT16                         SpeakerPositionDistance;   /* mm */
   2482     UINT16                         HorizontalOffset;          /* mm */
   2483     UINT16                         VerticalOffset;            /* mm */
   2484     UINT8                          FrequencyLowBand;          /* 5*Hz */
   2485     UINT8                          FrequencyHighBand;         /* 500*Hz */
   2486     UINT16                         DirectionAngle;            /* -180 - +180 */
   2487     UINT16                         ElevationAngle;            /* -180 - +180 */
   2488     UINT16                         WorkVerticalAngleBegin;    /* -180 - +180 with 2 deg step */
   2489     UINT16                         WorkVerticalAngleEnd;      /* -180 - +180 with 2 deg step */
   2490     UINT16                         WorkHorizontalAngleBegin;  /* -180 - +180 with 2 deg step */
   2491     UINT16                         WorkHorizontalAngleEnd;    /* -180 - +180 with 2 deg step */
   2492 
   2493 } ACPI_NHLT_VENDOR_MIC_CONFIG;
   2494 
   2495 /* Values for Type field above */
   2496 
   2497 #define ACPI_NHLT_MICTYPE_OMNIDIRECTIONAL    0
   2498 #define ACPI_NHLT_MICTYPE_SUBCARDIOID        1
   2499 #define ACPI_NHLT_MICTYPE_CARDIOID           2
   2500 #define ACPI_NHLT_MICTYPE_SUPERCARDIOID      3
   2501 #define ACPI_NHLT_MICTYPE_HYPERCARDIOID      4
   2502 #define ACPI_NHLT_MICTYPE_8SHAPED            5
   2503 #define ACPI_NHLT_MICTYPE_RESERVED           6
   2504 #define ACPI_NHLT_MICTYPE_VENDORDEFINED      7
   2505 
   2506 /* Values for Panel field above */
   2507 
   2508 #define ACPI_NHLT_MICLOCATION_TOP             0
   2509 #define ACPI_NHLT_MICLOCATION_BOTTOM          1
   2510 #define ACPI_NHLT_MICLOCATION_LEFT            2
   2511 #define ACPI_NHLT_MICLOCATION_RIGHT           3
   2512 #define ACPI_NHLT_MICLOCATION_FRONT           4
   2513 #define ACPI_NHLT_MICLOCATION_REAR            5
   2514 
   2515 typedef struct acpi_nhlt_vendor_micdevice_config
   2516 {
   2517     UINT8                          VirtualSlot;
   2518     UINT8                          ConfigType;
   2519     UINT8                          ArrayType;
   2520     UINT8                          MicsCount;
   2521     ACPI_NHLT_VENDOR_MIC_CONFIG    Mics[];
   2522 
   2523 } ACPI_NHLT_VENDOR_MICDEVICE_CONFIG;
   2524 
   2525 typedef union acpi_nhlt_device_config
   2526 {
   2527     UINT8                                VirtualSlot;
   2528     ACPI_NHLT_GENDEVICE_CONFIG           Gen;
   2529     ACPI_NHLT_MICDEVICE_CONFIG           Mic;
   2530     ACPI_NHLT_VENDOR_MICDEVICE_CONFIG    VendorMic;
   2531 
   2532 } ACPI_NHLT_DEVICE_CONFIG;
   2533 
   2534 /* Inherited from Microsoft's WAVEFORMATEXTENSIBLE. */
   2535 typedef struct acpi_nhlt_wave_formatext
   2536 {
   2537     UINT16                         FormatTag;
   2538     UINT16                         ChannelCount;
   2539     UINT32                         SamplesPerSec;
   2540     UINT32                         AvgBytesPerSec;
   2541     UINT16                         BlockAlign;
   2542     UINT16                         BitsPerSample;
   2543     UINT16                         ExtraFormatSize;
   2544     UINT16                         ValidBitsPerSample;
   2545     UINT32                         ChannelMask;
   2546     UINT8                          Subformat[16];
   2547 
   2548 } ACPI_NHLT_WAVE_FORMATEXT;
   2549 
   2550 typedef struct acpi_nhlt_format_config
   2551 {
   2552     ACPI_NHLT_WAVE_FORMATEXT       Format;
   2553     ACPI_NHLT_CONFIG               Config;
   2554 
   2555 } ACPI_NHLT_FORMAT_CONFIG;
   2556 
   2557 typedef struct acpi_nhlt_formats_config
   2558 {
   2559     UINT8                          FormatsCount;
   2560     ACPI_NHLT_FORMAT_CONFIG        Formats[];
   2561 
   2562 } ACPI_NHLT_FORMATS_CONFIG;
   2563 
   2564 typedef struct acpi_nhlt_device_info
   2565 {
   2566     UINT8                          Id[16];
   2567     UINT8                          InstanceId;
   2568     UINT8                          PortId;
   2569 
   2570 } ACPI_NHLT_DEVICE_INFO;
   2571 
   2572 typedef struct acpi_nhlt_devices_info
   2573 {
   2574     UINT8                          DevicesCount;
   2575     ACPI_NHLT_DEVICE_INFO          Devices[];
   2576 
   2577 } ACPI_NHLT_DEVICES_INFO;
   2578 
   2579 
   2580 /*******************************************************************************
   2581  *
   2582  * PCCT - Platform Communications Channel Table (ACPI 5.0)
   2583  *        Version 2 (ACPI 6.2)
   2584  *
   2585  ******************************************************************************/
   2586 
   2587 typedef struct acpi_table_pcct
   2588 {
   2589     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   2590     UINT32                  Flags;
   2591     UINT64                  Reserved;
   2592 
   2593 } ACPI_TABLE_PCCT;
   2594 
   2595 /* Values for Flags field above */
   2596 
   2597 #define ACPI_PCCT_DOORBELL              1
   2598 
   2599 /* Values for subtable type in ACPI_SUBTABLE_HEADER */
   2600 
   2601 enum AcpiPcctType
   2602 {
   2603     ACPI_PCCT_TYPE_GENERIC_SUBSPACE             = 0,
   2604     ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE          = 1,
   2605     ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2    = 2,    /* ACPI 6.1 */
   2606     ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE      = 3,    /* ACPI 6.2 */
   2607     ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE       = 4,    /* ACPI 6.2 */
   2608     ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE         = 5,    /* ACPI 6.4 */
   2609     ACPI_PCCT_TYPE_RESERVED                     = 6     /* 6 and greater are reserved */
   2610 };
   2611 
   2612 /*
   2613  * PCCT Subtables, correspond to Type in ACPI_SUBTABLE_HEADER
   2614  */
   2615 
   2616 /* 0: Generic Communications Subspace */
   2617 
   2618 typedef struct acpi_pcct_subspace
   2619 {
   2620     ACPI_SUBTABLE_HEADER    Header;
   2621     UINT8                   Reserved[6];
   2622     UINT64                  BaseAddress;
   2623     UINT64                  Length;
   2624     ACPI_GENERIC_ADDRESS    DoorbellRegister;
   2625     UINT64                  PreserveMask;
   2626     UINT64                  WriteMask;
   2627     UINT32                  Latency;
   2628     UINT32                  MaxAccessRate;
   2629     UINT16                  MinTurnaroundTime;
   2630 
   2631 } ACPI_PCCT_SUBSPACE;
   2632 
   2633 
   2634 /* 1: HW-reduced Communications Subspace (ACPI 5.1) */
   2635 
   2636 typedef struct acpi_pcct_hw_reduced
   2637 {
   2638     ACPI_SUBTABLE_HEADER    Header;
   2639     UINT32                  PlatformInterrupt;
   2640     UINT8                   Flags;
   2641     UINT8                   Reserved;
   2642     UINT64                  BaseAddress;
   2643     UINT64                  Length;
   2644     ACPI_GENERIC_ADDRESS    DoorbellRegister;
   2645     UINT64                  PreserveMask;
   2646     UINT64                  WriteMask;
   2647     UINT32                  Latency;
   2648     UINT32                  MaxAccessRate;
   2649     UINT16                  MinTurnaroundTime;
   2650 
   2651 } ACPI_PCCT_HW_REDUCED;
   2652 
   2653 
   2654 /* 2: HW-reduced Communications Subspace Type 2 (ACPI 6.1) */
   2655 
   2656 typedef struct acpi_pcct_hw_reduced_type2
   2657 {
   2658     ACPI_SUBTABLE_HEADER    Header;
   2659     UINT32                  PlatformInterrupt;
   2660     UINT8                   Flags;
   2661     UINT8                   Reserved;
   2662     UINT64                  BaseAddress;
   2663     UINT64                  Length;
   2664     ACPI_GENERIC_ADDRESS    DoorbellRegister;
   2665     UINT64                  PreserveMask;
   2666     UINT64                  WriteMask;
   2667     UINT32                  Latency;
   2668     UINT32                  MaxAccessRate;
   2669     UINT16                  MinTurnaroundTime;
   2670     ACPI_GENERIC_ADDRESS    PlatformAckRegister;
   2671     UINT64                  AckPreserveMask;
   2672     UINT64                  AckWriteMask;
   2673 
   2674 } ACPI_PCCT_HW_REDUCED_TYPE2;
   2675 
   2676 
   2677 /* 3: Extended PCC Master Subspace Type 3 (ACPI 6.2) */
   2678 
   2679 typedef struct acpi_pcct_ext_pcc_master
   2680 {
   2681     ACPI_SUBTABLE_HEADER    Header;
   2682     UINT32                  PlatformInterrupt;
   2683     UINT8                   Flags;
   2684     UINT8                   Reserved1;
   2685     UINT64                  BaseAddress;
   2686     UINT32                  Length;
   2687     ACPI_GENERIC_ADDRESS    DoorbellRegister;
   2688     UINT64                  PreserveMask;
   2689     UINT64                  WriteMask;
   2690     UINT32                  Latency;
   2691     UINT32                  MaxAccessRate;
   2692     UINT32                  MinTurnaroundTime;
   2693     ACPI_GENERIC_ADDRESS    PlatformAckRegister;
   2694     UINT64                  AckPreserveMask;
   2695     UINT64                  AckSetMask;
   2696     UINT64                  Reserved2;
   2697     ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
   2698     UINT64                  CmdCompleteMask;
   2699     ACPI_GENERIC_ADDRESS    CmdUpdateRegister;
   2700     UINT64                  CmdUpdatePreserveMask;
   2701     UINT64                  CmdUpdateSetMask;
   2702     ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
   2703     UINT64                  ErrorStatusMask;
   2704 
   2705 } ACPI_PCCT_EXT_PCC_MASTER;
   2706 
   2707 
   2708 /* 4: Extended PCC Slave Subspace Type 4 (ACPI 6.2) */
   2709 
   2710 typedef struct acpi_pcct_ext_pcc_slave
   2711 {
   2712     ACPI_SUBTABLE_HEADER    Header;
   2713     UINT32                  PlatformInterrupt;
   2714     UINT8                   Flags;
   2715     UINT8                   Reserved1;
   2716     UINT64                  BaseAddress;
   2717     UINT32                  Length;
   2718     ACPI_GENERIC_ADDRESS    DoorbellRegister;
   2719     UINT64                  PreserveMask;
   2720     UINT64                  WriteMask;
   2721     UINT32                  Latency;
   2722     UINT32                  MaxAccessRate;
   2723     UINT32                  MinTurnaroundTime;
   2724     ACPI_GENERIC_ADDRESS    PlatformAckRegister;
   2725     UINT64                  AckPreserveMask;
   2726     UINT64                  AckSetMask;
   2727     UINT64                  Reserved2;
   2728     ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
   2729     UINT64                  CmdCompleteMask;
   2730     ACPI_GENERIC_ADDRESS    CmdUpdateRegister;
   2731     UINT64                  CmdUpdatePreserveMask;
   2732     UINT64                  CmdUpdateSetMask;
   2733     ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
   2734     UINT64                  ErrorStatusMask;
   2735 
   2736 } ACPI_PCCT_EXT_PCC_SLAVE;
   2737 
   2738 /* 5: HW Registers based Communications Subspace */
   2739 
   2740 typedef struct acpi_pcct_hw_reg
   2741 {
   2742     ACPI_SUBTABLE_HEADER    Header;
   2743     UINT16                  Version;
   2744     UINT64                  BaseAddress;
   2745     UINT64                  Length;
   2746     ACPI_GENERIC_ADDRESS    DoorbellRegister;
   2747     UINT64                  DoorbellPreserve;
   2748     UINT64                  DoorbellWrite;
   2749     ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
   2750     UINT64                  CmdCompleteMask;
   2751     ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
   2752     UINT64                  ErrorStatusMask;
   2753     UINT32                  NominalLatency;
   2754     UINT32                  MinTurnaroundTime;
   2755 
   2756 } ACPI_PCCT_HW_REG;
   2757 
   2758 
   2759 /* Values for doorbell flags above */
   2760 
   2761 #define ACPI_PCCT_INTERRUPT_POLARITY    (1)
   2762 #define ACPI_PCCT_INTERRUPT_MODE        (1<<1)
   2763 
   2764 
   2765 /*
   2766  * PCC memory structures (not part of the ACPI table)
   2767  */
   2768 
   2769 /* Shared Memory Region */
   2770 
   2771 typedef struct acpi_pcct_shared_memory
   2772 {
   2773     UINT32                  Signature;
   2774     UINT16                  Command;
   2775     UINT16                  Status;
   2776 
   2777 } ACPI_PCCT_SHARED_MEMORY;
   2778 
   2779 
   2780 /* Extended PCC Subspace Shared Memory Region (ACPI 6.2) */
   2781 
   2782 typedef struct acpi_pcct_ext_pcc_shared_memory
   2783 {
   2784     UINT32                  Signature;
   2785     UINT32                  Flags;
   2786     UINT32                  Length;
   2787     UINT32                  Command;
   2788 
   2789 } ACPI_PCCT_EXT_PCC_SHARED_MEMORY;
   2790 
   2791 
   2792 /*******************************************************************************
   2793  *
   2794  * PDTT - Platform Debug Trigger Table (ACPI 6.2)
   2795  *        Version 0
   2796  *
   2797  ******************************************************************************/
   2798 
   2799 typedef struct acpi_table_pdtt
   2800 {
   2801     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   2802     UINT8                   TriggerCount;
   2803     UINT8                   Reserved[3];
   2804     UINT32                  ArrayOffset;
   2805 
   2806 } ACPI_TABLE_PDTT;
   2807 
   2808 
   2809 /*
   2810  * PDTT Communication Channel Identifier Structure.
   2811  * The number of these structures is defined by TriggerCount above,
   2812  * starting at ArrayOffset.
   2813  */
   2814 typedef struct acpi_pdtt_channel
   2815 {
   2816     UINT8                   SubchannelId;
   2817     UINT8                   Flags;
   2818 
   2819 } ACPI_PDTT_CHANNEL;
   2820 
   2821 /* Flags for above */
   2822 
   2823 #define ACPI_PDTT_RUNTIME_TRIGGER           (1)
   2824 #define ACPI_PDTT_WAIT_COMPLETION           (1<<1)
   2825 #define ACPI_PDTT_TRIGGER_ORDER             (1<<2)
   2826 
   2827 
   2828 /*******************************************************************************
   2829  *
   2830  * PHAT - Platform Health Assessment Table (ACPI 6.4)
   2831  *        Version 1
   2832  *
   2833  ******************************************************************************/
   2834 
   2835 typedef struct acpi_table_phat
   2836 {
   2837     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   2838 
   2839 } ACPI_TABLE_PHAT;
   2840 
   2841 /* Common header for PHAT subtables that follow main table */
   2842 
   2843 typedef struct acpi_phat_header
   2844 {
   2845     UINT16                  Type;
   2846     UINT16                  Length;
   2847     UINT8                   Revision;
   2848 
   2849 } ACPI_PHAT_HEADER;
   2850 
   2851 
   2852 /* Values for Type field above */
   2853 
   2854 #define ACPI_PHAT_TYPE_FW_VERSION_DATA  0
   2855 #define ACPI_PHAT_TYPE_FW_HEALTH_DATA   1
   2856 #define ACPI_PHAT_TYPE_RESERVED         2 /* 0x02-0xFFFF are reserved */
   2857 
   2858 /*
   2859  * PHAT subtables, correspond to Type in ACPI_PHAT_HEADER
   2860  */
   2861 
   2862 /* 0: Firmware Version Data Record */
   2863 
   2864 typedef struct acpi_phat_version_data
   2865 {
   2866     ACPI_PHAT_HEADER        Header;
   2867     UINT8                   Reserved[3];
   2868     UINT32                  ElementCount;
   2869 
   2870 } ACPI_PHAT_VERSION_DATA;
   2871 
   2872 typedef struct acpi_phat_version_element
   2873 {
   2874     UINT8                   Guid[16];
   2875     UINT64                  VersionValue;
   2876     UINT32                  ProducerId;
   2877 
   2878 } ACPI_PHAT_VERSION_ELEMENT;
   2879 
   2880 
   2881 /* 1: Firmware Health Data Record */
   2882 
   2883 typedef struct acpi_phat_health_data
   2884 {
   2885     ACPI_PHAT_HEADER        Header;
   2886     UINT8                   Reserved[2];
   2887     UINT8                   Health;
   2888     UINT8                   DeviceGuid[16];
   2889     UINT32                  DeviceSpecificOffset; /* Zero if no Device-specific data */
   2890 
   2891 } ACPI_PHAT_HEALTH_DATA;
   2892 
   2893 /* Values for Health field above */
   2894 
   2895 #define ACPI_PHAT_ERRORS_FOUND          0
   2896 #define ACPI_PHAT_NO_ERRORS             1
   2897 #define ACPI_PHAT_UNKNOWN_ERRORS        2
   2898 #define ACPI_PHAT_ADVISORY              3
   2899 
   2900 
   2901 /*******************************************************************************
   2902  *
   2903  * PMTT - Platform Memory Topology Table (ACPI 5.0)
   2904  *        Version 1
   2905  *
   2906  ******************************************************************************/
   2907 
   2908 typedef struct acpi_table_pmtt
   2909 {
   2910     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   2911     UINT32                  MemoryDeviceCount;
   2912     /*
   2913      * Immediately followed by:
   2914      * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
   2915      */
   2916 
   2917 } ACPI_TABLE_PMTT;
   2918 
   2919 
   2920 /* Common header for PMTT subtables that follow main table */
   2921 
   2922 typedef struct acpi_pmtt_header
   2923 {
   2924     UINT8                   Type;
   2925     UINT8                   Reserved1;
   2926     UINT16                  Length;
   2927     UINT16                  Flags;
   2928     UINT16                  Reserved2;
   2929     UINT32                  MemoryDeviceCount;  /* Zero means no memory device structs follow */
   2930     /*
   2931      * Immediately followed by:
   2932      * UINT8 TypeSpecificData[]
   2933      * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
   2934      */
   2935 
   2936 } ACPI_PMTT_HEADER;
   2937 
   2938 /* Values for Type field above */
   2939 
   2940 #define ACPI_PMTT_TYPE_SOCKET           0
   2941 #define ACPI_PMTT_TYPE_CONTROLLER       1
   2942 #define ACPI_PMTT_TYPE_DIMM             2
   2943 #define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFE are reserved */
   2944 #define ACPI_PMTT_TYPE_VENDOR           0xFF
   2945 
   2946 /* Values for Flags field above */
   2947 
   2948 #define ACPI_PMTT_TOP_LEVEL             0x0001
   2949 #define ACPI_PMTT_PHYSICAL              0x0002
   2950 #define ACPI_PMTT_MEMORY_TYPE           0x000C
   2951 
   2952 
   2953 /*
   2954  * PMTT subtables, correspond to Type in acpi_pmtt_header
   2955  */
   2956 
   2957 
   2958 /* 0: Socket Structure */
   2959 
   2960 typedef struct acpi_pmtt_socket
   2961 {
   2962     ACPI_PMTT_HEADER        Header;
   2963     UINT16                  SocketId;
   2964     UINT16                  Reserved;
   2965 
   2966 } ACPI_PMTT_SOCKET;
   2967     /*
   2968      * Immediately followed by:
   2969      * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
   2970      */
   2971 
   2972 
   2973 /* 1: Memory Controller subtable */
   2974 
   2975 typedef struct acpi_pmtt_controller
   2976 {
   2977     ACPI_PMTT_HEADER        Header;
   2978     UINT16                  ControllerId;
   2979     UINT16                  Reserved;
   2980 
   2981 } ACPI_PMTT_CONTROLLER;
   2982     /*
   2983      * Immediately followed by:
   2984      * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
   2985      */
   2986 
   2987 
   2988 /* 2: Physical Component Identifier (DIMM) */
   2989 
   2990 typedef struct acpi_pmtt_physical_component
   2991 {
   2992     ACPI_PMTT_HEADER        Header;
   2993     UINT32                  BiosHandle;
   2994 
   2995 } ACPI_PMTT_PHYSICAL_COMPONENT;
   2996 
   2997 
   2998 /* 0xFF: Vendor Specific Data */
   2999 
   3000 typedef struct acpi_pmtt_vendor_specific
   3001 {
   3002     ACPI_PMTT_HEADER        Header;
   3003     UINT8                   TypeUuid[16];
   3004     UINT8                   Specific[];
   3005     /*
   3006      * Immediately followed by:
   3007      * UINT8 VendorSpecificData[];
   3008      * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
   3009      */
   3010 
   3011 } ACPI_PMTT_VENDOR_SPECIFIC;
   3012 
   3013 
   3014 /*******************************************************************************
   3015  *
   3016  * PPTT - Processor Properties Topology Table (ACPI 6.2)
   3017  *        Version 1
   3018  *
   3019  ******************************************************************************/
   3020 
   3021 typedef struct acpi_table_pptt
   3022 {
   3023     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3024 
   3025 } ACPI_TABLE_PPTT;
   3026 
   3027 /* Values for Type field above */
   3028 
   3029 enum AcpiPpttType
   3030 {
   3031     ACPI_PPTT_TYPE_PROCESSOR            = 0,
   3032     ACPI_PPTT_TYPE_CACHE                = 1,
   3033     ACPI_PPTT_TYPE_ID                   = 2,
   3034     ACPI_PPTT_TYPE_RESERVED             = 3
   3035 };
   3036 
   3037 
   3038 /* 0: Processor Hierarchy Node Structure */
   3039 
   3040 typedef struct acpi_pptt_processor
   3041 {
   3042     ACPI_SUBTABLE_HEADER    Header;
   3043     UINT16                  Reserved;
   3044     UINT32                  Flags;
   3045     UINT32                  Parent;
   3046     UINT32                  AcpiProcessorId;
   3047     UINT32                  NumberOfPrivResources;
   3048 
   3049 } ACPI_PPTT_PROCESSOR;
   3050 
   3051 /* Flags */
   3052 
   3053 #define ACPI_PPTT_PHYSICAL_PACKAGE          (1)
   3054 #define ACPI_PPTT_ACPI_PROCESSOR_ID_VALID   (1<<1)
   3055 #define ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD  (1<<2)  /* ACPI 6.3 */
   3056 #define ACPI_PPTT_ACPI_LEAF_NODE            (1<<3)  /* ACPI 6.3 */
   3057 #define ACPI_PPTT_ACPI_IDENTICAL            (1<<4)  /* ACPI 6.3 */
   3058 
   3059 
   3060 /* 1: Cache Type Structure */
   3061 
   3062 typedef struct acpi_pptt_cache
   3063 {
   3064     ACPI_SUBTABLE_HEADER    Header;
   3065     UINT16                  Reserved;
   3066     UINT32                  Flags;
   3067     UINT32                  NextLevelOfCache;
   3068     UINT32                  Size;
   3069     UINT32                  NumberOfSets;
   3070     UINT8                   Associativity;
   3071     UINT8                   Attributes;
   3072     UINT16                  LineSize;
   3073 
   3074 } ACPI_PPTT_CACHE;
   3075 
   3076 /* 1: Cache Type Structure for PPTT version 3 */
   3077 
   3078 typedef struct acpi_pptt_cache_v1
   3079 {
   3080     UINT32                  CacheId;
   3081 
   3082 } ACPI_PPTT_CACHE_V1;
   3083 
   3084 
   3085 /* Flags */
   3086 
   3087 #define ACPI_PPTT_SIZE_PROPERTY_VALID       (1)     /* Physical property valid */
   3088 #define ACPI_PPTT_NUMBER_OF_SETS_VALID      (1<<1)  /* Number of sets valid */
   3089 #define ACPI_PPTT_ASSOCIATIVITY_VALID       (1<<2)  /* Associativity valid */
   3090 #define ACPI_PPTT_ALLOCATION_TYPE_VALID     (1<<3)  /* Allocation type valid */
   3091 #define ACPI_PPTT_CACHE_TYPE_VALID          (1<<4)  /* Cache type valid */
   3092 #define ACPI_PPTT_WRITE_POLICY_VALID        (1<<5)  /* Write policy valid */
   3093 #define ACPI_PPTT_LINE_SIZE_VALID           (1<<6)  /* Line size valid */
   3094 #define ACPI_PPTT_CACHE_ID_VALID            (1<<7)  /* Cache ID valid */
   3095 
   3096 /* Masks for Attributes */
   3097 
   3098 #define ACPI_PPTT_MASK_ALLOCATION_TYPE      (0x03)  /* Allocation type */
   3099 #define ACPI_PPTT_MASK_CACHE_TYPE           (0x0C)  /* Cache type */
   3100 #define ACPI_PPTT_MASK_WRITE_POLICY         (0x10)  /* Write policy */
   3101 
   3102 /* Attributes describing cache */
   3103 #define ACPI_PPTT_CACHE_READ_ALLOCATE       (0x0)   /* Cache line is allocated on read */
   3104 #define ACPI_PPTT_CACHE_WRITE_ALLOCATE      (0x01)  /* Cache line is allocated on write */
   3105 #define ACPI_PPTT_CACHE_RW_ALLOCATE         (0x02)  /* Cache line is allocated on read and write */
   3106 #define ACPI_PPTT_CACHE_RW_ALLOCATE_ALT     (0x03)  /* Alternate representation of above */
   3107 
   3108 #define ACPI_PPTT_CACHE_TYPE_DATA           (0x0)   /* Data cache */
   3109 #define ACPI_PPTT_CACHE_TYPE_INSTR          (1<<2)  /* Instruction cache */
   3110 #define ACPI_PPTT_CACHE_TYPE_UNIFIED        (2<<2)  /* Unified I & D cache */
   3111 #define ACPI_PPTT_CACHE_TYPE_UNIFIED_ALT    (3<<2)  /* Alternate representation of above */
   3112 
   3113 #define ACPI_PPTT_CACHE_POLICY_WB           (0x0)   /* Cache is write back */
   3114 #define ACPI_PPTT_CACHE_POLICY_WT           (1<<4)  /* Cache is write through */
   3115 
   3116 /* 2: ID Structure */
   3117 
   3118 typedef struct acpi_pptt_id
   3119 {
   3120     ACPI_SUBTABLE_HEADER    Header;
   3121     UINT16                  Reserved;
   3122     UINT32                  VendorId;
   3123     UINT64                  Level1Id;
   3124     UINT64                  Level2Id;
   3125     UINT16                  MajorRev;
   3126     UINT16                  MinorRev;
   3127     UINT16                  SpinRev;
   3128 
   3129 } ACPI_PPTT_ID;
   3130 
   3131 
   3132 /*******************************************************************************
   3133  *
   3134  * PRMT - Platform Runtime Mechanism Table
   3135  *        Version 1
   3136  *
   3137  ******************************************************************************/
   3138 
   3139 typedef struct acpi_table_prmt
   3140 {
   3141     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3142 
   3143 } ACPI_TABLE_PRMT;
   3144 
   3145 typedef struct acpi_table_prmt_header
   3146 {
   3147     UINT8                   PlatformGuid[16];
   3148     UINT32                  ModuleInfoOffset;
   3149     UINT32                  ModuleInfoCount;
   3150 
   3151 } ACPI_TABLE_PRMT_HEADER;
   3152 
   3153 typedef struct acpi_prmt_module_header
   3154 {
   3155     UINT16                  Revision;
   3156     UINT16                  Length;
   3157 
   3158 } ACPI_PRMT_MODULE_HEADER;
   3159 
   3160 typedef struct acpi_prmt_module_info
   3161 {
   3162     UINT16                  Revision;
   3163     UINT16                  Length;
   3164     UINT8                   ModuleGuid[16];
   3165     UINT16                  MajorRev;
   3166     UINT16                  MinorRev;
   3167     UINT16                  HandlerInfoCount;
   3168     UINT32                  HandlerInfoOffset;
   3169     UINT64                  MmioListPointer;
   3170 
   3171 } ACPI_PRMT_MODULE_INFO;
   3172 
   3173 typedef struct acpi_prmt_handler_info
   3174 {
   3175     UINT16                  Revision;
   3176     UINT16                  Length;
   3177     UINT8                   HandlerGuid[16];
   3178     UINT64                  HandlerAddress;
   3179     UINT64                  StaticDataBufferAddress;
   3180     UINT64                  AcpiParamBufferAddress;
   3181 
   3182 } ACPI_PRMT_HANDLER_INFO;
   3183 
   3184 
   3185 /*******************************************************************************
   3186  *
   3187  * RASF - RAS Feature Table (ACPI 5.0)
   3188  *        Version 1
   3189  *
   3190  ******************************************************************************/
   3191 
   3192 typedef struct acpi_table_rasf
   3193 {
   3194     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3195     UINT8                   ChannelId[12];
   3196 
   3197 } ACPI_TABLE_RASF;
   3198 
   3199 /* RASF Platform Communication Channel Shared Memory Region */
   3200 
   3201 typedef struct acpi_rasf_shared_memory
   3202 {
   3203     UINT32                  Signature;
   3204     UINT16                  Command;
   3205     UINT16                  Status;
   3206     UINT16                  Version;
   3207     UINT8                   Capabilities[16];
   3208     UINT8                   SetCapabilities[16];
   3209     UINT16                  NumParameterBlocks;
   3210     UINT32                  SetCapabilitiesStatus;
   3211 
   3212 } ACPI_RASF_SHARED_MEMORY;
   3213 
   3214 /* RASF Parameter Block Structure Header */
   3215 
   3216 typedef struct acpi_rasf_parameter_block
   3217 {
   3218     UINT16                  Type;
   3219     UINT16                  Version;
   3220     UINT16                  Length;
   3221 
   3222 } ACPI_RASF_PARAMETER_BLOCK;
   3223 
   3224 /* RASF Parameter Block Structure for PATROL_SCRUB */
   3225 
   3226 typedef struct acpi_rasf_patrol_scrub_parameter
   3227 {
   3228     ACPI_RASF_PARAMETER_BLOCK   Header;
   3229     UINT16                      PatrolScrubCommand;
   3230     UINT64                      RequestedAddressRange[2];
   3231     UINT64                      ActualAddressRange[2];
   3232     UINT16                      Flags;
   3233     UINT8                       RequestedSpeed;
   3234 
   3235 } ACPI_RASF_PATROL_SCRUB_PARAMETER;
   3236 
   3237 /* Masks for Flags and Speed fields above */
   3238 
   3239 #define ACPI_RASF_SCRUBBER_RUNNING      1
   3240 #define ACPI_RASF_SPEED                 (7<<1)
   3241 #define ACPI_RASF_SPEED_SLOW            (0<<1)
   3242 #define ACPI_RASF_SPEED_MEDIUM          (4<<1)
   3243 #define ACPI_RASF_SPEED_FAST            (7<<1)
   3244 
   3245 /* Channel Commands */
   3246 
   3247 enum AcpiRasfCommands
   3248 {
   3249     ACPI_RASF_EXECUTE_RASF_COMMAND      = 1
   3250 };
   3251 
   3252 /* Platform RAS Capabilities */
   3253 
   3254 enum AcpiRasfCapabiliities
   3255 {
   3256     ACPI_HW_PATROL_SCRUB_SUPPORTED      = 0,
   3257     ACPI_SW_PATROL_SCRUB_EXPOSED        = 1
   3258 };
   3259 
   3260 /* Patrol Scrub Commands */
   3261 
   3262 enum AcpiRasfPatrolScrubCommands
   3263 {
   3264     ACPI_RASF_GET_PATROL_PARAMETERS     = 1,
   3265     ACPI_RASF_START_PATROL_SCRUBBER     = 2,
   3266     ACPI_RASF_STOP_PATROL_SCRUBBER      = 3
   3267 };
   3268 
   3269 /* Channel Command flags */
   3270 
   3271 #define ACPI_RASF_GENERATE_SCI          (1<<15)
   3272 
   3273 /* Status values */
   3274 
   3275 enum AcpiRasfStatus
   3276 {
   3277     ACPI_RASF_SUCCESS                   = 0,
   3278     ACPI_RASF_NOT_VALID                 = 1,
   3279     ACPI_RASF_NOT_SUPPORTED             = 2,
   3280     ACPI_RASF_BUSY                      = 3,
   3281     ACPI_RASF_FAILED                    = 4,
   3282     ACPI_RASF_ABORTED                   = 5,
   3283     ACPI_RASF_INVALID_DATA              = 6
   3284 };
   3285 
   3286 /* Status flags */
   3287 
   3288 #define ACPI_RASF_COMMAND_COMPLETE      (1)
   3289 #define ACPI_RASF_SCI_DOORBELL          (1<<1)
   3290 #define ACPI_RASF_ERROR                 (1<<2)
   3291 #define ACPI_RASF_STATUS                (0x1F<<3)
   3292 
   3293 
   3294 /*******************************************************************************
   3295  *
   3296  * RAS2 - RAS2 Feature Table (ACPI 6.5)
   3297  *        Version 1
   3298  *
   3299  *
   3300  ******************************************************************************/
   3301 
   3302 typedef struct acpi_table_ras2 {
   3303     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3304     UINT16                  Reserved;
   3305     UINT16                  NumPccDescs;
   3306 
   3307 } ACPI_TABLE_RAS2;
   3308 
   3309 /* RAS2 Platform Communication Channel Descriptor */
   3310 
   3311 typedef struct acpi_ras2_pcc_desc {
   3312     UINT8                   ChannelId;
   3313     UINT16                  Reserved;
   3314     UINT8                   FeatureType;
   3315     UINT32                  Instance;
   3316 
   3317 } ACPI_RAS2_PCC_DESC;
   3318 
   3319 /* RAS2 Platform Communication Channel Shared Memory Region */
   3320 
   3321 typedef struct acpi_ras2_shared_memory {
   3322     UINT32                  Signature;
   3323     UINT16                  Command;
   3324     UINT16                  Status;
   3325     UINT16                  Version;
   3326     UINT8                   Features[16];
   3327     UINT8                   SetCapabilities[16];
   3328     UINT16                  NumParameterBlocks;
   3329     UINT32                  SetCapabilitiesStatus;
   3330 
   3331 } ACPI_RAS2_SHARED_MEMORY;
   3332 
   3333 /* RAS2 Parameter Block Structure for PATROL_SCRUB */
   3334 
   3335 typedef struct acpi_ras2_parameter_block
   3336 {
   3337     UINT16                  Type;
   3338     UINT16                  Version;
   3339     UINT16                  Length;
   3340 
   3341 } ACPI_RAS2_PARAMETER_BLOCK;
   3342 
   3343 /* RAS2 Parameter Block Structure for PATROL_SCRUB */
   3344 
   3345 typedef struct acpi_ras2_patrol_scrub_parameter {
   3346     ACPI_RAS2_PARAMETER_BLOCK   Header;
   3347     UINT16                      PatrolScrubCommand;
   3348     UINT64                      RequestedAddressRange[2];
   3349     UINT64                      ActualAddressRange[2];
   3350     UINT32                      Flags;
   3351     UINT32                      ScrubParamsOut;
   3352     UINT32                      ScrubParamsIn;
   3353 
   3354 } ACPI_RAS2_PATROL_SCRUB_PARAMETER;
   3355 
   3356 /* Masks for Flags field above */
   3357 
   3358 #define ACPI_RAS2_SCRUBBER_RUNNING      1
   3359 
   3360 /* RAS2 Parameter Block Structure for LA2PA_TRANSLATION */
   3361 
   3362 typedef struct acpi_ras2_la2pa_translation_parameter {
   3363     ACPI_RAS2_PARAMETER_BLOCK   Header;
   3364     UINT16                      AddrTranslationCommand;
   3365     UINT64                      SubInstId;
   3366     UINT64                      LogicalAddress;
   3367     UINT64                      PhysicalAddress;
   3368     UINT32                      Status;
   3369 
   3370 } ACPI_RAS2_LA2PA_TRANSLATION_PARAM;
   3371 
   3372 /* Channel Commands */
   3373 
   3374 enum AcpiRas2Commands
   3375 {
   3376     ACPI_RAS2_EXECUTE_RAS2_COMMAND      = 1
   3377 };
   3378 
   3379 /* Platform RAS2 Features */
   3380 
   3381 enum AcpiRas2Features
   3382 {
   3383     ACPI_RAS2_PATROL_SCRUB_SUPPORTED    = 0,
   3384     ACPI_RAS2_LA2PA_TRANSLATION         = 1
   3385 };
   3386 
   3387 /* RAS2 Patrol Scrub Commands */
   3388 
   3389 enum AcpiRas2PatrolScrubCommands
   3390 {
   3391     ACPI_RAS2_GET_PATROL_PARAMETERS     = 1,
   3392     ACPI_RAS2_START_PATROL_SCRUBBER     = 2,
   3393     ACPI_RAS2_STOP_PATROL_SCRUBBER      = 3
   3394 };
   3395 
   3396 /* RAS2 LA2PA Translation Commands */
   3397 
   3398 enum AcpiRas2La2PaTranslationCommands
   3399 {
   3400     ACPI_RAS2_GET_LA2PA_TRANSLATION     = 1,
   3401 };
   3402 
   3403 /* RAS2 LA2PA Translation Status values */
   3404 
   3405 enum AcpiRas2La2PaTranslationStatus
   3406 {
   3407     ACPI_RAS2_LA2PA_TRANSLATION_SUCCESS = 0,
   3408     ACPI_RAS2_LA2PA_TRANSLATION_FAIL    = 1,
   3409 };
   3410 
   3411 /* Channel Command flags */
   3412 
   3413 #define ACPI_RAS2_GENERATE_SCI          (1<<15)
   3414 
   3415 /* Status values */
   3416 
   3417 enum AcpiRas2Status
   3418 {
   3419     ACPI_RAS2_SUCCESS                   = 0,
   3420     ACPI_RAS2_NOT_VALID                 = 1,
   3421     ACPI_RAS2_NOT_SUPPORTED             = 2,
   3422     ACPI_RAS2_BUSY                      = 3,
   3423     ACPI_RAS2_FAILED                    = 4,
   3424     ACPI_RAS2_ABORTED                   = 5,
   3425     ACPI_RAS2_INVALID_DATA              = 6
   3426 };
   3427 
   3428 /* Status flags */
   3429 
   3430 #define ACPI_RAS2_COMMAND_COMPLETE      (1)
   3431 #define ACPI_RAS2_SCI_DOORBELL          (1<<1)
   3432 #define ACPI_RAS2_ERROR                 (1<<2)
   3433 #define ACPI_RAS2_STATUS                (0x1F<<3)
   3434 
   3435 
   3436 /*******************************************************************************
   3437  *
   3438  * RGRT - Regulatory Graphics Resource Table
   3439  *        Version 1
   3440  *
   3441  * Conforms to "ACPI RGRT" available at:
   3442  * https://microsoft.github.io/mu/dyn/mu_plus/MsCorePkg/AcpiRGRT/feature_acpi_rgrt/
   3443  *
   3444  ******************************************************************************/
   3445 
   3446 typedef struct acpi_table_rgrt
   3447 {
   3448     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3449     UINT16                  Version;
   3450     UINT8                   ImageType;
   3451     UINT8                   Reserved;
   3452     UINT8                   Image[];
   3453 
   3454 } ACPI_TABLE_RGRT;
   3455 
   3456 /* ImageType values */
   3457 
   3458 enum AcpiRgrtImageType
   3459 {
   3460     ACPI_RGRT_TYPE_RESERVED0            = 0,
   3461     ACPI_RGRT_IMAGE_TYPE_PNG            = 1,
   3462     ACPI_RGRT_TYPE_RESERVED             = 2     /* 2 and greater are reserved */
   3463 };
   3464 
   3465 
   3466 /*******************************************************************************
   3467  *
   3468  * RHCT - RISC-V Hart Capabilities Table
   3469  *        Version 1
   3470  *
   3471  ******************************************************************************/
   3472 
   3473 typedef struct acpi_table_rhct {
   3474     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3475     UINT32                  Flags;              /* RHCT flags */
   3476     UINT64                  TimeBaseFreq;
   3477     UINT32                  NodeCount;
   3478     UINT32                  NodeOffset;
   3479 } ACPI_TABLE_RHCT;
   3480 
   3481 /* RHCT Flags */
   3482 
   3483 #define ACPI_RHCT_TIMER_CANNOT_WAKEUP_CPU       (1)
   3484 /*
   3485  * RHCT subtables
   3486  */
   3487 typedef struct acpi_rhct_node_header {
   3488     UINT16                  Type;
   3489     UINT16                  Length;
   3490     UINT16                  Revision;
   3491 } ACPI_RHCT_NODE_HEADER;
   3492 
   3493 /* Values for RHCT subtable Type above */
   3494 
   3495 enum acpi_rhct_node_type {
   3496     ACPI_RHCT_NODE_TYPE_ISA_STRING = 0x0000,
   3497     ACPI_RHCT_NODE_TYPE_CMO        = 0x0001,
   3498     ACPI_RHCT_NODE_TYPE_MMU        = 0x0002,
   3499     ACPI_RHCT_NODE_TYPE_RESERVED   = 0x0003,
   3500     ACPI_RHCT_NODE_TYPE_HART_INFO  = 0xFFFF,
   3501 };
   3502 
   3503 /*
   3504  * RHCT node specific subtables
   3505  */
   3506 
   3507 /* ISA string node structure */
   3508 typedef struct acpi_rhct_isa_string {
   3509     UINT16                  IsaLength;
   3510     char                    Isa[];
   3511 } ACPI_RHCT_ISA_STRING;
   3512 
   3513 typedef struct acpi_rhct_cmo_node {
   3514     UINT8                  Reserved;           /* Must be zero */
   3515     UINT8                  CbomSize;           /* CBOM size in powerof 2 */
   3516     UINT8                  CbopSize;           /* CBOP size in powerof 2 */
   3517     UINT8                  CbozSize;           /* CBOZ size in powerof 2 */
   3518 } ACPI_RHCT_CMO_NODE;
   3519 
   3520 typedef struct acpi_rhct_mmu_node {
   3521     UINT8                   Reserved;          /* Must be zero */
   3522     UINT8                   MmuType;           /* Virtual Address Scheme */
   3523 } ACPI_RHCT_MMU_NODE;
   3524 
   3525 enum acpi_rhct_mmu_type {
   3526     ACPI_RHCT_MMU_TYPE_SV39 = 0,
   3527     ACPI_RHCT_MMU_TYPE_SV48 = 1,
   3528     ACPI_RHCT_MMU_TYPE_SV57 = 2
   3529 };
   3530 
   3531 /* Hart Info node structure */
   3532 typedef struct acpi_rhct_hart_info {
   3533     UINT16                  NumOffsets;
   3534     UINT32                  Uid;                /* ACPI processor UID */
   3535 } ACPI_RHCT_HART_INFO;
   3536 
   3537 /*******************************************************************************
   3538  *
   3539  * SBST - Smart Battery Specification Table
   3540  *        Version 1
   3541  *
   3542  ******************************************************************************/
   3543 
   3544 typedef struct acpi_table_sbst
   3545 {
   3546     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3547     UINT32                  WarningLevel;
   3548     UINT32                  LowLevel;
   3549     UINT32                  CriticalLevel;
   3550 
   3551 } ACPI_TABLE_SBST;
   3552 
   3553 
   3554 /*******************************************************************************
   3555  *
   3556  * SDEI - Software Delegated Exception Interface Descriptor Table
   3557  *
   3558  * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A,
   3559  * May 8th, 2017. Copyright 2017 ARM Ltd.
   3560  *
   3561  ******************************************************************************/
   3562 
   3563 typedef struct acpi_table_sdei
   3564 {
   3565     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3566 
   3567 } ACPI_TABLE_SDEI;
   3568 
   3569 
   3570 /*******************************************************************************
   3571  *
   3572  * SDEV - Secure Devices Table (ACPI 6.2)
   3573  *        Version 1
   3574  *
   3575  ******************************************************************************/
   3576 
   3577 typedef struct acpi_table_sdev
   3578 {
   3579     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
   3580 
   3581 } ACPI_TABLE_SDEV;
   3582 
   3583 
   3584 typedef struct acpi_sdev_header
   3585 {
   3586     UINT8                   Type;
   3587     UINT8                   Flags;
   3588     UINT16                  Length;
   3589 
   3590 } ACPI_SDEV_HEADER;
   3591 
   3592 
   3593 /* Values for subtable type above */
   3594 
   3595 enum AcpiSdevType
   3596 {
   3597     ACPI_SDEV_TYPE_NAMESPACE_DEVICE     = 0,
   3598     ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE = 1,
   3599     ACPI_SDEV_TYPE_RESERVED             = 2     /* 2 and greater are reserved */
   3600 };
   3601 
   3602 /* Values for flags above */
   3603 
   3604 #define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS    (1)
   3605 #define ACPI_SDEV_SECURE_COMPONENTS_PRESENT (1<<1)
   3606 
   3607 /*
   3608  * SDEV subtables
   3609  */
   3610 
   3611 /* 0: Namespace Device Based Secure Device Structure */
   3612 
   3613 typedef struct acpi_sdev_namespace
   3614 {
   3615     ACPI_SDEV_HEADER        Header;
   3616     UINT16                  DeviceIdOffset;
   3617     UINT16                  DeviceIdLength;
   3618     UINT16                  VendorDataOffset;
   3619     UINT16                  VendorDataLength;
   3620 
   3621 } ACPI_SDEV_NAMESPACE;
   3622 
   3623 typedef struct acpi_sdev_secure_component
   3624 {
   3625     UINT16                  SecureComponentOffset;
   3626     UINT16                  SecureComponentLength;
   3627 
   3628 } ACPI_SDEV_SECURE_COMPONENT;
   3629 
   3630 
   3631 /*
   3632  * SDEV sub-subtables ("Components") for above
   3633  */
   3634 typedef struct acpi_sdev_component
   3635 {
   3636     ACPI_SDEV_HEADER        Header;
   3637 
   3638 } ACPI_SDEV_COMPONENT;
   3639 
   3640 
   3641 /* Values for sub-subtable type above */
   3642 
   3643 enum AcpiSacType
   3644 {
   3645     ACPI_SDEV_TYPE_ID_COMPONENT     = 0,
   3646     ACPI_SDEV_TYPE_MEM_COMPONENT    = 1
   3647 };
   3648 
   3649 typedef struct acpi_sdev_id_component
   3650 {
   3651     ACPI_SDEV_HEADER        Header;
   3652     UINT16                  HardwareIdOffset;
   3653     UINT16                  HardwareIdLength;
   3654     UINT16                  SubsystemIdOffset;
   3655     UINT16                  SubsystemIdLength;
   3656     UINT16                  HardwareRevision;
   3657     UINT8                   HardwareRevPresent;
   3658     UINT8                   ClassCodePresent;
   3659     UINT8                   PciBaseClass;
   3660     UINT8                   PciSubClass;
   3661     UINT8                   PciProgrammingXface;
   3662 
   3663 } ACPI_SDEV_ID_COMPONENT;
   3664 
   3665 typedef struct acpi_sdev_mem_component
   3666 {
   3667     ACPI_SDEV_HEADER        Header;
   3668     UINT32                  Reserved;
   3669     UINT64                  MemoryBaseAddress;
   3670     UINT64                  MemoryLength;
   3671 
   3672 } ACPI_SDEV_MEM_COMPONENT;
   3673 
   3674 
   3675 /* 1: PCIe Endpoint Device Based Device Structure */
   3676 
   3677 typedef struct acpi_sdev_pcie
   3678 {
   3679     ACPI_SDEV_HEADER        Header;
   3680     UINT16                  Segment;
   3681     UINT16                  StartBus;
   3682     UINT16                  PathOffset;
   3683     UINT16                  PathLength;
   3684     UINT16                  VendorDataOffset;
   3685     UINT16                  VendorDataLength;
   3686 
   3687 } ACPI_SDEV_PCIE;
   3688 
   3689 /* 1a: PCIe Endpoint path entry */
   3690 
   3691 typedef struct acpi_sdev_pcie_path
   3692 {
   3693     UINT8                   Device;
   3694     UINT8                   Function;
   3695 
   3696 } ACPI_SDEV_PCIE_PATH;
   3697 
   3698 
   3699 /*******************************************************************************
   3700  *
   3701  * SVKL - Storage Volume Key Location Table (ACPI 6.4)
   3702  *        From: "Guest-Host-Communication Interface (GHCI) for Intel
   3703  *        Trust Domain Extensions (Intel TDX)".
   3704  *        Version 1
   3705  *
   3706  ******************************************************************************/
   3707 
   3708 typedef struct acpi_table_svkl
   3709 {
   3710     ACPI_TABLE_HEADER       Header; /* Common ACPI table header */
   3711     UINT32                  Count;
   3712 
   3713 } ACPI_TABLE_SVKL;
   3714 
   3715 typedef struct acpi_svkl_key
   3716 {
   3717     UINT16                  Type;
   3718     UINT16                  Format;
   3719     UINT32                  Size;
   3720     UINT64                  Address;
   3721 
   3722 } ACPI_SVKL_KEY;
   3723 
   3724 enum acpi_svkl_type
   3725 {
   3726     ACPI_SVKL_TYPE_MAIN_STORAGE = 0,
   3727     ACPI_SVKL_TYPE_RESERVED     = 1 /* 1 and greater are reserved */
   3728 };
   3729 
   3730 enum acpi_svkl_format
   3731 {
   3732     ACPI_SVKL_FORMAT_RAW_BINARY = 0,
   3733     ACPI_SVKL_FORMAT_RESERVED   = 1 /* 1 and greater are reserved */
   3734 };
   3735 
   3736 
   3737 /*******************************************************************************
   3738  *
   3739  * TDEL - TD-Event Log
   3740  *        From: "Guest-Host-Communication Interface (GHCI) for Intel
   3741  *        Trust Domain Extensions (Intel TDX)".
   3742  *        September 2020
   3743  *
   3744  ******************************************************************************/
   3745 
   3746 typedef struct acpi_table_tdel
   3747 {
   3748     ACPI_TABLE_HEADER       Header; /* Common ACPI table header */
   3749     UINT32                  Reserved;
   3750     UINT64                  LogAreaMinimumLength;
   3751     UINT64                  LogAreaStartAddress;
   3752 
   3753 } ACPI_TABLE_TDEL;
   3754 
   3755 /* Reset to default packing */
   3756 
   3757 #pragma pack()
   3758 
   3759 #endif /* __ACTBL2_H__ */
   3760