xref: /linux/arch/s390/include/asm/page-states.h (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
22d42f947SClaudio Imbrenda /*
32d42f947SClaudio Imbrenda  *    Copyright IBM Corp. 2017
42d42f947SClaudio Imbrenda  *    Author(s): Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
52d42f947SClaudio Imbrenda  */
62d42f947SClaudio Imbrenda 
72d42f947SClaudio Imbrenda #ifndef PAGE_STATES_H
82d42f947SClaudio Imbrenda #define PAGE_STATES_H
92d42f947SClaudio Imbrenda 
10468a3bc2SHeiko Carstens #include <asm/sections.h>
11a3e89e20SHeiko Carstens #include <asm/page.h>
12468a3bc2SHeiko Carstens 
132d42f947SClaudio Imbrenda #define ESSA_GET_STATE			0
142d42f947SClaudio Imbrenda #define ESSA_SET_STABLE			1
152d42f947SClaudio Imbrenda #define ESSA_SET_UNUSED			2
162d42f947SClaudio Imbrenda #define ESSA_SET_VOLATILE		3
172d42f947SClaudio Imbrenda #define ESSA_SET_POT_VOLATILE		4
182d42f947SClaudio Imbrenda #define ESSA_SET_STABLE_RESIDENT	5
192d42f947SClaudio Imbrenda #define ESSA_SET_STABLE_IF_RESIDENT	6
20c9b5ad54SMartin Schwidefsky #define ESSA_SET_STABLE_NODAT		7
212d42f947SClaudio Imbrenda 
221bab1c02SClaudio Imbrenda #define ESSA_MAX	ESSA_SET_STABLE_NODAT
232d42f947SClaudio Imbrenda 
24468a3bc2SHeiko Carstens extern int __bootdata_preserved(cmma_flag);
25468a3bc2SHeiko Carstens 
essa(unsigned long paddr,unsigned char cmd)26a3e89e20SHeiko Carstens static __always_inline unsigned long essa(unsigned long paddr, unsigned char cmd)
27a3e89e20SHeiko Carstens {
28a3e89e20SHeiko Carstens 	unsigned long rc;
29a3e89e20SHeiko Carstens 
30a3e89e20SHeiko Carstens 	asm volatile(
31a3e89e20SHeiko Carstens 		"	.insn	rrf,0xb9ab0000,%[rc],%[paddr],%[cmd],0"
32a3e89e20SHeiko Carstens 		: [rc] "=d" (rc)
33a3e89e20SHeiko Carstens 		: [paddr] "d" (paddr),
34a3e89e20SHeiko Carstens 		  [cmd] "i" (cmd));
35a3e89e20SHeiko Carstens 	return rc;
36a3e89e20SHeiko Carstens }
37a3e89e20SHeiko Carstens 
__set_page_state(void * addr,unsigned long num_pages,unsigned char cmd)38a3e89e20SHeiko Carstens static __always_inline void __set_page_state(void *addr, unsigned long num_pages, unsigned char cmd)
39a3e89e20SHeiko Carstens {
40a3e89e20SHeiko Carstens 	unsigned long paddr = __pa(addr) & PAGE_MASK;
41a3e89e20SHeiko Carstens 
42a3e89e20SHeiko Carstens 	while (num_pages--) {
43a3e89e20SHeiko Carstens 		essa(paddr, cmd);
44a3e89e20SHeiko Carstens 		paddr += PAGE_SIZE;
45a3e89e20SHeiko Carstens 	}
46a3e89e20SHeiko Carstens }
47a3e89e20SHeiko Carstens 
__set_page_unused(void * addr,unsigned long num_pages)48a3e89e20SHeiko Carstens static inline void __set_page_unused(void *addr, unsigned long num_pages)
49a3e89e20SHeiko Carstens {
50a3e89e20SHeiko Carstens 	__set_page_state(addr, num_pages, ESSA_SET_UNUSED);
51a3e89e20SHeiko Carstens }
52a3e89e20SHeiko Carstens 
__set_page_stable_dat(void * addr,unsigned long num_pages)53a3e89e20SHeiko Carstens static inline void __set_page_stable_dat(void *addr, unsigned long num_pages)
54a3e89e20SHeiko Carstens {
55a3e89e20SHeiko Carstens 	__set_page_state(addr, num_pages, ESSA_SET_STABLE);
56a3e89e20SHeiko Carstens }
57a3e89e20SHeiko Carstens 
__set_page_stable_nodat(void * addr,unsigned long num_pages)58a3e89e20SHeiko Carstens static inline void __set_page_stable_nodat(void *addr, unsigned long num_pages)
59a3e89e20SHeiko Carstens {
60a3e89e20SHeiko Carstens 	__set_page_state(addr, num_pages, ESSA_SET_STABLE_NODAT);
61a3e89e20SHeiko Carstens }
62a3e89e20SHeiko Carstens 
__arch_set_page_nodat(void * addr,unsigned long num_pages)63*65d37f16SHeiko Carstens static inline void __arch_set_page_nodat(void *addr, unsigned long num_pages)
64*65d37f16SHeiko Carstens {
65*65d37f16SHeiko Carstens 	if (!cmma_flag)
66*65d37f16SHeiko Carstens 		return;
67*65d37f16SHeiko Carstens 	if (cmma_flag < 2)
68*65d37f16SHeiko Carstens 		__set_page_stable_dat(addr, num_pages);
69*65d37f16SHeiko Carstens 	else
70*65d37f16SHeiko Carstens 		__set_page_stable_nodat(addr, num_pages);
71*65d37f16SHeiko Carstens }
72*65d37f16SHeiko Carstens 
__arch_set_page_dat(void * addr,unsigned long num_pages)73*65d37f16SHeiko Carstens static inline void __arch_set_page_dat(void *addr, unsigned long num_pages)
74*65d37f16SHeiko Carstens {
75*65d37f16SHeiko Carstens 	if (!cmma_flag)
76*65d37f16SHeiko Carstens 		return;
77*65d37f16SHeiko Carstens 	__set_page_stable_dat(addr, num_pages);
78*65d37f16SHeiko Carstens }
79*65d37f16SHeiko Carstens 
802d42f947SClaudio Imbrenda #endif
81