summaryrefslogtreecommitdiffstats
path: root/arch/sparc/power/hibernate.c
diff options
context:
space:
mode:
authorTkhai Kirill2013-03-19 16:11:07 +0100
committerDavid S. Miller2013-03-20 19:06:54 +0100
commitbdde6b3c8ba48fa5847b6d75f0541c8b8db9205c (patch)
tree9fccf29eca02be11f5e6e9eec13ae6d056ff3288 /arch/sparc/power/hibernate.c
parentsparc,leon: updated GRPCI2 config name (diff)
downloadkernel-qcow2-linux-bdde6b3c8ba48fa5847b6d75f0541c8b8db9205c.tar.gz
kernel-qcow2-linux-bdde6b3c8ba48fa5847b6d75f0541c8b8db9205c.tar.xz
kernel-qcow2-linux-bdde6b3c8ba48fa5847b6d75f0541c8b8db9205c.zip
sparc64: Hibernation support
This patch adds CONFIG_HIBERNATION support for sparc64 architecture. The suspend function is the same as on another platforms. The restore function uses Bypass feature of MMU which allows to make the process more comfortable and plesant. Signed-off-by: Kirill Tkhai <tkhai@yandex.ru> CC: David Miller <davem@davemloft.net> CC: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/power/hibernate.c')
-rw-r--r--arch/sparc/power/hibernate.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/arch/sparc/power/hibernate.c b/arch/sparc/power/hibernate.c
new file mode 100644
index 000000000000..42b0b8ce699a
--- /dev/null
+++ b/arch/sparc/power/hibernate.c
@@ -0,0 +1,42 @@
+/*
+ * hibernate.c: Hibernaton support specific for sparc64.
+ *
+ * Copyright (C) 2013 Kirill V Tkhai (tkhai@yandex.ru)
+ */
+
+#include <linux/mm.h>
+
+#include <asm/hibernate.h>
+#include <asm/visasm.h>
+#include <asm/page.h>
+#include <asm/tlb.h>
+
+/* References to section boundaries */
+extern const void __nosave_begin, __nosave_end;
+
+struct saved_context saved_context;
+
+/*
+ * pfn_is_nosave - check if given pfn is in the 'nosave' section
+ */
+
+int pfn_is_nosave(unsigned long pfn)
+{
+ unsigned long nosave_begin_pfn = PFN_DOWN((unsigned long)&__nosave_begin);
+ unsigned long nosave_end_pfn = PFN_DOWN((unsigned long)&__nosave_end);
+
+ return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
+}
+
+void save_processor_state(void)
+{
+ save_and_clear_fpu();
+}
+
+void restore_processor_state(void)
+{
+ struct mm_struct *mm = current->active_mm;
+
+ load_secondary_context(mm);
+ tsb_context_switch(mm);
+}