From 69e61d46d2dcdcf84a3a7aed7cf74ac3b3b850fd Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 22 Mar 2025 00:21:16 +0100 Subject: [PATCH 1/5] acpi: new function acpi_update_checksum() Introduce a new function to update ACPI table headers. This allows to simplify the existing code. Signed-off-by: Heinrich Schuchardt Reviewed-by: Matthias Brugger Reviewed-by: Ilias Apalodimas --- include/acpi/acpi_table.h | 7 +++++++ lib/acpi/acpi.c | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h index b8b1f1338c6..f8e5f552ab1 100644 --- a/include/acpi/acpi_table.h +++ b/include/acpi/acpi_table.h @@ -1274,6 +1274,13 @@ ulong write_acpi_tables(ulong start); */ struct acpi_table_header *acpi_find_table(const char *sig); +/** + * acpi_update_checksum() - update ACPI table checksum + * + * @header - header of an ACPI table + */ +void acpi_update_checksum(struct acpi_table_header *header); + #endif /* !__ACPI__*/ #include diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c index f4d5c1e25d0..596301a43fe 100644 --- a/lib/acpi/acpi.c +++ b/lib/acpi/acpi.c @@ -6,11 +6,18 @@ */ #include +#include #include #include DECLARE_GLOBAL_DATA_PTR; +void acpi_update_checksum(struct acpi_table_header *header) +{ + header->checksum = 0; + header->checksum = table_compute_checksum(header, header->length); +} + struct acpi_table_header *acpi_find_table(const char *sig) { struct acpi_rsdp *rsdp; From bbc78592b16d164fbb252455d6a60afb3ee52709 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 22 Mar 2025 00:21:17 +0100 Subject: [PATCH 2/5] acpi: simplify updating header checksum Use acpi_update_checksum() for updating ACPI table header checksum. Signed-off-by: Heinrich Schuchardt Reviewed-by: Ilias Apalodimas Reviewed-by: Matthias Brugger --- lib/acpi/acpi_table.c | 18 +++++++----------- lib/acpi/base.c | 6 ++---- lib/acpi/csrt.c | 2 +- lib/acpi/mcfg.c | 2 +- lib/acpi/ssdt.c | 2 +- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c index c0ed24984af..b5495d48a46 100644 --- a/lib/acpi/acpi_table.c +++ b/lib/acpi/acpi_table.c @@ -195,9 +195,7 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table) (sizeof(u32) * (i + 1)); /* Re-calculate checksum */ - rsdt->header.checksum = 0; - rsdt->header.checksum = table_compute_checksum((u8 *)rsdt, - rsdt->header.length); + acpi_update_checksum(&rsdt->header); } if (ctx->xsdt) { @@ -228,9 +226,7 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table) (sizeof(u64) * (i + 1)); /* Re-calculate checksum */ - xsdt->header.checksum = 0; - xsdt->header.checksum = table_compute_checksum((u8 *)xsdt, - xsdt->header.length); + acpi_update_checksum(&xsdt->header); } return 0; @@ -268,7 +264,7 @@ int acpi_write_fadt(struct acpi_ctx *ctx, const struct acpi_writer *entry) acpi_fill_fadt(fadt); - header->checksum = table_compute_checksum(fadt, header->length); + acpi_update_checksum(header); return acpi_add_fadt(ctx, fadt); } @@ -303,7 +299,7 @@ int acpi_write_madt(struct acpi_ctx *ctx, const struct acpi_writer *entry) if (IS_ENABLED(CONFIG_ACPI_PARKING_PROTOCOL)) acpi_write_park(madt); - header->checksum = table_compute_checksum((void *)madt, header->length); + acpi_update_checksum(header); acpi_add_table(ctx, madt); ctx->current = (void *)madt + madt->header.length; @@ -374,7 +370,7 @@ void acpi_create_dbg2(struct acpi_dbg2_header *dbg2, /* Update structure lengths and checksum */ device->length = current - (uintptr_t)device; header->length = current - (uintptr_t)dbg2; - header->checksum = table_compute_checksum(dbg2, header->length); + acpi_update_checksum(header); } int acpi_write_dbg2_pci_uart(struct acpi_ctx *ctx, struct udevice *dev, @@ -549,7 +545,7 @@ static int acpi_write_spcr(struct acpi_ctx *ctx, const struct acpi_writer *entry spcr->baud_rate = 0; /* Fix checksum */ - header->checksum = table_compute_checksum((void *)spcr, header->length); + acpi_update_checksum(header); acpi_add_table(ctx, spcr); acpi_inc(ctx, spcr->header.length); @@ -759,7 +755,7 @@ static int acpi_write_iort(struct acpi_ctx *ctx, const struct acpi_writer *entry /* (Re)calculate length and checksum */ iort->header.length = ctx->current - (void *)iort; - iort->header.checksum = table_compute_checksum((void *)iort, iort->header.length); + acpi_update_checksum(&iort->header); log_debug("IORT at %p, length %x\n", iort, iort->header.length); /* Drop the table if it is empty */ diff --git a/lib/acpi/base.c b/lib/acpi/base.c index 8b6af2bc43a..5c755b14c16 100644 --- a/lib/acpi/base.c +++ b/lib/acpi/base.c @@ -50,8 +50,7 @@ static void acpi_write_rsdt(struct acpi_rsdt *rsdt) /* Entries are filled in later, we come with an empty set */ /* Fix checksum */ - header->checksum = table_compute_checksum(rsdt, - sizeof(struct acpi_rsdt)); + acpi_update_checksum(header); } static void acpi_write_xsdt(struct acpi_xsdt *xsdt) @@ -66,8 +65,7 @@ static void acpi_write_xsdt(struct acpi_xsdt *xsdt) /* Entries are filled in later, we come with an empty set */ /* Fix checksum */ - header->checksum = table_compute_checksum(xsdt, - sizeof(struct acpi_xsdt)); + acpi_update_checksum(header); } static int acpi_write_base(struct acpi_ctx *ctx, diff --git a/lib/acpi/csrt.c b/lib/acpi/csrt.c index 00927e53406..b863c644c07 100644 --- a/lib/acpi/csrt.c +++ b/lib/acpi/csrt.c @@ -40,7 +40,7 @@ int acpi_write_csrt(struct acpi_ctx *ctx, const struct acpi_writer *entry) /* (Re)calculate length and checksum */ header->length = (ulong)ctx->current - (ulong)csrt; - header->checksum = table_compute_checksum(csrt, header->length); + acpi_update_checksum(header); acpi_add_table(ctx, csrt); diff --git a/lib/acpi/mcfg.c b/lib/acpi/mcfg.c index 8b8a5bfafae..e21fe7ce123 100644 --- a/lib/acpi/mcfg.c +++ b/lib/acpi/mcfg.c @@ -57,7 +57,7 @@ int acpi_write_mcfg(struct acpi_ctx *ctx, const struct acpi_writer *entry) /* (Re)calculate length and checksum */ header->length = (ulong)ctx->current - (ulong)mcfg; - header->checksum = table_compute_checksum(mcfg, header->length); + acpi_update_checksum(header); acpi_add_table(ctx, mcfg); diff --git a/lib/acpi/ssdt.c b/lib/acpi/ssdt.c index df1d739d117..41e2d3c2f6c 100644 --- a/lib/acpi/ssdt.c +++ b/lib/acpi/ssdt.c @@ -35,7 +35,7 @@ int acpi_write_ssdt(struct acpi_ctx *ctx, const struct acpi_writer *entry) /* (Re)calculate length and checksum */ ssdt->length = ctx->current - (void *)ssdt; - ssdt->checksum = table_compute_checksum((void *)ssdt, ssdt->length); + acpi_update_checksum(ssdt); log_debug("SSDT at %p, length %x\n", ssdt, ssdt->length); /* Drop the table if it is empty */ From e0055ac9bbd3059c961b1d7f98dcff276502c847 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 22 Mar 2025 00:21:18 +0100 Subject: [PATCH 3/5] x86/acpi: simplify updating header checksum Use acpi_update_checksum() for updating ACPI table header checksum. Signed-off-by: Heinrich Schuchardt Reviewed-by: Matthias Brugger --- arch/x86/cpu/apollolake/hostbridge.c | 2 +- arch/x86/lib/acpi_nhlt.c | 2 +- arch/x86/lib/acpi_table.c | 11 ++++------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/arch/x86/cpu/apollolake/hostbridge.c b/arch/x86/cpu/apollolake/hostbridge.c index 039236df02d..284f16cfd91 100644 --- a/arch/x86/cpu/apollolake/hostbridge.c +++ b/arch/x86/cpu/apollolake/hostbridge.c @@ -298,7 +298,7 @@ static int apl_acpi_hb_write_tables(const struct udevice *dev, /* (Re)calculate length and checksum */ header->length = ctx->current - (void *)dmar; - header->checksum = table_compute_checksum((void *)dmar, header->length); + acpi_update_checksum(header); acpi_align(ctx); acpi_add_table(ctx, dmar); diff --git a/arch/x86/lib/acpi_nhlt.c b/arch/x86/lib/acpi_nhlt.c index 880ef31df7d..8aae5fa5af7 100644 --- a/arch/x86/lib/acpi_nhlt.c +++ b/arch/x86/lib/acpi_nhlt.c @@ -414,7 +414,7 @@ int nhlt_serialise_oem_overrides(struct acpi_ctx *ctx, struct nhlt *nhlt, cur.start = (void *)header; nhlt_serialise_endpoints(nhlt, &cur); - header->checksum = table_compute_checksum(header, sz); + acpi_update_checksum(header); nhlt_free_resources(nhlt); assert(cur.buf - cur.start == sz); diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c index 3186e48d63b..b13292c4150 100644 --- a/arch/x86/lib/acpi_table.c +++ b/arch/x86/lib/acpi_table.c @@ -173,7 +173,7 @@ int acpi_write_tcpa(struct acpi_ctx *ctx, const struct acpi_writer *entry) /* (Re)calculate length and checksum */ current = (u32)tcpa + sizeof(struct acpi_tcpa); header->length = current - (u32)tcpa; - header->checksum = table_compute_checksum(tcpa, header->length); + acpi_update_checksum(header); acpi_inc(ctx, tcpa->header.length); acpi_add_table(ctx, tcpa); @@ -242,7 +242,7 @@ static int acpi_write_tpm2(struct acpi_ctx *ctx, tpm2->lasa = nomap_to_sysmem(lasa); /* Calculate checksum. */ - header->checksum = table_compute_checksum(tpm2, header->length); + acpi_update_checksum(header); acpi_inc(ctx, tpm2->header.length); acpi_add_table(ctx, tpm2); @@ -279,9 +279,7 @@ int acpi_write_gnvs(struct acpi_ctx *ctx, const struct acpi_writer *entry) * patched the GNVS address. Set the checksum to zero since it * is part of the region being checksummed. */ - ctx->dsdt->checksum = 0; - ctx->dsdt->checksum = table_compute_checksum((void *)ctx->dsdt, - ctx->dsdt->length); + acpi_update_checksum(ctx->dsdt); } /* Fill in platform-specific global NVS variables */ @@ -330,8 +328,7 @@ static int acpi_create_hpet(struct acpi_hpet *hpet) hpet->number = 0; hpet->min_tick = 0; /* HPET_MIN_TICKS */ - header->checksum = table_compute_checksum(hpet, - sizeof(struct acpi_hpet)); + acpi_update_checksum(header); return 0; } From 5eca1696d25f61ad58582820f8477360c81b8b7b Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 22 Mar 2025 00:21:19 +0100 Subject: [PATCH 4/5] qemu-sbsa: simplify updating ACPI table header checksum Use acpi_update_checksum() to update table header. Signed-off-by: Heinrich Schuchardt Reviewed-by: Matthias Brugger Reviewed-by: Ilias Apalodimas --- board/emulation/qemu-sbsa/acpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/board/emulation/qemu-sbsa/acpi.c b/board/emulation/qemu-sbsa/acpi.c index ba85e08fc7d..7e4c55cc818 100644 --- a/board/emulation/qemu-sbsa/acpi.c +++ b/board/emulation/qemu-sbsa/acpi.c @@ -133,7 +133,7 @@ static int sbsa_write_gtdt(struct acpi_ctx *ctx, const struct acpi_writer *entry gtdt->cnt_read_base = 0xffffffffffffffff; // FIXME: VirtualPL2Timer - header->checksum = table_compute_checksum(header, header->length); + acpi_update_checksum(header); acpi_add_table(ctx, gtdt); @@ -181,7 +181,7 @@ static int acpi_write_pptt(struct acpi_ctx *ctx, const struct acpi_writer *entry } header->length = ctx->current - ctx->tab_start; - header->checksum = table_compute_checksum(header, header->length); + acpi_update_checksum(header); acpi_inc(ctx, header->length); acpi_add_table(ctx, header); From fecc50b0517d362b4db173b08a769f7b975d8255 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 22 Mar 2025 00:21:20 +0100 Subject: [PATCH 5/5] arm: simplify updating ACPI table header checksum Use acpi_update_checksum() to update table header. Signed-off-by: Heinrich Schuchardt Reviewed-by: Ilias Apalodimas Reviewed-by: Matthias Brugger --- arch/arm/mach-bcm283x/bcm2711_acpi.c | 4 ++-- board/raspberrypi/rpi/rpi.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-bcm283x/bcm2711_acpi.c b/arch/arm/mach-bcm283x/bcm2711_acpi.c index 79b283353cf..58f8ee232b9 100644 --- a/arch/arm/mach-bcm283x/bcm2711_acpi.c +++ b/arch/arm/mach-bcm283x/bcm2711_acpi.c @@ -81,7 +81,7 @@ static int acpi_write_pptt(struct acpi_ctx *ctx, const struct acpi_writer *entry } header->length = ctx->current - ctx->tab_start; - header->checksum = table_compute_checksum(header, header->length); + acpi_update_checksum(header); acpi_inc(ctx, header->length); acpi_add_table(ctx, header); @@ -116,7 +116,7 @@ static int rpi_write_gtdt(struct acpi_ctx *ctx, const struct acpi_writer *entry) gtdt->el2_flags = GTDT_FLAG_INT_ACTIVE_LOW; gtdt->cnt_read_base = 0xffffffffffffffff; - header->checksum = table_compute_checksum(header, header->length); + acpi_update_checksum(header); acpi_add_table(ctx, gtdt); diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c index 70d3c35499b..6ecd3eb120f 100644 --- a/board/raspberrypi/rpi/rpi.c +++ b/board/raspberrypi/rpi/rpi.c @@ -791,7 +791,7 @@ static int rpi_acpi_write_ssdt(struct acpi_ctx *ctx, const struct acpi_writer *e /* (Re)calculate length and checksum */ ssdt->length = ctx->current - (void *)ssdt; - ssdt->checksum = table_compute_checksum((void *)ssdt, ssdt->length); + acpi_update_checksum(ssdt); log_debug("SSDT at %p, length %x\n", ssdt, ssdt->length); /* Drop the table if it is empty */