1217044Snwhitehorn/*-
2217044Snwhitehorn * Copyright (C) 2010 Nathan Whitehorn
3224106Snwhitehorn * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
4217044Snwhitehorn * All rights reserved.
5217044Snwhitehorn *
6217044Snwhitehorn * Redistribution and use in source and binary forms, with or without
7217044Snwhitehorn * modification, are permitted provided that the following conditions
8217044Snwhitehorn * are met:
9217044Snwhitehorn * 1. Redistributions of source code must retain the above copyright
10217044Snwhitehorn *    notice, this list of conditions and the following disclaimer.
11217044Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright
12217044Snwhitehorn *    notice, this list of conditions and the following disclaimer in the
13217044Snwhitehorn *    documentation and/or other materials provided with the distribution.
14217044Snwhitehorn *
15217044Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16217044Snwhitehorn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17217044Snwhitehorn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18217044Snwhitehorn * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19217044Snwhitehorn * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20217044Snwhitehorn * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21217044Snwhitehorn * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22217044Snwhitehorn * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23217044Snwhitehorn * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24217044Snwhitehorn * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25217044Snwhitehorn *
26217044Snwhitehorn * $FreeBSD$
27217044Snwhitehorn */
28217044Snwhitehorn
29217044Snwhitehorn/* Hypercall stubs. Note: this is all a hack and should die. */
30217044Snwhitehorn
31217044Snwhitehorn#define	hc	.long   0x44000022
32217044Snwhitehorn
33217044Snwhitehorn#define LD64_IM(r, highest, higher, high, low) \
34217044Snwhitehorn	lis	r,highest; \
35217044Snwhitehorn	addi	r,r,higher; \
36217044Snwhitehorn	sldi	r,r,32; \
37217044Snwhitehorn	addis	r,r,high; \
38217044Snwhitehorn	addi	r,r,low;
39217044Snwhitehorn
40217044Snwhitehorn#define SIMPLE_HVCALL(x, c) \
41217044Snwhitehorn.global x;			\
42217044Snwhitehornx:				\
43217044Snwhitehorn	mflr	%r0;		\
44217044Snwhitehorn	stw	%r0,4(%r1);	\
45217044Snwhitehorn	clrldi	%r3,%r3,32;	\
46217044Snwhitehorn	clrldi	%r4,%r4,32;	\
47217044Snwhitehorn	clrldi	%r5,%r5,32;	\
48217044Snwhitehorn	clrldi	%r6,%r6,32;	\
49217044Snwhitehorn	clrldi	%r7,%r7,32;	\
50217044Snwhitehorn	clrldi	%r8,%r8,32;	\
51217044Snwhitehorn	clrldi	%r9,%r9,32;	\
52217044Snwhitehorn	clrldi	%r10,%r10,32;	\
53217044Snwhitehorn	li	%r11,c;		\
54217044Snwhitehorn	hc;			\
55217044Snwhitehorn	extsw	%r3,%r3;	\
56217044Snwhitehorn	lwz	%r0,4(%r1);	\
57217044Snwhitehorn	mtlr	%r0;		\
58217044Snwhitehorn	blr
59217044Snwhitehorn
60217044SnwhitehornSIMPLE_HVCALL(lv1_open_device, 170)
61217044SnwhitehornSIMPLE_HVCALL(lv1_close_device, 171)
62217044SnwhitehornSIMPLE_HVCALL(lv1_gpu_open, 210)
63217044SnwhitehornSIMPLE_HVCALL(lv1_gpu_context_attribute, 225)
64217044SnwhitehornSIMPLE_HVCALL(lv1_panic, 255)
65217044SnwhitehornSIMPLE_HVCALL(lv1_net_start_tx_dma, 187)
66217044SnwhitehornSIMPLE_HVCALL(lv1_net_stop_tx_dma, 188)
67217044SnwhitehornSIMPLE_HVCALL(lv1_net_start_rx_dma, 189)
68217044SnwhitehornSIMPLE_HVCALL(lv1_net_stop_rx_dma, 190)
69217044Snwhitehorn
70217044Snwhitehorn.global lv1_get_physmem
71217044Snwhitehornlv1_get_physmem:
72217044Snwhitehorn	mflr	%r0
73217044Snwhitehorn	stw	%r0,4(%r1)
74217044Snwhitehorn	stw	%r3,-8(%r1)	/* Address for maxmem */
75217044Snwhitehorn
76217044Snwhitehorn	li	%r11,69		/* Get PU ID */
77217044Snwhitehorn	hc
78217044Snwhitehorn	std	%r4,-16(%r1)
79217044Snwhitehorn
80217044Snwhitehorn	li	%r11,74		/* Get LPAR ID */
81217044Snwhitehorn	hc
82217044Snwhitehorn	std	%r4,-24(%r1)
83217044Snwhitehorn
84217044Snwhitehorn	ld	%r3,-24(%r1)
85217044Snwhitehorn	LD64_IM(%r4,0x0000,0x0000,0x6269,0x0000 /* "bi" */)
86217044Snwhitehorn	LD64_IM(%r5,0x7075,0x0000,0x0000,0x0000 /* "pu" */)
87217044Snwhitehorn	ld	%r6,-16(%r1)
88217044Snwhitehorn	LD64_IM(%r7,0x726d,0x5f73,0x697a,0x6500 /* "rm_size" */)
89217044Snwhitehorn	li	%r11,91
90217044Snwhitehorn	hc
91217044Snwhitehorn	extsw	%r3,%r3
92217044Snwhitehorn
93217044Snwhitehorn	lwz	%r5,-8(%r1)
94217044Snwhitehorn	std	%r4,0(%r5)
95217044Snwhitehorn
96217044Snwhitehorn	lwz	%r0,4(%r1)
97217044Snwhitehorn	mtlr	%r0
98217044Snwhitehorn	blr
99217044Snwhitehorn
100217044Snwhitehorn.global lv1_setup_address_space
101217044Snwhitehornlv1_setup_address_space:
102217044Snwhitehorn	mflr	%r0
103217044Snwhitehorn	stw	%r0,4(%r1)
104217044Snwhitehorn
105217044Snwhitehorn	stw	%r3,-4(%r1)
106217044Snwhitehorn	stw	%r4,-8(%r1)
107217044Snwhitehorn
108217044Snwhitehorn	li	%r3,18		/* PT size: log2(256 KB) */
109217044Snwhitehorn	li	%r4,2		/* Two page sizes */
110217044Snwhitehorn	li	%r5,24		/* Page sizes: (24 << 56) | (16 << 48) */
111217044Snwhitehorn	sldi	%r5,%r5,24
112217044Snwhitehorn	li	%r6,16
113217044Snwhitehorn	sldi	%r6,%r6,16
114217044Snwhitehorn	or	%r5,%r5,%r6
115217044Snwhitehorn	sldi	%r5,%r5,32
116217044Snwhitehorn
117217044Snwhitehorn	li	%r11,2		/* lv1_construct_virtual_address_space */
118217044Snwhitehorn	hc
119217044Snwhitehorn
120217044Snwhitehorn	lwz	%r6,-4(%r1)
121217044Snwhitehorn	lwz	%r7,-8(%r1)
122217044Snwhitehorn	std	%r4,0(%r6)
123217044Snwhitehorn	std	%r5,0(%r7)
124217044Snwhitehorn
125217044Snwhitehorn	/* AS_ID in r4 */
126217044Snwhitehorn	mr	%r3,%r4
127217044Snwhitehorn	li	%r11,7		/* lv1_select_virtual_address_space */
128217044Snwhitehorn	hc
129217044Snwhitehorn	extsw	%r3,%r3
130217044Snwhitehorn
131217044Snwhitehorn	lwz	%r0,4(%r1)
132217044Snwhitehorn	mtlr	%r0
133217044Snwhitehorn	blr
134217044Snwhitehorn
135217044Snwhitehorn.global lv1_insert_pte
136217044Snwhitehornlv1_insert_pte:
137217044Snwhitehorn	mflr	%r0
138217044Snwhitehorn	stw	%r0,4(%r1)
139217044Snwhitehorn
140217044Snwhitehorn	mr	%r11,%r4	/* Save R4 */
141217044Snwhitehorn
142217044Snwhitehorn	clrldi	%r3,%r3,32
143217044Snwhitehorn	clrldi	%r7,%r5,32
144217044Snwhitehorn
145217044Snwhitehorn	sldi	%r4,%r3,3	/* Convert ptegidx into base PTE slot */
146217044Snwhitehorn	li	%r3,0		/* Current address space */
147217044Snwhitehorn	ld	%r5,0(%r11)
148217044Snwhitehorn	ld	%r6,8(%r11)
149217044Snwhitehorn	li	%r8,0		/* No other flags */
150217044Snwhitehorn
151217044Snwhitehorn	li	%r11,158
152217044Snwhitehorn	hc
153217044Snwhitehorn	extsw	%r3,%r3
154217044Snwhitehorn
155217044Snwhitehorn	lwz	%r0,4(%r1)
156217044Snwhitehorn	mtlr	%r0
157217044Snwhitehorn	blr
158217044Snwhitehorn
159217044Snwhitehorn.global lv1_gpu_context_allocate
160217044Snwhitehornlv1_gpu_context_allocate:
161217044Snwhitehorn	mflr	%r0
162217044Snwhitehorn	stw	%r0,4(%r1)
163217044Snwhitehorn	stw	%r7,-4(%r1)
164217044Snwhitehorn
165217044Snwhitehorn	sldi	%r3,%r3,32
166217044Snwhitehorn	clrldi	%r4,%r4,32
167224106Snwhitehorn	or	%r3,%r3,%r4
168217044Snwhitehorn	clrldi	%r4,%r5,32
169217044Snwhitehorn	clrldi	%r5,%r6,32
170217044Snwhitehorn
171217044Snwhitehorn	li	%r11,217
172217044Snwhitehorn	hc
173217044Snwhitehorn	extsw	%r3,%r3
174217044Snwhitehorn
175217044Snwhitehorn	lwz	%r7,-4(%r1)
176217044Snwhitehorn	std	%r4,0(%r7)
177217044Snwhitehorn
178217044Snwhitehorn	lwz	%r0,4(%r1)
179217044Snwhitehorn	mtlr	%r0
180217044Snwhitehorn	blr
181217044Snwhitehorn
182217044Snwhitehorn.global lv1_gpu_memory_allocate
183217044Snwhitehornlv1_gpu_memory_allocate:
184217044Snwhitehorn	mflr	%r0
185217044Snwhitehorn	stw	%r0,4(%r1)
186217044Snwhitehorn	stw	%r8,-4(%r1)
187217044Snwhitehorn	stw	%r9,-8(%r1)
188217044Snwhitehorn
189217044Snwhitehorn	li	%r11,214
190217044Snwhitehorn	hc
191217044Snwhitehorn	extsw	%r3,%r3
192217044Snwhitehorn
193217044Snwhitehorn	lwz	%r8,-4(%r1)
194217044Snwhitehorn	lwz	%r9,-8(%r1)
195217044Snwhitehorn	std	%r4,0(%r8)
196217044Snwhitehorn	std	%r5,0(%r9)
197217044Snwhitehorn
198217044Snwhitehorn	lwz	%r0,4(%r1)
199217044Snwhitehorn	mtlr	%r0
200217044Snwhitehorn	blr
201217044Snwhitehorn
202217044Snwhitehorn.global lv1_net_control
203217044Snwhitehornlv1_net_control:
204217044Snwhitehorn	mflr	%r0
205217044Snwhitehorn	stw	%r0,4(%r1)
206217044Snwhitehorn	stw	%r9,-4(%r1)
207217044Snwhitehorn
208217044Snwhitehorn	li	%r11,194
209217044Snwhitehorn	hc
210217044Snwhitehorn	extsw	%r3,%r3
211217044Snwhitehorn
212217044Snwhitehorn	lwz	%r8,-4(%r1)
213217044Snwhitehorn	std	%r4,0(%r8)
214217044Snwhitehorn
215217044Snwhitehorn	lwz	%r0,4(%r1)
216217044Snwhitehorn	mtlr	%r0
217217044Snwhitehorn	blr
218217044Snwhitehorn
219217044Snwhitehorn.global lv1_setup_dma
220217044Snwhitehornlv1_setup_dma:
221217044Snwhitehorn	mflr	%r0
222217044Snwhitehorn	stw	%r0,4(%r1)
223217044Snwhitehorn	stw	%r3,-4(%r1)
224217044Snwhitehorn	stw	%r4,-8(%r1)
225217044Snwhitehorn	stw	%r5,-12(%r1)
226217044Snwhitehorn
227217044Snwhitehorn	lwz	%r3,-4(%r1)
228217044Snwhitehorn	lwz	%r4,-8(%r1)
229217044Snwhitehorn	lis	%r5,0x0800	/* 128 MB */
230217044Snwhitehorn	li	%r6,24		/* log2(IO_PAGESIZE) */
231217044Snwhitehorn	li	%r7,0		/* flags */
232217044Snwhitehorn	li	%r11,174	/* lv1_allocate_device_dma_region */
233217044Snwhitehorn	hc
234217044Snwhitehorn	extsw	%r3,%r3
235217044Snwhitehorn	cmpdi	%r3,0
236217044Snwhitehorn	bne	1f
237217044Snwhitehorn	std	%r4,-24(%r1)
238217044Snwhitehorn
239217044Snwhitehorn	lwz	%r3,-4(%r1)
240217044Snwhitehorn	lwz	%r4,-8(%r1)
241217044Snwhitehorn	li	%r5,0
242217044Snwhitehorn	ld	%r6,-24(%r1)
243217044Snwhitehorn	lis	%r7,0x0800	/* 128 MB */
244217044Snwhitehorn	lis	%r8,0xf800	/* flags */
245217044Snwhitehorn	sldi	%r8,%r8,32
246217044Snwhitehorn	li	%r11,176	/* lv1_map_device_dma_region */
247217044Snwhitehorn	hc
248217044Snwhitehorn	extsw	%r3,%r3
249217044Snwhitehorn
250217044Snwhitehorn	lwz	%r9,-12(%r1)
251217044Snwhitehorn	ld	%r6,-24(%r1)
252217044Snwhitehorn	std	%r6,0(%r9)
253217044Snwhitehorn
254217044Snwhitehorn1:	lwz	%r0,4(%r1)
255217044Snwhitehorn	mtlr	%r0
256217044Snwhitehorn	blr
257217044Snwhitehorn
258224106Snwhitehorn.global lv1_get_repository_node_value
259224106Snwhitehornlv1_get_repository_node_value:
260224106Snwhitehorn	mflr	%r0
261224106Snwhitehorn	stw	%r0,4(%r1)
262224106Snwhitehorn
263224106Snwhitehorn	sldi	%r3,%r3,32
264224106Snwhitehorn	clrldi	%r4,%r4,32
265224106Snwhitehorn	or	%r3,%r3,%r4
266224106Snwhitehorn	sldi	%r4,%r5,32
267224106Snwhitehorn	clrldi	%r5,%r6,32
268224106Snwhitehorn	or	%r4,%r4,%r5
269224106Snwhitehorn	sldi	%r5,%r7,32
270224106Snwhitehorn	clrldi	%r6,%r8,32
271224106Snwhitehorn	or	%r5,%r5,%r6
272224106Snwhitehorn	sldi	%r6,%r9,32
273224106Snwhitehorn	clrldi	%r7,%r10,32
274224106Snwhitehorn	or	%r6,%r6,%r7
275224106Snwhitehorn	lwz     %r7,8(%r1)
276224106Snwhitehorn	lwz     %r8,12(%r1)
277224106Snwhitehorn	sldi	%r7,%r7,32
278224106Snwhitehorn	or	%r7,%r7,%r8
279224106Snwhitehorn
280224106Snwhitehorn	li	%r11,91
281224106Snwhitehorn	hc
282224106Snwhitehorn	extsw	%r3,%r3
283224106Snwhitehorn
284224106Snwhitehorn	lwz	%r6,16(%r1)
285224106Snwhitehorn	std	%r4,0(%r6)
286224106Snwhitehorn	lwz	%r6,20(%r1)
287224106Snwhitehorn	std	%r5,0(%r6)
288224106Snwhitehorn
289224106Snwhitehorn	lwz	%r0,4(%r1)
290224106Snwhitehorn	mtlr	%r0
291224106Snwhitehorn	blr
292224106Snwhitehorn
293224106Snwhitehorn.global lv1_storage_read
294224106Snwhitehornlv1_storage_read:
295224106Snwhitehorn	mflr	%r0
296224106Snwhitehorn	stw	%r0,4(%r1)
297224106Snwhitehorn
298224106Snwhitehorn	sldi	%r3,%r3,32
299224106Snwhitehorn	clrldi	%r4,%r4,32
300224106Snwhitehorn	or	%r3,%r3,%r4
301224106Snwhitehorn	sldi	%r4,%r5,32
302224106Snwhitehorn	clrldi	%r5,%r6,32
303224106Snwhitehorn	or	%r4,%r4,%r5
304224106Snwhitehorn	sldi	%r5,%r7,32
305224106Snwhitehorn	clrldi	%r6,%r8,32
306224106Snwhitehorn	or	%r5,%r5,%r6
307224106Snwhitehorn	sldi	%r6,%r9,32
308224106Snwhitehorn	clrldi	%r7,%r10,32
309224106Snwhitehorn	or	%r6,%r6,%r7
310224857Snwhitehorn	ld	%r7,8(%r1)
311224857Snwhitehorn	ld	%r8,16(%r1)
312224106Snwhitehorn
313224106Snwhitehorn	li	%r11,245
314224106Snwhitehorn	hc
315224106Snwhitehorn	extsw	%r3,%r3
316224106Snwhitehorn
317224106Snwhitehorn	lwz	%r5,24(%r1)
318224106Snwhitehorn	std	%r4,0(%r5)
319224106Snwhitehorn
320224106Snwhitehorn	lwz	%r0,4(%r1)
321224106Snwhitehorn	mtlr	%r0
322224106Snwhitehorn	blr
323224106Snwhitehorn
324224106Snwhitehorn.global lv1_storage_check_async_status
325224106Snwhitehornlv1_storage_check_async_status:
326224106Snwhitehorn	mflr	%r0
327224106Snwhitehorn	stw	%r0,4(%r1)
328224106Snwhitehorn	stw	%r7,-4(%r1)
329224106Snwhitehorn
330224106Snwhitehorn	sldi	%r3,%r3,32
331224106Snwhitehorn	clrldi	%r4,%r4,32
332224106Snwhitehorn	or	%r3,%r3,%r4
333224106Snwhitehorn	sldi	%r4,%r5,32
334224106Snwhitehorn	clrldi	%r5,%r6,32
335224106Snwhitehorn	or	%r4,%r4,%r5
336224106Snwhitehorn
337224106Snwhitehorn	li	%r11,254
338224106Snwhitehorn	hc
339224106Snwhitehorn	extsw	%r3,%r3
340224106Snwhitehorn
341224106Snwhitehorn	lwz	%r5,-4(%r1)
342224106Snwhitehorn	std	%r4,0(%r5)
343224106Snwhitehorn
344224106Snwhitehorn	lwz	%r0,4(%r1)
345224106Snwhitehorn	mtlr	%r0
346224106Snwhitehorn	blr
347