xref: /illumos-gate/usr/src/uts/sun4v/io/px/px_hcall.S (revision 55fea89d)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26
27/*
28 * Hypervisor calls called by px nexus driver.
29*/
30
31#include <sys/asm_linkage.h>
32#include <sys/hypervisor_api.h>
33#include <sys/dditypes.h>
34#include <px_ioapi.h>
35#include "px_lib4v.h"
36
37	/*
38	 * arg0 - devhandle
39	 * arg1 - tsbid
40	 * arg2 - pages
41	 * arg3 - io_attributes
42	 * arg4 - io_page_list_p
43	 *
44	 * ret1 - pages_mapped
45	 */
46	ENTRY(hvio_iommu_map)
47	save	%sp, -SA(MINFRAME64), %sp
48	mov	%i0, %o0
49	mov	%i1, %o1
50	mov	%i2, %o2
51	mov	%i3, %o3
52	mov	%i4, %o4
53	mov	HVIO_IOMMU_MAP, %o5
54	ta	FAST_TRAP
55	brnz	%o0, 1f
56	mov	%o0, %i0
57	stuw	%o1, [%i5]
581:
59	ret
60	restore
61	SET_SIZE(hvio_iommu_map)
62
63	/*
64	 * arg0 - devhandle
65	 * arg1 - tsbid
66	 * arg2 - pages
67	 *
68	 * ret1 - pages_demapped
69	 */
70	ENTRY(hvio_iommu_demap)
71	mov	HVIO_IOMMU_DEMAP, %o5
72	ta	FAST_TRAP
73	brz,a	%o0, 1f
74	stuw	%o1, [%o3]
751:	retl
76	nop
77	SET_SIZE(hvio_iommu_demap)
78
79	/*
80	 * arg0 - devhandle
81	 * arg1 - tsbid
82	 *
83	 *
84	 * ret0 - status
85	 * ret1 - io_attributes
86	 * ret2 - r_addr
87	 */
88	ENTRY(hvio_iommu_getmap)
89	mov	%o2, %o4
90	mov	HVIO_IOMMU_GETMAP, %o5
91	ta	FAST_TRAP
92	brnz	%o0, 1f
93	nop
94	stx	%o2, [%o3]
95	st	%o1, [%o4]
961:
97	retl
98	nop
99	SET_SIZE(hvio_iommu_getmap)
100
101	/*
102	 * arg0 - devhandle
103	 * arg1 - r_addr
104	 * arg2 - io_attributes
105	 *
106	 *
107	 * ret0 - status
108	 * ret1 - io_addr
109	 */
110	ENTRY(hvio_iommu_getbypass)
111	mov	HVIO_IOMMU_GETBYPASS, %o5
112	ta	FAST_TRAP
113	brz,a	%o0, 1f
114	stx	%o1, [%o3]
1151:	retl
116	nop
117	SET_SIZE(hvio_iommu_getbypass)
118
119	/*
120	 * arg0 - devhandle
121	 * arg1 - r_addr
122	 * arg2 - size
123	 *
124	 * ret1 - error_flag
125	 * ret2 - data
126	 */
127	ENTRY(hvio_peek)
128	mov	HVIO_PEEK, %o5
129	ta	FAST_TRAP
130	brnz	%o0, 1f
131	nop
132	stx	%o2, [%o4]
133	st	%o1, [%o3]
1341:
135	retl
136	nop
137	SET_SIZE(hvio_peek)
138
139	/*
140	 * arg0 - devhandle
141	 * arg1 - r_addr
142	 * arg2 - sizes
143	 * arg3 - data
144	 * arg4 - r_addr2
145	 *
146	 * ret1 - error_flag
147	 */
148	ENTRY(hvio_poke)
149	save	%sp, -SA(MINFRAME64), %sp
150	mov	%i0, %o0
151	mov	%i1, %o1
152	mov	%i2, %o2
153	mov	%i3, %o3
154	mov	%i4, %o4
155	mov	HVIO_POKE, %o5
156	ta	FAST_TRAP
157	brnz	%o0, 1f
158	mov	%o0, %i0
159	stuw	%o1, [%i5]
1601:
161	ret
162	restore
163	SET_SIZE(hvio_poke)
164
165	/*
166	 * arg0 - devhandle
167	 * arg1 - r_addr
168	 * arg2 - num_bytes
169	 * arg3 - io_sync_direction
170	 *
171	 * ret0 - status
172	 * ret1 - bytes_synched
173	 */
174	ENTRY(hvio_dma_sync)
175	mov	HVIO_DMA_SYNC, %o5
176	ta	FAST_TRAP
177	brz,a	%o0, 1f
178	stx	%o1, [%o4]
1791:	retl
180	nop
181	SET_SIZE(hvio_dma_sync)
182
183	/*
184	 * arg0 - devhandle
185	 * arg1 - msiq_id
186	 * arg2 - r_addr
187	 * arg3 - nentries
188	 *
189	 * ret0 - status
190	 */
191	ENTRY(hvio_msiq_conf)
192	mov	HVIO_MSIQ_CONF, %o5
193	ta	FAST_TRAP
194	retl
195	nop
196	SET_SIZE(hvio_msiq_conf)
197
198	/*
199	 * arg0 - devhandle
200	 * arg1 - msiq_id
201	 *
202	 * ret0 - status
203	 * ret1 - r_addr
204	 * ret1 - nentries
205	 */
206	ENTRY(hvio_msiq_info)
207	mov     %o2, %o4
208	mov     HVIO_MSIQ_INFO, %o5
209	ta      FAST_TRAP
210	brnz	%o0, 1f
211	nop
212	stx     %o1, [%o4]
213	stuw    %o2, [%o3]
2141:      retl
215	nop
216	SET_SIZE(hvio_msiq_info)
217
218	/*
219	 * arg0 - devhandle
220	 * arg1 - msiq_id
221	 *
222	 * ret0 - status
223	 * ret1 - msiq_valid_state
224	 */
225	ENTRY(hvio_msiq_getvalid)
226	mov	HVIO_MSIQ_GETVALID, %o5
227	ta	FAST_TRAP
228	brz,a	%o0, 1f
229	stuw	%o1, [%o2]
2301:	retl
231	nop
232	SET_SIZE(hvio_msiq_getvalid)
233
234	/*
235	 * arg0 - devhandle
236	 * arg1 - msiq_id
237	 * arg2 - msiq_valid_state
238	 *
239	 * ret0 - status
240	 */
241	ENTRY(hvio_msiq_setvalid)
242	mov	HVIO_MSIQ_SETVALID, %o5
243	ta	FAST_TRAP
244	retl
245	nop
246	SET_SIZE(hvio_msiq_setvalid)
247
248	/*
249	 * arg0 - devhandle
250	 * arg1 - msiq_id
251	 *
252	 * ret0 - status
253	 * ret1 - msiq_state
254	 */
255	ENTRY(hvio_msiq_getstate)
256	mov	HVIO_MSIQ_GETSTATE, %o5
257	ta	FAST_TRAP
258	brz,a	%o0, 1f
259	stuw	%o1, [%o2]
2601:	retl
261	nop
262	SET_SIZE(hvio_msiq_getstate)
263
264	/*
265	 * arg0 - devhandle
266	 * arg1 - msiq_id
267	 * arg2 - msiq_state
268	 *
269	 * ret0 - status
270	 */
271	ENTRY(hvio_msiq_setstate)
272	mov	HVIO_MSIQ_SETSTATE, %o5
273	ta	FAST_TRAP
274	retl
275	nop
276	SET_SIZE(hvio_msiq_setstate)
277
278	/*
279	 * arg0 - devhandle
280	 * arg1 - msiq_id
281	 *
282	 * ret0 - status
283	 * ret1 - msiq_head
284	 */
285	ENTRY(hvio_msiq_gethead)
286	mov	HVIO_MSIQ_GETHEAD, %o5
287	ta	FAST_TRAP
288	brz,a	%o0, 1f
289	stx	%o1, [%o2]
2901:	retl
291	nop
292	SET_SIZE(hvio_msiq_gethead)
293
294	/*
295	 * arg0 - devhandle
296	 * arg1 - msiq_id
297	 * arg2 - msiq_head
298	 *
299	 * ret0 - status
300	 */
301	ENTRY(hvio_msiq_sethead)
302	mov	HVIO_MSIQ_SETHEAD, %o5
303	ta	FAST_TRAP
304	retl
305	nop
306	SET_SIZE(hvio_msiq_sethead)
307
308	/*
309	 * arg0 - devhandle
310	 * arg1 - msiq_id
311	 *
312	 * ret0 - status
313	 * ret1 - msiq_tail
314	 */
315	ENTRY(hvio_msiq_gettail)
316	mov	HVIO_MSIQ_GETTAIL, %o5
317	ta	FAST_TRAP
318	brz,a	%o0, 1f
319	stx	%o1, [%o2]
3201:	retl
321	nop
322	SET_SIZE(hvio_msiq_gettail)
323
324	/*
325	 * arg0 - devhandle
326	 * arg1 - msi_num
327	 *
328	 * ret0 - status
329	 * ret1 - msiq_id
330	 */
331	ENTRY(hvio_msi_getmsiq)
332	mov	HVIO_MSI_GETMSIQ, %o5
333	ta	FAST_TRAP
334	brz,a	%o0, 1f
335	stuw	%o1, [%o2]
3361:	retl
337	nop
338	SET_SIZE(hvio_msi_getmsiq)
339
340	/*
341	 * arg0 - devhandle
342	 * arg1 - msi_num
343	 * arg2 - msiq_id
344	 * arg2 - msitype
345	 *
346	 * ret0 - status
347	 */
348	ENTRY(hvio_msi_setmsiq)
349	mov	HVIO_MSI_SETMSIQ, %o5
350	ta	FAST_TRAP
351	retl
352	nop
353	SET_SIZE(hvio_msi_setmsiq)
354
355	/*
356	 * arg0 - devhandle
357	 * arg1 - msi_num
358	 *
359	 * ret0 - status
360	 * ret1 - msi_valid_state
361	 */
362	ENTRY(hvio_msi_getvalid)
363	mov	HVIO_MSI_GETVALID, %o5
364	ta	FAST_TRAP
365	brz,a	%o0, 1f
366	stuw	%o1, [%o2]
3671:	retl
368	nop
369	SET_SIZE(hvio_msi_getvalid)
370
371	/*
372	 * arg0 - devhandle
373	 * arg1 - msi_num
374	 * arg2 - msi_valid_state
375	 *
376	 * ret0 - status
377	 */
378	ENTRY(hvio_msi_setvalid)
379	mov	HVIO_MSI_SETVALID, %o5
380	ta	FAST_TRAP
381	retl
382	nop
383	SET_SIZE(hvio_msi_setvalid)
384
385	/*
386	 * arg0 - devhandle
387	 * arg1 - msi_num
388	 *
389	 * ret0 - status
390	 * ret1 - msi_state
391	 */
392	ENTRY(hvio_msi_getstate)
393	mov	HVIO_MSI_GETSTATE, %o5
394	ta	FAST_TRAP
395	brz,a	%o0, 1f
396	stuw	%o1, [%o2]
3971:	retl
398	nop
399	SET_SIZE(hvio_msi_getstate)
400
401	/*
402	 * arg0 - devhandle
403	 * arg1 - msi_num
404	 * arg2 - msi_state
405	 *
406	 * ret0 - status
407	 */
408	ENTRY(hvio_msi_setstate)
409	mov	HVIO_MSI_SETSTATE, %o5
410	ta	FAST_TRAP
411	retl
412	nop
413	SET_SIZE(hvio_msi_setstate)
414
415	/*
416	 * arg0 - devhandle
417	 * arg1 - msg_type
418	 *
419	 * ret0 - status
420	 * ret1 - msiq_id
421	 */
422	ENTRY(hvio_msg_getmsiq)
423	mov	HVIO_MSG_GETMSIQ, %o5
424	ta	FAST_TRAP
425	brz,a	%o0, 1f
426	stuw	%o1, [%o2]
4271:	retl
428	nop
429	SET_SIZE(hvio_msg_getmsiq)
430
431	/*
432	 * arg0 - devhandle
433	 * arg1 - msg_type
434	 * arg2 - msiq_id
435	 *
436	 * ret0 - status
437	 */
438	ENTRY(hvio_msg_setmsiq)
439	mov	HVIO_MSG_SETMSIQ, %o5
440	ta	FAST_TRAP
441	retl
442	nop
443	SET_SIZE(hvio_msg_setmsiq)
444
445	/*
446	 * arg0 - devhandle
447	 * arg1 - msg_type
448	 *
449	 * ret0 - status
450	 * ret1 - msg_valid_state
451	 */
452	ENTRY(hvio_msg_getvalid)
453	mov	HVIO_MSG_GETVALID, %o5
454	ta	FAST_TRAP
455	brz,a	%o0, 1f
456	stuw	%o1, [%o2]
4571:	retl
458	nop
459	SET_SIZE(hvio_msg_getvalid)
460
461	/*
462	 * arg0 - devhandle
463	 * arg1 - msg_type
464	 * arg2 - msg_valid_state
465	 *
466	 * ret0 - status
467	 */
468	ENTRY(hvio_msg_setvalid)
469	mov	HVIO_MSG_SETVALID, %o5
470	ta	FAST_TRAP
471	retl
472	nop
473	SET_SIZE(hvio_msg_setvalid)
474
475	/*
476	 * arg0 - devhandle
477	 * arg1 - devino
478	 * arg2 - pci_device
479	 *
480	 * ret0 - status
481	 */
482	ENTRY(pci_error_send)
483	mov	PCI_ERROR_SEND, %o5
484	ta	FAST_TRAP
485	retl
486	nop
487	SET_SIZE(pci_error_send)
488
489#define	SHIFT_REGS	mov %o1,%o0; mov %o2,%o1; mov %o3,%o2; mov %o4,%o3
490
491! px_phys_acc_4v: Do physical address read.
492!
493! After SHIFT_REGS:
494! %o0 is "from" address
495! %o1 is "to" address
496!
497! Assumes 8 byte data and that alignment is correct.
498!
499! Always returns success (0) in %o0
500
501	! px_phys_acc_4v must not be split across pages.
502	!
503	! ATTN: Be sure that the alignment value is larger than the size of
504	! the px_phys_acc_4v function.
505	!
506	.align	0x40
507
508	ENTRY(px_phys_acc_4v)
509
510	SHIFT_REGS
511	ldx	[%o0], %g1
512	stx	%g1, [%o1]
513	membar	#Sync			! Make sure the loads take
514	mov     %g0, %o0
515	done
516	SET_SIZE(px_phys_acc_4v)
517
518	/*
519	 * arg0 - devhandle
520	 *
521	 * ret0 - status
522	 */
523	ENTRY(pci_iov_root_configured)
524	mov	PCI_IOV_ROOT_CONFIGURED, %o5
525	ta	FAST_TRAP
526	retl
527	nop
528	SET_SIZE(pci_iov_root_configured)
529
530