1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2*4882a593Smuzhiyun /****************************************************************************** 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Name: actbl2.h - ACPI Table Definitions (tables not in ACPI spec) 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2000 - 2020, Intel Corp. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun *****************************************************************************/ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __ACTBL2_H__ 11*4882a593Smuzhiyun #define __ACTBL2_H__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /******************************************************************************* 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * Additional ACPI Tables (2) 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * These tables are not consumed directly by the ACPICA subsystem, but are 18*4882a593Smuzhiyun * included here to support device drivers and the AML disassembler. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun ******************************************************************************/ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* 23*4882a593Smuzhiyun * Values for description table header signatures for tables defined in this 24*4882a593Smuzhiyun * file. Useful because they make it more difficult to inadvertently type in 25*4882a593Smuzhiyun * the wrong signature. 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun #define ACPI_SIG_IORT "IORT" /* IO Remapping Table */ 28*4882a593Smuzhiyun #define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */ 29*4882a593Smuzhiyun #define ACPI_SIG_LPIT "LPIT" /* Low Power Idle Table */ 30*4882a593Smuzhiyun #define ACPI_SIG_MADT "APIC" /* Multiple APIC Description Table */ 31*4882a593Smuzhiyun #define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */ 32*4882a593Smuzhiyun #define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */ 33*4882a593Smuzhiyun #define ACPI_SIG_MPST "MPST" /* Memory Power State Table */ 34*4882a593Smuzhiyun #define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */ 35*4882a593Smuzhiyun #define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */ 36*4882a593Smuzhiyun #define ACPI_SIG_MTMR "MTMR" /* MID Timer table */ 37*4882a593Smuzhiyun #define ACPI_SIG_NFIT "NFIT" /* NVDIMM Firmware Interface Table */ 38*4882a593Smuzhiyun #define ACPI_SIG_PCCT "PCCT" /* Platform Communications Channel Table */ 39*4882a593Smuzhiyun #define ACPI_SIG_PDTT "PDTT" /* Platform Debug Trigger Table */ 40*4882a593Smuzhiyun #define ACPI_SIG_PMTT "PMTT" /* Platform Memory Topology Table */ 41*4882a593Smuzhiyun #define ACPI_SIG_PPTT "PPTT" /* Processor Properties Topology Table */ 42*4882a593Smuzhiyun #define ACPI_SIG_RASF "RASF" /* RAS Feature table */ 43*4882a593Smuzhiyun #define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */ 44*4882a593Smuzhiyun #define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */ 45*4882a593Smuzhiyun #define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */ 46*4882a593Smuzhiyun #define ACPI_SIG_NHLT "NHLT" /* Non-HDAudio Link Table */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* 49*4882a593Smuzhiyun * All tables must be byte-packed to match the ACPI specification, since 50*4882a593Smuzhiyun * the tables are provided by the system BIOS. 51*4882a593Smuzhiyun */ 52*4882a593Smuzhiyun #pragma pack(1) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* 55*4882a593Smuzhiyun * Note: C bitfields are not used for this reason: 56*4882a593Smuzhiyun * 57*4882a593Smuzhiyun * "Bitfields are great and easy to read, but unfortunately the C language 58*4882a593Smuzhiyun * does not specify the layout of bitfields in memory, which means they are 59*4882a593Smuzhiyun * essentially useless for dealing with packed data in on-disk formats or 60*4882a593Smuzhiyun * binary wire protocols." (Or ACPI tables and buffers.) "If you ask me, 61*4882a593Smuzhiyun * this decision was a design error in C. Ritchie could have picked an order 62*4882a593Smuzhiyun * and stuck with it." Norman Ramsey. 63*4882a593Smuzhiyun * See http://stackoverflow.com/a/1053662/41661 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /******************************************************************************* 67*4882a593Smuzhiyun * 68*4882a593Smuzhiyun * IORT - IO Remapping Table 69*4882a593Smuzhiyun * 70*4882a593Smuzhiyun * Conforms to "IO Remapping Table System Software on ARM Platforms", 71*4882a593Smuzhiyun * Document number: ARM DEN 0049D, March 2018 72*4882a593Smuzhiyun * 73*4882a593Smuzhiyun ******************************************************************************/ 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun struct acpi_table_iort { 76*4882a593Smuzhiyun struct acpi_table_header header; 77*4882a593Smuzhiyun u32 node_count; 78*4882a593Smuzhiyun u32 node_offset; 79*4882a593Smuzhiyun u32 reserved; 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* 83*4882a593Smuzhiyun * IORT subtables 84*4882a593Smuzhiyun */ 85*4882a593Smuzhiyun struct acpi_iort_node { 86*4882a593Smuzhiyun u8 type; 87*4882a593Smuzhiyun u16 length; 88*4882a593Smuzhiyun u8 revision; 89*4882a593Smuzhiyun u32 reserved; 90*4882a593Smuzhiyun u32 mapping_count; 91*4882a593Smuzhiyun u32 mapping_offset; 92*4882a593Smuzhiyun char node_data[1]; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /* Values for subtable Type above */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun enum acpi_iort_node_type { 98*4882a593Smuzhiyun ACPI_IORT_NODE_ITS_GROUP = 0x00, 99*4882a593Smuzhiyun ACPI_IORT_NODE_NAMED_COMPONENT = 0x01, 100*4882a593Smuzhiyun ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 0x02, 101*4882a593Smuzhiyun ACPI_IORT_NODE_SMMU = 0x03, 102*4882a593Smuzhiyun ACPI_IORT_NODE_SMMU_V3 = 0x04, 103*4882a593Smuzhiyun ACPI_IORT_NODE_PMCG = 0x05 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun struct acpi_iort_id_mapping { 107*4882a593Smuzhiyun u32 input_base; /* Lowest value in input range */ 108*4882a593Smuzhiyun u32 id_count; /* Number of IDs */ 109*4882a593Smuzhiyun u32 output_base; /* Lowest value in output range */ 110*4882a593Smuzhiyun u32 output_reference; /* A reference to the output node */ 111*4882a593Smuzhiyun u32 flags; 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* Masks for Flags field above for IORT subtable */ 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define ACPI_IORT_ID_SINGLE_MAPPING (1) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct acpi_iort_memory_access { 119*4882a593Smuzhiyun u32 cache_coherency; 120*4882a593Smuzhiyun u8 hints; 121*4882a593Smuzhiyun u16 reserved; 122*4882a593Smuzhiyun u8 memory_flags; 123*4882a593Smuzhiyun }; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* Values for cache_coherency field above */ 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define ACPI_IORT_NODE_COHERENT 0x00000001 /* The device node is fully coherent */ 128*4882a593Smuzhiyun #define ACPI_IORT_NODE_NOT_COHERENT 0x00000000 /* The device node is not coherent */ 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* Masks for Hints field above */ 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define ACPI_IORT_HT_TRANSIENT (1) 133*4882a593Smuzhiyun #define ACPI_IORT_HT_WRITE (1<<1) 134*4882a593Smuzhiyun #define ACPI_IORT_HT_READ (1<<2) 135*4882a593Smuzhiyun #define ACPI_IORT_HT_OVERRIDE (1<<3) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* Masks for memory_flags field above */ 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define ACPI_IORT_MF_COHERENCY (1) 140*4882a593Smuzhiyun #define ACPI_IORT_MF_ATTRIBUTES (1<<1) 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* 143*4882a593Smuzhiyun * IORT node specific subtables 144*4882a593Smuzhiyun */ 145*4882a593Smuzhiyun struct acpi_iort_its_group { 146*4882a593Smuzhiyun u32 its_count; 147*4882a593Smuzhiyun u32 identifiers[1]; /* GIC ITS identifier array */ 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun struct acpi_iort_named_component { 151*4882a593Smuzhiyun u32 node_flags; 152*4882a593Smuzhiyun u64 memory_properties; /* Memory access properties */ 153*4882a593Smuzhiyun u8 memory_address_limit; /* Memory address size limit */ 154*4882a593Smuzhiyun char device_name[1]; /* Path of namespace object */ 155*4882a593Smuzhiyun }; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* Masks for Flags field above */ 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun #define ACPI_IORT_NC_STALL_SUPPORTED (1) 160*4882a593Smuzhiyun #define ACPI_IORT_NC_PASID_BITS (31<<1) 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun struct acpi_iort_root_complex { 163*4882a593Smuzhiyun u64 memory_properties; /* Memory access properties */ 164*4882a593Smuzhiyun u32 ats_attribute; 165*4882a593Smuzhiyun u32 pci_segment_number; 166*4882a593Smuzhiyun u8 memory_address_limit; /* Memory address size limit */ 167*4882a593Smuzhiyun u8 reserved[3]; /* Reserved, must be zero */ 168*4882a593Smuzhiyun }; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* Values for ats_attribute field above */ 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define ACPI_IORT_ATS_SUPPORTED 0x00000001 /* The root complex supports ATS */ 173*4882a593Smuzhiyun #define ACPI_IORT_ATS_UNSUPPORTED 0x00000000 /* The root complex doesn't support ATS */ 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct acpi_iort_smmu { 176*4882a593Smuzhiyun u64 base_address; /* SMMU base address */ 177*4882a593Smuzhiyun u64 span; /* Length of memory range */ 178*4882a593Smuzhiyun u32 model; 179*4882a593Smuzhiyun u32 flags; 180*4882a593Smuzhiyun u32 global_interrupt_offset; 181*4882a593Smuzhiyun u32 context_interrupt_count; 182*4882a593Smuzhiyun u32 context_interrupt_offset; 183*4882a593Smuzhiyun u32 pmu_interrupt_count; 184*4882a593Smuzhiyun u32 pmu_interrupt_offset; 185*4882a593Smuzhiyun u64 interrupts[1]; /* Interrupt array */ 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun /* Values for Model field above */ 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V1 0x00000000 /* Generic SMMUv1 */ 191*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V2 0x00000001 /* Generic SMMUv2 */ 192*4882a593Smuzhiyun #define ACPI_IORT_SMMU_CORELINK_MMU400 0x00000002 /* ARM Corelink MMU-400 */ 193*4882a593Smuzhiyun #define ACPI_IORT_SMMU_CORELINK_MMU500 0x00000003 /* ARM Corelink MMU-500 */ 194*4882a593Smuzhiyun #define ACPI_IORT_SMMU_CORELINK_MMU401 0x00000004 /* ARM Corelink MMU-401 */ 195*4882a593Smuzhiyun #define ACPI_IORT_SMMU_CAVIUM_THUNDERX 0x00000005 /* Cavium thunder_x SMMUv2 */ 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* Masks for Flags field above */ 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define ACPI_IORT_SMMU_DVM_SUPPORTED (1) 200*4882a593Smuzhiyun #define ACPI_IORT_SMMU_COHERENT_WALK (1<<1) 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* Global interrupt format */ 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct acpi_iort_smmu_gsi { 205*4882a593Smuzhiyun u32 nsg_irpt; 206*4882a593Smuzhiyun u32 nsg_irpt_flags; 207*4882a593Smuzhiyun u32 nsg_cfg_irpt; 208*4882a593Smuzhiyun u32 nsg_cfg_irpt_flags; 209*4882a593Smuzhiyun }; 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun struct acpi_iort_smmu_v3 { 212*4882a593Smuzhiyun u64 base_address; /* SMMUv3 base address */ 213*4882a593Smuzhiyun u32 flags; 214*4882a593Smuzhiyun u32 reserved; 215*4882a593Smuzhiyun u64 vatos_address; 216*4882a593Smuzhiyun u32 model; 217*4882a593Smuzhiyun u32 event_gsiv; 218*4882a593Smuzhiyun u32 pri_gsiv; 219*4882a593Smuzhiyun u32 gerr_gsiv; 220*4882a593Smuzhiyun u32 sync_gsiv; 221*4882a593Smuzhiyun u32 pxm; 222*4882a593Smuzhiyun u32 id_mapping_index; 223*4882a593Smuzhiyun }; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /* Values for Model field above */ 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V3_GENERIC 0x00000000 /* Generic SMMUv3 */ 228*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V3_HISILICON_HI161X 0x00000001 /* hi_silicon Hi161x SMMUv3 */ 229*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V3_CAVIUM_CN99XX 0x00000002 /* Cavium CN99xx SMMUv3 */ 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* Masks for Flags field above */ 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1) 234*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (3<<1) 235*4882a593Smuzhiyun #define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3) 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun struct acpi_iort_pmcg { 238*4882a593Smuzhiyun u64 page0_base_address; 239*4882a593Smuzhiyun u32 overflow_gsiv; 240*4882a593Smuzhiyun u32 node_reference; 241*4882a593Smuzhiyun u64 page1_base_address; 242*4882a593Smuzhiyun }; 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun /******************************************************************************* 245*4882a593Smuzhiyun * 246*4882a593Smuzhiyun * IVRS - I/O Virtualization Reporting Structure 247*4882a593Smuzhiyun * Version 1 248*4882a593Smuzhiyun * 249*4882a593Smuzhiyun * Conforms to "AMD I/O Virtualization Technology (IOMMU) Specification", 250*4882a593Smuzhiyun * Revision 1.26, February 2009. 251*4882a593Smuzhiyun * 252*4882a593Smuzhiyun ******************************************************************************/ 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun struct acpi_table_ivrs { 255*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 256*4882a593Smuzhiyun u32 info; /* Common virtualization info */ 257*4882a593Smuzhiyun u64 reserved; 258*4882a593Smuzhiyun }; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* Values for Info field above */ 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun #define ACPI_IVRS_PHYSICAL_SIZE 0x00007F00 /* 7 bits, physical address size */ 263*4882a593Smuzhiyun #define ACPI_IVRS_VIRTUAL_SIZE 0x003F8000 /* 7 bits, virtual address size */ 264*4882a593Smuzhiyun #define ACPI_IVRS_ATS_RESERVED 0x00400000 /* ATS address translation range reserved */ 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun /* IVRS subtable header */ 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun struct acpi_ivrs_header { 269*4882a593Smuzhiyun u8 type; /* Subtable type */ 270*4882a593Smuzhiyun u8 flags; 271*4882a593Smuzhiyun u16 length; /* Subtable length */ 272*4882a593Smuzhiyun u16 device_id; /* ID of IOMMU */ 273*4882a593Smuzhiyun }; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun /* Values for subtable Type above */ 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun enum acpi_ivrs_type { 278*4882a593Smuzhiyun ACPI_IVRS_TYPE_HARDWARE1 = 0x10, 279*4882a593Smuzhiyun ACPI_IVRS_TYPE_HARDWARE2 = 0x11, 280*4882a593Smuzhiyun ACPI_IVRS_TYPE_MEMORY1 = 0x20, 281*4882a593Smuzhiyun ACPI_IVRS_TYPE_MEMORY2 = 0x21, 282*4882a593Smuzhiyun ACPI_IVRS_TYPE_MEMORY3 = 0x22 283*4882a593Smuzhiyun }; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun /* Masks for Flags field above for IVHD subtable */ 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun #define ACPI_IVHD_TT_ENABLE (1) 288*4882a593Smuzhiyun #define ACPI_IVHD_PASS_PW (1<<1) 289*4882a593Smuzhiyun #define ACPI_IVHD_RES_PASS_PW (1<<2) 290*4882a593Smuzhiyun #define ACPI_IVHD_ISOC (1<<3) 291*4882a593Smuzhiyun #define ACPI_IVHD_IOTLB (1<<4) 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun /* Masks for Flags field above for IVMD subtable */ 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define ACPI_IVMD_UNITY (1) 296*4882a593Smuzhiyun #define ACPI_IVMD_READ (1<<1) 297*4882a593Smuzhiyun #define ACPI_IVMD_WRITE (1<<2) 298*4882a593Smuzhiyun #define ACPI_IVMD_EXCLUSION_RANGE (1<<3) 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun /* 301*4882a593Smuzhiyun * IVRS subtables, correspond to Type in struct acpi_ivrs_header 302*4882a593Smuzhiyun */ 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */ 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun struct acpi_ivrs_hardware_10 { 307*4882a593Smuzhiyun struct acpi_ivrs_header header; 308*4882a593Smuzhiyun u16 capability_offset; /* Offset for IOMMU control fields */ 309*4882a593Smuzhiyun u64 base_address; /* IOMMU control registers */ 310*4882a593Smuzhiyun u16 pci_segment_group; 311*4882a593Smuzhiyun u16 info; /* MSI number and unit ID */ 312*4882a593Smuzhiyun u32 feature_reporting; 313*4882a593Smuzhiyun }; 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun /* 0x11: I/O Virtualization Hardware Definition Block (IVHD) */ 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun struct acpi_ivrs_hardware_11 { 318*4882a593Smuzhiyun struct acpi_ivrs_header header; 319*4882a593Smuzhiyun u16 capability_offset; /* Offset for IOMMU control fields */ 320*4882a593Smuzhiyun u64 base_address; /* IOMMU control registers */ 321*4882a593Smuzhiyun u16 pci_segment_group; 322*4882a593Smuzhiyun u16 info; /* MSI number and unit ID */ 323*4882a593Smuzhiyun u32 attributes; 324*4882a593Smuzhiyun u64 efr_register_image; 325*4882a593Smuzhiyun u64 reserved; 326*4882a593Smuzhiyun }; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun /* Masks for Info field above */ 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #define ACPI_IVHD_MSI_NUMBER_MASK 0x001F /* 5 bits, MSI message number */ 331*4882a593Smuzhiyun #define ACPI_IVHD_UNIT_ID_MASK 0x1F00 /* 5 bits, unit_ID */ 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* 334*4882a593Smuzhiyun * Device Entries for IVHD subtable, appear after struct acpi_ivrs_hardware structure. 335*4882a593Smuzhiyun * Upper two bits of the Type field are the (encoded) length of the structure. 336*4882a593Smuzhiyun * Currently, only 4 and 8 byte entries are defined. 16 and 32 byte entries 337*4882a593Smuzhiyun * are reserved for future use but not defined. 338*4882a593Smuzhiyun */ 339*4882a593Smuzhiyun struct acpi_ivrs_de_header { 340*4882a593Smuzhiyun u8 type; 341*4882a593Smuzhiyun u16 id; 342*4882a593Smuzhiyun u8 data_setting; 343*4882a593Smuzhiyun }; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun /* Length of device entry is in the top two bits of Type field above */ 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun #define ACPI_IVHD_ENTRY_LENGTH 0xC0 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun /* Values for device entry Type field above */ 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun enum acpi_ivrs_device_entry_type { 352*4882a593Smuzhiyun /* 4-byte device entries, all use struct acpi_ivrs_device4 */ 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun ACPI_IVRS_TYPE_PAD4 = 0, 355*4882a593Smuzhiyun ACPI_IVRS_TYPE_ALL = 1, 356*4882a593Smuzhiyun ACPI_IVRS_TYPE_SELECT = 2, 357*4882a593Smuzhiyun ACPI_IVRS_TYPE_START = 3, 358*4882a593Smuzhiyun ACPI_IVRS_TYPE_END = 4, 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun /* 8-byte device entries */ 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun ACPI_IVRS_TYPE_PAD8 = 64, 363*4882a593Smuzhiyun ACPI_IVRS_TYPE_NOT_USED = 65, 364*4882a593Smuzhiyun ACPI_IVRS_TYPE_ALIAS_SELECT = 66, /* Uses struct acpi_ivrs_device8a */ 365*4882a593Smuzhiyun ACPI_IVRS_TYPE_ALIAS_START = 67, /* Uses struct acpi_ivrs_device8a */ 366*4882a593Smuzhiyun ACPI_IVRS_TYPE_EXT_SELECT = 70, /* Uses struct acpi_ivrs_device8b */ 367*4882a593Smuzhiyun ACPI_IVRS_TYPE_EXT_START = 71, /* Uses struct acpi_ivrs_device8b */ 368*4882a593Smuzhiyun ACPI_IVRS_TYPE_SPECIAL = 72 /* Uses struct acpi_ivrs_device8c */ 369*4882a593Smuzhiyun }; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun /* Values for Data field above */ 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun #define ACPI_IVHD_INIT_PASS (1) 374*4882a593Smuzhiyun #define ACPI_IVHD_EINT_PASS (1<<1) 375*4882a593Smuzhiyun #define ACPI_IVHD_NMI_PASS (1<<2) 376*4882a593Smuzhiyun #define ACPI_IVHD_SYSTEM_MGMT (3<<4) 377*4882a593Smuzhiyun #define ACPI_IVHD_LINT0_PASS (1<<6) 378*4882a593Smuzhiyun #define ACPI_IVHD_LINT1_PASS (1<<7) 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun /* Types 0-4: 4-byte device entry */ 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun struct acpi_ivrs_device4 { 383*4882a593Smuzhiyun struct acpi_ivrs_de_header header; 384*4882a593Smuzhiyun }; 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun /* Types 66-67: 8-byte device entry */ 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun struct acpi_ivrs_device8a { 389*4882a593Smuzhiyun struct acpi_ivrs_de_header header; 390*4882a593Smuzhiyun u8 reserved1; 391*4882a593Smuzhiyun u16 used_id; 392*4882a593Smuzhiyun u8 reserved2; 393*4882a593Smuzhiyun }; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* Types 70-71: 8-byte device entry */ 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun struct acpi_ivrs_device8b { 398*4882a593Smuzhiyun struct acpi_ivrs_de_header header; 399*4882a593Smuzhiyun u32 extended_data; 400*4882a593Smuzhiyun }; 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun /* Values for extended_data above */ 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun #define ACPI_IVHD_ATS_DISABLED (1<<31) 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun /* Type 72: 8-byte device entry */ 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun struct acpi_ivrs_device8c { 409*4882a593Smuzhiyun struct acpi_ivrs_de_header header; 410*4882a593Smuzhiyun u8 handle; 411*4882a593Smuzhiyun u16 used_id; 412*4882a593Smuzhiyun u8 variety; 413*4882a593Smuzhiyun }; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* Values for Variety field above */ 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun #define ACPI_IVHD_IOAPIC 1 418*4882a593Smuzhiyun #define ACPI_IVHD_HPET 2 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun /* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */ 421*4882a593Smuzhiyun 422*4882a593Smuzhiyun struct acpi_ivrs_memory { 423*4882a593Smuzhiyun struct acpi_ivrs_header header; 424*4882a593Smuzhiyun u16 aux_data; 425*4882a593Smuzhiyun u64 reserved; 426*4882a593Smuzhiyun u64 start_address; 427*4882a593Smuzhiyun u64 memory_length; 428*4882a593Smuzhiyun }; 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun /******************************************************************************* 431*4882a593Smuzhiyun * 432*4882a593Smuzhiyun * LPIT - Low Power Idle Table 433*4882a593Smuzhiyun * 434*4882a593Smuzhiyun * Conforms to "ACPI Low Power Idle Table (LPIT)" July 2014. 435*4882a593Smuzhiyun * 436*4882a593Smuzhiyun ******************************************************************************/ 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun struct acpi_table_lpit { 439*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 440*4882a593Smuzhiyun }; 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun /* LPIT subtable header */ 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun struct acpi_lpit_header { 445*4882a593Smuzhiyun u32 type; /* Subtable type */ 446*4882a593Smuzhiyun u32 length; /* Subtable length */ 447*4882a593Smuzhiyun u16 unique_id; 448*4882a593Smuzhiyun u16 reserved; 449*4882a593Smuzhiyun u32 flags; 450*4882a593Smuzhiyun }; 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun /* Values for subtable Type above */ 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun enum acpi_lpit_type { 455*4882a593Smuzhiyun ACPI_LPIT_TYPE_NATIVE_CSTATE = 0x00, 456*4882a593Smuzhiyun ACPI_LPIT_TYPE_RESERVED = 0x01 /* 1 and above are reserved */ 457*4882a593Smuzhiyun }; 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun /* Masks for Flags field above */ 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun #define ACPI_LPIT_STATE_DISABLED (1) 462*4882a593Smuzhiyun #define ACPI_LPIT_NO_COUNTER (1<<1) 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun /* 465*4882a593Smuzhiyun * LPIT subtables, correspond to Type in struct acpi_lpit_header 466*4882a593Smuzhiyun */ 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun /* 0x00: Native C-state instruction based LPI structure */ 469*4882a593Smuzhiyun 470*4882a593Smuzhiyun struct acpi_lpit_native { 471*4882a593Smuzhiyun struct acpi_lpit_header header; 472*4882a593Smuzhiyun struct acpi_generic_address entry_trigger; 473*4882a593Smuzhiyun u32 residency; 474*4882a593Smuzhiyun u32 latency; 475*4882a593Smuzhiyun struct acpi_generic_address residency_counter; 476*4882a593Smuzhiyun u64 counter_frequency; 477*4882a593Smuzhiyun }; 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun /******************************************************************************* 480*4882a593Smuzhiyun * 481*4882a593Smuzhiyun * MADT - Multiple APIC Description Table 482*4882a593Smuzhiyun * Version 3 483*4882a593Smuzhiyun * 484*4882a593Smuzhiyun ******************************************************************************/ 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun struct acpi_table_madt { 487*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 488*4882a593Smuzhiyun u32 address; /* Physical address of local APIC */ 489*4882a593Smuzhiyun u32 flags; 490*4882a593Smuzhiyun }; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun /* Masks for Flags field above */ 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun #define ACPI_MADT_PCAT_COMPAT (1) /* 00: System also has dual 8259s */ 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun /* Values for PCATCompat flag */ 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun #define ACPI_MADT_DUAL_PIC 1 499*4882a593Smuzhiyun #define ACPI_MADT_MULTIPLE_APIC 0 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun /* Values for MADT subtable type in struct acpi_subtable_header */ 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun enum acpi_madt_type { 504*4882a593Smuzhiyun ACPI_MADT_TYPE_LOCAL_APIC = 0, 505*4882a593Smuzhiyun ACPI_MADT_TYPE_IO_APIC = 1, 506*4882a593Smuzhiyun ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2, 507*4882a593Smuzhiyun ACPI_MADT_TYPE_NMI_SOURCE = 3, 508*4882a593Smuzhiyun ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4, 509*4882a593Smuzhiyun ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5, 510*4882a593Smuzhiyun ACPI_MADT_TYPE_IO_SAPIC = 6, 511*4882a593Smuzhiyun ACPI_MADT_TYPE_LOCAL_SAPIC = 7, 512*4882a593Smuzhiyun ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8, 513*4882a593Smuzhiyun ACPI_MADT_TYPE_LOCAL_X2APIC = 9, 514*4882a593Smuzhiyun ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, 515*4882a593Smuzhiyun ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, 516*4882a593Smuzhiyun ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, 517*4882a593Smuzhiyun ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13, 518*4882a593Smuzhiyun ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, 519*4882a593Smuzhiyun ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, 520*4882a593Smuzhiyun ACPI_MADT_TYPE_RESERVED = 16 /* 16 and greater are reserved */ 521*4882a593Smuzhiyun }; 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun /* 524*4882a593Smuzhiyun * MADT Subtables, correspond to Type in struct acpi_subtable_header 525*4882a593Smuzhiyun */ 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun /* 0: Processor Local APIC */ 528*4882a593Smuzhiyun 529*4882a593Smuzhiyun struct acpi_madt_local_apic { 530*4882a593Smuzhiyun struct acpi_subtable_header header; 531*4882a593Smuzhiyun u8 processor_id; /* ACPI processor id */ 532*4882a593Smuzhiyun u8 id; /* Processor's local APIC id */ 533*4882a593Smuzhiyun u32 lapic_flags; 534*4882a593Smuzhiyun }; 535*4882a593Smuzhiyun 536*4882a593Smuzhiyun /* 1: IO APIC */ 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun struct acpi_madt_io_apic { 539*4882a593Smuzhiyun struct acpi_subtable_header header; 540*4882a593Smuzhiyun u8 id; /* I/O APIC ID */ 541*4882a593Smuzhiyun u8 reserved; /* reserved - must be zero */ 542*4882a593Smuzhiyun u32 address; /* APIC physical address */ 543*4882a593Smuzhiyun u32 global_irq_base; /* Global system interrupt where INTI lines start */ 544*4882a593Smuzhiyun }; 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun /* 2: Interrupt Override */ 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun struct acpi_madt_interrupt_override { 549*4882a593Smuzhiyun struct acpi_subtable_header header; 550*4882a593Smuzhiyun u8 bus; /* 0 - ISA */ 551*4882a593Smuzhiyun u8 source_irq; /* Interrupt source (IRQ) */ 552*4882a593Smuzhiyun u32 global_irq; /* Global system interrupt */ 553*4882a593Smuzhiyun u16 inti_flags; 554*4882a593Smuzhiyun }; 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun /* 3: NMI Source */ 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun struct acpi_madt_nmi_source { 559*4882a593Smuzhiyun struct acpi_subtable_header header; 560*4882a593Smuzhiyun u16 inti_flags; 561*4882a593Smuzhiyun u32 global_irq; /* Global system interrupt */ 562*4882a593Smuzhiyun }; 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun /* 4: Local APIC NMI */ 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun struct acpi_madt_local_apic_nmi { 567*4882a593Smuzhiyun struct acpi_subtable_header header; 568*4882a593Smuzhiyun u8 processor_id; /* ACPI processor id */ 569*4882a593Smuzhiyun u16 inti_flags; 570*4882a593Smuzhiyun u8 lint; /* LINTn to which NMI is connected */ 571*4882a593Smuzhiyun }; 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun /* 5: Address Override */ 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun struct acpi_madt_local_apic_override { 576*4882a593Smuzhiyun struct acpi_subtable_header header; 577*4882a593Smuzhiyun u16 reserved; /* Reserved, must be zero */ 578*4882a593Smuzhiyun u64 address; /* APIC physical address */ 579*4882a593Smuzhiyun }; 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun /* 6: I/O Sapic */ 582*4882a593Smuzhiyun 583*4882a593Smuzhiyun struct acpi_madt_io_sapic { 584*4882a593Smuzhiyun struct acpi_subtable_header header; 585*4882a593Smuzhiyun u8 id; /* I/O SAPIC ID */ 586*4882a593Smuzhiyun u8 reserved; /* Reserved, must be zero */ 587*4882a593Smuzhiyun u32 global_irq_base; /* Global interrupt for SAPIC start */ 588*4882a593Smuzhiyun u64 address; /* SAPIC physical address */ 589*4882a593Smuzhiyun }; 590*4882a593Smuzhiyun 591*4882a593Smuzhiyun /* 7: Local Sapic */ 592*4882a593Smuzhiyun 593*4882a593Smuzhiyun struct acpi_madt_local_sapic { 594*4882a593Smuzhiyun struct acpi_subtable_header header; 595*4882a593Smuzhiyun u8 processor_id; /* ACPI processor id */ 596*4882a593Smuzhiyun u8 id; /* SAPIC ID */ 597*4882a593Smuzhiyun u8 eid; /* SAPIC EID */ 598*4882a593Smuzhiyun u8 reserved[3]; /* Reserved, must be zero */ 599*4882a593Smuzhiyun u32 lapic_flags; 600*4882a593Smuzhiyun u32 uid; /* Numeric UID - ACPI 3.0 */ 601*4882a593Smuzhiyun char uid_string[1]; /* String UID - ACPI 3.0 */ 602*4882a593Smuzhiyun }; 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun /* 8: Platform Interrupt Source */ 605*4882a593Smuzhiyun 606*4882a593Smuzhiyun struct acpi_madt_interrupt_source { 607*4882a593Smuzhiyun struct acpi_subtable_header header; 608*4882a593Smuzhiyun u16 inti_flags; 609*4882a593Smuzhiyun u8 type; /* 1=PMI, 2=INIT, 3=corrected */ 610*4882a593Smuzhiyun u8 id; /* Processor ID */ 611*4882a593Smuzhiyun u8 eid; /* Processor EID */ 612*4882a593Smuzhiyun u8 io_sapic_vector; /* Vector value for PMI interrupts */ 613*4882a593Smuzhiyun u32 global_irq; /* Global system interrupt */ 614*4882a593Smuzhiyun u32 flags; /* Interrupt Source Flags */ 615*4882a593Smuzhiyun }; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun /* Masks for Flags field above */ 618*4882a593Smuzhiyun 619*4882a593Smuzhiyun #define ACPI_MADT_CPEI_OVERRIDE (1) 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun /* 9: Processor Local X2APIC (ACPI 4.0) */ 622*4882a593Smuzhiyun 623*4882a593Smuzhiyun struct acpi_madt_local_x2apic { 624*4882a593Smuzhiyun struct acpi_subtable_header header; 625*4882a593Smuzhiyun u16 reserved; /* reserved - must be zero */ 626*4882a593Smuzhiyun u32 local_apic_id; /* Processor x2APIC ID */ 627*4882a593Smuzhiyun u32 lapic_flags; 628*4882a593Smuzhiyun u32 uid; /* ACPI processor UID */ 629*4882a593Smuzhiyun }; 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun /* 10: Local X2APIC NMI (ACPI 4.0) */ 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun struct acpi_madt_local_x2apic_nmi { 634*4882a593Smuzhiyun struct acpi_subtable_header header; 635*4882a593Smuzhiyun u16 inti_flags; 636*4882a593Smuzhiyun u32 uid; /* ACPI processor UID */ 637*4882a593Smuzhiyun u8 lint; /* LINTn to which NMI is connected */ 638*4882a593Smuzhiyun u8 reserved[3]; /* reserved - must be zero */ 639*4882a593Smuzhiyun }; 640*4882a593Smuzhiyun 641*4882a593Smuzhiyun /* 11: Generic interrupt - GICC (ACPI 5.0 + ACPI 6.0 + ACPI 6.3 changes) */ 642*4882a593Smuzhiyun 643*4882a593Smuzhiyun struct acpi_madt_generic_interrupt { 644*4882a593Smuzhiyun struct acpi_subtable_header header; 645*4882a593Smuzhiyun u16 reserved; /* reserved - must be zero */ 646*4882a593Smuzhiyun u32 cpu_interface_number; 647*4882a593Smuzhiyun u32 uid; 648*4882a593Smuzhiyun u32 flags; 649*4882a593Smuzhiyun u32 parking_version; 650*4882a593Smuzhiyun u32 performance_interrupt; 651*4882a593Smuzhiyun u64 parked_address; 652*4882a593Smuzhiyun u64 base_address; 653*4882a593Smuzhiyun u64 gicv_base_address; 654*4882a593Smuzhiyun u64 gich_base_address; 655*4882a593Smuzhiyun u32 vgic_interrupt; 656*4882a593Smuzhiyun u64 gicr_base_address; 657*4882a593Smuzhiyun u64 arm_mpidr; 658*4882a593Smuzhiyun u8 efficiency_class; 659*4882a593Smuzhiyun u8 reserved2[1]; 660*4882a593Smuzhiyun u16 spe_interrupt; /* ACPI 6.3 */ 661*4882a593Smuzhiyun }; 662*4882a593Smuzhiyun 663*4882a593Smuzhiyun /* Masks for Flags field above */ 664*4882a593Smuzhiyun 665*4882a593Smuzhiyun /* ACPI_MADT_ENABLED (1) Processor is usable if set */ 666*4882a593Smuzhiyun #define ACPI_MADT_PERFORMANCE_IRQ_MODE (1<<1) /* 01: Performance Interrupt Mode */ 667*4882a593Smuzhiyun #define ACPI_MADT_VGIC_IRQ_MODE (1<<2) /* 02: VGIC Maintenance Interrupt mode */ 668*4882a593Smuzhiyun 669*4882a593Smuzhiyun /* 12: Generic Distributor (ACPI 5.0 + ACPI 6.0 changes) */ 670*4882a593Smuzhiyun 671*4882a593Smuzhiyun struct acpi_madt_generic_distributor { 672*4882a593Smuzhiyun struct acpi_subtable_header header; 673*4882a593Smuzhiyun u16 reserved; /* reserved - must be zero */ 674*4882a593Smuzhiyun u32 gic_id; 675*4882a593Smuzhiyun u64 base_address; 676*4882a593Smuzhiyun u32 global_irq_base; 677*4882a593Smuzhiyun u8 version; 678*4882a593Smuzhiyun u8 reserved2[3]; /* reserved - must be zero */ 679*4882a593Smuzhiyun }; 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun /* Values for Version field above */ 682*4882a593Smuzhiyun 683*4882a593Smuzhiyun enum acpi_madt_gic_version { 684*4882a593Smuzhiyun ACPI_MADT_GIC_VERSION_NONE = 0, 685*4882a593Smuzhiyun ACPI_MADT_GIC_VERSION_V1 = 1, 686*4882a593Smuzhiyun ACPI_MADT_GIC_VERSION_V2 = 2, 687*4882a593Smuzhiyun ACPI_MADT_GIC_VERSION_V3 = 3, 688*4882a593Smuzhiyun ACPI_MADT_GIC_VERSION_V4 = 4, 689*4882a593Smuzhiyun ACPI_MADT_GIC_VERSION_RESERVED = 5 /* 5 and greater are reserved */ 690*4882a593Smuzhiyun }; 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun /* 13: Generic MSI Frame (ACPI 5.1) */ 693*4882a593Smuzhiyun 694*4882a593Smuzhiyun struct acpi_madt_generic_msi_frame { 695*4882a593Smuzhiyun struct acpi_subtable_header header; 696*4882a593Smuzhiyun u16 reserved; /* reserved - must be zero */ 697*4882a593Smuzhiyun u32 msi_frame_id; 698*4882a593Smuzhiyun u64 base_address; 699*4882a593Smuzhiyun u32 flags; 700*4882a593Smuzhiyun u16 spi_count; 701*4882a593Smuzhiyun u16 spi_base; 702*4882a593Smuzhiyun }; 703*4882a593Smuzhiyun 704*4882a593Smuzhiyun /* Masks for Flags field above */ 705*4882a593Smuzhiyun 706*4882a593Smuzhiyun #define ACPI_MADT_OVERRIDE_SPI_VALUES (1) 707*4882a593Smuzhiyun 708*4882a593Smuzhiyun /* 14: Generic Redistributor (ACPI 5.1) */ 709*4882a593Smuzhiyun 710*4882a593Smuzhiyun struct acpi_madt_generic_redistributor { 711*4882a593Smuzhiyun struct acpi_subtable_header header; 712*4882a593Smuzhiyun u16 reserved; /* reserved - must be zero */ 713*4882a593Smuzhiyun u64 base_address; 714*4882a593Smuzhiyun u32 length; 715*4882a593Smuzhiyun }; 716*4882a593Smuzhiyun 717*4882a593Smuzhiyun /* 15: Generic Translator (ACPI 6.0) */ 718*4882a593Smuzhiyun 719*4882a593Smuzhiyun struct acpi_madt_generic_translator { 720*4882a593Smuzhiyun struct acpi_subtable_header header; 721*4882a593Smuzhiyun u16 reserved; /* reserved - must be zero */ 722*4882a593Smuzhiyun u32 translation_id; 723*4882a593Smuzhiyun u64 base_address; 724*4882a593Smuzhiyun u32 reserved2; 725*4882a593Smuzhiyun }; 726*4882a593Smuzhiyun 727*4882a593Smuzhiyun /* 728*4882a593Smuzhiyun * Common flags fields for MADT subtables 729*4882a593Smuzhiyun */ 730*4882a593Smuzhiyun 731*4882a593Smuzhiyun /* MADT Local APIC flags */ 732*4882a593Smuzhiyun 733*4882a593Smuzhiyun #define ACPI_MADT_ENABLED (1) /* 00: Processor is usable if set */ 734*4882a593Smuzhiyun 735*4882a593Smuzhiyun /* MADT MPS INTI flags (inti_flags) */ 736*4882a593Smuzhiyun 737*4882a593Smuzhiyun #define ACPI_MADT_POLARITY_MASK (3) /* 00-01: Polarity of APIC I/O input signals */ 738*4882a593Smuzhiyun #define ACPI_MADT_TRIGGER_MASK (3<<2) /* 02-03: Trigger mode of APIC input signals */ 739*4882a593Smuzhiyun 740*4882a593Smuzhiyun /* Values for MPS INTI flags */ 741*4882a593Smuzhiyun 742*4882a593Smuzhiyun #define ACPI_MADT_POLARITY_CONFORMS 0 743*4882a593Smuzhiyun #define ACPI_MADT_POLARITY_ACTIVE_HIGH 1 744*4882a593Smuzhiyun #define ACPI_MADT_POLARITY_RESERVED 2 745*4882a593Smuzhiyun #define ACPI_MADT_POLARITY_ACTIVE_LOW 3 746*4882a593Smuzhiyun 747*4882a593Smuzhiyun #define ACPI_MADT_TRIGGER_CONFORMS (0) 748*4882a593Smuzhiyun #define ACPI_MADT_TRIGGER_EDGE (1<<2) 749*4882a593Smuzhiyun #define ACPI_MADT_TRIGGER_RESERVED (2<<2) 750*4882a593Smuzhiyun #define ACPI_MADT_TRIGGER_LEVEL (3<<2) 751*4882a593Smuzhiyun 752*4882a593Smuzhiyun /******************************************************************************* 753*4882a593Smuzhiyun * 754*4882a593Smuzhiyun * MCFG - PCI Memory Mapped Configuration table and subtable 755*4882a593Smuzhiyun * Version 1 756*4882a593Smuzhiyun * 757*4882a593Smuzhiyun * Conforms to "PCI Firmware Specification", Revision 3.0, June 20, 2005 758*4882a593Smuzhiyun * 759*4882a593Smuzhiyun ******************************************************************************/ 760*4882a593Smuzhiyun 761*4882a593Smuzhiyun struct acpi_table_mcfg { 762*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 763*4882a593Smuzhiyun u8 reserved[8]; 764*4882a593Smuzhiyun }; 765*4882a593Smuzhiyun 766*4882a593Smuzhiyun /* Subtable */ 767*4882a593Smuzhiyun 768*4882a593Smuzhiyun struct acpi_mcfg_allocation { 769*4882a593Smuzhiyun u64 address; /* Base address, processor-relative */ 770*4882a593Smuzhiyun u16 pci_segment; /* PCI segment group number */ 771*4882a593Smuzhiyun u8 start_bus_number; /* Starting PCI Bus number */ 772*4882a593Smuzhiyun u8 end_bus_number; /* Final PCI Bus number */ 773*4882a593Smuzhiyun u32 reserved; 774*4882a593Smuzhiyun }; 775*4882a593Smuzhiyun 776*4882a593Smuzhiyun /******************************************************************************* 777*4882a593Smuzhiyun * 778*4882a593Smuzhiyun * MCHI - Management Controller Host Interface Table 779*4882a593Smuzhiyun * Version 1 780*4882a593Smuzhiyun * 781*4882a593Smuzhiyun * Conforms to "Management Component Transport Protocol (MCTP) Host 782*4882a593Smuzhiyun * Interface Specification", Revision 1.0.0a, October 13, 2009 783*4882a593Smuzhiyun * 784*4882a593Smuzhiyun ******************************************************************************/ 785*4882a593Smuzhiyun 786*4882a593Smuzhiyun struct acpi_table_mchi { 787*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 788*4882a593Smuzhiyun u8 interface_type; 789*4882a593Smuzhiyun u8 protocol; 790*4882a593Smuzhiyun u64 protocol_data; 791*4882a593Smuzhiyun u8 interrupt_type; 792*4882a593Smuzhiyun u8 gpe; 793*4882a593Smuzhiyun u8 pci_device_flag; 794*4882a593Smuzhiyun u32 global_interrupt; 795*4882a593Smuzhiyun struct acpi_generic_address control_register; 796*4882a593Smuzhiyun u8 pci_segment; 797*4882a593Smuzhiyun u8 pci_bus; 798*4882a593Smuzhiyun u8 pci_device; 799*4882a593Smuzhiyun u8 pci_function; 800*4882a593Smuzhiyun }; 801*4882a593Smuzhiyun 802*4882a593Smuzhiyun /******************************************************************************* 803*4882a593Smuzhiyun * 804*4882a593Smuzhiyun * MPST - Memory Power State Table (ACPI 5.0) 805*4882a593Smuzhiyun * Version 1 806*4882a593Smuzhiyun * 807*4882a593Smuzhiyun ******************************************************************************/ 808*4882a593Smuzhiyun 809*4882a593Smuzhiyun #define ACPI_MPST_CHANNEL_INFO \ 810*4882a593Smuzhiyun u8 channel_id; \ 811*4882a593Smuzhiyun u8 reserved1[3]; \ 812*4882a593Smuzhiyun u16 power_node_count; \ 813*4882a593Smuzhiyun u16 reserved2; 814*4882a593Smuzhiyun 815*4882a593Smuzhiyun /* Main table */ 816*4882a593Smuzhiyun 817*4882a593Smuzhiyun struct acpi_table_mpst { 818*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 819*4882a593Smuzhiyun ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */ 820*4882a593Smuzhiyun }; 821*4882a593Smuzhiyun 822*4882a593Smuzhiyun /* Memory Platform Communication Channel Info */ 823*4882a593Smuzhiyun 824*4882a593Smuzhiyun struct acpi_mpst_channel { 825*4882a593Smuzhiyun ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */ 826*4882a593Smuzhiyun }; 827*4882a593Smuzhiyun 828*4882a593Smuzhiyun /* Memory Power Node Structure */ 829*4882a593Smuzhiyun 830*4882a593Smuzhiyun struct acpi_mpst_power_node { 831*4882a593Smuzhiyun u8 flags; 832*4882a593Smuzhiyun u8 reserved1; 833*4882a593Smuzhiyun u16 node_id; 834*4882a593Smuzhiyun u32 length; 835*4882a593Smuzhiyun u64 range_address; 836*4882a593Smuzhiyun u64 range_length; 837*4882a593Smuzhiyun u32 num_power_states; 838*4882a593Smuzhiyun u32 num_physical_components; 839*4882a593Smuzhiyun }; 840*4882a593Smuzhiyun 841*4882a593Smuzhiyun /* Values for Flags field above */ 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun #define ACPI_MPST_ENABLED 1 844*4882a593Smuzhiyun #define ACPI_MPST_POWER_MANAGED 2 845*4882a593Smuzhiyun #define ACPI_MPST_HOT_PLUG_CAPABLE 4 846*4882a593Smuzhiyun 847*4882a593Smuzhiyun /* Memory Power State Structure (follows POWER_NODE above) */ 848*4882a593Smuzhiyun 849*4882a593Smuzhiyun struct acpi_mpst_power_state { 850*4882a593Smuzhiyun u8 power_state; 851*4882a593Smuzhiyun u8 info_index; 852*4882a593Smuzhiyun }; 853*4882a593Smuzhiyun 854*4882a593Smuzhiyun /* Physical Component ID Structure (follows POWER_STATE above) */ 855*4882a593Smuzhiyun 856*4882a593Smuzhiyun struct acpi_mpst_component { 857*4882a593Smuzhiyun u16 component_id; 858*4882a593Smuzhiyun }; 859*4882a593Smuzhiyun 860*4882a593Smuzhiyun /* Memory Power State Characteristics Structure (follows all POWER_NODEs) */ 861*4882a593Smuzhiyun 862*4882a593Smuzhiyun struct acpi_mpst_data_hdr { 863*4882a593Smuzhiyun u16 characteristics_count; 864*4882a593Smuzhiyun u16 reserved; 865*4882a593Smuzhiyun }; 866*4882a593Smuzhiyun 867*4882a593Smuzhiyun struct acpi_mpst_power_data { 868*4882a593Smuzhiyun u8 structure_id; 869*4882a593Smuzhiyun u8 flags; 870*4882a593Smuzhiyun u16 reserved1; 871*4882a593Smuzhiyun u32 average_power; 872*4882a593Smuzhiyun u32 power_saving; 873*4882a593Smuzhiyun u64 exit_latency; 874*4882a593Smuzhiyun u64 reserved2; 875*4882a593Smuzhiyun }; 876*4882a593Smuzhiyun 877*4882a593Smuzhiyun /* Values for Flags field above */ 878*4882a593Smuzhiyun 879*4882a593Smuzhiyun #define ACPI_MPST_PRESERVE 1 880*4882a593Smuzhiyun #define ACPI_MPST_AUTOENTRY 2 881*4882a593Smuzhiyun #define ACPI_MPST_AUTOEXIT 4 882*4882a593Smuzhiyun 883*4882a593Smuzhiyun /* Shared Memory Region (not part of an ACPI table) */ 884*4882a593Smuzhiyun 885*4882a593Smuzhiyun struct acpi_mpst_shared { 886*4882a593Smuzhiyun u32 signature; 887*4882a593Smuzhiyun u16 pcc_command; 888*4882a593Smuzhiyun u16 pcc_status; 889*4882a593Smuzhiyun u32 command_register; 890*4882a593Smuzhiyun u32 status_register; 891*4882a593Smuzhiyun u32 power_state_id; 892*4882a593Smuzhiyun u32 power_node_id; 893*4882a593Smuzhiyun u64 energy_consumed; 894*4882a593Smuzhiyun u64 average_power; 895*4882a593Smuzhiyun }; 896*4882a593Smuzhiyun 897*4882a593Smuzhiyun /******************************************************************************* 898*4882a593Smuzhiyun * 899*4882a593Smuzhiyun * MSCT - Maximum System Characteristics Table (ACPI 4.0) 900*4882a593Smuzhiyun * Version 1 901*4882a593Smuzhiyun * 902*4882a593Smuzhiyun ******************************************************************************/ 903*4882a593Smuzhiyun 904*4882a593Smuzhiyun struct acpi_table_msct { 905*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 906*4882a593Smuzhiyun u32 proximity_offset; /* Location of proximity info struct(s) */ 907*4882a593Smuzhiyun u32 max_proximity_domains; /* Max number of proximity domains */ 908*4882a593Smuzhiyun u32 max_clock_domains; /* Max number of clock domains */ 909*4882a593Smuzhiyun u64 max_address; /* Max physical address in system */ 910*4882a593Smuzhiyun }; 911*4882a593Smuzhiyun 912*4882a593Smuzhiyun /* subtable - Maximum Proximity Domain Information. Version 1 */ 913*4882a593Smuzhiyun 914*4882a593Smuzhiyun struct acpi_msct_proximity { 915*4882a593Smuzhiyun u8 revision; 916*4882a593Smuzhiyun u8 length; 917*4882a593Smuzhiyun u32 range_start; /* Start of domain range */ 918*4882a593Smuzhiyun u32 range_end; /* End of domain range */ 919*4882a593Smuzhiyun u32 processor_capacity; 920*4882a593Smuzhiyun u64 memory_capacity; /* In bytes */ 921*4882a593Smuzhiyun }; 922*4882a593Smuzhiyun 923*4882a593Smuzhiyun /******************************************************************************* 924*4882a593Smuzhiyun * 925*4882a593Smuzhiyun * MSDM - Microsoft Data Management table 926*4882a593Smuzhiyun * 927*4882a593Smuzhiyun * Conforms to "Microsoft Software Licensing Tables (SLIC and MSDM)", 928*4882a593Smuzhiyun * November 29, 2011. Copyright 2011 Microsoft 929*4882a593Smuzhiyun * 930*4882a593Smuzhiyun ******************************************************************************/ 931*4882a593Smuzhiyun 932*4882a593Smuzhiyun /* Basic MSDM table is only the common ACPI header */ 933*4882a593Smuzhiyun 934*4882a593Smuzhiyun struct acpi_table_msdm { 935*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 936*4882a593Smuzhiyun }; 937*4882a593Smuzhiyun 938*4882a593Smuzhiyun /******************************************************************************* 939*4882a593Smuzhiyun * 940*4882a593Smuzhiyun * MTMR - MID Timer Table 941*4882a593Smuzhiyun * Version 1 942*4882a593Smuzhiyun * 943*4882a593Smuzhiyun * Conforms to "Simple Firmware Interface Specification", 944*4882a593Smuzhiyun * Draft 0.8.2, Oct 19, 2010 945*4882a593Smuzhiyun * NOTE: The ACPI MTMR is equivalent to the SFI MTMR table. 946*4882a593Smuzhiyun * 947*4882a593Smuzhiyun ******************************************************************************/ 948*4882a593Smuzhiyun 949*4882a593Smuzhiyun struct acpi_table_mtmr { 950*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 951*4882a593Smuzhiyun }; 952*4882a593Smuzhiyun 953*4882a593Smuzhiyun /* MTMR entry */ 954*4882a593Smuzhiyun 955*4882a593Smuzhiyun struct acpi_mtmr_entry { 956*4882a593Smuzhiyun struct acpi_generic_address physical_address; 957*4882a593Smuzhiyun u32 frequency; 958*4882a593Smuzhiyun u32 irq; 959*4882a593Smuzhiyun }; 960*4882a593Smuzhiyun 961*4882a593Smuzhiyun /******************************************************************************* 962*4882a593Smuzhiyun * 963*4882a593Smuzhiyun * NFIT - NVDIMM Interface Table (ACPI 6.0+) 964*4882a593Smuzhiyun * Version 1 965*4882a593Smuzhiyun * 966*4882a593Smuzhiyun ******************************************************************************/ 967*4882a593Smuzhiyun 968*4882a593Smuzhiyun struct acpi_table_nfit { 969*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 970*4882a593Smuzhiyun u32 reserved; /* Reserved, must be zero */ 971*4882a593Smuzhiyun }; 972*4882a593Smuzhiyun 973*4882a593Smuzhiyun /* Subtable header for NFIT */ 974*4882a593Smuzhiyun 975*4882a593Smuzhiyun struct acpi_nfit_header { 976*4882a593Smuzhiyun u16 type; 977*4882a593Smuzhiyun u16 length; 978*4882a593Smuzhiyun }; 979*4882a593Smuzhiyun 980*4882a593Smuzhiyun /* Values for subtable type in struct acpi_nfit_header */ 981*4882a593Smuzhiyun 982*4882a593Smuzhiyun enum acpi_nfit_type { 983*4882a593Smuzhiyun ACPI_NFIT_TYPE_SYSTEM_ADDRESS = 0, 984*4882a593Smuzhiyun ACPI_NFIT_TYPE_MEMORY_MAP = 1, 985*4882a593Smuzhiyun ACPI_NFIT_TYPE_INTERLEAVE = 2, 986*4882a593Smuzhiyun ACPI_NFIT_TYPE_SMBIOS = 3, 987*4882a593Smuzhiyun ACPI_NFIT_TYPE_CONTROL_REGION = 4, 988*4882a593Smuzhiyun ACPI_NFIT_TYPE_DATA_REGION = 5, 989*4882a593Smuzhiyun ACPI_NFIT_TYPE_FLUSH_ADDRESS = 6, 990*4882a593Smuzhiyun ACPI_NFIT_TYPE_CAPABILITIES = 7, 991*4882a593Smuzhiyun ACPI_NFIT_TYPE_RESERVED = 8 /* 8 and greater are reserved */ 992*4882a593Smuzhiyun }; 993*4882a593Smuzhiyun 994*4882a593Smuzhiyun /* 995*4882a593Smuzhiyun * NFIT Subtables 996*4882a593Smuzhiyun */ 997*4882a593Smuzhiyun 998*4882a593Smuzhiyun /* 0: System Physical Address Range Structure */ 999*4882a593Smuzhiyun 1000*4882a593Smuzhiyun struct acpi_nfit_system_address { 1001*4882a593Smuzhiyun struct acpi_nfit_header header; 1002*4882a593Smuzhiyun u16 range_index; 1003*4882a593Smuzhiyun u16 flags; 1004*4882a593Smuzhiyun u32 reserved; /* Reserved, must be zero */ 1005*4882a593Smuzhiyun u32 proximity_domain; 1006*4882a593Smuzhiyun u8 range_guid[16]; 1007*4882a593Smuzhiyun u64 address; 1008*4882a593Smuzhiyun u64 length; 1009*4882a593Smuzhiyun u64 memory_mapping; 1010*4882a593Smuzhiyun }; 1011*4882a593Smuzhiyun 1012*4882a593Smuzhiyun /* Flags */ 1013*4882a593Smuzhiyun 1014*4882a593Smuzhiyun #define ACPI_NFIT_ADD_ONLINE_ONLY (1) /* 00: Add/Online Operation Only */ 1015*4882a593Smuzhiyun #define ACPI_NFIT_PROXIMITY_VALID (1<<1) /* 01: Proximity Domain Valid */ 1016*4882a593Smuzhiyun 1017*4882a593Smuzhiyun /* Range Type GUIDs appear in the include/acuuid.h file */ 1018*4882a593Smuzhiyun 1019*4882a593Smuzhiyun /* 1: Memory Device to System Address Range Map Structure */ 1020*4882a593Smuzhiyun 1021*4882a593Smuzhiyun struct acpi_nfit_memory_map { 1022*4882a593Smuzhiyun struct acpi_nfit_header header; 1023*4882a593Smuzhiyun u32 device_handle; 1024*4882a593Smuzhiyun u16 physical_id; 1025*4882a593Smuzhiyun u16 region_id; 1026*4882a593Smuzhiyun u16 range_index; 1027*4882a593Smuzhiyun u16 region_index; 1028*4882a593Smuzhiyun u64 region_size; 1029*4882a593Smuzhiyun u64 region_offset; 1030*4882a593Smuzhiyun u64 address; 1031*4882a593Smuzhiyun u16 interleave_index; 1032*4882a593Smuzhiyun u16 interleave_ways; 1033*4882a593Smuzhiyun u16 flags; 1034*4882a593Smuzhiyun u16 reserved; /* Reserved, must be zero */ 1035*4882a593Smuzhiyun }; 1036*4882a593Smuzhiyun 1037*4882a593Smuzhiyun /* Flags */ 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun #define ACPI_NFIT_MEM_SAVE_FAILED (1) /* 00: Last SAVE to Memory Device failed */ 1040*4882a593Smuzhiyun #define ACPI_NFIT_MEM_RESTORE_FAILED (1<<1) /* 01: Last RESTORE from Memory Device failed */ 1041*4882a593Smuzhiyun #define ACPI_NFIT_MEM_FLUSH_FAILED (1<<2) /* 02: Platform flush failed */ 1042*4882a593Smuzhiyun #define ACPI_NFIT_MEM_NOT_ARMED (1<<3) /* 03: Memory Device is not armed */ 1043*4882a593Smuzhiyun #define ACPI_NFIT_MEM_HEALTH_OBSERVED (1<<4) /* 04: Memory Device observed SMART/health events */ 1044*4882a593Smuzhiyun #define ACPI_NFIT_MEM_HEALTH_ENABLED (1<<5) /* 05: SMART/health events enabled */ 1045*4882a593Smuzhiyun #define ACPI_NFIT_MEM_MAP_FAILED (1<<6) /* 06: Mapping to SPA failed */ 1046*4882a593Smuzhiyun 1047*4882a593Smuzhiyun /* 2: Interleave Structure */ 1048*4882a593Smuzhiyun 1049*4882a593Smuzhiyun struct acpi_nfit_interleave { 1050*4882a593Smuzhiyun struct acpi_nfit_header header; 1051*4882a593Smuzhiyun u16 interleave_index; 1052*4882a593Smuzhiyun u16 reserved; /* Reserved, must be zero */ 1053*4882a593Smuzhiyun u32 line_count; 1054*4882a593Smuzhiyun u32 line_size; 1055*4882a593Smuzhiyun u32 line_offset[1]; /* Variable length */ 1056*4882a593Smuzhiyun }; 1057*4882a593Smuzhiyun 1058*4882a593Smuzhiyun /* 3: SMBIOS Management Information Structure */ 1059*4882a593Smuzhiyun 1060*4882a593Smuzhiyun struct acpi_nfit_smbios { 1061*4882a593Smuzhiyun struct acpi_nfit_header header; 1062*4882a593Smuzhiyun u32 reserved; /* Reserved, must be zero */ 1063*4882a593Smuzhiyun u8 data[1]; /* Variable length */ 1064*4882a593Smuzhiyun }; 1065*4882a593Smuzhiyun 1066*4882a593Smuzhiyun /* 4: NVDIMM Control Region Structure */ 1067*4882a593Smuzhiyun 1068*4882a593Smuzhiyun struct acpi_nfit_control_region { 1069*4882a593Smuzhiyun struct acpi_nfit_header header; 1070*4882a593Smuzhiyun u16 region_index; 1071*4882a593Smuzhiyun u16 vendor_id; 1072*4882a593Smuzhiyun u16 device_id; 1073*4882a593Smuzhiyun u16 revision_id; 1074*4882a593Smuzhiyun u16 subsystem_vendor_id; 1075*4882a593Smuzhiyun u16 subsystem_device_id; 1076*4882a593Smuzhiyun u16 subsystem_revision_id; 1077*4882a593Smuzhiyun u8 valid_fields; 1078*4882a593Smuzhiyun u8 manufacturing_location; 1079*4882a593Smuzhiyun u16 manufacturing_date; 1080*4882a593Smuzhiyun u8 reserved[2]; /* Reserved, must be zero */ 1081*4882a593Smuzhiyun u32 serial_number; 1082*4882a593Smuzhiyun u16 code; 1083*4882a593Smuzhiyun u16 windows; 1084*4882a593Smuzhiyun u64 window_size; 1085*4882a593Smuzhiyun u64 command_offset; 1086*4882a593Smuzhiyun u64 command_size; 1087*4882a593Smuzhiyun u64 status_offset; 1088*4882a593Smuzhiyun u64 status_size; 1089*4882a593Smuzhiyun u16 flags; 1090*4882a593Smuzhiyun u8 reserved1[6]; /* Reserved, must be zero */ 1091*4882a593Smuzhiyun }; 1092*4882a593Smuzhiyun 1093*4882a593Smuzhiyun /* Flags */ 1094*4882a593Smuzhiyun 1095*4882a593Smuzhiyun #define ACPI_NFIT_CONTROL_BUFFERED (1) /* Block Data Windows implementation is buffered */ 1096*4882a593Smuzhiyun 1097*4882a593Smuzhiyun /* valid_fields bits */ 1098*4882a593Smuzhiyun 1099*4882a593Smuzhiyun #define ACPI_NFIT_CONTROL_MFG_INFO_VALID (1) /* Manufacturing fields are valid */ 1100*4882a593Smuzhiyun 1101*4882a593Smuzhiyun /* 5: NVDIMM Block Data Window Region Structure */ 1102*4882a593Smuzhiyun 1103*4882a593Smuzhiyun struct acpi_nfit_data_region { 1104*4882a593Smuzhiyun struct acpi_nfit_header header; 1105*4882a593Smuzhiyun u16 region_index; 1106*4882a593Smuzhiyun u16 windows; 1107*4882a593Smuzhiyun u64 offset; 1108*4882a593Smuzhiyun u64 size; 1109*4882a593Smuzhiyun u64 capacity; 1110*4882a593Smuzhiyun u64 start_address; 1111*4882a593Smuzhiyun }; 1112*4882a593Smuzhiyun 1113*4882a593Smuzhiyun /* 6: Flush Hint Address Structure */ 1114*4882a593Smuzhiyun 1115*4882a593Smuzhiyun struct acpi_nfit_flush_address { 1116*4882a593Smuzhiyun struct acpi_nfit_header header; 1117*4882a593Smuzhiyun u32 device_handle; 1118*4882a593Smuzhiyun u16 hint_count; 1119*4882a593Smuzhiyun u8 reserved[6]; /* Reserved, must be zero */ 1120*4882a593Smuzhiyun u64 hint_address[1]; /* Variable length */ 1121*4882a593Smuzhiyun }; 1122*4882a593Smuzhiyun 1123*4882a593Smuzhiyun /* 7: Platform Capabilities Structure */ 1124*4882a593Smuzhiyun 1125*4882a593Smuzhiyun struct acpi_nfit_capabilities { 1126*4882a593Smuzhiyun struct acpi_nfit_header header; 1127*4882a593Smuzhiyun u8 highest_capability; 1128*4882a593Smuzhiyun u8 reserved[3]; /* Reserved, must be zero */ 1129*4882a593Smuzhiyun u32 capabilities; 1130*4882a593Smuzhiyun u32 reserved2; 1131*4882a593Smuzhiyun }; 1132*4882a593Smuzhiyun 1133*4882a593Smuzhiyun /* Capabilities Flags */ 1134*4882a593Smuzhiyun 1135*4882a593Smuzhiyun #define ACPI_NFIT_CAPABILITY_CACHE_FLUSH (1) /* 00: Cache Flush to NVDIMM capable */ 1136*4882a593Smuzhiyun #define ACPI_NFIT_CAPABILITY_MEM_FLUSH (1<<1) /* 01: Memory Flush to NVDIMM capable */ 1137*4882a593Smuzhiyun #define ACPI_NFIT_CAPABILITY_MEM_MIRRORING (1<<2) /* 02: Memory Mirroring capable */ 1138*4882a593Smuzhiyun 1139*4882a593Smuzhiyun /* 1140*4882a593Smuzhiyun * NFIT/DVDIMM device handle support - used as the _ADR for each NVDIMM 1141*4882a593Smuzhiyun */ 1142*4882a593Smuzhiyun struct nfit_device_handle { 1143*4882a593Smuzhiyun u32 handle; 1144*4882a593Smuzhiyun }; 1145*4882a593Smuzhiyun 1146*4882a593Smuzhiyun /* Device handle construction and extraction macros */ 1147*4882a593Smuzhiyun 1148*4882a593Smuzhiyun #define ACPI_NFIT_DIMM_NUMBER_MASK 0x0000000F 1149*4882a593Smuzhiyun #define ACPI_NFIT_CHANNEL_NUMBER_MASK 0x000000F0 1150*4882a593Smuzhiyun #define ACPI_NFIT_MEMORY_ID_MASK 0x00000F00 1151*4882a593Smuzhiyun #define ACPI_NFIT_SOCKET_ID_MASK 0x0000F000 1152*4882a593Smuzhiyun #define ACPI_NFIT_NODE_ID_MASK 0x0FFF0000 1153*4882a593Smuzhiyun 1154*4882a593Smuzhiyun #define ACPI_NFIT_DIMM_NUMBER_OFFSET 0 1155*4882a593Smuzhiyun #define ACPI_NFIT_CHANNEL_NUMBER_OFFSET 4 1156*4882a593Smuzhiyun #define ACPI_NFIT_MEMORY_ID_OFFSET 8 1157*4882a593Smuzhiyun #define ACPI_NFIT_SOCKET_ID_OFFSET 12 1158*4882a593Smuzhiyun #define ACPI_NFIT_NODE_ID_OFFSET 16 1159*4882a593Smuzhiyun 1160*4882a593Smuzhiyun /* Macro to construct a NFIT/NVDIMM device handle */ 1161*4882a593Smuzhiyun 1162*4882a593Smuzhiyun #define ACPI_NFIT_BUILD_DEVICE_HANDLE(dimm, channel, memory, socket, node) \ 1163*4882a593Smuzhiyun ((dimm) | \ 1164*4882a593Smuzhiyun ((channel) << ACPI_NFIT_CHANNEL_NUMBER_OFFSET) | \ 1165*4882a593Smuzhiyun ((memory) << ACPI_NFIT_MEMORY_ID_OFFSET) | \ 1166*4882a593Smuzhiyun ((socket) << ACPI_NFIT_SOCKET_ID_OFFSET) | \ 1167*4882a593Smuzhiyun ((node) << ACPI_NFIT_NODE_ID_OFFSET)) 1168*4882a593Smuzhiyun 1169*4882a593Smuzhiyun /* Macros to extract individual fields from a NFIT/NVDIMM device handle */ 1170*4882a593Smuzhiyun 1171*4882a593Smuzhiyun #define ACPI_NFIT_GET_DIMM_NUMBER(handle) \ 1172*4882a593Smuzhiyun ((handle) & ACPI_NFIT_DIMM_NUMBER_MASK) 1173*4882a593Smuzhiyun 1174*4882a593Smuzhiyun #define ACPI_NFIT_GET_CHANNEL_NUMBER(handle) \ 1175*4882a593Smuzhiyun (((handle) & ACPI_NFIT_CHANNEL_NUMBER_MASK) >> ACPI_NFIT_CHANNEL_NUMBER_OFFSET) 1176*4882a593Smuzhiyun 1177*4882a593Smuzhiyun #define ACPI_NFIT_GET_MEMORY_ID(handle) \ 1178*4882a593Smuzhiyun (((handle) & ACPI_NFIT_MEMORY_ID_MASK) >> ACPI_NFIT_MEMORY_ID_OFFSET) 1179*4882a593Smuzhiyun 1180*4882a593Smuzhiyun #define ACPI_NFIT_GET_SOCKET_ID(handle) \ 1181*4882a593Smuzhiyun (((handle) & ACPI_NFIT_SOCKET_ID_MASK) >> ACPI_NFIT_SOCKET_ID_OFFSET) 1182*4882a593Smuzhiyun 1183*4882a593Smuzhiyun #define ACPI_NFIT_GET_NODE_ID(handle) \ 1184*4882a593Smuzhiyun (((handle) & ACPI_NFIT_NODE_ID_MASK) >> ACPI_NFIT_NODE_ID_OFFSET) 1185*4882a593Smuzhiyun 1186*4882a593Smuzhiyun /******************************************************************************* 1187*4882a593Smuzhiyun * 1188*4882a593Smuzhiyun * PCCT - Platform Communications Channel Table (ACPI 5.0) 1189*4882a593Smuzhiyun * Version 2 (ACPI 6.2) 1190*4882a593Smuzhiyun * 1191*4882a593Smuzhiyun ******************************************************************************/ 1192*4882a593Smuzhiyun 1193*4882a593Smuzhiyun struct acpi_table_pcct { 1194*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1195*4882a593Smuzhiyun u32 flags; 1196*4882a593Smuzhiyun u64 reserved; 1197*4882a593Smuzhiyun }; 1198*4882a593Smuzhiyun 1199*4882a593Smuzhiyun /* Values for Flags field above */ 1200*4882a593Smuzhiyun 1201*4882a593Smuzhiyun #define ACPI_PCCT_DOORBELL 1 1202*4882a593Smuzhiyun 1203*4882a593Smuzhiyun /* Values for subtable type in struct acpi_subtable_header */ 1204*4882a593Smuzhiyun 1205*4882a593Smuzhiyun enum acpi_pcct_type { 1206*4882a593Smuzhiyun ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0, 1207*4882a593Smuzhiyun ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1, 1208*4882a593Smuzhiyun ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2, /* ACPI 6.1 */ 1209*4882a593Smuzhiyun ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3, /* ACPI 6.2 */ 1210*4882a593Smuzhiyun ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4, /* ACPI 6.2 */ 1211*4882a593Smuzhiyun ACPI_PCCT_TYPE_RESERVED = 5 /* 5 and greater are reserved */ 1212*4882a593Smuzhiyun }; 1213*4882a593Smuzhiyun 1214*4882a593Smuzhiyun /* 1215*4882a593Smuzhiyun * PCCT Subtables, correspond to Type in struct acpi_subtable_header 1216*4882a593Smuzhiyun */ 1217*4882a593Smuzhiyun 1218*4882a593Smuzhiyun /* 0: Generic Communications Subspace */ 1219*4882a593Smuzhiyun 1220*4882a593Smuzhiyun struct acpi_pcct_subspace { 1221*4882a593Smuzhiyun struct acpi_subtable_header header; 1222*4882a593Smuzhiyun u8 reserved[6]; 1223*4882a593Smuzhiyun u64 base_address; 1224*4882a593Smuzhiyun u64 length; 1225*4882a593Smuzhiyun struct acpi_generic_address doorbell_register; 1226*4882a593Smuzhiyun u64 preserve_mask; 1227*4882a593Smuzhiyun u64 write_mask; 1228*4882a593Smuzhiyun u32 latency; 1229*4882a593Smuzhiyun u32 max_access_rate; 1230*4882a593Smuzhiyun u16 min_turnaround_time; 1231*4882a593Smuzhiyun }; 1232*4882a593Smuzhiyun 1233*4882a593Smuzhiyun /* 1: HW-reduced Communications Subspace (ACPI 5.1) */ 1234*4882a593Smuzhiyun 1235*4882a593Smuzhiyun struct acpi_pcct_hw_reduced { 1236*4882a593Smuzhiyun struct acpi_subtable_header header; 1237*4882a593Smuzhiyun u32 platform_interrupt; 1238*4882a593Smuzhiyun u8 flags; 1239*4882a593Smuzhiyun u8 reserved; 1240*4882a593Smuzhiyun u64 base_address; 1241*4882a593Smuzhiyun u64 length; 1242*4882a593Smuzhiyun struct acpi_generic_address doorbell_register; 1243*4882a593Smuzhiyun u64 preserve_mask; 1244*4882a593Smuzhiyun u64 write_mask; 1245*4882a593Smuzhiyun u32 latency; 1246*4882a593Smuzhiyun u32 max_access_rate; 1247*4882a593Smuzhiyun u16 min_turnaround_time; 1248*4882a593Smuzhiyun }; 1249*4882a593Smuzhiyun 1250*4882a593Smuzhiyun /* 2: HW-reduced Communications Subspace Type 2 (ACPI 6.1) */ 1251*4882a593Smuzhiyun 1252*4882a593Smuzhiyun struct acpi_pcct_hw_reduced_type2 { 1253*4882a593Smuzhiyun struct acpi_subtable_header header; 1254*4882a593Smuzhiyun u32 platform_interrupt; 1255*4882a593Smuzhiyun u8 flags; 1256*4882a593Smuzhiyun u8 reserved; 1257*4882a593Smuzhiyun u64 base_address; 1258*4882a593Smuzhiyun u64 length; 1259*4882a593Smuzhiyun struct acpi_generic_address doorbell_register; 1260*4882a593Smuzhiyun u64 preserve_mask; 1261*4882a593Smuzhiyun u64 write_mask; 1262*4882a593Smuzhiyun u32 latency; 1263*4882a593Smuzhiyun u32 max_access_rate; 1264*4882a593Smuzhiyun u16 min_turnaround_time; 1265*4882a593Smuzhiyun struct acpi_generic_address platform_ack_register; 1266*4882a593Smuzhiyun u64 ack_preserve_mask; 1267*4882a593Smuzhiyun u64 ack_write_mask; 1268*4882a593Smuzhiyun }; 1269*4882a593Smuzhiyun 1270*4882a593Smuzhiyun /* 3: Extended PCC Master Subspace Type 3 (ACPI 6.2) */ 1271*4882a593Smuzhiyun 1272*4882a593Smuzhiyun struct acpi_pcct_ext_pcc_master { 1273*4882a593Smuzhiyun struct acpi_subtable_header header; 1274*4882a593Smuzhiyun u32 platform_interrupt; 1275*4882a593Smuzhiyun u8 flags; 1276*4882a593Smuzhiyun u8 reserved1; 1277*4882a593Smuzhiyun u64 base_address; 1278*4882a593Smuzhiyun u32 length; 1279*4882a593Smuzhiyun struct acpi_generic_address doorbell_register; 1280*4882a593Smuzhiyun u64 preserve_mask; 1281*4882a593Smuzhiyun u64 write_mask; 1282*4882a593Smuzhiyun u32 latency; 1283*4882a593Smuzhiyun u32 max_access_rate; 1284*4882a593Smuzhiyun u32 min_turnaround_time; 1285*4882a593Smuzhiyun struct acpi_generic_address platform_ack_register; 1286*4882a593Smuzhiyun u64 ack_preserve_mask; 1287*4882a593Smuzhiyun u64 ack_set_mask; 1288*4882a593Smuzhiyun u64 reserved2; 1289*4882a593Smuzhiyun struct acpi_generic_address cmd_complete_register; 1290*4882a593Smuzhiyun u64 cmd_complete_mask; 1291*4882a593Smuzhiyun struct acpi_generic_address cmd_update_register; 1292*4882a593Smuzhiyun u64 cmd_update_preserve_mask; 1293*4882a593Smuzhiyun u64 cmd_update_set_mask; 1294*4882a593Smuzhiyun struct acpi_generic_address error_status_register; 1295*4882a593Smuzhiyun u64 error_status_mask; 1296*4882a593Smuzhiyun }; 1297*4882a593Smuzhiyun 1298*4882a593Smuzhiyun /* 4: Extended PCC Slave Subspace Type 4 (ACPI 6.2) */ 1299*4882a593Smuzhiyun 1300*4882a593Smuzhiyun struct acpi_pcct_ext_pcc_slave { 1301*4882a593Smuzhiyun struct acpi_subtable_header header; 1302*4882a593Smuzhiyun u32 platform_interrupt; 1303*4882a593Smuzhiyun u8 flags; 1304*4882a593Smuzhiyun u8 reserved1; 1305*4882a593Smuzhiyun u64 base_address; 1306*4882a593Smuzhiyun u32 length; 1307*4882a593Smuzhiyun struct acpi_generic_address doorbell_register; 1308*4882a593Smuzhiyun u64 preserve_mask; 1309*4882a593Smuzhiyun u64 write_mask; 1310*4882a593Smuzhiyun u32 latency; 1311*4882a593Smuzhiyun u32 max_access_rate; 1312*4882a593Smuzhiyun u32 min_turnaround_time; 1313*4882a593Smuzhiyun struct acpi_generic_address platform_ack_register; 1314*4882a593Smuzhiyun u64 ack_preserve_mask; 1315*4882a593Smuzhiyun u64 ack_set_mask; 1316*4882a593Smuzhiyun u64 reserved2; 1317*4882a593Smuzhiyun struct acpi_generic_address cmd_complete_register; 1318*4882a593Smuzhiyun u64 cmd_complete_mask; 1319*4882a593Smuzhiyun struct acpi_generic_address cmd_update_register; 1320*4882a593Smuzhiyun u64 cmd_update_preserve_mask; 1321*4882a593Smuzhiyun u64 cmd_update_set_mask; 1322*4882a593Smuzhiyun struct acpi_generic_address error_status_register; 1323*4882a593Smuzhiyun u64 error_status_mask; 1324*4882a593Smuzhiyun }; 1325*4882a593Smuzhiyun 1326*4882a593Smuzhiyun /* Values for doorbell flags above */ 1327*4882a593Smuzhiyun 1328*4882a593Smuzhiyun #define ACPI_PCCT_INTERRUPT_POLARITY (1) 1329*4882a593Smuzhiyun #define ACPI_PCCT_INTERRUPT_MODE (1<<1) 1330*4882a593Smuzhiyun 1331*4882a593Smuzhiyun /* 1332*4882a593Smuzhiyun * PCC memory structures (not part of the ACPI table) 1333*4882a593Smuzhiyun */ 1334*4882a593Smuzhiyun 1335*4882a593Smuzhiyun /* Shared Memory Region */ 1336*4882a593Smuzhiyun 1337*4882a593Smuzhiyun struct acpi_pcct_shared_memory { 1338*4882a593Smuzhiyun u32 signature; 1339*4882a593Smuzhiyun u16 command; 1340*4882a593Smuzhiyun u16 status; 1341*4882a593Smuzhiyun }; 1342*4882a593Smuzhiyun 1343*4882a593Smuzhiyun /* Extended PCC Subspace Shared Memory Region (ACPI 6.2) */ 1344*4882a593Smuzhiyun 1345*4882a593Smuzhiyun struct acpi_pcct_ext_pcc_shared_memory { 1346*4882a593Smuzhiyun u32 signature; 1347*4882a593Smuzhiyun u32 flags; 1348*4882a593Smuzhiyun u32 length; 1349*4882a593Smuzhiyun u32 command; 1350*4882a593Smuzhiyun }; 1351*4882a593Smuzhiyun 1352*4882a593Smuzhiyun /******************************************************************************* 1353*4882a593Smuzhiyun * 1354*4882a593Smuzhiyun * PDTT - Platform Debug Trigger Table (ACPI 6.2) 1355*4882a593Smuzhiyun * Version 0 1356*4882a593Smuzhiyun * 1357*4882a593Smuzhiyun ******************************************************************************/ 1358*4882a593Smuzhiyun 1359*4882a593Smuzhiyun struct acpi_table_pdtt { 1360*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1361*4882a593Smuzhiyun u8 trigger_count; 1362*4882a593Smuzhiyun u8 reserved[3]; 1363*4882a593Smuzhiyun u32 array_offset; 1364*4882a593Smuzhiyun }; 1365*4882a593Smuzhiyun 1366*4882a593Smuzhiyun /* 1367*4882a593Smuzhiyun * PDTT Communication Channel Identifier Structure. 1368*4882a593Smuzhiyun * The number of these structures is defined by trigger_count above, 1369*4882a593Smuzhiyun * starting at array_offset. 1370*4882a593Smuzhiyun */ 1371*4882a593Smuzhiyun struct acpi_pdtt_channel { 1372*4882a593Smuzhiyun u8 subchannel_id; 1373*4882a593Smuzhiyun u8 flags; 1374*4882a593Smuzhiyun }; 1375*4882a593Smuzhiyun 1376*4882a593Smuzhiyun /* Flags for above */ 1377*4882a593Smuzhiyun 1378*4882a593Smuzhiyun #define ACPI_PDTT_RUNTIME_TRIGGER (1) 1379*4882a593Smuzhiyun #define ACPI_PDTT_WAIT_COMPLETION (1<<1) 1380*4882a593Smuzhiyun #define ACPI_PDTT_TRIGGER_ORDER (1<<2) 1381*4882a593Smuzhiyun 1382*4882a593Smuzhiyun /******************************************************************************* 1383*4882a593Smuzhiyun * 1384*4882a593Smuzhiyun * PMTT - Platform Memory Topology Table (ACPI 5.0) 1385*4882a593Smuzhiyun * Version 1 1386*4882a593Smuzhiyun * 1387*4882a593Smuzhiyun ******************************************************************************/ 1388*4882a593Smuzhiyun 1389*4882a593Smuzhiyun struct acpi_table_pmtt { 1390*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1391*4882a593Smuzhiyun u32 reserved; 1392*4882a593Smuzhiyun }; 1393*4882a593Smuzhiyun 1394*4882a593Smuzhiyun /* Common header for PMTT subtables that follow main table */ 1395*4882a593Smuzhiyun 1396*4882a593Smuzhiyun struct acpi_pmtt_header { 1397*4882a593Smuzhiyun u8 type; 1398*4882a593Smuzhiyun u8 reserved1; 1399*4882a593Smuzhiyun u16 length; 1400*4882a593Smuzhiyun u16 flags; 1401*4882a593Smuzhiyun u16 reserved2; 1402*4882a593Smuzhiyun }; 1403*4882a593Smuzhiyun 1404*4882a593Smuzhiyun /* Values for Type field above */ 1405*4882a593Smuzhiyun 1406*4882a593Smuzhiyun #define ACPI_PMTT_TYPE_SOCKET 0 1407*4882a593Smuzhiyun #define ACPI_PMTT_TYPE_CONTROLLER 1 1408*4882a593Smuzhiyun #define ACPI_PMTT_TYPE_DIMM 2 1409*4882a593Smuzhiyun #define ACPI_PMTT_TYPE_RESERVED 3 /* 0x03-0xFF are reserved */ 1410*4882a593Smuzhiyun 1411*4882a593Smuzhiyun /* Values for Flags field above */ 1412*4882a593Smuzhiyun 1413*4882a593Smuzhiyun #define ACPI_PMTT_TOP_LEVEL 0x0001 1414*4882a593Smuzhiyun #define ACPI_PMTT_PHYSICAL 0x0002 1415*4882a593Smuzhiyun #define ACPI_PMTT_MEMORY_TYPE 0x000C 1416*4882a593Smuzhiyun 1417*4882a593Smuzhiyun /* 1418*4882a593Smuzhiyun * PMTT subtables, correspond to Type in struct acpi_pmtt_header 1419*4882a593Smuzhiyun */ 1420*4882a593Smuzhiyun 1421*4882a593Smuzhiyun /* 0: Socket Structure */ 1422*4882a593Smuzhiyun 1423*4882a593Smuzhiyun struct acpi_pmtt_socket { 1424*4882a593Smuzhiyun struct acpi_pmtt_header header; 1425*4882a593Smuzhiyun u16 socket_id; 1426*4882a593Smuzhiyun u16 reserved; 1427*4882a593Smuzhiyun }; 1428*4882a593Smuzhiyun 1429*4882a593Smuzhiyun /* 1: Memory Controller subtable */ 1430*4882a593Smuzhiyun 1431*4882a593Smuzhiyun struct acpi_pmtt_controller { 1432*4882a593Smuzhiyun struct acpi_pmtt_header header; 1433*4882a593Smuzhiyun u32 read_latency; 1434*4882a593Smuzhiyun u32 write_latency; 1435*4882a593Smuzhiyun u32 read_bandwidth; 1436*4882a593Smuzhiyun u32 write_bandwidth; 1437*4882a593Smuzhiyun u16 access_width; 1438*4882a593Smuzhiyun u16 alignment; 1439*4882a593Smuzhiyun u16 reserved; 1440*4882a593Smuzhiyun u16 domain_count; 1441*4882a593Smuzhiyun }; 1442*4882a593Smuzhiyun 1443*4882a593Smuzhiyun /* 1a: Proximity Domain substructure */ 1444*4882a593Smuzhiyun 1445*4882a593Smuzhiyun struct acpi_pmtt_domain { 1446*4882a593Smuzhiyun u32 proximity_domain; 1447*4882a593Smuzhiyun }; 1448*4882a593Smuzhiyun 1449*4882a593Smuzhiyun /* 2: Physical Component Identifier (DIMM) */ 1450*4882a593Smuzhiyun 1451*4882a593Smuzhiyun struct acpi_pmtt_physical_component { 1452*4882a593Smuzhiyun struct acpi_pmtt_header header; 1453*4882a593Smuzhiyun u16 component_id; 1454*4882a593Smuzhiyun u16 reserved; 1455*4882a593Smuzhiyun u32 memory_size; 1456*4882a593Smuzhiyun u32 bios_handle; 1457*4882a593Smuzhiyun }; 1458*4882a593Smuzhiyun 1459*4882a593Smuzhiyun /******************************************************************************* 1460*4882a593Smuzhiyun * 1461*4882a593Smuzhiyun * PPTT - Processor Properties Topology Table (ACPI 6.2) 1462*4882a593Smuzhiyun * Version 1 1463*4882a593Smuzhiyun * 1464*4882a593Smuzhiyun ******************************************************************************/ 1465*4882a593Smuzhiyun 1466*4882a593Smuzhiyun struct acpi_table_pptt { 1467*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1468*4882a593Smuzhiyun }; 1469*4882a593Smuzhiyun 1470*4882a593Smuzhiyun /* Values for Type field above */ 1471*4882a593Smuzhiyun 1472*4882a593Smuzhiyun enum acpi_pptt_type { 1473*4882a593Smuzhiyun ACPI_PPTT_TYPE_PROCESSOR = 0, 1474*4882a593Smuzhiyun ACPI_PPTT_TYPE_CACHE = 1, 1475*4882a593Smuzhiyun ACPI_PPTT_TYPE_ID = 2, 1476*4882a593Smuzhiyun ACPI_PPTT_TYPE_RESERVED = 3 1477*4882a593Smuzhiyun }; 1478*4882a593Smuzhiyun 1479*4882a593Smuzhiyun /* 0: Processor Hierarchy Node Structure */ 1480*4882a593Smuzhiyun 1481*4882a593Smuzhiyun struct acpi_pptt_processor { 1482*4882a593Smuzhiyun struct acpi_subtable_header header; 1483*4882a593Smuzhiyun u16 reserved; 1484*4882a593Smuzhiyun u32 flags; 1485*4882a593Smuzhiyun u32 parent; 1486*4882a593Smuzhiyun u32 acpi_processor_id; 1487*4882a593Smuzhiyun u32 number_of_priv_resources; 1488*4882a593Smuzhiyun }; 1489*4882a593Smuzhiyun 1490*4882a593Smuzhiyun /* Flags */ 1491*4882a593Smuzhiyun 1492*4882a593Smuzhiyun #define ACPI_PPTT_PHYSICAL_PACKAGE (1) 1493*4882a593Smuzhiyun #define ACPI_PPTT_ACPI_PROCESSOR_ID_VALID (1<<1) 1494*4882a593Smuzhiyun #define ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD (1<<2) /* ACPI 6.3 */ 1495*4882a593Smuzhiyun #define ACPI_PPTT_ACPI_LEAF_NODE (1<<3) /* ACPI 6.3 */ 1496*4882a593Smuzhiyun #define ACPI_PPTT_ACPI_IDENTICAL (1<<4) /* ACPI 6.3 */ 1497*4882a593Smuzhiyun 1498*4882a593Smuzhiyun /* 1: Cache Type Structure */ 1499*4882a593Smuzhiyun 1500*4882a593Smuzhiyun struct acpi_pptt_cache { 1501*4882a593Smuzhiyun struct acpi_subtable_header header; 1502*4882a593Smuzhiyun u16 reserved; 1503*4882a593Smuzhiyun u32 flags; 1504*4882a593Smuzhiyun u32 next_level_of_cache; 1505*4882a593Smuzhiyun u32 size; 1506*4882a593Smuzhiyun u32 number_of_sets; 1507*4882a593Smuzhiyun u8 associativity; 1508*4882a593Smuzhiyun u8 attributes; 1509*4882a593Smuzhiyun u16 line_size; 1510*4882a593Smuzhiyun }; 1511*4882a593Smuzhiyun 1512*4882a593Smuzhiyun /* Flags */ 1513*4882a593Smuzhiyun 1514*4882a593Smuzhiyun #define ACPI_PPTT_SIZE_PROPERTY_VALID (1) /* Physical property valid */ 1515*4882a593Smuzhiyun #define ACPI_PPTT_NUMBER_OF_SETS_VALID (1<<1) /* Number of sets valid */ 1516*4882a593Smuzhiyun #define ACPI_PPTT_ASSOCIATIVITY_VALID (1<<2) /* Associativity valid */ 1517*4882a593Smuzhiyun #define ACPI_PPTT_ALLOCATION_TYPE_VALID (1<<3) /* Allocation type valid */ 1518*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_TYPE_VALID (1<<4) /* Cache type valid */ 1519*4882a593Smuzhiyun #define ACPI_PPTT_WRITE_POLICY_VALID (1<<5) /* Write policy valid */ 1520*4882a593Smuzhiyun #define ACPI_PPTT_LINE_SIZE_VALID (1<<6) /* Line size valid */ 1521*4882a593Smuzhiyun 1522*4882a593Smuzhiyun /* Masks for Attributes */ 1523*4882a593Smuzhiyun 1524*4882a593Smuzhiyun #define ACPI_PPTT_MASK_ALLOCATION_TYPE (0x03) /* Allocation type */ 1525*4882a593Smuzhiyun #define ACPI_PPTT_MASK_CACHE_TYPE (0x0C) /* Cache type */ 1526*4882a593Smuzhiyun #define ACPI_PPTT_MASK_WRITE_POLICY (0x10) /* Write policy */ 1527*4882a593Smuzhiyun 1528*4882a593Smuzhiyun /* Attributes describing cache */ 1529*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_READ_ALLOCATE (0x0) /* Cache line is allocated on read */ 1530*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_WRITE_ALLOCATE (0x01) /* Cache line is allocated on write */ 1531*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_RW_ALLOCATE (0x02) /* Cache line is allocated on read and write */ 1532*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_RW_ALLOCATE_ALT (0x03) /* Alternate representation of above */ 1533*4882a593Smuzhiyun 1534*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_TYPE_DATA (0x0) /* Data cache */ 1535*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_TYPE_INSTR (1<<2) /* Instruction cache */ 1536*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_TYPE_UNIFIED (2<<2) /* Unified I & D cache */ 1537*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_TYPE_UNIFIED_ALT (3<<2) /* Alternate representation of above */ 1538*4882a593Smuzhiyun 1539*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_POLICY_WB (0x0) /* Cache is write back */ 1540*4882a593Smuzhiyun #define ACPI_PPTT_CACHE_POLICY_WT (1<<4) /* Cache is write through */ 1541*4882a593Smuzhiyun 1542*4882a593Smuzhiyun /* 2: ID Structure */ 1543*4882a593Smuzhiyun 1544*4882a593Smuzhiyun struct acpi_pptt_id { 1545*4882a593Smuzhiyun struct acpi_subtable_header header; 1546*4882a593Smuzhiyun u16 reserved; 1547*4882a593Smuzhiyun u32 vendor_id; 1548*4882a593Smuzhiyun u64 level1_id; 1549*4882a593Smuzhiyun u64 level2_id; 1550*4882a593Smuzhiyun u16 major_rev; 1551*4882a593Smuzhiyun u16 minor_rev; 1552*4882a593Smuzhiyun u16 spin_rev; 1553*4882a593Smuzhiyun }; 1554*4882a593Smuzhiyun 1555*4882a593Smuzhiyun /******************************************************************************* 1556*4882a593Smuzhiyun * 1557*4882a593Smuzhiyun * RASF - RAS Feature Table (ACPI 5.0) 1558*4882a593Smuzhiyun * Version 1 1559*4882a593Smuzhiyun * 1560*4882a593Smuzhiyun ******************************************************************************/ 1561*4882a593Smuzhiyun 1562*4882a593Smuzhiyun struct acpi_table_rasf { 1563*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1564*4882a593Smuzhiyun u8 channel_id[12]; 1565*4882a593Smuzhiyun }; 1566*4882a593Smuzhiyun 1567*4882a593Smuzhiyun /* RASF Platform Communication Channel Shared Memory Region */ 1568*4882a593Smuzhiyun 1569*4882a593Smuzhiyun struct acpi_rasf_shared_memory { 1570*4882a593Smuzhiyun u32 signature; 1571*4882a593Smuzhiyun u16 command; 1572*4882a593Smuzhiyun u16 status; 1573*4882a593Smuzhiyun u16 version; 1574*4882a593Smuzhiyun u8 capabilities[16]; 1575*4882a593Smuzhiyun u8 set_capabilities[16]; 1576*4882a593Smuzhiyun u16 num_parameter_blocks; 1577*4882a593Smuzhiyun u32 set_capabilities_status; 1578*4882a593Smuzhiyun }; 1579*4882a593Smuzhiyun 1580*4882a593Smuzhiyun /* RASF Parameter Block Structure Header */ 1581*4882a593Smuzhiyun 1582*4882a593Smuzhiyun struct acpi_rasf_parameter_block { 1583*4882a593Smuzhiyun u16 type; 1584*4882a593Smuzhiyun u16 version; 1585*4882a593Smuzhiyun u16 length; 1586*4882a593Smuzhiyun }; 1587*4882a593Smuzhiyun 1588*4882a593Smuzhiyun /* RASF Parameter Block Structure for PATROL_SCRUB */ 1589*4882a593Smuzhiyun 1590*4882a593Smuzhiyun struct acpi_rasf_patrol_scrub_parameter { 1591*4882a593Smuzhiyun struct acpi_rasf_parameter_block header; 1592*4882a593Smuzhiyun u16 patrol_scrub_command; 1593*4882a593Smuzhiyun u64 requested_address_range[2]; 1594*4882a593Smuzhiyun u64 actual_address_range[2]; 1595*4882a593Smuzhiyun u16 flags; 1596*4882a593Smuzhiyun u8 requested_speed; 1597*4882a593Smuzhiyun }; 1598*4882a593Smuzhiyun 1599*4882a593Smuzhiyun /* Masks for Flags and Speed fields above */ 1600*4882a593Smuzhiyun 1601*4882a593Smuzhiyun #define ACPI_RASF_SCRUBBER_RUNNING 1 1602*4882a593Smuzhiyun #define ACPI_RASF_SPEED (7<<1) 1603*4882a593Smuzhiyun #define ACPI_RASF_SPEED_SLOW (0<<1) 1604*4882a593Smuzhiyun #define ACPI_RASF_SPEED_MEDIUM (4<<1) 1605*4882a593Smuzhiyun #define ACPI_RASF_SPEED_FAST (7<<1) 1606*4882a593Smuzhiyun 1607*4882a593Smuzhiyun /* Channel Commands */ 1608*4882a593Smuzhiyun 1609*4882a593Smuzhiyun enum acpi_rasf_commands { 1610*4882a593Smuzhiyun ACPI_RASF_EXECUTE_RASF_COMMAND = 1 1611*4882a593Smuzhiyun }; 1612*4882a593Smuzhiyun 1613*4882a593Smuzhiyun /* Platform RAS Capabilities */ 1614*4882a593Smuzhiyun 1615*4882a593Smuzhiyun enum acpi_rasf_capabiliities { 1616*4882a593Smuzhiyun ACPI_HW_PATROL_SCRUB_SUPPORTED = 0, 1617*4882a593Smuzhiyun ACPI_SW_PATROL_SCRUB_EXPOSED = 1 1618*4882a593Smuzhiyun }; 1619*4882a593Smuzhiyun 1620*4882a593Smuzhiyun /* Patrol Scrub Commands */ 1621*4882a593Smuzhiyun 1622*4882a593Smuzhiyun enum acpi_rasf_patrol_scrub_commands { 1623*4882a593Smuzhiyun ACPI_RASF_GET_PATROL_PARAMETERS = 1, 1624*4882a593Smuzhiyun ACPI_RASF_START_PATROL_SCRUBBER = 2, 1625*4882a593Smuzhiyun ACPI_RASF_STOP_PATROL_SCRUBBER = 3 1626*4882a593Smuzhiyun }; 1627*4882a593Smuzhiyun 1628*4882a593Smuzhiyun /* Channel Command flags */ 1629*4882a593Smuzhiyun 1630*4882a593Smuzhiyun #define ACPI_RASF_GENERATE_SCI (1<<15) 1631*4882a593Smuzhiyun 1632*4882a593Smuzhiyun /* Status values */ 1633*4882a593Smuzhiyun 1634*4882a593Smuzhiyun enum acpi_rasf_status { 1635*4882a593Smuzhiyun ACPI_RASF_SUCCESS = 0, 1636*4882a593Smuzhiyun ACPI_RASF_NOT_VALID = 1, 1637*4882a593Smuzhiyun ACPI_RASF_NOT_SUPPORTED = 2, 1638*4882a593Smuzhiyun ACPI_RASF_BUSY = 3, 1639*4882a593Smuzhiyun ACPI_RASF_FAILED = 4, 1640*4882a593Smuzhiyun ACPI_RASF_ABORTED = 5, 1641*4882a593Smuzhiyun ACPI_RASF_INVALID_DATA = 6 1642*4882a593Smuzhiyun }; 1643*4882a593Smuzhiyun 1644*4882a593Smuzhiyun /* Status flags */ 1645*4882a593Smuzhiyun 1646*4882a593Smuzhiyun #define ACPI_RASF_COMMAND_COMPLETE (1) 1647*4882a593Smuzhiyun #define ACPI_RASF_SCI_DOORBELL (1<<1) 1648*4882a593Smuzhiyun #define ACPI_RASF_ERROR (1<<2) 1649*4882a593Smuzhiyun #define ACPI_RASF_STATUS (0x1F<<3) 1650*4882a593Smuzhiyun 1651*4882a593Smuzhiyun /******************************************************************************* 1652*4882a593Smuzhiyun * 1653*4882a593Smuzhiyun * SBST - Smart Battery Specification Table 1654*4882a593Smuzhiyun * Version 1 1655*4882a593Smuzhiyun * 1656*4882a593Smuzhiyun ******************************************************************************/ 1657*4882a593Smuzhiyun 1658*4882a593Smuzhiyun struct acpi_table_sbst { 1659*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1660*4882a593Smuzhiyun u32 warning_level; 1661*4882a593Smuzhiyun u32 low_level; 1662*4882a593Smuzhiyun u32 critical_level; 1663*4882a593Smuzhiyun }; 1664*4882a593Smuzhiyun 1665*4882a593Smuzhiyun /******************************************************************************* 1666*4882a593Smuzhiyun * 1667*4882a593Smuzhiyun * SDEI - Software Delegated Exception Interface Descriptor Table 1668*4882a593Smuzhiyun * 1669*4882a593Smuzhiyun * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A, 1670*4882a593Smuzhiyun * May 8th, 2017. Copyright 2017 ARM Ltd. 1671*4882a593Smuzhiyun * 1672*4882a593Smuzhiyun ******************************************************************************/ 1673*4882a593Smuzhiyun 1674*4882a593Smuzhiyun struct acpi_table_sdei { 1675*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1676*4882a593Smuzhiyun }; 1677*4882a593Smuzhiyun 1678*4882a593Smuzhiyun /******************************************************************************* 1679*4882a593Smuzhiyun * 1680*4882a593Smuzhiyun * SDEV - Secure Devices Table (ACPI 6.2) 1681*4882a593Smuzhiyun * Version 1 1682*4882a593Smuzhiyun * 1683*4882a593Smuzhiyun ******************************************************************************/ 1684*4882a593Smuzhiyun 1685*4882a593Smuzhiyun struct acpi_table_sdev { 1686*4882a593Smuzhiyun struct acpi_table_header header; /* Common ACPI table header */ 1687*4882a593Smuzhiyun }; 1688*4882a593Smuzhiyun 1689*4882a593Smuzhiyun struct acpi_sdev_header { 1690*4882a593Smuzhiyun u8 type; 1691*4882a593Smuzhiyun u8 flags; 1692*4882a593Smuzhiyun u16 length; 1693*4882a593Smuzhiyun }; 1694*4882a593Smuzhiyun 1695*4882a593Smuzhiyun /* Values for subtable type above */ 1696*4882a593Smuzhiyun 1697*4882a593Smuzhiyun enum acpi_sdev_type { 1698*4882a593Smuzhiyun ACPI_SDEV_TYPE_NAMESPACE_DEVICE = 0, 1699*4882a593Smuzhiyun ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE = 1, 1700*4882a593Smuzhiyun ACPI_SDEV_TYPE_RESERVED = 2 /* 2 and greater are reserved */ 1701*4882a593Smuzhiyun }; 1702*4882a593Smuzhiyun 1703*4882a593Smuzhiyun /* Values for flags above */ 1704*4882a593Smuzhiyun 1705*4882a593Smuzhiyun #define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS (1) 1706*4882a593Smuzhiyun 1707*4882a593Smuzhiyun /* 1708*4882a593Smuzhiyun * SDEV subtables 1709*4882a593Smuzhiyun */ 1710*4882a593Smuzhiyun 1711*4882a593Smuzhiyun /* 0: Namespace Device Based Secure Device Structure */ 1712*4882a593Smuzhiyun 1713*4882a593Smuzhiyun struct acpi_sdev_namespace { 1714*4882a593Smuzhiyun struct acpi_sdev_header header; 1715*4882a593Smuzhiyun u16 device_id_offset; 1716*4882a593Smuzhiyun u16 device_id_length; 1717*4882a593Smuzhiyun u16 vendor_data_offset; 1718*4882a593Smuzhiyun u16 vendor_data_length; 1719*4882a593Smuzhiyun }; 1720*4882a593Smuzhiyun 1721*4882a593Smuzhiyun /* 1: PCIe Endpoint Device Based Device Structure */ 1722*4882a593Smuzhiyun 1723*4882a593Smuzhiyun struct acpi_sdev_pcie { 1724*4882a593Smuzhiyun struct acpi_sdev_header header; 1725*4882a593Smuzhiyun u16 segment; 1726*4882a593Smuzhiyun u16 start_bus; 1727*4882a593Smuzhiyun u16 path_offset; 1728*4882a593Smuzhiyun u16 path_length; 1729*4882a593Smuzhiyun u16 vendor_data_offset; 1730*4882a593Smuzhiyun u16 vendor_data_length; 1731*4882a593Smuzhiyun }; 1732*4882a593Smuzhiyun 1733*4882a593Smuzhiyun /* 1a: PCIe Endpoint path entry */ 1734*4882a593Smuzhiyun 1735*4882a593Smuzhiyun struct acpi_sdev_pcie_path { 1736*4882a593Smuzhiyun u8 device; 1737*4882a593Smuzhiyun u8 function; 1738*4882a593Smuzhiyun }; 1739*4882a593Smuzhiyun 1740*4882a593Smuzhiyun /* Reset to default packing */ 1741*4882a593Smuzhiyun 1742*4882a593Smuzhiyun #pragma pack() 1743*4882a593Smuzhiyun 1744*4882a593Smuzhiyun #endif /* __ACTBL2_H__ */ 1745