1/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2/******************************************************************************
3 *
4 * Name: actbl2.h - ACPI Table Definitions
5 *
6 * Copyright (C) 2000 - 2025, Intel Corp.
7 *
8 *****************************************************************************/
9
10#ifndef __ACTBL2_H__
11#define __ACTBL2_H__
12
13/*******************************************************************************
14 *
15 * Additional ACPI Tables (2)
16 *
17 * These tables are not consumed directly by the ACPICA subsystem, but are
18 * included here to support device drivers and the AML disassembler.
19 *
20 ******************************************************************************/
21
22/*
23 * Values for description table header signatures for tables defined in this
24 * file. Useful because they make it more difficult to inadvertently type in
25 * the wrong signature.
26 */
27#define ACPI_SIG_AGDI "AGDI" /* Arm Generic Diagnostic Dump and Reset Device Interface */
28#define ACPI_SIG_APMT "APMT" /* Arm Performance Monitoring Unit table */
29#define ACPI_SIG_BDAT "BDAT" /* BIOS Data ACPI Table */
30#define ACPI_SIG_CCEL "CCEL" /* CC Event Log Table */
31#define ACPI_SIG_CDAT "CDAT" /* Coherent Device Attribute Table */
32#define ACPI_SIG_ERDT "ERDT" /* Enhanced Resource Director Technology */
33#define ACPI_SIG_IORT "IORT" /* IO Remapping Table */
34#define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */
35#define ACPI_SIG_LPIT "LPIT" /* Low Power Idle Table */
36#define ACPI_SIG_MADT "APIC" /* Multiple APIC Description Table */
37#define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */
38#define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */
39#define ACPI_SIG_MPAM "MPAM" /* Memory System Resource Partitioning and Monitoring Table */
40#define ACPI_SIG_MPST "MPST" /* Memory Power State Table */
41#define ACPI_SIG_MRRM "MRRM" /* Memory Range and Region Mapping table */
42#define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */
43#define ACPI_SIG_NFIT "NFIT" /* NVDIMM Firmware Interface Table */
44#define ACPI_SIG_NHLT "NHLT" /* Non HD Audio Link Table */
45#define ACPI_SIG_PCCT "PCCT" /* Platform Communications Channel Table */
46#define ACPI_SIG_PDTT "PDTT" /* Platform Debug Trigger Table */
47#define ACPI_SIG_PHAT "PHAT" /* Platform Health Assessment Table */
48#define ACPI_SIG_PMTT "PMTT" /* Platform Memory Topology Table */
49#define ACPI_SIG_PPTT "PPTT" /* Processor Properties Topology Table */
50#define ACPI_SIG_PRMT "PRMT" /* Platform Runtime Mechanism Table */
51#define ACPI_SIG_RASF "RASF" /* RAS Feature table */
52#define ACPI_SIG_RAS2 "RAS2" /* RAS2 Feature table */
53#define ACPI_SIG_RGRT "RGRT" /* Regulatory Graphics Resource Table */
54#define ACPI_SIG_RHCT "RHCT" /* RISC-V Hart Capabilities Table */
55#define ACPI_SIG_RIMT "RIMT" /* RISC-V IO Mapping Table */
56#define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */
57#define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */
58#define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */
59#define ACPI_SIG_SVKL "SVKL" /* Storage Volume Key Location Table */
60#define ACPI_SIG_TDEL "TDEL" /* TD Event Log Table */
61
62/*
63 * All tables must be byte-packed to match the ACPI specification, since
64 * the tables are provided by the system BIOS.
65 */
66#pragma pack(1)
67
68/*
69 * Note: C bitfields are not used for this reason:
70 *
71 * "Bitfields are great and easy to read, but unfortunately the C language
72 * does not specify the layout of bitfields in memory, which means they are
73 * essentially useless for dealing with packed data in on-disk formats or
74 * binary wire protocols." (Or ACPI tables and buffers.) "If you ask me,
75 * this decision was a design error in C. Ritchie could have picked an order
76 * and stuck with it." Norman Ramsey.
77 * See http://stackoverflow.com/a/1053662/41661
78 */
79
80/*******************************************************************************
81 *
82 * AEST - Arm Error Source Table
83 *
84 * Conforms to: ACPI for the Armv8 RAS Extensions 1.1(Sep 2020) and
85 * 2.0(May 2023) Platform Design Document.
86 *
87 ******************************************************************************/
88
89struct acpi_table_aest {
90 struct acpi_table_header header;
91};
92
93/* Common Subtable header - one per Node Structure (Subtable) */
94
95struct acpi_aest_hdr {
96 u8 type;
97 u16 length;
98 u8 reserved;
99 u32 node_specific_offset;
100 u32 node_interface_offset;
101 u32 node_interrupt_offset;
102 u32 node_interrupt_count;
103 u64 timestamp_rate;
104 u64 reserved1;
105 u64 error_injection_rate;
106};
107
108/* Values for Type above */
109
110#define ACPI_AEST_PROCESSOR_ERROR_NODE 0
111#define ACPI_AEST_MEMORY_ERROR_NODE 1
112#define ACPI_AEST_SMMU_ERROR_NODE 2
113#define ACPI_AEST_VENDOR_ERROR_NODE 3
114#define ACPI_AEST_GIC_ERROR_NODE 4
115#define ACPI_AEST_PCIE_ERROR_NODE 5
116#define ACPI_AEST_PROXY_ERROR_NODE 6
117#define ACPI_AEST_NODE_TYPE_RESERVED 7 /* 7 and above are reserved */
118
119/*
120 * AEST subtables (Error nodes)
121 */
122
123/* 0: Processor Error */
124
125typedef struct acpi_aest_processor {
126 u32 processor_id;
127 u8 resource_type;
128 u8 reserved;
129 u8 flags;
130 u8 revision;
131 u64 processor_affinity;
132
133} acpi_aest_processor;
134
135/* Values for resource_type above, related structs below */
136
137#define ACPI_AEST_CACHE_RESOURCE 0
138#define ACPI_AEST_TLB_RESOURCE 1
139#define ACPI_AEST_GENERIC_RESOURCE 2
140#define ACPI_AEST_RESOURCE_RESERVED 3 /* 3 and above are reserved */
141
142/* 0R: Processor Cache Resource Substructure */
143
144typedef struct acpi_aest_processor_cache {
145 u32 cache_reference;
146 u32 reserved;
147
148} acpi_aest_processor_cache;
149
150/* Values for cache_type above */
151
152#define ACPI_AEST_CACHE_DATA 0
153#define ACPI_AEST_CACHE_INSTRUCTION 1
154#define ACPI_AEST_CACHE_UNIFIED 2
155#define ACPI_AEST_CACHE_RESERVED 3 /* 3 and above are reserved */
156
157/* 1R: Processor TLB Resource Substructure */
158
159typedef struct acpi_aest_processor_tlb {
160 u32 tlb_level;
161 u32 reserved;
162
163} acpi_aest_processor_tlb;
164
165/* 2R: Processor Generic Resource Substructure */
166
167typedef struct acpi_aest_processor_generic {
168 u32 resource;
169
170} acpi_aest_processor_generic;
171
172/* 1: Memory Error */
173
174typedef struct acpi_aest_memory {
175 u32 srat_proximity_domain;
176
177} acpi_aest_memory;
178
179/* 2: Smmu Error */
180
181typedef struct acpi_aest_smmu {
182 u32 iort_node_reference;
183 u32 subcomponent_reference;
184
185} acpi_aest_smmu;
186
187/* 3: Vendor Defined */
188
189typedef struct acpi_aest_vendor {
190 u32 acpi_hid;
191 u32 acpi_uid;
192 u8 vendor_specific_data[16];
193
194} acpi_aest_vendor;
195
196struct acpi_aest_vendor_v2 {
197 char acpi_hid[8];
198 u32 acpi_uid;
199 u8 vendor_specific_data[16];
200};
201
202/* 4: Gic Error */
203
204typedef struct acpi_aest_gic {
205 u32 interface_type;
206 u32 instance_id;
207
208} acpi_aest_gic;
209
210/* Values for interface_type above */
211
212#define ACPI_AEST_GIC_CPU 0
213#define ACPI_AEST_GIC_DISTRIBUTOR 1
214#define ACPI_AEST_GIC_REDISTRIBUTOR 2
215#define ACPI_AEST_GIC_ITS 3
216#define ACPI_AEST_GIC_RESERVED 4 /* 4 and above are reserved */
217
218/* 5: PCIe Error */
219
220struct acpi_aest_pcie {
221 u32 iort_node_reference;
222};
223
224/* 6: Proxy Error */
225
226struct acpi_aest_proxy {
227 u64 node_address;
228};
229
230/* Node Interface Structure */
231
232typedef struct acpi_aest_node_interface {
233 u8 type;
234 u8 reserved[3];
235 u32 flags;
236 u64 address;
237 u32 error_record_index;
238 u32 error_record_count;
239 u64 error_record_implemented;
240 u64 error_status_reporting;
241 u64 addressing_mode;
242
243} acpi_aest_node_interface;
244
245/* Node Interface Structure V2 */
246
247struct acpi_aest_node_interface_header {
248 u8 type;
249 u8 group_format;
250 u8 reserved[2];
251 u32 flags;
252 u64 address;
253 u32 error_record_index;
254 u32 error_record_count;
255};
256
257#define ACPI_AEST_NODE_GROUP_FORMAT_4K 0
258#define ACPI_AEST_NODE_GROUP_FORMAT_16K 1
259#define ACPI_AEST_NODE_GROUP_FORMAT_64K 2
260
261struct acpi_aest_node_interface_common {
262 u32 error_node_device;
263 u32 processor_affinity;
264 u64 error_group_register_base;
265 u64 fault_inject_register_base;
266 u64 interrupt_config_register_base;
267};
268
269struct acpi_aest_node_interface_4k {
270 u64 error_record_implemented;
271 u64 error_status_reporting;
272 u64 addressing_mode;
273 struct acpi_aest_node_interface_common common;
274};
275
276struct acpi_aest_node_interface_16k {
277 u64 error_record_implemented[4];
278 u64 error_status_reporting[4];
279 u64 addressing_mode[4];
280 struct acpi_aest_node_interface_common common;
281};
282
283struct acpi_aest_node_interface_64k {
284 u64 error_record_implemented[14];
285 u64 error_status_reporting[14];
286 u64 addressing_mode[14];
287 struct acpi_aest_node_interface_common common;
288};
289
290/* Values for Type field above */
291
292#define ACPI_AEST_NODE_SYSTEM_REGISTER 0
293#define ACPI_AEST_NODE_MEMORY_MAPPED 1
294#define ACPI_AEST_NODE_SINGLE_RECORD_MEMORY_MAPPED 2
295#define ACPI_AEST_XFACE_RESERVED 3 /* 2 and above are reserved */
296
297/* Node Interrupt Structure */
298
299typedef struct acpi_aest_node_interrupt {
300 u8 type;
301 u8 reserved[2];
302 u8 flags;
303 u32 gsiv;
304 u8 iort_id;
305 u8 reserved1[3];
306
307} acpi_aest_node_interrupt;
308
309/* Node Interrupt Structure V2 */
310
311struct acpi_aest_node_interrupt_v2 {
312 u8 type;
313 u8 reserved[2];
314 u8 flags;
315 u32 gsiv;
316 u8 reserved1[4];
317};
318
319/* Values for Type field above */
320
321#define ACPI_AEST_NODE_FAULT_HANDLING 0
322#define ACPI_AEST_NODE_ERROR_RECOVERY 1
323#define ACPI_AEST_XRUPT_RESERVED 2 /* 2 and above are reserved */
324
325/*******************************************************************************
326 * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface
327 *
328 * Conforms to "ACPI for Arm Components 1.1, Platform Design Document"
329 * ARM DEN0093 v1.1
330 *
331 ******************************************************************************/
332struct acpi_table_agdi {
333 struct acpi_table_header header; /* Common ACPI table header */
334 u8 flags;
335 u8 reserved[3];
336 u32 sdei_event;
337 u32 gsiv;
338};
339
340/* Mask for Flags field above */
341
342#define ACPI_AGDI_SIGNALING_MODE (1)
343
344/*******************************************************************************
345 *
346 * APMT - ARM Performance Monitoring Unit Table
347 *
348 * Conforms to:
349 * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
350 * ARM DEN0117 v1.0 November 25, 2021
351 *
352 ******************************************************************************/
353
354struct acpi_table_apmt {
355 struct acpi_table_header header; /* Common ACPI table header */
356};
357
358#define ACPI_APMT_NODE_ID_LENGTH 4
359
360/*
361 * APMT subtables
362 */
363struct acpi_apmt_node {
364 u16 length;
365 u8 flags;
366 u8 type;
367 u32 id;
368 u64 inst_primary;
369 u32 inst_secondary;
370 u64 base_address0;
371 u64 base_address1;
372 u32 ovflw_irq;
373 u32 reserved;
374 u32 ovflw_irq_flags;
375 u32 proc_affinity;
376 u32 impl_id;
377};
378
379/* Masks for Flags field above */
380
381#define ACPI_APMT_FLAGS_DUAL_PAGE (1<<0)
382#define ACPI_APMT_FLAGS_AFFINITY (1<<1)
383#define ACPI_APMT_FLAGS_ATOMIC (1<<2)
384
385/* Values for Flags dual page field above */
386
387#define ACPI_APMT_FLAGS_DUAL_PAGE_NSUPP (0<<0)
388#define ACPI_APMT_FLAGS_DUAL_PAGE_SUPP (1<<0)
389
390/* Values for Flags processor affinity field above */
391#define ACPI_APMT_FLAGS_AFFINITY_PROC (0<<1)
392#define ACPI_APMT_FLAGS_AFFINITY_PROC_CONTAINER (1<<1)
393
394/* Values for Flags 64-bit atomic field above */
395#define ACPI_APMT_FLAGS_ATOMIC_NSUPP (0<<2)
396#define ACPI_APMT_FLAGS_ATOMIC_SUPP (1<<2)
397
398/* Values for Type field above */
399
400enum acpi_apmt_node_type {
401 ACPI_APMT_NODE_TYPE_MC = 0x00,
402 ACPI_APMT_NODE_TYPE_SMMU = 0x01,
403 ACPI_APMT_NODE_TYPE_PCIE_ROOT = 0x02,
404 ACPI_APMT_NODE_TYPE_ACPI = 0x03,
405 ACPI_APMT_NODE_TYPE_CACHE = 0x04,
406 ACPI_APMT_NODE_TYPE_COUNT
407};
408
409/* Masks for ovflw_irq_flags field above */
410
411#define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE (1<<0)
412#define ACPI_APMT_OVFLW_IRQ_FLAGS_TYPE (1<<1)
413
414/* Values for ovflw_irq_flags mode field above */
415
416#define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE_LEVEL (0<<0)
417#define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE_EDGE (1<<0)
418
419/* Values for ovflw_irq_flags type field above */
420
421#define ACPI_APMT_OVFLW_IRQ_FLAGS_TYPE_WIRED (0<<1)
422
423/*******************************************************************************
424 *
425 * BDAT - BIOS Data ACPI Table
426 *
427 * Conforms to "BIOS Data ACPI Table", Interface Specification v4.0 Draft 5
428 * Nov 2020
429 *
430 ******************************************************************************/
431
432struct acpi_table_bdat {
433 struct acpi_table_header header;
434 struct acpi_generic_address gas;
435};
436
437/*******************************************************************************
438 *
439 * CCEL - CC-Event Log
440 * From: "Guest-Host-Communication Interface (GHCI) for Intel
441 * Trust Domain Extensions (Intel TDX)". Feb 2022
442 *
443 ******************************************************************************/
444
445struct acpi_table_ccel {
446 struct acpi_table_header header; /* Common ACPI table header */
447 u8 CCtype;
448 u8 Ccsub_type;
449 u16 reserved;
450 u64 log_area_minimum_length;
451 u64 log_area_start_address;
452};
453
454/*******************************************************************************
455 *
456 * ERDT - Enhanced Resource Director Technology (ERDT) table
457 *
458 * Conforms to "Intel Resource Director Technology Architecture Specification"
459 * Version 1.1, January 2025
460 *
461 ******************************************************************************/
462
463struct acpi_table_erdt {
464 struct acpi_table_header header; /* Common ACPI table header */
465 u32 max_clos; /* Maximum classes of service */
466 u8 reserved[24];
467 u8 erdt_substructures[];
468};
469
470/* Values for subtable type in struct acpi_subtbl_hdr_16 */
471
472enum acpi_erdt_type {
473 ACPI_ERDT_TYPE_RMDD = 0,
474 ACPI_ERDT_TYPE_CACD = 1,
475 ACPI_ERDT_TYPE_DACD = 2,
476 ACPI_ERDT_TYPE_CMRC = 3,
477 ACPI_ERDT_TYPE_MMRC = 4,
478 ACPI_ERDT_TYPE_MARC = 5,
479 ACPI_ERDT_TYPE_CARC = 6,
480 ACPI_ERDT_TYPE_CMRD = 7,
481 ACPI_ERDT_TYPE_IBRD = 8,
482 ACPI_ERDT_TYPE_IBAD = 9,
483 ACPI_ERDT_TYPE_CARD = 10,
484 ACPI_ERDT_TYPE_RESERVED = 11 /* 11 and above are reserved */
485};
486
487/*
488 * ERDT Subtables, correspond to Type in struct acpi_subtbl_hdr_16
489 */
490
491/* 0: RMDD - Resource Management Domain Description */
492
493struct acpi_erdt_rmdd {
494 struct acpi_subtbl_hdr_16 header;
495 u16 flags;
496 u16 IO_l3_slices; /* Number of slices in IO cache */
497 u8 IO_l3_sets; /* Number of sets in IO cache */
498 u8 IO_l3_ways; /* Number of ways in IO cache */
499 u64 reserved;
500 u16 domain_id; /* Unique domain ID */
501 u32 max_rmid; /* Maximun RMID supported */
502 u64 creg_base; /* Control Register Base Address */
503 u16 creg_size; /* Control Register Size (4K pages) */
504 u8 rmdd_structs[];
505};
506
507/* 1: CACD - CPU Agent Collection Description */
508
509struct acpi_erdt_cacd {
510 struct acpi_subtbl_hdr_16 header;
511 u16 reserved;
512 u16 domain_id; /* Unique domain ID */
513 u32 X2APICIDS[];
514};
515
516/* 2: DACD - Device Agent Collection Description */
517
518struct acpi_erdt_dacd {
519 struct acpi_subtbl_hdr_16 header;
520 u16 reserved;
521 u16 domain_id; /* Unique domain ID */
522 u8 dev_paths[];
523};
524
525struct acpi_erdt_dacd_dev_paths {
526 struct acpi_subtable_header header;
527 u16 segment;
528 u8 reserved;
529 u8 start_bus;
530 u8 path[];
531};
532
533/* 3: CMRC - Cache Monitoring Registers for CPU Agents */
534
535struct acpi_erdt_cmrc {
536 struct acpi_subtbl_hdr_16 header;
537 u32 reserved1;
538 u32 flags;
539 u8 index_fn;
540 u8 reserved2[11];
541 u64 cmt_reg_base;
542 u32 cmt_reg_size;
543 u16 clump_size;
544 u16 clump_stride;
545 u64 up_scale;
546};
547
548/* 4: MMRC - Memory-bandwidth Monitoring Registers for CPU Agents */
549
550struct acpi_erdt_mmrc {
551 struct acpi_subtbl_hdr_16 header;
552 u32 reserved1;
553 u32 flags;
554 u8 index_fn;
555 u8 reserved2[11];
556 u64 reg_base;
557 u32 reg_size;
558 u8 counter_width;
559 u64 up_scale;
560 u8 reserved3[7];
561 u32 corr_factor_list_len;
562 u32 corr_factor_list[];
563};
564
565/* 5: MARC - Memory-bandwidth Allocation Registers for CPU Agents */
566
567struct acpi_erdt_marc {
568 struct acpi_subtbl_hdr_16 header;
569 u16 reserved1;
570 u16 flags;
571 u8 index_fn;
572 u8 reserved2[7];
573 u64 reg_base_opt;
574 u64 reg_base_min;
575 u64 reg_base_max;
576 u32 mba_reg_size;
577 u32 mba_ctrl_range;
578};
579
580/* 6: CARC - Cache Allocation Registers for CPU Agents */
581
582struct acpi_erdt_carc {
583 struct acpi_subtbl_hdr_16 header;
584};
585
586/* 7: CMRD - Cache Monitoring Registers for Device Agents */
587
588struct acpi_erdt_cmrd {
589 struct acpi_subtbl_hdr_16 header;
590 u32 reserved1;
591 u32 flags;
592 u8 index_fn;
593 u8 reserved2[11];
594 u64 reg_base;
595 u32 reg_size;
596 u16 cmt_reg_off;
597 u16 cmt_clump_size;
598 u64 up_scale;
599};
600
601/* 8: IBRD - Cache Monitoring Registers for Device Agents */
602
603struct acpi_erdt_ibrd {
604 struct acpi_subtbl_hdr_16 header;
605 u32 reserved1;
606 u32 flags;
607 u8 index_fn;
608 u8 reserved2[11];
609 u64 reg_base;
610 u32 reg_size;
611 u16 total_bw_offset;
612 u16 Iomiss_bw_offset;
613 u16 total_bw_clump;
614 u16 Iomiss_bw_clump;
615 u8 reserved3[7];
616 u8 counter_width;
617 u64 up_scale;
618 u32 corr_factor_list_len;
619 u32 corr_factor_list[];
620};
621
622/* 9: IBAD - IO bandwidth Allocation Registers for device agents */
623
624struct acpi_erdt_ibad {
625 struct acpi_subtbl_hdr_16 header;
626};
627
628/* 10: CARD - IO bandwidth Allocation Registers for Device Agents */
629
630struct acpi_erdt_card {
631 struct acpi_subtbl_hdr_16 header;
632 u32 reserved1;
633 u32 flags;
634 u32 contention_mask;
635 u8 index_fn;
636 u8 reserved2[7];
637 u64 reg_base;
638 u32 reg_size;
639 u16 cat_reg_offset;
640 u16 cat_reg_block_size;
641};
642
643/*******************************************************************************
644 *
645 * IORT - IO Remapping Table
646 *
647 * Conforms to "IO Remapping Table System Software on ARM Platforms",
648 * Document number: ARM DEN 0049E.f, Apr 2024
649 *
650 ******************************************************************************/
651
652struct acpi_table_iort {
653 struct acpi_table_header header;
654 u32 node_count;
655 u32 node_offset;
656 u32 reserved;
657};
658
659/*
660 * IORT subtables
661 */
662struct acpi_iort_node {
663 u8 type;
664 u16 length;
665 u8 revision;
666 u32 identifier;
667 u32 mapping_count;
668 u32 mapping_offset;
669 char node_data[];
670};
671
672/* Values for subtable Type above */
673
674enum acpi_iort_node_type {
675 ACPI_IORT_NODE_ITS_GROUP = 0x00,
676 ACPI_IORT_NODE_NAMED_COMPONENT = 0x01,
677 ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 0x02,
678 ACPI_IORT_NODE_SMMU = 0x03,
679 ACPI_IORT_NODE_SMMU_V3 = 0x04,
680 ACPI_IORT_NODE_PMCG = 0x05,
681 ACPI_IORT_NODE_RMR = 0x06,
682};
683
684struct acpi_iort_id_mapping {
685 u32 input_base; /* Lowest value in input range */
686 u32 id_count; /* Number of IDs */
687 u32 output_base; /* Lowest value in output range */
688 u32 output_reference; /* A reference to the output node */
689 u32 flags;
690};
691
692/* Masks for Flags field above for IORT subtable */
693
694#define ACPI_IORT_ID_SINGLE_MAPPING (1)
695
696struct acpi_iort_memory_access {
697 u32 cache_coherency;
698 u8 hints;
699 u16 reserved;
700 u8 memory_flags;
701};
702
703/* Values for cache_coherency field above */
704
705#define ACPI_IORT_NODE_COHERENT 0x00000001 /* The device node is fully coherent */
706#define ACPI_IORT_NODE_NOT_COHERENT 0x00000000 /* The device node is not coherent */
707
708/* Masks for Hints field above */
709
710#define ACPI_IORT_HT_TRANSIENT (1)
711#define ACPI_IORT_HT_WRITE (1<<1)
712#define ACPI_IORT_HT_READ (1<<2)
713#define ACPI_IORT_HT_OVERRIDE (1<<3)
714
715/* Masks for memory_flags field above */
716
717#define ACPI_IORT_MF_COHERENCY (1)
718#define ACPI_IORT_MF_ATTRIBUTES (1<<1)
719#define ACPI_IORT_MF_CANWBS (1<<2)
720
721/*
722 * IORT node specific subtables
723 */
724struct acpi_iort_its_group {
725 u32 its_count;
726 u32 identifiers[]; /* GIC ITS identifier array */
727};
728
729struct acpi_iort_named_component {
730 u32 node_flags;
731 u64 memory_properties; /* Memory access properties */
732 u8 memory_address_limit; /* Memory address size limit */
733 char device_name[]; /* Path of namespace object */
734};
735
736/* Masks for Flags field above */
737
738#define ACPI_IORT_NC_STALL_SUPPORTED (1)
739#define ACPI_IORT_NC_PASID_BITS (31<<1)
740
741struct acpi_iort_root_complex {
742 u64 memory_properties; /* Memory access properties */
743 u32 ats_attribute;
744 u32 pci_segment_number;
745 u8 memory_address_limit; /* Memory address size limit */
746 u16 pasid_capabilities; /* PASID Capabilities */
747 u8 reserved[]; /* Reserved, must be zero */
748};
749
750/* Masks for ats_attribute field above */
751
752#define ACPI_IORT_ATS_SUPPORTED (1) /* The root complex ATS support */
753#define ACPI_IORT_PRI_SUPPORTED (1<<1) /* The root complex PRI support */
754#define ACPI_IORT_PASID_FWD_SUPPORTED (1<<2) /* The root complex PASID forward support */
755
756/* Masks for pasid_capabilities field above */
757#define ACPI_IORT_PASID_MAX_WIDTH (0x1F) /* Bits 0-4 */
758
759struct acpi_iort_smmu {
760 u64 base_address; /* SMMU base address */
761 u64 span; /* Length of memory range */
762 u32 model;
763 u32 flags;
764 u32 global_interrupt_offset;
765 u32 context_interrupt_count;
766 u32 context_interrupt_offset;
767 u32 pmu_interrupt_count;
768 u32 pmu_interrupt_offset;
769 u64 interrupts[]; /* Interrupt array */
770};
771
772/* Values for Model field above */
773
774#define ACPI_IORT_SMMU_V1 0x00000000 /* Generic SMMUv1 */
775#define ACPI_IORT_SMMU_V2 0x00000001 /* Generic SMMUv2 */
776#define ACPI_IORT_SMMU_CORELINK_MMU400 0x00000002 /* ARM Corelink MMU-400 */
777#define ACPI_IORT_SMMU_CORELINK_MMU500 0x00000003 /* ARM Corelink MMU-500 */
778#define ACPI_IORT_SMMU_CORELINK_MMU401 0x00000004 /* ARM Corelink MMU-401 */
779#define ACPI_IORT_SMMU_CAVIUM_THUNDERX 0x00000005 /* Cavium thunder_x SMMUv2 */
780
781/* Masks for Flags field above */
782
783#define ACPI_IORT_SMMU_DVM_SUPPORTED (1)
784#define ACPI_IORT_SMMU_COHERENT_WALK (1<<1)
785
786/* Global interrupt format */
787
788struct acpi_iort_smmu_gsi {
789 u32 nsg_irpt;
790 u32 nsg_irpt_flags;
791 u32 nsg_cfg_irpt;
792 u32 nsg_cfg_irpt_flags;
793};
794
795struct acpi_iort_smmu_v3 {
796 u64 base_address; /* SMMUv3 base address */
797 u32 flags;
798 u32 reserved;
799 u64 vatos_address;
800 u32 model;
801 u32 event_gsiv;
802 u32 pri_gsiv;
803 u32 gerr_gsiv;
804 u32 sync_gsiv;
805 u32 pxm;
806 u32 id_mapping_index;
807};
808
809/* Values for Model field above */
810
811#define ACPI_IORT_SMMU_V3_GENERIC 0x00000000 /* Generic SMMUv3 */
812#define ACPI_IORT_SMMU_V3_HISILICON_HI161X 0x00000001 /* hi_silicon Hi161x SMMUv3 */
813#define ACPI_IORT_SMMU_V3_CAVIUM_CN99XX 0x00000002 /* Cavium CN99xx SMMUv3 */
814
815/* Masks for Flags field above */
816
817#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1)
818#define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (3<<1)
819#define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3)
820#define ACPI_IORT_SMMU_V3_DEVICEID_VALID (1<<4)
821
822struct acpi_iort_pmcg {
823 u64 page0_base_address;
824 u32 overflow_gsiv;
825 u32 node_reference;
826 u64 page1_base_address;
827};
828
829struct acpi_iort_rmr {
830 u32 flags;
831 u32 rmr_count;
832 u32 rmr_offset;
833};
834
835/* Masks for Flags field above */
836#define ACPI_IORT_RMR_REMAP_PERMITTED (1)
837#define ACPI_IORT_RMR_ACCESS_PRIVILEGE (1<<1)
838
839/*
840 * Macro to access the Access Attributes in flags field above:
841 * Access Attributes is encoded in bits 9:2
842 */
843#define ACPI_IORT_RMR_ACCESS_ATTRIBUTES(flags) (((flags) >> 2) & 0xFF)
844
845/* Values for above Access Attributes */
846
847#define ACPI_IORT_RMR_ATTR_DEVICE_NGNRNE 0x00
848#define ACPI_IORT_RMR_ATTR_DEVICE_NGNRE 0x01
849#define ACPI_IORT_RMR_ATTR_DEVICE_NGRE 0x02
850#define ACPI_IORT_RMR_ATTR_DEVICE_GRE 0x03
851#define ACPI_IORT_RMR_ATTR_NORMAL_NC 0x04
852#define ACPI_IORT_RMR_ATTR_NORMAL_IWB_OWB 0x05
853
854struct acpi_iort_rmr_desc {
855 u64 base_address;
856 u64 length;
857 u32 reserved;
858};
859
860/*******************************************************************************
861 *
862 * IVRS - I/O Virtualization Reporting Structure
863 * Version 1
864 *
865 * Conforms to "AMD I/O Virtualization Technology (IOMMU) Specification",
866 * Revision 1.26, February 2009.
867 *
868 ******************************************************************************/
869
870struct acpi_table_ivrs {
871 struct acpi_table_header header; /* Common ACPI table header */
872 u32 info; /* Common virtualization info */
873 u64 reserved;
874};
875
876/* Values for Info field above */
877
878#define ACPI_IVRS_PHYSICAL_SIZE 0x00007F00 /* 7 bits, physical address size */
879#define ACPI_IVRS_VIRTUAL_SIZE 0x003F8000 /* 7 bits, virtual address size */
880#define ACPI_IVRS_ATS_RESERVED 0x00400000 /* ATS address translation range reserved */
881
882/* IVRS subtable header */
883
884struct acpi_ivrs_header {
885 u8 type; /* Subtable type */
886 u8 flags;
887 u16 length; /* Subtable length */
888 u16 device_id; /* ID of IOMMU */
889};
890
891/* Values for subtable Type above */
892
893enum acpi_ivrs_type {
894 ACPI_IVRS_TYPE_HARDWARE1 = 0x10,
895 ACPI_IVRS_TYPE_HARDWARE2 = 0x11,
896 ACPI_IVRS_TYPE_HARDWARE3 = 0x40,
897 ACPI_IVRS_TYPE_MEMORY1 = 0x20,
898 ACPI_IVRS_TYPE_MEMORY2 = 0x21,
899 ACPI_IVRS_TYPE_MEMORY3 = 0x22
900};
901
902/* Masks for Flags field above for IVHD subtable */
903
904#define ACPI_IVHD_TT_ENABLE (1)
905#define ACPI_IVHD_PASS_PW (1<<1)
906#define ACPI_IVHD_RES_PASS_PW (1<<2)
907#define ACPI_IVHD_ISOC (1<<3)
908#define ACPI_IVHD_IOTLB (1<<4)
909
910/* Masks for Flags field above for IVMD subtable */
911
912#define ACPI_IVMD_UNITY (1)
913#define ACPI_IVMD_READ (1<<1)
914#define ACPI_IVMD_WRITE (1<<2)
915#define ACPI_IVMD_EXCLUSION_RANGE (1<<3)
916
917/*
918 * IVRS subtables, correspond to Type in struct acpi_ivrs_header
919 */
920
921/* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */
922
923struct acpi_ivrs_hardware_10 {
924 struct acpi_ivrs_header header;
925 u16 capability_offset; /* Offset for IOMMU control fields */
926 u64 base_address; /* IOMMU control registers */
927 u16 pci_segment_group;
928 u16 info; /* MSI number and unit ID */
929 u32 feature_reporting;
930};
931
932/* 0x11: I/O Virtualization Hardware Definition Block (IVHD) */
933
934struct acpi_ivrs_hardware_11 {
935 struct acpi_ivrs_header header;
936 u16 capability_offset; /* Offset for IOMMU control fields */
937 u64 base_address; /* IOMMU control registers */
938 u16 pci_segment_group;
939 u16 info; /* MSI number and unit ID */
940 u32 attributes;
941 u64 efr_register_image;
942 u64 reserved;
943};
944
945/* Masks for Info field above */
946
947#define ACPI_IVHD_MSI_NUMBER_MASK 0x001F /* 5 bits, MSI message number */
948#define ACPI_IVHD_UNIT_ID_MASK 0x1F00 /* 5 bits, unit_ID */
949
950/*
951 * Device Entries for IVHD subtable, appear after struct acpi_ivrs_hardware structure.
952 * Upper two bits of the Type field are the (encoded) length of the structure.
953 * Currently, only 4 and 8 byte entries are defined. 16 and 32 byte entries
954 * are reserved for future use but not defined.
955 */
956struct acpi_ivrs_de_header {
957 u8 type;
958 u16 id;
959 u8 data_setting;
960};
961
962/* Length of device entry is in the top two bits of Type field above */
963
964#define ACPI_IVHD_ENTRY_LENGTH 0xC0
965
966/* Values for device entry Type field above */
967
968enum acpi_ivrs_device_entry_type {
969 /* 4-byte device entries, all use struct acpi_ivrs_device4 */
970
971 ACPI_IVRS_TYPE_PAD4 = 0,
972 ACPI_IVRS_TYPE_ALL = 1,
973 ACPI_IVRS_TYPE_SELECT = 2,
974 ACPI_IVRS_TYPE_START = 3,
975 ACPI_IVRS_TYPE_END = 4,
976
977 /* 8-byte device entries */
978
979 ACPI_IVRS_TYPE_PAD8 = 64,
980 ACPI_IVRS_TYPE_NOT_USED = 65,
981 ACPI_IVRS_TYPE_ALIAS_SELECT = 66, /* Uses struct acpi_ivrs_device8a */
982 ACPI_IVRS_TYPE_ALIAS_START = 67, /* Uses struct acpi_ivrs_device8a */
983 ACPI_IVRS_TYPE_EXT_SELECT = 70, /* Uses struct acpi_ivrs_device8b */
984 ACPI_IVRS_TYPE_EXT_START = 71, /* Uses struct acpi_ivrs_device8b */
985 ACPI_IVRS_TYPE_SPECIAL = 72, /* Uses struct acpi_ivrs_device8c */
986
987 /* Variable-length device entries */
988
989 ACPI_IVRS_TYPE_HID = 240 /* Uses ACPI_IVRS_DEVICE_HID */
990};
991
992/* Values for Data field above */
993
994#define ACPI_IVHD_INIT_PASS (1)
995#define ACPI_IVHD_EINT_PASS (1<<1)
996#define ACPI_IVHD_NMI_PASS (1<<2)
997#define ACPI_IVHD_SYSTEM_MGMT (3<<4)
998#define ACPI_IVHD_LINT0_PASS (1<<6)
999#define ACPI_IVHD_LINT1_PASS (1<<7)
1000
1001/* Types 0-4: 4-byte device entry */
1002
1003struct acpi_ivrs_device4 {
1004 struct acpi_ivrs_de_header header;
1005};
1006
1007/* Types 66-67: 8-byte device entry */
1008
1009struct acpi_ivrs_device8a {
1010 struct acpi_ivrs_de_header header;
1011 u8 reserved1;
1012 u16 used_id;
1013 u8 reserved2;
1014};
1015
1016/* Types 70-71: 8-byte device entry */
1017
1018struct acpi_ivrs_device8b {
1019 struct acpi_ivrs_de_header header;
1020 u32 extended_data;
1021};
1022
1023/* Values for extended_data above */
1024
1025#define ACPI_IVHD_ATS_DISABLED (1<<31)
1026
1027/* Type 72: 8-byte device entry */
1028
1029struct acpi_ivrs_device8c {
1030 struct acpi_ivrs_de_header header;
1031 u8 handle;
1032 u16 used_id;
1033 u8 variety;
1034};
1035
1036/* Values for Variety field above */
1037
1038#define ACPI_IVHD_IOAPIC 1
1039#define ACPI_IVHD_HPET 2
1040
1041/* Type 240: variable-length device entry */
1042
1043struct acpi_ivrs_device_hid {
1044 struct acpi_ivrs_de_header header;
1045 u64 acpi_hid;
1046 u64 acpi_cid;
1047 u8 uid_type;
1048 u8 uid_length;
1049};
1050
1051/* Values for uid_type above */
1052
1053#define ACPI_IVRS_UID_NOT_PRESENT 0
1054#define ACPI_IVRS_UID_IS_INTEGER 1
1055#define ACPI_IVRS_UID_IS_STRING 2
1056
1057/* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */
1058
1059struct acpi_ivrs_memory {
1060 struct acpi_ivrs_header header;
1061 u16 aux_data;
1062 u64 reserved;
1063 u64 start_address;
1064 u64 memory_length;
1065};
1066
1067/*******************************************************************************
1068 *
1069 * LPIT - Low Power Idle Table
1070 *
1071 * Conforms to "ACPI Low Power Idle Table (LPIT)" July 2014.
1072 *
1073 ******************************************************************************/
1074
1075struct acpi_table_lpit {
1076 struct acpi_table_header header; /* Common ACPI table header */
1077};
1078
1079/* LPIT subtable header */
1080
1081struct acpi_lpit_header {
1082 u32 type; /* Subtable type */
1083 u32 length; /* Subtable length */
1084 u16 unique_id;
1085 u16 reserved;
1086 u32 flags;
1087};
1088
1089/* Values for subtable Type above */
1090
1091enum acpi_lpit_type {
1092 ACPI_LPIT_TYPE_NATIVE_CSTATE = 0x00,
1093 ACPI_LPIT_TYPE_RESERVED = 0x01 /* 1 and above are reserved */
1094};
1095
1096/* Masks for Flags field above */
1097
1098#define ACPI_LPIT_STATE_DISABLED (1)
1099#define ACPI_LPIT_NO_COUNTER (1<<1)
1100
1101/*
1102 * LPIT subtables, correspond to Type in struct acpi_lpit_header
1103 */
1104
1105/* 0x00: Native C-state instruction based LPI structure */
1106
1107struct acpi_lpit_native {
1108 struct acpi_lpit_header header;
1109 struct acpi_generic_address entry_trigger;
1110 u32 residency;
1111 u32 latency;
1112 struct acpi_generic_address residency_counter;
1113 u64 counter_frequency;
1114};
1115
1116/*******************************************************************************
1117 *
1118 * MADT - Multiple APIC Description Table
1119 * Version 3
1120 *
1121 ******************************************************************************/
1122
1123struct acpi_table_madt {
1124 struct acpi_table_header header; /* Common ACPI table header */
1125 u32 address; /* Physical address of local APIC */
1126 u32 flags;
1127};
1128
1129/* Masks for Flags field above */
1130
1131#define ACPI_MADT_PCAT_COMPAT (1) /* 00: System also has dual 8259s */
1132
1133/* Values for PCATCompat flag */
1134
1135#define ACPI_MADT_DUAL_PIC 1
1136#define ACPI_MADT_MULTIPLE_APIC 0
1137
1138/* Values for MADT subtable type in struct acpi_subtable_header */
1139
1140enum acpi_madt_type {
1141 ACPI_MADT_TYPE_LOCAL_APIC = 0,
1142 ACPI_MADT_TYPE_IO_APIC = 1,
1143 ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2,
1144 ACPI_MADT_TYPE_NMI_SOURCE = 3,
1145 ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4,
1146 ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5,
1147 ACPI_MADT_TYPE_IO_SAPIC = 6,
1148 ACPI_MADT_TYPE_LOCAL_SAPIC = 7,
1149 ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8,
1150 ACPI_MADT_TYPE_LOCAL_X2APIC = 9,
1151 ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10,
1152 ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11,
1153 ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12,
1154 ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13,
1155 ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14,
1156 ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15,
1157 ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16,
1158 ACPI_MADT_TYPE_CORE_PIC = 17,
1159 ACPI_MADT_TYPE_LIO_PIC = 18,
1160 ACPI_MADT_TYPE_HT_PIC = 19,
1161 ACPI_MADT_TYPE_EIO_PIC = 20,
1162 ACPI_MADT_TYPE_MSI_PIC = 21,
1163 ACPI_MADT_TYPE_BIO_PIC = 22,
1164 ACPI_MADT_TYPE_LPC_PIC = 23,
1165 ACPI_MADT_TYPE_RINTC = 24,
1166 ACPI_MADT_TYPE_IMSIC = 25,
1167 ACPI_MADT_TYPE_APLIC = 26,
1168 ACPI_MADT_TYPE_PLIC = 27,
1169 ACPI_MADT_TYPE_RESERVED = 28, /* 28 to 0x7F are reserved */
1170 ACPI_MADT_TYPE_OEM_RESERVED = 0x80 /* 0x80 to 0xFF are reserved for OEM use */
1171};
1172
1173/*
1174 * MADT Subtables, correspond to Type in struct acpi_subtable_header
1175 */
1176
1177/* 0: Processor Local APIC */
1178
1179struct acpi_madt_local_apic {
1180 struct acpi_subtable_header header;
1181 u8 processor_id; /* ACPI processor id */
1182 u8 id; /* Processor's local APIC id */
1183 u32 lapic_flags;
1184};
1185
1186/* 1: IO APIC */
1187
1188struct acpi_madt_io_apic {
1189 struct acpi_subtable_header header;
1190 u8 id; /* I/O APIC ID */
1191 u8 reserved; /* reserved - must be zero */
1192 u32 address; /* APIC physical address */
1193 u32 global_irq_base; /* Global system interrupt where INTI lines start */
1194};
1195
1196/* 2: Interrupt Override */
1197
1198struct acpi_madt_interrupt_override {
1199 struct acpi_subtable_header header;
1200 u8 bus; /* 0 - ISA */
1201 u8 source_irq; /* Interrupt source (IRQ) */
1202 u32 global_irq; /* Global system interrupt */
1203 u16 inti_flags;
1204};
1205
1206/* 3: NMI Source */
1207
1208struct acpi_madt_nmi_source {
1209 struct acpi_subtable_header header;
1210 u16 inti_flags;
1211 u32 global_irq; /* Global system interrupt */
1212};
1213
1214/* 4: Local APIC NMI */
1215
1216struct acpi_madt_local_apic_nmi {
1217 struct acpi_subtable_header header;
1218 u8 processor_id; /* ACPI processor id */
1219 u16 inti_flags;
1220 u8 lint; /* LINTn to which NMI is connected */
1221};
1222
1223/* 5: Address Override */
1224
1225struct acpi_madt_local_apic_override {
1226 struct acpi_subtable_header header;
1227 u16 reserved; /* Reserved, must be zero */
1228 u64 address; /* APIC physical address */
1229};
1230
1231/* 6: I/O Sapic */
1232
1233struct acpi_madt_io_sapic {
1234 struct acpi_subtable_header header;
1235 u8 id; /* I/O SAPIC ID */
1236 u8 reserved; /* Reserved, must be zero */
1237 u32 global_irq_base; /* Global interrupt for SAPIC start */
1238 u64 address; /* SAPIC physical address */
1239};
1240
1241/* 7: Local Sapic */
1242
1243struct acpi_madt_local_sapic {
1244 struct acpi_subtable_header header;
1245 u8 processor_id; /* ACPI processor id */
1246 u8 id; /* SAPIC ID */
1247 u8 eid; /* SAPIC EID */
1248 u8 reserved[3]; /* Reserved, must be zero */
1249 u32 lapic_flags;
1250 u32 uid; /* Numeric UID - ACPI 3.0 */
1251 char uid_string[]; /* String UID - ACPI 3.0 */
1252};
1253
1254/* 8: Platform Interrupt Source */
1255
1256struct acpi_madt_interrupt_source {
1257 struct acpi_subtable_header header;
1258 u16 inti_flags;
1259 u8 type; /* 1=PMI, 2=INIT, 3=corrected */
1260 u8 id; /* Processor ID */
1261 u8 eid; /* Processor EID */
1262 u8 io_sapic_vector; /* Vector value for PMI interrupts */
1263 u32 global_irq; /* Global system interrupt */
1264 u32 flags; /* Interrupt Source Flags */
1265};
1266
1267/* Masks for Flags field above */
1268
1269#define ACPI_MADT_CPEI_OVERRIDE (1)
1270
1271/* 9: Processor Local X2APIC (ACPI 4.0) */
1272
1273struct acpi_madt_local_x2apic {
1274 struct acpi_subtable_header header;
1275 u16 reserved; /* reserved - must be zero */
1276 u32 local_apic_id; /* Processor x2APIC ID */
1277 u32 lapic_flags;
1278 u32 uid; /* ACPI processor UID */
1279};
1280
1281/* 10: Local X2APIC NMI (ACPI 4.0) */
1282
1283struct acpi_madt_local_x2apic_nmi {
1284 struct acpi_subtable_header header;
1285 u16 inti_flags;
1286 u32 uid; /* ACPI processor UID */
1287 u8 lint; /* LINTn to which NMI is connected */
1288 u8 reserved[3]; /* reserved - must be zero */
1289};
1290
1291/* 11: Generic interrupt - GICC (ACPI 5.0 + ACPI 6.0 + ACPI 6.3 + ACPI 6.5 changes) */
1292
1293struct acpi_madt_generic_interrupt {
1294 struct acpi_subtable_header header;
1295 u16 reserved; /* reserved - must be zero */
1296 u32 cpu_interface_number;
1297 u32 uid;
1298 u32 flags;
1299 u32 parking_version;
1300 u32 performance_interrupt;
1301 u64 parked_address;
1302 u64 base_address;
1303 u64 gicv_base_address;
1304 u64 gich_base_address;
1305 u32 vgic_interrupt;
1306 u64 gicr_base_address;
1307 u64 arm_mpidr;
1308 u8 efficiency_class;
1309 u8 reserved2[1];
1310 u16 spe_interrupt; /* ACPI 6.3 */
1311 u16 trbe_interrupt; /* ACPI 6.5 */
1312};
1313
1314/* Masks for Flags field above */
1315
1316/* ACPI_MADT_ENABLED (1) Processor is usable if set */
1317#define ACPI_MADT_PERFORMANCE_IRQ_MODE (1<<1) /* 01: Performance Interrupt Mode */
1318#define ACPI_MADT_VGIC_IRQ_MODE (1<<2) /* 02: VGIC Maintenance Interrupt mode */
1319#define ACPI_MADT_GICC_ONLINE_CAPABLE (1<<3) /* 03: Processor is online capable */
1320#define ACPI_MADT_GICC_NON_COHERENT (1<<4) /* 04: GIC redistributor is not coherent */
1321
1322/* 12: Generic Distributor (ACPI 5.0 + ACPI 6.0 changes) */
1323
1324struct acpi_madt_generic_distributor {
1325 struct acpi_subtable_header header;
1326 u16 reserved; /* reserved - must be zero */
1327 u32 gic_id;
1328 u64 base_address;
1329 u32 global_irq_base;
1330 u8 version;
1331 u8 reserved2[3]; /* reserved - must be zero */
1332};
1333
1334/* Values for Version field above */
1335
1336enum acpi_madt_gic_version {
1337 ACPI_MADT_GIC_VERSION_NONE = 0,
1338 ACPI_MADT_GIC_VERSION_V1 = 1,
1339 ACPI_MADT_GIC_VERSION_V2 = 2,
1340 ACPI_MADT_GIC_VERSION_V3 = 3,
1341 ACPI_MADT_GIC_VERSION_V4 = 4,
1342 ACPI_MADT_GIC_VERSION_RESERVED = 5 /* 5 and greater are reserved */
1343};
1344
1345/* 13: Generic MSI Frame (ACPI 5.1) */
1346
1347struct acpi_madt_generic_msi_frame {
1348 struct acpi_subtable_header header;
1349 u16 reserved; /* reserved - must be zero */
1350 u32 msi_frame_id;
1351 u64 base_address;
1352 u32 flags;
1353 u16 spi_count;
1354 u16 spi_base;
1355};
1356
1357/* Masks for Flags field above */
1358
1359#define ACPI_MADT_OVERRIDE_SPI_VALUES (1)
1360
1361/* 14: Generic Redistributor (ACPI 5.1) */
1362
1363struct acpi_madt_generic_redistributor {
1364 struct acpi_subtable_header header;
1365 u8 flags;
1366 u8 reserved; /* reserved - must be zero */
1367 u64 base_address;
1368 u32 length;
1369};
1370
1371#define ACPI_MADT_GICR_NON_COHERENT (1)
1372
1373/* 15: Generic Translator (ACPI 6.0) */
1374
1375struct acpi_madt_generic_translator {
1376 struct acpi_subtable_header header;
1377 u8 flags;
1378 u8 reserved; /* reserved - must be zero */
1379 u32 translation_id;
1380 u64 base_address;
1381 u32 reserved2;
1382};
1383
1384#define ACPI_MADT_ITS_NON_COHERENT (1)
1385
1386/* 16: Multiprocessor wakeup (ACPI 6.4) */
1387
1388struct acpi_madt_multiproc_wakeup {
1389 struct acpi_subtable_header header;
1390 u16 version;
1391 u32 reserved; /* reserved - must be zero */
1392 u64 mailbox_address;
1393 u64 reset_vector;
1394};
1395
1396/* Values for Version field above */
1397
1398enum acpi_madt_multiproc_wakeup_version {
1399 ACPI_MADT_MP_WAKEUP_VERSION_NONE = 0,
1400 ACPI_MADT_MP_WAKEUP_VERSION_V1 = 1,
1401 ACPI_MADT_MP_WAKEUP_VERSION_RESERVED = 2, /* 2 and greater are reserved */
1402};
1403
1404#define ACPI_MADT_MP_WAKEUP_SIZE_V0 16
1405#define ACPI_MADT_MP_WAKEUP_SIZE_V1 24
1406
1407#define ACPI_MULTIPROC_WAKEUP_MB_OS_SIZE 2032
1408#define ACPI_MULTIPROC_WAKEUP_MB_FIRMWARE_SIZE 2048
1409
1410struct acpi_madt_multiproc_wakeup_mailbox {
1411 u16 command;
1412 u16 reserved; /* reserved - must be zero */
1413 u32 apic_id;
1414 u64 wakeup_vector;
1415 u8 reserved_os[ACPI_MULTIPROC_WAKEUP_MB_OS_SIZE]; /* reserved for OS use */
1416 u8 reserved_firmware[ACPI_MULTIPROC_WAKEUP_MB_FIRMWARE_SIZE]; /* reserved for firmware use */
1417};
1418
1419#define ACPI_MP_WAKE_COMMAND_WAKEUP 1
1420#define ACPI_MP_WAKE_COMMAND_TEST 2
1421
1422/* 17: CPU Core Interrupt Controller (ACPI 6.5) */
1423
1424struct acpi_madt_core_pic {
1425 struct acpi_subtable_header header;
1426 u8 version;
1427 u32 processor_id;
1428 u32 core_id;
1429 u32 flags;
1430};
1431
1432/* Values for Version field above */
1433
1434enum acpi_madt_core_pic_version {
1435 ACPI_MADT_CORE_PIC_VERSION_NONE = 0,
1436 ACPI_MADT_CORE_PIC_VERSION_V1 = 1,
1437 ACPI_MADT_CORE_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1438};
1439
1440/* 18: Legacy I/O Interrupt Controller (ACPI 6.5) */
1441
1442struct acpi_madt_lio_pic {
1443 struct acpi_subtable_header header;
1444 u8 version;
1445 u64 address;
1446 u16 size;
1447 u8 cascade[2];
1448 u32 cascade_map[2];
1449};
1450
1451/* Values for Version field above */
1452
1453enum acpi_madt_lio_pic_version {
1454 ACPI_MADT_LIO_PIC_VERSION_NONE = 0,
1455 ACPI_MADT_LIO_PIC_VERSION_V1 = 1,
1456 ACPI_MADT_LIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1457};
1458
1459/* 19: HT Interrupt Controller (ACPI 6.5) */
1460
1461struct acpi_madt_ht_pic {
1462 struct acpi_subtable_header header;
1463 u8 version;
1464 u64 address;
1465 u16 size;
1466 u8 cascade[8];
1467};
1468
1469/* Values for Version field above */
1470
1471enum acpi_madt_ht_pic_version {
1472 ACPI_MADT_HT_PIC_VERSION_NONE = 0,
1473 ACPI_MADT_HT_PIC_VERSION_V1 = 1,
1474 ACPI_MADT_HT_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1475};
1476
1477/* 20: Extend I/O Interrupt Controller (ACPI 6.5) */
1478
1479struct acpi_madt_eio_pic {
1480 struct acpi_subtable_header header;
1481 u8 version;
1482 u8 cascade;
1483 u8 node;
1484 u64 node_map;
1485};
1486
1487/* Values for Version field above */
1488
1489enum acpi_madt_eio_pic_version {
1490 ACPI_MADT_EIO_PIC_VERSION_NONE = 0,
1491 ACPI_MADT_EIO_PIC_VERSION_V1 = 1,
1492 ACPI_MADT_EIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1493};
1494
1495/* 21: MSI Interrupt Controller (ACPI 6.5) */
1496
1497struct acpi_madt_msi_pic {
1498 struct acpi_subtable_header header;
1499 u8 version;
1500 u64 msg_address;
1501 u32 start;
1502 u32 count;
1503};
1504
1505/* Values for Version field above */
1506
1507enum acpi_madt_msi_pic_version {
1508 ACPI_MADT_MSI_PIC_VERSION_NONE = 0,
1509 ACPI_MADT_MSI_PIC_VERSION_V1 = 1,
1510 ACPI_MADT_MSI_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1511};
1512
1513/* 22: Bridge I/O Interrupt Controller (ACPI 6.5) */
1514
1515struct acpi_madt_bio_pic {
1516 struct acpi_subtable_header header;
1517 u8 version;
1518 u64 address;
1519 u16 size;
1520 u16 id;
1521 u16 gsi_base;
1522};
1523
1524/* Values for Version field above */
1525
1526enum acpi_madt_bio_pic_version {
1527 ACPI_MADT_BIO_PIC_VERSION_NONE = 0,
1528 ACPI_MADT_BIO_PIC_VERSION_V1 = 1,
1529 ACPI_MADT_BIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1530};
1531
1532/* 23: LPC Interrupt Controller (ACPI 6.5) */
1533
1534struct acpi_madt_lpc_pic {
1535 struct acpi_subtable_header header;
1536 u8 version;
1537 u64 address;
1538 u16 size;
1539 u8 cascade;
1540};
1541
1542/* Values for Version field above */
1543
1544enum acpi_madt_lpc_pic_version {
1545 ACPI_MADT_LPC_PIC_VERSION_NONE = 0,
1546 ACPI_MADT_LPC_PIC_VERSION_V1 = 1,
1547 ACPI_MADT_LPC_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1548};
1549
1550/* 24: RISC-V INTC */
1551struct acpi_madt_rintc {
1552 struct acpi_subtable_header header;
1553 u8 version;
1554 u8 reserved;
1555 u32 flags;
1556 u64 hart_id;
1557 u32 uid; /* ACPI processor UID */
1558 u32 ext_intc_id; /* External INTC Id */
1559 u64 imsic_addr; /* IMSIC base address */
1560 u32 imsic_size; /* IMSIC size */
1561};
1562
1563/* Values for RISC-V INTC Version field above */
1564
1565enum acpi_madt_rintc_version {
1566 ACPI_MADT_RINTC_VERSION_NONE = 0,
1567 ACPI_MADT_RINTC_VERSION_V1 = 1,
1568 ACPI_MADT_RINTC_VERSION_RESERVED = 2 /* 2 and greater are reserved */
1569};
1570
1571/* 25: RISC-V IMSIC */
1572struct acpi_madt_imsic {
1573 struct acpi_subtable_header header;
1574 u8 version;
1575 u8 reserved;
1576 u32 flags;
1577 u16 num_ids;
1578 u16 num_guest_ids;
1579 u8 guest_index_bits;
1580 u8 hart_index_bits;
1581 u8 group_index_bits;
1582 u8 group_index_shift;
1583};
1584
1585/* 26: RISC-V APLIC */
1586struct acpi_madt_aplic {
1587 struct acpi_subtable_header header;
1588 u8 version;
1589 u8 id;
1590 u32 flags;
1591 u8 hw_id[8];
1592 u16 num_idcs;
1593 u16 num_sources;
1594 u32 gsi_base;
1595 u64 base_addr;
1596 u32 size;
1597};
1598
1599/* 27: RISC-V PLIC */
1600struct acpi_madt_plic {
1601 struct acpi_subtable_header header;
1602 u8 version;
1603 u8 id;
1604 u8 hw_id[8];
1605 u16 num_irqs;
1606 u16 max_prio;
1607 u32 flags;
1608 u32 size;
1609 u64 base_addr;
1610 u32 gsi_base;
1611};
1612
1613/* 80: OEM data */
1614
1615struct acpi_madt_oem_data {
1616 ACPI_FLEX_ARRAY(u8, oem_data);
1617};
1618
1619/*
1620 * Common flags fields for MADT subtables
1621 */
1622
1623/* MADT Local APIC flags */
1624
1625#define ACPI_MADT_ENABLED (1) /* 00: Processor is usable if set */
1626#define ACPI_MADT_ONLINE_CAPABLE (2) /* 01: System HW supports enabling processor at runtime */
1627
1628/* MADT MPS INTI flags (inti_flags) */
1629
1630#define ACPI_MADT_POLARITY_MASK (3) /* 00-01: Polarity of APIC I/O input signals */
1631#define ACPI_MADT_TRIGGER_MASK (3<<2) /* 02-03: Trigger mode of APIC input signals */
1632
1633/* Values for MPS INTI flags */
1634
1635#define ACPI_MADT_POLARITY_CONFORMS 0
1636#define ACPI_MADT_POLARITY_ACTIVE_HIGH 1
1637#define ACPI_MADT_POLARITY_RESERVED 2
1638#define ACPI_MADT_POLARITY_ACTIVE_LOW 3
1639
1640#define ACPI_MADT_TRIGGER_CONFORMS (0)
1641#define ACPI_MADT_TRIGGER_EDGE (1<<2)
1642#define ACPI_MADT_TRIGGER_RESERVED (2<<2)
1643#define ACPI_MADT_TRIGGER_LEVEL (3<<2)
1644
1645/*******************************************************************************
1646 *
1647 * MCFG - PCI Memory Mapped Configuration table and subtable
1648 * Version 1
1649 *
1650 * Conforms to "PCI Firmware Specification", Revision 3.0, June 20, 2005
1651 *
1652 ******************************************************************************/
1653
1654struct acpi_table_mcfg {
1655 struct acpi_table_header header; /* Common ACPI table header */
1656 u8 reserved[8];
1657};
1658
1659/* Subtable */
1660
1661struct acpi_mcfg_allocation {
1662 u64 address; /* Base address, processor-relative */
1663 u16 pci_segment; /* PCI segment group number */
1664 u8 start_bus_number; /* Starting PCI Bus number */
1665 u8 end_bus_number; /* Final PCI Bus number */
1666 u32 reserved;
1667};
1668
1669/*******************************************************************************
1670 *
1671 * MCHI - Management Controller Host Interface Table
1672 * Version 1
1673 *
1674 * Conforms to "Management Component Transport Protocol (MCTP) Host
1675 * Interface Specification", Revision 1.0.0a, October 13, 2009
1676 *
1677 ******************************************************************************/
1678
1679struct acpi_table_mchi {
1680 struct acpi_table_header header; /* Common ACPI table header */
1681 u8 interface_type;
1682 u8 protocol;
1683 u64 protocol_data;
1684 u8 interrupt_type;
1685 u8 gpe;
1686 u8 pci_device_flag;
1687 u32 global_interrupt;
1688 struct acpi_generic_address control_register;
1689 u8 pci_segment;
1690 u8 pci_bus;
1691 u8 pci_device;
1692 u8 pci_function;
1693};
1694
1695/*******************************************************************************
1696 *
1697 * MPAM - Memory System Resource Partitioning and Monitoring
1698 *
1699 * Conforms to "ACPI for Memory System Resource Partitioning and Monitoring 2.0"
1700 * Document number: ARM DEN 0065, December, 2022.
1701 *
1702 ******************************************************************************/
1703
1704/* MPAM RIS locator types. Table 11, Location types */
1705enum acpi_mpam_locator_type {
1706 ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE = 0,
1707 ACPI_MPAM_LOCATION_TYPE_MEMORY = 1,
1708 ACPI_MPAM_LOCATION_TYPE_SMMU = 2,
1709 ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE = 3,
1710 ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE = 4,
1711 ACPI_MPAM_LOCATION_TYPE_INTERCONNECT = 5,
1712 ACPI_MPAM_LOCATION_TYPE_UNKNOWN = 0xFF
1713};
1714
1715/* MPAM Functional dependency descriptor. Table 10 */
1716struct acpi_mpam_func_deps {
1717 u32 producer;
1718 u32 reserved;
1719};
1720
1721/* MPAM Processor cache locator descriptor. Table 13 */
1722struct acpi_mpam_resource_cache_locator {
1723 u64 cache_reference;
1724 u32 reserved;
1725};
1726
1727/* MPAM Memory locator descriptor. Table 14 */
1728struct acpi_mpam_resource_memory_locator {
1729 u64 proximity_domain;
1730 u32 reserved;
1731};
1732
1733/* MPAM SMMU locator descriptor. Table 15 */
1734struct acpi_mpam_resource_smmu_locator {
1735 u64 smmu_interface;
1736 u32 reserved;
1737};
1738
1739/* MPAM Memory-side cache locator descriptor. Table 16 */
1740struct acpi_mpam_resource_memcache_locator {
1741 u8 reserved[7];
1742 u8 level;
1743 u32 reference;
1744};
1745
1746/* MPAM ACPI device locator descriptor. Table 17 */
1747struct acpi_mpam_resource_acpi_locator {
1748 u64 acpi_hw_id;
1749 u32 acpi_unique_id;
1750};
1751
1752/* MPAM Interconnect locator descriptor. Table 18 */
1753struct acpi_mpam_resource_interconnect_locator {
1754 u64 inter_connect_desc_tbl_off;
1755 u32 reserved;
1756};
1757
1758/* MPAM Locator structure. Table 12 */
1759struct acpi_mpam_resource_generic_locator {
1760 u64 descriptor1;
1761 u32 descriptor2;
1762};
1763
1764union acpi_mpam_resource_locator {
1765 struct acpi_mpam_resource_cache_locator cache_locator;
1766 struct acpi_mpam_resource_memory_locator memory_locator;
1767 struct acpi_mpam_resource_smmu_locator smmu_locator;
1768 struct acpi_mpam_resource_memcache_locator mem_cache_locator;
1769 struct acpi_mpam_resource_acpi_locator acpi_locator;
1770 struct acpi_mpam_resource_interconnect_locator interconnect_ifc_locator;
1771 struct acpi_mpam_resource_generic_locator generic_locator;
1772};
1773
1774/* Memory System Component Resource Node Structure Table 9 */
1775struct acpi_mpam_resource_node {
1776 u32 identifier;
1777 u8 ris_index;
1778 u16 reserved1;
1779 u8 locator_type;
1780 union acpi_mpam_resource_locator locator;
1781 u32 num_functional_deps;
1782};
1783
1784/* Memory System Component (MSC) Node Structure. Table 4 */
1785struct acpi_mpam_msc_node {
1786 u16 length;
1787 u8 interface_type;
1788 u8 reserved;
1789 u32 identifier;
1790 u64 base_address;
1791 u32 mmio_size;
1792 u32 overflow_interrupt;
1793 u32 overflow_interrupt_flags;
1794 u32 reserved1;
1795 u32 overflow_interrupt_affinity;
1796 u32 error_interrupt;
1797 u32 error_interrupt_flags;
1798 u32 reserved2;
1799 u32 error_interrupt_affinity;
1800 u32 max_nrdy_usec;
1801 u64 hardware_id_linked_device;
1802 u32 instance_id_linked_device;
1803 u32 num_resource_nodes;
1804};
1805
1806struct acpi_table_mpam {
1807 struct acpi_table_header header; /* Common ACPI table header */
1808};
1809
1810/*******************************************************************************
1811 *
1812 * MPST - Memory Power State Table (ACPI 5.0)
1813 * Version 1
1814 *
1815 ******************************************************************************/
1816
1817#define ACPI_MPST_CHANNEL_INFO \
1818 u8 channel_id; \
1819 u8 reserved1[3]; \
1820 u16 power_node_count; \
1821 u16 reserved2;
1822
1823/* Main table */
1824
1825struct acpi_table_mpst {
1826 struct acpi_table_header header; /* Common ACPI table header */
1827 ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */
1828};
1829
1830/* Memory Platform Communication Channel Info */
1831
1832struct acpi_mpst_channel {
1833 ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */
1834};
1835
1836/* Memory Power Node Structure */
1837
1838struct acpi_mpst_power_node {
1839 u8 flags;
1840 u8 reserved1;
1841 u16 node_id;
1842 u32 length;
1843 u64 range_address;
1844 u64 range_length;
1845 u32 num_power_states;
1846 u32 num_physical_components;
1847};
1848
1849/* Values for Flags field above */
1850
1851#define ACPI_MPST_ENABLED 1
1852#define ACPI_MPST_POWER_MANAGED 2
1853#define ACPI_MPST_HOT_PLUG_CAPABLE 4
1854
1855/* Memory Power State Structure (follows POWER_NODE above) */
1856
1857struct acpi_mpst_power_state {
1858 u8 power_state;
1859 u8 info_index;
1860};
1861
1862/* Physical Component ID Structure (follows POWER_STATE above) */
1863
1864struct acpi_mpst_component {
1865 u16 component_id;
1866};
1867
1868/* Memory Power State Characteristics Structure (follows all POWER_NODEs) */
1869
1870struct acpi_mpst_data_hdr {
1871 u16 characteristics_count;
1872 u16 reserved;
1873};
1874
1875struct acpi_mpst_power_data {
1876 u8 structure_id;
1877 u8 flags;
1878 u16 reserved1;
1879 u32 average_power;
1880 u32 power_saving;
1881 u64 exit_latency;
1882 u64 reserved2;
1883};
1884
1885/* Values for Flags field above */
1886
1887#define ACPI_MPST_PRESERVE 1
1888#define ACPI_MPST_AUTOENTRY 2
1889#define ACPI_MPST_AUTOEXIT 4
1890
1891/* Shared Memory Region (not part of an ACPI table) */
1892
1893struct acpi_mpst_shared {
1894 u32 signature;
1895 u16 pcc_command;
1896 u16 pcc_status;
1897 u32 command_register;
1898 u32 status_register;
1899 u32 power_state_id;
1900 u32 power_node_id;
1901 u64 energy_consumed;
1902 u64 average_power;
1903};
1904
1905/*******************************************************************************
1906 *
1907 * MSCT - Maximum System Characteristics Table (ACPI 4.0)
1908 * Version 1
1909 *
1910 ******************************************************************************/
1911
1912struct acpi_table_msct {
1913 struct acpi_table_header header; /* Common ACPI table header */
1914 u32 proximity_offset; /* Location of proximity info struct(s) */
1915 u32 max_proximity_domains; /* Max number of proximity domains */
1916 u32 max_clock_domains; /* Max number of clock domains */
1917 u64 max_address; /* Max physical address in system */
1918};
1919
1920/* subtable - Maximum Proximity Domain Information. Version 1 */
1921
1922struct acpi_msct_proximity {
1923 u8 revision;
1924 u8 length;
1925 u32 range_start; /* Start of domain range */
1926 u32 range_end; /* End of domain range */
1927 u32 processor_capacity;
1928 u64 memory_capacity; /* In bytes */
1929};
1930
1931/*******************************************************************************
1932 *
1933 * MRRM - Memory Range and Region Mapping (MRRM) table
1934 * Conforms to "Intel Resource Director Technology Architecture Specification"
1935 * Version 1.1, January 2025
1936 *
1937 ******************************************************************************/
1938
1939struct acpi_table_mrrm {
1940 struct acpi_table_header header; /* Common ACPI table header */
1941 u8 max_mem_region; /* Max Memory Regions supported */
1942 u8 flags; /* Region assignment type */
1943 u8 reserved[26];
1944 u8 memory_range_entry[];
1945};
1946
1947/* Flags */
1948#define ACPI_MRRM_FLAGS_REGION_ASSIGNMENT_OS (1<<0)
1949
1950/*******************************************************************************
1951 *
1952 * Memory Range entry - Memory Range entry in MRRM table
1953 *
1954 ******************************************************************************/
1955
1956struct acpi_mrrm_mem_range_entry {
1957 struct acpi_subtbl_hdr_16 header;
1958 u32 reserved0; /* Reserved */
1959 u64 addr_base; /* Base addr of the mem range */
1960 u64 addr_len; /* Length of the mem range */
1961 u16 region_id_flags; /* Valid local or remote Region-ID */
1962 u8 local_region_id; /* Platform-assigned static local Region-ID */
1963 u8 remote_region_id; /* Platform-assigned static remote Region-ID */
1964 u32 reserved1; /* Reserved */
1965 /* Region-ID Programming Registers[] */
1966};
1967
1968/* Values for region_id_flags above */
1969#define ACPI_MRRM_VALID_REGION_ID_FLAGS_LOCAL (1<<0)
1970#define ACPI_MRRM_VALID_REGION_ID_FLAGS_REMOTE (1<<1)
1971
1972/*******************************************************************************
1973 *
1974 * MSDM - Microsoft Data Management table
1975 *
1976 * Conforms to "Microsoft Software Licensing Tables (SLIC and MSDM)",
1977 * November 29, 2011. Copyright 2011 Microsoft
1978 *
1979 ******************************************************************************/
1980
1981/* Basic MSDM table is only the common ACPI header */
1982
1983struct acpi_table_msdm {
1984 struct acpi_table_header header; /* Common ACPI table header */
1985};
1986
1987/*******************************************************************************
1988 *
1989 * NFIT - NVDIMM Interface Table (ACPI 6.0+)
1990 * Version 1
1991 *
1992 ******************************************************************************/
1993
1994struct acpi_table_nfit {
1995 struct acpi_table_header header; /* Common ACPI table header */
1996 u32 reserved; /* Reserved, must be zero */
1997};
1998
1999/* Subtable header for NFIT */
2000
2001struct acpi_nfit_header {
2002 u16 type;
2003 u16 length;
2004};
2005
2006/* Values for subtable type in struct acpi_nfit_header */
2007
2008enum acpi_nfit_type {
2009 ACPI_NFIT_TYPE_SYSTEM_ADDRESS = 0,
2010 ACPI_NFIT_TYPE_MEMORY_MAP = 1,
2011 ACPI_NFIT_TYPE_INTERLEAVE = 2,
2012 ACPI_NFIT_TYPE_SMBIOS = 3,
2013 ACPI_NFIT_TYPE_CONTROL_REGION = 4,
2014 ACPI_NFIT_TYPE_DATA_REGION = 5,
2015 ACPI_NFIT_TYPE_FLUSH_ADDRESS = 6,
2016 ACPI_NFIT_TYPE_CAPABILITIES = 7,
2017 ACPI_NFIT_TYPE_RESERVED = 8 /* 8 and greater are reserved */
2018};
2019
2020/*
2021 * NFIT Subtables
2022 */
2023
2024/* 0: System Physical Address Range Structure */
2025
2026struct acpi_nfit_system_address {
2027 struct acpi_nfit_header header;
2028 u16 range_index;
2029 u16 flags;
2030 u32 reserved; /* Reserved, must be zero */
2031 u32 proximity_domain;
2032 u8 range_guid[16];
2033 u64 address;
2034 u64 length;
2035 u64 memory_mapping;
2036 u64 location_cookie; /* ACPI 6.4 */
2037};
2038
2039/* Flags */
2040
2041#define ACPI_NFIT_ADD_ONLINE_ONLY (1) /* 00: Add/Online Operation Only */
2042#define ACPI_NFIT_PROXIMITY_VALID (1<<1) /* 01: Proximity Domain Valid */
2043#define ACPI_NFIT_LOCATION_COOKIE_VALID (1<<2) /* 02: SPA location cookie valid (ACPI 6.4) */
2044
2045/* Range Type GUIDs appear in the include/acuuid.h file */
2046
2047/* 1: Memory Device to System Address Range Map Structure */
2048
2049struct acpi_nfit_memory_map {
2050 struct acpi_nfit_header header;
2051 u32 device_handle;
2052 u16 physical_id;
2053 u16 region_id;
2054 u16 range_index;
2055 u16 region_index;
2056 u64 region_size;
2057 u64 region_offset;
2058 u64 address;
2059 u16 interleave_index;
2060 u16 interleave_ways;
2061 u16 flags;
2062 u16 reserved; /* Reserved, must be zero */
2063};
2064
2065/* Flags */
2066
2067#define ACPI_NFIT_MEM_SAVE_FAILED (1) /* 00: Last SAVE to Memory Device failed */
2068#define ACPI_NFIT_MEM_RESTORE_FAILED (1<<1) /* 01: Last RESTORE from Memory Device failed */
2069#define ACPI_NFIT_MEM_FLUSH_FAILED (1<<2) /* 02: Platform flush failed */
2070#define ACPI_NFIT_MEM_NOT_ARMED (1<<3) /* 03: Memory Device is not armed */
2071#define ACPI_NFIT_MEM_HEALTH_OBSERVED (1<<4) /* 04: Memory Device observed SMART/health events */
2072#define ACPI_NFIT_MEM_HEALTH_ENABLED (1<<5) /* 05: SMART/health events enabled */
2073#define ACPI_NFIT_MEM_MAP_FAILED (1<<6) /* 06: Mapping to SPA failed */
2074
2075/* 2: Interleave Structure */
2076
2077struct acpi_nfit_interleave {
2078 struct acpi_nfit_header header;
2079 u16 interleave_index;
2080 u16 reserved; /* Reserved, must be zero */
2081 u32 line_count;
2082 u32 line_size;
2083 u32 line_offset[]; /* Variable length */
2084};
2085
2086/* 3: SMBIOS Management Information Structure */
2087
2088struct acpi_nfit_smbios {
2089 struct acpi_nfit_header header;
2090 u32 reserved; /* Reserved, must be zero */
2091 u8 data[]; /* Variable length */
2092};
2093
2094/* 4: NVDIMM Control Region Structure */
2095
2096struct acpi_nfit_control_region {
2097 struct acpi_nfit_header header;
2098 u16 region_index;
2099 u16 vendor_id;
2100 u16 device_id;
2101 u16 revision_id;
2102 u16 subsystem_vendor_id;
2103 u16 subsystem_device_id;
2104 u16 subsystem_revision_id;
2105 u8 valid_fields;
2106 u8 manufacturing_location;
2107 u16 manufacturing_date;
2108 u8 reserved[2]; /* Reserved, must be zero */
2109 u32 serial_number;
2110 u16 code;
2111 u16 windows;
2112 u64 window_size;
2113 u64 command_offset;
2114 u64 command_size;
2115 u64 status_offset;
2116 u64 status_size;
2117 u16 flags;
2118 u8 reserved1[6]; /* Reserved, must be zero */
2119};
2120
2121/* Flags */
2122
2123#define ACPI_NFIT_CONTROL_BUFFERED (1) /* Block Data Windows implementation is buffered */
2124
2125/* valid_fields bits */
2126
2127#define ACPI_NFIT_CONTROL_MFG_INFO_VALID (1) /* Manufacturing fields are valid */
2128
2129/* 5: NVDIMM Block Data Window Region Structure */
2130
2131struct acpi_nfit_data_region {
2132 struct acpi_nfit_header header;
2133 u16 region_index;
2134 u16 windows;
2135 u64 offset;
2136 u64 size;
2137 u64 capacity;
2138 u64 start_address;
2139};
2140
2141/* 6: Flush Hint Address Structure */
2142
2143struct acpi_nfit_flush_address {
2144 struct acpi_nfit_header header;
2145 u32 device_handle;
2146 u16 hint_count;
2147 u8 reserved[6]; /* Reserved, must be zero */
2148 u64 hint_address[]; /* Variable length */
2149};
2150
2151/* 7: Platform Capabilities Structure */
2152
2153struct acpi_nfit_capabilities {
2154 struct acpi_nfit_header header;
2155 u8 highest_capability;
2156 u8 reserved[3]; /* Reserved, must be zero */
2157 u32 capabilities;
2158 u32 reserved2;
2159};
2160
2161/* Capabilities Flags */
2162
2163#define ACPI_NFIT_CAPABILITY_CACHE_FLUSH (1) /* 00: Cache Flush to NVDIMM capable */
2164#define ACPI_NFIT_CAPABILITY_MEM_FLUSH (1<<1) /* 01: Memory Flush to NVDIMM capable */
2165#define ACPI_NFIT_CAPABILITY_MEM_MIRRORING (1<<2) /* 02: Memory Mirroring capable */
2166
2167/*
2168 * NFIT/DVDIMM device handle support - used as the _ADR for each NVDIMM
2169 */
2170struct nfit_device_handle {
2171 u32 handle;
2172};
2173
2174/* Device handle construction and extraction macros */
2175
2176#define ACPI_NFIT_DIMM_NUMBER_MASK 0x0000000F
2177#define ACPI_NFIT_CHANNEL_NUMBER_MASK 0x000000F0
2178#define ACPI_NFIT_MEMORY_ID_MASK 0x00000F00
2179#define ACPI_NFIT_SOCKET_ID_MASK 0x0000F000
2180#define ACPI_NFIT_NODE_ID_MASK 0x0FFF0000
2181
2182#define ACPI_NFIT_DIMM_NUMBER_OFFSET 0
2183#define ACPI_NFIT_CHANNEL_NUMBER_OFFSET 4
2184#define ACPI_NFIT_MEMORY_ID_OFFSET 8
2185#define ACPI_NFIT_SOCKET_ID_OFFSET 12
2186#define ACPI_NFIT_NODE_ID_OFFSET 16
2187
2188/* Macro to construct a NFIT/NVDIMM device handle */
2189
2190#define ACPI_NFIT_BUILD_DEVICE_HANDLE(dimm, channel, memory, socket, node) \
2191 ((dimm) | \
2192 ((channel) << ACPI_NFIT_CHANNEL_NUMBER_OFFSET) | \
2193 ((memory) << ACPI_NFIT_MEMORY_ID_OFFSET) | \
2194 ((socket) << ACPI_NFIT_SOCKET_ID_OFFSET) | \
2195 ((node) << ACPI_NFIT_NODE_ID_OFFSET))
2196
2197/* Macros to extract individual fields from a NFIT/NVDIMM device handle */
2198
2199#define ACPI_NFIT_GET_DIMM_NUMBER(handle) \
2200 ((handle) & ACPI_NFIT_DIMM_NUMBER_MASK)
2201
2202#define ACPI_NFIT_GET_CHANNEL_NUMBER(handle) \
2203 (((handle) & ACPI_NFIT_CHANNEL_NUMBER_MASK) >> ACPI_NFIT_CHANNEL_NUMBER_OFFSET)
2204
2205#define ACPI_NFIT_GET_MEMORY_ID(handle) \
2206 (((handle) & ACPI_NFIT_MEMORY_ID_MASK) >> ACPI_NFIT_MEMORY_ID_OFFSET)
2207
2208#define ACPI_NFIT_GET_SOCKET_ID(handle) \
2209 (((handle) & ACPI_NFIT_SOCKET_ID_MASK) >> ACPI_NFIT_SOCKET_ID_OFFSET)
2210
2211#define ACPI_NFIT_GET_NODE_ID(handle) \
2212 (((handle) & ACPI_NFIT_NODE_ID_MASK) >> ACPI_NFIT_NODE_ID_OFFSET)
2213
2214/*******************************************************************************
2215 *
2216 * NHLT - Non HDAudio Link Table
2217 * Version 1
2218 *
2219 ******************************************************************************/
2220
2221struct acpi_table_nhlt {
2222 struct acpi_table_header header; /* Common ACPI table header */
2223 u8 endpoints_count;
2224 /*
2225 * struct acpi_nhlt_endpoint endpoints[];
2226 * struct acpi_nhlt_config oed_config;
2227 */
2228};
2229
2230struct acpi_nhlt_endpoint {
2231 u32 length;
2232 u8 link_type;
2233 u8 instance_id;
2234 u16 vendor_id;
2235 u16 device_id;
2236 u16 revision_id;
2237 u32 subsystem_id;
2238 u8 device_type;
2239 u8 direction;
2240 u8 virtual_bus_id;
2241 /*
2242 * struct acpi_nhlt_config device_config;
2243 * struct acpi_nhlt_formats_config formats_config;
2244 * struct acpi_nhlt_devices_info devices_info;
2245 */
2246};
2247
2248/*
2249 * Values for link_type field above
2250 *
2251 * Only types PDM and SSP are used
2252 */
2253#define ACPI_NHLT_LINKTYPE_HDA 0
2254#define ACPI_NHLT_LINKTYPE_DSP 1
2255#define ACPI_NHLT_LINKTYPE_PDM 2
2256#define ACPI_NHLT_LINKTYPE_SSP 3
2257#define ACPI_NHLT_LINKTYPE_SLIMBUS 4
2258#define ACPI_NHLT_LINKTYPE_SDW 5
2259#define ACPI_NHLT_LINKTYPE_UAOL 6
2260
2261/* Values for device_id field above */
2262
2263#define ACPI_NHLT_DEVICEID_DMIC 0xAE20
2264#define ACPI_NHLT_DEVICEID_BT 0xAE30
2265#define ACPI_NHLT_DEVICEID_I2S 0xAE34
2266
2267/* Values for device_type field above */
2268
2269/*
2270 * Device types unique to endpoint of link_type=PDM
2271 *
2272 * Type PDM used for all SKL+ platforms
2273 */
2274#define ACPI_NHLT_DEVICETYPE_PDM 0
2275#define ACPI_NHLT_DEVICETYPE_PDM_SKL 1
2276/* Device types unique to endpoint of link_type=SSP */
2277#define ACPI_NHLT_DEVICETYPE_BT 0
2278#define ACPI_NHLT_DEVICETYPE_FM 1
2279#define ACPI_NHLT_DEVICETYPE_MODEM 2
2280#define ACPI_NHLT_DEVICETYPE_CODEC 4
2281
2282/* Values for Direction field above */
2283
2284#define ACPI_NHLT_DIR_RENDER 0
2285#define ACPI_NHLT_DIR_CAPTURE 1
2286
2287struct acpi_nhlt_config {
2288 u32 capabilities_size;
2289 u8 capabilities[];
2290};
2291
2292struct acpi_nhlt_gendevice_config {
2293 u8 virtual_slot;
2294 u8 config_type;
2295};
2296
2297/* Values for config_type field above */
2298
2299#define ACPI_NHLT_CONFIGTYPE_GENERIC 0
2300#define ACPI_NHLT_CONFIGTYPE_MICARRAY 1
2301
2302struct acpi_nhlt_micdevice_config {
2303 u8 virtual_slot;
2304 u8 config_type;
2305 u8 array_type;
2306};
2307
2308/* Values for array_type field above */
2309
2310#define ACPI_NHLT_ARRAYTYPE_LINEAR2_SMALL 0xA
2311#define ACPI_NHLT_ARRAYTYPE_LINEAR2_BIG 0xB
2312#define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO1 0xC
2313#define ACPI_NHLT_ARRAYTYPE_PLANAR4_LSHAPED 0xD
2314#define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO2 0xE
2315#define ACPI_NHLT_ARRAYTYPE_VENDOR 0xF
2316
2317struct acpi_nhlt_vendor_mic_config {
2318 u8 type;
2319 u8 panel;
2320 u16 speaker_position_distance; /* mm */
2321 u16 horizontal_offset; /* mm */
2322 u16 vertical_offset; /* mm */
2323 u8 frequency_low_band; /* 5*Hz */
2324 u8 frequency_high_band; /* 500*Hz */
2325 u16 direction_angle; /* -180 - +180 */
2326 u16 elevation_angle; /* -180 - +180 */
2327 u16 work_vertical_angle_begin; /* -180 - +180 with 2 deg step */
2328 u16 work_vertical_angle_end; /* -180 - +180 with 2 deg step */
2329 u16 work_horizontal_angle_begin; /* -180 - +180 with 2 deg step */
2330 u16 work_horizontal_angle_end; /* -180 - +180 with 2 deg step */
2331};
2332
2333/* Values for Type field above */
2334
2335#define ACPI_NHLT_MICTYPE_OMNIDIRECTIONAL 0
2336#define ACPI_NHLT_MICTYPE_SUBCARDIOID 1
2337#define ACPI_NHLT_MICTYPE_CARDIOID 2
2338#define ACPI_NHLT_MICTYPE_SUPERCARDIOID 3
2339#define ACPI_NHLT_MICTYPE_HYPERCARDIOID 4
2340#define ACPI_NHLT_MICTYPE_8SHAPED 5
2341#define ACPI_NHLT_MICTYPE_RESERVED 6
2342#define ACPI_NHLT_MICTYPE_VENDORDEFINED 7
2343
2344/* Values for Panel field above */
2345
2346#define ACPI_NHLT_MICLOCATION_TOP 0
2347#define ACPI_NHLT_MICLOCATION_BOTTOM 1
2348#define ACPI_NHLT_MICLOCATION_LEFT 2
2349#define ACPI_NHLT_MICLOCATION_RIGHT 3
2350#define ACPI_NHLT_MICLOCATION_FRONT 4
2351#define ACPI_NHLT_MICLOCATION_REAR 5
2352
2353struct acpi_nhlt_vendor_micdevice_config {
2354 u8 virtual_slot;
2355 u8 config_type;
2356 u8 array_type;
2357 u8 mics_count;
2358 struct acpi_nhlt_vendor_mic_config mics[];
2359};
2360
2361union acpi_nhlt_device_config {
2362 u8 virtual_slot;
2363 struct acpi_nhlt_gendevice_config gen;
2364 struct acpi_nhlt_micdevice_config mic;
2365 struct acpi_nhlt_vendor_micdevice_config vendor_mic;
2366};
2367
2368/* Inherited from Microsoft's WAVEFORMATEXTENSIBLE. */
2369struct acpi_nhlt_wave_formatext {
2370 u16 format_tag;
2371 u16 channel_count;
2372 u32 samples_per_sec;
2373 u32 avg_bytes_per_sec;
2374 u16 block_align;
2375 u16 bits_per_sample;
2376 u16 extra_format_size;
2377 u16 valid_bits_per_sample;
2378 u32 channel_mask;
2379 u8 subformat[16];
2380};
2381
2382struct acpi_nhlt_format_config {
2383 struct acpi_nhlt_wave_formatext format;
2384 struct acpi_nhlt_config config;
2385};
2386
2387struct acpi_nhlt_formats_config {
2388 u8 formats_count;
2389 struct acpi_nhlt_format_config formats[];
2390};
2391
2392struct acpi_nhlt_device_info {
2393 u8 id[16];
2394 u8 instance_id;
2395 u8 port_id;
2396};
2397
2398struct acpi_nhlt_devices_info {
2399 u8 devices_count;
2400 struct acpi_nhlt_device_info devices[];
2401};
2402
2403/*******************************************************************************
2404 *
2405 * PCCT - Platform Communications Channel Table (ACPI 5.0)
2406 * Version 2 (ACPI 6.2)
2407 *
2408 ******************************************************************************/
2409
2410struct acpi_table_pcct {
2411 struct acpi_table_header header; /* Common ACPI table header */
2412 u32 flags;
2413 u64 reserved;
2414};
2415
2416/* Values for Flags field above */
2417
2418#define ACPI_PCCT_DOORBELL 1
2419
2420/* Values for subtable type in struct acpi_subtable_header */
2421
2422enum acpi_pcct_type {
2423 ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0,
2424 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1,
2425 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2, /* ACPI 6.1 */
2426 ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3, /* ACPI 6.2 */
2427 ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4, /* ACPI 6.2 */
2428 ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE = 5, /* ACPI 6.4 */
2429 ACPI_PCCT_TYPE_RESERVED = 6 /* 6 and greater are reserved */
2430};
2431
2432/*
2433 * PCCT Subtables, correspond to Type in struct acpi_subtable_header
2434 */
2435
2436/* 0: Generic Communications Subspace */
2437
2438struct acpi_pcct_subspace {
2439 struct acpi_subtable_header header;
2440 u8 reserved[6];
2441 u64 base_address;
2442 u64 length;
2443 struct acpi_generic_address doorbell_register;
2444 u64 preserve_mask;
2445 u64 write_mask;
2446 u32 latency;
2447 u32 max_access_rate;
2448 u16 min_turnaround_time;
2449};
2450
2451/* 1: HW-reduced Communications Subspace (ACPI 5.1) */
2452
2453struct acpi_pcct_hw_reduced {
2454 struct acpi_subtable_header header;
2455 u32 platform_interrupt;
2456 u8 flags;
2457 u8 reserved;
2458 u64 base_address;
2459 u64 length;
2460 struct acpi_generic_address doorbell_register;
2461 u64 preserve_mask;
2462 u64 write_mask;
2463 u32 latency;
2464 u32 max_access_rate;
2465 u16 min_turnaround_time;
2466};
2467
2468/* 2: HW-reduced Communications Subspace Type 2 (ACPI 6.1) */
2469
2470struct acpi_pcct_hw_reduced_type2 {
2471 struct acpi_subtable_header header;
2472 u32 platform_interrupt;
2473 u8 flags;
2474 u8 reserved;
2475 u64 base_address;
2476 u64 length;
2477 struct acpi_generic_address doorbell_register;
2478 u64 preserve_mask;
2479 u64 write_mask;
2480 u32 latency;
2481 u32 max_access_rate;
2482 u16 min_turnaround_time;
2483 struct acpi_generic_address platform_ack_register;
2484 u64 ack_preserve_mask;
2485 u64 ack_write_mask;
2486};
2487
2488/* 3: Extended PCC Master Subspace Type 3 (ACPI 6.2) */
2489
2490struct acpi_pcct_ext_pcc_master {
2491 struct acpi_subtable_header header;
2492 u32 platform_interrupt;
2493 u8 flags;
2494 u8 reserved1;
2495 u64 base_address;
2496 u32 length;
2497 struct acpi_generic_address doorbell_register;
2498 u64 preserve_mask;
2499 u64 write_mask;
2500 u32 latency;
2501 u32 max_access_rate;
2502 u32 min_turnaround_time;
2503 struct acpi_generic_address platform_ack_register;
2504 u64 ack_preserve_mask;
2505 u64 ack_set_mask;
2506 u64 reserved2;
2507 struct acpi_generic_address cmd_complete_register;
2508 u64 cmd_complete_mask;
2509 struct acpi_generic_address cmd_update_register;
2510 u64 cmd_update_preserve_mask;
2511 u64 cmd_update_set_mask;
2512 struct acpi_generic_address error_status_register;
2513 u64 error_status_mask;
2514};
2515
2516/* 4: Extended PCC Slave Subspace Type 4 (ACPI 6.2) */
2517
2518struct acpi_pcct_ext_pcc_slave {
2519 struct acpi_subtable_header header;
2520 u32 platform_interrupt;
2521 u8 flags;
2522 u8 reserved1;
2523 u64 base_address;
2524 u32 length;
2525 struct acpi_generic_address doorbell_register;
2526 u64 preserve_mask;
2527 u64 write_mask;
2528 u32 latency;
2529 u32 max_access_rate;
2530 u32 min_turnaround_time;
2531 struct acpi_generic_address platform_ack_register;
2532 u64 ack_preserve_mask;
2533 u64 ack_set_mask;
2534 u64 reserved2;
2535 struct acpi_generic_address cmd_complete_register;
2536 u64 cmd_complete_mask;
2537 struct acpi_generic_address cmd_update_register;
2538 u64 cmd_update_preserve_mask;
2539 u64 cmd_update_set_mask;
2540 struct acpi_generic_address error_status_register;
2541 u64 error_status_mask;
2542};
2543
2544/* 5: HW Registers based Communications Subspace */
2545
2546struct acpi_pcct_hw_reg {
2547 struct acpi_subtable_header header;
2548 u16 version;
2549 u64 base_address;
2550 u64 length;
2551 struct acpi_generic_address doorbell_register;
2552 u64 doorbell_preserve;
2553 u64 doorbell_write;
2554 struct acpi_generic_address cmd_complete_register;
2555 u64 cmd_complete_mask;
2556 struct acpi_generic_address error_status_register;
2557 u64 error_status_mask;
2558 u32 nominal_latency;
2559 u32 min_turnaround_time;
2560};
2561
2562/* Values for doorbell flags above */
2563
2564#define ACPI_PCCT_INTERRUPT_POLARITY (1)
2565#define ACPI_PCCT_INTERRUPT_MODE (1<<1)
2566
2567/*
2568 * PCC memory structures (not part of the ACPI table)
2569 */
2570
2571/* Shared Memory Region */
2572
2573struct acpi_pcct_shared_memory {
2574 u32 signature;
2575 u16 command;
2576 u16 status;
2577};
2578
2579/* Extended PCC Subspace Shared Memory Region (ACPI 6.2) */
2580
2581struct acpi_pcct_ext_pcc_shared_memory {
2582 u32 signature;
2583 u32 flags;
2584 u32 length;
2585 u32 command;
2586};
2587
2588/*******************************************************************************
2589 *
2590 * PDTT - Platform Debug Trigger Table (ACPI 6.2)
2591 * Version 0
2592 *
2593 ******************************************************************************/
2594
2595struct acpi_table_pdtt {
2596 struct acpi_table_header header; /* Common ACPI table header */
2597 u8 trigger_count;
2598 u8 reserved[3];
2599 u32 array_offset;
2600};
2601
2602/*
2603 * PDTT Communication Channel Identifier Structure.
2604 * The number of these structures is defined by trigger_count above,
2605 * starting at array_offset.
2606 */
2607struct acpi_pdtt_channel {
2608 u8 subchannel_id;
2609 u8 flags;
2610};
2611
2612/* Flags for above */
2613
2614#define ACPI_PDTT_RUNTIME_TRIGGER (1)
2615#define ACPI_PDTT_WAIT_COMPLETION (1<<1)
2616#define ACPI_PDTT_TRIGGER_ORDER (1<<2)
2617
2618/*******************************************************************************
2619 *
2620 * PHAT - Platform Health Assessment Table (ACPI 6.4)
2621 * Version 1
2622 *
2623 ******************************************************************************/
2624
2625struct acpi_table_phat {
2626 struct acpi_table_header header; /* Common ACPI table header */
2627};
2628
2629/* Common header for PHAT subtables that follow main table */
2630
2631struct acpi_phat_header {
2632 u16 type;
2633 u16 length;
2634 u8 revision;
2635};
2636
2637/* Values for Type field above */
2638
2639#define ACPI_PHAT_TYPE_FW_VERSION_DATA 0
2640#define ACPI_PHAT_TYPE_FW_HEALTH_DATA 1
2641#define ACPI_PHAT_TYPE_RESERVED 2 /* 0x02-0xFFFF are reserved */
2642
2643/*
2644 * PHAT subtables, correspond to Type in struct acpi_phat_header
2645 */
2646
2647/* 0: Firmware Version Data Record */
2648
2649struct acpi_phat_version_data {
2650 struct acpi_phat_header header;
2651 u8 reserved[3];
2652 u32 element_count;
2653};
2654
2655struct acpi_phat_version_element {
2656 u8 guid[16];
2657 u64 version_value;
2658 u32 producer_id;
2659};
2660
2661/* 1: Firmware Health Data Record */
2662
2663struct acpi_phat_health_data {
2664 struct acpi_phat_header header;
2665 u8 reserved[2];
2666 u8 health;
2667 u8 device_guid[16];
2668 u32 device_specific_offset; /* Zero if no Device-specific data */
2669};
2670
2671/* Values for Health field above */
2672
2673#define ACPI_PHAT_ERRORS_FOUND 0
2674#define ACPI_PHAT_NO_ERRORS 1
2675#define ACPI_PHAT_UNKNOWN_ERRORS 2
2676#define ACPI_PHAT_ADVISORY 3
2677
2678/*******************************************************************************
2679 *
2680 * PMTT - Platform Memory Topology Table (ACPI 5.0)
2681 * Version 1
2682 *
2683 ******************************************************************************/
2684
2685struct acpi_table_pmtt {
2686 struct acpi_table_header header; /* Common ACPI table header */
2687 u32 memory_device_count;
2688 /*
2689 * Immediately followed by:
2690 * MEMORY_DEVICE memory_device_struct[memory_device_count];
2691 */
2692};
2693
2694/* Common header for PMTT subtables that follow main table */
2695
2696struct acpi_pmtt_header {
2697 u8 type;
2698 u8 reserved1;
2699 u16 length;
2700 u16 flags;
2701 u16 reserved2;
2702 u32 memory_device_count; /* Zero means no memory device structs follow */
2703 /*
2704 * Immediately followed by:
2705 * u8 type_specific_data[]
2706 * MEMORY_DEVICE memory_device_struct[memory_device_count];
2707 */
2708};
2709
2710/* Values for Type field above */
2711
2712#define ACPI_PMTT_TYPE_SOCKET 0
2713#define ACPI_PMTT_TYPE_CONTROLLER 1
2714#define ACPI_PMTT_TYPE_DIMM 2
2715#define ACPI_PMTT_TYPE_RESERVED 3 /* 0x03-0xFE are reserved */
2716#define ACPI_PMTT_TYPE_VENDOR 0xFF
2717
2718/* Values for Flags field above */
2719
2720#define ACPI_PMTT_TOP_LEVEL 0x0001
2721#define ACPI_PMTT_PHYSICAL 0x0002
2722#define ACPI_PMTT_MEMORY_TYPE 0x000C
2723
2724/*
2725 * PMTT subtables, correspond to Type in struct acpi_pmtt_header
2726 */
2727
2728/* 0: Socket Structure */
2729
2730struct acpi_pmtt_socket {
2731 struct acpi_pmtt_header header;
2732 u16 socket_id;
2733 u16 reserved;
2734};
2735 /*
2736 * Immediately followed by:
2737 * MEMORY_DEVICE memory_device_struct[memory_device_count];
2738 */
2739
2740/* 1: Memory Controller subtable */
2741
2742struct acpi_pmtt_controller {
2743 struct acpi_pmtt_header header;
2744 u16 controller_id;
2745 u16 reserved;
2746};
2747 /*
2748 * Immediately followed by:
2749 * MEMORY_DEVICE memory_device_struct[memory_device_count];
2750 */
2751
2752/* 2: Physical Component Identifier (DIMM) */
2753
2754struct acpi_pmtt_physical_component {
2755 struct acpi_pmtt_header header;
2756 u32 bios_handle;
2757};
2758
2759/* 0xFF: Vendor Specific Data */
2760
2761struct acpi_pmtt_vendor_specific {
2762 struct acpi_pmtt_header header;
2763 u8 type_uuid[16];
2764 u8 specific[];
2765 /*
2766 * Immediately followed by:
2767 * u8 vendor_specific_data[];
2768 * MEMORY_DEVICE memory_device_struct[memory_device_count];
2769 */
2770};
2771
2772/*******************************************************************************
2773 *
2774 * PPTT - Processor Properties Topology Table (ACPI 6.2)
2775 * Version 1
2776 *
2777 ******************************************************************************/
2778
2779struct acpi_table_pptt {
2780 struct acpi_table_header header; /* Common ACPI table header */
2781};
2782
2783/* Values for Type field above */
2784
2785enum acpi_pptt_type {
2786 ACPI_PPTT_TYPE_PROCESSOR = 0,
2787 ACPI_PPTT_TYPE_CACHE = 1,
2788 ACPI_PPTT_TYPE_ID = 2,
2789 ACPI_PPTT_TYPE_RESERVED = 3
2790};
2791
2792/* 0: Processor Hierarchy Node Structure */
2793
2794struct acpi_pptt_processor {
2795 struct acpi_subtable_header header;
2796 u16 reserved;
2797 u32 flags;
2798 u32 parent;
2799 u32 acpi_processor_id;
2800 u32 number_of_priv_resources;
2801};
2802
2803/* Flags */
2804
2805#define ACPI_PPTT_PHYSICAL_PACKAGE (1)
2806#define ACPI_PPTT_ACPI_PROCESSOR_ID_VALID (1<<1)
2807#define ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD (1<<2) /* ACPI 6.3 */
2808#define ACPI_PPTT_ACPI_LEAF_NODE (1<<3) /* ACPI 6.3 */
2809#define ACPI_PPTT_ACPI_IDENTICAL (1<<4) /* ACPI 6.3 */
2810
2811/* 1: Cache Type Structure */
2812
2813struct acpi_pptt_cache {
2814 struct acpi_subtable_header header;
2815 u16 reserved;
2816 u32 flags;
2817 u32 next_level_of_cache;
2818 u32 size;
2819 u32 number_of_sets;
2820 u8 associativity;
2821 u8 attributes;
2822 u16 line_size;
2823};
2824
2825/* 1: Cache Type Structure for PPTT version 3 */
2826
2827struct acpi_pptt_cache_v1 {
2828 u32 cache_id;
2829};
2830
2831/* Flags */
2832
2833#define ACPI_PPTT_SIZE_PROPERTY_VALID (1) /* Physical property valid */
2834#define ACPI_PPTT_NUMBER_OF_SETS_VALID (1<<1) /* Number of sets valid */
2835#define ACPI_PPTT_ASSOCIATIVITY_VALID (1<<2) /* Associativity valid */
2836#define ACPI_PPTT_ALLOCATION_TYPE_VALID (1<<3) /* Allocation type valid */
2837#define ACPI_PPTT_CACHE_TYPE_VALID (1<<4) /* Cache type valid */
2838#define ACPI_PPTT_WRITE_POLICY_VALID (1<<5) /* Write policy valid */
2839#define ACPI_PPTT_LINE_SIZE_VALID (1<<6) /* Line size valid */
2840#define ACPI_PPTT_CACHE_ID_VALID (1<<7) /* Cache ID valid */
2841
2842/* Masks for Attributes */
2843
2844#define ACPI_PPTT_MASK_ALLOCATION_TYPE (0x03) /* Allocation type */
2845#define ACPI_PPTT_MASK_CACHE_TYPE (0x0C) /* Cache type */
2846#define ACPI_PPTT_MASK_WRITE_POLICY (0x10) /* Write policy */
2847
2848/* Attributes describing cache */
2849#define ACPI_PPTT_CACHE_READ_ALLOCATE (0x0) /* Cache line is allocated on read */
2850#define ACPI_PPTT_CACHE_WRITE_ALLOCATE (0x01) /* Cache line is allocated on write */
2851#define ACPI_PPTT_CACHE_RW_ALLOCATE (0x02) /* Cache line is allocated on read and write */
2852#define ACPI_PPTT_CACHE_RW_ALLOCATE_ALT (0x03) /* Alternate representation of above */
2853
2854#define ACPI_PPTT_CACHE_TYPE_DATA (0x0) /* Data cache */
2855#define ACPI_PPTT_CACHE_TYPE_INSTR (1<<2) /* Instruction cache */
2856#define ACPI_PPTT_CACHE_TYPE_UNIFIED (2<<2) /* Unified I & D cache */
2857#define ACPI_PPTT_CACHE_TYPE_UNIFIED_ALT (3<<2) /* Alternate representation of above */
2858
2859#define ACPI_PPTT_CACHE_POLICY_WB (0x0) /* Cache is write back */
2860#define ACPI_PPTT_CACHE_POLICY_WT (1<<4) /* Cache is write through */
2861
2862/* 2: ID Structure */
2863
2864struct acpi_pptt_id {
2865 struct acpi_subtable_header header;
2866 u16 reserved;
2867 u32 vendor_id;
2868 u64 level1_id;
2869 u64 level2_id;
2870 u16 major_rev;
2871 u16 minor_rev;
2872 u16 spin_rev;
2873};
2874
2875/*******************************************************************************
2876 *
2877 * PRMT - Platform Runtime Mechanism Table
2878 * Version 1
2879 *
2880 ******************************************************************************/
2881
2882struct acpi_table_prmt {
2883 struct acpi_table_header header; /* Common ACPI table header */
2884};
2885
2886struct acpi_table_prmt_header {
2887 u8 platform_guid[16];
2888 u32 module_info_offset;
2889 u32 module_info_count;
2890};
2891
2892struct acpi_prmt_module_header {
2893 u16 revision;
2894 u16 length;
2895};
2896
2897struct acpi_prmt_module_info {
2898 u16 revision;
2899 u16 length;
2900 u8 module_guid[16];
2901 u16 major_rev;
2902 u16 minor_rev;
2903 u16 handler_info_count;
2904 u32 handler_info_offset;
2905 u64 mmio_list_pointer;
2906};
2907
2908struct acpi_prmt_handler_info {
2909 u16 revision;
2910 u16 length;
2911 u8 handler_guid[16];
2912 u64 handler_address;
2913 u64 static_data_buffer_address;
2914 u64 acpi_param_buffer_address;
2915};
2916
2917/*******************************************************************************
2918 *
2919 * RASF - RAS Feature Table (ACPI 5.0)
2920 * Version 1
2921 *
2922 ******************************************************************************/
2923
2924struct acpi_table_rasf {
2925 struct acpi_table_header header; /* Common ACPI table header */
2926 u8 channel_id[12];
2927};
2928
2929/* RASF Platform Communication Channel Shared Memory Region */
2930
2931struct acpi_rasf_shared_memory {
2932 u32 signature;
2933 u16 command;
2934 u16 status;
2935 u16 version;
2936 u8 capabilities[16];
2937 u8 set_capabilities[16];
2938 u16 num_parameter_blocks;
2939 u32 set_capabilities_status;
2940};
2941
2942/* RASF Parameter Block Structure Header */
2943
2944struct acpi_rasf_parameter_block {
2945 u16 type;
2946 u16 version;
2947 u16 length;
2948};
2949
2950/* RASF Parameter Block Structure for PATROL_SCRUB */
2951
2952struct acpi_rasf_patrol_scrub_parameter {
2953 struct acpi_rasf_parameter_block header;
2954 u16 patrol_scrub_command;
2955 u64 requested_address_range[2];
2956 u64 actual_address_range[2];
2957 u16 flags;
2958 u8 requested_speed;
2959};
2960
2961/* Masks for Flags and Speed fields above */
2962
2963#define ACPI_RASF_SCRUBBER_RUNNING 1
2964#define ACPI_RASF_SPEED (7<<1)
2965#define ACPI_RASF_SPEED_SLOW (0<<1)
2966#define ACPI_RASF_SPEED_MEDIUM (4<<1)
2967#define ACPI_RASF_SPEED_FAST (7<<1)
2968
2969/* Channel Commands */
2970
2971enum acpi_rasf_commands {
2972 ACPI_RASF_EXECUTE_RASF_COMMAND = 1
2973};
2974
2975/* Platform RAS Capabilities */
2976
2977enum acpi_rasf_capabiliities {
2978 ACPI_HW_PATROL_SCRUB_SUPPORTED = 0,
2979 ACPI_SW_PATROL_SCRUB_EXPOSED = 1
2980};
2981
2982/* Patrol Scrub Commands */
2983
2984enum acpi_rasf_patrol_scrub_commands {
2985 ACPI_RASF_GET_PATROL_PARAMETERS = 1,
2986 ACPI_RASF_START_PATROL_SCRUBBER = 2,
2987 ACPI_RASF_STOP_PATROL_SCRUBBER = 3
2988};
2989
2990/* Channel Command flags */
2991
2992#define ACPI_RASF_GENERATE_SCI (1<<15)
2993
2994/* Status values */
2995
2996enum acpi_rasf_status {
2997 ACPI_RASF_SUCCESS = 0,
2998 ACPI_RASF_NOT_VALID = 1,
2999 ACPI_RASF_NOT_SUPPORTED = 2,
3000 ACPI_RASF_BUSY = 3,
3001 ACPI_RASF_FAILED = 4,
3002 ACPI_RASF_ABORTED = 5,
3003 ACPI_RASF_INVALID_DATA = 6
3004};
3005
3006/* Status flags */
3007
3008#define ACPI_RASF_COMMAND_COMPLETE (1)
3009#define ACPI_RASF_SCI_DOORBELL (1<<1)
3010#define ACPI_RASF_ERROR (1<<2)
3011#define ACPI_RASF_STATUS (0x1F<<3)
3012
3013/*******************************************************************************
3014 *
3015 * RAS2 - RAS2 Feature Table (ACPI 6.5)
3016 * Version 1
3017 *
3018 *
3019 ******************************************************************************/
3020
3021struct acpi_table_ras2 {
3022 struct acpi_table_header header; /* Common ACPI table header */
3023 u16 reserved;
3024 u16 num_pcc_descs;
3025};
3026
3027/* RAS2 Platform Communication Channel Descriptor */
3028
3029struct acpi_ras2_pcc_desc {
3030 u8 channel_id;
3031 u16 reserved;
3032 u8 feature_type;
3033 u32 instance;
3034};
3035
3036/* RAS2 Platform Communication Channel Shared Memory Region */
3037
3038struct acpi_ras2_shmem {
3039 u32 signature;
3040 u16 command;
3041 u16 status;
3042 u16 version;
3043 u8 features[16];
3044 u8 set_caps[16];
3045 u16 num_param_blks;
3046 u32 set_caps_status;
3047};
3048
3049/* RAS2 Parameter Block Structure for PATROL_SCRUB */
3050
3051struct acpi_ras2_parameter_block {
3052 u16 type;
3053 u16 version;
3054 u16 length;
3055};
3056
3057/* RAS2 Parameter Block Structure for PATROL_SCRUB */
3058
3059struct acpi_ras2_patrol_scrub_param {
3060 struct acpi_ras2_parameter_block header;
3061 u16 command;
3062 u64 req_addr_range[2];
3063 u64 actl_addr_range[2];
3064 u32 flags;
3065 u32 scrub_params_out;
3066 u32 scrub_params_in;
3067};
3068
3069/* Masks for Flags field above */
3070
3071#define ACPI_RAS2_SCRUBBER_RUNNING 1
3072
3073/* RAS2 Parameter Block Structure for LA2PA_TRANSLATION */
3074
3075struct acpi_ras2_la2pa_translation_parameter {
3076 struct acpi_ras2_parameter_block header;
3077 u16 addr_translation_command;
3078 u64 sub_inst_id;
3079 u64 logical_address;
3080 u64 physical_address;
3081 u32 status;
3082};
3083
3084/* Channel Commands */
3085
3086enum acpi_ras2_commands {
3087 ACPI_RAS2_EXECUTE_RAS2_COMMAND = 1
3088};
3089
3090/* Platform RAS2 Features */
3091
3092enum acpi_ras2_features {
3093 ACPI_RAS2_PATROL_SCRUB_SUPPORTED = 0,
3094 ACPI_RAS2_LA2PA_TRANSLATION = 1
3095};
3096
3097/* RAS2 Patrol Scrub Commands */
3098
3099enum acpi_ras2_patrol_scrub_commands {
3100 ACPI_RAS2_GET_PATROL_PARAMETERS = 1,
3101 ACPI_RAS2_START_PATROL_SCRUBBER = 2,
3102 ACPI_RAS2_STOP_PATROL_SCRUBBER = 3
3103};
3104
3105/* RAS2 LA2PA Translation Commands */
3106
3107enum acpi_ras2_la2_pa_translation_commands {
3108 ACPI_RAS2_GET_LA2PA_TRANSLATION = 1,
3109};
3110
3111/* RAS2 LA2PA Translation Status values */
3112
3113enum acpi_ras2_la2_pa_translation_status {
3114 ACPI_RAS2_LA2PA_TRANSLATION_SUCCESS = 0,
3115 ACPI_RAS2_LA2PA_TRANSLATION_FAIL = 1,
3116};
3117
3118/* Channel Command flags */
3119
3120#define ACPI_RAS2_GENERATE_SCI (1<<15)
3121
3122/* Status values */
3123
3124enum acpi_ras2_status {
3125 ACPI_RAS2_SUCCESS = 0,
3126 ACPI_RAS2_NOT_VALID = 1,
3127 ACPI_RAS2_NOT_SUPPORTED = 2,
3128 ACPI_RAS2_BUSY = 3,
3129 ACPI_RAS2_FAILED = 4,
3130 ACPI_RAS2_ABORTED = 5,
3131 ACPI_RAS2_INVALID_DATA = 6
3132};
3133
3134/* Status flags */
3135
3136#define ACPI_RAS2_COMMAND_COMPLETE (1)
3137#define ACPI_RAS2_SCI_DOORBELL (1<<1)
3138#define ACPI_RAS2_ERROR (1<<2)
3139#define ACPI_RAS2_STATUS (0x1F<<3)
3140
3141/*******************************************************************************
3142 *
3143 * RGRT - Regulatory Graphics Resource Table
3144 * Version 1
3145 *
3146 * Conforms to "ACPI RGRT" available at:
3147 * https://microsoft.github.io/mu/dyn/mu_plus/ms_core_pkg/acpi_RGRT/feature_acpi_rgrt/
3148 *
3149 ******************************************************************************/
3150
3151struct acpi_table_rgrt {
3152 struct acpi_table_header header; /* Common ACPI table header */
3153 u16 version;
3154 u8 image_type;
3155 u8 reserved;
3156 u8 image[];
3157};
3158
3159/* image_type values */
3160
3161enum acpi_rgrt_image_type {
3162 ACPI_RGRT_TYPE_RESERVED0 = 0,
3163 ACPI_RGRT_IMAGE_TYPE_PNG = 1,
3164 ACPI_RGRT_TYPE_RESERVED = 2 /* 2 and greater are reserved */
3165};
3166
3167/*******************************************************************************
3168 *
3169 * RHCT - RISC-V Hart Capabilities Table
3170 * Version 1
3171 *
3172 ******************************************************************************/
3173
3174struct acpi_table_rhct {
3175 struct acpi_table_header header; /* Common ACPI table header */
3176 u32 flags; /* RHCT flags */
3177 u64 time_base_freq;
3178 u32 node_count;
3179 u32 node_offset;
3180};
3181
3182/* RHCT Flags */
3183
3184#define ACPI_RHCT_TIMER_CANNOT_WAKEUP_CPU (1)
3185/*
3186 * RHCT subtables
3187 */
3188struct acpi_rhct_node_header {
3189 u16 type;
3190 u16 length;
3191 u16 revision;
3192};
3193
3194/* Values for RHCT subtable Type above */
3195
3196enum acpi_rhct_node_type {
3197 ACPI_RHCT_NODE_TYPE_ISA_STRING = 0x0000,
3198 ACPI_RHCT_NODE_TYPE_CMO = 0x0001,
3199 ACPI_RHCT_NODE_TYPE_MMU = 0x0002,
3200 ACPI_RHCT_NODE_TYPE_RESERVED = 0x0003,
3201 ACPI_RHCT_NODE_TYPE_HART_INFO = 0xFFFF,
3202};
3203
3204/*
3205 * RHCT node specific subtables
3206 */
3207
3208/* ISA string node structure */
3209struct acpi_rhct_isa_string {
3210 u16 isa_length;
3211 char isa[];
3212};
3213
3214struct acpi_rhct_cmo_node {
3215 u8 reserved; /* Must be zero */
3216 u8 cbom_size; /* CBOM size in powerof 2 */
3217 u8 cbop_size; /* CBOP size in powerof 2 */
3218 u8 cboz_size; /* CBOZ size in powerof 2 */
3219};
3220
3221struct acpi_rhct_mmu_node {
3222 u8 reserved; /* Must be zero */
3223 u8 mmu_type; /* Virtual Address Scheme */
3224};
3225
3226enum acpi_rhct_mmu_type {
3227 ACPI_RHCT_MMU_TYPE_SV39 = 0,
3228 ACPI_RHCT_MMU_TYPE_SV48 = 1,
3229 ACPI_RHCT_MMU_TYPE_SV57 = 2
3230};
3231
3232/* Hart Info node structure */
3233struct acpi_rhct_hart_info {
3234 u16 num_offsets;
3235 u32 uid; /* ACPI processor UID */
3236};
3237
3238/*******************************************************************************
3239 *
3240 * RIMT - RISC-V IO Remapping Table
3241 *
3242 * https://github.com/riscv-non-isa/riscv-acpi-rimt
3243 *
3244 ******************************************************************************/
3245
3246struct acpi_table_rimt {
3247 struct acpi_table_header header; /* Common ACPI table header */
3248 u32 num_nodes; /* Number of RIMT Nodes */
3249 u32 node_offset; /* Offset to RIMT Node Array */
3250 u32 reserved;
3251};
3252
3253struct acpi_rimt_node {
3254 u8 type;
3255 u8 revision;
3256 u16 length;
3257 u16 reserved;
3258 u16 id;
3259 char node_data[];
3260};
3261
3262enum acpi_rimt_node_type {
3263 ACPI_RIMT_NODE_TYPE_IOMMU = 0x0,
3264 ACPI_RIMT_NODE_TYPE_PCIE_ROOT_COMPLEX = 0x1,
3265 ACPI_RIMT_NODE_TYPE_PLAT_DEVICE = 0x2,
3266};
3267
3268struct acpi_rimt_iommu {
3269 u8 hardware_id[8]; /* Hardware ID */
3270 u64 base_address; /* Base Address */
3271 u32 flags; /* Flags */
3272 u32 proximity_domain; /* Proximity Domain */
3273 u16 pcie_segment_number; /* PCIe Segment number */
3274 u16 pcie_bdf; /* PCIe B/D/F */
3275 u16 num_interrupt_wires; /* Number of interrupt wires */
3276 u16 interrupt_wire_offset; /* Interrupt wire array offset */
3277 u64 interrupt_wire[]; /* Interrupt wire array */
3278};
3279
3280/* IOMMU Node Flags */
3281#define ACPI_RIMT_IOMMU_FLAGS_PCIE (1)
3282#define ACPI_RIMT_IOMMU_FLAGS_PXM_VALID (1 << 1)
3283
3284/* Interrupt Wire Structure */
3285struct acpi_rimt_iommu_wire_gsi {
3286 u32 irq_num; /* Interrupt Number */
3287 u32 flags; /* Flags */
3288};
3289
3290/* Interrupt Wire Flags */
3291#define ACPI_RIMT_GSI_LEVEL_TRIGGERRED (1)
3292#define ACPI_RIMT_GSI_ACTIVE_HIGH (1 << 1)
3293
3294struct acpi_rimt_id_mapping {
3295 u32 source_id_base; /* Source ID Base */
3296 u32 num_ids; /* Number of IDs */
3297 u32 dest_id_base; /* Destination Device ID Base */
3298 u32 dest_offset; /* Destination IOMMU Offset */
3299 u32 flags; /* Flags */
3300};
3301
3302struct acpi_rimt_pcie_rc {
3303 u32 flags; /* Flags */
3304 u16 reserved; /* Reserved */
3305 u16 pcie_segment_number; /* PCIe Segment number */
3306 u16 id_mapping_offset; /* ID mapping array offset */
3307 u16 num_id_mappings; /* Number of ID mappings */
3308};
3309
3310/* PCIe Root Complex Node Flags */
3311#define ACPI_RIMT_PCIE_ATS_SUPPORTED (1)
3312#define ACPI_RIMT_PCIE_PRI_SUPPORTED (1 << 1)
3313
3314struct acpi_rimt_platform_device {
3315 u16 id_mapping_offset; /* ID Mapping array offset */
3316 u16 num_id_mappings; /* Number of ID mappings */
3317 char device_name[]; /* Device Object Name */
3318};
3319
3320/*******************************************************************************
3321 *
3322 * SBST - Smart Battery Specification Table
3323 * Version 1
3324 *
3325 ******************************************************************************/
3326
3327struct acpi_table_sbst {
3328 struct acpi_table_header header; /* Common ACPI table header */
3329 u32 warning_level;
3330 u32 low_level;
3331 u32 critical_level;
3332};
3333
3334/*******************************************************************************
3335 *
3336 * SDEI - Software Delegated Exception Interface Descriptor Table
3337 *
3338 * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A,
3339 * May 8th, 2017. Copyright 2017 ARM Ltd.
3340 *
3341 ******************************************************************************/
3342
3343struct acpi_table_sdei {
3344 struct acpi_table_header header; /* Common ACPI table header */
3345};
3346
3347/*******************************************************************************
3348 *
3349 * SDEV - Secure Devices Table (ACPI 6.2)
3350 * Version 1
3351 *
3352 ******************************************************************************/
3353
3354struct acpi_table_sdev {
3355 struct acpi_table_header header; /* Common ACPI table header */
3356};
3357
3358struct acpi_sdev_header {
3359 u8 type;
3360 u8 flags;
3361 u16 length;
3362};
3363
3364/* Values for subtable type above */
3365
3366enum acpi_sdev_type {
3367 ACPI_SDEV_TYPE_NAMESPACE_DEVICE = 0,
3368 ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE = 1,
3369 ACPI_SDEV_TYPE_RESERVED = 2 /* 2 and greater are reserved */
3370};
3371
3372/* Values for flags above */
3373
3374#define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS (1)
3375#define ACPI_SDEV_SECURE_COMPONENTS_PRESENT (1<<1)
3376
3377/*
3378 * SDEV subtables
3379 */
3380
3381/* 0: Namespace Device Based Secure Device Structure */
3382
3383struct acpi_sdev_namespace {
3384 struct acpi_sdev_header header;
3385 u16 device_id_offset;
3386 u16 device_id_length;
3387 u16 vendor_data_offset;
3388 u16 vendor_data_length;
3389};
3390
3391struct acpi_sdev_secure_component {
3392 u16 secure_component_offset;
3393 u16 secure_component_length;
3394};
3395
3396/*
3397 * SDEV sub-subtables ("Components") for above
3398 */
3399struct acpi_sdev_component {
3400 struct acpi_sdev_header header;
3401};
3402
3403/* Values for sub-subtable type above */
3404
3405enum acpi_sac_type {
3406 ACPI_SDEV_TYPE_ID_COMPONENT = 0,
3407 ACPI_SDEV_TYPE_MEM_COMPONENT = 1
3408};
3409
3410struct acpi_sdev_id_component {
3411 struct acpi_sdev_header header;
3412 u16 hardware_id_offset;
3413 u16 hardware_id_length;
3414 u16 subsystem_id_offset;
3415 u16 subsystem_id_length;
3416 u16 hardware_revision;
3417 u8 hardware_rev_present;
3418 u8 class_code_present;
3419 u8 pci_base_class;
3420 u8 pci_sub_class;
3421 u8 pci_programming_xface;
3422};
3423
3424struct acpi_sdev_mem_component {
3425 struct acpi_sdev_header header;
3426 u32 reserved;
3427 u64 memory_base_address;
3428 u64 memory_length;
3429};
3430
3431/* 1: PCIe Endpoint Device Based Device Structure */
3432
3433struct acpi_sdev_pcie {
3434 struct acpi_sdev_header header;
3435 u16 segment;
3436 u16 start_bus;
3437 u16 path_offset;
3438 u16 path_length;
3439 u16 vendor_data_offset;
3440 u16 vendor_data_length;
3441};
3442
3443/* 1a: PCIe Endpoint path entry */
3444
3445struct acpi_sdev_pcie_path {
3446 u8 device;
3447 u8 function;
3448};
3449
3450/*******************************************************************************
3451 *
3452 * SVKL - Storage Volume Key Location Table (ACPI 6.4)
3453 * From: "Guest-Host-Communication Interface (GHCI) for Intel
3454 * Trust Domain Extensions (Intel TDX)".
3455 * Version 1
3456 *
3457 ******************************************************************************/
3458
3459struct acpi_table_svkl {
3460 struct acpi_table_header header; /* Common ACPI table header */
3461 u32 count;
3462};
3463
3464struct acpi_svkl_key {
3465 u16 type;
3466 u16 format;
3467 u32 size;
3468 u64 address;
3469};
3470
3471enum acpi_svkl_type {
3472 ACPI_SVKL_TYPE_MAIN_STORAGE = 0,
3473 ACPI_SVKL_TYPE_RESERVED = 1 /* 1 and greater are reserved */
3474};
3475
3476enum acpi_svkl_format {
3477 ACPI_SVKL_FORMAT_RAW_BINARY = 0,
3478 ACPI_SVKL_FORMAT_RESERVED = 1 /* 1 and greater are reserved */
3479};
3480
3481/*******************************************************************************
3482 *
3483 * TDEL - TD-Event Log
3484 * From: "Guest-Host-Communication Interface (GHCI) for Intel
3485 * Trust Domain Extensions (Intel TDX)".
3486 * September 2020
3487 *
3488 ******************************************************************************/
3489
3490struct acpi_table_tdel {
3491 struct acpi_table_header header; /* Common ACPI table header */
3492 u32 reserved;
3493 u64 log_area_minimum_length;
3494 u64 log_area_start_address;
3495};
3496
3497/* Reset to default packing */
3498
3499#pragma pack()
3500
3501#endif /* __ACTBL2_H__ */
3502

source code of linux/include/acpi/actbl2.h