diff options
| author | Pawandeep Oza <[email protected]> | 2026-07-21 14:48:26 -0700 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2026-07-22 13:08:13 +0530 |
| commit | 759910326c3ac4cf9d42133fc1399d519037eae1 (patch) | |
| tree | f691b7839b04c18e862895bf398e67dfeb8808e3 /include | |
| parent | 5ee055944559e0823c020222a05e5cac48e0c110 (diff) | |
lib: utils/irqchip/aplic: add MSI mode support with IMSIC parent linking
Add parent_unique_id fields to struct aplic_data for
IMSIC parent linking in MSI mode. Store parent IMSIC unique_id
during FDT parsing of the APLIC node.
Add aplic_is_msi_mode() complementing aplic_is_direct_mode() to
consolidate delivery mode detection. Add APLIC_TARGET_EIID() macro
for packing the EIID field into the TARGET register.
Add parent_unique_id and parent_irq_map fields to struct aplic_data.
parent_unique_id identifies the upstream IMSIC irqchip device resolved
via sbi_irqchip_find_device() during hwirq_setup. parent_irq_map is
a per-source array allocated at cold init time to track the EIID
assigned by the IMSIC for each APLIC source.
Restore aplic_writel_msicfg() and re-introduce MSI address register
programming in aplic_init(), gated on aplic_is_msi_mode(). Set the
DOMAINCFG_DM bit to switch the hardware to MSI delivery mode when
no IDC structures are present.
Add aplic_program_msi_target() to pack hart_index, guest_index, and
EIID into the APLIC_TARGET register. Add aplic_write_msi() as the
sbi_irqchip write_msi callback that extracts EIID and hart_index from
the MSI message and calls aplic_program_msi_target(). Add
aplic_msi_callback() as the MSI receive callback that dispatches to
sbi_irqchip_process_hwirq() on the APLIC chip.
Extend aplic_hwirq_setup() with an MSI path that resolves the parent
IMSIC chip by parent_unique_id, registers an MSI route via
sbi_irqchip_register_msi(), and stores the allocated EIID in
parent_irq_map for the source being configured.
Extend aplic_hwirq_set_affinity() with an MSI path that delegates
affinity reprogramming to the parent IMSIC chip via
sbi_irqchip_set_affinity() using the stored parent_irq_map entry.
Guard warm_init, process_hwirqs, and hwirq_eoi with early returns in
MSI mode as interrupt delivery and acknowledgement are handled by the
IMSIC in that configuration.
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]>
Diffstat (limited to 'include')
| -rw-r--r-- | include/sbi/sbi_irqchip.h | 6 | ||||
| -rw-r--r-- | include/sbi_utils/irqchip/aplic.h | 1 |
2 files changed, 7 insertions, 0 deletions
diff --git a/include/sbi/sbi_irqchip.h b/include/sbi/sbi_irqchip.h index e778d747..ea012635 100644 --- a/include/sbi/sbi_irqchip.h +++ b/include/sbi/sbi_irqchip.h @@ -107,6 +107,12 @@ int sbi_irqchip_unmask_hwirq(struct sbi_irqchip_device *chip, u32 hwirq); /** Mask a hardware interrupt */ int sbi_irqchip_mask_hwirq(struct sbi_irqchip_device *chip, u32 hwirq); +/** Helper to set private data in sbi_irqchip_hwirq_data */ +int sbi_irqchip_set_hwirq_priv(struct sbi_irqchip_device *chip, u32 hwirq, void *priv); + +/** Helper to retrieve data from sbi_irqchip_hwirq_data */ +void *sbi_irqchip_get_hwirq_priv(struct sbi_irqchip_device *chip, u32 hwirq); + /** Default raw hardware interrupt handler */ int sbi_irqchip_raw_handler_default(struct sbi_irqchip_device *chip, u32 hwirq); diff --git a/include/sbi_utils/irqchip/aplic.h b/include/sbi_utils/irqchip/aplic.h index 3461d1c7..8d6d871e 100644 --- a/include/sbi_utils/irqchip/aplic.h +++ b/include/sbi_utils/irqchip/aplic.h @@ -36,6 +36,7 @@ struct aplic_data { struct sbi_dlist node; /* Public members */ u32 unique_id; + u32 parent_unique_id; unsigned long addr; unsigned long size; unsigned long num_idc; |
