summaryrefslogtreecommitdiff
path: root/lib/acpi
diff options
context:
space:
mode:
authorMoritz Fischer <moritzf@google.com>2022-02-05 12:17:45 -0800
committerSimon Glass <sjg@chromium.org>2022-02-09 12:30:13 -0700
commit058fb9f5ffc422f987c33adb01f8fa6e4434eff8 (patch)
tree74c1e5bf3e09f183f1f32cb6a0d21ac167b267aa /lib/acpi
parentab2ffe735979b5e6ef417adbd6019fa603de1715 (diff)
downloadu-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/Makefile1
-rw-r--r--lib/acpi/mcfg.c64
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);