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 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 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 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 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 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 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 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