Revert "Merge remote-tracking branch 'linux-2.6.32.y/master' into develop"
[firefly-linux-kernel-4.4.55.git] / arch / powerpc / platforms / pseries / plpar_wrappers.h
1 #ifndef _PSERIES_PLPAR_WRAPPERS_H
2 #define _PSERIES_PLPAR_WRAPPERS_H
3
4 #include <asm/hvcall.h>
5 #include <asm/page.h>
6
7 /* Get state of physical CPU from query_cpu_stopped */
8 int smp_query_cpu_stopped(unsigned int pcpu);
9 #define QCSS_STOPPED 0
10 #define QCSS_STOPPING 1
11 #define QCSS_NOT_STOPPED 2
12 #define QCSS_HARDWARE_ERROR -1
13 #define QCSS_HARDWARE_BUSY -2
14
15 static inline long poll_pending(void)
16 {
17         return plpar_hcall_norets(H_POLL_PENDING);
18 }
19
20 static inline long cede_processor(void)
21 {
22         return plpar_hcall_norets(H_CEDE);
23 }
24
25 static inline long vpa_call(unsigned long flags, unsigned long cpu,
26                 unsigned long vpa)
27 {
28         /* flags are in bits 16-18 (counting from most significant bit) */
29         flags = flags << (63 - 18);
30
31         return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);
32 }
33
34 static inline long unregister_vpa(unsigned long cpu, unsigned long vpa)
35 {
36         return vpa_call(0x5, cpu, vpa);
37 }
38
39 static inline long register_vpa(unsigned long cpu, unsigned long vpa)
40 {
41         return vpa_call(0x1, cpu, vpa);
42 }
43
44 static inline long unregister_slb_shadow(unsigned long cpu, unsigned long vpa)
45 {
46         return vpa_call(0x7, cpu, vpa);
47 }
48
49 static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)
50 {
51         return vpa_call(0x3, cpu, vpa);
52 }
53
54 static inline long unregister_dtl(unsigned long cpu, unsigned long vpa)
55 {
56         return vpa_call(0x6, cpu, vpa);
57 }
58
59 static inline long register_dtl(unsigned long cpu, unsigned long vpa)
60 {
61         return vpa_call(0x2, cpu, vpa);
62 }
63
64 static inline long plpar_page_set_loaned(unsigned long vpa)
65 {
66         unsigned long cmo_page_sz = cmo_get_page_size();
67         long rc = 0;
68         int i;
69
70         for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
71                 rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0);
72
73         for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
74                 plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE,
75                                    vpa + i - cmo_page_sz, 0);
76
77         return rc;
78 }
79
80 static inline long plpar_page_set_active(unsigned long vpa)
81 {
82         unsigned long cmo_page_sz = cmo_get_page_size();
83         long rc = 0;
84         int i;
85
86         for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
87                 rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0);
88
89         for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
90                 plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED,
91                                    vpa + i - cmo_page_sz, 0);
92
93         return rc;
94 }
95
96 extern void vpa_init(int cpu);
97
98 static inline long plpar_pte_enter(unsigned long flags,
99                 unsigned long hpte_group, unsigned long hpte_v,
100                 unsigned long hpte_r, unsigned long *slot)
101 {
102         long rc;
103         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
104
105         rc = plpar_hcall(H_ENTER, retbuf, flags, hpte_group, hpte_v, hpte_r);
106
107         *slot = retbuf[0];
108
109         return rc;
110 }
111
112 static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,
113                 unsigned long avpn, unsigned long *old_pteh_ret,
114                 unsigned long *old_ptel_ret)
115 {
116         long rc;
117         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
118
119         rc = plpar_hcall(H_REMOVE, retbuf, flags, ptex, avpn);
120
121         *old_pteh_ret = retbuf[0];
122         *old_ptel_ret = retbuf[1];
123
124         return rc;
125 }
126
127 /* plpar_pte_remove_raw can be called in real mode. It calls plpar_hcall_raw */
128 static inline long plpar_pte_remove_raw(unsigned long flags, unsigned long ptex,
129                 unsigned long avpn, unsigned long *old_pteh_ret,
130                 unsigned long *old_ptel_ret)
131 {
132         long rc;
133         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
134
135         rc = plpar_hcall_raw(H_REMOVE, retbuf, flags, ptex, avpn);
136
137         *old_pteh_ret = retbuf[0];
138         *old_ptel_ret = retbuf[1];
139
140         return rc;
141 }
142
143 static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,
144                 unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
145 {
146         long rc;
147         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
148
149         rc = plpar_hcall(H_READ, retbuf, flags, ptex);
150
151         *old_pteh_ret = retbuf[0];
152         *old_ptel_ret = retbuf[1];
153
154         return rc;
155 }
156
157 /* plpar_pte_read_raw can be called in real mode. It calls plpar_hcall_raw */
158 static inline long plpar_pte_read_raw(unsigned long flags, unsigned long ptex,
159                 unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
160 {
161         long rc;
162         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
163
164         rc = plpar_hcall_raw(H_READ, retbuf, flags, ptex);
165
166         *old_pteh_ret = retbuf[0];
167         *old_ptel_ret = retbuf[1];
168
169         return rc;
170 }
171
172 static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,
173                 unsigned long avpn)
174 {
175         return plpar_hcall_norets(H_PROTECT, flags, ptex, avpn);
176 }
177
178 static inline long plpar_tce_get(unsigned long liobn, unsigned long ioba,
179                 unsigned long *tce_ret)
180 {
181         long rc;
182         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
183
184         rc = plpar_hcall(H_GET_TCE, retbuf, liobn, ioba);
185
186         *tce_ret = retbuf[0];
187
188         return rc;
189 }
190
191 static inline long plpar_tce_put(unsigned long liobn, unsigned long ioba,
192                 unsigned long tceval)
193 {
194         return plpar_hcall_norets(H_PUT_TCE, liobn, ioba, tceval);
195 }
196
197 static inline long plpar_tce_put_indirect(unsigned long liobn,
198                 unsigned long ioba, unsigned long page, unsigned long count)
199 {
200         return plpar_hcall_norets(H_PUT_TCE_INDIRECT, liobn, ioba, page, count);
201 }
202
203 static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,
204                 unsigned long tceval, unsigned long count)
205 {
206         return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);
207 }
208
209 static inline long plpar_get_term_char(unsigned long termno,
210                 unsigned long *len_ret, char *buf_ret)
211 {
212         long rc;
213         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
214         unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */
215
216         rc = plpar_hcall(H_GET_TERM_CHAR, retbuf, termno);
217
218         *len_ret = retbuf[0];
219         lbuf[0] = retbuf[1];
220         lbuf[1] = retbuf[2];
221
222         return rc;
223 }
224
225 static inline long plpar_put_term_char(unsigned long termno, unsigned long len,
226                 const char *buffer)
227 {
228         unsigned long *lbuf = (unsigned long *)buffer;  /* TODO: alignment? */
229         return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],
230                         lbuf[1]);
231 }
232
233 static inline long plpar_eoi(unsigned long xirr)
234 {
235         return plpar_hcall_norets(H_EOI, xirr);
236 }
237
238 static inline long plpar_cppr(unsigned long cppr)
239 {
240         return plpar_hcall_norets(H_CPPR, cppr);
241 }
242
243 static inline long plpar_ipi(unsigned long servernum, unsigned long mfrr)
244 {
245         return plpar_hcall_norets(H_IPI, servernum, mfrr);
246 }
247
248 static inline long plpar_xirr(unsigned long *xirr_ret)
249 {
250         long rc;
251         unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
252
253         rc = plpar_hcall(H_XIRR, retbuf);
254
255         *xirr_ret = retbuf[0];
256
257         return rc;
258 }
259
260 #endif /* _PSERIES_PLPAR_WRAPPERS_H */