Hi Simon, -----"Simon Glass" <s...@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 <s...@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