diff --git a/arch/arc/kernel/smp.c b/arch/arc/kernel/smp.c index 227ca7331f0fec..bc05def7a139b5 100644 --- a/arch/arc/kernel/smp.c +++ b/arch/arc/kernel/smp.c @@ -321,7 +321,7 @@ irqreturn_t do_IPI(int irq, void *dev_id) */ int smp_ipi_irq_setup(int cpu, int irq) { - return request_irq(irq, do_IPI, 0, "IPI Interrupt", NULL); + return request_irq(irq, do_IPI, IRQF_PERCPU, "IPI Interrupt", NULL); } struct cpu cpu_topology[NR_CPUS]; diff --git a/arch/arc/plat-arcfpga/smp.c b/arch/arc/plat-arcfpga/smp.c index 28542575e878c4..9bfa9f8c8aed91 100644 --- a/arch/arc/plat-arcfpga/smp.c +++ b/arch/arc/plat-arcfpga/smp.c @@ -66,7 +66,7 @@ void arc_platform_smp_init_cpu(void) /* Check if CPU is configured for more than 16 interrupts */ if (NR_IRQS <= 16 || get_hw_config_num_irq() <= 16) - BUG(); + panic("[arcfpga] IRQ system can't support IDU IPI\n"); /* Setup the interrupt in IDU */ idu_disable(); @@ -75,8 +75,8 @@ void arc_platform_smp_init_cpu(void) (0x1 << cpu) /* target cpus mask, here single cpu */ ); - idu_irq_set_mode(cpu, /* IDU IRQ assoc with CPU */ - IDU_IRQ_MOD_TCPU_ALLRECP, IDU_IRQ_MODE_PULSE_TRIG); + idu_irq_set_mode(cpu, 7, /* XXX: IDU_IRQ_MOD_TCPU_ALLRECP: ISS bug */ + IDU_IRQ_MODE_PULSE_TRIG); idu_enable();