xref: /openbmc/linux/arch/sparc/power/hibernate.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2bdde6b3cSTkhai Kirill /*
3bdde6b3cSTkhai Kirill  * hibernate.c:  Hibernaton support specific for sparc64.
4bdde6b3cSTkhai Kirill  *
5bdde6b3cSTkhai Kirill  * Copyright (C) 2013 Kirill V Tkhai (tkhai@yandex.ru)
6bdde6b3cSTkhai Kirill  */
7bdde6b3cSTkhai Kirill 
8bdde6b3cSTkhai Kirill #include <linux/mm.h>
9bdde6b3cSTkhai Kirill 
10bdde6b3cSTkhai Kirill #include <asm/hibernate.h>
11bdde6b3cSTkhai Kirill #include <asm/visasm.h>
12bdde6b3cSTkhai Kirill #include <asm/page.h>
137f8998c7SGeert Uytterhoeven #include <asm/sections.h>
14bdde6b3cSTkhai Kirill #include <asm/tlb.h>
15bdde6b3cSTkhai Kirill 
16bdde6b3cSTkhai Kirill struct saved_context saved_context;
17bdde6b3cSTkhai Kirill 
18bdde6b3cSTkhai Kirill /*
19bdde6b3cSTkhai Kirill  *	pfn_is_nosave - check if given pfn is in the 'nosave' section
20bdde6b3cSTkhai Kirill  */
21bdde6b3cSTkhai Kirill 
pfn_is_nosave(unsigned long pfn)22bdde6b3cSTkhai Kirill int pfn_is_nosave(unsigned long pfn)
23bdde6b3cSTkhai Kirill {
24bdde6b3cSTkhai Kirill 	unsigned long nosave_begin_pfn = PFN_DOWN((unsigned long)&__nosave_begin);
25bdde6b3cSTkhai Kirill 	unsigned long nosave_end_pfn = PFN_DOWN((unsigned long)&__nosave_end);
26bdde6b3cSTkhai Kirill 
27bdde6b3cSTkhai Kirill 	return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
28bdde6b3cSTkhai Kirill }
29bdde6b3cSTkhai Kirill 
save_processor_state(void)30bdde6b3cSTkhai Kirill void save_processor_state(void)
31bdde6b3cSTkhai Kirill {
32bdde6b3cSTkhai Kirill 	save_and_clear_fpu();
33bdde6b3cSTkhai Kirill }
34bdde6b3cSTkhai Kirill 
restore_processor_state(void)35bdde6b3cSTkhai Kirill void restore_processor_state(void)
36bdde6b3cSTkhai Kirill {
37bdde6b3cSTkhai Kirill 	struct mm_struct *mm = current->active_mm;
38bdde6b3cSTkhai Kirill 
39fc290a11SRob Gardner 	tsb_context_switch_ctx(mm, CTX_HWBITS(mm->context));
40bdde6b3cSTkhai Kirill }
41