[PATCH v2 3/6] lib: utils/irqchip/imsic: embed sbi_irqchip_device in imsic data
Anup Patel
anup.patel at oss.qualcomm.com
Wed Jul 8 21:29:49 PDT 2026
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
> 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