xref: /linux/arch/s390/include/asm/page-states.h (revision e814f3fd16acfb7f9966773953de8f740a1e3202)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *    Copyright IBM Corp. 2017
4  *    Author(s): Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
5  */
6 
7 #ifndef PAGE_STATES_H
8 #define PAGE_STATES_H
9 
10 #include <asm/page.h>
11 
12 #define ESSA_GET_STATE			0
13 #define ESSA_SET_STABLE			1
14 #define ESSA_SET_UNUSED			2
15 #define ESSA_SET_VOLATILE		3
16 #define ESSA_SET_POT_VOLATILE		4
17 #define ESSA_SET_STABLE_RESIDENT	5
18 #define ESSA_SET_STABLE_IF_RESIDENT	6
19 #define ESSA_SET_STABLE_NODAT		7
20 
21 #define ESSA_MAX	ESSA_SET_STABLE_NODAT
22 
23 extern int cmma_flag;
24 
25 static __always_inline unsigned long essa(unsigned long paddr, unsigned char cmd)
26 {
27 	unsigned long rc;
28 
29 	asm volatile(
30 		"	.insn	rrf,0xb9ab0000,%[rc],%[paddr],%[cmd],0"
31 		: [rc] "=d" (rc)
32 		: [paddr] "d" (paddr),
33 		  [cmd] "i" (cmd));
34 	return rc;
35 }
36 
37 static __always_inline void __set_page_state(void *addr, unsigned long num_pages, unsigned char cmd)
38 {
39 	unsigned long paddr = __pa(addr) & PAGE_MASK;
40 
41 	while (num_pages--) {
42 		essa(paddr, cmd);
43 		paddr += PAGE_SIZE;
44 	}
45 }
46 
47 static inline void __set_page_unused(void *addr, unsigned long num_pages)
48 {
49 	__set_page_state(addr, num_pages, ESSA_SET_UNUSED);
50 }
51 
52 static inline void __set_page_stable_dat(void *addr, unsigned long num_pages)
53 {
54 	__set_page_state(addr, num_pages, ESSA_SET_STABLE);
55 }
56 
57 static inline void __set_page_stable_nodat(void *addr, unsigned long num_pages)
58 {
59 	__set_page_state(addr, num_pages, ESSA_SET_STABLE_NODAT);
60 }
61 
62 static inline void __arch_set_page_nodat(void *addr, unsigned long num_pages)
63 {
64 	if (!cmma_flag)
65 		return;
66 	if (cmma_flag < 2)
67 		__set_page_stable_dat(addr, num_pages);
68 	else
69 		__set_page_stable_nodat(addr, num_pages);
70 }
71 
72 static inline void __arch_set_page_dat(void *addr, unsigned long num_pages)
73 {
74 	if (!cmma_flag)
75 		return;
76 	__set_page_stable_dat(addr, num_pages);
77 }
78 
79 #endif
80