mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-07-27 00:11:30 +01:00
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 <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721214833.687361-4-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
committed by
Anup Patel
parent
759910326c
commit
22139b889d
@@ -12,6 +12,7 @@
|
|||||||
#define __IRQCHIP_IMSIC_H__
|
#define __IRQCHIP_IMSIC_H__
|
||||||
|
|
||||||
#include <sbi/sbi_types.h>
|
#include <sbi/sbi_types.h>
|
||||||
|
#include <sbi/sbi_irqchip.h>
|
||||||
|
|
||||||
#define IMSIC_MMIO_PAGE_SHIFT 12
|
#define IMSIC_MMIO_PAGE_SHIFT 12
|
||||||
#define IMSIC_MMIO_PAGE_SZ (1UL << IMSIC_MMIO_PAGE_SHIFT)
|
#define IMSIC_MMIO_PAGE_SZ (1UL << IMSIC_MMIO_PAGE_SHIFT)
|
||||||
@@ -24,6 +25,7 @@ struct imsic_regs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct imsic_data {
|
struct imsic_data {
|
||||||
|
struct sbi_irqchip_device irqchip;
|
||||||
u32 unique_id;
|
u32 unique_id;
|
||||||
bool targets_mmode;
|
bool targets_mmode;
|
||||||
u32 guest_index_bits;
|
u32 guest_index_bits;
|
||||||
|
|||||||
@@ -149,8 +149,13 @@ int imsic_get_target_file(u32 hartindex)
|
|||||||
|
|
||||||
static int imsic_process_hwirqs(struct sbi_irqchip_device *chip)
|
static int imsic_process_hwirqs(struct sbi_irqchip_device *chip)
|
||||||
{
|
{
|
||||||
|
struct imsic_data *imsic;
|
||||||
ulong mirq;
|
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))) {
|
while ((mirq = csr_swap(CSR_MTOPEI, 0))) {
|
||||||
mirq = (mirq >> IMSIC_TOPEI_ID_SHIFT);
|
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)
|
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 */
|
/* Sanity checks */
|
||||||
if (!imsic || !imsic->targets_mmode)
|
if (!hart_imsic || hart_imsic != imsic ||
|
||||||
|
!hart_imsic->targets_mmode)
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
|
||||||
/* Disable all interrupts */
|
/* Disable all interrupts */
|
||||||
@@ -399,16 +409,17 @@ int imsic_cold_irqchip_init(struct imsic_data *imsic)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Register irqchip device */
|
/* 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.caps = SBI_IRQCHIP_CAPS_MSI;
|
||||||
imsic_device.num_hwirq = imsic->num_ids + 1;
|
imsic->irqchip.num_hwirq = imsic->num_ids + 1;
|
||||||
sbi_hartmask_set_all(&imsic_device.target_harts);
|
sbi_hartmask_set_all(&imsic->irqchip.target_harts);
|
||||||
rc = sbi_irqchip_add_device(&imsic_device);
|
rc = sbi_irqchip_add_device(&imsic->irqchip);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
/* Mark hwirq 0 and IPI hwirq as reserved */
|
/* 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)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user