
Hi Simon,
-----"Simon Glass" sjg@chromium.org schrieb: -----
Betreff: [PATCH v2 30/35] x86: Allow devices to write an SSDT
Call the new core function to write the SSDT. This is made up of fragments generated by devices that have the fill_ssdt() method.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v2: None Changes in v1:
- Use OEM_TABLE_ID instead of ACPI_TABLE_CREATOR
- Update ACPI_DSTATUS enum
- Drop writing of coreboot tables
arch/x86/lib/acpi_table.c | 29 +++++++++++++++++++++++++++++ include/acpi/acpi_table.h | 6 ++++++ 2 files changed, 35 insertions(+)
diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c index e96acf08d4..4658d88351 100644 --- a/arch/x86/lib/acpi_table.c +++ b/arch/x86/lib/acpi_table.c @@ -14,6 +14,7 @@ #include <mapmem.h> #include <serial.h> #include <version.h> +#include <acpi/acpigen.h> #include <acpi/acpi_table.h> #include <asm/acpi/global_nvs.h> #include <asm/ioapic.h> @@ -354,6 +355,25 @@ static void acpi_create_spcr(struct acpi_spcr *spcr) header->checksum = table_compute_checksum((void *)spcr, header->length); }
+void acpi_create_ssdt(struct acpi_ctx *ctx, struct acpi_table_header *ssdt,
const char *oem_table_id)
+{
- memset((void *)ssdt, '\0', sizeof(struct acpi_table_header));
- acpi_fill_header(ssdt, "SSDT");
- ssdt->revision = acpi_get_table_revision(ACPITAB_SSDT);
- ssdt->aslc_revision = 1;
- ssdt->length = sizeof(struct acpi_table_header);
- acpi_inc(ctx, sizeof(struct acpi_table_header));
- acpi_fill_ssdt(ctx);
- /* (Re)calculate length and checksum. */
- ssdt->length = ctx->current - (void *)ssdt;
- ssdt->checksum = table_compute_checksum((void *)ssdt, ssdt->length);
+}
/*
- QEMU's version of write_acpi_tables is defined in drivers/misc/qfw.c
*/ @@ -363,6 +383,7 @@ ulong write_acpi_tables(ulong start_addr) struct acpi_facs *facs; struct acpi_table_header *dsdt; struct acpi_fadt *fadt;
- struct acpi_table_header *ssdt; struct acpi_mcfg *mcfg; struct acpi_madt *madt; struct acpi_csrt *csrt;
@@ -418,6 +439,14 @@ ulong write_acpi_tables(ulong start_addr) acpi_create_fadt(fadt, facs, dsdt); acpi_add_table(ctx, fadt);
- debug("ACPI: * SSDT\n");
- ssdt = (struct acpi_table_header *)ctx->current;
- acpi_create_ssdt(ctx, ssdt, OEM_TABLE_ID);
- if (ssdt->length > sizeof(struct acpi_table_header)) {
acpi_inc_align(ctx, ssdt->length);
acpi_add_table(ctx, ssdt);
- }
- debug("ACPI: * MCFG\n"); mcfg = ctx->current; acpi_create_mcfg(mcfg);
diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h index fe9b29f3f8..9068da24f5 100644 --- a/include/acpi/acpi_table.h +++ b/include/acpi/acpi_table.h @@ -27,6 +27,12 @@
struct acpi_ctx;
+/* List of ACPI HID that use the coreboot ACPI ID */ +enum coreboot_acpi_ids {
- COREBOOT_ACPI_ID_CBTABLE = 0x0000, /* BOOT0000 */
- COREBOOT_ACPI_ID_MAX = 0xFFFF, /* BOOTFFFF */
+};
I can't see how this new type is related to the patch? Is it here on purpose?
/*
- RSDP (Root System Description Pointer)
- Note: ACPI 1.0 didn't have length, xsdt_address, and ext_checksum
-- 2.26.2.645.ge9eca65c58-goog
regards, Wolfgang