From: Johannes Berg <johannes@sipsolutions.net>
To: Paul Mackerras <paulus@samba.org>
Cc: linuxppc-dev@ozlabs.org
Subject: [PATCH] powermac: support G5 CPU hotplug
Date: Wed, 02 May 2007 08:21:12 +0200 [thread overview]
Message-ID: <1178086872.13233.27.camel@johannes.berg> (raw)
In-Reply-To: <17969.56735.644629.328360@cargo.ozlabs.ibm.com>
This patch allows "hotplugging" of CPUs on G5 machines. CPUs that are
disabled are put into an idle loop with the decrementer frequency set
to minimum. To wake them up again we kick them just like when bringing
them up. To stop those CPUs from messing with any global state we stop
them from entering the timer interrupt.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
arch/powerpc/kernel/idle_power4.S | 14 +++++++++----
arch/powerpc/platforms/powermac/setup.c | 34 +++++++++++++++++++++++++++++++-
arch/powerpc/platforms/powermac/smp.c | 12 +++++++++--
include/asm-powerpc/machdep.h | 2 +
4 files changed, 55 insertions(+), 7 deletions(-)
--- wireless-dev.orig/arch/powerpc/platforms/powermac/smp.c 2007-05-02 08:14:47.179192713 +0200
+++ wireless-dev/arch/powerpc/platforms/powermac/smp.c 2007-05-02 08:15:08.619192713 +0200
@@ -900,7 +900,7 @@ void smp_core99_cpu_die(unsigned int cpu
cpu_dead[cpu] = 0;
}
-#endif
+#endif /* CONFIG_HOTPLUG_CPU && CONFIG_PP32 */
/* Core99 Macs (dual G4s and G5s) */
struct smp_ops_t core99_smp_ops = {
@@ -910,8 +910,16 @@ struct smp_ops_t core99_smp_ops = {
.setup_cpu = smp_core99_setup_cpu,
.give_timebase = smp_core99_give_timebase,
.take_timebase = smp_core99_take_timebase,
-#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC32)
+#if defined(CONFIG_HOTPLUG_CPU)
+# if defined(CONFIG_PPC32)
.cpu_disable = smp_core99_cpu_disable,
.cpu_die = smp_core99_cpu_die,
+# endif
+# if defined(CONFIG_PPC64)
+ .cpu_disable = generic_cpu_disable,
+ .cpu_die = generic_cpu_die,
+ /* intentionally do *NOT* assign cpu_enable,
+ * the generic code will use kick_cpu then! */
+# endif
#endif
};
--- wireless-dev.orig/arch/powerpc/platforms/powermac/setup.c 2007-05-02 08:14:47.229192713 +0200
+++ wireless-dev/arch/powerpc/platforms/powermac/setup.c 2007-05-02 08:20:25.049192713 +0200
@@ -444,6 +444,9 @@ static int initializing = 1;
static int pmac_late_init(void)
{
initializing = 0;
+ /* this is udbg (which is __init) and we can later use it during
+ * cpu hotplug (in smp_core99_kick_cpu) */
+ ppc_md.progress = NULL;
return 0;
}
@@ -661,6 +664,35 @@ static int pmac_pci_probe_mode(struct pc
return PCI_PROBE_NORMAL;
return PCI_PROBE_DEVTREE;
}
+
+#ifdef CONFIG_HOTPLUG_CPU
+/* access per cpu vars from generic smp.c */
+DECLARE_PER_CPU(int, cpu_state);
+
+static void pmac_cpu_die(void)
+{
+ /* turn off as much as possible, we'll be
+ * kicked out as this will only be invoked
+ * on core99 platforms for now ... */
+
+ printk(KERN_INFO "CPU#%d offline\n", smp_processor_id());
+ __get_cpu_var(cpu_state) = CPU_DEAD;
+ smp_wmb();
+
+ /* during the path that leads here preemption is disabled,
+ * reenable it now so that when coming up preempt count is
+ * zero correctly */
+ preempt_enable();
+
+ while (1) {
+ /* let's not take timer interrupts too often ... */
+ set_dec(0x7fffffff);
+
+ power4_idle_irqs_softdisabled();
+ }
+}
+#endif
+
#endif
define_machine(powermac) {
@@ -698,6 +730,6 @@ define_machine(powermac) {
.phys_mem_access_prot = pci_phys_mem_access_prot,
#endif
#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC64)
- .cpu_die = generic_mach_cpu_die,
+ .cpu_die = pmac_cpu_die,
#endif
};
--- wireless-dev.orig/arch/powerpc/kernel/idle_power4.S 2007-05-02 08:14:47.259192713 +0200
+++ wireless-dev/arch/powerpc/kernel/idle_power4.S 2007-05-02 08:15:08.619192713 +0200
@@ -19,7 +19,12 @@
.text
+_GLOBAL(power4_idle_irqs_softdisabled)
+ li r6,0
+ b 0f
_GLOBAL(power4_idle)
+ li r6,1
+0:
BEGIN_FTR_SECTION
blr
END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP)
@@ -35,8 +40,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP)
rotldi r0,r0,16
mtmsrd r0,1 /* hard-disable interrupts */
li r0,1
- stb r0,PACASOFTIRQEN(r13) /* we'll hard-enable shortly */
- stb r0,PACAHARDIRQEN(r13)
+ stb r0,PACAHARDIRQEN(r13) /* we'll hard-enable shortly */
+ stb r6,PACASOFTIRQEN(r13) /* set softirqs enabled bit */
BEGIN_FTR_SECTION
DSSALL
sync
@@ -51,5 +56,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
isync
mtmsrd r7
isync
- b 1b
-
+ cmpdi 0,r6,0
+ bne+ 1b /* return for softirq-disabled case */
+ blr
--- wireless-dev.orig/include/asm-powerpc/machdep.h 2007-05-02 08:14:47.329192713 +0200
+++ wireless-dev/include/asm-powerpc/machdep.h 2007-05-02 08:20:02.179192713 +0200
@@ -249,6 +249,8 @@ struct machdep_calls {
extern void power4_idle(void);
extern void ppc6xx_idle(void);
+/* this one is for CPU hotplug (e.g. powermac) */
+extern void power4_idle_irqs_softdisabled(void);
/*
* ppc_md contains a copy of the machine description structure for the
next prev parent reply other threads:[~2007-05-02 8:16 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-27 11:25 patches for 2.6.22 Paul Mackerras
2007-04-27 12:00 ` Johannes Berg
2007-04-27 21:41 ` [PATCH] powerpc: fix suspend states again Johannes Berg
2007-04-27 21:53 ` Olof Johansson
2007-04-27 21:54 ` Johannes Berg
2007-04-27 21:57 ` Olof Johansson
2007-04-27 22:00 ` [PATCH] powerpc: put enable_kernel_spe into a header Johannes Berg
2007-04-27 22:02 ` [PATCH v2] powerpc: fix suspend states again Johannes Berg
2007-04-27 23:13 ` Olof Johansson
2007-04-30 0:14 ` Paul Mackerras
2007-04-30 11:35 ` Johannes Berg
2007-04-30 11:37 ` [PATCH v3] " Johannes Berg
2007-05-01 14:16 ` Johannes Berg
2007-04-27 23:42 ` patches for 2.6.22 Arnd Bergmann
2007-04-28 2:49 ` [PATCH] cell: cbe_cpufreq cleanup and crash fix Arnd Bergmann
2007-04-28 7:49 ` [PATCH] powermac: proper sleep management Johannes Berg
2007-04-28 8:08 ` Paul Mackerras
2007-04-28 12:52 ` Johannes Berg
2007-04-28 8:38 ` Benjamin Herrenschmidt
2007-04-28 12:51 ` Johannes Berg
2007-04-28 12:01 ` Paul Mackerras
2007-04-28 13:46 ` Johannes Berg
2007-04-30 5:31 ` Paul Mackerras
2007-04-30 12:08 ` Johannes Berg
2007-05-01 12:14 ` Paul Mackerras
2007-05-01 12:24 ` Johannes Berg
2007-04-30 11:44 ` [PATCH v3] " Johannes Berg
2007-05-01 8:55 ` Johannes Berg
2007-04-30 19:51 ` patches for 2.6.22 Kim Phillips
2007-05-01 3:38 ` Paul Mackerras
2007-05-02 14:12 ` Kumar Gala
2007-05-02 14:19 ` Kim Phillips
2007-05-01 9:06 ` Johannes Berg
2007-05-02 5:33 ` [PATCH] adb: replace sleep notifier with platform driver suspend/resume hooks Johannes Berg
2007-05-02 5:34 ` [PATCH] apm_emu: use generic apm-emulation Johannes Berg
2007-05-02 5:36 ` [PATCH] via-pmu: remove LED sleep notifier Johannes Berg
2007-05-02 10:57 ` Stephen Rothwell
2007-05-02 14:32 ` [PATCH v2] " Johannes Berg
2007-05-07 8:47 ` Paul Mackerras
2007-05-07 8:58 ` Johannes Berg
2007-05-07 15:08 ` [PATCH v3] " Johannes Berg
2007-05-02 5:39 ` [PATCH] remove awacs dmasound Johannes Berg
2007-05-02 6:18 ` [PATCH] via-pmu: kill sleep notifiers completely Johannes Berg
2007-05-02 6:21 ` Johannes Berg [this message]
2007-05-02 10:55 ` [PATCH] powermac: support G5 CPU hotplug Paul Mackerras
2007-05-02 14:33 ` Johannes Berg
2007-05-02 17:57 ` Segher Boessenkool
2007-05-02 22:03 ` Benjamin Herrenschmidt
2007-05-02 23:47 ` Segher Boessenkool
2007-05-02 23:59 ` Benjamin Herrenschmidt
2007-05-03 0:05 ` Segher Boessenkool
2007-05-03 0:18 ` Benjamin Herrenschmidt
2007-05-03 0:01 ` Paul Mackerras
2007-05-03 0:08 ` Benjamin Herrenschmidt
2007-05-03 0:10 ` Benjamin Herrenschmidt
2007-05-03 0:19 ` Segher Boessenkool
2007-05-03 0:17 ` Segher Boessenkool
2007-05-03 0:21 ` Benjamin Herrenschmidt
2007-05-03 0:24 ` Benjamin Herrenschmidt
2007-05-03 1:01 ` Segher Boessenkool
2007-05-03 2:11 ` Benjamin Herrenschmidt
2007-05-03 16:49 ` Segher Boessenkool
2007-05-02 20:33 ` [PATCH v2] " Johannes Berg
2007-05-02 6:33 ` [PATCH] powerpc: MPIC sys_device & suspend/resume Johannes Berg
2007-05-02 6:35 ` [PATCH] powermac: fix G5-cpufreq for cpu on/offline Johannes Berg
2007-05-03 12:25 ` patches for 2.6.22 Johannes Berg
2007-05-03 12:28 ` [PATCH] powerpc: dart iommu suspend Johannes Berg
2007-05-03 12:30 ` Benjamin Herrenschmidt
2007-05-03 12:34 ` Johannes Berg
2007-05-03 12:34 ` Benjamin Herrenschmidt
2007-05-03 12:48 ` Johannes Berg
2007-05-03 14:24 ` Olof Johansson
2007-05-04 10:51 ` Johannes Berg
2007-05-03 12:29 ` [PATCH] powerpc: mark pages that don't exist as nosave Johannes Berg
2007-05-03 12:31 ` [PATCH] powermac: suspend to disk on G5 Johannes Berg
2007-07-17 13:28 ` [PATCH] remove awacs dmasound Johannes Berg
2007-07-17 13:37 ` Adrian Bunk
2007-07-17 13:43 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1178086872.13233.27.camel@johannes.berg \
--to=johannes@sipsolutions.net \
--cc=linuxppc-dev@ozlabs.org \
--cc=paulus@samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).