]> Git Repo - linux.git/blob - arch/s390/include/asm/page-states.h
Linux 6.14-rc3
[linux.git] / arch / s390 / include / asm / page-states.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *    Copyright IBM Corp. 2017
4  *    Author(s): Claudio Imbrenda <[email protected]>
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
This page took 0.036407 seconds and 4 git commands to generate.