From: Johannes Berg <johannes@sipsolutions.net>
To: Paul Mackerras <paulus@samba.org>
Cc: linuxppc-dev@ozlabs.org
Subject: [PATCH] powerpc: fix suspend states again
Date: Fri, 27 Apr 2007 23:41:35 +0200 [thread overview]
Message-ID: <1177710095.3565.64.camel@johannes.berg> (raw)
In-Reply-To: <17969.56735.644629.328360@cargo.ozlabs.ibm.com>
In commit 0fba3a1f39f8b0a50b56c8b068fa52131cbc84c2 (a very long time ago,
May 2006), I fixed a bug that caused powermacs to crash when you tried
entering standby/mem suspend states.
As I'm now getting more familiar with the suspend code I notice a few
more things:
1. we previously misunderstood what pm_ops is for, it isn't supposed to be
for doing platform dependent suspend/resume stuff that needs to be done
for suspend to disk (as we currently try to use it!), it is instead for
entering platform dependent suspend states ("standby", "mem").
2. due to the first point, we never properly save FPU and altivec states
when suspending to disk. It probably hasn't hurt yet because the process
that writes the "disk" to /sys/power/state uses neither and its context
is used.
This patch addresses these points as follows:
1. remove all pm_ops from powermac, powermac suspend to ram isn't currently
usable via /sys/power/state but is done via the PMU instead.
2. move the code responsible for storing FPU/altivec state into
save_processor_state and the set_context() call to restore_processor_state.
3. add a call to kernel_enable_spe()
It may look like there is some code removal missing but that is actually because
the new suspend.h file overrides the ppc/suspend.h one which was previously used.
A follow-on patch will create new pm_ops for via-pmu.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
Ben's acked-by can be found at
http://thread.gmane.org/gmane.linux.ports.ppc64.devel/17441/focus=17467,
I just reworded the description slightly since then.
arch/powerpc/kernel/Makefile | 1
arch/powerpc/kernel/swsusp.c | 42 ++++++++++++++++++++
arch/powerpc/platforms/powermac/setup.c | 65 --------------------------------
include/asm-powerpc/suspend.h | 9 ++++
4 files changed, 52 insertions(+), 65 deletions(-)
--- linux-2.6.orig/arch/powerpc/platforms/powermac/setup.c 2007-04-27 23:24:57.576021121 +0200
+++ linux-2.6/arch/powerpc/platforms/powermac/setup.c 2007-04-27 23:25:20.396021121 +0200
@@ -420,76 +420,11 @@ static void __init find_boot_device(void
#endif
}
-/* TODO: Merge the suspend-to-ram with the common code !!!
- * currently, this is a stub implementation for suspend-to-disk
- * only
- */
-
-#ifdef CONFIG_SOFTWARE_SUSPEND
-
-static int pmac_pm_prepare(suspend_state_t state)
-{
- printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state);
-
- return 0;
-}
-
-static int pmac_pm_enter(suspend_state_t state)
-{
- printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state);
-
- /* Giveup the lazy FPU & vec so we don't have to back them
- * up from the low level code
- */
- enable_kernel_fp();
-
-#ifdef CONFIG_ALTIVEC
- if (cur_cpu_spec->cpu_features & CPU_FTR_ALTIVEC)
- enable_kernel_altivec();
-#endif /* CONFIG_ALTIVEC */
-
- return 0;
-}
-
-static int pmac_pm_finish(suspend_state_t state)
-{
- printk(KERN_DEBUG "%s(%d)\n", __FUNCTION__, state);
-
- /* Restore userland MMU context */
- set_context(current->active_mm->context.id, current->active_mm->pgd);
-
- return 0;
-}
-
-static int pmac_pm_valid(suspend_state_t state)
-{
- switch (state) {
- case PM_SUSPEND_DISK:
- return 1;
- /* can't do any other states via generic mechanism yet */
- default:
- return 0;
- }
-}
-
-static struct pm_ops pmac_pm_ops = {
- .pm_disk_mode = PM_DISK_SHUTDOWN,
- .prepare = pmac_pm_prepare,
- .enter = pmac_pm_enter,
- .finish = pmac_pm_finish,
- .valid = pmac_pm_valid,
-};
-
-#endif /* CONFIG_SOFTWARE_SUSPEND */
-
static int initializing = 1;
static int pmac_late_init(void)
{
initializing = 0;
-#ifdef CONFIG_SOFTWARE_SUSPEND
- pm_set_ops(&pmac_pm_ops);
-#endif /* CONFIG_SOFTWARE_SUSPEND */
return 0;
}
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6/include/asm-powerpc/suspend.h 2007-04-27 23:25:20.396021121 +0200
@@ -0,0 +1,9 @@
+#ifndef __ASM_POWERPC_SUSPEND_H
+#define __ASM_POWERPC_SUSPEND_H
+
+static inline int arch_prepare_suspend(void) { return 0; }
+
+void save_processor_state(void);
+void restore_processor_state(void);
+
+#endif /* __ASM_POWERPC_SUSPEND_H */
--- linux-2.6.orig/arch/powerpc/kernel/Makefile 2007-04-27 23:24:57.616021121 +0200
+++ linux-2.6/arch/powerpc/kernel/Makefile 2007-04-27 23:25:20.406021121 +0200
@@ -36,6 +36,7 @@ obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsy
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
obj-$(CONFIG_6xx) += idle_6xx.o l2cr_6xx.o cpu_setup_6xx.o
obj-$(CONFIG_TAU) += tau_6xx.o
+obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o
obj32-$(CONFIG_SOFTWARE_SUSPEND) += swsusp_32.o
obj32-$(CONFIG_MODULES) += module_32.o
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6/arch/powerpc/kernel/swsusp.c 2007-04-27 23:25:20.406021121 +0200
@@ -0,0 +1,42 @@
+/*
+ * Common powerpc suspend code for 32 and 64 bits
+ *
+ * Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
+ *
+ * GPLv2
+ */
+
+#include <linux/sched.h>
+#include <asm/suspend.h>
+#include <asm/cputable.h>
+#include <asm/system.h>
+#include <asm/current.h>
+#include <asm/mmu_context.h>
+
+#ifdef CONFIG_SPE
+extern void enable_kernel_spe(void);
+#endif
+
+void save_processor_state(void)
+{
+ /* Giveup the lazy FPU & vec so we don't have to back them
+ * up from the low level code
+ */
+ enable_kernel_fp();
+
+#ifdef CONFIG_ALTIVEC
+ if (cur_cpu_spec->cpu_features & CPU_FTR_ALTIVEC)
+ enable_kernel_altivec();
+#endif /* CONFIG_ALTIVEC */
+
+#ifdef CONFIG_SPE
+ enable_kernel_spe();
+#endif
+}
+
+void restore_processor_state(void)
+{
+#ifdef CONFIG_PPC32
+ set_context(current->active_mm->context.id, current->active_mm->pgd);
+#endif
+}
next prev parent reply other threads:[~2007-04-27 21:41 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 ` Johannes Berg [this message]
2007-04-27 21:53 ` [PATCH] powerpc: fix suspend states again 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 ` [PATCH] powermac: support G5 CPU hotplug Johannes Berg
2007-05-02 10:55 ` 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=1177710095.3565.64.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).