]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
x86: acpi: Allow the SSDT to be empty
authorSimon Glass <sjg@chromium.org>
Wed, 4 Nov 2020 16:57:31 +0000 (09:57 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Fri, 6 Nov 2020 01:51:30 +0000 (09:51 +0800)
If there is nothing in the SSDT we should not include it in the tables.
Update the implementation to check this.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/lib/acpi_table.c

index f0f342d89358ce176c35e35f64c2af6a4634d056..c5c5c6e67944042ea14844f3337358d9ad91c96d 100644 (file)
@@ -470,8 +470,9 @@ 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)
+static int 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));
 
@@ -484,9 +485,19 @@ void acpi_create_ssdt(struct acpi_ctx *ctx, struct acpi_table_header *ssdt,
 
        acpi_fill_ssdt(ctx);
 
-       /* (Re)calculate length and checksum. */
+       /* (Re)calculate length and checksum */
        ssdt->length = ctx->current - (void *)ssdt;
        ssdt->checksum = table_compute_checksum((void *)ssdt, ssdt->length);
+       log_debug("SSDT at %p, length %x\n", ssdt, ssdt->length);
+
+       /* Drop the table if it is empty */
+       if (ssdt->length == sizeof(struct acpi_table_header)) {
+               ctx->current = ssdt;
+               return -ENOENT;
+       }
+       acpi_align(ctx);
+
+       return 0;
 }
 
 /*
@@ -596,11 +607,8 @@ ulong write_acpi_tables(ulong start_addr)
 
        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);
+       if (!acpi_create_ssdt(ctx, ssdt, OEM_TABLE_ID))
                acpi_add_table(ctx, ssdt);
-       }
 
        debug("ACPI:    * MCFG\n");
        mcfg = ctx->current;