From: Patrick Rudolph <patrick.rudolph@9elements.com>
To: u-boot@lists.denx.de,
Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>,
Tom Rini <trini@konsulko.com>
Cc: Patrick Rudolph <patrick.rudolph@9elements.com>,
Simon Glass <sjg@chromium.org>
Subject: [PATCH v10 21/37] arm: lib: Add GICV2 driver
Date: Wed, 23 Oct 2024 15:20:04 +0200 [thread overview]
Message-ID: <20241023132116.970117-22-patrick.rudolph@9elements.com> (raw)
In-Reply-To: <20241023132116.970117-1-patrick.rudolph@9elements.com>
Add a generic GICV2 driver that:
- parses the DT and generates the ACPI MADT subtables
- implement of_xlate() and allows irq_get_by_index() to return the
correct interrupt mappings
Map DT interrupts to ARM GIC interrupts as follows:
- Interrupt numbers ID32-ID1019 are used for SPIs
- ID0-ID15 are used for SGIs
- ID16-ID31 are used for PPIs
TEST: 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>
---
Changelog v6:
- Update header order
Changelog v9:
- Map SPI interrupts to ID32+
- Map PPI interrupts to ID16+
---
arch/arm/Kconfig | 7 ++++
arch/arm/lib/Makefile | 1 +
arch/arm/lib/gic-v2.c | 89 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 97 insertions(+)
create mode 100644 arch/arm/lib/gic-v2.c
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 060636e9e2..263f85b0d0 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -113,6 +113,13 @@ config GICV2
config GICV3
bool
+config DRIVER_GICV2
+ bool "ARM GICV2 driver"
+ select IRQ
+ help
+ ARM GICV2 driver.
+ Basic support for parsing the GICV2 node and generate ACPI tables.
+
config GIC_V3_ITS
bool "ARM GICV3 ITS"
select IRQ
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
index a7efed6771..cf76051450 100644
--- a/arch/arm/lib/Makefile
+++ b/arch/arm/lib/Makefile
@@ -68,6 +68,7 @@ obj-$(CONFIG_FSL_LAYERSCAPE) += ccn504.o
ifneq ($(CONFIG_GICV2)$(CONFIG_GICV3),)
obj-y += gic_64.o
endif
+obj-$(CONFIG_DRIVER_GICV2) += gic-v2.o
obj-$(CONFIG_GIC_V3_ITS) += gic-v3-its.o
obj-y += interrupts_64.o
else
diff --git a/arch/arm/lib/gic-v2.c b/arch/arm/lib/gic-v2.c
new file mode 100644
index 0000000000..b70434a45d
--- /dev/null
+++ b/arch/arm/lib/gic-v2.c
@@ -0,0 +1,89 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 Broadcom.
+ */
+#include <dm.h>
+#include <irq.h>
+#include <asm/gic.h>
+#include <asm/acpi_table.h>
+#include <cpu_func.h>
+#include <dm/acpi.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+#ifdef CONFIG_ACPIGEN
+/**
+ * acpi_gicv2_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_gicv2_fill_madt(const struct udevice *dev, struct acpi_ctx *ctx)
+{
+ struct acpi_madt_gicd *gicd;
+ fdt_addr_t addr;
+
+ addr = dev_read_addr_index(dev, 0);
+ if (addr == FDT_ADDR_T_NONE) {
+ pr_err("%s: failed to get GICD address\n", __func__);
+ return -EINVAL;
+ }
+
+ gicd = ctx->current;
+ acpi_write_madt_gicd(gicd, dev_seq(dev), addr, 2);
+ acpi_inc(ctx, gicd->length);
+
+ return 0;
+}
+
+static struct acpi_ops gic_v2_acpi_ops = {
+ .fill_madt = acpi_gicv2_fill_madt,
+};
+#endif
+
+static const struct udevice_id gic_v2_ids[] = {
+ { .compatible = "arm,arm11mp-gic" },
+ { .compatible = "arm,cortex-a15-gic" },
+ { .compatible = "arm,cortex-a7-gic" },
+ { .compatible = "arm,cortex-a5-gic" },
+ { .compatible = "arm,cortex-a9-gic" },
+ { .compatible = "arm,eb11mp-gic" },
+ { .compatible = "arm,gic-400" },
+ { .compatible = "arm,pl390" },
+ { .compatible = "arm,tc11mp-gic" },
+ { .compatible = "qcom,msm-8660-qgic" },
+ { .compatible = "qcom,msm-qgic2" },
+ {}
+};
+
+static int arm_gic_v2_of_xlate(struct irq *irq, struct ofnode_phandle_args *args)
+{
+ if (args->args_count != 3) {
+ log_debug("Invalid args_count: %d\n", args->args_count);
+ return -EINVAL;
+ }
+
+ /* ARM Generic Interrupt Controller v1 and v2 */
+ if (args->args[0] == GIC_SPI)
+ irq->id = args->args[1] + 32;
+ else
+ irq->id = args->args[1] + 16;
+
+ irq->flags = args->args[2];
+
+ return 0;
+}
+
+static const struct irq_ops arm_gic_v2_ops = {
+ .of_xlate = arm_gic_v2_of_xlate,
+};
+
+U_BOOT_DRIVER(arm_gic_v2) = {
+ .name = "gic-v2",
+ .id = UCLASS_IRQ,
+ .of_match = gic_v2_ids,
+ .ops = &arm_gic_v2_ops,
+ ACPI_OPS_PTR(&gic_v2_acpi_ops)
+};
--
2.46.2
next prev parent reply other threads:[~2024-10-23 13:34 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-23 13:19 [PATCH v10 00/37] Implement ACPI on aarch64 Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 01/37] acpi: x86: Move SPCR and DBG2 into common code Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 02/37] acpi: x86: Write FADT in " Patrick Rudolph
2024-11-07 9:19 ` Heinrich Schuchardt
2024-11-08 7:10 ` Patrick Rudolph
2024-11-08 11:19 ` Heinrich Schuchardt
2024-11-09 17:34 ` Simon Glass
2024-10-23 13:19 ` [PATCH v10 03/37] acpi: x86: Move MADT to " Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 04/37] acpi: Fix typo Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 05/37] serial: serial_pl01x: Implement .getinfo() for PL01 Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 06/37] acpi: Add define for GTDT Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 07/37] arm: acpi: Add generic ACPI methods Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 08/37] acpi: Add fill_madt to acpi_ops Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 09/37] acpi: acpi_table: Bump revisions Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 10/37] acpi: Add ACPITAB for PPTT and GTDT Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 11/37] acpi: acpi_table: Add IORT support Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 12/37] acpi: Move function prototype Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 13/37] acpi_table: Support platforms with unusable RSDT Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 14/37] acpi: Allocate and write ACPI tables Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 15/37] acpi: Add processor device Patrick Rudolph
2024-10-23 13:19 ` [PATCH v10 16/37] drivers: usb: Add generic XHCI Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 17/37] drivers: ata: Rename ahci_mvebu Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 18/37] drivers/cpu: Add generic armv8 cpu driver Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 19/37] arm: gic-v3-its: Rename objects Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 20/37] arm: gic-v3-its: Implement of_xlate Patrick Rudolph
2024-10-23 13:20 ` Patrick Rudolph [this message]
2024-10-23 13:20 ` [PATCH v10 22/37] drivers: misc: irq-uclass: Update irq_get_by_index Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 23/37] drivers/arm: Implement acpi_fill_madt Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 24/37] common: Enable BLOBLIST_TABLES on arm Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 25/37] board: emulation: Add QEMU sbsa support Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 26/37] arm: mach-bcm283x: Map the ARM local MMIO as well Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 27/37] arm: mach-bcm283x: Bring in some header files from tianocore Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 28/37] arm: bcm283x: Generate ACPI tables Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 29/37] board: raspberrypi: Add ASL files from tianocore Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 30/37] arm: cpu: Add ACPI parking protocol support Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 31/37] armv8: cpu: Enable ACPI parking protocol Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 32/37] arm: Implement read_mpidr on armv7 Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 33/37] arm: mach-bcm283x: Add ARMV8_MULTIENTRY support Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 34/37] arm: mach-bcm283x: Enable ARMV8_MULTIENTRY Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 35/37] bloblist: Fix use of uninitialized variable Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 36/37] configs: Add RPI4 ACPI defconfig Patrick Rudolph
2024-10-23 13:20 ` [PATCH v10 37/37] CI: Enable qemu_sbsa Patrick Rudolph
2024-10-28 2:53 ` [PATCH v10 00/37] Implement ACPI on aarch64 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=20241023132116.970117-22-patrick.rudolph@9elements.com \
--to=patrick.rudolph@9elements.com \
--cc=rayagonda.kokatanur@broadcom.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.