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