Path: blob/master/arch/powerpc/platforms/pseries/plpar_wrappers.h
10818 views
#ifndef _PSERIES_PLPAR_WRAPPERS_H1#define _PSERIES_PLPAR_WRAPPERS_H23#include <asm/hvcall.h>4#include <asm/page.h>56/* Get state of physical CPU from query_cpu_stopped */7int smp_query_cpu_stopped(unsigned int pcpu);8#define QCSS_STOPPED 09#define QCSS_STOPPING 110#define QCSS_NOT_STOPPED 211#define QCSS_HARDWARE_ERROR -112#define QCSS_HARDWARE_BUSY -21314static inline long poll_pending(void)15{16return plpar_hcall_norets(H_POLL_PENDING);17}1819static inline u8 get_cede_latency_hint(void)20{21return get_lppaca()->gpr5_dword.fields.cede_latency_hint;22}2324static inline void set_cede_latency_hint(u8 latency_hint)25{26get_lppaca()->gpr5_dword.fields.cede_latency_hint = latency_hint;27}2829static inline long cede_processor(void)30{31return plpar_hcall_norets(H_CEDE);32}3334static inline long extended_cede_processor(unsigned long latency_hint)35{36long rc;37u8 old_latency_hint = get_cede_latency_hint();3839set_cede_latency_hint(latency_hint);40rc = cede_processor();41set_cede_latency_hint(old_latency_hint);4243return rc;44}4546static inline long vpa_call(unsigned long flags, unsigned long cpu,47unsigned long vpa)48{49/* flags are in bits 16-18 (counting from most significant bit) */50flags = flags << (63 - 18);5152return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);53}5455static inline long unregister_vpa(unsigned long cpu, unsigned long vpa)56{57return vpa_call(0x5, cpu, vpa);58}5960static inline long register_vpa(unsigned long cpu, unsigned long vpa)61{62return vpa_call(0x1, cpu, vpa);63}6465static inline long unregister_slb_shadow(unsigned long cpu, unsigned long vpa)66{67return vpa_call(0x7, cpu, vpa);68}6970static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)71{72return vpa_call(0x3, cpu, vpa);73}7475static inline long unregister_dtl(unsigned long cpu, unsigned long vpa)76{77return vpa_call(0x6, cpu, vpa);78}7980static inline long register_dtl(unsigned long cpu, unsigned long vpa)81{82return vpa_call(0x2, cpu, vpa);83}8485static inline long plpar_page_set_loaned(unsigned long vpa)86{87unsigned long cmo_page_sz = cmo_get_page_size();88long rc = 0;89int i;9091for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)92rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0);9394for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)95plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE,96vpa + i - cmo_page_sz, 0);9798return rc;99}100101static inline long plpar_page_set_active(unsigned long vpa)102{103unsigned long cmo_page_sz = cmo_get_page_size();104long rc = 0;105int i;106107for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)108rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0);109110for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)111plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED,112vpa + i - cmo_page_sz, 0);113114return rc;115}116117extern void vpa_init(int cpu);118119static inline long plpar_pte_enter(unsigned long flags,120unsigned long hpte_group, unsigned long hpte_v,121unsigned long hpte_r, unsigned long *slot)122{123long rc;124unsigned long retbuf[PLPAR_HCALL_BUFSIZE];125126rc = plpar_hcall(H_ENTER, retbuf, flags, hpte_group, hpte_v, hpte_r);127128*slot = retbuf[0];129130return rc;131}132133static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,134unsigned long avpn, unsigned long *old_pteh_ret,135unsigned long *old_ptel_ret)136{137long rc;138unsigned long retbuf[PLPAR_HCALL_BUFSIZE];139140rc = plpar_hcall(H_REMOVE, retbuf, flags, ptex, avpn);141142*old_pteh_ret = retbuf[0];143*old_ptel_ret = retbuf[1];144145return rc;146}147148/* plpar_pte_remove_raw can be called in real mode. It calls plpar_hcall_raw */149static inline long plpar_pte_remove_raw(unsigned long flags, unsigned long ptex,150unsigned long avpn, unsigned long *old_pteh_ret,151unsigned long *old_ptel_ret)152{153long rc;154unsigned long retbuf[PLPAR_HCALL_BUFSIZE];155156rc = plpar_hcall_raw(H_REMOVE, retbuf, flags, ptex, avpn);157158*old_pteh_ret = retbuf[0];159*old_ptel_ret = retbuf[1];160161return rc;162}163164static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,165unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)166{167long rc;168unsigned long retbuf[PLPAR_HCALL_BUFSIZE];169170rc = plpar_hcall(H_READ, retbuf, flags, ptex);171172*old_pteh_ret = retbuf[0];173*old_ptel_ret = retbuf[1];174175return rc;176}177178/* plpar_pte_read_raw can be called in real mode. It calls plpar_hcall_raw */179static inline long plpar_pte_read_raw(unsigned long flags, unsigned long ptex,180unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)181{182long rc;183unsigned long retbuf[PLPAR_HCALL_BUFSIZE];184185rc = plpar_hcall_raw(H_READ, retbuf, flags, ptex);186187*old_pteh_ret = retbuf[0];188*old_ptel_ret = retbuf[1];189190return rc;191}192193/*194* plpar_pte_read_4_raw can be called in real mode.195* ptes must be 8*sizeof(unsigned long)196*/197static inline long plpar_pte_read_4_raw(unsigned long flags, unsigned long ptex,198unsigned long *ptes)199200{201long rc;202unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];203204rc = plpar_hcall9_raw(H_READ, retbuf, flags | H_READ_4, ptex);205206memcpy(ptes, retbuf, 8*sizeof(unsigned long));207208return rc;209}210211static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,212unsigned long avpn)213{214return plpar_hcall_norets(H_PROTECT, flags, ptex, avpn);215}216217static inline long plpar_tce_get(unsigned long liobn, unsigned long ioba,218unsigned long *tce_ret)219{220long rc;221unsigned long retbuf[PLPAR_HCALL_BUFSIZE];222223rc = plpar_hcall(H_GET_TCE, retbuf, liobn, ioba);224225*tce_ret = retbuf[0];226227return rc;228}229230static inline long plpar_tce_put(unsigned long liobn, unsigned long ioba,231unsigned long tceval)232{233return plpar_hcall_norets(H_PUT_TCE, liobn, ioba, tceval);234}235236static inline long plpar_tce_put_indirect(unsigned long liobn,237unsigned long ioba, unsigned long page, unsigned long count)238{239return plpar_hcall_norets(H_PUT_TCE_INDIRECT, liobn, ioba, page, count);240}241242static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,243unsigned long tceval, unsigned long count)244{245return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);246}247248static inline long plpar_get_term_char(unsigned long termno,249unsigned long *len_ret, char *buf_ret)250{251long rc;252unsigned long retbuf[PLPAR_HCALL_BUFSIZE];253unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */254255rc = plpar_hcall(H_GET_TERM_CHAR, retbuf, termno);256257*len_ret = retbuf[0];258lbuf[0] = retbuf[1];259lbuf[1] = retbuf[2];260261return rc;262}263264static inline long plpar_put_term_char(unsigned long termno, unsigned long len,265const char *buffer)266{267unsigned long *lbuf = (unsigned long *)buffer; /* TODO: alignment? */268return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],269lbuf[1]);270}271272#endif /* _PSERIES_PLPAR_WRAPPERS_H */273274275