x86: acpi: Various changes to acpi_table.h
authorBin Meng <bmeng.cn@gmail.com>
Sat, 7 May 2016 14:46:21 +0000 (07:46 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 23 May 2016 07:18:00 +0000 (15:18 +0800)
- Use "U-BOOT" and "U-BOOTBL" for the OEM ID and OEM table ID.
- Do not typedef acpi_header_t, instead use struct acpi_table_hader.
- Use a shorter name aslc_id and aslc-revision.
- Change MCFG base address to use 32-bit value pairs (_l and _h).
- Apply ACPI_APIC_ prefix to MADT APIC type macros and make
  their names to be more readable.
- Apply __packed to struct acpi_madt_irqoverride and struct
  acpi_madt_lapic_nmi tables, as they are not naturally aligned
  by the compiler which leads to wrong sizeof(struct).
- Rename model to res1 as it is reserved after ACPI spec 1.0.
- Apply ACPI_ prefix to the PM profile macros and change them
  to enum.
- Add ospm_flags to FACS structure which is defined since ACPI 4.0.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Tested-by: Stefan Roese <sr@denx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/x86/include/asm/acpi_table.h
arch/x86/lib/acpi_table.c

index e82752aa85daa33b6ccc64c5a8bcb9498311cd0b..418870e3b474023993ee3b1d8fc7e82fd86e8a46 100644 (file)
@@ -6,10 +6,10 @@
  * SPDX-License-Identifier: GPL-2.0+
  */
 
-#define RSDP_SIG               "RSD PTR "      /* RSDT pointer signature */
-#define ACPI_TABLE_CREATOR     "UBOOT   "      /* Must be 8 bytes long! */
-#define OEM_ID                 "UBOOT "        /* Must be 6 bytes long! */
-#define ASLC                   "INTL"          /* Must be 4 bytes long! */
+#define RSDP_SIG               "RSD PTR "      /* RSDP pointer signature */
+#define OEM_ID                 "U-BOOT"        /* U-Boot */
+#define OEM_TABLE_ID           "U-BOOTBL"      /* U-Boot Table */
+#define ASLC_ID                        "INTL"          /* Intel ASL Compiler */
 
 #define OEM_REVISION   42
 #define ASL_COMPILER_REVISION  42
@@ -74,7 +74,7 @@ enum acpi_address_space_size {
 };
 
 /* Generic ACPI header, provided by (almost) all tables */
-typedef struct acpi_table_header {
+struct acpi_table_header {
        char signature[4];      /* ACPI signature (4 ASCII characters) */
        u32 length;             /* Table length in bytes (incl. header) */
        u8 revision;            /* Table version (not ACPI version!) */
@@ -82,9 +82,9 @@ typedef struct acpi_table_header {
        char oem_id[6];         /* OEM identification */
        char oem_table_id[8];   /* OEM table identification */
        u32 oem_revision;       /* OEM revision number */
-       char asl_compiler_id[4]; /* ASL compiler vendor ID */
-       u32 asl_compiler_revision; /* ASL compiler revision number */
-} acpi_header_t;
+       char aslc_id[4];        /* ASL compiler vendor ID */
+       u32 aslc_revision;      /* ASL compiler revision number */
+};
 
 /* A maximum number of 32 ACPI tables ought to be enough for now */
 #define MAX_ACPI_TABLES        32
@@ -108,8 +108,8 @@ struct acpi_mcfg {
 };
 
 struct acpi_mcfg_mmconfig {
-       u32 base_address;
-       u32 base_reserved;
+       u32 base_address_l;
+       u32 base_address_h;
        u16 pci_segment_group_number;
        u8 start_bus_number;
        u8 end_bus_number;
@@ -125,17 +125,17 @@ struct acpi_madt {
 
 /* MADT: APIC Structure Type*/
 enum acpi_apic_types {
-       LOCALAPIC       = 0,    /* Processor local APIC */
-       IOAPIC,                 /* I/O APIC */
-       IRQSOURCEOVERRIDE,      /* Interrupt source override */
-       NMITYPE,                /* NMI source */
-       LOCALNMITYPE,           /* Local APIC NMI */
-       LAPICADDRESSOVERRIDE,   /* Local APIC address override */
-       IOSAPIC,                /* I/O SAPIC */
-       LOCALSAPIC,             /* Local SAPIC */
-       PLATFORMIRQSOURCES,     /* Platform interrupt sources */
-       LOCALX2SAPIC,           /* Processor local x2APIC */
-       LOCALX2APICNMI,         /* Local x2APIC NMI */
+       ACPI_APIC_LAPIC = 0,            /* Processor local APIC */
+       ACPI_APIC_IOAPIC,               /* I/O APIC */
+       ACPI_APIC_IRQ_SRC_OVERRIDE,     /* Interrupt source override */
+       ACPI_APIC_NMI_SRC,              /* NMI source */
+       ACPI_APIC_LAPIC_NMI,            /* Local APIC NMI */
+       ACPI_APIC_LAPIC_ADDR_OVERRIDE,  /* Local APIC address override */
+       ACPI_APIC_IOSAPIC,              /* I/O SAPIC */
+       ACPI_APIC_LSAPIC,               /* Local SAPIC */
+       ACPI_APIC_PLATFORM_IRQ_SRC,     /* Platform interrupt sources */
+       ACPI_APIC_LX2APIC,              /* Processor local x2APIC */
+       ACPI_APIC_LX2APIC_NMI,          /* Local x2APIC NMI */
 };
 
 /* MADT: Processor Local APIC Structure */
@@ -153,7 +153,7 @@ struct acpi_madt_lapic {
 /* bits 1-31: reserved */
 
 /* MADT: Local APIC NMI Structure */
-struct acpi_madt_lapic_nmi {
+struct __packed acpi_madt_lapic_nmi {
        u8 type;                /* Type (4) */
        u8 length;              /* Length in bytes (6) */
        u8 processor_id;        /* ACPI processor ID */
@@ -172,7 +172,7 @@ struct acpi_madt_ioapic {
 };
 
 /* MADT: Interrupt Source Override Structure */
-struct acpi_madt_irqoverride {
+struct __packed acpi_madt_irqoverride {
        u8 type;                /* Type (2) */
        u8 length;              /* Length in bytes (10) */
        u8 bus;                 /* ISA (0) */
@@ -186,7 +186,7 @@ struct __packed acpi_fadt {
        struct acpi_table_header header;
        u32 firmware_ctrl;
        u32 dsdt;
-       u8 model;
+       u8 res1;
        u8 preferred_pm_profile;
        u16 sci_int;
        u32 smi_cmd;
@@ -281,15 +281,17 @@ struct __packed acpi_fadt {
 #define ACPI_FADT_LEGACY_FREE          0x00
 
 /* FADT Preferred Power Management Profile */
-#define PM_UNSPECIFIED         0
-#define PM_DESKTOP             1
-#define PM_MOBILE              2
-#define PM_WORKSTATION         3
-#define PM_ENTERPRISE_SERVER   4
-#define PM_SOHO_SERVER         5
-#define PM_APPLIANCE_PC                6
-#define PM_PERFORMANCE_SERVER  7
-#define PM_TABLET              8       /* ACPI 5.0 */
+enum acpi_pm_profile {
+       ACPI_PM_UNSPECIFIED = 0,
+       ACPI_PM_DESKTOP,
+       ACPI_PM_MOBILE,
+       ACPI_PM_WORKSTATION,
+       ACPI_PM_ENTERPRISE_SERVER,
+       ACPI_PM_SOHO_SERVER,
+       ACPI_PM_APPLIANCE_PC,
+       ACPI_PM_PERFORMANCE_SERVER,
+       ACPI_PM_TABLET
+};
 
 /* FACS (Firmware ACPI Control Structure) */
 struct acpi_facs {
@@ -302,7 +304,9 @@ struct acpi_facs {
        u32 x_firmware_waking_vector_l;         /* X FW waking vector, low */
        u32 x_firmware_waking_vector_h;         /* X FW waking vector, high */
        u8 version;                             /* ACPI 4.0: 2 */
-       u8 resv[31];                            /* FIXME: 4.0: ospm_flags */
+       u8 res1[3];
+       u32 ospm_flags;                         /* OSPM enabled flags */
+       u8 res2[24];
 };
 
 /* FACS flags */
index 9873cb3d800fdfcc7bd4866cdc567216a77a9970..7ade5c9d38e982104b09f58218ebe4c659e8b862 100644 (file)
@@ -58,7 +58,8 @@ static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
        rsdt->entry[i] = (u32)table;
 
        /* Fix RSDT length or the kernel will assume invalid entries */
-       rsdt->header.length = sizeof(acpi_header_t) + (sizeof(u32) * (i + 1));
+       rsdt->header.length = sizeof(struct acpi_table_header) +
+                             (sizeof(u32) * (i + 1));
 
        /* Re-calculate checksum */
        rsdt->header.checksum = 0;
@@ -74,7 +75,7 @@ static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
                xsdt->entry[i] = (u64)(u32)table;
 
                /* Fix XSDT length */
-               xsdt->header.length = sizeof(acpi_header_t) +
+               xsdt->header.length = sizeof(struct acpi_table_header) +
                         (sizeof(u64) * (i + 1));
 
                /* Re-calculate checksum */
@@ -87,7 +88,7 @@ static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
 static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic,
                         u8 cpu, u8 apic)
 {
-       lapic->type = LOCALAPIC; /* Local APIC structure */
+       lapic->type = ACPI_APIC_LAPIC; /* Local APIC structure */
        lapic->length = sizeof(struct acpi_madt_lapic);
        lapic->flags = LOCAL_APIC_FLAG_ENABLED; /* Processor/LAPIC enabled */
        lapic->processor_id = cpu;
@@ -115,7 +116,7 @@ unsigned long acpi_create_madt_lapics(unsigned long current)
 int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
                         u32 gsi_base)
 {
-       ioapic->type = IOAPIC;
+       ioapic->type = ACPI_APIC_IOAPIC;
        ioapic->length = sizeof(struct acpi_madt_ioapic);
        ioapic->reserved = 0x00;
        ioapic->gsi_base = gsi_base;
@@ -128,7 +129,7 @@ int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id, u32 addr,
 int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
                         u8 bus, u8 source, u32 gsirq, u16 flags)
 {
-       irqoverride->type = IRQSOURCEOVERRIDE;
+       irqoverride->type = ACPI_APIC_IRQ_SRC_OVERRIDE;
        irqoverride->length = sizeof(struct acpi_madt_irqoverride);
        irqoverride->bus = bus;
        irqoverride->source = source;
@@ -141,7 +142,7 @@ int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
 int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
                         u8 cpu, u16 flags, u8 lint)
 {
-       lapic_nmi->type = LOCALNMITYPE;
+       lapic_nmi->type = ACPI_APIC_LAPIC_NMI;
        lapic_nmi->length = sizeof(struct acpi_madt_lapic_nmi);
        lapic_nmi->flags = flags;
        lapic_nmi->processor_id = cpu;
@@ -150,17 +151,18 @@ int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
        return lapic_nmi->length;
 }
 
-static void fill_header(acpi_header_t *header, char *signature, int length)
+static void fill_header(struct acpi_table_header *header, char *signature,
+                       int length)
 {
        memcpy(header->signature, signature, length);
        memcpy(header->oem_id, OEM_ID, 6);
-       memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);
-       memcpy(header->asl_compiler_id, ASLC, 4);
+       memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
+       memcpy(header->aslc_id, ASLC_ID, 4);
 }
 
 static void acpi_create_madt(struct acpi_madt *madt)
 {
-       acpi_header_t *header = &(madt->header);
+       struct acpi_table_header *header = &(madt->header);
        unsigned long current = (unsigned long)madt + sizeof(struct acpi_madt);
 
        memset((void *)madt, 0, sizeof(struct acpi_madt));
@@ -173,7 +175,7 @@ static void acpi_create_madt(struct acpi_madt *madt)
        header->revision = ACPI_REV_ACPI_2_0;
 
        madt->lapic_addr = LAPIC_DEFAULT_BASE;
-       madt->flags = PCAT_COMPAT;
+       madt->flags = ACPI_MADT_PCAT_COMPAT;
 
        current = acpi_fill_madt(current);
 
@@ -187,8 +189,8 @@ static int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig,
                         u32 base, u16 seg_nr, u8 start, u8 end)
 {
        memset(mmconfig, 0, sizeof(*mmconfig));
-       mmconfig->base_address = base;
-       mmconfig->base_reserved = 0;
+       mmconfig->base_address_l = base;
+       mmconfig->base_address_h = 0;
        mmconfig->pci_segment_group_number = seg_nr;
        mmconfig->start_bus_number = start;
        mmconfig->end_bus_number = end;
@@ -208,7 +210,7 @@ static unsigned long acpi_fill_mcfg(unsigned long current)
 /* MCFG is defined in the PCI Firmware Specification 3.0 */
 static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
 {
-       acpi_header_t *header = &(mcfg->header);
+       struct acpi_table_header *header = &(mcfg->header);
        unsigned long current = (unsigned long)mcfg + sizeof(struct acpi_mcfg);
 
        memset((void *)mcfg, 0, sizeof(struct acpi_mcfg));
@@ -244,7 +246,7 @@ static void acpi_create_facs(struct acpi_facs *facs)
 
 static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
 {
-       acpi_header_t *header = &(rsdt->header);
+       struct acpi_table_header *header = &(rsdt->header);
 
        /* Fill out header fields */
        fill_header(header, "RSDT", 4);
@@ -262,7 +264,7 @@ static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
 
 static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
 {
-       acpi_header_t *header = &(xsdt->header);
+       struct acpi_table_header *header = &(xsdt->header);
 
        /* Fill out header fields */
        fill_header(header, "XSDT", 4);
@@ -309,12 +311,13 @@ static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
                        sizeof(struct acpi_rsdp));
 }
 
-static void acpi_create_ssdt_generator(acpi_header_t *ssdt,
+static void acpi_create_ssdt_generator(struct acpi_table_header *ssdt,
                         const char *oem_table_id)
 {
-       unsigned long current = (unsigned long)ssdt + sizeof(acpi_header_t);
+       unsigned long current = (unsigned long)ssdt +
+                               sizeof(struct acpi_table_header);
 
-       memset((void *)ssdt, 0, sizeof(acpi_header_t));
+       memset((void *)ssdt, 0, sizeof(struct acpi_table_header));
 
        memcpy(&ssdt->signature, "SSDT", 4);
        /* Access size in ACPI 2.0c/3.0/4.0/5.0 */
@@ -322,9 +325,9 @@ static void acpi_create_ssdt_generator(acpi_header_t *ssdt,
        memcpy(&ssdt->oem_id, OEM_ID, 6);
        memcpy(&ssdt->oem_table_id, oem_table_id, 8);
        ssdt->oem_revision = OEM_REVISION;
-       memcpy(&ssdt->asl_compiler_id, ASLC, 4);
-       ssdt->asl_compiler_revision = ASL_COMPILER_REVISION;
-       ssdt->length = sizeof(acpi_header_t);
+       memcpy(&ssdt->aslc_id, ASLC_ID, 4);
+       ssdt->aslc_revision = ASL_COMPILER_REVISION;
+       ssdt->length = sizeof(struct acpi_table_header);
 
        /* (Re)calculate length and checksum */
        ssdt->length = current - (unsigned long)ssdt;
@@ -342,11 +345,11 @@ u32 write_acpi_tables(u32 start)
        struct acpi_rsdt *rsdt;
        struct acpi_xsdt *xsdt;
        struct acpi_facs *facs;
-       acpi_header_t *dsdt;
+       struct acpi_table_header *dsdt;
        struct acpi_fadt *fadt;
        struct acpi_mcfg *mcfg;
        struct acpi_madt *madt;
-       acpi_header_t *ssdt;
+       struct acpi_table_header *ssdt;
 
        current = start;
 
@@ -381,14 +384,14 @@ u32 write_acpi_tables(u32 start)
        acpi_create_facs(facs);
 
        debug("ACPI:    * DSDT\n");
-       dsdt = (acpi_header_t *)current;
-       memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
-       if (dsdt->length >= sizeof(acpi_header_t)) {
-               current += sizeof(acpi_header_t);
+       dsdt = (struct acpi_table_header *)current;
+       memcpy(dsdt, &AmlCode, sizeof(struct acpi_table_header));
+       if (dsdt->length >= sizeof(struct acpi_table_header)) {
+               current += sizeof(struct acpi_table_header);
                memcpy((char *)current,
-                               (char *)&AmlCode + sizeof(acpi_header_t),
-                               dsdt->length - sizeof(acpi_header_t));
-               current += dsdt->length - sizeof(acpi_header_t);
+                       (char *)&AmlCode + sizeof(struct acpi_table_header),
+                       dsdt->length - sizeof(struct acpi_table_header));
+               current += dsdt->length - sizeof(struct acpi_table_header);
 
                /* (Re)calculate length and checksum */
                dsdt->length = current - (unsigned long)dsdt;
@@ -424,9 +427,9 @@ u32 write_acpi_tables(u32 start)
        current = ALIGN(current, 16);
 
        debug("ACPI:    * SSDT\n");
-       ssdt = (acpi_header_t *)current;
-       acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);
-       if (ssdt->length > sizeof(acpi_header_t)) {
+       ssdt = (struct acpi_table_header *)current;
+       acpi_create_ssdt_generator(ssdt, OEM_TABLE_ID);
+       if (ssdt->length > sizeof(struct acpi_table_header)) {
                current += ssdt->length;
                acpi_add_table(rsdp, ssdt);
                current = ALIGN(current, 16);