Merge tag 'irq-urgent-2024-03-17' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 18 Mar 2024 16:10:44 +0000 (09:10 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 18 Mar 2024 16:10:44 +0000 (09:10 -0700)
Pull irq fix from Ingo Molnar:
 "A RISC-V irqchip driver fix"

* tag 'irq-urgent-2024-03-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  irqchip/riscv-intc: Fix use of AIA interrupts 32-63 on riscv32

drivers/irqchip/irq-riscv-intc.c

index f87aeab460eb8bb5419e3c74fdbc8f3034665a2b..9e71c442881412d7eb40bde0cc0e139a41093ff8 100644 (file)
@@ -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++) {
@@ -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;
@@ -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);