lib: sbi_irqchip: Allow registering interrupt handlers

To handle external interrupts in M-mode, the sbi_irqchip framework
must allow registering interrupt handlers from device drivers.

Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20260213055342.3124872-9-anup.patel@oss.qualcomm.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Anup Patel
2026-02-13 11:23:42 +05:30
committed by Anup Patel
parent e8ebd1fbc6
commit 0ab0c470d5
5 changed files with 267 additions and 3 deletions

View File

@@ -307,6 +307,7 @@ int aplic_cold_irqchip_init(struct aplic_data *aplic)
/* Register irqchip device */
aplic->irqchip.id = aplic->unique_id;
aplic->irqchip.num_hwirq = aplic->num_source + 1;
rc = sbi_irqchip_add_device(&aplic->irqchip);
if (rc)
return rc;

View File

@@ -346,9 +346,17 @@ int imsic_data_check(struct imsic_data *imsic)
return 0;
}
static int imsic_hwirq_setup(struct sbi_irqchip_device *chip, u32 hwirq)
{
if (!hwirq || hwirq == IMSIC_IPI_ID)
return SBI_ENOTSUPP;
return 0;
}
static struct sbi_irqchip_device imsic_device = {
.warm_init = imsic_warm_irqchip_init,
.process_hwirqs = imsic_process_hwirqs,
.hwirq_setup = imsic_hwirq_setup,
};
int imsic_cold_irqchip_init(struct imsic_data *imsic)
@@ -392,6 +400,7 @@ int imsic_cold_irqchip_init(struct imsic_data *imsic)
/* Register irqchip device */
imsic_device.id = imsic->unique_id;
imsic_device.num_hwirq = imsic->num_ids + 1;
sbi_hartmask_set_all(&imsic_device.target_harts);
rc = sbi_irqchip_add_device(&imsic_device);
if (rc)

View File

@@ -281,6 +281,7 @@ int plic_cold_irqchip_init(struct plic_data *plic)
/* Register irqchip device */
plic->irqchip.id = plic->unique_id;
plic->irqchip.num_hwirq = plic->num_src + 1;
plic->irqchip.warm_init = plic_warm_irqchip_init;
return sbi_irqchip_add_device(&plic->irqchip);
}