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, Simon Glass <sjg@chromium.org>
Cc: Patrick Rudolph <patrick.rudolph@9elements.com>,
	Tom Rini <trini@konsulko.com>
Subject: [PATCH v5 22/36] drivers: misc: irq-uclass: Update irq_get_by_index
Date: Thu, 26 Sep 2024 09:59:10 +0200	[thread overview]
Message-ID: <20240926080021.148031-23-patrick.rudolph@9elements.com> (raw)
In-Reply-To: <20240926080021.148031-1-patrick.rudolph@9elements.com>

Support reading the "interrupts" property from the devicetree in case
the "interrupts-extended" property isn't found. As the "interrupts"
property is commonly used, this allows to parse all existing FDT and
makes irq_get_by_index() more useful.

The "interrupts" property doesn't contain a phandle as "interrupts-extended"
does, so implement a new method to locate the interrupt-parent called
irq_get_interrupt_parent().

TEST: Read the interrupts from the GIC node for ACPI MADT generation.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
 arch/sandbox/dts/test.dts |  3 ++
 drivers/misc/irq-uclass.c | 66 ++++++++++++++++++++++++++++++++++++++-
 include/irq.h             | 14 +++++++++
 test/dm/irq.c             | 15 +++++++++
 4 files changed, 97 insertions(+), 1 deletion(-)

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 5fb5eac862..d578ba07f6 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -522,6 +522,9 @@
 	};
 
 	f-test {
+		#interrupt-cells = <2>;
+		interrupt-parent = <&irq>;
+		interrupts = <4 0>;
 		compatible = "denx,u-boot-fdt-test";
 	};
 
diff --git a/drivers/misc/irq-uclass.c b/drivers/misc/irq-uclass.c
index 79eb7c200d..068f67fe02 100644
--- a/drivers/misc/irq-uclass.c
+++ b/drivers/misc/irq-uclass.c
@@ -62,6 +62,40 @@ int irq_read_and_clear(struct irq *irq)
 	return ops->read_and_clear(irq);
 }
 
+int irq_get_interrupt_parent(const struct udevice *dev,
+			     struct udevice **interrupt_parent)
+{
+	struct ofnode_phandle_args phandle_args;
+	struct udevice *irq = NULL;
+	ofnode node;
+	int ret;
+
+	if (!dev || !interrupt_parent)
+		return -EINVAL;
+
+	*interrupt_parent = NULL;
+
+	node = dev_ofnode(dev);
+	if (!ofnode_valid(node))
+		return -EINVAL;
+
+	while (ofnode_valid(node)) {
+		ret = ofnode_parse_phandle_with_args(node, "interrupt-parent",
+						     NULL, 0, 0, &phandle_args);
+		if (!ret && !device_get_global_by_ofnode(phandle_args.node, &irq))
+			break;
+		node = ofnode_get_parent(node);
+	}
+
+	if (!irq) {
+		log_err("Cannot find an interrupt parent for device %s\n", dev->name);
+		return -ENODEV;
+	}
+	*interrupt_parent = irq;
+
+	return 0;
+}
+
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
 int irq_get_by_phandle(struct udevice *dev, const struct phandle_2_arg *cells,
 		       struct irq *irq)
