1 /** @file
2   ACPI 6.4 definitions from the ACPI Specification Revision 6.4 Jan, 2021.
3 
4   Copyright (c) 2017 - 2022, Intel Corporation. All rights reserved.<BR>
5   Copyright (c) 2019 - 2021, ARM Ltd. All rights reserved.<BR>
6 
7   SPDX-License-Identifier: BSD-2-Clause-Patent
8 **/
9 
10 #ifndef ACPI_6_4_H_
11 #define ACPI_6_4_H_
12 
13 #include <IndustryStandard/Acpi63.h>
14 
15 //
16 // Ensure proper structure formats
17 //
18 #pragma pack(1)
19 
20 ///
21 /// ACPI 6.4 Generic Address Space definition
22 ///
23 typedef struct {
24   UINT8     AddressSpaceId;
25   UINT8     RegisterBitWidth;
26   UINT8     RegisterBitOffset;
27   UINT8     AccessSize;
28   UINT64    Address;
29 } EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE;
30 
31 //
32 // Generic Address Space Address IDs
33 //
34 #define EFI_ACPI_6_4_SYSTEM_MEMORY                   0x00
35 #define EFI_ACPI_6_4_SYSTEM_IO                       0x01
36 #define EFI_ACPI_6_4_PCI_CONFIGURATION_SPACE         0x02
37 #define EFI_ACPI_6_4_EMBEDDED_CONTROLLER             0x03
38 #define EFI_ACPI_6_4_SMBUS                           0x04
39 #define EFI_ACPI_6_4_SYSTEM_CMOS                     0x05
40 #define EFI_ACPI_6_4_PCI_BAR_TARGET                  0x06
41 #define EFI_ACPI_6_4_IPMI                            0x07
42 #define EFI_ACPI_6_4_GENERAL_PURPOSE_IO              0x08
43 #define EFI_ACPI_6_4_GENERIC_SERIAL_BUS              0x09
44 #define EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL  0x0A
45 #define EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE       0x7F
46 
47 //
48 // Generic Address Space Access Sizes
49 //
50 #define EFI_ACPI_6_4_UNDEFINED  0
51 #define EFI_ACPI_6_4_BYTE       1
52 #define EFI_ACPI_6_4_WORD       2
53 #define EFI_ACPI_6_4_DWORD      3
54 #define EFI_ACPI_6_4_QWORD      4
55 
56 //
57 // ACPI 6.4 table structures
58 //
59 
60 ///
61 /// Root System Description Pointer Structure
62 ///
63 typedef struct {
64   UINT64    Signature;
65   UINT8     Checksum;
66   UINT8     OemId[6];
67   UINT8     Revision;
68   UINT32    RsdtAddress;
69   UINT32    Length;
70   UINT64    XsdtAddress;
71   UINT8     ExtendedChecksum;
72   UINT8     Reserved[3];
73 } EFI_ACPI_6_4_ROOT_SYSTEM_DESCRIPTION_POINTER;
74 
75 ///
76 /// RSD_PTR Revision (as defined in ACPI 6.4 spec.)
77 ///
78 #define EFI_ACPI_6_4_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION  0x02 ///< ACPISpec (Revision 6.4) says current value is 2
79 
80 ///
81 /// Common table header, this prefaces all ACPI tables, including FACS, but
82 /// excluding the RSD PTR structure
83 ///
84 typedef struct {
85   UINT32    Signature;
86   UINT32    Length;
87 } EFI_ACPI_6_4_COMMON_HEADER;
88 
89 //
90 // Root System Description Table
91 // No definition needed as it is a common description table header, the same with
92 // EFI_ACPI_DESCRIPTION_HEADER, followed by a variable number of UINT32 table pointers.
93 //
94 
95 ///
96 /// RSDT Revision (as defined in ACPI 6.4 spec.)
97 ///
98 #define EFI_ACPI_6_4_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION  0x01
99 
100 //
101 // Extended System Description Table
102 // No definition needed as it is a common description table header, the same with
103 // EFI_ACPI_DESCRIPTION_HEADER, followed by a variable number of UINT64 table pointers.
104 //
105 
106 ///
107 /// XSDT Revision (as defined in ACPI 6.4 spec.)
108 ///
109 #define EFI_ACPI_6_4_EXTENDED_SYSTEM_DESCRIPTION_TABLE_REVISION  0x01
110 
111 ///
112 /// Fixed ACPI Description Table Structure (FADT)
113 ///
114 typedef struct {
115   EFI_ACPI_DESCRIPTION_HEADER               Header;
116   UINT32                                    FirmwareCtrl;
117   UINT32                                    Dsdt;
118   UINT8                                     Reserved0;
119   UINT8                                     PreferredPmProfile;
120   UINT16                                    SciInt;
121   UINT32                                    SmiCmd;
122   UINT8                                     AcpiEnable;
123   UINT8                                     AcpiDisable;
124   UINT8                                     S4BiosReq;
125   UINT8                                     PstateCnt;
126   UINT32                                    Pm1aEvtBlk;
127   UINT32                                    Pm1bEvtBlk;
128   UINT32                                    Pm1aCntBlk;
129   UINT32                                    Pm1bCntBlk;
130   UINT32                                    Pm2CntBlk;
131   UINT32                                    PmTmrBlk;
132   UINT32                                    Gpe0Blk;
133   UINT32                                    Gpe1Blk;
134   UINT8                                     Pm1EvtLen;
135   UINT8                                     Pm1CntLen;
136   UINT8                                     Pm2CntLen;
137   UINT8                                     PmTmrLen;
138   UINT8                                     Gpe0BlkLen;
139   UINT8                                     Gpe1BlkLen;
140   UINT8                                     Gpe1Base;
141   UINT8                                     CstCnt;
142   UINT16                                    PLvl2Lat;
143   UINT16                                    PLvl3Lat;
144   UINT16                                    FlushSize;
145   UINT16                                    FlushStride;
146   UINT8                                     DutyOffset;
147   UINT8                                     DutyWidth;
148   UINT8                                     DayAlrm;
149   UINT8                                     MonAlrm;
150   UINT8                                     Century;
151   UINT16                                    IaPcBootArch;
152   UINT8                                     Reserved1;
153   UINT32                                    Flags;
154   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    ResetReg;
155   UINT8                                     ResetValue;
156   UINT16                                    ArmBootArch;
157   UINT8                                     MinorVersion;
158   UINT64                                    XFirmwareCtrl;
159   UINT64                                    XDsdt;
160   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XPm1aEvtBlk;
161   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XPm1bEvtBlk;
162   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XPm1aCntBlk;
163   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XPm1bCntBlk;
164   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XPm2CntBlk;
165   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XPmTmrBlk;
166   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XGpe0Blk;
167   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    XGpe1Blk;
168   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    SleepControlReg;
169   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    SleepStatusReg;
170   UINT64                                    HypervisorVendorIdentity;
171 } EFI_ACPI_6_4_FIXED_ACPI_DESCRIPTION_TABLE;
172 
173 ///
174 /// FADT Version (as defined in ACPI 6.4 spec.)
175 ///
176 #define EFI_ACPI_6_4_FIXED_ACPI_DESCRIPTION_TABLE_REVISION        0x06
177 #define EFI_ACPI_6_4_FIXED_ACPI_DESCRIPTION_TABLE_MINOR_REVISION  0x04
178 
179 //
180 // Fixed ACPI Description Table Preferred Power Management Profile
181 //
182 #define EFI_ACPI_6_4_PM_PROFILE_UNSPECIFIED         0
183 #define EFI_ACPI_6_4_PM_PROFILE_DESKTOP             1
184 #define EFI_ACPI_6_4_PM_PROFILE_MOBILE              2
185 #define EFI_ACPI_6_4_PM_PROFILE_WORKSTATION         3
186 #define EFI_ACPI_6_4_PM_PROFILE_ENTERPRISE_SERVER   4
187 #define EFI_ACPI_6_4_PM_PROFILE_SOHO_SERVER         5
188 #define EFI_ACPI_6_4_PM_PROFILE_APPLIANCE_PC        6
189 #define EFI_ACPI_6_4_PM_PROFILE_PERFORMANCE_SERVER  7
190 #define EFI_ACPI_6_4_PM_PROFILE_TABLET              8
191 
192 //
193 // Fixed ACPI Description Table Boot Architecture Flags
194 // All other bits are reserved and must be set to 0.
195 //
196 #define EFI_ACPI_6_4_LEGACY_DEVICES        BIT0
197 #define EFI_ACPI_6_4_8042                  BIT1
198 #define EFI_ACPI_6_4_VGA_NOT_PRESENT       BIT2
199 #define EFI_ACPI_6_4_MSI_NOT_SUPPORTED     BIT3
200 #define EFI_ACPI_6_4_PCIE_ASPM_CONTROLS    BIT4
201 #define EFI_ACPI_6_4_CMOS_RTC_NOT_PRESENT  BIT5
202 
203 //
204 // Fixed ACPI Description Table Arm Boot Architecture Flags
205 // All other bits are reserved and must be set to 0.
206 //
207 #define EFI_ACPI_6_4_ARM_PSCI_COMPLIANT  BIT0
208 #define EFI_ACPI_6_4_ARM_PSCI_USE_HVC    BIT1
209 
210 //
211 // Fixed ACPI Description Table Fixed Feature Flags
212 // All other bits are reserved and must be set to 0.
213 //
214 #define EFI_ACPI_6_4_WBINVD                                BIT0
215 #define EFI_ACPI_6_4_WBINVD_FLUSH                          BIT1
216 #define EFI_ACPI_6_4_PROC_C1                               BIT2
217 #define EFI_ACPI_6_4_P_LVL2_UP                             BIT3
218 #define EFI_ACPI_6_4_PWR_BUTTON                            BIT4
219 #define EFI_ACPI_6_4_SLP_BUTTON                            BIT5
220 #define EFI_ACPI_6_4_FIX_RTC                               BIT6
221 #define EFI_ACPI_6_4_RTC_S4                                BIT7
222 #define EFI_ACPI_6_4_TMR_VAL_EXT                           BIT8
223 #define EFI_ACPI_6_4_DCK_CAP                               BIT9
224 #define EFI_ACPI_6_4_RESET_REG_SUP                         BIT10
225 #define EFI_ACPI_6_4_SEALED_CASE                           BIT11
226 #define EFI_ACPI_6_4_HEADLESS                              BIT12
227 #define EFI_ACPI_6_4_CPU_SW_SLP                            BIT13
228 #define EFI_ACPI_6_4_PCI_EXP_WAK                           BIT14
229 #define EFI_ACPI_6_4_USE_PLATFORM_CLOCK                    BIT15
230 #define EFI_ACPI_6_4_S4_RTC_STS_VALID                      BIT16
231 #define EFI_ACPI_6_4_REMOTE_POWER_ON_CAPABLE               BIT17
232 #define EFI_ACPI_6_4_FORCE_APIC_CLUSTER_MODEL              BIT18
233 #define EFI_ACPI_6_4_FORCE_APIC_PHYSICAL_DESTINATION_MODE  BIT19
234 #define EFI_ACPI_6_4_HW_REDUCED_ACPI                       BIT20
235 #define EFI_ACPI_6_4_LOW_POWER_S0_IDLE_CAPABLE             BIT21
236 
237 ///
238 /// Firmware ACPI Control Structure
239 ///
240 typedef struct {
241   UINT32    Signature;
242   UINT32    Length;
243   UINT32    HardwareSignature;
244   UINT32    FirmwareWakingVector;
245   UINT32    GlobalLock;
246   UINT32    Flags;
247   UINT64    XFirmwareWakingVector;
248   UINT8     Version;
249   UINT8     Reserved0[3];
250   UINT32    OspmFlags;
251   UINT8     Reserved1[24];
252 } EFI_ACPI_6_4_FIRMWARE_ACPI_CONTROL_STRUCTURE;
253 
254 ///
255 /// FACS Version (as defined in ACPI 6.4 spec.)
256 ///
257 #define EFI_ACPI_6_4_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION  0x02
258 
259 ///
260 /// Firmware Control Structure Feature Flags
261 /// All other bits are reserved and must be set to 0.
262 ///
263 #define EFI_ACPI_6_4_S4BIOS_F                BIT0
264 #define EFI_ACPI_6_4_64BIT_WAKE_SUPPORTED_F  BIT1
265 
266 ///
267 /// OSPM Enabled Firmware Control Structure Flags
268 /// All other bits are reserved and must be set to 0.
269 ///
270 #define EFI_ACPI_6_4_OSPM_64BIT_WAKE_F  BIT0
271 
272 //
273 // Differentiated System Description Table,
274 // Secondary System Description Table
275 // and Persistent System Description Table,
276 // no definition needed as they are common description table header, the same with
277 // EFI_ACPI_DESCRIPTION_HEADER, followed by a definition block.
278 //
279 #define EFI_ACPI_6_4_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_REVISION  0x02
280 #define EFI_ACPI_6_4_SECONDARY_SYSTEM_DESCRIPTION_TABLE_REVISION       0x02
281 
282 ///
283 /// Multiple APIC Description Table header definition.  The rest of the table
284 /// must be defined in a platform specific manner.
285 ///
286 typedef struct {
287   EFI_ACPI_DESCRIPTION_HEADER    Header;
288   UINT32                         LocalApicAddress;
289   UINT32                         Flags;
290 } EFI_ACPI_6_4_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER;
291 
292 ///
293 /// MADT Revision (as defined in ACPI 6.4 spec.)
294 ///
295 #define EFI_ACPI_6_4_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION  0x05
296 
297 ///
298 /// Multiple APIC Flags
299 /// All other bits are reserved and must be set to 0.
300 ///
301 #define EFI_ACPI_6_4_PCAT_COMPAT  BIT0
302 
303 //
304 // Multiple APIC Description Table APIC structure types
305 // All other values between 0x10 and 0x7F are reserved and
306 // will be ignored by OSPM. 0x80 ~ 0xFF are reserved for OEM.
307 //
308 #define EFI_ACPI_6_4_PROCESSOR_LOCAL_APIC           0x00
309 #define EFI_ACPI_6_4_IO_APIC                        0x01
310 #define EFI_ACPI_6_4_INTERRUPT_SOURCE_OVERRIDE      0x02
311 #define EFI_ACPI_6_4_NON_MASKABLE_INTERRUPT_SOURCE  0x03
312 #define EFI_ACPI_6_4_LOCAL_APIC_NMI                 0x04
313 #define EFI_ACPI_6_4_LOCAL_APIC_ADDRESS_OVERRIDE    0x05
314 #define EFI_ACPI_6_4_IO_SAPIC                       0x06
315 #define EFI_ACPI_6_4_LOCAL_SAPIC                    0x07
316 #define EFI_ACPI_6_4_PLATFORM_INTERRUPT_SOURCES     0x08
317 #define EFI_ACPI_6_4_PROCESSOR_LOCAL_X2APIC         0x09
318 #define EFI_ACPI_6_4_LOCAL_X2APIC_NMI               0x0A
319 #define EFI_ACPI_6_4_GIC                            0x0B
320 #define EFI_ACPI_6_4_GICD                           0x0C
321 #define EFI_ACPI_6_4_GIC_MSI_FRAME                  0x0D
322 #define EFI_ACPI_6_4_GICR                           0x0E
323 #define EFI_ACPI_6_4_GIC_ITS                        0x0F
324 #define EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP          0x10
325 
326 //
327 // APIC Structure Definitions
328 //
329 
330 ///
331 /// Processor Local APIC Structure Definition
332 ///
333 typedef struct {
334   UINT8     Type;
335   UINT8     Length;
336   UINT8     AcpiProcessorUid;
337   UINT8     ApicId;
338   UINT32    Flags;
339 } EFI_ACPI_6_4_PROCESSOR_LOCAL_APIC_STRUCTURE;
340 
341 ///
342 /// Local APIC Flags.  All other bits are reserved and must be 0.
343 ///
344 #define EFI_ACPI_6_4_LOCAL_APIC_ENABLED         BIT0
345 #define EFI_ACPI_6_4_LOCAL_APIC_ONLINE_CAPABLE  BIT1
346 
347 ///
348 /// IO APIC Structure
349 ///
350 typedef struct {
351   UINT8     Type;
352   UINT8     Length;
353   UINT8     IoApicId;
354   UINT8     Reserved;
355   UINT32    IoApicAddress;
356   UINT32    GlobalSystemInterruptBase;
357 } EFI_ACPI_6_4_IO_APIC_STRUCTURE;
358 
359 ///
360 /// Interrupt Source Override Structure
361 ///
362 typedef struct {
363   UINT8     Type;
364   UINT8     Length;
365   UINT8     Bus;
366   UINT8     Source;
367   UINT32    GlobalSystemInterrupt;
368   UINT16    Flags;
369 } EFI_ACPI_6_4_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE;
370 
371 ///
372 /// Platform Interrupt Sources Structure Definition
373 ///
374 typedef struct {
375   UINT8     Type;
376   UINT8     Length;
377   UINT16    Flags;
378   UINT8     InterruptType;
379   UINT8     ProcessorId;
380   UINT8     ProcessorEid;
381   UINT8     IoSapicVector;
382   UINT32    GlobalSystemInterrupt;
383   UINT32    PlatformInterruptSourceFlags;
384   UINT8     CpeiProcessorOverride;
385   UINT8     Reserved[31];
386 } EFI_ACPI_6_4_PLATFORM_INTERRUPT_APIC_STRUCTURE;
387 
388 //
389 // MPS INTI flags.
390 // All other bits are reserved and must be set to 0.
391 //
392 #define EFI_ACPI_6_4_POLARITY      (3 << 0)
393 #define EFI_ACPI_6_4_TRIGGER_MODE  (3 << 2)
394 
395 ///
396 /// Non-Maskable Interrupt Source Structure
397 ///
398 typedef struct {
399   UINT8     Type;
400   UINT8     Length;
401   UINT16    Flags;
402   UINT32    GlobalSystemInterrupt;
403 } EFI_ACPI_6_4_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE;
404 
405 ///
406 /// Local APIC NMI Structure
407 ///
408 typedef struct {
409   UINT8     Type;
410   UINT8     Length;
411   UINT8     AcpiProcessorUid;
412   UINT16    Flags;
413   UINT8     LocalApicLint;
414 } EFI_ACPI_6_4_LOCAL_APIC_NMI_STRUCTURE;
415 
416 ///
417 /// Local APIC Address Override Structure
418 ///
419 typedef struct {
420   UINT8     Type;
421   UINT8     Length;
422   UINT16    Reserved;
423   UINT64    LocalApicAddress;
424 } EFI_ACPI_6_4_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE;
425 
426 ///
427 /// IO SAPIC Structure
428 ///
429 typedef struct {
430   UINT8     Type;
431   UINT8     Length;
432   UINT8     IoApicId;
433   UINT8     Reserved;
434   UINT32    GlobalSystemInterruptBase;
435   UINT64    IoSapicAddress;
436 } EFI_ACPI_6_4_IO_SAPIC_STRUCTURE;
437 
438 ///
439 /// Local SAPIC Structure
440 /// This struct followed by a null-terminated ASCII string - ACPI Processor UID String
441 ///
442 typedef struct {
443   UINT8     Type;
444   UINT8     Length;
445   UINT8     AcpiProcessorId;
446   UINT8     LocalSapicId;
447   UINT8     LocalSapicEid;
448   UINT8     Reserved[3];
449   UINT32    Flags;
450   UINT32    ACPIProcessorUIDValue;
451 } EFI_ACPI_6_4_PROCESSOR_LOCAL_SAPIC_STRUCTURE;
452 
453 ///
454 /// Platform Interrupt Sources Structure
455 ///
456 typedef struct {
457   UINT8     Type;
458   UINT8     Length;
459   UINT16    Flags;
460   UINT8     InterruptType;
461   UINT8     ProcessorId;
462   UINT8     ProcessorEid;
463   UINT8     IoSapicVector;
464   UINT32    GlobalSystemInterrupt;
465   UINT32    PlatformInterruptSourceFlags;
466 } EFI_ACPI_6_4_PLATFORM_INTERRUPT_SOURCES_STRUCTURE;
467 
468 ///
469 /// Platform Interrupt Source Flags.
470 /// All other bits are reserved and must be set to 0.
471 ///
472 #define EFI_ACPI_6_4_CPEI_PROCESSOR_OVERRIDE  BIT0
473 
474 ///
475 /// Processor Local x2APIC Structure Definition
476 ///
477 typedef struct {
478   UINT8     Type;
479   UINT8     Length;
480   UINT8     Reserved[2];
481   UINT32    X2ApicId;
482   UINT32    Flags;
483   UINT32    AcpiProcessorUid;
484 } EFI_ACPI_6_4_PROCESSOR_LOCAL_X2APIC_STRUCTURE;
485 
486 ///
487 /// Local x2APIC NMI Structure
488 ///
489 typedef struct {
490   UINT8     Type;
491   UINT8     Length;
492   UINT16    Flags;
493   UINT32    AcpiProcessorUid;
494   UINT8     LocalX2ApicLint;
495   UINT8     Reserved[3];
496 } EFI_ACPI_6_4_LOCAL_X2APIC_NMI_STRUCTURE;
497 
498 ///
499 /// GIC Structure
500 ///
501 typedef struct {
502   UINT8     Type;
503   UINT8     Length;
504   UINT16    Reserved;
505   UINT32    CPUInterfaceNumber;
506   UINT32    AcpiProcessorUid;
507   UINT32    Flags;
508   UINT32    ParkingProtocolVersion;
509   UINT32    PerformanceInterruptGsiv;
510   UINT64    ParkedAddress;
511   UINT64    PhysicalBaseAddress;
512   UINT64    GICV;
513   UINT64    GICH;
514   UINT32    VGICMaintenanceInterrupt;
515   UINT64    GICRBaseAddress;
516   UINT64    MPIDR;
517   UINT8     ProcessorPowerEfficiencyClass;
518   UINT8     Reserved2;
519   UINT16    SpeOverflowInterrupt;
520 } EFI_ACPI_6_4_GIC_STRUCTURE;
521 
522 ///
523 /// GIC Flags.  All other bits are reserved and must be 0.
524 ///
525 #define EFI_ACPI_6_4_GIC_ENABLED                            BIT0
526 #define EFI_ACPI_6_4_PERFORMANCE_INTERRUPT_MODEL            BIT1
527 #define EFI_ACPI_6_4_VGIC_MAINTENANCE_INTERRUPT_MODE_FLAGS  BIT2
528 
529 ///
530 /// GIC Distributor Structure
531 ///
532 typedef struct {
533   UINT8     Type;
534   UINT8     Length;
535   UINT16    Reserved1;
536   UINT32    GicId;
537   UINT64    PhysicalBaseAddress;
538   UINT32    SystemVectorBase;
539   UINT8     GicVersion;
540   UINT8     Reserved2[3];
541 } EFI_ACPI_6_4_GIC_DISTRIBUTOR_STRUCTURE;
542 
543 ///
544 /// GIC Version
545 ///
546 #define EFI_ACPI_6_4_GIC_V1  0x01
547 #define EFI_ACPI_6_4_GIC_V2  0x02
548 #define EFI_ACPI_6_4_GIC_V3  0x03
549 #define EFI_ACPI_6_4_GIC_V4  0x04
550 
551 ///
552 /// GIC MSI Frame Structure
553 ///
554 typedef struct {
555   UINT8     Type;
556   UINT8     Length;
557   UINT16    Reserved1;
558   UINT32    GicMsiFrameId;
559   UINT64    PhysicalBaseAddress;
560   UINT32    Flags;
561   UINT16    SPICount;
562   UINT16    SPIBase;
563 } EFI_ACPI_6_4_GIC_MSI_FRAME_STRUCTURE;
564 
565 ///
566 /// GIC MSI Frame Flags.  All other bits are reserved and must be 0.
567 ///
568 #define EFI_ACPI_6_4_SPI_COUNT_BASE_SELECT  BIT0
569 
570 ///
571 /// GICR Structure
572 ///
573 typedef struct {
574   UINT8     Type;
575   UINT8     Length;
576   UINT16    Reserved;
577   UINT64    DiscoveryRangeBaseAddress;
578   UINT32    DiscoveryRangeLength;
579 } EFI_ACPI_6_4_GICR_STRUCTURE;
580 
581 ///
582 /// GIC Interrupt Translation Service Structure
583 ///
584 typedef struct {
585   UINT8     Type;
586   UINT8     Length;
587   UINT16    Reserved;
588   UINT32    GicItsId;
589   UINT64    PhysicalBaseAddress;
590   UINT32    Reserved2;
591 } EFI_ACPI_6_4_GIC_ITS_STRUCTURE;
592 
593 ///
594 /// Multiprocessor Wakeup Structure
595 ///
596 typedef struct {
597   UINT8     Type;
598   UINT8     Length;
599   UINT16    MailBoxVersion;
600   UINT32    Reserved;
601   UINT64    MailBoxAddress;
602 } EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_STRUCTURE;
603 
604 ///
605 /// Multiprocessor Wakeup Mailbox Structure
606 ///
607 typedef struct {
608   UINT16    Command;
609   UINT16    Reserved;
610   UINT32    AcpiId;
611   UINT64    WakeupVector;
612   UINT8     ReservedForOs[2032];
613   UINT8     ReservedForFirmware[2048];
614 } EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_MAILBOX_STRUCTURE;
615 
616 #define EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_NOOP    0x0000
617 #define EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_WAKEUP  0x0001
618 
619 ///
620 /// Smart Battery Description Table (SBST)
621 ///
622 typedef struct {
623   EFI_ACPI_DESCRIPTION_HEADER    Header;
624   UINT32                         WarningEnergyLevel;
625   UINT32                         LowEnergyLevel;
626   UINT32                         CriticalEnergyLevel;
627 } EFI_ACPI_6_4_SMART_BATTERY_DESCRIPTION_TABLE;
628 
629 ///
630 /// SBST Version (as defined in ACPI 6.4 spec.)
631 ///
632 #define EFI_ACPI_6_4_SMART_BATTERY_DESCRIPTION_TABLE_REVISION  0x01
633 
634 ///
635 /// Embedded Controller Boot Resources Table (ECDT)
636 /// The table is followed by a null terminated ASCII string that contains
637 /// a fully qualified reference to the name space object.
638 ///
639 typedef struct {
640   EFI_ACPI_DESCRIPTION_HEADER               Header;
641   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    EcControl;
642   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    EcData;
643   UINT32                                    Uid;
644   UINT8                                     GpeBit;
645 } EFI_ACPI_6_4_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE;
646 
647 ///
648 /// ECDT Version (as defined in ACPI 6.4 spec.)
649 ///
650 #define EFI_ACPI_6_4_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE_REVISION  0x01
651 
652 ///
653 /// System Resource Affinity Table (SRAT).  The rest of the table
654 /// must be defined in a platform specific manner.
655 ///
656 typedef struct {
657   EFI_ACPI_DESCRIPTION_HEADER    Header;
658   UINT32                         Reserved1; ///< Must be set to 1
659   UINT64                         Reserved2;
660 } EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER;
661 
662 ///
663 /// SRAT Version (as defined in ACPI 6.4 spec.)
664 ///
665 #define EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_REVISION  0x03
666 
667 //
668 // SRAT structure types.
669 // All other values between 0x06 an 0xFF are reserved and
670 // will be ignored by OSPM.
671 //
672 #define EFI_ACPI_6_4_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY  0x00
673 #define EFI_ACPI_6_4_MEMORY_AFFINITY                      0x01
674 #define EFI_ACPI_6_4_PROCESSOR_LOCAL_X2APIC_AFFINITY      0x02
675 #define EFI_ACPI_6_4_GICC_AFFINITY                        0x03
676 #define EFI_ACPI_6_4_GIC_ITS_AFFINITY                     0x04
677 #define EFI_ACPI_6_4_GENERIC_INITIATOR_AFFINITY           0x05
678 
679 ///
680 /// Processor Local APIC/SAPIC Affinity Structure Definition
681 ///
682 typedef struct {
683   UINT8     Type;
684   UINT8     Length;
685   UINT8     ProximityDomain7To0;
686   UINT8     ApicId;
687   UINT32    Flags;
688   UINT8     LocalSapicEid;
689   UINT8     ProximityDomain31To8[3];
690   UINT32    ClockDomain;
691 } EFI_ACPI_6_4_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY_STRUCTURE;
692 
693 ///
694 /// Local APIC/SAPIC Flags.  All other bits are reserved and must be 0.
695 ///
696 #define EFI_ACPI_6_4_PROCESSOR_LOCAL_APIC_SAPIC_ENABLED  (1 << 0)
697 
698 ///
699 /// Memory Affinity Structure Definition
700 ///
701 typedef struct {
702   UINT8     Type;
703   UINT8     Length;
704   UINT32    ProximityDomain;
705   UINT16    Reserved1;
706   UINT32    AddressBaseLow;
707   UINT32    AddressBaseHigh;
708   UINT32    LengthLow;
709   UINT32    LengthHigh;
710   UINT32    Reserved2;
711   UINT32    Flags;
712   UINT64    Reserved3;
713 } EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE;
714 
715 //
716 // Memory Flags.  All other bits are reserved and must be 0.
717 //
718 #define EFI_ACPI_6_4_MEMORY_ENABLED        (1 << 0)
719 #define EFI_ACPI_6_4_MEMORY_HOT_PLUGGABLE  (1 << 1)
720 #define EFI_ACPI_6_4_MEMORY_NONVOLATILE    (1 << 2)
721 
722 ///
723 /// Processor Local x2APIC Affinity Structure Definition
724 ///
725 typedef struct {
726   UINT8     Type;
727   UINT8     Length;
728   UINT8     Reserved1[2];
729   UINT32    ProximityDomain;
730   UINT32    X2ApicId;
731   UINT32    Flags;
732   UINT32    ClockDomain;
733   UINT8     Reserved2[4];
734 } EFI_ACPI_6_4_PROCESSOR_LOCAL_X2APIC_AFFINITY_STRUCTURE;
735 
736 ///
737 /// GICC Affinity Structure Definition
738 ///
739 typedef struct {
740   UINT8     Type;
741   UINT8     Length;
742   UINT32    ProximityDomain;
743   UINT32    AcpiProcessorUid;
744   UINT32    Flags;
745   UINT32    ClockDomain;
746 } EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE;
747 
748 ///
749 /// GICC Flags.  All other bits are reserved and must be 0.
750 ///
751 #define EFI_ACPI_6_4_GICC_ENABLED  (1 << 0)
752 
753 ///
754 /// GIC Interrupt Translation Service (ITS) Affinity Structure Definition
755 ///
756 typedef struct {
757   UINT8     Type;
758   UINT8     Length;
759   UINT32    ProximityDomain;
760   UINT8     Reserved[2];
761   UINT32    ItsId;
762 } EFI_ACPI_6_4_GIC_ITS_AFFINITY_STRUCTURE;
763 
764 //
765 // Generic Initiator Affinity Structure Device Handle Types
766 // All other values between 0x02 an 0xFF are reserved and
767 // will be ignored by OSPM.
768 //
769 #define EFI_ACPI_6_4_ACPI_DEVICE_HANDLE  0x00
770 #define EFI_ACPI_6_4_PCI_DEVICE_HANDLE   0x01
771 
772 ///
773 /// Device Handle - ACPI
774 ///
775 typedef struct {
776   UINT64    AcpiHid;
777   UINT32    AcpiUid;
778   UINT8     Reserved[4];
779 } EFI_ACPI_6_4_DEVICE_HANDLE_ACPI;
780 
781 ///
782 /// Device Handle - PCI
783 ///
784 typedef struct {
785   UINT16    PciSegment;
786   UINT16    PciBdfNumber;
787   UINT8     Reserved[12];
788 } EFI_ACPI_6_4_DEVICE_HANDLE_PCI;
789 
790 ///
791 /// Device Handle
792 ///
793 typedef union {
794   EFI_ACPI_6_4_DEVICE_HANDLE_ACPI    Acpi;
795   EFI_ACPI_6_4_DEVICE_HANDLE_PCI     Pci;
796 } EFI_ACPI_6_4_DEVICE_HANDLE;
797 
798 ///
799 /// Generic Initiator Affinity Structure
800 ///
801 typedef struct {
802   UINT8                         Type;
803   UINT8                         Length;
804   UINT8                         Reserved1;
805   UINT8                         DeviceHandleType;
806   UINT32                        ProximityDomain;
807   EFI_ACPI_6_4_DEVICE_HANDLE    DeviceHandle;
808   UINT32                        Flags;
809   UINT8                         Reserved2[4];
810 } EFI_ACPI_6_4_GENERIC_INITIATOR_AFFINITY_STRUCTURE;
811 
812 ///
813 /// Generic Initiator Affinity Structure Flags. All other bits are reserved
814 /// and must be 0.
815 ///
816 #define EFI_ACPI_6_4_GENERIC_INITIATOR_AFFINITY_STRUCTURE_ENABLED                     BIT0
817 #define EFI_ACPI_6_4_GENERIC_INITIATOR_AFFINITY_STRUCTURE_ARCHITECTURAL_TRANSACTIONS  BIT1
818 
819 ///
820 /// System Locality Distance Information Table (SLIT).
821 /// The rest of the table is a matrix.
822 ///
823 typedef struct {
824   EFI_ACPI_DESCRIPTION_HEADER    Header;
825   UINT64                         NumberOfSystemLocalities;
826 } EFI_ACPI_6_4_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_HEADER;
827 
828 ///
829 /// SLIT Version (as defined in ACPI 6.4 spec.)
830 ///
831 #define EFI_ACPI_6_4_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_REVISION  0x01
832 
833 ///
834 /// Corrected Platform Error Polling Table (CPEP)
835 ///
836 typedef struct {
837   EFI_ACPI_DESCRIPTION_HEADER    Header;
838   UINT8                          Reserved[8];
839 } EFI_ACPI_6_4_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER;
840 
841 ///
842 /// CPEP Version (as defined in ACPI 6.4 spec.)
843 ///
844 #define EFI_ACPI_6_4_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_REVISION  0x01
845 
846 //
847 // CPEP processor structure types.
848 //
849 #define EFI_ACPI_6_4_CPEP_PROCESSOR_APIC_SAPIC  0x00
850 
851 ///
852 /// Corrected Platform Error Polling Processor Structure Definition
853 ///
854 typedef struct {
855   UINT8     Type;
856   UINT8     Length;
857   UINT8     ProcessorId;
858   UINT8     ProcessorEid;
859   UINT32    PollingInterval;
860 } EFI_ACPI_6_4_CPEP_PROCESSOR_APIC_SAPIC_STRUCTURE;
861 
862 ///
863 /// Maximum System Characteristics Table (MSCT)
864 ///
865 typedef struct {
866   EFI_ACPI_DESCRIPTION_HEADER    Header;
867   UINT32                         OffsetProxDomInfo;
868   UINT32                         MaximumNumberOfProximityDomains;
869   UINT32                         MaximumNumberOfClockDomains;
870   UINT64                         MaximumPhysicalAddress;
871 } EFI_ACPI_6_4_MAXIMUM_SYSTEM_CHARACTERISTICS_TABLE_HEADER;
872 
873 ///
874 /// MSCT Version (as defined in ACPI 6.4 spec.)
875 ///
876 #define EFI_ACPI_6_4_MAXIMUM_SYSTEM_CHARACTERISTICS_TABLE_REVISION  0x01
877 
878 ///
879 /// Maximum Proximity Domain Information Structure Definition
880 ///
881 typedef struct {
882   UINT8     Revision;
883   UINT8     Length;
884   UINT32    ProximityDomainRangeLow;
885   UINT32    ProximityDomainRangeHigh;
886   UINT32    MaximumProcessorCapacity;
887   UINT64    MaximumMemoryCapacity;
888 } EFI_ACPI_6_4_MAXIMUM_PROXIMITY_DOMAIN_INFORMATION_STRUCTURE;
889 
890 ///
891 /// ACPI RAS Feature Table definition.
892 ///
893 typedef struct {
894   EFI_ACPI_DESCRIPTION_HEADER    Header;
895   UINT8                          PlatformCommunicationChannelIdentifier[12];
896 } EFI_ACPI_6_4_RAS_FEATURE_TABLE;
897 
898 ///
899 /// RASF Version (as defined in ACPI 6.4 spec.)
900 ///
901 #define EFI_ACPI_6_4_RAS_FEATURE_TABLE_REVISION  0x01
902 
903 ///
904 /// ACPI RASF Platform Communication Channel Shared Memory Region definition.
905 ///
906 typedef struct {
907   UINT32    Signature;
908   UINT16    Command;
909   UINT16    Status;
910   UINT16    Version;
911   UINT8     RASCapabilities[16];
912   UINT8     SetRASCapabilities[16];
913   UINT16    NumberOfRASFParameterBlocks;
914   UINT32    SetRASCapabilitiesStatus;
915 } EFI_ACPI_6_4_RASF_PLATFORM_COMMUNICATION_CHANNEL_SHARED_MEMORY_REGION;
916 
917 ///
918 /// ACPI RASF PCC command code
919 ///
920 #define EFI_ACPI_6_4_RASF_PCC_COMMAND_CODE_EXECUTE_RASF_COMMAND  0x01
921 
922 ///
923 /// ACPI RASF Platform RAS Capabilities
924 ///
925 #define EFI_ACPI_6_4_RASF_PLATFORM_RAS_CAPABILITY_HARDWARE_BASED_PATROL_SCRUB_SUPPORTED                          BIT0
926 #define EFI_ACPI_6_4_RASF_PLATFORM_RAS_CAPABILITY_HARDWARE_BASED_PATROL_SCRUB_SUPPORTED_AND_EXPOSED_TO_SOFTWARE  BIT1
927 #define EFI_ACPI_6_4_RASF_PLATFORM_RAS_CAPABILITY_CPU_CACHE_FLUSH_TO_NVDIMM_DURABILITY_ON_POWER_LOSS             BIT2
928 #define EFI_ACPI_6_4_RASF_PLATFORM_RAS_CAPABILITY_MEMORY_CONTROLLER_FLUSH_TO_NVDIMM_DURABILITY_ON_POWER_LOSS     BIT3
929 #define EFI_ACPI_6_4_RASF_PLATFORM_RAS_CAPABILITY_BYTE_ADDRESSABLE_PERSISTENT_MEMORY_HARDWARE_MIRRORING          BIT4
930 
931 ///
932 /// ACPI RASF Parameter Block structure for PATROL_SCRUB
933 ///
934 typedef struct {
935   UINT16    Type;
936   UINT16    Version;
937   UINT16    Length;
938   UINT16    PatrolScrubCommand;
939   UINT64    RequestedAddressRange[2];
940   UINT64    ActualAddressRange[2];
941   UINT16    Flags;
942   UINT8     RequestedSpeed;
943 } EFI_ACPI_6_4_RASF_PATROL_SCRUB_PLATFORM_BLOCK_STRUCTURE;
944 
945 ///
946 /// ACPI RASF Patrol Scrub command
947 ///
948 #define EFI_ACPI_6_4_RASF_PATROL_SCRUB_COMMAND_GET_PATROL_PARAMETERS  0x01
949 #define EFI_ACPI_6_4_RASF_PATROL_SCRUB_COMMAND_START_PATROL_SCRUBBER  0x02
950 #define EFI_ACPI_6_4_RASF_PATROL_SCRUB_COMMAND_STOP_PATROL_SCRUBBER   0x03
951 
952 ///
953 /// Memory Power State Table definition.
954 ///
955 typedef struct {
956   EFI_ACPI_DESCRIPTION_HEADER    Header;
957   UINT8                          PlatformCommunicationChannelIdentifier;
958   UINT8                          Reserved[3];
959   // Memory Power Node Structure
960   // Memory Power State Characteristics
961 } EFI_ACPI_6_4_MEMORY_POWER_STATUS_TABLE;
962 
963 ///
964 /// MPST Version (as defined in ACPI 6.4 spec.)
965 ///
966 #define EFI_ACPI_6_4_MEMORY_POWER_STATE_TABLE_REVISION  0x01
967 
968 ///
969 /// MPST Platform Communication Channel Shared Memory Region definition.
970 ///
971 typedef struct {
972   UINT32    Signature;
973   UINT16    Command;
974   UINT16    Status;
975   UINT32    MemoryPowerCommandRegister;
976   UINT32    MemoryPowerStatusRegister;
977   UINT32    PowerStateId;
978   UINT32    MemoryPowerNodeId;
979   UINT64    MemoryEnergyConsumed;
980   UINT64    ExpectedAveragePowerComsuned;
981 } EFI_ACPI_6_4_MPST_PLATFORM_COMMUNICATION_CHANNEL_SHARED_MEMORY_REGION;
982 
983 ///
984 /// ACPI MPST PCC command code
985 ///
986 #define EFI_ACPI_6_4_MPST_PCC_COMMAND_CODE_EXECUTE_MPST_COMMAND  0x03
987 
988 ///
989 /// ACPI MPST Memory Power command
990 ///
991 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_COMMAND_GET_MEMORY_POWER_STATE      0x01
992 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_COMMAND_SET_MEMORY_POWER_STATE      0x02
993 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_COMMAND_GET_AVERAGE_POWER_CONSUMED  0x03
994 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_COMMAND_GET_MEMORY_ENERGY_CONSUMED  0x04
995 
996 ///
997 /// MPST Memory Power Node Table
998 ///
999 typedef struct {
1000   UINT8    PowerStateValue;
1001   UINT8    PowerStateInformationIndex;
1002 } EFI_ACPI_6_4_MPST_MEMORY_POWER_STATE;
1003 
1004 typedef struct {
1005   UINT8     Flag;
1006   UINT8     Reserved;
1007   UINT16    MemoryPowerNodeId;
1008   UINT32    Length;
1009   UINT64    AddressBase;
1010   UINT64    AddressLength;
1011   UINT32    NumberOfPowerStates;
1012   UINT32    NumberOfPhysicalComponents;
1013   // EFI_ACPI_6_4_MPST_MEMORY_POWER_STATE              MemoryPowerState[NumberOfPowerStates];
1014   // UINT16                                            PhysicalComponentIdentifier[NumberOfPhysicalComponents];
1015 } EFI_ACPI_6_4_MPST_MEMORY_POWER_STRUCTURE;
1016 
1017 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_STRUCTURE_FLAG_ENABLE         0x01
1018 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_STRUCTURE_FLAG_POWER_MANAGED  0x02
1019 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_STRUCTURE_FLAG_HOT_PLUGGABLE  0x04
1020 
1021 typedef struct {
1022   UINT16    MemoryPowerNodeCount;
1023   UINT8     Reserved[2];
1024 } EFI_ACPI_6_4_MPST_MEMORY_POWER_NODE_TABLE;
1025 
1026 ///
1027 /// MPST Memory Power State Characteristics Table
1028 ///
1029 typedef struct {
1030   UINT8     PowerStateStructureID;
1031   UINT8     Flag;
1032   UINT16    Reserved;
1033   UINT32    AveragePowerConsumedInMPS0;
1034   UINT32    RelativePowerSavingToMPS0;
1035   UINT64    ExitLatencyToMPS0;
1036 } EFI_ACPI_6_4_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE;
1037 
1038 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE_FLAG_MEMORY_CONTENT_PRESERVED             0x01
1039 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE_FLAG_AUTONOMOUS_MEMORY_POWER_STATE_ENTRY  0x02
1040 #define EFI_ACPI_6_4_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE_FLAG_AUTONOMOUS_MEMORY_POWER_STATE_EXIT   0x04
1041 
1042 typedef struct {
1043   UINT16    MemoryPowerStateCharacteristicsCount;
1044   UINT8     Reserved[2];
1045 } EFI_ACPI_6_4_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_TABLE;
1046 
1047 ///
1048 /// Platform Memory Topology Table definition.
1049 ///
1050 typedef struct {
1051   EFI_ACPI_DESCRIPTION_HEADER    Header;
1052   UINT32                         NumberOfMemoryDevices;
1053   // EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE  MemoryDeviceStructure[NumberOfMemoryDevices];
1054 } EFI_ACPI_6_4_PLATFORM_MEMORY_TOPOLOGY_TABLE;
1055 
1056 ///
1057 /// PMTT Version (as defined in ACPI 6.4 spec.)
1058 ///
1059 #define EFI_ACPI_6_4_MEMORY_TOPOLOGY_TABLE_REVISION  0x02
1060 
1061 ///
1062 /// Common Memory Device.
1063 ///
1064 typedef struct {
1065   UINT8     Type;
1066   UINT8     Reserved;
1067   UINT16    Length;
1068   UINT16    Flags;
1069   UINT16    Reserved1;
1070   UINT32    NumberOfMemoryDevices;
1071   // UINT8                                   TypeSpecificData[];
1072   // EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE  MemoryDeviceStructure[NumberOfMemoryDevices];
1073 } EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE;
1074 
1075 ///
1076 /// Memory Device Type.
1077 ///
1078 #define EFI_ACPI_6_4_PMTT_MEMORY_DEVICE_TYPE_SOCKET                0x0
1079 #define EFI_ACPI_6_4_PMTT_MEMORY_DEVICE_TYPE_MEMORY_CONTROLLER     0x1
1080 #define EFI_ACPI_6_4_PMTT_MEMORY_DEVICE_TYPE_DIMM                  0x2
1081 #define EFI_ACPI_6_4_PMTT_MEMORY_DEVICE_TYPE_VENDOR_SPECIFIC_TYPE  0xFF
1082 
1083 ///
1084 /// Socket Type Data.
1085 ///
1086 typedef struct {
1087   EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE    CommonMemoryDeviceHeader;
1088   UINT16                                    SocketIdentifier;
1089   UINT16                                    Reserved;
1090   // EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE  MemoryDeviceStructure[];
1091 } EFI_ACPI_6_4_PMTT_SOCKET_TYPE_DATA;
1092 
1093 ///
1094 /// Memory Controller Type Data.
1095 ///
1096 typedef struct {
1097   EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE    CommonMemoryDeviceHeader;
1098   UINT16                                    MemoryControllerIdentifier;
1099   UINT16                                    Reserved;
1100   // EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE  MemoryDeviceStructure[];
1101 } EFI_ACPI_6_4_PMTT_MEMORY_CONTROLLER_TYPE_DATA;
1102 
1103 ///
1104 /// DIMM Type Specific Data.
1105 ///
1106 typedef struct {
1107   EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE    CommonMemoryDeviceHeader;
1108   UINT32                                    SmbiosHandle;
1109 } EFI_ACPI_6_4_PMTT_DIMM_TYPE_SPECIFIC_DATA;
1110 
1111 ///
1112 /// Vendor Specific Type Data.
1113 ///
1114 typedef struct {
1115   EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE    CommonMemoryDeviceHeader;
1116   UINT8                                     TypeUuid[16];
1117   // EFI_ACPI_6_4_PMTT_VENDOR_SPECIFIC_TYPE_DATA   VendorSpecificData[];
1118   // EFI_ACPI_6_4_PMTT_COMMON_MEMORY_DEVICE        MemoryDeviceStructure[];
1119 } EFI_ACPI_6_4_PMTT_VENDOR_SPECIFIC_TYPE_DATA;
1120 
1121 ///
1122 /// Boot Graphics Resource Table definition.
1123 ///
1124 typedef struct {
1125   EFI_ACPI_DESCRIPTION_HEADER    Header;
1126   ///
1127   /// 2-bytes (16 bit) version ID. This value must be 1.
1128   ///
1129   UINT16                         Version;
1130   ///
1131   /// 1-byte status field indicating current status about the table.
1132   ///     Bits[7:3] = Reserved (must be zero)
1133   ///     Bits[2:1] = Orientation Offset. These bits describe the clockwise
1134   ///                 degree offset from the image's default orientation.
1135   ///                 [00] = 0, no offset
1136   ///                 [01] = 90
1137   ///                 [10] = 180
1138   ///                 [11] = 270
1139   ///     Bit [0] = Displayed. A one indicates the boot image graphic is
1140   ///               displayed.
1141   ///
1142   UINT8     Status;
1143   ///
1144   /// 1-byte enumerated type field indicating format of the image.
1145   ///     0 = Bitmap
1146   ///     1 - 255  Reserved (for future use)
1147   ///
1148   UINT8     ImageType;
1149   ///
1150   /// 8-byte (64 bit) physical address pointing to the firmware's in-memory copy
1151   /// of the image bitmap.
1152   ///
1153   UINT64    ImageAddress;
1154   ///
1155   /// A 4-byte (32-bit) unsigned long describing the display X-offset of the boot image.
1156   /// (X, Y) display offset of the top left corner of the boot image.
1157   /// The top left corner of the display is at offset (0, 0).
1158   ///
1159   UINT32    ImageOffsetX;
1160   ///
1161   /// A 4-byte (32-bit) unsigned long describing the display Y-offset of the boot image.
1162   /// (X, Y) display offset of the top left corner of the boot image.
1163   /// The top left corner of the display is at offset (0, 0).
1164   ///
1165   UINT32    ImageOffsetY;
1166 } EFI_ACPI_6_4_BOOT_GRAPHICS_RESOURCE_TABLE;
1167 
1168 ///
1169 /// BGRT Revision
1170 ///
1171 #define EFI_ACPI_6_4_BOOT_GRAPHICS_RESOURCE_TABLE_REVISION  1
1172 
1173 ///
1174 /// BGRT Version
1175 ///
1176 #define EFI_ACPI_6_4_BGRT_VERSION  0x01
1177 
1178 ///
1179 /// BGRT Status
1180 ///
1181 #define EFI_ACPI_6_4_BGRT_STATUS_NOT_DISPLAYED  0x00
1182 #define EFI_ACPI_6_4_BGRT_STATUS_DISPLAYED      0x01
1183 
1184 ///
1185 /// BGRT Image Type
1186 ///
1187 #define EFI_ACPI_6_4_BGRT_IMAGE_TYPE_BMP  0x00
1188 
1189 ///
1190 /// FPDT Version (as defined in ACPI 6.4 spec.)
1191 ///
1192 #define EFI_ACPI_6_4_FIRMWARE_PERFORMANCE_DATA_TABLE_REVISION  0x01
1193 
1194 ///
1195 /// FPDT Performance Record Types
1196 ///
1197 #define EFI_ACPI_6_4_FPDT_RECORD_TYPE_FIRMWARE_BASIC_BOOT_POINTER   0x0000
1198 #define EFI_ACPI_6_4_FPDT_RECORD_TYPE_S3_PERFORMANCE_TABLE_POINTER  0x0001
1199 
1200 ///
1201 /// FPDT Performance Record Revision
1202 ///
1203 #define EFI_ACPI_6_4_FPDT_RECORD_REVISION_FIRMWARE_BASIC_BOOT_POINTER   0x01
1204 #define EFI_ACPI_6_4_FPDT_RECORD_REVISION_S3_PERFORMANCE_TABLE_POINTER  0x01
1205 
1206 ///
1207 /// FPDT Runtime Performance Record Types
1208 ///
1209 #define EFI_ACPI_6_4_FPDT_RUNTIME_RECORD_TYPE_S3_RESUME            0x0000
1210 #define EFI_ACPI_6_4_FPDT_RUNTIME_RECORD_TYPE_S3_SUSPEND           0x0001
1211 #define EFI_ACPI_6_4_FPDT_RUNTIME_RECORD_TYPE_FIRMWARE_BASIC_BOOT  0x0002
1212 
1213 ///
1214 /// FPDT Runtime Performance Record Revision
1215 ///
1216 #define EFI_ACPI_6_4_FPDT_RUNTIME_RECORD_REVISION_S3_RESUME            0x01
1217 #define EFI_ACPI_6_4_FPDT_RUNTIME_RECORD_REVISION_S3_SUSPEND           0x01
1218 #define EFI_ACPI_6_4_FPDT_RUNTIME_RECORD_REVISION_FIRMWARE_BASIC_BOOT  0x02
1219 
1220 ///
1221 /// FPDT Performance Record header
1222 ///
1223 typedef struct {
1224   UINT16    Type;
1225   UINT8     Length;
1226   UINT8     Revision;
1227 } EFI_ACPI_6_4_FPDT_PERFORMANCE_RECORD_HEADER;
1228 
1229 ///
1230 /// FPDT Performance Table header
1231 ///
1232 typedef struct {
1233   UINT32    Signature;
1234   UINT32    Length;
1235 } EFI_ACPI_6_4_FPDT_PERFORMANCE_TABLE_HEADER;
1236 
1237 ///
1238 /// FPDT Firmware Basic Boot Performance Pointer Record Structure
1239 ///
1240 typedef struct {
1241   EFI_ACPI_6_4_FPDT_PERFORMANCE_RECORD_HEADER    Header;
1242   UINT32                                         Reserved;
1243   ///
1244   /// 64-bit processor-relative physical address of the Basic Boot Performance Table.
1245   ///
1246   UINT64                                         BootPerformanceTablePointer;
1247 } EFI_ACPI_6_4_FPDT_BOOT_PERFORMANCE_TABLE_POINTER_RECORD;
1248 
1249 ///
1250 /// FPDT S3 Performance Table Pointer Record Structure
1251 ///
1252 typedef struct {
1253   EFI_ACPI_6_4_FPDT_PERFORMANCE_RECORD_HEADER    Header;
1254   UINT32                                         Reserved;
1255   ///
1256   /// 64-bit processor-relative physical address of the S3 Performance Table.
1257   ///
1258   UINT64                                         S3PerformanceTablePointer;
1259 } EFI_ACPI_6_4_FPDT_S3_PERFORMANCE_TABLE_POINTER_RECORD;
1260 
1261 ///
1262 /// FPDT Firmware Basic Boot Performance Record Structure
1263 ///
1264 typedef struct {
1265   EFI_ACPI_6_4_FPDT_PERFORMANCE_RECORD_HEADER    Header;
1266   UINT32                                         Reserved;
1267   ///
1268   /// Timer value logged at the beginning of firmware image execution.
1269   /// This may not always be zero or near zero.
1270   ///
1271   UINT64                                         ResetEnd;
1272   ///
1273   /// Timer value logged just prior to loading the OS boot loader into memory.
1274   /// For non-UEFI compatible boots, this field must be zero.
1275   ///
1276   UINT64                                         OsLoaderLoadImageStart;
1277   ///
1278   /// Timer value logged just prior to launching the previously loaded OS boot loader image.
1279   /// For non-UEFI compatible boots, the timer value logged will be just prior
1280   /// to the INT 19h handler invocation.
1281   ///
1282   UINT64                                         OsLoaderStartImageStart;
1283   ///
1284   /// Timer value logged at the point when the OS loader calls the
1285   /// ExitBootServices function for UEFI compatible firmware.
1286   /// For non-UEFI compatible boots, this field must be zero.
1287   ///
1288   UINT64                                         ExitBootServicesEntry;
1289   ///
1290   /// Timer value logged at the point just prior towhen the OS loader gaining
1291   /// control back from calls the ExitBootServices function for UEFI compatible firmware.
1292   /// For non-UEFI compatible boots, this field must be zero.
1293   ///
1294   UINT64                                         ExitBootServicesExit;
1295 } EFI_ACPI_6_4_FPDT_FIRMWARE_BASIC_BOOT_RECORD;
1296 
1297 ///
1298 /// FPDT Firmware Basic Boot Performance Table signature
1299 ///
1300 #define EFI_ACPI_6_4_FPDT_BOOT_PERFORMANCE_TABLE_SIGNATURE  SIGNATURE_32('F', 'B', 'P', 'T')
1301 
1302 //
1303 // FPDT Firmware Basic Boot Performance Table
1304 //
1305 typedef struct {
1306   EFI_ACPI_6_4_FPDT_PERFORMANCE_TABLE_HEADER    Header;
1307   //
1308   // one or more Performance Records.
1309   //
1310 } EFI_ACPI_6_4_FPDT_FIRMWARE_BASIC_BOOT_TABLE;
1311 
1312 ///
1313 /// FPDT "S3PT" S3 Performance Table
1314 ///
1315 #define EFI_ACPI_6_4_FPDT_S3_PERFORMANCE_TABLE_SIGNATURE  SIGNATURE_32('S', '3', 'P', 'T')
1316 
1317 //
1318 // FPDT Firmware S3 Boot Performance Table
1319 //
1320 typedef struct {
1321   EFI_ACPI_6_4_FPDT_PERFORMANCE_TABLE_HEADER    Header;
1322   //
1323   // one or more Performance Records.
1324   //
1325 } EFI_ACPI_6_4_FPDT_FIRMWARE_S3_BOOT_TABLE;
1326 
1327 ///
1328 /// FPDT Basic S3 Resume Performance Record
1329 ///
1330 typedef struct {
1331   EFI_ACPI_6_4_FPDT_PERFORMANCE_RECORD_HEADER    Header;
1332   ///
1333   /// A count of the number of S3 resume cycles since the last full boot sequence.
1334   ///
1335   UINT32                                         ResumeCount;
1336   ///
1337   /// Timer recorded at the end of BIOS S3 resume, just prior to handoff to the
1338   /// OS waking vector. Only the most recent resume cycle's time is retained.
1339   ///
1340   UINT64                                         FullResume;
1341   ///
1342   /// Average timer value of all resume cycles logged since the last full boot
1343   /// sequence, including the most recent resume.  Note that the entire log of
1344   /// timer values does not need to be retained in order to calculate this average.
1345   ///
1346   UINT64                                         AverageResume;
1347 } EFI_ACPI_6_4_FPDT_S3_RESUME_RECORD;
1348 
1349 ///
1350 /// FPDT Basic S3 Suspend Performance Record
1351 ///
1352 typedef struct {
1353   EFI_ACPI_6_4_FPDT_PERFORMANCE_RECORD_HEADER    Header;
1354   ///
1355   /// Timer value recorded at the OS write to SLP_TYP upon entry to S3.
1356   /// Only the most recent suspend cycle's timer value is retained.
1357   ///
1358   UINT64                                         SuspendStart;
1359   ///
1360   /// Timer value recorded at the final firmware write to SLP_TYP (or other
1361   /// mechanism) used to trigger hardware entry to S3.
1362   /// Only the most recent suspend cycle's timer value is retained.
1363   ///
1364   UINT64                                         SuspendEnd;
1365 } EFI_ACPI_6_4_FPDT_S3_SUSPEND_RECORD;
1366 
1367 ///
1368 /// Firmware Performance Record Table definition.
1369 ///
1370 typedef struct {
1371   EFI_ACPI_DESCRIPTION_HEADER    Header;
1372 } EFI_ACPI_6_4_FIRMWARE_PERFORMANCE_RECORD_TABLE;
1373 
1374 ///
1375 /// Generic Timer Description Table definition.
1376 ///
1377 typedef struct {
1378   EFI_ACPI_DESCRIPTION_HEADER    Header;
1379   UINT64                         CntControlBasePhysicalAddress;
1380   UINT32                         Reserved;
1381   UINT32                         SecurePL1TimerGSIV;
1382   UINT32                         SecurePL1TimerFlags;
1383   UINT32                         NonSecurePL1TimerGSIV;
1384   UINT32                         NonSecurePL1TimerFlags;
1385   UINT32                         VirtualTimerGSIV;
1386   UINT32                         VirtualTimerFlags;
1387   UINT32                         NonSecurePL2TimerGSIV;
1388   UINT32                         NonSecurePL2TimerFlags;
1389   UINT64                         CntReadBasePhysicalAddress;
1390   UINT32                         PlatformTimerCount;
1391   UINT32                         PlatformTimerOffset;
1392   UINT32                         VirtualPL2TimerGSIV;
1393   UINT32                         VirtualPL2TimerFlags;
1394 } EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE;
1395 
1396 ///
1397 /// GTDT Version (as defined in ACPI 6.4 spec.)
1398 ///
1399 #define EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION  0x03
1400 
1401 ///
1402 /// Timer Flags.  All other bits are reserved and must be 0.
1403 ///
1404 #define EFI_ACPI_6_4_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE      BIT0
1405 #define EFI_ACPI_6_4_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY  BIT1
1406 #define EFI_ACPI_6_4_GTDT_TIMER_FLAG_ALWAYS_ON_CAPABILITY      BIT2
1407 
1408 ///
1409 /// Platform Timer Type
1410 ///
1411 #define EFI_ACPI_6_4_GTDT_GT_BLOCK              0
1412 #define EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG  1
1413 
1414 ///
1415 /// GT Block Structure
1416 ///
1417 typedef struct {
1418   UINT8     Type;
1419   UINT16    Length;
1420   UINT8     Reserved;
1421   UINT64    CntCtlBase;
1422   UINT32    GTBlockTimerCount;
1423   UINT32    GTBlockTimerOffset;
1424 } EFI_ACPI_6_4_GTDT_GT_BLOCK_STRUCTURE;
1425 
1426 ///
1427 /// GT Block Timer Structure
1428 ///
1429 typedef struct {
1430   UINT8     GTFrameNumber;
1431   UINT8     Reserved[3];
1432   UINT64    CntBaseX;
1433   UINT64    CntEL0BaseX;
1434   UINT32    GTxPhysicalTimerGSIV;
1435   UINT32    GTxPhysicalTimerFlags;
1436   UINT32    GTxVirtualTimerGSIV;
1437   UINT32    GTxVirtualTimerFlags;
1438   UINT32    GTxCommonFlags;
1439 } EFI_ACPI_6_4_GTDT_GT_BLOCK_TIMER_STRUCTURE;
1440 
1441 ///
1442 /// GT Block Physical Timers and Virtual Timers Flags.  All other bits are reserved and must be 0.
1443 ///
1444 #define EFI_ACPI_6_4_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_MODE      BIT0
1445 #define EFI_ACPI_6_4_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_POLARITY  BIT1
1446 
1447 ///
1448 /// Common Flags Flags.  All other bits are reserved and must be 0.
1449 ///
1450 #define EFI_ACPI_6_4_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER          BIT0
1451 #define EFI_ACPI_6_4_GTDT_GT_BLOCK_COMMON_FLAG_ALWAYS_ON_CAPABILITY  BIT1
1452 
1453 ///
1454 /// Arm Generic Watchdog Structure
1455 ///
1456 typedef struct {
1457   UINT8     Type;
1458   UINT16    Length;
1459   UINT8     Reserved;
1460   UINT64    RefreshFramePhysicalAddress;
1461   UINT64    WatchdogControlFramePhysicalAddress;
1462   UINT32    WatchdogTimerGSIV;
1463   UINT32    WatchdogTimerFlags;
1464 } EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG_STRUCTURE;
1465 
1466 ///
1467 /// Arm Generic Watchdog Timer Flags.  All other bits are reserved and must be 0.
1468 ///
1469 #define EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_MODE      BIT0
1470 #define EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_POLARITY  BIT1
1471 #define EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG_FLAG_SECURE_TIMER              BIT2
1472 
1473 //
1474 // NVDIMM Firmware Interface Table definition.
1475 //
1476 typedef struct {
1477   EFI_ACPI_DESCRIPTION_HEADER    Header;
1478   UINT32                         Reserved;
1479 } EFI_ACPI_6_4_NVDIMM_FIRMWARE_INTERFACE_TABLE;
1480 
1481 //
1482 // NFIT Version (as defined in ACPI 6.4 spec.)
1483 //
1484 #define EFI_ACPI_6_4_NVDIMM_FIRMWARE_INTERFACE_TABLE_REVISION  0x1
1485 
1486 //
1487 // Definition for NFIT Table Structure Types
1488 //
1489 #define EFI_ACPI_6_4_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE_TYPE    0
1490 #define EFI_ACPI_6_4_NFIT_NVDIMM_REGION_MAPPING_STRUCTURE_TYPE            1
1491 #define EFI_ACPI_6_4_NFIT_INTERLEAVE_STRUCTURE_TYPE                       2
1492 #define EFI_ACPI_6_4_NFIT_SMBIOS_MANAGEMENT_INFORMATION_STRUCTURE_TYPE    3
1493 #define EFI_ACPI_6_4_NFIT_NVDIMM_CONTROL_REGION_STRUCTURE_TYPE            4
1494 #define EFI_ACPI_6_4_NFIT_NVDIMM_BLOCK_DATA_WINDOW_REGION_STRUCTURE_TYPE  5
1495 #define EFI_ACPI_6_4_NFIT_FLUSH_HINT_ADDRESS_STRUCTURE_TYPE               6
1496 
1497 //
1498 // Definition for NFIT Structure Header
1499 //
1500 typedef struct {
1501   UINT16    Type;
1502   UINT16    Length;
1503 } EFI_ACPI_6_4_NFIT_STRUCTURE_HEADER;
1504 
1505 //
1506 // Definition for System Physical Address Range Structure
1507 //
1508 #define EFI_ACPI_6_4_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_FLAGS_CONTROL_REGION_FOR_MANAGEMENT  BIT0
1509 #define EFI_ACPI_6_4_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_FLAGS_PROXIMITY_DOMAIN_VALID         BIT1
1510 #define EFI_ACPI_6_4_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_FLAGS_SPA_LOCATION_COOKIE_VALID      BIT2
1511 
1512 #define EFI_ACPI_6_4_NFIT_GUID_VOLATILE_MEMORY_REGION                              { 0x7305944F, 0xFDDA, 0x44E3, { 0xB1, 0x6C, 0x3F, 0x22, 0xD2, 0x52, 0xE5, 0xD0 }}
1513 #define EFI_ACPI_6_4_NFIT_GUID_BYTE_ADDRESSABLE_PERSISTENT_MEMORY_REGION           { 0x66F0D379, 0xB4F3, 0x4074, { 0xAC, 0x43, 0x0D, 0x33, 0x18, 0xB7, 0x8C, 0xDB }}
1514 #define EFI_ACPI_6_4_NFIT_GUID_NVDIMM_CONTROL_REGION                               { 0x92F701F6, 0x13B4, 0x405D, { 0x91, 0x0B, 0x29, 0x93, 0x67, 0xE8, 0x23, 0x4C }}
1515 #define EFI_ACPI_6_4_NFIT_GUID_NVDIMM_BLOCK_DATA_WINDOW_REGION                     { 0x91AF0530, 0x5D86, 0x470E, { 0xA6, 0xB0, 0x0A, 0x2D, 0xB9, 0x40, 0x82, 0x49 }}
1516 #define EFI_ACPI_6_4_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_DISK_REGION_VOLATILE    { 0x77AB535A, 0x45FC, 0x624B, { 0x55, 0x60, 0xF7, 0xB2, 0x81, 0xD1, 0xF9, 0x6E }}
1517 #define EFI_ACPI_6_4_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_CD_REGION_VOLATILE      { 0x3D5ABD30, 0x4175, 0x87CE, { 0x6D, 0x64, 0xD2, 0xAD, 0xE5, 0x23, 0xC4, 0xBB }}
1518 #define EFI_ACPI_6_4_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_DISK_REGION_PERSISTENT  { 0x5CEA02C9, 0x4D07, 0x69D3, { 0x26, 0x9F ,0x44, 0x96, 0xFB, 0xE0, 0x96, 0xF9 }}
1519 #define EFI_ACPI_6_4_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_CD_REGION_PERSISTENT    { 0x08018188, 0x42CD, 0xBB48, { 0x10, 0x0F, 0x53, 0x87, 0xD5, 0x3D, 0xED, 0x3D }}
1520 
1521 typedef struct {
1522   UINT16    Type;
1523   UINT16    Length;
1524   UINT16    SPARangeStructureIndex;
1525   UINT16    Flags;
1526   UINT32    Reserved_8;
1527   UINT32    ProximityDomain;
1528   GUID      AddressRangeTypeGUID;
1529   UINT64    SystemPhysicalAddressRangeBase;
1530   UINT64    SystemPhysicalAddressRangeLength;
1531   UINT64    AddressRangeMemoryMappingAttribute;
1532   UINT64    SPALocationCookie;
1533 } EFI_ACPI_6_4_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE;
1534 
1535 //
1536 // Definition for Memory Device to System Physical Address Range Mapping Structure
1537 //
1538 typedef struct {
1539   UINT32    DIMMNumber          : 4;
1540   UINT32    MemoryChannelNumber : 4;
1541   UINT32    MemoryControllerID  : 4;
1542   UINT32    SocketID            : 4;
1543   UINT32    NodeControllerID    : 12;
1544   UINT32    Reserved_28         : 4;
1545 } EFI_ACPI_6_4_NFIT_DEVICE_HANDLE;
1546 
1547 #define EFI_ACPI_6_4_NFIT_MEMORY_DEVICE_STATE_FLAGS_PREVIOUS_SAVE_FAIL                                      BIT0
1548 #define EFI_ACPI_6_4_NFIT_MEMORY_DEVICE_STATE_FLAGS_LAST_RESTORE_FAIL                                       BIT1
1549 #define EFI_ACPI_6_4_NFIT_MEMORY_DEVICE_STATE_FLAGS_PLATFORM_FLUSH_FAIL                                     BIT2
1550 #define EFI_ACPI_6_4_NFIT_MEMORY_DEVICE_STATE_FLAGS_NOT_ARMED_PRIOR_TO_OSPM_HAND_OFF                        BIT3
1551 #define EFI_ACPI_6_4_NFIT_MEMORY_DEVICE_STATE_FLAGS_SMART_HEALTH_EVENTS_PRIOR_OSPM_HAND_OFF                 BIT4
1552 #define EFI_ACPI_6_4_NFIT_MEMORY_DEVICE_STATE_FLAGS_FIRMWARE_ENABLED_TO_NOTIFY_OSPM_ON_SMART_HEALTH_EVENTS  BIT5
1553 #define EFI_ACPI_6_4_NFIT_MEMORY_DEVICE_STATE_FLAGS_FIRMWARE_NOT_MAP_NVDIMM_TO_SPA                          BIT6
1554 
1555 typedef struct {
1556   UINT16                             Type;
1557   UINT16                             Length;
1558   EFI_ACPI_6_4_NFIT_DEVICE_HANDLE    NFITDeviceHandle;
1559   UINT16                             NVDIMMPhysicalID;
1560   UINT16                             NVDIMMRegionID;
1561   UINT16                             SPARangeStructureIndex;
1562   UINT16                             NVDIMMControlRegionStructureIndex;
1563   UINT64                             NVDIMMRegionSize;
1564   UINT64                             RegionOffset;
1565   UINT64                             NVDIMMPhysicalAddressRegionBase;
1566   UINT16                             InterleaveStructureIndex;
1567   UINT16                             InterleaveWays;
1568   UINT16                             NVDIMMStateFlags;
1569   UINT16                             Reserved_46;
1570 } EFI_ACPI_6_4_NFIT_NVDIMM_REGION_MAPPING_STRUCTURE;
1571 
1572 //
1573 // Definition for Interleave Structure
1574 //
1575 typedef struct {
1576   UINT16    Type;
1577   UINT16    Length;
1578   UINT16    InterleaveStructureIndex;
1579   UINT16    Reserved_6;
1580   UINT32    NumberOfLines;
1581   UINT32    LineSize;
1582   // UINT32                                      LineOffset[NumberOfLines];
1583 } EFI_ACPI_6_4_NFIT_INTERLEAVE_STRUCTURE;
1584 
1585 //
1586 // Definition for SMBIOS Management Information Structure
1587 //
1588 typedef struct {
1589   UINT16    Type;
1590   UINT16    Length;
1591   UINT32    Reserved_4;
1592   // UINT8                                       Data[];
1593 } EFI_ACPI_6_4_NFIT_SMBIOS_MANAGEMENT_INFORMATION_STRUCTURE;
1594 
1595 //
1596 // Definition for NVDIMM Control Region Structure
1597 //
1598 #define EFI_ACPI_6_4_NFIT_NVDIMM_CONTROL_REGION_VALID_FIELDS_MANUFACTURING  BIT0
1599 
1600 #define EFI_ACPI_6_4_NFIT_NVDIMM_CONTROL_REGION_FLAGS_BLOCK_DATA_WINDOWS_BUFFERED  BIT0
1601 
1602 typedef struct {
1603   UINT16    Type;
1604   UINT16    Length;
1605   UINT16    NVDIMMControlRegionStructureIndex;
1606   UINT16    VendorID;
1607   UINT16    DeviceID;
1608   UINT16    RevisionID;
1609   UINT16    SubsystemVendorID;
1610   UINT16    SubsystemDeviceID;
1611   UINT16    SubsystemRevisionID;
1612   UINT8     ValidFields;
1613   UINT8     ManufacturingLocation;
1614   UINT16    ManufacturingDate;
1615   UINT8     Reserved_22[2];
1616   UINT32    SerialNumber;
1617   UINT16    RegionFormatInterfaceCode;
1618   UINT16    NumberOfBlockControlWindows;
1619   UINT64    SizeOfBlockControlWindow;
1620   UINT64    CommandRegisterOffsetInBlockControlWindow;
1621   UINT64    SizeOfCommandRegisterInBlockControlWindows;
1622   UINT64    StatusRegisterOffsetInBlockControlWindow;
1623   UINT64    SizeOfStatusRegisterInBlockControlWindows;
1624   UINT16    NVDIMMControlRegionFlag;
1625   UINT8     Reserved_74[6];
1626 } EFI_ACPI_6_4_NFIT_NVDIMM_CONTROL_REGION_STRUCTURE;
1627 
1628 //
1629 // Definition for NVDIMM Block Data Window Region Structure
1630 //
1631 typedef struct {
1632   UINT16    Type;
1633   UINT16    Length;
1634   UINT16    NVDIMMControlRegionStructureIndex;
1635   UINT16    NumberOfBlockDataWindows;
1636   UINT64    BlockDataWindowStartOffset;
1637   UINT64    SizeOfBlockDataWindow;
1638   UINT64    BlockAccessibleMemoryCapacity;
1639   UINT64    BeginningAddressOfFirstBlockInBlockAccessibleMemory;
1640 } EFI_ACPI_6_4_NFIT_NVDIMM_BLOCK_DATA_WINDOW_REGION_STRUCTURE;
1641 
1642 //
1643 // Definition for Flush Hint Address Structure
1644 //
1645 typedef struct {
1646   UINT16                             Type;
1647   UINT16                             Length;
1648   EFI_ACPI_6_4_NFIT_DEVICE_HANDLE    NFITDeviceHandle;
1649   UINT16                             NumberOfFlushHintAddresses;
1650   UINT8                              Reserved_10[6];
1651   // UINT64                                      FlushHintAddress[NumberOfFlushHintAddresses];
1652 } EFI_ACPI_6_4_NFIT_FLUSH_HINT_ADDRESS_STRUCTURE;
1653 
1654 ///
1655 /// Secure DEVices Table (SDEV)
1656 ///
1657 typedef struct {
1658   EFI_ACPI_DESCRIPTION_HEADER    Header;
1659 } EFI_ACPI_6_4_SECURE_DEVICES_TABLE_HEADER;
1660 
1661 ///
1662 /// SDEV Revision (as defined in ACPI 6.4 spec.)
1663 ///
1664 #define EFI_ACPI_6_4_SECURE_DEVICES_TABLE_REVISION  0x01
1665 
1666 ///
1667 /// Secure Device types
1668 ///
1669 #define EFI_ACPI_6_4_SDEV_TYPE_ACPI_NAMESPACE_DEVICE  0x00
1670 #define EFI_ACPI_6_4_SDEV_TYPE_PCIE_ENDPOINT_DEVICE   0x01
1671 
1672 ///
1673 /// Secure Device flags
1674 ///
1675 #define EFI_ACPI_6_4_SDEV_FLAG_ALLOW_HANDOFF                     BIT0
1676 #define EFI_ACPI_6_4_SDEV_FLAG_SECURE_ACCESS_COMPONENTS_PRESENT  BIT1
1677 
1678 ///
1679 /// SDEV Structure Header
1680 ///
1681 typedef struct {
1682   UINT8     Type;
1683   UINT8     Flags;
1684   UINT16    Length;
1685 } EFI_ACPI_6_4_SDEV_STRUCTURE_HEADER;
1686 
1687 ///
1688 /// ACPI_NAMESPACE_DEVICE based Secure Device Structure
1689 ///
1690 typedef struct {
1691   EFI_ACPI_6_4_SDEV_STRUCTURE_HEADER    Header;
1692   UINT16                                DeviceIdentifierOffset;
1693   UINT16                                DeviceIdentifierLength;
1694   UINT16                                VendorSpecificDataOffset;
1695   UINT16                                VendorSpecificDataLength;
1696   UINT16                                SecureAccessComponentsOffset;
1697   UINT16                                SecureAccessComponentsLength;
1698 } EFI_ACPI_6_4_SDEV_STRUCTURE_ACPI_NAMESPACE_DEVICE;
1699 
1700 ///
1701 /// Secure Access Component Types
1702 ///
1703 #define EFI_ACPI_6_4_SDEV_SECURE_ACCESS_COMPONENT_TYPE_IDENTIFICATION  0x00
1704 #define EFI_ACPI_6_4_SDEV_SECURE_ACCESS_COMPONENT_TYPE_MEMORY          0x01
1705 
1706 ///
1707 /// Identification Based Secure Access Component
1708 ///
1709 typedef struct {
1710   EFI_ACPI_6_4_SDEV_STRUCTURE_HEADER    Header;
1711   UINT16                                HardwareIdentifierOffset;
1712   UINT16                                HardwareIdentifierLength;
1713   UINT16                                SubsystemIdentifierOffset;
1714   UINT16                                SubsystemIdentifierLength;
1715   UINT16                                HardwareRevision;
1716   UINT8                                 HardwareRevisionPresent;
1717   UINT8                                 ClassCodePresent;
1718   UINT8                                 PciCompatibleBaseClass;
1719   UINT8                                 PciCompatibleSubClass;
1720   UINT8                                 PciCompatibleProgrammingInterface;
1721 } EFI_ACPI_6_4_SDEV_SECURE_ACCESS_COMPONENT_IDENTIFICATION_STRUCTURE;
1722 
1723 ///
1724 /// Memory-based Secure Access Component
1725 ///
1726 typedef struct {
1727   EFI_ACPI_6_4_SDEV_STRUCTURE_HEADER    Header;
1728   UINT32                                Reserved;
1729   UINT64                                MemoryAddressBase;
1730   UINT64                                MemoryLength;
1731 } EFI_ACPI_6_4_SDEV_SECURE_ACCESS_COMPONENT_MEMORY_STRUCTURE;
1732 
1733 ///
1734 /// PCIe Endpoint Device based Secure Device Structure
1735 ///
1736 typedef struct {
1737   EFI_ACPI_6_4_SDEV_STRUCTURE_HEADER    Header;
1738   UINT16                                PciSegmentNumber;
1739   UINT16                                StartBusNumber;
1740   UINT16                                PciPathOffset;
1741   UINT16                                PciPathLength;
1742   UINT16                                VendorSpecificDataOffset;
1743   UINT16                                VendorSpecificDataLength;
1744 } EFI_ACPI_6_4_SDEV_STRUCTURE_PCIE_ENDPOINT_DEVICE;
1745 
1746 ///
1747 /// Boot Error Record Table (BERT)
1748 ///
1749 typedef struct {
1750   EFI_ACPI_DESCRIPTION_HEADER    Header;
1751   UINT32                         BootErrorRegionLength;
1752   UINT64                         BootErrorRegion;
1753 } EFI_ACPI_6_4_BOOT_ERROR_RECORD_TABLE_HEADER;
1754 
1755 ///
1756 /// BERT Version (as defined in ACPI 6.4 spec.)
1757 ///
1758 #define EFI_ACPI_6_4_BOOT_ERROR_RECORD_TABLE_REVISION  0x01
1759 
1760 ///
1761 /// Boot Error Region Block Status Definition
1762 ///
1763 typedef struct {
1764   UINT32    UncorrectableErrorValid     : 1;
1765   UINT32    CorrectableErrorValid       : 1;
1766   UINT32    MultipleUncorrectableErrors : 1;
1767   UINT32    MultipleCorrectableErrors   : 1;
1768   UINT32    ErrorDataEntryCount         : 10;
1769   UINT32    Reserved                    : 18;
1770 } EFI_ACPI_6_4_ERROR_BLOCK_STATUS;
1771 
1772 ///
1773 /// Boot Error Region Definition
1774 ///
1775 typedef struct {
1776   EFI_ACPI_6_4_ERROR_BLOCK_STATUS    BlockStatus;
1777   UINT32                             RawDataOffset;
1778   UINT32                             RawDataLength;
1779   UINT32                             DataLength;
1780   UINT32                             ErrorSeverity;
1781 } EFI_ACPI_6_4_BOOT_ERROR_REGION_STRUCTURE;
1782 
1783 //
1784 // Boot Error Severity types
1785 //
1786 #define EFI_ACPI_6_4_ERROR_SEVERITY_RECOVERABLE  0x00
1787 #define EFI_ACPI_6_4_ERROR_SEVERITY_FATAL        0x01
1788 #define EFI_ACPI_6_4_ERROR_SEVERITY_CORRECTED    0x02
1789 #define EFI_ACPI_6_4_ERROR_SEVERITY_NONE         0x03
1790 //
1791 // The term 'Correctable' is no longer being used as an error severity of the
1792 // reported error since ACPI Specification Version 5.1 Errata B.
1793 // The below macro is considered as deprecated and should no longer be used.
1794 //
1795 #define EFI_ACPI_6_4_ERROR_SEVERITY_CORRECTABLE  0x00
1796 
1797 ///
1798 /// Generic Error Data Entry Definition
1799 ///
1800 typedef struct {
1801   UINT8     SectionType[16];
1802   UINT32    ErrorSeverity;
1803   UINT16    Revision;
1804   UINT8     ValidationBits;
1805   UINT8     Flags;
1806   UINT32    ErrorDataLength;
1807   UINT8     FruId[16];
1808   UINT8     FruText[20];
1809   UINT8     Timestamp[8];
1810 } EFI_ACPI_6_4_GENERIC_ERROR_DATA_ENTRY_STRUCTURE;
1811 
1812 ///
1813 /// Generic Error Data Entry Version (as defined in ACPI 6.4 spec.)
1814 ///
1815 #define EFI_ACPI_6_4_GENERIC_ERROR_DATA_ENTRY_REVISION  0x0300
1816 
1817 ///
1818 /// HEST - Hardware Error Source Table
1819 ///
1820 typedef struct {
1821   EFI_ACPI_DESCRIPTION_HEADER    Header;
1822   UINT32                         ErrorSourceCount;
1823 } EFI_ACPI_6_4_HARDWARE_ERROR_SOURCE_TABLE_HEADER;
1824 
1825 ///
1826 /// HEST Version (as defined in ACPI 6.4 spec.)
1827 ///
1828 #define EFI_ACPI_6_4_HARDWARE_ERROR_SOURCE_TABLE_REVISION  0x01
1829 
1830 //
1831 // Error Source structure types.
1832 //
1833 #define EFI_ACPI_6_4_IA32_ARCHITECTURE_MACHINE_CHECK_EXCEPTION  0x00
1834 #define EFI_ACPI_6_4_IA32_ARCHITECTURE_CORRECTED_MACHINE_CHECK  0x01
1835 #define EFI_ACPI_6_4_IA32_ARCHITECTURE_NMI_ERROR                0x02
1836 #define EFI_ACPI_6_4_PCI_EXPRESS_ROOT_PORT_AER                  0x06
1837 #define EFI_ACPI_6_4_PCI_EXPRESS_DEVICE_AER                     0x07
1838 #define EFI_ACPI_6_4_PCI_EXPRESS_BRIDGE_AER                     0x08
1839 #define EFI_ACPI_6_4_GENERIC_HARDWARE_ERROR                     0x09
1840 #define EFI_ACPI_6_4_GENERIC_HARDWARE_ERROR_VERSION_2           0x0A
1841 #define EFI_ACPI_6_4_IA32_ARCHITECTURE_DEFERRED_MACHINE_CHECK   0x0B
1842 
1843 //
1844 // Error Source structure flags.
1845 //
1846 #define EFI_ACPI_6_4_ERROR_SOURCE_FLAG_FIRMWARE_FIRST  (1 << 0)
1847 #define EFI_ACPI_6_4_ERROR_SOURCE_FLAG_GLOBAL          (1 << 1)
1848 #define EFI_ACPI_6_4_ERROR_SOURCE_FLAG_GHES_ASSIST     (1 << 2)
1849 
1850 ///
1851 /// IA-32 Architecture Machine Check Exception Structure Definition
1852 ///
1853 typedef struct {
1854   UINT16    Type;
1855   UINT16    SourceId;
1856   UINT8     Reserved0[2];
1857   UINT8     Flags;
1858   UINT8     Enabled;
1859   UINT32    NumberOfRecordsToPreAllocate;
1860   UINT32    MaxSectionsPerRecord;
1861   UINT64    GlobalCapabilityInitData;
1862   UINT64    GlobalControlInitData;
1863   UINT8     NumberOfHardwareBanks;
1864   UINT8     Reserved1[7];
1865 } EFI_ACPI_6_4_IA32_ARCHITECTURE_MACHINE_CHECK_EXCEPTION_STRUCTURE;
1866 
1867 ///
1868 /// IA-32 Architecture Machine Check Bank Structure Definition
1869 ///
1870 typedef struct {
1871   UINT8     BankNumber;
1872   UINT8     ClearStatusOnInitialization;
1873   UINT8     StatusDataFormat;
1874   UINT8     Reserved0;
1875   UINT32    ControlRegisterMsrAddress;
1876   UINT64    ControlInitData;
1877   UINT32    StatusRegisterMsrAddress;
1878   UINT32    AddressRegisterMsrAddress;
1879   UINT32    MiscRegisterMsrAddress;
1880 } EFI_ACPI_6_4_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_BANK_STRUCTURE;
1881 
1882 ///
1883 /// IA-32 Architecture Machine Check Bank Structure MCA data format
1884 ///
1885 #define EFI_ACPI_6_4_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_DATA_FORMAT_IA32     0x00
1886 #define EFI_ACPI_6_4_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_DATA_FORMAT_INTEL64  0x01
1887 #define EFI_ACPI_6_4_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_DATA_FORMAT_AMD64    0x02
1888 
1889 //
1890 // Hardware Error Notification types. All other values are reserved
1891 //
1892 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_POLLED                        0x00
1893 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_EXTERNAL_INTERRUPT            0x01
1894 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_LOCAL_INTERRUPT               0x02
1895 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_SCI                           0x03
1896 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_NMI                           0x04
1897 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_CMCI                          0x05
1898 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_MCE                           0x06
1899 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_GPIO_SIGNAL                   0x07
1900 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_ARMV8_SEA                     0x08
1901 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_ARMV8_SEI                     0x09
1902 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_GSIV                          0x0A
1903 #define EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_SOFTWARE_DELEGATED_EXCEPTION  0x0B
1904 
1905 ///
1906 /// Hardware Error Notification Configuration Write Enable Structure Definition
1907 ///
1908 typedef struct {
1909   UINT16    Type                           : 1;
1910   UINT16    PollInterval                   : 1;
1911   UINT16    SwitchToPollingThresholdValue  : 1;
1912   UINT16    SwitchToPollingThresholdWindow : 1;
1913   UINT16    ErrorThresholdValue            : 1;
1914   UINT16    ErrorThresholdWindow           : 1;
1915   UINT16    Reserved                       : 10;
1916 } EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE;
1917 
1918 ///
1919 /// Hardware Error Notification Structure Definition
1920 ///
1921 typedef struct {
1922   UINT8                                                                            Type;
1923   UINT8                                                                            Length;
1924   EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE    ConfigurationWriteEnable;
1925   UINT32                                                                           PollInterval;
1926   UINT32                                                                           Vector;
1927   UINT32                                                                           SwitchToPollingThresholdValue;
1928   UINT32                                                                           SwitchToPollingThresholdWindow;
1929   UINT32                                                                           ErrorThresholdValue;
1930   UINT32                                                                           ErrorThresholdWindow;
1931 } EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_STRUCTURE;
1932 
1933 ///
1934 /// IA-32 Architecture Corrected Machine Check Structure Definition
1935 ///
1936 typedef struct {
1937   UINT16                                                Type;
1938   UINT16                                                SourceId;
1939   UINT8                                                 Reserved0[2];
1940   UINT8                                                 Flags;
1941   UINT8                                                 Enabled;
1942   UINT32                                                NumberOfRecordsToPreAllocate;
1943   UINT32                                                MaxSectionsPerRecord;
1944   EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_STRUCTURE    NotificationStructure;
1945   UINT8                                                 NumberOfHardwareBanks;
1946   UINT8                                                 Reserved1[3];
1947 } EFI_ACPI_6_4_IA32_ARCHITECTURE_CORRECTED_MACHINE_CHECK_STRUCTURE;
1948 
1949 ///
1950 /// IA-32 Architecture NMI Error Structure Definition
1951 ///
1952 typedef struct {
1953   UINT16    Type;
1954   UINT16    SourceId;
1955   UINT8     Reserved0[2];
1956   UINT32    NumberOfRecordsToPreAllocate;
1957   UINT32    MaxSectionsPerRecord;
1958   UINT32    MaxRawDataLength;
1959 } EFI_ACPI_6_4_IA32_ARCHITECTURE_NMI_ERROR_STRUCTURE;
1960 
1961 ///
1962 /// PCI Express Root Port AER Structure Definition
1963 ///
1964 typedef struct {
1965   UINT16    Type;
1966   UINT16    SourceId;
1967   UINT8     Reserved0[2];
1968   UINT8     Flags;
1969   UINT8     Enabled;
1970   UINT32    NumberOfRecordsToPreAllocate;
1971   UINT32    MaxSectionsPerRecord;
1972   UINT32    Bus;
1973   UINT16    Device;
1974   UINT16    Function;
1975   UINT16    DeviceControl;
1976   UINT8     Reserved1[2];
1977   UINT32    UncorrectableErrorMask;
1978   UINT32    UncorrectableErrorSeverity;
1979   UINT32    CorrectableErrorMask;
1980   UINT32    AdvancedErrorCapabilitiesAndControl;
1981   UINT32    RootErrorCommand;
1982 } EFI_ACPI_6_4_PCI_EXPRESS_ROOT_PORT_AER_STRUCTURE;
1983 
1984 ///
1985 /// PCI Express Device AER Structure Definition
1986 ///
1987 typedef struct {
1988   UINT16    Type;
1989   UINT16    SourceId;
1990   UINT8     Reserved0[2];
1991   UINT8     Flags;
1992   UINT8     Enabled;
1993   UINT32    NumberOfRecordsToPreAllocate;
1994   UINT32    MaxSectionsPerRecord;
1995   UINT32    Bus;
1996   UINT16    Device;
1997   UINT16    Function;
1998   UINT16    DeviceControl;
1999   UINT8     Reserved1[2];
2000   UINT32    UncorrectableErrorMask;
2001   UINT32    UncorrectableErrorSeverity;
2002   UINT32    CorrectableErrorMask;
2003   UINT32    AdvancedErrorCapabilitiesAndControl;
2004 } EFI_ACPI_6_4_PCI_EXPRESS_DEVICE_AER_STRUCTURE;
2005 
2006 ///
2007 /// PCI Express Bridge AER Structure Definition
2008 ///
2009 typedef struct {
2010   UINT16    Type;
2011   UINT16    SourceId;
2012   UINT8     Reserved0[2];
2013   UINT8     Flags;
2014   UINT8     Enabled;
2015   UINT32    NumberOfRecordsToPreAllocate;
2016   UINT32    MaxSectionsPerRecord;
2017   UINT32    Bus;
2018   UINT16    Device;
2019   UINT16    Function;
2020   UINT16    DeviceControl;
2021   UINT8     Reserved1[2];
2022   UINT32    UncorrectableErrorMask;
2023   UINT32    UncorrectableErrorSeverity;
2024   UINT32    CorrectableErrorMask;
2025   UINT32    AdvancedErrorCapabilitiesAndControl;
2026   UINT32    SecondaryUncorrectableErrorMask;
2027   UINT32    SecondaryUncorrectableErrorSeverity;
2028   UINT32    SecondaryAdvancedErrorCapabilitiesAndControl;
2029 } EFI_ACPI_6_4_PCI_EXPRESS_BRIDGE_AER_STRUCTURE;
2030 
2031 ///
2032 /// Generic Hardware Error Source Structure Definition
2033 ///
2034 typedef struct {
2035   UINT16                                                Type;
2036   UINT16                                                SourceId;
2037   UINT16                                                RelatedSourceId;
2038   UINT8                                                 Flags;
2039   UINT8                                                 Enabled;
2040   UINT32                                                NumberOfRecordsToPreAllocate;
2041   UINT32                                                MaxSectionsPerRecord;
2042   UINT32                                                MaxRawDataLength;
2043   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE                ErrorStatusAddress;
2044   EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_STRUCTURE    NotificationStructure;
2045   UINT32                                                ErrorStatusBlockLength;
2046 } EFI_ACPI_6_4_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE;
2047 
2048 ///
2049 /// Generic Hardware Error Source Version 2 Structure Definition
2050 ///
2051 typedef struct {
2052   UINT16                                                Type;
2053   UINT16                                                SourceId;
2054   UINT16                                                RelatedSourceId;
2055   UINT8                                                 Flags;
2056   UINT8                                                 Enabled;
2057   UINT32                                                NumberOfRecordsToPreAllocate;
2058   UINT32                                                MaxSectionsPerRecord;
2059   UINT32                                                MaxRawDataLength;
2060   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE                ErrorStatusAddress;
2061   EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_STRUCTURE    NotificationStructure;
2062   UINT32                                                ErrorStatusBlockLength;
2063   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE                ReadAckRegister;
2064   UINT64                                                ReadAckPreserve;
2065   UINT64                                                ReadAckWrite;
2066 } EFI_ACPI_6_4_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE;
2067 
2068 ///
2069 /// Generic Error Status Definition
2070 ///
2071 typedef struct {
2072   EFI_ACPI_6_4_ERROR_BLOCK_STATUS    BlockStatus;
2073   UINT32                             RawDataOffset;
2074   UINT32                             RawDataLength;
2075   UINT32                             DataLength;
2076   UINT32                             ErrorSeverity;
2077 } EFI_ACPI_6_4_GENERIC_ERROR_STATUS_STRUCTURE;
2078 
2079 ///
2080 /// IA-32 Architecture Deferred Machine Check Structure Definition
2081 ///
2082 typedef struct {
2083   UINT16                                                Type;
2084   UINT16                                                SourceId;
2085   UINT8                                                 Reserved0[2];
2086   UINT8                                                 Flags;
2087   UINT8                                                 Enabled;
2088   UINT32                                                NumberOfRecordsToPreAllocate;
2089   UINT32                                                MaxSectionsPerRecord;
2090   EFI_ACPI_6_4_HARDWARE_ERROR_NOTIFICATION_STRUCTURE    NotificationStructure;
2091   UINT8                                                 NumberOfHardwareBanks;
2092   UINT8                                                 Reserved1[3];
2093 } EFI_ACPI_6_4_IA32_ARCHITECTURE_DEFERRED_MACHINE_CHECK_STRUCTURE;
2094 
2095 ///
2096 /// HMAT - Heterogeneous Memory Attribute Table
2097 ///
2098 typedef struct {
2099   EFI_ACPI_DESCRIPTION_HEADER    Header;
2100   UINT8                          Reserved[4];
2101 } EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_HEADER;
2102 
2103 ///
2104 /// HMAT Revision (as defined in ACPI 6.4 spec.)
2105 ///
2106 #define EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_REVISION  0x02
2107 
2108 ///
2109 /// HMAT types
2110 ///
2111 #define EFI_ACPI_6_4_HMAT_TYPE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES          0x00
2112 #define EFI_ACPI_6_4_HMAT_TYPE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO  0x01
2113 #define EFI_ACPI_6_4_HMAT_TYPE_MEMORY_SIDE_CACHE_INFO                      0x02
2114 
2115 ///
2116 /// HMAT Structure Header
2117 ///
2118 typedef struct {
2119   UINT16    Type;
2120   UINT8     Reserved[2];
2121   UINT32    Length;
2122 } EFI_ACPI_6_4_HMAT_STRUCTURE_HEADER;
2123 
2124 ///
2125 /// Memory Proximity Domain Attributes Structure flags
2126 ///
2127 typedef struct {
2128   UINT16    InitiatorProximityDomainValid : 1;
2129   UINT16    Reserved                      : 15;
2130 } EFI_ACPI_6_4_HMAT_STRUCTURE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES_FLAGS;
2131 
2132 ///
2133 /// Memory Proximity Domain Attributes Structure
2134 ///
2135 typedef struct {
2136   UINT16                                                                  Type;
2137   UINT8                                                                   Reserved[2];
2138   UINT32                                                                  Length;
2139   EFI_ACPI_6_4_HMAT_STRUCTURE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES_FLAGS    Flags;
2140   UINT8                                                                   Reserved1[2];
2141   UINT32                                                                  InitiatorProximityDomain;
2142   UINT32                                                                  MemoryProximityDomain;
2143   UINT8                                                                   Reserved2[20];
2144 } EFI_ACPI_6_4_HMAT_STRUCTURE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES;
2145 
2146 ///
2147 /// System Locality Latency and Bandwidth Information Structure flags
2148 ///
2149 typedef struct {
2150   UINT8    MemoryHierarchy  : 4;
2151   UINT8    AccessAttributes : 2;
2152   UINT8    Reserved         : 2;
2153 } EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO_FLAGS;
2154 
2155 ///
2156 /// System Locality Latency and Bandwidth Information Structure
2157 ///
2158 typedef struct {
2159   UINT16                                                                          Type;
2160   UINT8                                                                           Reserved[2];
2161   UINT32                                                                          Length;
2162   EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO_FLAGS    Flags;
2163   UINT8                                                                           DataType;
2164   UINT8                                                                           MinTransferSize;
2165   UINT8                                                                           Reserved1;
2166   UINT32                                                                          NumberOfInitiatorProximityDomains;
2167   UINT32                                                                          NumberOfTargetProximityDomains;
2168   UINT8                                                                           Reserved2[4];
2169   UINT64                                                                          EntryBaseUnit;
2170 } EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO;
2171 
2172 ///
2173 /// Memory Side Cache Information Structure cache attributes
2174 ///
2175 typedef struct {
2176   UINT32    TotalCacheLevels   : 4;
2177   UINT32    CacheLevel         : 4;
2178   UINT32    CacheAssociativity : 4;
2179   UINT32    WritePolicy        : 4;
2180   UINT32    CacheLineSize      : 16;
2181 } EFI_ACPI_6_4_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATTRIBUTES;
2182 
2183 ///
2184 /// Memory Side Cache Information Structure
2185 ///
2186 typedef struct {
2187   UINT16                                                                 Type;
2188   UINT8                                                                  Reserved[2];
2189   UINT32                                                                 Length;
2190   UINT32                                                                 MemoryProximityDomain;
2191   UINT8                                                                  Reserved1[4];
2192   UINT64                                                                 MemorySideCacheSize;
2193   EFI_ACPI_6_4_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATTRIBUTES    CacheAttributes;
2194   UINT8                                                                  Reserved2[2];
2195   UINT16                                                                 NumberOfSmbiosHandles;
2196 } EFI_ACPI_6_4_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO;
2197 
2198 ///
2199 /// ERST - Error Record Serialization Table
2200 ///
2201 typedef struct {
2202   EFI_ACPI_DESCRIPTION_HEADER    Header;
2203   UINT32                         SerializationHeaderSize;
2204   UINT8                          Reserved0[4];
2205   UINT32                         InstructionEntryCount;
2206 } EFI_ACPI_6_4_ERROR_RECORD_SERIALIZATION_TABLE_HEADER;
2207 
2208 ///
2209 /// ERST Version (as defined in ACPI 6.4 spec.)
2210 ///
2211 #define EFI_ACPI_6_4_ERROR_RECORD_SERIALIZATION_TABLE_REVISION  0x01
2212 
2213 ///
2214 /// ERST Serialization Actions
2215 ///
2216 #define EFI_ACPI_6_4_ERST_BEGIN_WRITE_OPERATION                   0x00
2217 #define EFI_ACPI_6_4_ERST_BEGIN_READ_OPERATION                    0x01
2218 #define EFI_ACPI_6_4_ERST_BEGIN_CLEAR_OPERATION                   0x02
2219 #define EFI_ACPI_6_4_ERST_END_OPERATION                           0x03
2220 #define EFI_ACPI_6_4_ERST_SET_RECORD_OFFSET                       0x04
2221 #define EFI_ACPI_6_4_ERST_EXECUTE_OPERATION                       0x05
2222 #define EFI_ACPI_6_4_ERST_CHECK_BUSY_STATUS                       0x06
2223 #define EFI_ACPI_6_4_ERST_GET_COMMAND_STATUS                      0x07
2224 #define EFI_ACPI_6_4_ERST_GET_RECORD_IDENTIFIER                   0x08
2225 #define EFI_ACPI_6_4_ERST_SET_RECORD_IDENTIFIER                   0x09
2226 #define EFI_ACPI_6_4_ERST_GET_RECORD_COUNT                        0x0A
2227 #define EFI_ACPI_6_4_ERST_BEGIN_DUMMY_WRITE_OPERATION             0x0B
2228 #define EFI_ACPI_6_4_ERST_GET_ERROR_LOG_ADDRESS_RANGE             0x0D
2229 #define EFI_ACPI_6_4_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH      0x0E
2230 #define EFI_ACPI_6_4_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES  0x0F
2231 #define EFI_ACPI_6_4_ERST_GET_EXECUTE_OPERATION_TIMINGS           0x10
2232 
2233 ///
2234 /// ERST Action Command Status
2235 ///
2236 #define EFI_ACPI_6_4_ERST_STATUS_SUCCESS                 0x00
2237 #define EFI_ACPI_6_4_ERST_STATUS_NOT_ENOUGH_SPACE        0x01
2238 #define EFI_ACPI_6_4_ERST_STATUS_HARDWARE_NOT_AVAILABLE  0x02
2239 #define EFI_ACPI_6_4_ERST_STATUS_FAILED                  0x03
2240 #define EFI_ACPI_6_4_ERST_STATUS_RECORD_STORE_EMPTY      0x04
2241 #define EFI_ACPI_6_4_ERST_STATUS_RECORD_NOT_FOUND        0x05
2242 
2243 ///
2244 /// ERST Serialization Instructions
2245 ///
2246 #define EFI_ACPI_6_4_ERST_READ_REGISTER                  0x00
2247 #define EFI_ACPI_6_4_ERST_READ_REGISTER_VALUE            0x01
2248 #define EFI_ACPI_6_4_ERST_WRITE_REGISTER                 0x02
2249 #define EFI_ACPI_6_4_ERST_WRITE_REGISTER_VALUE           0x03
2250 #define EFI_ACPI_6_4_ERST_NOOP                           0x04
2251 #define EFI_ACPI_6_4_ERST_LOAD_VAR1                      0x05
2252 #define EFI_ACPI_6_4_ERST_LOAD_VAR2                      0x06
2253 #define EFI_ACPI_6_4_ERST_STORE_VAR1                     0x07
2254 #define EFI_ACPI_6_4_ERST_ADD                            0x08
2255 #define EFI_ACPI_6_4_ERST_SUBTRACT                       0x09
2256 #define EFI_ACPI_6_4_ERST_ADD_VALUE                      0x0A
2257 #define EFI_ACPI_6_4_ERST_SUBTRACT_VALUE                 0x0B
2258 #define EFI_ACPI_6_4_ERST_STALL                          0x0C
2259 #define EFI_ACPI_6_4_ERST_STALL_WHILE_TRUE               0x0D
2260 #define EFI_ACPI_6_4_ERST_SKIP_NEXT_INSTRUCTION_IF_TRUE  0x0E
2261 #define EFI_ACPI_6_4_ERST_GOTO                           0x0F
2262 #define EFI_ACPI_6_4_ERST_SET_SRC_ADDRESS_BASE           0x10
2263 #define EFI_ACPI_6_4_ERST_SET_DST_ADDRESS_BASE           0x11
2264 #define EFI_ACPI_6_4_ERST_MOVE_DATA                      0x12
2265 
2266 ///
2267 /// ERST Instruction Flags
2268 ///
2269 #define EFI_ACPI_6_4_ERST_PRESERVE_REGISTER  0x01
2270 
2271 ///
2272 /// ERST Serialization Instruction Entry
2273 ///
2274 typedef struct {
2275   UINT8                                     SerializationAction;
2276   UINT8                                     Instruction;
2277   UINT8                                     Flags;
2278   UINT8                                     Reserved0;
2279   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    RegisterRegion;
2280   UINT64                                    Value;
2281   UINT64                                    Mask;
2282 } EFI_ACPI_6_4_ERST_SERIALIZATION_INSTRUCTION_ENTRY;
2283 
2284 ///
2285 /// EINJ - Error Injection Table
2286 ///
2287 typedef struct {
2288   EFI_ACPI_DESCRIPTION_HEADER    Header;
2289   UINT32                         InjectionHeaderSize;
2290   UINT8                          InjectionFlags;
2291   UINT8                          Reserved0[3];
2292   UINT32                         InjectionEntryCount;
2293 } EFI_ACPI_6_4_ERROR_INJECTION_TABLE_HEADER;
2294 
2295 ///
2296 /// EINJ Version (as defined in ACPI 6.4 spec.)
2297 ///
2298 #define EFI_ACPI_6_4_ERROR_INJECTION_TABLE_REVISION  0x01
2299 
2300 ///
2301 /// EINJ Error Injection Actions
2302 ///
2303 #define EFI_ACPI_6_4_EINJ_BEGIN_INJECTION_OPERATION       0x00
2304 #define EFI_ACPI_6_4_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE  0x01
2305 #define EFI_ACPI_6_4_EINJ_SET_ERROR_TYPE                  0x02
2306 #define EFI_ACPI_6_4_EINJ_GET_ERROR_TYPE                  0x03
2307 #define EFI_ACPI_6_4_EINJ_END_OPERATION                   0x04
2308 #define EFI_ACPI_6_4_EINJ_EXECUTE_OPERATION               0x05
2309 #define EFI_ACPI_6_4_EINJ_CHECK_BUSY_STATUS               0x06
2310 #define EFI_ACPI_6_4_EINJ_GET_COMMAND_STATUS              0x07
2311 #define EFI_ACPI_6_4_EINJ_TRIGGER_ERROR                   0xFF
2312 
2313 ///
2314 /// EINJ Action Command Status
2315 ///
2316 #define EFI_ACPI_6_4_EINJ_STATUS_SUCCESS          0x00
2317 #define EFI_ACPI_6_4_EINJ_STATUS_UNKNOWN_FAILURE  0x01
2318 #define EFI_ACPI_6_4_EINJ_STATUS_INVALID_ACCESS   0x02
2319 
2320 ///
2321 /// EINJ Error Type Definition
2322 ///
2323 #define EFI_ACPI_6_4_EINJ_ERROR_PROCESSOR_CORRECTABLE               (1 << 0)
2324 #define EFI_ACPI_6_4_EINJ_ERROR_PROCESSOR_UNCORRECTABLE_NONFATAL    (1 << 1)
2325 #define EFI_ACPI_6_4_EINJ_ERROR_PROCESSOR_UNCORRECTABLE_FATAL       (1 << 2)
2326 #define EFI_ACPI_6_4_EINJ_ERROR_MEMORY_CORRECTABLE                  (1 << 3)
2327 #define EFI_ACPI_6_4_EINJ_ERROR_MEMORY_UNCORRECTABLE_NONFATAL       (1 << 4)
2328 #define EFI_ACPI_6_4_EINJ_ERROR_MEMORY_UNCORRECTABLE_FATAL          (1 << 5)
2329 #define EFI_ACPI_6_4_EINJ_ERROR_PCI_EXPRESS_CORRECTABLE             (1 << 6)
2330 #define EFI_ACPI_6_4_EINJ_ERROR_PCI_EXPRESS_UNCORRECTABLE_NONFATAL  (1 << 7)
2331 #define EFI_ACPI_6_4_EINJ_ERROR_PCI_EXPRESS_UNCORRECTABLE_FATAL     (1 << 8)
2332 #define EFI_ACPI_6_4_EINJ_ERROR_PLATFORM_CORRECTABLE                (1 << 9)
2333 #define EFI_ACPI_6_4_EINJ_ERROR_PLATFORM_UNCORRECTABLE_NONFATAL     (1 << 10)
2334 #define EFI_ACPI_6_4_EINJ_ERROR_PLATFORM_UNCORRECTABLE_FATAL        (1 << 11)
2335 
2336 ///
2337 /// EINJ Injection Instructions
2338 ///
2339 #define EFI_ACPI_6_4_EINJ_READ_REGISTER         0x00
2340 #define EFI_ACPI_6_4_EINJ_READ_REGISTER_VALUE   0x01
2341 #define EFI_ACPI_6_4_EINJ_WRITE_REGISTER        0x02
2342 #define EFI_ACPI_6_4_EINJ_WRITE_REGISTER_VALUE  0x03
2343 #define EFI_ACPI_6_4_EINJ_NOOP                  0x04
2344 
2345 ///
2346 /// EINJ Instruction Flags
2347 ///
2348 #define EFI_ACPI_6_4_EINJ_PRESERVE_REGISTER  0x01
2349 
2350 ///
2351 /// EINJ Injection Instruction Entry
2352 ///
2353 typedef struct {
2354   UINT8                                     InjectionAction;
2355   UINT8                                     Instruction;
2356   UINT8                                     Flags;
2357   UINT8                                     Reserved0;
2358   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    RegisterRegion;
2359   UINT64                                    Value;
2360   UINT64                                    Mask;
2361 } EFI_ACPI_6_4_EINJ_INJECTION_INSTRUCTION_ENTRY;
2362 
2363 ///
2364 /// EINJ Trigger Action Table
2365 ///
2366 typedef struct {
2367   UINT32    HeaderSize;
2368   UINT32    Revision;
2369   UINT32    TableSize;
2370   UINT32    EntryCount;
2371 } EFI_ACPI_6_4_EINJ_TRIGGER_ACTION_TABLE;
2372 
2373 ///
2374 /// Platform Communications Channel Table (PCCT)
2375 ///
2376 typedef struct {
2377   EFI_ACPI_DESCRIPTION_HEADER    Header;
2378   UINT32                         Flags;
2379   UINT64                         Reserved;
2380 } EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER;
2381 
2382 ///
2383 /// PCCT Version (as defined in ACPI 6.4 spec.)
2384 ///
2385 #define EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_REVISION  0x02
2386 
2387 ///
2388 /// PCCT Global Flags
2389 ///
2390 #define EFI_ACPI_6_4_PCCT_FLAGS_PLATFORM_INTERRUPT  BIT0
2391 
2392 //
2393 // PCCT Subspace type
2394 //
2395 #define EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_GENERIC                        0x00
2396 #define EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_1_HW_REDUCED_COMMUNICATIONS    0x01
2397 #define EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_2_HW_REDUCED_COMMUNICATIONS    0x02
2398 #define EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_3_EXTENDED_PCC                 0x03
2399 #define EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC                 0x04
2400 #define EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_5_HW_REGISTERS_COMMUNICATIONS  0x05
2401 
2402 ///
2403 /// PCC Subspace Structure Header
2404 ///
2405 typedef struct {
2406   UINT8    Type;
2407   UINT8    Length;
2408 } EFI_ACPI_6_4_PCCT_SUBSPACE_HEADER;
2409 
2410 ///
2411 /// Generic Communications Subspace Structure
2412 ///
2413 typedef struct {
2414   UINT8                                     Type;
2415   UINT8                                     Length;
2416   UINT8                                     Reserved[6];
2417   UINT64                                    BaseAddress;
2418   UINT64                                    AddressLength;
2419   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    DoorbellRegister;
2420   UINT64                                    DoorbellPreserve;
2421   UINT64                                    DoorbellWrite;
2422   UINT32                                    NominalLatency;
2423   UINT32                                    MaximumPeriodicAccessRate;
2424   UINT16                                    MinimumRequestTurnaroundTime;
2425 } EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC;
2426 
2427 ///
2428 /// Generic Communications Channel Shared Memory Region
2429 ///
2430 
2431 typedef struct {
2432   UINT8    Command;
2433   UINT8    Reserved           : 7;
2434   UINT8    NotifyOnCompletion : 1;
2435 } EFI_ACPI_6_4_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND;
2436 
2437 typedef struct {
2438   UINT8    CommandComplete      : 1;
2439   UINT8    PlatformInterrupt    : 1;
2440   UINT8    Error                : 1;
2441   UINT8    PlatformNotification : 1;
2442   UINT8    Reserved             : 4;
2443   UINT8    Reserved1;
2444 } EFI_ACPI_6_4_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS;
2445 
2446 typedef struct {
2447   UINT32                                                    Signature;
2448   EFI_ACPI_6_4_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND    Command;
2449   EFI_ACPI_6_4_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS     Status;
2450 } EFI_ACPI_6_4_PCCT_GENERIC_SHARED_MEMORY_REGION_HEADER;
2451 
2452 #define EFI_ACPI_6_4_PCCT_SUBSPACE_PLATFORM_INTERRUPT_FLAGS_POLARITY  BIT0
2453 #define EFI_ACPI_6_4_PCCT_SUBSPACE_PLATFORM_INTERRUPT_FLAGS_MODE      BIT1
2454 
2455 ///
2456 /// Type 1 HW-Reduced Communications Subspace Structure
2457 ///
2458 typedef struct {
2459   UINT8                                     Type;
2460   UINT8                                     Length;
2461   UINT32                                    PlatformInterrupt;
2462   UINT8                                     PlatformInterruptFlags;
2463   UINT8                                     Reserved;
2464   UINT64                                    BaseAddress;
2465   UINT64                                    AddressLength;
2466   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    DoorbellRegister;
2467   UINT64                                    DoorbellPreserve;
2468   UINT64                                    DoorbellWrite;
2469   UINT32                                    NominalLatency;
2470   UINT32                                    MaximumPeriodicAccessRate;
2471   UINT16                                    MinimumRequestTurnaroundTime;
2472 } EFI_ACPI_6_4_PCCT_SUBSPACE_1_HW_REDUCED_COMMUNICATIONS;
2473 
2474 ///
2475 /// Type 2 HW-Reduced Communications Subspace Structure
2476 ///
2477 typedef struct {
2478   UINT8                                     Type;
2479   UINT8                                     Length;
2480   UINT32                                    PlatformInterrupt;
2481   UINT8                                     PlatformInterruptFlags;
2482   UINT8                                     Reserved;
2483   UINT64                                    BaseAddress;
2484   UINT64                                    AddressLength;
2485   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    DoorbellRegister;
2486   UINT64                                    DoorbellPreserve;
2487   UINT64                                    DoorbellWrite;
2488   UINT32                                    NominalLatency;
2489   UINT32                                    MaximumPeriodicAccessRate;
2490   UINT16                                    MinimumRequestTurnaroundTime;
2491   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    PlatformInterruptAckRegister;
2492   UINT64                                    PlatformInterruptAckPreserve;
2493   UINT64                                    PlatformInterruptAckWrite;
2494 } EFI_ACPI_6_4_PCCT_SUBSPACE_2_HW_REDUCED_COMMUNICATIONS;
2495 
2496 ///
2497 /// Type 3 Extended PCC Subspace Structure
2498 ///
2499 typedef struct {
2500   UINT8                                     Type;
2501   UINT8                                     Length;
2502   UINT32                                    PlatformInterrupt;
2503   UINT8                                     PlatformInterruptFlags;
2504   UINT8                                     Reserved;
2505   UINT64                                    BaseAddress;
2506   UINT32                                    AddressLength;
2507   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    DoorbellRegister;
2508   UINT64                                    DoorbellPreserve;
2509   UINT64                                    DoorbellWrite;
2510   UINT32                                    NominalLatency;
2511   UINT32                                    MaximumPeriodicAccessRate;
2512   UINT32                                    MinimumRequestTurnaroundTime;
2513   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    PlatformInterruptAckRegister;
2514   UINT64                                    PlatformInterruptAckPreserve;
2515   UINT64                                    PlatformInterruptAckSet;
2516   UINT8                                     Reserved1[8];
2517   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    CommandCompleteCheckRegister;
2518   UINT64                                    CommandCompleteCheckMask;
2519   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    CommandCompleteUpdateRegister;
2520   UINT64                                    CommandCompleteUpdatePreserve;
2521   UINT64                                    CommandCompleteUpdateSet;
2522   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    ErrorStatusRegister;
2523   UINT64                                    ErrorStatusMask;
2524 } EFI_ACPI_6_4_PCCT_SUBSPACE_3_EXTENDED_PCC;
2525 
2526 ///
2527 /// Type 4 Extended PCC Subspace Structure
2528 ///
2529 typedef EFI_ACPI_6_4_PCCT_SUBSPACE_3_EXTENDED_PCC EFI_ACPI_6_4_PCCT_SUBSPACE_4_EXTENDED_PCC;
2530 
2531 #define EFI_ACPI_6_4_PCCT_MASTER_SLAVE_COMMUNICATIONS_CHANNEL_FLAGS_NOTIFY_ON_COMPLETION  BIT0
2532 
2533 typedef struct {
2534   UINT32    Signature;
2535   UINT32    Flags;
2536   UINT32    Length;
2537   UINT32    Command;
2538 } EFI_ACPI_6_4_PCCT_EXTENDED_PCC_SHARED_MEMORY_REGION_HEADER;
2539 
2540 ///
2541 /// Type 5 HW Registers based Communications Subspace Structure
2542 ///
2543 typedef struct {
2544   UINT8                                     Type;
2545   UINT8                                     Length;
2546   UINT16                                    Version;
2547   UINT64                                    BaseAddress;
2548   UINT64                                    SharedMemoryRangeLength;
2549   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    DoorbellRegister;
2550   UINT64                                    DoorbellPreserve;
2551   UINT64                                    DoorbellWrite;
2552   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    CommandCompleteCheckRegister;
2553   UINT64                                    CommandCompleteCheckMask;
2554   EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    ErrorStatusRegister;
2555   UINT64                                    ErrorStatusMask;
2556   UINT32                                    NominalLatency;
2557   UINT32                                    MinimumRequestTurnaroundTime;
2558 } EFI_ACPI_6_4_PCCT_SUBSPACE_5_HW_REGISTERS_COMMUNICATIONS;
2559 
2560 ///
2561 /// Reduced PCC Subspace Shared Memory Region
2562 ///
2563 typedef struct {
2564   UINT32    Signature;
2565   // UINT8       CommunicationSubspace[];
2566 } EFI_6_4_PCCT_REDUCED_PCC_SUBSPACE_SHARED_MEMORY_REGION;
2567 
2568 ///
2569 /// Platform Debug Trigger Table (PDTT)
2570 ///
2571 typedef struct {
2572   EFI_ACPI_DESCRIPTION_HEADER    Header;
2573   UINT8                          TriggerCount;
2574   UINT8                          Reserved[3];
2575   UINT32                         TriggerIdentifierArrayOffset;
2576 } EFI_ACPI_6_4_PLATFORM_DEBUG_TRIGGER_TABLE_HEADER;
2577 
2578 ///
2579 /// PDTT Revision (as defined in ACPI 6.4 spec.)
2580 ///
2581 #define EFI_ACPI_6_4_PLATFORM_DEBUG_TRIGGER_TABLE_REVISION  0x00
2582 
2583 ///
2584 /// PDTT Platform Communication Channel Identifier Structure
2585 ///
2586 typedef struct {
2587   UINT16    SubChannelIdentifer : 8;
2588   UINT16    Runtime             : 1;
2589   UINT16    WaitForCompletion   : 1;
2590   UINT16    TriggerOrder        : 1;
2591   UINT16    Reserved            : 5;
2592 } EFI_ACPI_6_4_PDTT_PCC_IDENTIFIER;
2593 
2594 ///
2595 /// PCC Commands Codes used by Platform Debug Trigger Table
2596 ///
2597 #define EFI_ACPI_6_4_PDTT_PCC_COMMAND_DOORBELL_ONLY    0x00
2598 #define EFI_ACPI_6_4_PDTT_PCC_COMMAND_VENDOR_SPECIFIC  0x01
2599 
2600 ///
2601 /// PDTT Platform Communication Channel
2602 ///
2603 typedef EFI_ACPI_6_4_PCCT_GENERIC_SHARED_MEMORY_REGION_HEADER EFI_ACPI_6_4_PDTT_PCC;
2604 
2605 ///
2606 /// Processor Properties Topology Table (PPTT)
2607 ///
2608 typedef struct {
2609   EFI_ACPI_DESCRIPTION_HEADER    Header;
2610 } EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_HEADER;
2611 
2612 ///
2613 /// PPTT Revision (as defined in ACPI 6.4 spec.)
2614 ///
2615 #define EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_REVISION  0x03
2616 
2617 ///
2618 /// PPTT types
2619 ///
2620 #define EFI_ACPI_6_4_PPTT_TYPE_PROCESSOR  0x00
2621 #define EFI_ACPI_6_4_PPTT_TYPE_CACHE      0x01
2622 
2623 ///
2624 /// PPTT Structure Header
2625 ///
2626 typedef struct {
2627   UINT8    Type;
2628   UINT8    Length;
2629   UINT8    Reserved[2];
2630 } EFI_ACPI_6_4_PPTT_STRUCTURE_HEADER;
2631 
2632 ///
2633 /// For PPTT struct processor flags
2634 ///
2635 #define EFI_ACPI_6_4_PPTT_PACKAGE_NOT_PHYSICAL          0x0
2636 #define EFI_ACPI_6_4_PPTT_PACKAGE_PHYSICAL              0x1
2637 #define EFI_ACPI_6_4_PPTT_PROCESSOR_ID_INVALID          0x0
2638 #define EFI_ACPI_6_4_PPTT_PROCESSOR_ID_VALID            0x1
2639 #define EFI_ACPI_6_4_PPTT_PROCESSOR_IS_NOT_THREAD       0x0
2640 #define EFI_ACPI_6_4_PPTT_PROCESSOR_IS_THREAD           0x1
2641 #define EFI_ACPI_6_4_PPTT_NODE_IS_NOT_LEAF              0x0
2642 #define EFI_ACPI_6_4_PPTT_NODE_IS_LEAF                  0x1
2643 #define EFI_ACPI_6_4_PPTT_IMPLEMENTATION_NOT_IDENTICAL  0x0
2644 #define EFI_ACPI_6_4_PPTT_IMPLEMENTATION_IDENTICAL      0x1
2645 
2646 ///
2647 /// Processor hierarchy node structure flags
2648 ///
2649 typedef struct {
2650   UINT32    PhysicalPackage         : 1;
2651   UINT32    AcpiProcessorIdValid    : 1;
2652   UINT32    ProcessorIsAThread      : 1;
2653   UINT32    NodeIsALeaf             : 1;
2654   UINT32    IdenticalImplementation : 1;
2655   UINT32    Reserved                : 27;
2656 } EFI_ACPI_6_4_PPTT_STRUCTURE_PROCESSOR_FLAGS;
2657 
2658 ///
2659 /// Processor hierarchy node structure
2660 ///
2661 typedef struct {
2662   UINT8                                          Type;
2663   UINT8                                          Length;
2664   UINT8                                          Reserved[2];
2665   EFI_ACPI_6_4_PPTT_STRUCTURE_PROCESSOR_FLAGS    Flags;
2666   UINT32                                         Parent;
2667   UINT32                                         AcpiProcessorId;
2668   UINT32                                         NumberOfPrivateResources;
2669 } EFI_ACPI_6_4_PPTT_STRUCTURE_PROCESSOR;
2670 
2671 ///
2672 /// For PPTT struct cache flags
2673 ///
2674 #define EFI_ACPI_6_4_PPTT_CACHE_SIZE_INVALID       0x0
2675 #define EFI_ACPI_6_4_PPTT_CACHE_SIZE_VALID         0x1
2676 #define EFI_ACPI_6_4_PPTT_NUMBER_OF_SETS_INVALID   0x0
2677 #define EFI_ACPI_6_4_PPTT_NUMBER_OF_SETS_VALID     0x1
2678 #define EFI_ACPI_6_4_PPTT_ASSOCIATIVITY_INVALID    0x0
2679 #define EFI_ACPI_6_4_PPTT_ASSOCIATIVITY_VALID      0x1
2680 #define EFI_ACPI_6_4_PPTT_ALLOCATION_TYPE_INVALID  0x0
2681 #define EFI_ACPI_6_4_PPTT_ALLOCATION_TYPE_VALID    0x1
2682 #define EFI_ACPI_6_4_PPTT_CACHE_TYPE_INVALID       0x0
2683 #define EFI_ACPI_6_4_PPTT_CACHE_TYPE_VALID         0x1
2684 #define EFI_ACPI_6_4_PPTT_WRITE_POLICY_INVALID     0x0
2685 #define EFI_ACPI_6_4_PPTT_WRITE_POLICY_VALID       0x1
2686 #define EFI_ACPI_6_4_PPTT_LINE_SIZE_INVALID        0x0
2687 #define EFI_ACPI_6_4_PPTT_LINE_SIZE_VALID          0x1
2688 #define EFI_ACPI_6_4_PPTT_CACHE_ID_INVALID         0x0
2689 #define EFI_ACPI_6_4_PPTT_CACHE_ID_VALID           0x1
2690 
2691 ///
2692 /// Cache Type Structure flags
2693 ///
2694 typedef struct {
2695   UINT32    SizePropertyValid   : 1;
2696   UINT32    NumberOfSetsValid   : 1;
2697   UINT32    AssociativityValid  : 1;
2698   UINT32    AllocationTypeValid : 1;
2699   UINT32    CacheTypeValid      : 1;
2700   UINT32    WritePolicyValid    : 1;
2701   UINT32    LineSizeValid       : 1;
2702   UINT32    CacheIdValid        : 1;
2703   UINT32    Reserved            : 24;
2704 } EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE_FLAGS;
2705 
2706 ///
2707 /// For cache attributes
2708 ///
2709 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_ALLOCATION_READ             0x0
2710 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_ALLOCATION_WRITE            0x1
2711 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE       0x2
2712 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_CACHE_TYPE_DATA             0x0
2713 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION      0x1
2714 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED          0x2
2715 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK     0x0
2716 #define EFI_ACPI_6_4_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_THROUGH  0x1
2717 
2718 ///
2719 /// Cache Type Structure cache attributes
2720 ///
2721 typedef struct {
2722   UINT8    AllocationType : 2;
2723   UINT8    CacheType      : 2;
2724   UINT8    WritePolicy    : 1;
2725   UINT8    Reserved       : 3;
2726 } EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE_ATTRIBUTES;
2727 
2728 ///
2729 /// Cache Type Structure
2730 ///
2731 typedef struct {
2732   UINT8                                           Type;
2733   UINT8                                           Length;
2734   UINT8                                           Reserved[2];
2735   EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE_FLAGS         Flags;
2736   UINT32                                          NextLevelOfCache;
2737   UINT32                                          Size;
2738   UINT32                                          NumberOfSets;
2739   UINT8                                           Associativity;
2740   EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE_ATTRIBUTES    Attributes;
2741   UINT16                                          LineSize;
2742   UINT32                                          CacheId;
2743 } EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE;
2744 
2745 ///
2746 /// Platform Health Assessment Table (PHAT) Format
2747 ///
2748 typedef struct {
2749   EFI_ACPI_DESCRIPTION_HEADER    Header;
2750   // UINT8                         PlatformTelemetryRecords[];
2751 } EFI_ACPI_6_4_PLATFORM_HEALTH_ASSESSMENT_TABLE;
2752 
2753 #define EFI_ACPI_6_4_PLATFORM_HEALTH_ASSESSMENT_TABLE_REVISION  0x01
2754 
2755 ///
2756 /// PHAT Record Format
2757 ///
2758 typedef struct {
2759   UINT16    PlatformHealthAssessmentRecordType;
2760   UINT16    RecordLength;
2761   UINT8     Revision;
2762   // UINT8   Data[];
2763 } EFI_ACPI_6_4_PHAT_RECORD;
2764 
2765 ///
2766 /// PHAT Record Type Format
2767 ///
2768 #define EFI_ACPI_6_4_PHAT_RECORD_TYPE_FIRMWARE_VERSION_DATA_RECORD  0x0000
2769 #define EFI_ACPI_6_4_PHAT_RECORD_TYPE_FIRMWARE_HEALTH_DATA_RECORD   0x0001
2770 
2771 ///
2772 /// PHAT Version Element
2773 ///
2774 typedef struct {
2775   GUID      ComponentId;
2776   UINT64    VersionValue;
2777   UINT32    ProducerId;
2778 } EFI_ACPI_6_4_PHAT_VERSION_ELEMENT;
2779 
2780 ///
2781 /// PHAT Firmware Version Data Record
2782 ///
2783 typedef struct {
2784   UINT16    PlatformRecordType;
2785   UINT16    RecordLength;
2786   UINT8     Revision;
2787   UINT8     Reserved[3];
2788   UINT32    RecordCount;
2789   // UINT8   PhatVersionElement[];
2790 } EFI_ACPI_6_4_PHAT_FIRMWARE_VERISON_DATA_RECORD;
2791 
2792 #define EFI_ACPI_6_4_PHAT_FIRMWARE_VERSION_DATA_RECORD_REVISION  0x01
2793 
2794 ///
2795 /// Firmware Health Data Record Structure
2796 ///
2797 typedef struct {
2798   UINT16    PlatformRecordType;
2799   UINT16    RecordLength;
2800   UINT8     Revision;
2801   UINT16    Reserved;
2802   UINT8     AmHealthy;
2803   GUID      DeviceSignature;
2804   UINT32    DeviceSpecificDataOffset;
2805   // UINT8   DevicePath[];
2806   // UINT8   DeviceSpecificData[];
2807 } EFI_ACPI_6_4_PHAT_FIRMWARE_HEALTH_DATA_RECORD_STRUCTURE;
2808 
2809 #define EFI_ACPI_6_4_PHAT_FIRMWARE_HEALTH_DATA_RECORD_REVISION  0x01
2810 
2811 ///
2812 /// Firmware Health Data Record device health state
2813 ///
2814 #define EFI_ACPI_6_4_PHAT_FIRMWARE_HEALTH_DATA_RECORD_ERRORS_FOUND     0x00
2815 #define EFI_ACPI_6_4_PHAT_FIRMWARE_HEALTH_DATA_RECORD_NO_ERRORS_FOUND  0x01
2816 #define EFI_ACPI_6_4_PHAT_FIRMWARE_HEALTH_DATA_RECORD_UNKNOWN          0x02
2817 #define EFI_ACPI_6_4_PHAT_FIRMWARE_HEALTH_DATA_RECORD_ADVISORY         0x03
2818 
2819 //
2820 // Known table signatures
2821 //
2822 
2823 ///
2824 /// "RSD PTR " Root System Description Pointer
2825 ///
2826 #define EFI_ACPI_6_4_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE  SIGNATURE_64('R', 'S', 'D', ' ', 'P', 'T', 'R', ' ')
2827 
2828 ///
2829 /// "APIC" Multiple APIC Description Table
2830 ///
2831 #define EFI_ACPI_6_4_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('A', 'P', 'I', 'C')
2832 
2833 ///
2834 /// "BERT" Boot Error Record Table
2835 ///
2836 #define EFI_ACPI_6_4_BOOT_ERROR_RECORD_TABLE_SIGNATURE  SIGNATURE_32('B', 'E', 'R', 'T')
2837 
2838 ///
2839 /// "BGRT" Boot Graphics Resource Table
2840 ///
2841 #define EFI_ACPI_6_4_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE  SIGNATURE_32('B', 'G', 'R', 'T')
2842 
2843 ///
2844 /// "CDIT" Component Distance Information Table
2845 ///
2846 #define EFI_ACPI_6_4_COMPONENT_DISTANCE_INFORMATION_TABLE_SIGNATURE  SIGNATURE_32('C', 'D', 'I', 'T')
2847 
2848 ///
2849 /// "CPEP" Corrected Platform Error Polling Table
2850 ///
2851 #define EFI_ACPI_6_4_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_SIGNATURE  SIGNATURE_32('C', 'P', 'E', 'P')
2852 
2853 ///
2854 /// "CRAT" Component Resource Attribute Table
2855 ///
2856 #define EFI_ACPI_6_4_COMPONENT_RESOURCE_ATTRIBUTE_TABLE_SIGNATURE  SIGNATURE_32('C', 'R', 'A', 'T')
2857 
2858 ///
2859 /// "DSDT" Differentiated System Description Table
2860 ///
2861 #define EFI_ACPI_6_4_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('D', 'S', 'D', 'T')
2862 
2863 ///
2864 /// "ECDT" Embedded Controller Boot Resources Table
2865 ///
2866 #define EFI_ACPI_6_4_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE_SIGNATURE  SIGNATURE_32('E', 'C', 'D', 'T')
2867 
2868 ///
2869 /// "EINJ" Error Injection Table
2870 ///
2871 #define EFI_ACPI_6_4_ERROR_INJECTION_TABLE_SIGNATURE  SIGNATURE_32('E', 'I', 'N', 'J')
2872 
2873 ///
2874 /// "ERST" Error Record Serialization Table
2875 ///
2876 #define EFI_ACPI_6_4_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE  SIGNATURE_32('E', 'R', 'S', 'T')
2877 
2878 ///
2879 /// "FACP" Fixed ACPI Description Table
2880 ///
2881 #define EFI_ACPI_6_4_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('F', 'A', 'C', 'P')
2882 
2883 ///
2884 /// "FACS" Firmware ACPI Control Structure
2885 ///
2886 #define EFI_ACPI_6_4_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE  SIGNATURE_32('F', 'A', 'C', 'S')
2887 
2888 ///
2889 /// "FPDT" Firmware Performance Data Table
2890 ///
2891 #define EFI_ACPI_6_4_FIRMWARE_PERFORMANCE_DATA_TABLE_SIGNATURE  SIGNATURE_32('F', 'P', 'D', 'T')
2892 
2893 ///
2894 /// "GTDT" Generic Timer Description Table
2895 ///
2896 #define EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('G', 'T', 'D', 'T')
2897 
2898 ///
2899 /// "HEST" Hardware Error Source Table
2900 ///
2901 #define EFI_ACPI_6_4_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE  SIGNATURE_32('H', 'E', 'S', 'T')
2902 
2903 ///
2904 /// "HMAT" Heterogeneous Memory Attribute Table
2905 ///
2906 #define EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE  SIGNATURE_32('H', 'M', 'A', 'T')
2907 
2908 ///
2909 /// "MPST" Memory Power State Table
2910 ///
2911 #define EFI_ACPI_6_4_MEMORY_POWER_STATE_TABLE_SIGNATURE  SIGNATURE_32('M', 'P', 'S', 'T')
2912 
2913 ///
2914 /// "MSCT" Maximum System Characteristics Table
2915 ///
2916 #define EFI_ACPI_6_4_MAXIMUM_SYSTEM_CHARACTERISTICS_TABLE_SIGNATURE  SIGNATURE_32('M', 'S', 'C', 'T')
2917 
2918 ///
2919 /// "NFIT" NVDIMM Firmware Interface Table
2920 ///
2921 #define EFI_ACPI_6_4_NVDIMM_FIRMWARE_INTERFACE_TABLE_STRUCTURE_SIGNATURE  SIGNATURE_32('N', 'F', 'I', 'T')
2922 
2923 ///
2924 /// "PDTT" Platform Debug Trigger Table
2925 ///
2926 #define EFI_ACPI_6_4_PLATFORM_DEBUG_TRIGGER_TABLE_STRUCTURE_SIGNATURE  SIGNATURE_32('P', 'D', 'T', 'T')
2927 
2928 ///
2929 /// "PMTT" Platform Memory Topology Table
2930 ///
2931 #define EFI_ACPI_6_4_PLATFORM_MEMORY_TOPOLOGY_TABLE_SIGNATURE  SIGNATURE_32('P', 'M', 'T', 'T')
2932 
2933 ///
2934 /// "PPTT" Processor Properties Topology Table
2935 ///
2936 #define EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE  SIGNATURE_32('P', 'P', 'T', 'T')
2937 
2938 ///
2939 /// "PSDT" Persistent System Description Table
2940 ///
2941 #define EFI_ACPI_6_4_PERSISTENT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('P', 'S', 'D', 'T')
2942 
2943 ///
2944 /// "RASF" ACPI RAS Feature Table
2945 ///
2946 #define EFI_ACPI_6_4_ACPI_RAS_FEATURE_TABLE_SIGNATURE  SIGNATURE_32('R', 'A', 'S', 'F')
2947 
2948 ///
2949 /// "RSDT" Root System Description Table
2950 ///
2951 #define EFI_ACPI_6_4_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('R', 'S', 'D', 'T')
2952 
2953 ///
2954 /// "SBST" Smart Battery Specification Table
2955 ///
2956 #define EFI_ACPI_6_4_SMART_BATTERY_SPECIFICATION_TABLE_SIGNATURE  SIGNATURE_32('S', 'B', 'S', 'T')
2957 
2958 ///
2959 /// "SDEV" Secure DEVices Table
2960 ///
2961 #define EFI_ACPI_6_4_SECURE_DEVICES_TABLE_SIGNATURE  SIGNATURE_32('S', 'D', 'E', 'V')
2962 
2963 ///
2964 /// "SLIT" System Locality Information Table
2965 ///
2966 #define EFI_ACPI_6_4_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE  SIGNATURE_32('S', 'L', 'I', 'T')
2967 
2968 ///
2969 /// "SRAT" System Resource Affinity Table
2970 ///
2971 #define EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE  SIGNATURE_32('S', 'R', 'A', 'T')
2972 
2973 ///
2974 /// "SSDT" Secondary System Description Table
2975 ///
2976 #define EFI_ACPI_6_4_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('S', 'S', 'D', 'T')
2977 
2978 ///
2979 /// "XSDT" Extended System Description Table
2980 ///
2981 #define EFI_ACPI_6_4_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('X', 'S', 'D', 'T')
2982 
2983 ///
2984 /// "BOOT" MS Simple Boot Spec
2985 ///
2986 #define EFI_ACPI_6_4_SIMPLE_BOOT_FLAG_TABLE_SIGNATURE  SIGNATURE_32('B', 'O', 'O', 'T')
2987 
2988 ///
2989 /// "CSRT" MS Core System Resource Table
2990 ///
2991 #define EFI_ACPI_6_4_CORE_SYSTEM_RESOURCE_TABLE_SIGNATURE  SIGNATURE_32('C', 'S', 'R', 'T')
2992 
2993 ///
2994 /// "DBG2" MS Debug Port 2 Spec
2995 ///
2996 #define EFI_ACPI_6_4_DEBUG_PORT_2_TABLE_SIGNATURE  SIGNATURE_32('D', 'B', 'G', '2')
2997 
2998 ///
2999 /// "DBGP" MS Debug Port Spec
3000 ///
3001 #define EFI_ACPI_6_4_DEBUG_PORT_TABLE_SIGNATURE  SIGNATURE_32('D', 'B', 'G', 'P')
3002 
3003 ///
3004 /// "DMAR" DMA Remapping Table
3005 ///
3006 #define EFI_ACPI_6_4_DMA_REMAPPING_TABLE_SIGNATURE  SIGNATURE_32('D', 'M', 'A', 'R')
3007 
3008 ///
3009 /// "DRTM" Dynamic Root of Trust for Measurement Table
3010 ///
3011 #define EFI_ACPI_6_4_DYNAMIC_ROOT_OF_TRUST_FOR_MEASUREMENT_TABLE_SIGNATURE  SIGNATURE_32('D', 'R', 'T', 'M')
3012 
3013 ///
3014 /// "ETDT" Event Timer Description Table
3015 ///
3016 #define EFI_ACPI_6_4_EVENT_TIMER_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('E', 'T', 'D', 'T')
3017 
3018 ///
3019 /// "HPET" IA-PC High Precision Event Timer Table
3020 ///
3021 #define EFI_ACPI_6_4_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE  SIGNATURE_32('H', 'P', 'E', 'T')
3022 
3023 ///
3024 /// "iBFT" iSCSI Boot Firmware Table
3025 ///
3026 #define EFI_ACPI_6_4_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE  SIGNATURE_32('i', 'B', 'F', 'T')
3027 
3028 ///
3029 /// "IORT" I/O Remapping Table
3030 ///
3031 #define EFI_ACPI_6_4_IO_REMAPPING_TABLE_SIGNATURE  SIGNATURE_32('I', 'O', 'R', 'T')
3032 
3033 ///
3034 /// "IVRS" I/O Virtualization Reporting Structure
3035 ///
3036 #define EFI_ACPI_6_4_IO_VIRTUALIZATION_REPORTING_STRUCTURE_SIGNATURE  SIGNATURE_32('I', 'V', 'R', 'S')
3037 
3038 ///
3039 /// "LPIT" Low Power Idle Table
3040 ///
3041 #define EFI_ACPI_6_4_LOW_POWER_IDLE_TABLE_STRUCTURE_SIGNATURE  SIGNATURE_32('L', 'P', 'I', 'T')
3042 
3043 ///
3044 /// "MCFG" PCI Express Memory Mapped Configuration Space Base Address Description Table
3045 ///
3046 #define EFI_ACPI_6_4_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE  SIGNATURE_32('M', 'C', 'F', 'G')
3047 
3048 ///
3049 /// "MCHI" Management Controller Host Interface Table
3050 ///
3051 #define EFI_ACPI_6_4_MANAGEMENT_CONTROLLER_HOST_INTERFACE_TABLE_SIGNATURE  SIGNATURE_32('M', 'C', 'H', 'I')
3052 
3053 ///
3054 /// "MSDM" MS Data Management Table
3055 ///
3056 #define EFI_ACPI_6_4_DATA_MANAGEMENT_TABLE_SIGNATURE  SIGNATURE_32('M', 'S', 'D', 'M')
3057 
3058 ///
3059 /// "PCCT" Platform Communications Channel Table
3060 ///
3061 #define EFI_ACPI_6_4_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE  SIGNATURE_32('P', 'C', 'C', 'T')
3062 
3063 ///
3064 /// "PHAT" Platform Health Assessment Table
3065 ///
3066 #define EFI_ACPI_6_4_PLATFORM_HEALTH_ASSESSMENT_TABLE_SIGNATURE  SIGNATURE_32('P', 'H', 'A', 'T')
3067 
3068 ///
3069 /// "SDEI" Software Delegated Exceptions Interface Table
3070 ///
3071 #define EFI_ACPI_6_4_SOFTWARE_DELEGATED_EXCEPTIONS_INTERFACE_TABLE_SIGNATURE  SIGNATURE_32('S', 'D', 'E', 'I')
3072 
3073 ///
3074 /// "SLIC" MS Software Licensing Table Specification
3075 ///
3076 #define EFI_ACPI_6_4_SOFTWARE_LICENSING_TABLE_SIGNATURE  SIGNATURE_32('S', 'L', 'I', 'C')
3077 
3078 ///
3079 /// "SPCR" Serial Port Concole Redirection Table
3080 ///
3081 #define EFI_ACPI_6_4_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE  SIGNATURE_32('S', 'P', 'C', 'R')
3082 
3083 ///
3084 /// "SPMI" Server Platform Management Interface Table
3085 ///
3086 #define EFI_ACPI_6_4_SERVER_PLATFORM_MANAGEMENT_INTERFACE_TABLE_SIGNATURE  SIGNATURE_32('S', 'P', 'M', 'I')
3087 
3088 ///
3089 /// "STAO" _STA Override Table
3090 ///
3091 #define EFI_ACPI_6_4_STA_OVERRIDE_TABLE_SIGNATURE  SIGNATURE_32('S', 'T', 'A', 'O')
3092 
3093 ///
3094 /// "TCPA" Trusted Computing Platform Alliance Capabilities Table
3095 ///
3096 #define EFI_ACPI_6_4_TRUSTED_COMPUTING_PLATFORM_ALLIANCE_CAPABILITIES_TABLE_SIGNATURE  SIGNATURE_32('T', 'C', 'P', 'A')
3097 
3098 ///
3099 /// "TPM2" Trusted Computing Platform 1 Table
3100 ///
3101 #define EFI_ACPI_6_4_TRUSTED_COMPUTING_PLATFORM_2_TABLE_SIGNATURE  SIGNATURE_32('T', 'P', 'M', '2')
3102 
3103 ///
3104 /// "UEFI" UEFI ACPI Data Table
3105 ///
3106 #define EFI_ACPI_6_4_UEFI_ACPI_DATA_TABLE_SIGNATURE  SIGNATURE_32('U', 'E', 'F', 'I')
3107 
3108 ///
3109 /// "WAET" Windows ACPI Emulated Devices Table
3110 ///
3111 #define EFI_ACPI_6_4_WINDOWS_ACPI_EMULATED_DEVICES_TABLE_SIGNATURE  SIGNATURE_32('W', 'A', 'E', 'T')
3112 
3113 ///
3114 /// "WDAT" Watchdog Action Table
3115 ///
3116 #define EFI_ACPI_6_4_WATCHDOG_ACTION_TABLE_SIGNATURE  SIGNATURE_32('W', 'D', 'A', 'T')
3117 
3118 ///
3119 /// "WDRT" Watchdog Resource Table
3120 ///
3121 #define EFI_ACPI_6_4_WATCHDOG_RESOURCE_TABLE_SIGNATURE  SIGNATURE_32('W', 'D', 'R', 'T')
3122 
3123 ///
3124 /// "WPBT" MS Platform Binary Table
3125 ///
3126 #define EFI_ACPI_6_4_PLATFORM_BINARY_TABLE_SIGNATURE  SIGNATURE_32('W', 'P', 'B', 'T')
3127 
3128 ///
3129 /// "WSMT" Windows SMM Security Mitigation Table
3130 ///
3131 #define EFI_ACPI_6_4_WINDOWS_SMM_SECURITY_MITIGATION_TABLE_SIGNATURE  SIGNATURE_32('W', 'S', 'M', 'T')
3132 
3133 ///
3134 /// "XENV" Xen Project Table
3135 ///
3136 #define EFI_ACPI_6_4_XEN_PROJECT_TABLE_SIGNATURE  SIGNATURE_32('X', 'E', 'N', 'V')
3137 
3138 #pragma pack()
3139 
3140 #endif
3141