[PATCH v2 3/6] lib: utils/irqchip/imsic: embed sbi_irqchip_device in imsic data
Pawandeep Oza
pawandeep.oza at oss.qualcomm.com
Sat Jul 11 12:12:04 PDT 2026
On Wed, Jul 8, 2026 at 9:30 PM Anup Patel <anup.patel at oss.qualcomm.com> wrote:
>
> On Thu, Jun 18, 2026 at 12:16 AM Pawandeep Oza
> <pawandeep.oza at oss.qualcomm.com> wrote:
> >
> > 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 <pawandeep.oza at oss.qualcomm.com>
> > ---
> > include/sbi_utils/irqchip/imsic.h | 2 ++
> > 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..1910b62a 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)
> > @@ -25,6 +26,7 @@ struct imsic_regs {
> >
> > struct imsic_data {
> > u32 unique_id;
> > + struct sbi_irqchip_device irqchip;
>
> Minor nit: make this as first member of struct imsic_data
Oza: sure
>
> > bool targets_mmode;
> > u32 guest_index_bits;
> > u32 hart_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;
> >
> > --
> > 2.43.0
> >
> >
> > --
> > opensbi mailing list
> > opensbi at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/opensbi
>
> Otherwise, this looks good to me.
>
> Reviewed-by: Anup Patel <anup at brainfault.org>
>
> Thanks,
> Anup
More information about the opensbi
mailing list