/** @file ACPI 1.0b definitions from the ACPI Specification, revision 1.0b Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
Copyright (c) 2020, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _ACPI_1_0_H_ #define _ACPI_1_0_H_ #include /// /// Common table header, this prefaces all ACPI tables, including FACS, but /// excluding the RSD PTR structure. /// typedef struct { UINT32 Signature; UINT32 Length; } EFI_ACPI_COMMON_HEADER; #pragma pack(1) /// /// The common ACPI description table header. This structure prefaces most ACPI tables. /// typedef struct { UINT32 Signature; UINT32 Length; UINT8 Revision; UINT8 Checksum; UINT8 OemId[6]; UINT64 OemTableId; UINT32 OemRevision; UINT32 CreatorId; UINT32 CreatorRevision; } EFI_ACPI_DESCRIPTION_HEADER; #pragma pack() // // Define for Descriptor // #define ACPI_SMALL_ITEM_FLAG 0x00 #define ACPI_LARGE_ITEM_FLAG 0x01 // // Small Item Descriptor Name // #define ACPI_SMALL_IRQ_DESCRIPTOR_NAME 0x04 #define ACPI_SMALL_DMA_DESCRIPTOR_NAME 0x05 #define ACPI_SMALL_START_DEPENDENT_DESCRIPTOR_NAME 0x06 #define ACPI_SMALL_END_DEPENDENT_DESCRIPTOR_NAME 0x07 #define ACPI_SMALL_IO_PORT_DESCRIPTOR_NAME 0x08 #define ACPI_SMALL_FIXED_IO_PORT_DESCRIPTOR_NAME 0x09 #define ACPI_SMALL_VENDOR_DEFINED_DESCRIPTOR_NAME 0x0E #define ACPI_SMALL_END_TAG_DESCRIPTOR_NAME 0x0F // // Large Item Descriptor Name // #define ACPI_LARGE_24_BIT_MEMORY_RANGE_DESCRIPTOR_NAME 0x01 #define ACPI_LARGE_VENDOR_DEFINED_DESCRIPTOR_NAME 0x04 #define ACPI_LARGE_32_BIT_MEMORY_RANGE_DESCRIPTOR_NAME 0x05 #define ACPI_LARGE_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR_NAME 0x06 #define ACPI_LARGE_DWORD_ADDRESS_SPACE_DESCRIPTOR_NAME 0x07 #define ACPI_LARGE_WORD_ADDRESS_SPACE_DESCRIPTOR_NAME 0x08 #define ACPI_LARGE_EXTENDED_IRQ_DESCRIPTOR_NAME 0x09 #define ACPI_LARGE_QWORD_ADDRESS_SPACE_DESCRIPTOR_NAME 0x0A // // Small Item Descriptor Value // #define ACPI_IRQ_NOFLAG_DESCRIPTOR 0x22 #define ACPI_IRQ_DESCRIPTOR 0x23 #define ACPI_DMA_DESCRIPTOR 0x2A #define ACPI_START_DEPENDENT_DESCRIPTOR 0x30 #define ACPI_START_DEPENDENT_EX_DESCRIPTOR 0x31 #define ACPI_END_DEPENDENT_DESCRIPTOR 0x38 #define ACPI_IO_PORT_DESCRIPTOR 0x47 #define ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR 0x4B #define ACPI_END_TAG_DESCRIPTOR 0x79 // // Large Item Descriptor Value // #define ACPI_24_BIT_MEMORY_RANGE_DESCRIPTOR 0x81 #define ACPI_32_BIT_MEMORY_RANGE_DESCRIPTOR 0x85 #define ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR 0x86 #define ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR 0x87 #define ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR 0x88 #define ACPI_EXTENDED_INTERRUPT_DESCRIPTOR 0x89 #define ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR 0x8A #define ACPI_ADDRESS_SPACE_DESCRIPTOR 0x8A // // Resource Type // #define ACPI_ADDRESS_SPACE_TYPE_MEM 0x00 #define ACPI_ADDRESS_SPACE_TYPE_IO 0x01 #define ACPI_ADDRESS_SPACE_TYPE_BUS 0x02 /// /// Power Management Timer frequency is fixed at 3.579545MHz. /// #define ACPI_TIMER_FREQUENCY 3579545 // // Ensure proper structure formats // #pragma pack(1) /// /// The common definition of QWORD, DWORD, and WORD /// Address Space Descriptors. /// typedef PACKED struct { UINT8 Desc; UINT16 Len; UINT8 ResType; UINT8 GenFlag; UINT8 SpecificFlag; UINT64 AddrSpaceGranularity; UINT64 AddrRangeMin; UINT64 AddrRangeMax; UINT64 AddrTranslationOffset; UINT64 AddrLen; } EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR; typedef PACKED union { UINT8 Byte; PACKED struct { UINT8 Length : 3; UINT8 Name : 4; UINT8 Type : 1; } Bits; } ACPI_SMALL_RESOURCE_HEADER; typedef PACKED struct { PACKED union { UINT8 Byte; PACKED struct { UINT8 Name : 7; UINT8 Type : 1; } Bits; } Header; UINT16 Length; } ACPI_LARGE_RESOURCE_HEADER; /// /// IRQ Descriptor. /// typedef PACKED struct { ACPI_SMALL_RESOURCE_HEADER Header; UINT16 Mask; } EFI_ACPI_IRQ_NOFLAG_DESCRIPTOR; /// /// IRQ Descriptor. /// typedef PACKED struct { ACPI_SMALL_RESOURCE_HEADER Header; UINT16 Mask; UINT8 Information; } EFI_ACPI_IRQ_DESCRIPTOR; /// /// DMA Descriptor. /// typedef PACKED struct { ACPI_SMALL_RESOURCE_HEADER Header; UINT8 ChannelMask; UINT8 Information; } EFI_ACPI_DMA_DESCRIPTOR; /// /// I/O Port Descriptor /// typedef PACKED struct { ACPI_SMALL_RESOURCE_HEADER Header; UINT8 Information; UINT16 BaseAddressMin; UINT16 BaseAddressMax; UINT8 Alignment; UINT8 Length; } EFI_ACPI_IO_PORT_DESCRIPTOR; /// /// Fixed Location I/O Port Descriptor. /// typedef PACKED struct { ACPI_SMALL_RESOURCE_HEADER Header; UINT16 BaseAddress; UINT8 Length; } EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR; /// /// 24-Bit Memory Range Descriptor /// typedef PACKED struct { ACPI_LARGE_RESOURCE_HEADER Header; UINT8 Information; UINT16 BaseAddressMin; UINT16 BaseAddressMax; UINT16 Alignment; UINT16 Length; } EFI_ACPI_24_BIT_MEMORY_RANGE_DESCRIPTOR; /// /// 32-Bit Memory Range Descriptor /// typedef PACKED struct { ACPI_LARGE_RESOURCE_HEADER Header; UINT8 Information; UINT32 BaseAddressMin; UINT32 BaseAddressMax; UINT32 Alignment; UINT32 Length; } EFI_ACPI_32_BIT_MEMORY_RANGE_DESCRIPTOR; /// /// Fixed 32-Bit Fixed Memory Range Descriptor /// typedef PACKED struct { ACPI_LARGE_RESOURCE_HEADER Header; UINT8 Information; UINT32 BaseAddress; UINT32 Length; } EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR; /// /// QWORD Address Space Descriptor /// typedef PACKED struct { ACPI_LARGE_RESOURCE_HEADER Header; UINT8 ResType; UINT8 GenFlag; UINT8 SpecificFlag; UINT64 AddrSpaceGranularity; UINT64 AddrRangeMin; UINT64 AddrRangeMax; UINT64 AddrTranslationOffset; UINT64 AddrLen; } EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR; /// /// DWORD Address Space Descriptor /// typedef PACKED struct { ACPI_LARGE_RESOURCE_HEADER Header; UINT8 ResType; UINT8 GenFlag; UINT8 SpecificFlag; UINT32 AddrSpaceGranularity; UINT32 AddrRangeMin; UINT32 AddrRangeMax; UINT32 AddrTranslationOffset; UINT32 AddrLen; } EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR; /// /// WORD Address Space Descriptor /// typedef PACKED struct { ACPI_LARGE_RESOURCE_HEADER Header; UINT8 ResType; UINT8 GenFlag; UINT8 SpecificFlag; UINT16 AddrSpaceGranularity; UINT16 AddrRangeMin; UINT16 AddrRangeMax; UINT16 AddrTranslationOffset; UINT16 AddrLen; } EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR; /// /// Extended Interrupt Descriptor /// typedef PACKED struct { ACPI_LARGE_RESOURCE_HEADER Header; UINT8 InterruptVectorFlags; UINT8 InterruptTableLength; UINT32 InterruptNumber[1]; } EFI_ACPI_EXTENDED_INTERRUPT_DESCRIPTOR; #pragma pack() /// /// The End tag identifies an end of resource data. /// typedef struct { UINT8 Desc; UINT8 Checksum; } EFI_ACPI_END_TAG_DESCRIPTOR; // // General use definitions // #define EFI_ACPI_RESERVED_BYTE 0x00 #define EFI_ACPI_RESERVED_WORD 0x0000 #define EFI_ACPI_RESERVED_DWORD 0x00000000 #define EFI_ACPI_RESERVED_QWORD 0x0000000000000000 // // Resource Type Specific Flags // Ref ACPI specification 6.4.3.5.5 // // Bit [0] : Write Status, _RW // #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_WRITE (1 << 0) #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_READ_ONLY (0 << 0) // // Bit [2:1] : Memory Attributes, _MEM // #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_NON_CACHEABLE (0 << 1) #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE (1 << 1) #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_WRITE_COMBINING (2 << 1) #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE (3 << 1) // // Bit [4:3] : Memory Attributes, _MTP // #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_MEMORY (0 << 3) #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_RESERVED (1 << 3) #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_ACPI (2 << 3) #define EFI_APCI_MEMORY_RESOURCE_SPECIFIC_FLAG_ADDRESS_RANGE_NVS (3 << 3) // // Bit [5] : Memory to I/O Translation, _TTP // #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_TYPE_TRANSLATION (1 << 5) #define EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_TYPE_STATIC (0 << 5) // // IRQ Information // Ref ACPI specification 6.4.2.1 // #define EFI_ACPI_IRQ_SHARABLE_MASK 0x10 #define EFI_ACPI_IRQ_SHARABLE 0x10 #define EFI_ACPI_IRQ_POLARITY_MASK 0x08 #define EFI_ACPI_IRQ_HIGH_TRUE 0x00 #define EFI_ACPI_IRQ_LOW_FALSE 0x08 #define EFI_ACPI_IRQ_MODE 0x01 #define EFI_ACPI_IRQ_LEVEL_TRIGGERED 0x00 #define EFI_ACPI_IRQ_EDGE_TRIGGERED 0x01 // // DMA Information // Ref ACPI specification 6.4.2.2 // #define EFI_ACPI_DMA_SPEED_TYPE_MASK 0x60 #define EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY 0x00 #define EFI_ACPI_DMA_SPEED_TYPE_A 0x20 #define EFI_ACPI_DMA_SPEED_TYPE_B 0x40 #define EFI_ACPI_DMA_SPEED_TYPE_F 0x60 #define EFI_ACPI_DMA_BUS_MASTER_MASK 0x04 #define EFI_ACPI_DMA_BUS_MASTER 0x04 #define EFI_ACPI_DMA_TRANSFER_TYPE_MASK 0x03 #define EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT 0x00 #define EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT 0x01 #define EFI_ACPI_DMA_TRANSFER_TYPE_16_BIT 0x02 // // IO Information // Ref ACPI specification 6.4.2.5 // #define EFI_ACPI_IO_DECODE_MASK 0x01 #define EFI_ACPI_IO_DECODE_16_BIT 0x01 #define EFI_ACPI_IO_DECODE_10_BIT 0x00 // // Memory Information // Ref ACPI specification 6.4.3.4 // #define EFI_ACPI_MEMORY_WRITE_STATUS_MASK 0x01 #define EFI_ACPI_MEMORY_WRITABLE 0x01 #define EFI_ACPI_MEMORY_NON_WRITABLE 0x00 // // Interrupt Vector Flags definitions for Extended Interrupt Descriptor // Ref ACPI specification 6.4.3.6 // #define EFI_ACPI_EXTENDED_INTERRUPT_FLAG_PRODUCER_CONSUMER_MASK BIT0 #define EFI_ACPI_EXTENDED_INTERRUPT_FLAG_MODE_MASK BIT1 #define EFI_ACPI_EXTENDED_INTERRUPT_FLAG_POLARITY_MASK BIT2 #define EFI_ACPI_EXTENDED_INTERRUPT_FLAG_SHARABLE_MASK BIT3 #define EFI_ACPI_EXTENDED_INTERRUPT_FLAG_WAKE_CAPABLITY_MASK BIT4 // // Ensure proper structure formats // #pragma pack(1) // // ACPI 1.0b table structures // /// /// Root System Description Pointer Structure. /// typedef struct { UINT64 Signature; UINT8 Checksum; UINT8 OemId[6]; UINT8 Reserved; UINT32 RsdtAddress; } EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER; // // Root System Description Table // No definition needed as it is a common description table header, the same with // EFI_ACPI_DESCRIPTION_HEADER, followed by a variable number of UINT32 table pointers. // /// /// RSDT Revision (as defined in ACPI 1.0b specification). /// #define EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION 0x01 /// /// Fixed ACPI Description Table Structure (FADT). /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 FirmwareCtrl; UINT32 Dsdt; UINT8 IntModel; UINT8 Reserved1; UINT16 SciInt; UINT32 SmiCmd; UINT8 AcpiEnable; UINT8 AcpiDisable; UINT8 S4BiosReq; UINT8 Reserved2; UINT32 Pm1aEvtBlk; UINT32 Pm1bEvtBlk; UINT32 Pm1aCntBlk; UINT32 Pm1bCntBlk; UINT32 Pm2CntBlk; UINT32 PmTmrBlk; UINT32 Gpe0Blk; UINT32 Gpe1Blk; UINT8 Pm1EvtLen; UINT8 Pm1CntLen; UINT8 Pm2CntLen; UINT8 PmTmLen; UINT8 Gpe0BlkLen; UINT8 Gpe1BlkLen; UINT8 Gpe1Base; UINT8 Reserved3; UINT16 PLvl2Lat; UINT16 PLvl3Lat; UINT16 FlushSize; UINT16 FlushStride; UINT8 DutyOffset; UINT8 DutyWidth; UINT8 DayAlrm; UINT8 MonAlrm; UINT8 Century; UINT8 Reserved4; UINT8 Reserved5; UINT8 Reserved6; UINT32 Flags; } EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE; /// /// FADT Version (as defined in ACPI 1.0b specification). /// #define EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION 0x01 #define EFI_ACPI_1_0_INT_MODE_DUAL_PIC 0 #define EFI_ACPI_1_0_INT_MODE_MULTIPLE_APIC 1 // // Fixed ACPI Description Table Fixed Feature Flags // All other bits are reserved and must be set to 0. // #define EFI_ACPI_1_0_WBINVD BIT0 #define EFI_ACPI_1_0_WBINVD_FLUSH BIT1 #define EFI_ACPI_1_0_PROC_C1 BIT2 #define EFI_ACPI_1_0_P_LVL2_UP BIT3 #define EFI_ACPI_1_0_PWR_BUTTON BIT4 #define EFI_ACPI_1_0_SLP_BUTTON BIT5 #define EFI_ACPI_1_0_FIX_RTC BIT6 #define EFI_ACPI_1_0_RTC_S4 BIT7 #define EFI_ACPI_1_0_TMR_VAL_EXT BIT8 #define EFI_ACPI_1_0_DCK_CAP BIT9 /// /// Firmware ACPI Control Structure. /// typedef struct { UINT32 Signature; UINT32 Length; UINT32 HardwareSignature; UINT32 FirmwareWakingVector; UINT32 GlobalLock; UINT32 Flags; UINT8 Reserved[40]; } EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE; /// /// Firmware Control Structure Feature Flags. /// All other bits are reserved and must be set to 0. /// #define EFI_ACPI_1_0_S4BIOS_F BIT0 /// /// Multiple APIC Description Table header definition. The rest of the table /// must be defined in a platform-specific manner. /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 LocalApicAddress; UINT32 Flags; } EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER; /// /// MADT Revision (as defined in ACPI 1.0b specification). /// #define EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION 0x01 /// /// Multiple APIC Flags /// All other bits are reserved and must be set to 0. /// #define EFI_ACPI_1_0_PCAT_COMPAT BIT0 // // Multiple APIC Description Table APIC structure types // All other values between 0x05 an 0xFF are reserved and // will be ignored by OSPM. // #define EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC 0x00 #define EFI_ACPI_1_0_IO_APIC 0x01 #define EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE 0x02 #define EFI_ACPI_1_0_NON_MASKABLE_INTERRUPT_SOURCE 0x03 #define EFI_ACPI_1_0_LOCAL_APIC_NMI 0x04 // // APIC Structure Definitions // /// /// Processor Local APIC Structure Definition. /// typedef struct { UINT8 Type; UINT8 Length; UINT8 AcpiProcessorId; UINT8 ApicId; UINT32 Flags; } EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE; /// /// Local APIC Flags. All other bits are reserved and must be 0. /// #define EFI_ACPI_1_0_LOCAL_APIC_ENABLED BIT0 /// /// IO APIC Structure. /// typedef struct { UINT8 Type; UINT8 Length; UINT8 IoApicId; UINT8 Reserved; UINT32 IoApicAddress; UINT32 SystemVectorBase; } EFI_ACPI_1_0_IO_APIC_STRUCTURE; /// /// Interrupt Source Override Structure. /// typedef struct { UINT8 Type; UINT8 Length; UINT8 Bus; UINT8 Source; UINT32 GlobalSystemInterruptVector; UINT16 Flags; } EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE; /// /// Non-Maskable Interrupt Source Structure. /// typedef struct { UINT8 Type; UINT8 Length; UINT16 Flags; UINT32 GlobalSystemInterruptVector; } EFI_ACPI_1_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE; /// /// Local APIC NMI Structure. /// typedef struct { UINT8 Type; UINT8 Length; UINT8 AcpiProcessorId; UINT16 Flags; UINT8 LocalApicInti; } EFI_ACPI_1_0_LOCAL_APIC_NMI_STRUCTURE; /// /// Smart Battery Description Table (SBST) /// typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; UINT32 WarningEnergyLevel; UINT32 LowEnergyLevel; UINT32 CriticalEnergyLevel; } EFI_ACPI_1_0_SMART_BATTERY_DESCRIPTION_TABLE; // // Known table signatures // /// /// "RSD PTR " Root System Description Pointer. /// #define EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE SIGNATURE_64('R', 'S', 'D', ' ', 'P', 'T', 'R', ' ') /// /// "APIC" Multiple APIC Description Table. /// #define EFI_ACPI_1_0_APIC_SIGNATURE SIGNATURE_32('A', 'P', 'I', 'C') /// /// "DSDT" Differentiated System Description Table. /// #define EFI_ACPI_1_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('D', 'S', 'D', 'T') /// /// "FACS" Firmware ACPI Control Structure. /// #define EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE SIGNATURE_32('F', 'A', 'C', 'S') /// /// "FACP" Fixed ACPI Description Table. /// #define EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('F', 'A', 'C', 'P') /// /// "PSDT" Persistent System Description Table. /// #define EFI_ACPI_1_0_PERSISTENT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('P', 'S', 'D', 'T') /// /// "RSDT" Root System Description Table. /// #define EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('R', 'S', 'D', 'T') /// /// "SBST" Smart Battery Specification Table. /// #define EFI_ACPI_1_0_SMART_BATTERY_SPECIFICATION_TABLE_SIGNATURE SIGNATURE_32('S', 'B', 'S', 'T') /// /// "SSDT" Secondary System Description Table. /// #define EFI_ACPI_1_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('S', 'S', 'D', 'T') #pragma pack() #endif