linux/arch/powerpc/platforms/pseries/plpar_wrappers.h
<<
>>
Prefs
   1#ifndef _PSERIES_PLPAR_WRAPPERS_H
   2#define _PSERIES_PLPAR_WRAPPERS_H
   3
   4#include <asm/hvcall.h>
   5
   6static inline long poll_pending(void)
   7{
   8        return plpar_hcall_norets(H_POLL_PENDING);
   9}
  10
  11static inline long prod_processor(void)
  12{
  13        return plpar_hcall_norets(H_PROD);
  14}
  15
  16static inline long cede_processor(void)
  17{
  18        return plpar_hcall_norets(H_CEDE);
  19}
  20
  21static inline long vpa_call(unsigned long flags, unsigned long cpu,
  22                unsigned long vpa)
  23{
  24        /* flags are in bits 16-18 (counting from most significant bit) */
  25        flags = flags << (63 - 18);
  26
  27        return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);
  28}
  29
  30static inline long unregister_vpa(unsigned long cpu, unsigned long vpa)
  31{
  32        return vpa_call(0x5, cpu, vpa);
  33}
  34
  35static inline long register_vpa(unsigned long cpu, unsigned long vpa)
  36{
  37        return vpa_call(0x1, cpu, vpa);
  38}
  39
  40static inline long unregister_slb_shadow(unsigned long cpu, unsigned long vpa)
  41{
  42        return vpa_call(0x7, cpu, vpa);
  43}
  44
  45static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)
  46{
  47        return vpa_call(0x3, cpu, vpa);
  48}
  49
  50extern void vpa_init(int cpu);
  51
  52static inline long plpar_pte_enter(unsigned long flags,
  53                unsigned long hpte_group, unsigned long hpte_v,
  54                unsigned long hpte_r, unsigned long *slot)
  55{
  56        long rc;
  57        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
  58
  59        rc = plpar_hcall(H_ENTER, retbuf, flags, hpte_group, hpte_v, hpte_r);
  60
  61        *slot = retbuf[0];
  62
  63        return rc;
  64}
  65
  66static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,
  67                unsigned long avpn, unsigned long *old_pteh_ret,
  68                unsigned long *old_ptel_ret)
  69{
  70        long rc;
  71        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
  72
  73        rc = plpar_hcall(H_REMOVE, retbuf, flags, ptex, avpn);
  74
  75        *old_pteh_ret = retbuf[0];
  76        *old_ptel_ret = retbuf[1];
  77
  78        return rc;
  79}
  80
  81/* plpar_pte_remove_raw can be called in real mode. It calls plpar_hcall_raw */
  82static inline long plpar_pte_remove_raw(unsigned long flags, unsigned long ptex,
  83                unsigned long avpn, unsigned long *old_pteh_ret,
  84                unsigned long *old_ptel_ret)
  85{
  86        long rc;
  87        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
  88
  89        rc = plpar_hcall_raw(H_REMOVE, retbuf, flags, ptex, avpn);
  90
  91        *old_pteh_ret = retbuf[0];
  92        *old_ptel_ret = retbuf[1];
  93
  94        return rc;
  95}
  96
  97static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,
  98                unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
  99{
 100        long rc;
 101        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
 102
 103        rc = plpar_hcall(H_READ, retbuf, flags, ptex);
 104
 105        *old_pteh_ret = retbuf[0];
 106        *old_ptel_ret = retbuf[1];
 107
 108        return rc;
 109}
 110
 111/* plpar_pte_read_raw can be called in real mode. It calls plpar_hcall_raw */
 112static inline long plpar_pte_read_raw(unsigned long flags, unsigned long ptex,
 113                unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
 114{
 115        long rc;
 116        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
 117
 118        rc = plpar_hcall_raw(H_READ, retbuf, flags, ptex);
 119
 120        *old_pteh_ret = retbuf[0];
 121        *old_ptel_ret = retbuf[1];
 122
 123        return rc;
 124}
 125
 126static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,
 127                unsigned long avpn)
 128{
 129        return plpar_hcall_norets(H_PROTECT, flags, ptex, avpn);
 130}
 131
 132static inline long plpar_tce_get(unsigned long liobn, unsigned long ioba,
 133                unsigned long *tce_ret)
 134{
 135        long rc;
 136        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
 137
 138        rc = plpar_hcall(H_GET_TCE, retbuf, liobn, ioba);
 139
 140        *tce_ret = retbuf[0];
 141
 142        return rc;
 143}
 144
 145static inline long plpar_tce_put(unsigned long liobn, unsigned long ioba,
 146                unsigned long tceval)
 147{
 148        return plpar_hcall_norets(H_PUT_TCE, liobn, ioba, tceval);
 149}
 150
 151static inline long plpar_tce_put_indirect(unsigned long liobn,
 152                unsigned long ioba, unsigned long page, unsigned long count)
 153{
 154        return plpar_hcall_norets(H_PUT_TCE_INDIRECT, liobn, ioba, page, count);
 155}
 156
 157static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,
 158                unsigned long tceval, unsigned long count)
 159{
 160        return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);
 161}
 162
 163static inline long plpar_get_term_char(unsigned long termno,
 164                unsigned long *len_ret, char *buf_ret)
 165{
 166        long rc;
 167        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
 168        unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */
 169
 170        rc = plpar_hcall(H_GET_TERM_CHAR, retbuf, termno);
 171
 172        *len_ret = retbuf[0];
 173        lbuf[0] = retbuf[1];
 174        lbuf[1] = retbuf[2];
 175
 176        return rc;
 177}
 178
 179static inline long plpar_put_term_char(unsigned long termno, unsigned long len,
 180                const char *buffer)
 181{
 182        unsigned long *lbuf = (unsigned long *)buffer;  /* TODO: alignment? */
 183        return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],
 184                        lbuf[1]);
 185}
 186
 187static inline long plpar_eoi(unsigned long xirr)
 188{
 189        return plpar_hcall_norets(H_EOI, xirr);
 190}
 191
 192static inline long plpar_cppr(unsigned long cppr)
 193{
 194        return plpar_hcall_norets(H_CPPR, cppr);
 195}
 196
 197static inline long plpar_ipi(unsigned long servernum, unsigned long mfrr)
 198{
 199        return plpar_hcall_norets(H_IPI, servernum, mfrr);
 200}
 201
 202static inline long plpar_xirr(unsigned long *xirr_ret)
 203{
 204        long rc;
 205        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
 206
 207        rc = plpar_hcall(H_XIRR, retbuf);
 208
 209        *xirr_ret = retbuf[0];
 210
 211        return rc;
 212}
 213
 214#endif /* _PSERIES_PLPAR_WRAPPERS_H */
 215