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