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