@@ -142,10 +176,40 @@ err:
 int irq_get_by_index(struct udevice *dev, int index, struct irq *irq)
 {
 	struct ofnode_phandle_args args;
-	int ret;
+	struct udevice *interrupt_parent;
+	int ret, size, i;
+	const __be32 *list;
+	u32 count;
 
 	ret = dev_read_phandle_with_args(dev, "interrupts-extended",
 					 "#interrupt-cells", 0, index, &args);
+	if (ret) {
+		list = dev_read_prop(dev, "interrupts", &size);
+		if (!list)
+			return -ENOENT;
+
+		ret = irq_get_interrupt_parent(dev, &interrupt_parent);
+		if (ret)
+			return -ENODEV;
+		args.node = dev_ofnode(interrupt_parent);
+
+		if (dev_read_u32(dev, "#interrupt-cells", &count)) {
+			log_err("%s: could not get #interrupt-cells for %s\n",
+				__func__, dev->name);
+			return -ENOENT;
+		}
+
+		if (index * count >= size / sizeof(*list))
+			return -ENOENT;
+		if (count > OF_MAX_PHANDLE_ARGS)
+			count = OF_MAX_PHANDLE_ARGS;
+		args.args_count = count;
+		for (i = 0; i < count; i++)
+			args.args[i] = be32_to_cpup(&list[index * count + i]);
+
+		return irq_get_by_index_tail(ret, dev_ofnode(dev), &args,
+					     "interrupts", index, irq);
+	}
 
 	return irq_get_by_index_tail(ret, dev_ofnode(dev), &args,
 				     "interrupts-extended", index > 0, irq);
diff --git a/include/irq.h b/include/irq.h
index 5638c10128..0fbc1a5f48 100644
--- a/include/irq.h
+++ b/include/irq.h
@@ -200,6 +200,20 @@ int irq_restore_polarities(struct udevice *dev);
  */
 int irq_read_and_clear(struct irq *irq);
 
+/**
+ * irq_get_interrupt_parent() - returns the interrupt parent
+ *
+ * Walks the devicetree and returns the interrupt parent's ofnode
+ * for the specified device.
+ *
+ * @dev: device
+ * @interrupt_parent: The interrupt parent's ofnode'
+ * Return: 0 success, or error value
+ *
+ */
+int irq_get_interrupt_parent(const struct udevice *dev,
+			     struct udevice **interrupt_parent);
+
 struct phandle_2_arg;
 /**
  * irq_get_by_phandle() - Get an irq by its phandle information (of-platadata)
diff --git a/test/dm/irq.c b/test/dm/irq.c
index d22772ab76..1cbf524f67 100644
--- a/test/dm/irq.c
+++ b/test/dm/irq.c
@@ -76,6 +76,21 @@ static int dm_test_request(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_request, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 
+/* Test of irq_get_by_index() */
+static int dm_test_irq_get_by_index(struct unit_test_state *uts)
+{
+	struct udevice *dev;
+	struct irq irq;
+
+	ut_assertok(uclass_get_device_by_name(UCLASS_TEST_FDT, "f-test",
+					      &dev));
+	ut_assertok(irq_get_by_index(dev, 0, &irq));
+	ut_asserteq(4, irq.id);
+
+	return 0;
+}
+DM_TEST(dm_test_irq_get_by_index, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
 /* Test of irq_get_acpi() */
 static int dm_test_irq_get_acpi(struct unit_test_state *uts)
 {
-- 
2.46.0


  parent reply	other threads:[~2024-09-26  8:08 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-26  7:58 [PATCH v5 00/36] Implement ACPI on aarch64 Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 01/36] acpi: x86: Move SPCR and DBG2 into common code Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 02/36] acpi: x86: Write FADT in " Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 03/36] acpi: x86: Move MADT to " Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 04/36] acpi: Fix typo Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 05/36] serial: serial_pl01x: Implement .getinfo() for PL01 Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 06/36] acpi: Add define for GTDT Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 07/36] arm: acpi: Add generic ACPI methods Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 08/36] acpi: Add fill_madt to acpi_ops Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 09/36] acpi: acpi_table: Bump revisions Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 10/36] acpi: Add ACPITAB for PPTT and GTDT Patrick Rudolph
2024-09-26  7:58 ` [PATCH v5 11/36] acpi: acpi_table: Add IORT support Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 12/36] acpi: Move function prototype Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 13/36] acpi_table: Support platforms with unusable RSDT Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 14/36] efi_loader: Allocate and write ACPI tables Patrick Rudolph
2024-09-26 21:04   ` Simon Glass
2024-09-26  7:59 ` [PATCH v5 15/36] acpi: Add processor device Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 16/36] drivers: usb: Add generic XHCI Patrick Rudolph
2024-09-26 21:28   ` Simon Glass
2024-09-26  7:59 ` [PATCH v5 17/36] drivers: ata: Rename ahci_mvebu Patrick Rudolph
2024-09-26 22:10   ` Tony Dinh
2024-09-26  7:59 ` [PATCH v5 18/36] drivers/cpu: Add generic armv8 cpu driver Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 19/36] arm: gic-v3-its: Rename objects Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 20/36] arm: gic-v3-its: Implement of_xlate Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 21/36] arm: lib: Add GICV2 driver Patrick Rudolph
2024-09-26  7:59 ` Patrick Rudolph [this message]
2024-09-26  7:59 ` [PATCH v5 23/36] drivers/arm: Implement acpi_fill_madt Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 24/36] common: Enable BLOBLIST_TABLES on arm Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 25/36] board: emulation: Add QEMU sbsa support Patrick Rudolph
2024-09-26 21:28   ` Simon Glass
2024-10-01 10:49     ` Patrick Rudolph
2024-10-01 15:05       ` Tom Rini
2024-10-01 15:17         ` Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 26/36] arm: mach-bcm283x: Map the ARM local MMIO as well Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 27/36] arm: mach-bcm283x: Bring in some header files from tianocore Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 28/36] arm: bcm283x: Generate ACPI tables Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 29/36] board: raspberrypi: Add ASL files from tianocore Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 30/36] arm: cpu: Add ACPI parking protocol support Patrick Rudolph
2024-09-26 21:28   ` Simon Glass
2024-09-26  7:59 ` [PATCH v5 31/36] armv8: cpu: Enable ACPI parking protocol Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 32/36] arm: mach-bcm283x: Add ARMV8_MULTIENTRY support Patrick Rudolph
2024-09-26 21:29   ` Simon Glass
2024-09-26  7:59 ` [PATCH v5 33/36] arm: mach-bcm283x: Enable ARMV8_MULTIENTRY Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 34/36] bloblist: Fix use of uninitialized variable Patrick Rudolph
2024-09-26  7:59 ` [PATCH v5 35/36] configs: Add RPI4 ACPI defconfig Patrick Rudolph
2024-09-27  3:31   ` Tom Rini
2024-09-26  7:59 ` [PATCH v5 36/36] azure-pipelines: Enable qemu_sbsa Patrick Rudolph
2024-09-26 21:29   ` Simon Glass
2024-09-27  3:32     ` 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=20240926080021.148031-23-patrick.rudolph@9elements.com \
    --to=patrick.rudolph@9elements.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox