public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Patrick Rudolph <patrick.rudolph@9elements.com>
To: u-boot@lists.denx.de, linux-kernel@vger.kernel.org
Cc: Patrick Rudolph <patrick.rudolph@9elements.com>,
	Simon Glass <sjg@chromium.org>, Tom Rini <trini@konsulko.com>
Subject: [PATCH v6 23/37] drivers/arm: Implement acpi_fill_madt
Date: Wed,  2 Oct 2024 11:47:14 +0200	[thread overview]
Message-ID: <20241002094832.24933-24-patrick.rudolph@9elements.com> (raw)
In-Reply-To: <20241002094832.24933-1-patrick.rudolph@9elements.com>

Fill the MADT table in the GIC driver and armv8 CPU driver to
drop SoC specific code. While the GIC only needs devicetree
data, the CPU driver needs additional information stored in
the cpu_plat struct.

While on it update the only board making use of the existing
drivers and writing ACPI MADT in mainboard code.

TEST: Booted on QEMU sbsa-ref using GICV3 driver model generated MADT.
      Booted on QEMU raspb4 using GICV2 driver model generated MADT.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Cc: Simon Glass <sjg@chromium.org>
---
Changelog v4:
- Read everything from the DT
- Export armv8_cpu_fill_madt() to use it in other CPU drivers
- Depend on IRQ
Changelog v6:
- Update header order

---
 arch/arm/lib/gic-v3-its.c | 89 ++++++++++++++++++++++++++++++++++++++-
 drivers/cpu/Kconfig       |  1 +
 drivers/cpu/armv8_cpu.c   | 80 ++++++++++++++++++++++++++++++++++-
 drivers/cpu/armv8_cpu.h   | 10 +++++
 4 files changed, 178 insertions(+), 2 deletions(-)

diff --git a/arch/arm/lib/gic-v3-its.c b/arch/arm/lib/gic-v3-its.c
index 0d5545bfb2..ad1c3d7312 100644
--- a/arch/arm/lib/gic-v3-its.c
+++ b/arch/arm/lib/gic-v3-its.c
@@ -5,9 +5,11 @@
 #include <cpu_func.h>
 #include <dm.h>
 #include <irq.h>
+#include <asm/acpi_table.h>
 #include <asm/gic.h>
 #include <asm/gic-v3.h>
 #include <asm/io.h>
+#include <dm/acpi.h>
 #include <linux/bitops.h>
 #include <linux/printk.h>
 #include <linux/sizes.h>
@@ -27,12 +29,14 @@ static u32 lpi_id_bits;
 struct gic_v3_its_priv {
 	ulong gicd_base;
 	ulong gicr_base;
+	ulong gicr_length;
 };
 
 static int gic_v3_its_get_gic_addr(struct gic_v3_its_priv *priv)
 {
 	struct udevice *dev;
 	fdt_addr_t addr;
+	fdt_size_t size;
 	int ret;
 
 	ret = uclass_get_device_by_driver(UCLASS_IRQ,
@@ -50,12 +54,13 @@ static int gic_v3_its_get_gic_addr(struct gic_v3_its_priv *priv)
 	}
 	priv->gicd_base = addr;
 
-	addr = dev_read_addr_index(dev, 1);
+	addr = dev_read_addr_size_index(dev, 1, &size);
 	if (addr == FDT_ADDR_T_NONE) {
 		pr_err("%s: failed to get GICR address\n", __func__);
 		return -EINVAL;
 	}
 	priv->gicr_base = addr;
+	priv->gicr_length = size;
 
 	return 0;
 }
@@ -159,6 +164,42 @@ int gic_lpi_tables_init(u64 base, u32 num_redist)
 	return 0;
 }
 
