[PATCH v2 1/4] lib: sbi_irqchip: Allow irqchip drivers advertise capabilities

Anup Patel anup.patel at oss.qualcomm.com
Mon Jun 8 05:52:53 PDT 2026


Extend struct sbi_irqchip_device to allow irqchip drivers advertise
interrupt controller capabilities (such as wired interrupt, MSIs, etc).
This further allows other parts of OpenSBI to lookup irqchip devices
based on capabilities.

Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
---
 include/sbi/sbi_irqchip.h | 11 ++++++++++-
 lib/sbi/sbi_irqchip.c     | 20 ++++++++++++++++++++
 lib/utils/irqchip/aplic.c |  1 +
 lib/utils/irqchip/imsic.c |  1 +
 4 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/include/sbi/sbi_irqchip.h b/include/sbi/sbi_irqchip.h
index 8e7ff573..e778d747 100644
--- a/include/sbi/sbi_irqchip.h
+++ b/include/sbi/sbi_irqchip.h
@@ -31,12 +31,17 @@ struct sbi_irqchip_device {
 	/** Internal data of all hardware interrupts of this irqchip (private) */
 	struct sbi_irqchip_hwirq_data *hwirqs;
 
-	/** List of interrupt handlers */
+	/** List of interrupt handlers (private) */
 	struct sbi_dlist handler_list;
 
 	/** Unique ID of this irqchip */
 	u32 id;
 
+	/** Capabilities of this irqchip */
+#define SBI_IRQCHIP_CAPS_WIRED		BIT(0)
+#define SBI_IRQCHIP_CAPS_MSI		BIT(1)
+	unsigned long caps;
+
 	/** Number of hardware IRQs of this irqchip */
 	u32 num_hwirq;
 
@@ -141,6 +146,10 @@ int sbi_irqchip_register_reserved(struct sbi_irqchip_device *chip,
 int sbi_irqchip_unregister_handler(struct sbi_irqchip_device *chip,
 				   u32 first_hwirq, u32 num_hwirq);
 
+/** Find an irqchip device based on matching capabilities */
+struct sbi_irqchip_device *sbi_irqchip_find_device_by_caps(unsigned long caps,
+							   struct sbi_irqchip_device *first);
+
 /** Find an irqchip device based on unique ID */
 struct sbi_irqchip_device *sbi_irqchip_find_device(u32 id);
 
diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c
index 5880872c..6d0df02e 100644
--- a/lib/sbi/sbi_irqchip.c
+++ b/lib/sbi/sbi_irqchip.c
@@ -408,6 +408,26 @@ int sbi_irqchip_unregister_handler(struct sbi_irqchip_device *chip,
 	return 0;
 }
 
+struct sbi_irqchip_device *sbi_irqchip_find_device_by_caps(unsigned long caps,
+							   struct sbi_irqchip_device *first)
+{
+	struct sbi_irqchip_device *chip;
+	bool found = false;
+
+	sbi_list_for_each_entry(chip, &irqchip_list, node) {
+		if (!found) {
+			if (first == chip)
+				found = true;
+			else
+				continue;
+		}
+		if ((chip->caps & caps) == caps)
+			return chip;
+	}
+
+	return NULL;
+}
+
 struct sbi_irqchip_device *sbi_irqchip_find_device(u32 id)
 {
 	struct sbi_irqchip_device *chip;
diff --git a/lib/utils/irqchip/aplic.c b/lib/utils/irqchip/aplic.c
index ec69c82b..6c63620e 100644
--- a/lib/utils/irqchip/aplic.c
+++ b/lib/utils/irqchip/aplic.c
@@ -307,6 +307,7 @@ int aplic_cold_irqchip_init(struct aplic_data *aplic)
 
 	/* Register irqchip device */
 	aplic->irqchip.id = aplic->unique_id;
+	aplic->irqchip.caps = SBI_IRQCHIP_CAPS_WIRED;
 	aplic->irqchip.num_hwirq = aplic->num_source + 1;
 	rc = sbi_irqchip_add_device(&aplic->irqchip);
 	if (rc)
diff --git a/lib/utils/irqchip/imsic.c b/lib/utils/irqchip/imsic.c
index 521d17fe..0e7f3e6b 100644
--- a/lib/utils/irqchip/imsic.c
+++ b/lib/utils/irqchip/imsic.c
@@ -400,6 +400,7 @@ int imsic_cold_irqchip_init(struct imsic_data *imsic)
 
 	/* Register irqchip device */
 	imsic_device.id = imsic->unique_id;
+	imsic_device.caps = SBI_IRQCHIP_CAPS_MSI;
 	imsic_device.num_hwirq = imsic->num_ids + 1;
 	sbi_hartmask_set_all(&imsic_device.target_harts);
 	rc = sbi_irqchip_add_device(&imsic_device);
-- 
2.43.0




More information about the opensbi mailing list