81 lines
1.8 KiB
C
81 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright IBM Corp. 2017
|
|
* Author(s): Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
|
|
*/
|
|
|
|
#ifndef PAGE_STATES_H
|
|
#define PAGE_STATES_H
|
|
|
|
#include <asm/sections.h>
|
|
#include <asm/page.h>
|
|
|
|
#define ESSA_GET_STATE 0
|
|
#define ESSA_SET_STABLE 1
|
|
#define ESSA_SET_UNUSED 2
|
|
#define ESSA_SET_VOLATILE 3
|
|
#define ESSA_SET_POT_VOLATILE 4
|
|
#define ESSA_SET_STABLE_RESIDENT 5
|
|
#define ESSA_SET_STABLE_IF_RESIDENT 6
|
|
#define ESSA_SET_STABLE_NODAT 7
|
|
|
|
#define ESSA_MAX ESSA_SET_STABLE_NODAT
|
|
|
|
extern int __bootdata_preserved(cmma_flag);
|
|
|
|
static __always_inline unsigned long essa(unsigned long paddr, unsigned char cmd)
|
|
{
|
|
unsigned long rc;
|
|
|
|
asm volatile(
|
|
" .insn rrf,0xb9ab0000,%[rc],%[paddr],%[cmd],0"
|
|
: [rc] "=d" (rc)
|
|
: [paddr] "d" (paddr),
|
|
[cmd] "i" (cmd));
|
|
return rc;
|
|
}
|
|
|
|
static __always_inline void __set_page_state(void *addr, unsigned long num_pages, unsigned char cmd)
|
|
{
|
|
unsigned long paddr = __pa(addr) & PAGE_MASK;
|
|
|
|
while (num_pages--) {
|
|
essa(paddr, cmd);
|
|
paddr += PAGE_SIZE;
|
|
}
|
|
}
|
|
|
|
static inline void __set_page_unused(void *addr, unsigned long num_pages)
|
|
{
|
|
__set_page_state(addr, num_pages, ESSA_SET_UNUSED);
|
|
}
|
|
|
|
static inline void __set_page_stable_dat(void *addr, unsigned long num_pages)
|
|
{
|
|
__set_page_state(addr, num_pages, ESSA_SET_STABLE);
|
|
}
|
|
|
|
static inline void __set_page_stable_nodat(void *addr, unsigned long num_pages)
|
|
{
|
|
__set_page_state(addr, num_pages, ESSA_SET_STABLE_NODAT);
|
|
}
|
|
|
|
static inline void __arch_set_page_nodat(void *addr, unsigned long num_pages)
|
|
{
|
|
if (!cmma_flag)
|
|
return;
|
|
if (cmma_flag < 2)
|
|
__set_page_stable_dat(addr, num_pages);
|
|
else
|
|
__set_page_stable_nodat(addr, num_pages);
|
|
}
|
|
|
|
static inline void __arch_set_page_dat(void *addr, unsigned long num_pages)
|
|
{
|
|
if (!cmma_flag)
|
|
return;
|
|
__set_page_stable_dat(addr, num_pages);
|
|
}
|
|
|
|
#endif
|