[PATCH v2 30/35] x86: Allow devices to write an SSDT

Wolfgang Wallner wolfgang.wallner at br-automation.com
Thu Jun 4 14:20:13 CEST 2020


Hi Simon,

-----"Simon Glass" <sjg at 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 at 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



More information about the U-Boot mailing list