char oem_id[6]; /* OEM identification */
char oem_table_id[8]; /* OEM table identification */
u32 oem_revision; /* OEM revision number */
- char aslc_id[4]; /* ASL compiler vendor ID */
- u32 aslc_revision; /* ASL compiler revision number */
+ char creator_id[4]; /* ASL compiler vendor ID */
+ u32 creator_revision; /* ASL compiler revision number */
};
+/**
+ * struct acpi_gen_regaddr - generic address structure (GAS)
+ */
struct acpi_gen_regaddr {
- u8 space_id; /* Address space ID */
- u8 bit_width; /* Register size in bits */
- u8 bit_offset; /* Register bit offset */
- u8 access_size; /* Access size */
- u32 addrl; /* Register address, low 32 bits */
- u32 addrh; /* Register address, high 32 bits */
+ /**
+ * @space_id: address space ID
+ *
+ * See table "Operation Region Address Space Identifiers" in the ACPI
+ * specification.
+ */
+ u8 space_id;
+ /** @bit_width: size in bits of the register */
+ u8 bit_width;
+ /** @bit_offset: bit offset of the register */
+ u8 bit_offset;
+ /**
+ * @access_size: access size
+ *
+ * * 0 - undefined
+ * * 1 - byte access
+ * * 2 - word (2 bytes) access
+ * * 3 - Dword (4 bytes) access
+ * * 4 - Qword (8 bytes) access
+ *
+ * See ACPI_ACCESS_SIZE_*_ACCESS macros.
+ */
+ u8 access_size;
+ /** @addrl: register address, low 32 bits */
+ u32 addrl;
+ /** @addrh: register address, high 32 bits */
+ u32 addrh;
};
/* A maximum number of 32 ACPI tables ought to be enough for now */
};
/* XSDT (Extended System Description Table) */
-struct acpi_xsdt {
+struct __packed acpi_xsdt {
struct acpi_table_header header;
u64 entry[MAX_ACPI_TABLES];
};
-/* HPET timers */
-struct __packed acpi_hpet {
+/**
+ * struct acpi_hpet: High Precision Event Timers (HETP)
+ *
+ * The structure is defined in the
+ * "IA-PC HPET (High Precision Event Timers) Specification", rev 1.0a, Oct 2004
+ */
+struct acpi_hpet {
+ /** @header: table header */
struct acpi_table_header header;
+ /** @id hardware ID of Event Timer Block */
u32 id;
+ /** @addr: address of Event Timer Block */
struct acpi_gen_regaddr addr;
+ /** @number: HPET sequence number */
u8 number;
+ /** @min_tick: minimum clock ticks without lost interrupts */
u16 min_tick;
+ /** @attributes: page protection and OEM atttribute */
u8 attributes;
-};
+} __packed;
struct __packed acpi_tpm2 {
struct acpi_table_header header;
#define ACPI_FADT_HW_REDUCED_ACPI BIT(20)
#define ACPI_FADT_LOW_PWR_IDLE_S0 BIT(21)
+/* ARM boot flags */
+#define ACPI_ARM_PSCI_COMPLIANT BIT(0)
+
enum acpi_address_space_type {
ACPI_ADDRESS_SPACE_MEMORY = 0, /* System memory */
ACPI_ADDRESS_SPACE_IO, /* System I/O */
u8 reset_value;
u16 arm_boot_arch;
u8 minor_revision;
- u32 x_firmware_ctl_l;
- u32 x_firmware_ctl_h;
- u32 x_dsdt_l;
- u32 x_dsdt_h;
+ u64 x_firmware_ctrl;
+ u64 x_dsdt;
struct acpi_gen_regaddr x_pm1a_evt_blk;
struct acpi_gen_regaddr x_pm1b_evt_blk;
struct acpi_gen_regaddr x_pm1a_cnt_blk;
struct acpi_gen_regaddr x_pm_tmr_blk;
struct acpi_gen_regaddr x_gpe0_blk;
struct acpi_gen_regaddr x_gpe1_blk;
+ struct acpi_gen_regaddr sleep_control_reg;
+ struct acpi_gen_regaddr sleep_status_reg;
+ u64 hyp_vendor_id;
};
/* FADT TABLE Revision values - note these do not match the ACPI revision */
ACPI_APIC_PLATFORM_IRQ_SRC, /* Platform interrupt sources */
ACPI_APIC_LX2APIC, /* Processor local x2APIC */
ACPI_APIC_LX2APIC_NMI, /* Local x2APIC NMI */
+ ACPI_APIC_GICC, /* Generic Interrupt Ctlr CPU i/f */
+ ACPI_APIC_GICD /* Generic Interrupt Ctlr Distributor */
};
/* MADT: Processor Local APIC Structure */
u8 lint; /* Local APIC LINT# */
};
+/* flags for acpi_madr_gicc flags word */
+enum {
+ ACPI_MADRF_ENABLED = BIT(0),
+ ACPI_MADRF_PERF = BIT(1),
+ ACPI_MADRF_VGIC = BIT(2),
+};
+
+/**
+ * struct __packed acpi_madr_gicc - GIC CPU interface (type 0xb)
+ *
+ * This holds information about the Generic Interrupt Controller (GIC) CPU
+ * interface. See ACPI Spec v6.3 section 5.2.12.14
+ */
+struct acpi_madr_gicc {
+ u8 type;
+ u8 length;
+ u16 reserved;
+ u32 cpu_if_num;
+ u32 processor_id;
+ u32 flags;
+ u32 parking_proto;
+ u32 perf_gsiv;
+ u64 parked_addr;
+ u64 phys_base;
+ u64 gicv;
+ u64 gich;
+ u32 vgic_maint_irq;
+ u64 gicr_base;
+ u64 mpidr;
+ u8 efficiency;
+ u8 reserved2;
+ u16 spi_overflow_irq;
+} __packed;
+
+/**
+ * struct __packed acpi_madr_gicc - GIC distributor (type 0xc)
+ *
+ * This holds information about the Generic Interrupt Controller (GIC)
+ * Distributor interface. See ACPI Spec v6.3 section 5.2.12.15
+ */
+struct acpi_madr_gicd {
+ u8 type;
+ u8 length;
+ u16 reserved;
+ u32 gic_id;
+ u64 phys_base;
+ u32 reserved2;
+ u8 gic_version;
+ u8 reserved3[3];
+} __packed;
+
/* MCFG (PCI Express MMIO config space BAR description table) */
struct acpi_mcfg {
struct acpi_table_header header;
struct acpi_table_header header;
};
+/**
+ * struct acpi_csrt_group - header for a group within the CSRT
+ *
+ * The CSRT consists of one or more groups and this is the header for each
+ *
+ * See Core System Resources Table (CSRT), March 13, 2017, Microsoft Corporation
+ * for details
+ *
+ * https://uefi.org/sites/default/files/resources/CSRT%20v2.pdf
+ *
+ * @shared_info_length indicates the number of shared-info bytes following this
+ * struct (which may be 0)
+ */
struct acpi_csrt_group {
u32 length;
u32 vendor_id;
u32 shared_info_length;
};
+/**
+ * struct acpi_csrt_descriptor - describes the information that follows
+ *
+ * See the spec as above for details
+ */
+struct acpi_csrt_descriptor {
+ u32 length;
+ u16 type;
+ u16 subtype;
+ u32 uid;
+};
+
+/**
+ * struct acpi_csrt_shared_info - shared info for Intel tangier
+ *
+ * This provides the shared info for this particular board. Notes that the CSRT
+ * does not describe the format of data, so this format may not be used by any
+ * other board.
+ */
struct acpi_csrt_shared_info {
u16 major_version;
u16 minor_version;
u32 reserved2;
};
+/**
+ * struct acpi_gtdt - Generic Timer Description Table (GTDT)
+ *
+ * See ACPI Spec v6.3 section 5.2.24 for details
+ */
+struct acpi_gtdt {
+ struct acpi_table_header header;
+ u64 cnt_ctrl_base;
+ u32 reserved0;
+ u32 sec_el1_gsiv;
+ u32 sec_el1_flags;
+ u32 el1_gsiv;
+ u32 el1_flags;
+ u32 virt_el1_gsiv;
+ u32 virt_el1_flags;
+ u32 el2_gsiv;
+ u32 el2_flags;
+ u64 cnt_read_base;
+ u32 plat_timer_count;
+ u32 plat_timer_offset;
+ u32 virt_el2_gsiv;
+ u32 virt_el2_flags;
+} __packed;
+
+/**
+ * struct acpi_bgrt - Boot Graphics Resource Table (BGRT)
+ *
+ * Optional table that provides a mechanism to indicate that an image was drawn
+ * on the screen during boot, and some information about the image.
+ *
+ * See ACPI Spec v6.3 section 5.2.22 for details
+ */
+struct acpi_bgrt {
+ struct acpi_table_header header;
+ u16 version;
+ u8 status;
+ u8 image_type;
+ u64 addr;
+ u32 offset_x;
+ u32 offset_y;
+} __packed;
+
+/* Types for PPTT */
+#define ACPI_PPTT_TYPE_PROC 0
+#define ACPI_PPTT_TYPE_CACHE 1
+
+/* Flags for PPTT */
+#define ACPI_PPTT_PHYSICAL_PACKAGE BIT(0)
+#define ACPI_PPTT_PROC_ID_VALID BIT(1)
+#define ACPI_PPTT_PROC_IS_THREAD BIT(2)
+#define ACPI_PPTT_NODE_IS_LEAF BIT(3)
+#define ACPI_PPTT_CHILDREN_IDENTICAL BIT(4)
+
+/**
+ * struct acpi_pptt_header - Processor Properties Topology Table (PPTT) header
+ *
+ * Describes the topological structure of processors and their shared resources,
+ * such as caches.
+ *
+ * See ACPI Spec v6.3 section 5.2.29 for details
+ */
+struct acpi_pptt_header {
+ u8 type; /* ACPI_PPTT_TYPE_... */
+ u8 length;
+ u16 reserved;
+} __packed;
+
+/**
+ * struct acpi_pptt_proc - a processor as described by PPTT
+ */
+struct acpi_pptt_proc {
+ struct acpi_pptt_header hdr;
+ u32 flags;
+ u32 parent;
+ u32 proc_id;
+ u32 num_resources;
+} __packed;
+
+/* Cache flags for acpi_pptt_cache */
+#define ACPI_PPTT_SIZE_VALID BIT(0)
+#define ACPI_PPTT_SETS_VALID BIT(1)
+#define ACPI_PPTT_ASSOC_VALID BIT(2)
+#define ACPI_PPTT_ALLOC_TYPE_VALID BIT(3)
+#define ACPI_PPTT_CACHE_TYPE_VALID BIT(4)
+#define ACPI_PPTT_WRITE_POLICY_VALID BIT(5)
+#define ACPI_PPTT_LINE_SIZE_VALID BIT(6)
+
+#define ACPI_PPTT_ALL_VALID 0x7f
+#define ACPI_PPTT_ALL_BUT_WRITE_POL 0x5f
+
+#define ACPI_PPTT_READ_ALLOC BIT(0)
+#define ACPI_PPTT_WRITE_ALLOC BIT(1)
+#define ACPI_PPTT_CACHE_TYPE_SHIFT 2
+#define ACPI_PPTT_CACHE_TYPE_MASK (3 << ACPI_PPTT_CACHE_TYPE_SHIFT)
+#define ACPI_PPTT_CACHE_TYPE_DATA 0
+#define ACPI_PPTT_CACHE_TYPE_INSTR 1
+#define ACPI_PPTT_CACHE_TYPE_UNIFIED 2
+#define ACPI_PPTT_CACHE_TYPE_DATA 0
+#define ACPI_PPTT_WRITE_THROUGH BIT(4)
+
+/**
+ * struct acpi_pptt_cache - a cache as described by PPTT
+ */
+struct acpi_pptt_cache {
+ struct acpi_pptt_header hdr;
+ u32 flags;
+ u32 next_cache_level;
+ u32 size;
+ u32 sets;
+ u8 assoc;
+ u8 attributes;
+ u16 line_size;
+} __packed;
+
/* Tables defined/reserved by ACPI and generated by U-Boot */
enum acpi_tables {
ACPITAB_BERT,
struct acpi_gen_regaddr *address, uint32_t address_size,
const char *device_path);
-/**
- * acpi_fill_header() - Set up a new table header
- *
- * This sets all fields except length, revision, checksum and aslc_revision
- *
- * @header: ACPI header to update
- * @signature: Table signature to use (4 characters)
- */
-void acpi_fill_header(struct acpi_table_header *header, char *signature);
-
/**
* acpi_align() - Align the ACPI output pointer to a 16-byte boundary
*
*/
int acpi_add_table(struct acpi_ctx *ctx, void *table);
-/**
- * acpi_setup_base_tables() - Set up context along with RSDP, RSDT and XSDT
- *
- * Set up the context with the given start position. Some basic tables are
- * always needed, so set them up as well.
- *
- * @ctx: Context to set up
- */
-void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start);
+static inline int acpi_add_fadt(struct acpi_ctx *ctx, struct acpi_fadt *fadt)
+{
+ acpi_add_table(ctx, fadt);
+ acpi_inc(ctx, sizeof(struct acpi_fadt));
+ return 0;
+}
/**
* acpi_write_rsdp() - Write out an RSDP indicating where the ACPI tables are
void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
struct acpi_xsdt *xsdt);
+/**
+ * acpi_fill_header() - Set up a table header
+ *
+ * @header: Pointer to header to set up
+ * @signature: 4-character signature to use (e.g. "FACS")
+ */
+void acpi_fill_header(struct acpi_table_header *header, char *signature);
+
+/**
+ * acpi_fill_csrt() - Fill out the body of the CSRT
+ *
+ * This should write the contents of the Core System Resource Table (CSRT)
+ * to the context. The header (struct acpi_table_header) has already been
+ * written.
+ *
+ * @ctx: ACPI context to write to
+ * @return 0 if OK, -ve on error
+ */
+int acpi_fill_csrt(struct acpi_ctx *ctx);
+
+/**
+ * acpi_get_rsdp_addr() - get ACPI RSDP table address
+ *
+ * This routine returns the ACPI RSDP table address in the system memory.
+ *
+ * @return: ACPI RSDP table address
+ */
+ulong acpi_get_rsdp_addr(void);
+
+/**
+ * write_acpi_tables() - Write out the ACPI tables
+ *
+ * This writes all ACPI tables to the given address
+ *
+ * @start: Start address for the tables
+ * @return address of end of tables, where the next tables can be written
+ */
+ulong write_acpi_tables(ulong start);
+
+/**
+ * acpi_find_table() - Look up an ACPI table
+ *
+ * @sig: Signature of table (4 characters, upper case)
+ * Return: pointer to table header, or NULL if not found
+ */
+struct acpi_table_header *acpi_find_table(const char *sig);
+
#endif /* !__ACPI__*/
#include <asm/acpi_table.h>