diff options
| author | Pawandeep Oza <[email protected]> | 2026-07-21 14:48:27 -0700 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2026-07-22 13:08:15 +0530 |
| commit | 22139b889dfeaa98d4b3f1abe4fd0b7c96f11b26 (patch) | |
| tree | 2c2635f614b896c0153923971be375b7f4420721 | |
| parent | 759910326c3ac4cf9d42133fc1399d519037eae1 (diff) | |
lib: utils/irqchip/imsic: embed sbi_irqchip_device in imsic data
Embed sbi_irqchip_device in struct imsic_data to enable instance-based
irqchip registration, replacing the previous global imsic_device
singleton. Include sbi_irqchip.h from imsic.h to make the embedded
struct visible to consumers.
Signed-off-by: Oza Pawandeep <[email protected]>
Reviewed-by: Anup Patel <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Anup Patel <[email protected]>
| -rw-r--r-- | include/sbi_utils/irqchip/imsic.h | 2 | ||||
| -rw-r--r-- | lib/utils/irqchip/imsic.c | 25 |
2 files changed, 20 insertions, 7 deletions
diff --git a/include/sbi_utils/irqchip/imsic.h b/include/sbi_utils/irqchip/imsic.h index 88dd3cfb..ffb62d35 100644 --- a/include/sbi_utils/irqchip/imsic.h +++ b/include/sbi_utils/irqchip/imsic.h @@ -12,6 +12,7 @@ #define __IRQCHIP_IMSIC_H__ #include <sbi/sbi_types.h> +#include <sbi/sbi_irqchip.h> #define IMSIC_MMIO_PAGE_SHIFT 12 #define IMSIC_MMIO_PAGE_SZ (1UL << IMSIC_MMIO_PAGE_SHIFT) @@ -24,6 +25,7 @@ struct imsic_regs { }; struct imsic_data { + struct sbi_irqchip_device irqchip; u32 unique_id; bool targets_mmode; u32 guest_index_bits; diff --git a/lib/utils/irqchip/imsic.c b/lib/utils/irqchip/imsic.c index 0e7f3e6b..2abdc8ef 100644 --- a/lib/utils/irqchip/imsic.c +++ b/lib/utils/irqchip/imsic.c @@ -149,8 +149,13 @@ int imsic_get_target_file(u32 hartindex) static int imsic_process_hwirqs(struct sbi_irqchip_device *chip) { + struct imsic_data *imsic; ulong mirq; + imsic = container_of(chip, struct imsic_data, irqchip); + if (!imsic || !imsic->targets_mmode) + return SBI_EINVAL; + while ((mirq = csr_swap(CSR_MTOPEI, 0))) { mirq = (mirq >> IMSIC_TOPEI_ID_SHIFT); @@ -258,10 +263,15 @@ void imsic_local_irqchip_init(void) static int imsic_warm_irqchip_init(struct sbi_irqchip_device *dev) { - struct imsic_data *imsic = imsic_get_data(current_hartindex()); + struct imsic_data *imsic; + struct imsic_data *hart_imsic; + + imsic = container_of(dev, struct imsic_data, irqchip); + hart_imsic = imsic_get_data(current_hartindex()); /* Sanity checks */ - if (!imsic || !imsic->targets_mmode) + if (!hart_imsic || hart_imsic != imsic || + !hart_imsic->targets_mmode) return SBI_EINVAL; /* Disable all interrupts */ @@ -399,16 +409,17 @@ int imsic_cold_irqchip_init(struct imsic_data *imsic) } /* Register irqchip device */ - imsic_device.id = imsic->unique_id; + imsic->irqchip = imsic_device; + imsic->irqchip.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); + imsic->irqchip.num_hwirq = imsic->num_ids + 1; + sbi_hartmask_set_all(&imsic->irqchip.target_harts); + rc = sbi_irqchip_add_device(&imsic->irqchip); if (rc) return rc; /* Mark hwirq 0 and IPI hwirq as reserved */ - rc = sbi_irqchip_register_reserved(&imsic_device, 0, IMSIC_IPI_ID + 1); + rc = sbi_irqchip_register_reserved(&imsic->irqchip, 0, IMSIC_IPI_ID + 1); if (rc) return rc; |
