asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) { u32 irqstat, irqnr; do { irqstat = readl_relaxed(gic_cpu_base_addr + GIC_CPU_INTACK); irqnr = irqstat & 0x3ff; if (irqnr == 1023) break; if (irqnr > 29 && irqnr < 1021) handle_IRQ(irqnr, regs); #ifdef CONFIG_SMP else if (irqnr < 16) { writel_relaxed(irqstat, gic_cpu_base_addr + GIC_CPU_EOI); handle_IPI(irqnr, regs); } #endif #ifdef CONFIG_LOCAL_TIMERS else if (irqnr == 29) { writel_relaxed(irqstat, gic_cpu_base_addr + GIC_CPU_EOI); handle_local_timer(regs); } #endif } while (1); }
static void __exception_irq_entry bcm2836_arm_irqchip_handle_irq(struct pt_regs *regs) { int cpu = smp_processor_id(); u32 stat; stat = readl_relaxed(intc.base + LOCAL_IRQ_PENDING0 + 4 * cpu); if (stat & BIT(LOCAL_IRQ_MAILBOX0)) { #ifdef CONFIG_SMP void __iomem *mailbox0 = (intc.base + LOCAL_MAILBOX0_CLR0 + 16 * cpu); u32 mbox_val = readl(mailbox0); u32 ipi = ffs(mbox_val) - 1; writel(1 << ipi, mailbox0); handle_IPI(ipi, regs); #endif } else if (stat) { u32 hwirq = ffs(stat) - 1; handle_domain_irq(intc.domain, hwirq, regs); } }