+#ifdef CONFIG_ACPIGEN
+/**
+ * acpi_gicv3_fill_madt() - Fill out the body of the MADT
+ *
+ * Write GICD and GICR tables based on collected devicetree data.
+ *
+ * @dev: Device to write ACPI tables for
+ * @ctx: ACPI context to write MADT sub-tables to
+ * Return: 0 if OK
+ */
+static int acpi_gicv3_fill_madt(const struct udevice *dev, struct acpi_ctx *ctx)
+{
+	struct acpi_madt_gicd *gicd;
+	struct acpi_madt_gicr *gicr;
+
+	struct gic_v3_its_priv priv;
+
+	if (gic_v3_its_get_gic_addr(&priv))
+		return -EINVAL;
+
+	gicd = ctx->current;
+	acpi_write_madt_gicd(gicd, dev_seq(dev), priv.gicd_base, 3);
+	acpi_inc(ctx, gicd->length);
+
+	gicr = ctx->current;
+	acpi_write_madt_gicr(gicr, priv.gicr_base, priv.gicr_length);
+	acpi_inc(ctx, gicr->length);
+
+	return 0;
+}
+
+struct acpi_ops gic_v3_acpi_ops = {
+	.fill_madt	= acpi_gicv3_fill_madt,
+};
+#endif
+
 static const struct udevice_id gic_v3_ids[] = {
 	{ .compatible = "arm,gic-v3" },
 	{}
@@ -188,4 +229,50 @@ U_BOOT_DRIVER(arm_gic_v3) = {
 	.id		= UCLASS_IRQ,
 	.of_match	= gic_v3_ids,
 	.ops		= &arm_gic_v3_ops,
+	ACPI_OPS_PTR(&gic_v3_acpi_ops)
+};
+
+#ifdef CONFIG_ACPIGEN
+/**
+ * acpi_gic_its_fill_madt() - Fill out the body of the MADT
+ *
+ * Write ITS tables based on collected devicetree data.
+ *
+ * @dev: Device to write ACPI tables for
+ * @ctx: ACPI context to write MADT sub-tables to
+ * Return: 0 if OK
+ */
+static int acpi_gic_its_fill_madt(const struct udevice *dev, struct acpi_ctx *ctx)
+{
+	struct acpi_madt_its *its;
+	fdt_addr_t addr;
+
+	addr = dev_read_addr_index(dev, 0);
+	if (addr == FDT_ADDR_T_NONE) {
+		pr_err("%s: failed to get GIC ITS address\n", __func__);
+		return -EINVAL;
+	}
+
+	its = ctx->current;
+	acpi_write_madt_its(its, dev_seq(dev), addr);
+	acpi_inc(ctx, its->length);
+
+	return 0;
+}
+
+struct acpi_ops gic_v3_its_acpi_ops = {
+	.fill_madt	= acpi_gic_its_fill_madt,
+};
+#endif
+
+static const struct udevice_id gic_v3_its_ids[] = {
+	{ .compatible = "arm,gic-v3-its" },
+	{}
+};
+
+U_BOOT_DRIVER(arm_gic_v3_its) = {
+	.name		= "gic-v3-its",
+	.id		= UCLASS_IRQ,
+	.of_match	= gic_v3_its_ids,
+	ACPI_OPS_PTR(&gic_v3_its_acpi_ops)
 };
diff --git a/drivers/cpu/Kconfig b/drivers/cpu/Kconfig
index 9c0df331d7..4cc3679c00 100644
--- a/drivers/cpu/Kconfig
+++ b/drivers/cpu/Kconfig
@@ -29,6 +29,7 @@ config CPU_RISCV
 config CPU_ARMV8
 	bool "Enable generic ARMv8 CPU driver"
 	depends on CPU && ARM64
+	select IRQ
 	help
 	  Support CPU cores for armv8 architecture.
 
diff --git a/drivers/cpu/armv8_cpu.c b/drivers/cpu/armv8_cpu.c
index 19f072be43..4eedfe5e2c 100644
--- a/drivers/cpu/armv8_cpu.c
+++ b/drivers/cpu/armv8_cpu.c
@@ -4,10 +4,11 @@
  */
 #include <cpu.h>
 #include <dm.h>
+#include <irq.h>
 #include <acpi/acpigen.h>
 #include <asm/armv8/cpu.h>
-#include <dm/acpi.h>
 #include <asm/io.h>
+#include <dm/acpi.h>
 #include <linux/bitops.h>
 #include <linux/printk.h>
 #include <linux/sizes.h>
@@ -47,8 +48,85 @@ int armv8_cpu_fill_ssdt(const struct udevice *dev, struct acpi_ctx *ctx)
 	return 0;
 }
 
