|
@@ -280,9 +280,11 @@ static void gic_bind_eic_interrupt(int irq, int set)
|
|
|
GIC_VPE_EIC_SS(irq), set);
|
|
|
}
|
|
|
|
|
|
-void gic_send_ipi(unsigned int intr)
|
|
|
+static void gic_send_ipi(struct irq_data *d, unsigned int cpu)
|
|
|
{
|
|
|
- gic_write(GIC_REG(SHARED, GIC_SH_WEDGE), GIC_SH_WEDGE_SET(intr));
|
|
|
+ irq_hw_number_t hwirq = GIC_HWIRQ_TO_SHARED(irqd_to_hwirq(d));
|
|
|
+
|
|
|
+ gic_write(GIC_REG(SHARED, GIC_SH_WEDGE), GIC_SH_WEDGE_SET(hwirq));
|
|
|
}
|
|
|
|
|
|
int gic_get_c0_compare_int(void)
|
|
@@ -495,6 +497,7 @@ static struct irq_chip gic_edge_irq_controller = {
|
|
|
#ifdef CONFIG_SMP
|
|
|
.irq_set_affinity = gic_set_affinity,
|
|
|
#endif
|
|
|
+ .ipi_send_single = gic_send_ipi,
|
|
|
};
|
|
|
|
|
|
static void gic_handle_local_int(bool chained)
|
|
@@ -588,83 +591,6 @@ static void gic_irq_dispatch(struct irq_desc *desc)
|
|
|
gic_handle_shared_int(true);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_MIPS_GIC_IPI
|
|
|
-static int gic_resched_int_base;
|
|
|
-static int gic_call_int_base;
|
|
|
-
|
|
|
-unsigned int plat_ipi_resched_int_xlate(unsigned int cpu)
|
|
|
-{
|
|
|
- return gic_resched_int_base + cpu;
|
|
|
-}
|
|
|
-
|
|
|
-unsigned int plat_ipi_call_int_xlate(unsigned int cpu)
|
|
|
-{
|
|
|
- return gic_call_int_base + cpu;
|
|
|
-}
|
|
|
-
|
|
|
-static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
|
|
|
-{
|
|
|
- scheduler_ipi();
|
|
|
-
|
|
|
- return IRQ_HANDLED;
|
|
|
-}
|
|
|
-
|
|
|
-static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
|
|
|
-{
|
|
|
- generic_smp_call_function_interrupt();
|
|
|
-
|
|
|
- return IRQ_HANDLED;
|
|
|
-}
|
|
|
-
|
|
|
-static struct irqaction irq_resched = {
|
|
|
- .handler = ipi_resched_interrupt,
|
|
|
- .flags = IRQF_PERCPU,
|
|
|
- .name = "IPI resched"
|
|
|
-};
|
|
|
-
|
|
|
-static struct irqaction irq_call = {
|
|
|
- .handler = ipi_call_interrupt,
|
|
|
- .flags = IRQF_PERCPU,
|
|
|
- .name = "IPI call"
|
|
|
-};
|
|
|
-
|
|
|
-static __init void gic_ipi_init_one(unsigned int intr, int cpu,
|
|
|
- struct irqaction *action)
|
|
|
-{
|
|
|
- int virq = irq_create_mapping(gic_irq_domain,
|
|
|
- GIC_SHARED_TO_HWIRQ(intr));
|
|
|
- int i;
|
|
|
-
|
|
|
- gic_map_to_vpe(intr, mips_cm_vp_id(cpu));
|
|
|
- for (i = 0; i < NR_CPUS; i++)
|
|
|
- clear_bit(intr, pcpu_masks[i].pcpu_mask);
|
|
|
- set_bit(intr, pcpu_masks[cpu].pcpu_mask);
|
|
|
-
|
|
|
- irq_set_irq_type(virq, IRQ_TYPE_EDGE_RISING);
|
|
|
-
|
|
|
- irq_set_handler(virq, handle_percpu_irq);
|
|
|
- setup_irq(virq, action);
|
|
|
-}
|
|
|
-
|
|
|
-static __init void gic_ipi_init(void)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- /* Use last 2 * NR_CPUS interrupts as IPIs */
|
|
|
- gic_resched_int_base = gic_shared_intrs - nr_cpu_ids;
|
|
|
- gic_call_int_base = gic_resched_int_base - nr_cpu_ids;
|
|
|
-
|
|
|
- for (i = 0; i < nr_cpu_ids; i++) {
|
|
|
- gic_ipi_init_one(gic_call_int_base + i, i, &irq_call);
|
|
|
- gic_ipi_init_one(gic_resched_int_base + i, i, &irq_resched);
|
|
|
- }
|
|
|
-}
|
|
|
-#else
|
|
|
-static inline void gic_ipi_init(void)
|
|
|
-{
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
static void __init gic_basic_init(void)
|
|
|
{
|
|
|
unsigned int i;
|
|
@@ -1105,8 +1031,6 @@ static void __init __gic_init(unsigned long gic_base_addr,
|
|
|
bitmap_set(ipi_resrv, gic_shared_intrs - 2 * gic_vpes, 2 * gic_vpes);
|
|
|
|
|
|
gic_basic_init();
|
|
|
-
|
|
|
- gic_ipi_init();
|
|
|
}
|
|
|
|
|
|
void __init gic_init(unsigned long gic_base_addr,
|