public inbox for linux-pm@vger.kernel.org
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: linuxppc-dev@ozlabs.org
Cc: linux-pm@lists.osdl.org
Subject: [PATCH 06/12] powerpc: fix suspend states again
Date: Wed, 07 Feb 2007 13:45:42 +0100	[thread overview]
Message-ID: <20070207124612.612467000@sipsolutions.net> (raw)
In-Reply-To: 20070207124536.963531000@sipsolutions.net

[-- Attachment #1: fix-powermac-suspend-again.patch --]
[-- Type: text/plain, Size: 5111 bytes --]

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 a new
    arch_prepare_suspend function (previously, this was only present for
    32-bit platforms from asm-ppc.)

I removed
	set_context(current->active_mm->context.id, current->active_mm->pgd);
because
 1. it works without and
 2. I don't know what the point is

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>

--- linux-2.6-git.orig/arch/powerpc/platforms/powermac/setup.c	2007-02-07 02:55:27.388884289 +0100
+++ linux-2.6-git/arch/powerpc/platforms/powermac/setup.c	2007-02-07 02:55:32.107884289 +0100
@@ -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 */
 	/* this is udbg (which is __init) and we can later use it during
 	 * cpu hotplug (in smp_core99_kick_cpu) */
 	ppc_md.progress = NULL;
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6-git/include/asm-powerpc/suspend.h	2007-02-07 02:55:32.124884289 +0100
@@ -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);
+static inline void restore_processor_state(void) {}
+
+#endif /* __ASM_POWERPC_SUSPEND_H */
--- linux-2.6-git.orig/arch/powerpc/kernel/Makefile	2007-02-07 02:55:00.582884289 +0100
+++ linux-2.6-git/arch/powerpc/kernel/Makefile	2007-02-07 02:55:32.134884289 +0100
@@ -35,6 +35,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-git/arch/powerpc/kernel/swsusp.c	2007-02-07 02:55:32.152884289 +0100
@@ -0,0 +1,26 @@
+/*
+ * Common powerpc suspend code for 32 and 64 bits
+ *
+ * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
+ *
+ * GPLv2
+ */
+
+#include <asm/cputable.h>
+#include <asm/system.h>
+
+
+int 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 */
+
+	return 0;
+}

--

  parent reply	other threads:[~2007-02-07 12:45 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-07 12:45 [PATCH 00/12] powerpc/powermac power management patches Johannes Berg
2007-02-07 12:45 ` [PATCH 01/12] powerpc: MPIC sys_device & suspend/resume Johannes Berg
2007-02-07 12:45 ` [PATCH 02/12] powermac: support G5 CPU hotplug Johannes Berg
2007-02-08 13:14   ` Johannes Berg
2007-02-08 13:28     ` Johannes Berg
2007-02-08 15:38       ` Johannes Berg
2007-02-08 21:59       ` Paul Mackerras
2007-02-08 22:33         ` Benjamin Herrenschmidt
2007-02-09 15:39         ` Johannes Berg
2007-02-08 22:24     ` Benjamin Herrenschmidt
2007-02-08 22:24     ` Benjamin Herrenschmidt
2007-02-09 15:36       ` Johannes Berg
2007-02-12 15:15         ` Johannes Berg
2007-02-15  3:44           ` Paul Mackerras
2007-02-15 15:08             ` Johannes Berg
2007-02-15 19:43             ` Johannes Berg
2007-02-14 14:45     ` Pavel Machek
2007-02-14 19:11       ` Johannes Berg
2007-02-14 21:27       ` Benjamin Herrenschmidt
2007-02-07 12:45 ` [PATCH 03/12] powerpc: dart iommu suspend Johannes Berg
2007-02-07 12:45 ` [PATCH 04/12] powerpc: mark pages that dont exist as Nosave Johannes Berg
2007-02-07 12:45 ` [PATCH 05/12] power management: no valid states w/o pm_ops + docs Johannes Berg
2007-02-13 12:12   ` Pavel Machek
2007-02-13 16:08     ` Johannes Berg
2007-02-13 16:14       ` Pavel Machek
2007-02-07 12:45 ` Johannes Berg [this message]
2007-02-07 12:45 ` [PATCH 07/12] powermac: suspend to disk on G5 Johannes Berg
2007-02-07 12:45 ` [PATCH 08/12] powermac: fix G5-cpufreq for cpu on/offline Johannes Berg
2007-02-07 12:45 ` [PATCH 09/12] powerpc: remove bogus comment about page_is_ram Johannes Berg
2007-02-07 12:45 ` [PATCH 10/12] powerpc: remove unneeded exports in mem.c Johannes Berg
2007-02-08  4:25   ` Paul Mackerras
2007-02-08 13:10     ` Johannes Berg
2007-02-08 13:27       ` [PATCH 10/12] powerpc: remove unneeded page_is_ram export Johannes Berg
2007-02-07 12:45 ` [PATCH 11/12] powermac: disallow pmu sleep notifiers from aborting sleep Johannes Berg
2007-02-07 22:52   ` Andreas Schwab
2007-02-08 13:08     ` Johannes Berg
2007-02-08 13:16   ` Johannes Berg
2007-02-07 12:45 ` [PATCH 12/12] powermac: proper sleep management Johannes Berg
2007-02-08 13:16 ` [PATCH 13/12] mpic: add affinity callback for IPI "chip" Johannes Berg
2007-02-08 21:14   ` Benjamin Herrenschmidt
2007-02-09 15:41     ` Johannes Berg
2007-02-12 15:20     ` [PATCH 13/12] mpic: set IPIs to be per-CPU 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=20070207124612.612467000@sipsolutions.net \
    --to=johannes@sipsolutions.net \
    --cc=linux-pm@lists.osdl.org \
    --cc=linuxppc-dev@ozlabs.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