1/* SPDX-License-Identifier: GPL-2.0 */
2/* pci_sun4v_asm: Hypervisor calls for PCI support.
3 *
4 * Copyright (C) 2006, 2008 David S. Miller <davem@davemloft.net>
5 */
6
7#include <linux/linkage.h>
8#include <asm/hypervisor.h>
9
10 /* %o0: devhandle
11 * %o1: tsbid
12 * %o2: num ttes
13 * %o3: io_attributes
14 * %o4: io_page_list phys address
15 *
16 * returns %o0: -status if status was non-zero, else
17 * %o0: num pages mapped
18 */
19ENTRY(pci_sun4v_iommu_map)
20 mov %o5, %g1
21 mov HV_FAST_PCI_IOMMU_MAP, %o5
22 ta HV_FAST_TRAP
23 brnz,pn %o0, 1f
24 sub %g0, %o0, %o0
25 mov %o1, %o0
261: retl
27 nop
28ENDPROC(pci_sun4v_iommu_map)
29
30 /* %o0: devhandle
31 * %o1: tsbid
32 * %o2: num ttes
33 *
34 * returns %o0: num ttes demapped
35 */
36ENTRY(pci_sun4v_iommu_demap)
37 mov HV_FAST_PCI_IOMMU_DEMAP, %o5
38 ta HV_FAST_TRAP
39 retl
40 mov %o1, %o0
41ENDPROC(pci_sun4v_iommu_demap)
42
43 /* %o0: devhandle
44 * %o1: tsbid
45 * %o2: &io_attributes
46 * %o3: &real_address
47 *
48 * returns %o0: status
49 */
50ENTRY(pci_sun4v_iommu_getmap)
51 mov %o2, %o4
52 mov HV_FAST_PCI_IOMMU_GETMAP, %o5
53 ta HV_FAST_TRAP
54 stx %o1, [%o4]
55 stx %o2, [%o3]
56 retl
57 mov %o0, %o0
58ENDPROC(pci_sun4v_iommu_getmap)
59
60 /* %o0: devhandle
61 * %o1: pci_device
62 * %o2: pci_config_offset
63 * %o3: size
64 *
65 * returns %o0: data
66 *
67 * If there is an error, the data will be returned
68 * as all 1's.
69 */
70ENTRY(pci_sun4v_config_get)
71 mov HV_FAST_PCI_CONFIG_GET, %o5
72 ta HV_FAST_TRAP
73 brnz,a,pn %o1, 1f
74 mov -1, %o2
751: retl
76 mov %o2, %o0
77ENDPROC(pci_sun4v_config_get)
78
79 /* %o0: devhandle
80 * %o1: pci_device
81 * %o2: pci_config_offset
82 * %o3: size
83 * %o4: data
84 *
85 * returns %o0: status
86 *
87 * status will be zero if the operation completed
88 * successfully, else -1 if not
89 */
90ENTRY(pci_sun4v_config_put)
91 mov HV_FAST_PCI_CONFIG_PUT, %o5
92 ta HV_FAST_TRAP
93 brnz,a,pn %o1, 1f
94 mov -1, %o1
951: retl
96 mov %o1, %o0
97ENDPROC(pci_sun4v_config_put)
98
99 /* %o0: devhandle
100 * %o1: msiqid
101 * %o2: msiq phys address
102 * %o3: num entries
103 *
104 * returns %o0: status
105 *
106 * status will be zero if the operation completed
107 * successfully, else -1 if not
108 */
109ENTRY(pci_sun4v_msiq_conf)
110 mov HV_FAST_PCI_MSIQ_CONF, %o5
111 ta HV_FAST_TRAP
112 retl
113 mov %o0, %o0
114ENDPROC(pci_sun4v_msiq_conf)
115
116 /* %o0: devhandle
117 * %o1: msiqid
118 * %o2: &msiq_phys_addr
119 * %o3: &msiq_num_entries
120 *
121 * returns %o0: status
122 */
123ENTRY(pci_sun4v_msiq_info)
124 mov %o2, %o4
125 mov HV_FAST_PCI_MSIQ_INFO, %o5
126 ta HV_FAST_TRAP
127 stx %o1, [%o4]
128 stx %o2, [%o3]
129 retl
130 mov %o0, %o0
131ENDPROC(pci_sun4v_msiq_info)
132
133 /* %o0: devhandle
134 * %o1: msiqid
135 * %o2: &valid
136 *
137 * returns %o0: status
138 */
139ENTRY(pci_sun4v_msiq_getvalid)
140 mov HV_FAST_PCI_MSIQ_GETVALID, %o5
141 ta HV_FAST_TRAP
142 stx %o1, [%o2]
143 retl
144 mov %o0, %o0
145ENDPROC(pci_sun4v_msiq_getvalid)
146
147 /* %o0: devhandle
148 * %o1: msiqid
149 * %o2: valid
150 *
151 * returns %o0: status
152 */
153ENTRY(pci_sun4v_msiq_setvalid)
154 mov HV_FAST_PCI_MSIQ_SETVALID, %o5
155 ta HV_FAST_TRAP
156 retl
157 mov %o0, %o0
158ENDPROC(pci_sun4v_msiq_setvalid)
159
160 /* %o0: devhandle
161 * %o1: msiqid
162 * %o2: &state
163 *
164 * returns %o0: status
165 */
166ENTRY(pci_sun4v_msiq_getstate)
167 mov HV_FAST_PCI_MSIQ_GETSTATE, %o5
168 ta HV_FAST_TRAP
169 stx %o1, [%o2]
170 retl
171 mov %o0, %o0
172ENDPROC(pci_sun4v_msiq_getstate)
173
174 /* %o0: devhandle
175 * %o1: msiqid
176 * %o2: state
177 *
178 * returns %o0: status
179 */
180ENTRY(pci_sun4v_msiq_setstate)
181 mov HV_FAST_PCI_MSIQ_SETSTATE, %o5
182 ta HV_FAST_TRAP
183 retl
184 mov %o0, %o0
185ENDPROC(pci_sun4v_msiq_setstate)
186
187 /* %o0: devhandle
188 * %o1: msiqid
189 * %o2: &head
190 *
191 * returns %o0: status
192 */
193ENTRY(pci_sun4v_msiq_gethead)
194 mov HV_FAST_PCI_MSIQ_GETHEAD, %o5
195 ta HV_FAST_TRAP
196 stx %o1, [%o2]
197 retl
198 mov %o0, %o0
199ENDPROC(pci_sun4v_msiq_gethead)
200
201 /* %o0: devhandle
202 * %o1: msiqid
203 * %o2: head
204 *
205 * returns %o0: status
206 */
207ENTRY(pci_sun4v_msiq_sethead)
208 mov HV_FAST_PCI_MSIQ_SETHEAD, %o5
209 ta HV_FAST_TRAP
210 retl
211 mov %o0, %o0
212ENDPROC(pci_sun4v_msiq_sethead)
213
214 /* %o0: devhandle
215 * %o1: msiqid
216 * %o2: &tail
217 *
218 * returns %o0: status
219 */
220ENTRY(pci_sun4v_msiq_gettail)
221 mov HV_FAST_PCI_MSIQ_GETTAIL, %o5
222 ta HV_FAST_TRAP
223 stx %o1, [%o2]
224 retl
225 mov %o0, %o0
226ENDPROC(pci_sun4v_msiq_gettail)
227
228 /* %o0: devhandle
229 * %o1: msinum
230 * %o2: &valid
231 *
232 * returns %o0: status
233 */
234ENTRY(pci_sun4v_msi_getvalid)
235 mov HV_FAST_PCI_MSI_GETVALID, %o5
236 ta HV_FAST_TRAP
237 stx %o1, [%o2]
238 retl
239 mov %o0, %o0
240ENDPROC(pci_sun4v_msi_getvalid)
241
242 /* %o0: devhandle
243 * %o1: msinum
244 * %o2: valid
245 *
246 * returns %o0: status
247 */
248ENTRY(pci_sun4v_msi_setvalid)
249 mov HV_FAST_PCI_MSI_SETVALID, %o5
250 ta HV_FAST_TRAP
251 retl
252 mov %o0, %o0
253ENDPROC(pci_sun4v_msi_setvalid)
254
255 /* %o0: devhandle
256 * %o1: msinum
257 * %o2: &msiq
258 *
259 * returns %o0: status
260 */
261ENTRY(pci_sun4v_msi_getmsiq)
262 mov HV_FAST_PCI_MSI_GETMSIQ, %o5
263 ta HV_FAST_TRAP
264 stx %o1, [%o2]
265 retl
266 mov %o0, %o0
267ENDPROC(pci_sun4v_msi_getmsiq)
268
269 /* %o0: devhandle
270 * %o1: msinum
271 * %o2: msitype
272 * %o3: msiq
273 *
274 * returns %o0: status
275 */
276ENTRY(pci_sun4v_msi_setmsiq)
277 mov HV_FAST_PCI_MSI_SETMSIQ, %o5
278 ta HV_FAST_TRAP
279 retl
280 mov %o0, %o0
281ENDPROC(pci_sun4v_msi_setmsiq)
282
283 /* %o0: devhandle
284 * %o1: msinum
285 * %o2: &state
286 *
287 * returns %o0: status
288 */
289ENTRY(pci_sun4v_msi_getstate)
290 mov HV_FAST_PCI_MSI_GETSTATE, %o5
291 ta HV_FAST_TRAP
292 stx %o1, [%o2]
293 retl
294 mov %o0, %o0
295ENDPROC(pci_sun4v_msi_getstate)
296
297 /* %o0: devhandle
298 * %o1: msinum
299 * %o2: state
300 *
301 * returns %o0: status
302 */
303ENTRY(pci_sun4v_msi_setstate)
304 mov HV_FAST_PCI_MSI_SETSTATE, %o5
305 ta HV_FAST_TRAP
306 retl
307 mov %o0, %o0
308ENDPROC(pci_sun4v_msi_setstate)
309
310 /* %o0: devhandle
311 * %o1: msinum
312 * %o2: &msiq
313 *
314 * returns %o0: status
315 */
316ENTRY(pci_sun4v_msg_getmsiq)
317 mov HV_FAST_PCI_MSG_GETMSIQ, %o5
318 ta HV_FAST_TRAP
319 stx %o1, [%o2]
320 retl
321 mov %o0, %o0
322ENDPROC(pci_sun4v_msg_getmsiq)
323
324 /* %o0: devhandle
325 * %o1: msinum
326 * %o2: msiq
327 *
328 * returns %o0: status
329 */
330ENTRY(pci_sun4v_msg_setmsiq)
331 mov HV_FAST_PCI_MSG_SETMSIQ, %o5
332 ta HV_FAST_TRAP
333 retl
334 mov %o0, %o0
335ENDPROC(pci_sun4v_msg_setmsiq)
336
337 /* %o0: devhandle
338 * %o1: msinum
339 * %o2: &valid
340 *
341 * returns %o0: status
342 */
343ENTRY(pci_sun4v_msg_getvalid)
344 mov HV_FAST_PCI_MSG_GETVALID, %o5
345 ta HV_FAST_TRAP
346 stx %o1, [%o2]
347 retl
348 mov %o0, %o0
349ENDPROC(pci_sun4v_msg_getvalid)
350
351 /* %o0: devhandle
352 * %o1: msinum
353 * %o2: valid
354 *
355 * returns %o0: status
356 */
357ENTRY(pci_sun4v_msg_setvalid)
358 mov HV_FAST_PCI_MSG_SETVALID, %o5
359 ta HV_FAST_TRAP
360 retl
361 mov %o0, %o0
362ENDPROC(pci_sun4v_msg_setvalid)
363
364 /*
365 * %o0: devhandle
366 * %o1: r_addr
367 * %o2: size
368 * %o3: pagesize
369 * %o4: virt
370 * %o5: &iotsb_num/&iotsb_handle
371 *
372 * returns %o0: status
373 * %o1: iotsb_num/iotsb_handle
374 */
375ENTRY(pci_sun4v_iotsb_conf)
376 mov %o5, %g1
377 mov HV_FAST_PCI_IOTSB_CONF, %o5
378 ta HV_FAST_TRAP
379 retl
380 stx %o1, [%g1]
381ENDPROC(pci_sun4v_iotsb_conf)
382
383 /*
384 * %o0: devhandle
385 * %o1: iotsb_num/iotsb_handle
386 * %o2: pci_device
387 *
388 * returns %o0: status
389 */
390ENTRY(pci_sun4v_iotsb_bind)
391 mov HV_FAST_PCI_IOTSB_BIND, %o5
392 ta HV_FAST_TRAP
393 retl
394 nop
395ENDPROC(pci_sun4v_iotsb_bind)
396
397 /*
398 * %o0: devhandle
399 * %o1: iotsb_num/iotsb_handle
400 * %o2: index_count
401 * %o3: iotte_attributes
402 * %o4: io_page_list_p
403 * %o5: &mapped
404 *
405 * returns %o0: status
406 * %o1: #mapped
407 */
408ENTRY(pci_sun4v_iotsb_map)
409 mov %o5, %g1
410 mov HV_FAST_PCI_IOTSB_MAP, %o5
411 ta HV_FAST_TRAP
412 retl
413 stx %o1, [%g1]
414ENDPROC(pci_sun4v_iotsb_map)
415
416 /*
417 * %o0: devhandle
418 * %o1: iotsb_num/iotsb_handle
419 * %o2: iotsb_index
420 * %o3: #iottes
421 * %o4: &demapped
422 *
423 * returns %o0: status
424 * %o1: #demapped
425 */
426ENTRY(pci_sun4v_iotsb_demap)
427 mov HV_FAST_PCI_IOTSB_DEMAP, %o5
428 ta HV_FAST_TRAP
429 retl
430 stx %o1, [%o4]
431ENDPROC(pci_sun4v_iotsb_demap)
432

source code of linux/arch/sparc/kernel/pci_sun4v_asm.S