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