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