powerpc: Add kconfig for muxed smp ipi support
authorMilton Miller <miltonm@bga.com>
Tue, 10 May 2011 19:29:42 +0000 (19:29 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 19 May 2011 05:31:05 +0000 (15:31 +1000)
Compile the new smp ipi mux and demux code only if a platform
will make use of it.  The new config is selected as required.

The new cause_ipi smp op is only available conditionally to point out
configs where the select is required; this makes setting the op an
immediate fail instead of a deferred unresolved symbol at link.

This also creates a new config for power surge powermac upgrade support
that can be disabled in expert mode but is default on.

I also removed the depends / default y on CONFIG_XICS since it is selected
by PSERIES.

Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/smp.h
arch/powerpc/kernel/smp.c
arch/powerpc/platforms/Kconfig
arch/powerpc/platforms/Kconfig.cputype
arch/powerpc/platforms/iseries/Kconfig
arch/powerpc/platforms/powermac/Kconfig
arch/powerpc/platforms/powermac/pic.c
arch/powerpc/platforms/powermac/smp.c
arch/powerpc/sysdev/xics/Kconfig

index 26f861560c512297c87f91babd0eaeb1ecda69a2..880b8c1e6e537d0ee451d253894e96a123bd4a57 100644 (file)
@@ -38,7 +38,9 @@ extern void cpu_die(void);
 
 struct smp_ops_t {
        void  (*message_pass)(int cpu, int msg);
+#ifdef CONFIG_PPC_SMP_MUXED_IPI
        void  (*cause_ipi)(int cpu, unsigned long data);
+#endif
        int   (*probe)(void);
        int   (*kick_cpu)(int nr);
        void  (*setup_cpu)(int nr);
index fa8e8700064bca3ca471a2d628a362be0d6cfe96..d76f7d7929be1bd204472251449fcaa8e84f68dc 100644 (file)
@@ -178,6 +178,7 @@ int smp_request_message_ipi(int virq, int msg)
        return err;
 }
 
+#ifdef CONFIG_PPC_SMP_MUXED_IPI
 struct cpu_messages {
        unsigned long messages;         /* current messages bits */
        unsigned long data;             /* data for cause ipi */
@@ -230,6 +231,7 @@ irqreturn_t smp_ipi_demux(void)
        }
        return IRQ_HANDLED;
 }
+#endif /* CONFIG_PPC_SMP_MUXED_IPI */
 
 void smp_send_reschedule(int cpu)
 {
index 6059053e71582398052c5e6800e55375cb54f120..83c704a637bb577ab99a938043b535186e71e9f0 100644 (file)
@@ -57,6 +57,14 @@ config UDBG_RTAS_CONSOLE
        depends on PPC_RTAS
        default n
 
+config PPC_SMP_MUXED_IPI
+       bool
+       help
+         Select this opton if your platform supports SMP and your
+         interrupt controller provides less than 4 interrupts to each
+         cpu.  This will enable the generic code to multiplex the 4
+         messages on to one ipi.
+
 config PPC_UDBG_BEAT
        bool "BEAT based debug console"
        depends on PPC_CELLEB
index a1e623822a30c630a1aec527ca260c8029e4bbdd..2165b65876f9e9c70d9495377da92c5f13a4aa3e 100644 (file)
@@ -73,6 +73,7 @@ config PPC_BOOK3S_64
 config PPC_BOOK3E_64
        bool "Embedded processors"
        select PPC_FPU # Make it a choice ?
+       select PPC_SMP_MUXED_IPI
 
 endchoice
 
@@ -178,6 +179,7 @@ config FSL_BOOKE
 config PPC_FSL_BOOK3E
        bool
        select FSL_EMB_PERFMON
+       select PPC_SMP_MUXED_IPI
        default y if FSL_BOOKE
 
 config PTE_64BIT
index ea1d3622b41c13a96d1c14525909a7fffd21b0c8..b57cda3a0817098953e64ff63427f25891462dae 100644 (file)
@@ -1,6 +1,7 @@
 config PPC_ISERIES
        bool "IBM Legacy iSeries"
        depends on PPC64 && PPC_BOOK3S
+       select PPC_SMP_MUXED_IPI
        select PPC_INDIRECT_PIO
        select PPC_INDIRECT_MMIO
        select PPC_PCI_CHOICE if EXPERT
index 1e1a0873e1ddfe47c6427ebddecb024e17054291..1afd10f678585e85cae3b02192a0fc23b5d551bc 100644 (file)
@@ -18,4 +18,13 @@ config PPC_PMAC64
        select PPC_970_NAP
        default y
 
-
+config PPC_PMAC32_PSURGE
+       bool "Support for powersurge upgrade cards" if EXPERT
+       depends on SMP && PPC32 && PPC_PMAC
+       select PPC_SMP_MUXED_IPI
+       default y
+       help
+         The powersurge cpu boards can be used in the generation
+         of powermacs that have a socket for an upgradeable cpu card,
+         including the 7500, 8500, 9500, 9600.  Support exists for
+         both dual and quad socket upgrade cards.
index 2f34ad04029f14660774d727c04833cedcdfc326..b706cb3ad99c91ae7bbcfe91a123be5a20f3d158 100644 (file)
@@ -239,7 +239,7 @@ static unsigned int pmac_pic_get_irq(void)
        unsigned long bits = 0;
        unsigned long flags;
 
-#ifdef CONFIG_SMP
+#ifdef CONFIG_PPC_PMAC32_PSURGE
        void psurge_smp_message_recv(void);
 
                /* IPI's are a hack on the powersurge -- Cort */
@@ -247,7 +247,7 @@ static unsigned int pmac_pic_get_irq(void)
                psurge_smp_message_recv();
                return NO_IRQ_IGNORE;   /* ignore, already handled */
         }
