diff options
author | Moritz Fischer <moritzf@google.com> | 2022-02-05 12:17:45 -0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2022-02-09 12:30:13 -0700 |
commit | 058fb9f5ffc422f987c33adb01f8fa6e4434eff8 (patch) | |
tree | 74c1e5bf3e09f183f1f32cb6a0d21ac167b267aa /lib/acpi | |
parent | ab2ffe735979b5e6ef417adbd6019fa603de1715 (diff) | |
download | u-boot-058fb9f5ffc422f987c33adb01f8fa6e4434eff8.tar.gz u-boot-058fb9f5ffc422f987c33adb01f8fa6e4434eff8.tar.bz2 u-boot-058fb9f5ffc422f987c33adb01f8fa6e4434eff8.zip |
acpi: Move MCFG implementation to common lib
MCFG tables are used on multiple arches. Move to common ACPI lib.
Cc: Simon Glass <sjg@chromium.org>
Signed-off-by: Moritz Fischer <moritzf@google.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Use sizeof(*mcfg) instead of sizeof(*header)
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'lib/acpi')
-rw-r--r-- | lib/acpi/Makefile | 1 | ||||
-rw-r--r-- | lib/acpi/mcfg.c | 64 |
2 files changed, 65 insertions, 0 deletions
diff --git a/lib/acpi/Makefile b/lib/acpi/Makefile index f9b504988f..956b5a0d72 100644 --- a/lib/acpi/Makefile +++ b/lib/acpi/Makefile @@ -11,6 +11,7 @@ obj-y += acpi_writer.o ifndef CONFIG_QEMU obj-y += base.o obj-y += csrt.o +obj-y += mcfg.o # Sandbox does not build a .asl file ifndef CONFIG_SANDBOX diff --git a/lib/acpi/mcfg.c b/lib/acpi/mcfg.c new file mode 100644 index 0000000000..7404ae586a --- /dev/null +++ b/lib/acpi/mcfg.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Write an ACPI MCFG table + * + * Copyright 2022 Google LLC + */ + +#define LOG_CATEGORY LOGC_ACPI + +#include <common.h> +#include <mapmem.h> +#include <tables_csum.h> +#include <acpi/acpi_table.h> +#include <dm/acpi.h> + +int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig, u32 base, + u16 seg_nr, u8 start, u8 end) +{ + memset(mmconfig, 0, sizeof(*mmconfig)); + mmconfig->base_address_l = base; + mmconfig->base_address_h = 0; + mmconfig->pci_segment_group_number = seg_nr; + mmconfig->start_bus_number = start; + mmconfig->end_bus_number = end; + + return sizeof(struct acpi_mcfg_mmconfig); +} + +__weak int acpi_fill_mcfg(struct acpi_ctx *ctx) +{ + return -ENOENT; +} + +/* MCFG is defined in the PCI Firmware Specification 3.0 */ +int acpi_write_mcfg(struct acpi_ctx *ctx, const struct acpi_writer *entry) +{ + struct acpi_table_header *header; + struct acpi_mcfg *mcfg; + int ret; + + mcfg = ctx->current; + header = &mcfg->header; + + memset(mcfg, '\0', sizeof(struct acpi_mcfg)); + + /* Fill out header fields */ + acpi_fill_header(header, "MCFG"); + header->length = sizeof(struct acpi_mcfg); + header->revision = 1; + acpi_inc(ctx, sizeof(*mcfg)); + + ret = acpi_fill_mcfg(ctx); + if (ret) + return log_msg_ret("fill", ret); + + /* (Re)calculate length and checksum */ + header->length = (ulong)ctx->current - (ulong)mcfg; + header->checksum = table_compute_checksum(mcfg, header->length); + + acpi_add_table(ctx, mcfg); + + return 0; +} +ACPI_WRITER(5mcfg, "MCFG", acpi_write_mcfg, 0); |