+int armv8_cpu_fill_madt(const struct udevice *dev, struct acpi_ctx *ctx)
+{
+	struct acpi_madt_gicc *gicc;
+	struct cpu_plat *cpu_plat;
+	struct udevice *gic;
+	u64 gicc_gicv = 0;
+	u64 gicc_gich = 0;
+	u64 gicc_gicr_base = 0;
+	u64 gicc_phys_base = 0;
+	u32 gicc_perf_gsiv = 0;
+	u64 gicc_mpidr;
+	u32 gicc_vgic_maint_irq = 0;
+	int addr_index;
+	fdt_addr_t addr;
+	int ret;
+	struct irq req_irq;
+
+	cpu_plat = dev_get_parent_plat(dev);
+	if (!cpu_plat)
+		return 0;
+
+	ret = irq_get_interrupt_parent(dev, &gic);
+	if (ret) {
+		log_err("%s: Failed to find interrupt parent for %s\n",
+			__func__, dev->name);
+		return -ENODEV;
+	}
+
+	addr_index = 1;
+
+	if (device_is_compatible(gic, "arm,gic-v3")) {
+		addr = dev_read_addr_index(gic, addr_index++);
+		if (addr != FDT_ADDR_T_NONE)
+			gicc_gicr_base = addr;
+	}
+
+	addr = dev_read_addr_index(gic, addr_index++);
+	if (addr != FDT_ADDR_T_NONE)
+		gicc_phys_base = addr;
+
+	addr = dev_read_addr_index(gic, addr_index++);
+	if (addr != FDT_ADDR_T_NONE)
+		gicc_gich = addr;
+
+	addr = dev_read_addr_index(gic, addr_index++);
+	if (addr != FDT_ADDR_T_NONE)
+		gicc_gicv = addr;
+
+	ret = irq_get_by_index(gic, 0, &req_irq);
+	if (!ret)
+		gicc_vgic_maint_irq = req_irq.id;
+
+	gicc_mpidr = dev_read_u64_default(dev, "reg", 0);
+	if (!gicc_mpidr)
+		gicc_mpidr = dev_read_u32_default(dev, "reg", 0);
+
+	/*
+	 * gicc_vgic_maint_irq and gicc_gicv are the same for every CPU
+	 */
+	gicc = ctx->current;
+	acpi_write_madt_gicc(gicc,
+			     dev_seq(dev),
+			     gicc_perf_gsiv, /* FIXME: needs a PMU driver */
+			     gicc_phys_base,
+			     gicc_gicv,
+			     gicc_gich,
+			     gicc_vgic_maint_irq,
+			     gicc_gicr_base,
+			     gicc_mpidr,
+			     0); /* FIXME: Not defined in DT */
+
+	acpi_inc(ctx, gicc->length);
+
+	return 0;
+}
+
 struct acpi_ops armv8_cpu_acpi_ops = {
 	.fill_ssdt	= armv8_cpu_fill_ssdt,
+	.fill_madt	= armv8_cpu_fill_madt,
 };
 #endif
 
diff --git a/drivers/cpu/armv8_cpu.h b/drivers/cpu/armv8_cpu.h
index 2c4b0252cf..48c705e98d 100644
--- a/drivers/cpu/armv8_cpu.h
+++ b/drivers/cpu/armv8_cpu.h
@@ -18,4 +18,14 @@
  */
 int armv8_cpu_fill_ssdt(const struct udevice *dev, struct acpi_ctx *ctx);
 
+/**
+ * armv8_cpu_fill_madt() - Fill the MADT
+ * Parses the FDT and writes the MADT subtables.
+ *
+ * @dev: cpu device to generate ACPI tables for
+ * @ctx: ACPI context pointer
+ * @return:	0 if OK, or a negative error code.
+ */
+int armv8_cpu_fill_madt(const struct udevice *dev, struct acpi_ctx *ctx);
+
 #endif
