blob: a24a6b2333b2388521989ac5ac2b38365a61e6ab [file] [log] [blame]
Michael Ellermana1218722005-11-03 15:33:31 +11001#ifndef _PSERIES_PLPAR_WRAPPERS_H
2#define _PSERIES_PLPAR_WRAPPERS_H
3
4#include <asm/hvcall.h>
Brian King370e4582008-08-16 05:09:33 +10005#include <asm/page.h>
Michael Ellermana1218722005-11-03 15:33:31 +11006
7static inline long poll_pending(void)
8{
Anton Blanchardb9377ff2006-07-19 08:01:28 +10009 return plpar_hcall_norets(H_POLL_PENDING);
Michael Ellermana1218722005-11-03 15:33:31 +110010}
11
Michael Ellermana1218722005-11-03 15:33:31 +110012static inline long cede_processor(void)
13{
Anton Blanchardb9377ff2006-07-19 08:01:28 +100014 return plpar_hcall_norets(H_CEDE);
Michael Ellermana1218722005-11-03 15:33:31 +110015}
16
Michael Ellerman40765d22005-11-03 19:34:38 +110017static inline long vpa_call(unsigned long flags, unsigned long cpu,
Michael Ellermana1218722005-11-03 15:33:31 +110018 unsigned long vpa)
19{
Michael Ellerman40765d22005-11-03 19:34:38 +110020 /* flags are in bits 16-18 (counting from most significant bit) */
21 flags = flags << (63 - 18);
22
23 return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);
Michael Ellermana1218722005-11-03 15:33:31 +110024}
25
Michael Ellerman40765d22005-11-03 19:34:38 +110026static inline long unregister_vpa(unsigned long cpu, unsigned long vpa)
27{
28 return vpa_call(0x5, cpu, vpa);
29}
30
31static inline long register_vpa(unsigned long cpu, unsigned long vpa)
32{
33 return vpa_call(0x1, cpu, vpa);
34}
35
Michael Neuling2f6093c2006-08-07 16:19:19 +100036static inline long unregister_slb_shadow(unsigned long cpu, unsigned long vpa)
37{
38 return vpa_call(0x7, cpu, vpa);
39}
40
41static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)
42{
43 return vpa_call(0x3, cpu, vpa);
44}
45
Jeremy Kerrfc59a3f2009-03-11 17:55:52 +000046static inline long unregister_dtl(unsigned long cpu, unsigned long vpa)
47{
48 return vpa_call(0x6, cpu, vpa);
49}
50
51static inline long register_dtl(unsigned long cpu, unsigned long vpa)
52{
53 return vpa_call(0x2, cpu, vpa);
54}
55
Brian King86630a32008-07-24 04:29:16 +100056static inline long plpar_page_set_loaned(unsigned long vpa)
57{
Brian King370e4582008-08-16 05:09:33 +100058 unsigned long cmo_page_sz = cmo_get_page_size();
59 long rc = 0;
60 int i;
61
62 for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
63 rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0);
64
65 for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
66 plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE,
67 vpa + i - cmo_page_sz, 0);
68
69 return rc;
Brian King86630a32008-07-24 04:29:16 +100070}
71
72static inline long plpar_page_set_active(unsigned long vpa)
73{
Brian King370e4582008-08-16 05:09:33 +100074 unsigned long cmo_page_sz = cmo_get_page_size();
75 long rc = 0;
76 int i;
77
78 for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
79 rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0);
80
81 for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
82 plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED,
83 vpa + i - cmo_page_sz, 0);
84
85 return rc;
Brian King86630a32008-07-24 04:29:16 +100086}
87
Michael Ellerman40765d22005-11-03 19:34:38 +110088extern void vpa_init(int cpu);
Michael Ellermana1218722005-11-03 15:33:31 +110089
Anton Blanchardb9377ff2006-07-19 08:01:28 +100090static inline long plpar_pte_enter(unsigned long flags,
91 unsigned long hpte_group, unsigned long hpte_v,
92 unsigned long hpte_r, unsigned long *slot)
93{
94 long rc;
95 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
96
97 rc = plpar_hcall(H_ENTER, retbuf, flags, hpte_group, hpte_v, hpte_r);
98
99 *slot = retbuf[0];
100
101 return rc;
102}
103
Michael Ellermana1218722005-11-03 15:33:31 +1100104static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,
105 unsigned long avpn, unsigned long *old_pteh_ret,
106 unsigned long *old_ptel_ret)
107{
Anton Blanchardb9377ff2006-07-19 08:01:28 +1000108 long rc;
109 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
110
111 rc = plpar_hcall(H_REMOVE, retbuf, flags, ptex, avpn);
112
113 *old_pteh_ret = retbuf[0];
114 *old_ptel_ret = retbuf[1];
115
116 return rc;
Michael Ellermana1218722005-11-03 15:33:31 +1100117}
118
Mohan Kumar Mb4aea362007-03-21 11:21:32 +0530119/* plpar_pte_remove_raw can be called in real mode. It calls plpar_hcall_raw */
120static inline long plpar_pte_remove_raw(unsigned long flags, unsigned long ptex,
121 unsigned long avpn, unsigned long *old_pteh_ret,
122 unsigned long *old_ptel_ret)
123{
124 long rc;
125 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
126
127 rc = plpar_hcall_raw(H_REMOVE, retbuf, flags, ptex, avpn);
128
129 *old_pteh_ret = retbuf[0];
130 *old_ptel_ret = retbuf[1];
131
132 return rc;
133}
134
Michael Ellermana1218722005-11-03 15:33:31 +1100135static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,
136 unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
137{
Anton Blanchardb9377ff2006-07-19 08:01:28 +1000138 long rc;
139 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
140
141 rc = plpar_hcall(H_READ, retbuf, flags, ptex);
142
143 *old_pteh_ret = retbuf[0];
144 *old_ptel_ret = retbuf[1];
145
146 return rc;
Michael Ellermana1218722005-11-03 15:33:31 +1100147}
148
Sachin P. Santb7abc5c2007-06-14 15:31:34 +1000149/* plpar_pte_read_raw can be called in real mode. It calls plpar_hcall_raw */
150static inline long plpar_pte_read_raw(unsigned long flags, unsigned long ptex,
151 unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
152{
153 long rc;
154 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
155
156 rc = plpar_hcall_raw(H_READ, retbuf, flags, ptex);
157
158 *old_pteh_ret = retbuf[0];
159 *old_ptel_ret = retbuf[1];
160
161 return rc;
162}
163
Michael Ellermana1218722005-11-03 15:33:31 +1100164static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,
165 unsigned long avpn)
166{
167 return plpar_hcall_norets(H_PROTECT, flags, ptex, avpn);
168}
169
170static inline long plpar_tce_get(unsigned long liobn, unsigned long ioba,
171 unsigned long *tce_ret)
172{
Anton Blanchardb9377ff2006-07-19 08:01:28 +1000173 long rc;
174 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
175
176 rc = plpar_hcall(H_GET_TCE, retbuf, liobn, ioba);
177
178 *tce_ret = retbuf[0];
179
180 return rc;
Michael Ellermana1218722005-11-03 15:33:31 +1100181}
182
183static inline long plpar_tce_put(unsigned long liobn, unsigned long ioba,
184 unsigned long tceval)
185{
186 return plpar_hcall_norets(H_PUT_TCE, liobn, ioba, tceval);
187}
188
189static inline long plpar_tce_put_indirect(unsigned long liobn,
190 unsigned long ioba, unsigned long page, unsigned long count)
191{
192 return plpar_hcall_norets(H_PUT_TCE_INDIRECT, liobn, ioba, page, count);
193}
194
195static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,
196 unsigned long tceval, unsigned long count)
197{
198 return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);
199}
200
201static inline long plpar_get_term_char(unsigned long termno,
202 unsigned long *len_ret, char *buf_ret)
203{
Anton Blanchardb9377ff2006-07-19 08:01:28 +1000204 long rc;
205 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
Michael Ellermana1218722005-11-03 15:33:31 +1100206 unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */
Anton Blanchardb9377ff2006-07-19 08:01:28 +1000207
208 rc = plpar_hcall(H_GET_TERM_CHAR, retbuf, termno);
209
210 *len_ret = retbuf[0];
211 lbuf[0] = retbuf[1];
212 lbuf[1] = retbuf[2];
213
214 return rc;
Michael Ellermana1218722005-11-03 15:33:31 +1100215}
216
217static inline long plpar_put_term_char(unsigned long termno, unsigned long len,
218 const char *buffer)
219{
220 unsigned long *lbuf = (unsigned long *)buffer; /* TODO: alignment? */
221 return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],
222 lbuf[1]);
223}
224
Anton Blanchardb9377ff2006-07-19 08:01:28 +1000225static inline long plpar_eoi(unsigned long xirr)
226{
227 return plpar_hcall_norets(H_EOI, xirr);
228}
229
230static inline long plpar_cppr(unsigned long cppr)
231{
232 return plpar_hcall_norets(H_CPPR, cppr);
233}
234
235static inline long plpar_ipi(unsigned long servernum, unsigned long mfrr)
236{
237 return plpar_hcall_norets(H_IPI, servernum, mfrr);
238}
239
240static inline long plpar_xirr(unsigned long *xirr_ret)
241{
242 long rc;
243 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
244
245 rc = plpar_hcall(H_XIRR, retbuf);
246
247 *xirr_ret = retbuf[0];
248
249 return rc;
250}
251
Michael Ellermana1218722005-11-03 15:33:31 +1100252#endif /* _PSERIES_PLPAR_WRAPPERS_H */