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