]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - include/acpi/acpi_table.h
acpi: remove duplicate declaration of acpi_fill_header()
[thirdparty/u-boot.git] / include / acpi / acpi_table.h
index a2e510cf56e5ceb869f13e0a455a262562d27d1b..15fd61a51d7d2afae1887bd939e063bccca5850c 100644 (file)
@@ -13,7 +13,7 @@
 #ifndef __ACPI_TABLE_H__
 #define __ACPI_TABLE_H__
 
-#include <linux/bitops.h>
+#include <dm/acpi.h>
 
 #define RSDP_SIG               "RSD PTR "      /* RSDP pointer signature */
 #define OEM_ID                 "U-BOOT"        /* U-Boot */
@@ -28,6 +28,8 @@
 
 #if !defined(__ACPI__)
 
+#include <linux/bitops.h>
+
 struct acpi_ctx;
 
 /*
@@ -48,24 +50,48 @@ struct acpi_rsdp {
 
 /* Generic ACPI header, provided by (almost) all tables */
 struct __packed acpi_table_header {
-       char signature[4];      /* ACPI signature (4 ASCII characters) */
+       char signature[ACPI_NAME_LEN];  /* ACPI signature (4 ASCII chars) */
        u32 length;             /* Table length in bytes (incl. header) */
        u8 revision;            /* Table version (not ACPI version!) */
        volatile u8 checksum;   /* To make sum of entire table == 0 */
        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 */
@@ -78,19 +104,48 @@ struct acpi_rsdt {
 };
 
 /* 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;
+       u16 platform_class;
+       u8  reserved[2];
+       u64 control_area;
+       u32 start_method;
+       u8  msp[12];
+       u32 laml;
+       u64 lasa;
+};
+
+struct __packed acpi_tcpa {
+       struct acpi_table_header header;
+       u16 platform_class;
+       u32 laml;
+       u64 lasa;
 };
 
 /* FADT Preferred Power Management Profile */
@@ -142,6 +197,9 @@ enum acpi_pm_profile {
 #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 */
@@ -205,10 +263,8 @@ struct __packed acpi_fadt {
        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;
@@ -217,6 +273,9 @@ struct __packed acpi_fadt {
        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 */
@@ -245,7 +304,7 @@ struct __packed acpi_fadt {
 
 /* FACS (Firmware ACPI Control Structure) */
 struct acpi_facs {
-       char signature[4];              /* "FACS" */
+       char signature[ACPI_NAME_LEN];  /* "FACS" */
        u32 length;                     /* Length in bytes (>= 64) */
        u32 hardware_signature;         /* Hardware signature */
        u32 firmware_waking_vector;     /* Firmware waking vector */
@@ -282,6 +341,8 @@ enum acpi_apic_types {
        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 */
@@ -325,6 +386,57 @@ struct __packed acpi_madt_lapic_nmi {
        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;
@@ -351,6 +463,19 @@ struct acpi_csrt {
        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;
@@ -362,6 +487,25 @@ struct acpi_csrt_group {
        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;
@@ -539,6 +683,120 @@ struct __packed acpi_spcr {
        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,
@@ -575,7 +833,7 @@ enum acpi_tables {
  * This keeps the version-number information in one place
  *
  * @table: ACPI table to check
- * @return version number that U-Boot generates
+ * Return: version number that U-Boot generates
  */
 int acpi_get_table_revision(enum acpi_tables table);
 
@@ -584,7 +842,7 @@ int acpi_get_table_revision(enum acpi_tables table);
  *
  * @dmar: Place to put the table
  * @flags: DMAR flags to use
- * @return 0 if OK, -ve on error
+ * Return: 0 if OK, -ve on error
  */
 int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags);
 
@@ -605,16 +863,6 @@ void acpi_create_dbg2(struct acpi_dbg2_header *dbg2,
                      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
  *
@@ -654,19 +902,73 @@ void acpi_inc_align(struct acpi_ctx *ctx, uint amount);
  *
  * @ctx: ACPI context
  * @table: Table to add
- * @return 0 if OK, -E2BIG if too many tables
+ * Return: 0 if OK, -E2BIG if too many tables
  */
 int acpi_add_table(struct acpi_ctx *ctx, void *table);
 
+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
+ *
+ * @rsdp: Address to write RSDP
+ * @rsdt: Address of RSDT
+ * @xsdt: Address of XSDT
+ */
+void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
+                    struct acpi_xsdt *xsdt);
+
 /**
- * acpi_setup_base_tables() - Set up context along with RSDP, RSDT and XSDT
+ * acpi_fill_header() - Set up a table header
  *
- * Set up the context with the given start position. Some basic tables are
- * always needed, so set them up as well.
+ * @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
  *
- * @ctx: Context to set up
+ * @sig: Signature of table (4 characters, upper case)
+ * Return: pointer to table header, or NULL if not found
  */
-void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start);
+struct acpi_table_header *acpi_find_table(const char *sig);
 
 #endif /* !__ACPI__*/