]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
MIPS: Make smp CMP, CPS and MT use the new generic IPI functions
authorQais Yousef <qais.yousef@imgtec.com>
Tue, 8 Dec 2015 13:20:28 +0000 (13:20 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 25 Feb 2016 09:56:58 +0000 (10:56 +0100)
This commit does several things to avoid breaking bisectability.

1- Remove IPI init code from irqchip/mips-gic
2- Implement the new irqchip->send_ipi() in irqchip/mips-gic
3- Select GENERIC_IRQ_IPI Kconfig symbol for MIPS_GIC
4- Change MIPS SMP to use the generic IPI implementation

Only the SMP variants that use GIC were converted as it's the only irqchip that
will have the support for generic IPI for now.

Signed-off-by: Qais Yousef <qais.yousef@imgtec.com>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: <jason@lakedaemon.net>
Cc: <marc.zyngier@arm.com>
Cc: <jiang.liu@linux.intel.com>
Cc: <linux-mips@linux-mips.org>
Cc: <lisa.parratt@imgtec.com>
Cc: Qais Yousef <qsyousef@gmail.com>
Link: http://lkml.kernel.org/r/1449580830-23652-18-git-send-email-qais.yousef@imgtec.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/mips/include/asm/smp-ops.h
arch/mips/kernel/smp-cmp.c
arch/mips/kernel/smp-cps.c
arch/mips/kernel/smp-mt.c
drivers/irqchip/Kconfig
drivers/irqchip/irq-mips-gic.c
include/linux/irqchip/mips-gic.h

index 6ba1fb8b11e225683cb32aafa959fdfcc73967c5..db7c322f057f936d9c658498a5e7d397303efb09 100644 (file)
@@ -44,8 +44,9 @@ static inline void plat_smp_setup(void)
        mp_ops->smp_setup();
 }
 
-extern void gic_send_ipi_single(int cpu, unsigned int action);
-extern void gic_send_ipi_mask(const struct cpumask *mask, unsigned int action);
+extern void mips_smp_send_ipi_single(int cpu, unsigned int action);
+extern void mips_smp_send_ipi_mask(const struct cpumask *mask,
+                                     unsigned int action);
 
 #else /* !CONFIG_SMP */
 
index d5e0f949dc480ba5659bc395e2cf5144b0832caf..76923349b4fe16135a97247734a9d803788ae5ca 100644 (file)
@@ -149,8 +149,8 @@ void __init cmp_prepare_cpus(unsigned int max_cpus)
 }
 
 struct plat_smp_ops cmp_smp_ops = {
-       .send_ipi_single        = gic_send_ipi_single,
-       .send_ipi_mask          = gic_send_ipi_mask,
+       .send_ipi_single        = mips_smp_send_ipi_single,
+       .send_ipi_mask          = mips_smp_send_ipi_mask,
        .init_secondary         = cmp_init_secondary,
        .smp_finish             = cmp_smp_finish,
        .boot_secondary         = cmp_boot_secondary,
index 2ad4e4c96d61cb02f8703d46efde1c596649a5df..253e1409338c146706ffb730952fb880c30e5b5d 100644 (file)
@@ -472,8 +472,8 @@ static struct plat_smp_ops cps_smp_ops = {
        .boot_secondary         = cps_boot_secondary,
        .init_secondary         = cps_init_secondary,
        .smp_finish             = cps_smp_finish,
-       .send_ipi_single        = gic_send_ipi_single,
-       .send_ipi_mask          = gic_send_ipi_mask,
+       .send_ipi_single        = mips_smp_send_ipi_single,
+       .send_ipi_mask          = mips_smp_send_ipi_mask,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_disable            = cps_cpu_disable,
        .cpu_die                = cps_cpu_die,
index 86311a164ef1239487e6648e713d347432f750da..4f9570a57e8d8a354f48502f92d2d82b5907e3d3 100644 (file)
@@ -121,7 +121,7 @@ static void vsmp_send_ipi_single(int cpu, unsigned int action)
 
 #ifdef CONFIG_MIPS_GIC
        if (gic_present) {
-               gic_send_ipi_single(cpu, action);
+               mips_smp_send_ipi_single(cpu, action);
                return;
        }
 #endif
index 71e648adc3fde71db5f2b0ac1eeca3dd67eea8e1..00bbec6eca0b24b0af101847c5f887f3ca774ae8 100644 (file)
@@ -209,6 +209,7 @@ config KEYSTONE_IRQ
 
 config MIPS_GIC
        bool
+       select GENERIC_IRQ_IPI
        select IRQ_DOMAIN_HIERARCHY
        select MIPS_CM
 
index 83395bf834c8c650b1e2b086c7bcd5042f9058de..37831a557bcbc0e9d4851900d944097a7fe0e3cb 100644 (file)
@@ -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,
index ce824db48d64c7fd29fc41babb0df6923da0774f..80f89e4a29ac5d714a4cd8e239b408367edd9d37 100644 (file)
@@ -261,9 +261,6 @@ extern void gic_write_compare(cycle_t cnt);
 extern void gic_write_cpu_compare(cycle_t cnt, int cpu);
 extern void gic_start_count(void);
 extern void gic_stop_count(void);
-extern void gic_send_ipi(unsigned int intr);
-extern unsigned int plat_ipi_call_int_xlate(unsigned int);
-extern unsigned int plat_ipi_resched_int_xlate(unsigned int);
 extern int gic_get_c0_compare_int(void);
 extern int gic_get_c0_perfcount_int(void);
 extern int gic_get_c0_fdc_int(void);