Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=be9c94dd7776467813419f49fabe8017bc2d4c81
Commit:     be9c94dd7776467813419f49fabe8017bc2d4c81
Parent:     f88df14b1f15cdeffa060580a40c1ce3e13bb79e
Author:     Johannes Berg <[EMAIL PROTECTED]>
AuthorDate: Mon Apr 30 21:37:15 2007 +1000
Committer:  Paul Mackerras <[EMAIL PROTECTED]>
CommitDate: Wed May 2 20:04:30 2007 +1000

    [POWERPC] Fix suspend states again
    
    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.
    
    Signed-off-by: Johannes Berg <[EMAIL PROTECTED]>
    Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]>
---
 arch/powerpc/kernel/Makefile            |    1 +
 arch/powerpc/kernel/swsusp.c            |   34 ++++++++++++++++
 arch/powerpc/platforms/powermac/setup.c |   65 -------------------------------
 include/asm-powerpc/suspend.h           |    9 ++++
 4 files changed, 44 insertions(+), 65 deletions(-)

diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index e0fa80e..949f36a 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -36,6 +36,7 @@ obj-$(CONFIG_GENERIC_TBSYNC)  += smp-tbsync.o
 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
 
diff --git a/arch/powerpc/kernel/swsusp.c b/arch/powerpc/kernel/swsusp.c
new file mode 100644
index 0000000..b89e4f5
--- /dev/null
+++ b/arch/powerpc/kernel/swsusp.c
@@ -0,0 +1,34 @@
+/*
+ * Common powerpc suspend code for 32 and 64 bits
+ *
+ * Copyright 2007      Johannes Berg <[EMAIL PROTECTED]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/sched.h>
+#include <asm/suspend.h>
+#include <asm/system.h>
+#include <asm/current.h>
+#include <asm/mmu_context.h>
+
+void save_processor_state(void)
+{
+       /*
+        * flush out all the special registers so we don't need
+        * to save them in the snapshot
+        */
+       flush_fp_to_thread(current);
+       flush_altivec_to_thread(current);
+       flush_spe_to_thread(current);
+}
+
+void restore_processor_state(void)
+{
+#ifdef CONFIG_PPC32
+       set_context(current->active_mm->context.id, current->active_mm->pgd);
+#endif
+}
diff --git a/arch/powerpc/platforms/powermac/setup.c 
b/arch/powerpc/platforms/powermac/setup.c
index b820cab..5ae57e1 100644
--- a/arch/powerpc/platforms/powermac/setup.c
+++ b/arch/powerpc/platforms/powermac/setup.c
@@ -439,76 +439,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;
 }
 
diff --git a/include/asm-powerpc/suspend.h b/include/asm-powerpc/suspend.h
new file mode 100644
index 0000000..cbf2c94
--- /dev/null
+++ b/include/asm-powerpc/suspend.h
@@ -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 */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to