-#endif /* CONFIG_SMP */
+#endif /* CONFIG_PPC_PMAC32_PSURGE */
        raw_spin_lock_irqsave(&pmac_pic_lock, flags);
        for (irq = max_real_irqs; (irq -= 32) >= 0; ) {
                int i = irq >> 5;
index a3401071abfbf7a3831e30e775fb47604cef2a07..67b6e1432be2a15c26152079e31b6b2e99b2d380 100644 (file)
@@ -70,7 +70,7 @@ static void (*pmac_tb_freeze)(int freeze);
 static u64 timebase;
 static int tb_req;
 
-#ifdef CONFIG_PPC32
+#ifdef CONFIG_PPC_PMAC32_PSURGE
 
 /*
  * Powersurge (old powermac SMP) support.
@@ -420,7 +420,7 @@ struct smp_ops_t psurge_smp_ops = {
        .give_timebase  = smp_psurge_give_timebase,
        .take_timebase  = smp_psurge_take_timebase,
 };
-#endif /* CONFIG_PPC32 - actually powersurge support */
+#endif /* CONFIG_PPC_PMAC32_PSURGE */
 
 /*
  * Core 99 and later support
@@ -980,7 +980,7 @@ void __init pmac_setup_smp(void)
                of_node_put(np);
                smp_ops = &core99_smp_ops;
        }
-#ifdef CONFIG_PPC32
+#ifdef CONFIG_PPC_PMAC32_PSURGE
        else {
                /* We have to set bits in cpu_possible_mask here since the
                 * secondary CPU(s) aren't in the device tree. Various
@@ -993,7 +993,7 @@ void __init pmac_setup_smp(void)
                        set_cpu_possible(cpu, true);
                smp_ops = &psurge_smp_ops;
        }
-#endif /* CONFIG_PPC32 */
+#endif /* CONFIG_PPC_PMAC32_PSURGE */
 
 #ifdef CONFIG_HOTPLUG_CPU
        ppc_md.cpu_die = pmac_cpu_die;
index 123b8ddf281635d09da0705afc1d68cdb4edb0e0..0031eda320c3de7d94e3d9198b0cbc9087a7aec4 100644 (file)
@@ -1,5 +1,6 @@
 config PPC_XICS
        def_bool n
+       select PPC_SMP_MUXED_IPI
 
 config PPC_ICP_NATIVE
        def_bool n