Skip to content

Commit

Permalink
irqchip/riscv-intc: Fix use of AIA interrupts 32-63 on riscv32
Browse files Browse the repository at this point in the history
riscv_intc_custom_base is initialized to BITS_PER_LONG, so the second
check passes even though AIA provides 64 interrupts. Adjust the condition to
only check the custom range for interrupts outside the standard range, and
adjust the standard range when AIA is available.

Fixes: 3c46fc5 ("irqchip/riscv-intc: Add support for RISC-V AIA")
Fixes: 678c607 ("irqchip/riscv-intc: Fix low-level interrupt handler setup for AIA")
Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20240312212813.2323841-1-samuel.holland@sifive.com
  • Loading branch information
Samuel Holland authored and Thomas Gleixner committed Mar 15, 2024
1 parent 4527e83 commit ca5b0b7
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions drivers/irqchip/irq-riscv-intc.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,9 @@ static int riscv_intc_domain_alloc(struct irq_domain *domain,
* Only allow hwirq for which we have corresponding standard or
* custom interrupt enable register.
*/
if ((hwirq >= riscv_intc_nr_irqs && hwirq < riscv_intc_custom_base) ||
(hwirq >= riscv_intc_custom_base + riscv_intc_custom_nr_irqs))
if (hwirq >= riscv_intc_nr_irqs &&
(hwirq < riscv_intc_custom_base ||
hwirq >= riscv_intc_custom_base + riscv_intc_custom_nr_irqs))
return -EINVAL;

for (i = 0; i < nr_irqs; i++) {
Expand Down Expand Up @@ -183,10 +184,12 @@ static int __init riscv_intc_init_common(struct fwnode_handle *fn, struct irq_ch
return -ENXIO;
}

if (riscv_isa_extension_available(NULL, SxAIA))
if (riscv_isa_extension_available(NULL, SxAIA)) {
riscv_intc_nr_irqs = 64;
rc = set_handle_irq(&riscv_intc_aia_irq);
else
} else {
rc = set_handle_irq(&riscv_intc_irq);
}
if (rc) {
pr_err("failed to set irq handler\n");
return rc;
Expand All @@ -195,7 +198,7 @@ static int __init riscv_intc_init_common(struct fwnode_handle *fn, struct irq_ch
riscv_set_intc_hwnode_fn(riscv_intc_hwnode);

pr_info("%d local interrupts mapped%s\n",
riscv_isa_extension_available(NULL, SxAIA) ? 64 : riscv_intc_nr_irqs,
riscv_intc_nr_irqs,
riscv_isa_extension_available(NULL, SxAIA) ? " using AIA" : "");
if (riscv_intc_custom_nr_irqs)
pr_info("%d custom local interrupts mapped\n", riscv_intc_custom_nr_irqs);
Expand Down

0 comments on commit ca5b0b7

Please sign in to comment.