\ No newline at end of file
-- 
2.46.2


  parent reply	other threads:[~2024-10-02  9:56 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-02  9:46 [PATCH v6 00/37] Implement ACPI on aarch64 Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 01/37] acpi: x86: Move SPCR and DBG2 into common code Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 02/37] acpi: x86: Write FADT in " Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 03/37] acpi: x86: Move MADT to " Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 04/37] acpi: Fix typo Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 05/37] serial: serial_pl01x: Implement .getinfo() for PL01 Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 06/37] acpi: Add define for GTDT Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 07/37] arm: acpi: Add generic ACPI methods Patrick Rudolph
2024-10-02  9:46 ` [PATCH v6 08/37] acpi: Add fill_madt to acpi_ops Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 09/37] acpi: acpi_table: Bump revisions Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 10/37] acpi: Add ACPITAB for PPTT and GTDT Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 11/37] acpi: acpi_table: Add IORT support Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 12/37] acpi: Move function prototype Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 13/37] acpi_table: Support platforms with unusable RSDT Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 14/37] efi_loader: Allocate and write ACPI tables Patrick Rudolph
2024-10-02 22:55   ` Simon Glass
2024-10-03  5:45   ` Ilias Apalodimas
2024-10-03 13:49     ` Simon Glass
2024-10-03 15:58       ` Ilias Apalodimas
2024-10-03 20:46         ` Simon Glass
2024-10-02  9:47 ` [PATCH v6 15/37] acpi: Add processor device Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 16/37] drivers: usb: Add generic XHCI Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 17/37] drivers: ata: Rename ahci_mvebu Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 18/37] drivers/cpu: Add generic armv8 cpu driver Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 19/37] arm: gic-v3-its: Rename objects Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 20/37] arm: gic-v3-its: Implement of_xlate Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 21/37] arm: lib: Add GICV2 driver Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 22/37] drivers: misc: irq-uclass: Update irq_get_by_index Patrick Rudolph
2024-10-02  9:47 ` Patrick Rudolph [this message]
2024-10-02  9:47 ` [PATCH v6 24/37] common: Enable BLOBLIST_TABLES on arm Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 25/37] board: emulation: Add QEMU sbsa support Patrick Rudolph
2024-10-02 22:55   ` Simon Glass
2024-10-03  1:35     ` Tom Rini
2024-10-03 13:50       ` Simon Glass
2024-10-03 14:43         ` Tom Rini
2024-10-03 16:59           ` Simon Glass
2024-10-03 19:17             ` Tom Rini
2024-10-03 20:46               ` Simon Glass
2024-10-03 22:25                 ` Tom Rini
2024-10-04  1:28                   ` Simon Glass
2024-10-04  7:19         ` Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 26/37] arm: mach-bcm283x: Map the ARM local MMIO as well Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 27/37] arm: mach-bcm283x: Bring in some header files from tianocore Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 28/37] arm: bcm283x: Generate ACPI tables Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 29/37] board: raspberrypi: Add ASL files from tianocore Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 30/37] arm: cpu: Add ACPI parking protocol support Patrick Rudolph
2024-10-02 22:55   ` Simon Glass
2024-10-02  9:47 ` [PATCH v6 31/37] armv8: cpu: Enable ACPI parking protocol Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 32/37] arm: Implement read_mpidr on armv7 Patrick Rudolph
2024-10-02 22:55   ` Simon Glass
2024-10-02  9:47 ` [PATCH v6 33/37] arm: mach-bcm283x: Add ARMV8_MULTIENTRY support Patrick Rudolph
2024-10-02 22:55   ` Simon Glass
2024-10-02  9:47 ` [PATCH v6 34/37] arm: mach-bcm283x: Enable ARMV8_MULTIENTRY Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 35/37] bloblist: Fix use of uninitialized variable Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 36/37] configs: Add RPI4 ACPI defconfig Patrick Rudolph
2024-10-02  9:47 ` [PATCH v6 37/37] CI: Enable qemu_sbsa Patrick Rudolph
2024-10-02 22:55   ` Simon Glass
2024-10-03 22:25   ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241002094832.24933-24-patrick.rudolph@9elements.com \
    --to=patrick.rudolph@9elements.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox