1ebb58dc2SBen Skeggs/*
2ebb58dc2SBen Skeggs * Copyright 2013 Red Hat Inc.
3ebb58dc2SBen Skeggs *
4ebb58dc2SBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5ebb58dc2SBen Skeggs * copy of this software and associated documentation files (the "Software"),
6ebb58dc2SBen Skeggs * to deal in the Software without restriction, including without limitation
7ebb58dc2SBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8ebb58dc2SBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9ebb58dc2SBen Skeggs * Software is furnished to do so, subject to the following conditions:
10ebb58dc2SBen Skeggs *
11ebb58dc2SBen Skeggs * The above copyright notice and this permission notice shall be included in
12ebb58dc2SBen Skeggs * all copies or substantial portions of the Software.
13ebb58dc2SBen Skeggs *
14ebb58dc2SBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15ebb58dc2SBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16ebb58dc2SBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17ebb58dc2SBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18ebb58dc2SBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19ebb58dc2SBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20ebb58dc2SBen Skeggs * OTHER DEALINGS IN THE SOFTWARE.
21ebb58dc2SBen Skeggs *
22ebb58dc2SBen Skeggs * Authors: Ben Skeggs
23ebb58dc2SBen Skeggs */
24ebb58dc2SBen Skeggs
25ebb58dc2SBen Skeggs#ifdef INCLUDE_PROC
26ebb58dc2SBen Skeggsprocess(PROC_MEMX, #memx_init, #memx_recv)
27ebb58dc2SBen Skeggs#endif
28ebb58dc2SBen Skeggs
29ebb58dc2SBen Skeggs/******************************************************************************
30ebb58dc2SBen Skeggs * MEMX data segment
31ebb58dc2SBen Skeggs *****************************************************************************/
32ebb58dc2SBen Skeggs#ifdef INCLUDE_DATA
33ebb58dc2SBen Skeggs.equ #memx_opcode 0
34ebb58dc2SBen Skeggs.equ #memx_header 2
35ebb58dc2SBen Skeggs.equ #memx_length 4
36ebb58dc2SBen Skeggs.equ #memx_func   8
37ebb58dc2SBen Skeggs
38ebb58dc2SBen Skeggs#define handler(cmd,hdr,len,func) /*
39ebb58dc2SBen Skeggs*/	.b16 MEMX_##cmd /*
40ebb58dc2SBen Skeggs*/	.b16 hdr /*
41ebb58dc2SBen Skeggs*/	.b16 len /*
42ebb58dc2SBen Skeggs*/      .b16 0 /*
43ebb58dc2SBen Skeggs*/	.b32 func
44ebb58dc2SBen Skeggs
45ebb58dc2SBen Skeggsmemx_func_head:
46ebb58dc2SBen Skeggshandler(ENTER , 0x0000, 0x0000, #memx_func_enter)
47ebb58dc2SBen Skeggsmemx_func_next:
48ebb58dc2SBen Skeggshandler(LEAVE , 0x0000, 0x0000, #memx_func_leave)
49ebb58dc2SBen Skeggshandler(WR32  , 0x0000, 0x0002, #memx_func_wr32)
50ebb58dc2SBen Skeggshandler(WAIT  , 0x0004, 0x0000, #memx_func_wait)
51ebb58dc2SBen Skeggshandler(DELAY , 0x0001, 0x0000, #memx_func_delay)
52ebb58dc2SBen Skeggshandler(VBLANK, 0x0001, 0x0000, #memx_func_wait_vblank)
53ebb58dc2SBen Skeggshandler(TRAIN , 0x0000, 0x0000, #memx_func_train)
54ebb58dc2SBen Skeggsmemx_func_tail:
55ebb58dc2SBen Skeggs
56ebb58dc2SBen Skeggs.equ #memx_func_size #memx_func_next - #memx_func_head
57ebb58dc2SBen Skeggs.equ #memx_func_num (#memx_func_tail - #memx_func_head) / #memx_func_size
58ebb58dc2SBen Skeggs
59ebb58dc2SBen Skeggsmemx_ts_start:
60ebb58dc2SBen Skeggs.b32 0
61ebb58dc2SBen Skeggsmemx_ts_end:
62ebb58dc2SBen Skeggs.b32 0
63ebb58dc2SBen Skeggs
64ebb58dc2SBen Skeggsmemx_data_head:
65ebb58dc2SBen Skeggs.skip 0x0800
66ebb58dc2SBen Skeggsmemx_data_tail:
67ebb58dc2SBen Skeggs
68ebb58dc2SBen Skeggsmemx_train_head:
69ebb58dc2SBen Skeggs.skip 0x0100
70ebb58dc2SBen Skeggsmemx_train_tail:
71ebb58dc2SBen Skeggs#endif
72ebb58dc2SBen Skeggs
73ebb58dc2SBen Skeggs/******************************************************************************
74ebb58dc2SBen Skeggs * MEMX code segment
75ebb58dc2SBen Skeggs *****************************************************************************/
76ebb58dc2SBen Skeggs#ifdef INCLUDE_CODE
77ebb58dc2SBen Skeggs// description
78ebb58dc2SBen Skeggs//
79ebb58dc2SBen Skeggs// $r15 - current (memx)
80ebb58dc2SBen Skeggs// $r4  - packet length
81ebb58dc2SBen Skeggs// $r3  - opcode desciption
82ebb58dc2SBen Skeggs// $r0  - zero
83ebb58dc2SBen Skeggsmemx_func_enter:
84ebb58dc2SBen Skeggs#if NVKM_PPWR_CHIPSET == GT215
85fe9748b7SKarol Herbst	mov $r8 0x1610
86ebb58dc2SBen Skeggs	nv_rd32($r7, $r8)
87ebb58dc2SBen Skeggs	imm32($r6, 0xfffffffc)
88ebb58dc2SBen Skeggs	and $r7 $r6
89fe9748b7SKarol Herbst	mov $r6 0x2
90ebb58dc2SBen Skeggs	or $r7 $r6
91ebb58dc2SBen Skeggs	nv_wr32($r8, $r7)
92ebb58dc2SBen Skeggs#else
93fe9748b7SKarol Herbst	mov $r6 0x001620
94ebb58dc2SBen Skeggs	imm32($r7, ~0x00000aa2);
95ebb58dc2SBen Skeggs	nv_rd32($r8, $r6)
96ebb58dc2SBen Skeggs	and $r8 $r7
97ebb58dc2SBen Skeggs	nv_wr32($r6, $r8)
98ebb58dc2SBen Skeggs
99ebb58dc2SBen Skeggs	imm32($r7, ~0x00000001)
100ebb58dc2SBen Skeggs	nv_rd32($r8, $r6)
101ebb58dc2SBen Skeggs	and $r8 $r7
102ebb58dc2SBen Skeggs	nv_wr32($r6, $r8)
103ebb58dc2SBen Skeggs
104fe9748b7SKarol Herbst	mov $r6 0x0026f0
105ebb58dc2SBen Skeggs	nv_rd32($r8, $r6)
106ebb58dc2SBen Skeggs	and $r8 $r7
107ebb58dc2SBen Skeggs	nv_wr32($r6, $r8)
108ebb58dc2SBen Skeggs#endif
109ebb58dc2SBen Skeggs
110ebb58dc2SBen Skeggs	mov $r6 NV_PPWR_OUTPUT_SET_FB_PAUSE
111ebb58dc2SBen Skeggs	nv_iowr(NV_PPWR_OUTPUT_SET, $r6)
112ebb58dc2SBen Skeggs	memx_func_enter_wait:
113ebb58dc2SBen Skeggs		nv_iord($r6, NV_PPWR_OUTPUT)
114ebb58dc2SBen Skeggs		and $r6 NV_PPWR_OUTPUT_FB_PAUSE
115ebb58dc2SBen Skeggs		bra z #memx_func_enter_wait
116ebb58dc2SBen Skeggs
117ebb58dc2SBen Skeggs	nv_iord($r6, NV_PPWR_TIMER_LOW)
118ebb58dc2SBen Skeggs	st b32 D[$r0 + #memx_ts_start] $r6
119ebb58dc2SBen Skeggs	ret
120ebb58dc2SBen Skeggs
121ebb58dc2SBen Skeggs// description
122ebb58dc2SBen Skeggs//
123ebb58dc2SBen Skeggs// $r15 - current (memx)
124ebb58dc2SBen Skeggs// $r4  - packet length
125ebb58dc2SBen Skeggs// $r3  - opcode desciption
126ebb58dc2SBen Skeggs// $r0  - zero
127ebb58dc2SBen Skeggsmemx_func_leave:
128ebb58dc2SBen Skeggs	nv_iord($r6, NV_PPWR_TIMER_LOW)
129ebb58dc2SBen Skeggs	st b32 D[$r0 + #memx_ts_end] $r6
130ebb58dc2SBen Skeggs
131ebb58dc2SBen Skeggs	mov $r6 NV_PPWR_OUTPUT_CLR_FB_PAUSE
132ebb58dc2SBen Skeggs	nv_iowr(NV_PPWR_OUTPUT_CLR, $r6)
133ebb58dc2SBen Skeggs	memx_func_leave_wait:
134ebb58dc2SBen Skeggs		nv_iord($r6, NV_PPWR_OUTPUT)
135ebb58dc2SBen Skeggs		and $r6 NV_PPWR_OUTPUT_FB_PAUSE
136ebb58dc2SBen Skeggs		bra nz #memx_func_leave_wait
137ebb58dc2SBen Skeggs
138ebb58dc2SBen Skeggs#if NVKM_PPWR_CHIPSET == GT215
139fe9748b7SKarol Herbst	mov $r8 0x1610
140ebb58dc2SBen Skeggs	nv_rd32($r7, $r8)
141ebb58dc2SBen Skeggs	imm32($r6, 0xffffffcc)
142ebb58dc2SBen Skeggs	and $r7 $r6
143ebb58dc2SBen Skeggs	nv_wr32($r8, $r7)
144ebb58dc2SBen Skeggs#else
145fe9748b7SKarol Herbst	mov $r6 0x0026f0
146ebb58dc2SBen Skeggs	imm32($r7, 0x00000001)
147ebb58dc2SBen Skeggs	nv_rd32($r8, $r6)
148ebb58dc2SBen Skeggs	or $r8 $r7
149ebb58dc2SBen Skeggs	nv_wr32($r6, $r8)
150ebb58dc2SBen Skeggs
151fe9748b7SKarol Herbst	mov $r6 0x001620
152ebb58dc2SBen Skeggs	nv_rd32($r8, $r6)
153ebb58dc2SBen Skeggs	or $r8 $r7
154ebb58dc2SBen Skeggs	nv_wr32($r6, $r8)
155ebb58dc2SBen Skeggs
156ebb58dc2SBen Skeggs	imm32($r7, 0x00000aa2);
157ebb58dc2SBen Skeggs	nv_rd32($r8, $r6)
158ebb58dc2SBen Skeggs	or $r8 $r7
159ebb58dc2SBen Skeggs	nv_wr32($r6, $r8)
160ebb58dc2SBen Skeggs#endif
161ebb58dc2SBen Skeggs	ret
162ebb58dc2SBen Skeggs
163ebb58dc2SBen Skeggs#if NVKM_PPWR_CHIPSET < GF119
164ebb58dc2SBen Skeggs// description
165ebb58dc2SBen Skeggs//
166ebb58dc2SBen Skeggs// $r15 - current (memx)
167ebb58dc2SBen Skeggs// $r4  - packet length
168ebb58dc2SBen Skeggs//	+00: head to wait for vblank on
169ebb58dc2SBen Skeggs// $r3  - opcode desciption
170ebb58dc2SBen Skeggs// $r0  - zero
171ebb58dc2SBen Skeggsmemx_func_wait_vblank:
172ebb58dc2SBen Skeggs	ld b32 $r6 D[$r1 + 0x00]
173ebb58dc2SBen Skeggs	cmp b32 $r6 0x0
174ebb58dc2SBen Skeggs	bra z #memx_func_wait_vblank_head0
175ebb58dc2SBen Skeggs	cmp b32 $r6 0x1
176ebb58dc2SBen Skeggs	bra z #memx_func_wait_vblank_head1
177ebb58dc2SBen Skeggs	bra #memx_func_wait_vblank_fini
178ebb58dc2SBen Skeggs
179ebb58dc2SBen Skeggs	memx_func_wait_vblank_head1:
180fe9748b7SKarol Herbst	mov $r7 0x20
181ebb58dc2SBen Skeggs	bra #memx_func_wait_vblank_0
182ebb58dc2SBen Skeggs
183ebb58dc2SBen Skeggs	memx_func_wait_vblank_head0:
184fe9748b7SKarol Herbst	mov $r7 0x8
185ebb58dc2SBen Skeggs
186ebb58dc2SBen Skeggs	memx_func_wait_vblank_0:
187ebb58dc2SBen Skeggs		nv_iord($r6, NV_PPWR_INPUT)
188ebb58dc2SBen Skeggs		and $r6 $r7
189ebb58dc2SBen Skeggs		bra nz #memx_func_wait_vblank_0
190ebb58dc2SBen Skeggs
191ebb58dc2SBen Skeggs	memx_func_wait_vblank_1:
192ebb58dc2SBen Skeggs		nv_iord($r6, NV_PPWR_INPUT)
193ebb58dc2SBen Skeggs		and $r6 $r7
194ebb58dc2SBen Skeggs		bra z #memx_func_wait_vblank_1
195ebb58dc2SBen Skeggs
196ebb58dc2SBen Skeggs	memx_func_wait_vblank_fini:
197ebb58dc2SBen Skeggs	add b32 $r1 0x4
198ebb58dc2SBen Skeggs	ret
199ebb58dc2SBen Skeggs
200ebb58dc2SBen Skeggs#else
201ebb58dc2SBen Skeggs
202ebb58dc2SBen Skeggs// XXX: currently no-op
203ebb58dc2SBen Skeggs//
204ebb58dc2SBen Skeggs// $r15 - current (memx)
205ebb58dc2SBen Skeggs// $r4  - packet length
206ebb58dc2SBen Skeggs//	+00: head to wait for vblank on
207ebb58dc2SBen Skeggs// $r3  - opcode desciption
208ebb58dc2SBen Skeggs// $r0  - zero
209ebb58dc2SBen Skeggsmemx_func_wait_vblank:
210ebb58dc2SBen Skeggs	add b32 $r1 0x4
211ebb58dc2SBen Skeggs	ret
212ebb58dc2SBen Skeggs
213ebb58dc2SBen Skeggs#endif
214ebb58dc2SBen Skeggs
215ebb58dc2SBen Skeggs// description
216ebb58dc2SBen Skeggs//
217ebb58dc2SBen Skeggs// $r15 - current (memx)
218ebb58dc2SBen Skeggs// $r4  - packet length
219ebb58dc2SBen Skeggs//	+00*n: addr
220ebb58dc2SBen Skeggs//	+04*n: data
221ebb58dc2SBen Skeggs// $r3  - opcode desciption
222ebb58dc2SBen Skeggs// $r0  - zero
223ebb58dc2SBen Skeggsmemx_func_wr32:
224ebb58dc2SBen Skeggs	ld b32 $r6 D[$r1 + 0x00]
225ebb58dc2SBen Skeggs	ld b32 $r5 D[$r1 + 0x04]
226ebb58dc2SBen Skeggs	add b32 $r1 0x08
227ebb58dc2SBen Skeggs	nv_wr32($r6, $r5)
228ebb58dc2SBen Skeggs	sub b32 $r4 0x02
229ebb58dc2SBen Skeggs	bra nz #memx_func_wr32
230ebb58dc2SBen Skeggs	ret
231ebb58dc2SBen Skeggs
232ebb58dc2SBen Skeggs// description
233ebb58dc2SBen Skeggs//
234ebb58dc2SBen Skeggs// $r15 - current (memx)
235ebb58dc2SBen Skeggs// $r4  - packet length
236ebb58dc2SBen Skeggs//	+00: addr
237ebb58dc2SBen Skeggs//	+04: mask
238ebb58dc2SBen Skeggs//	+08: data
239ebb58dc2SBen Skeggs//	+0c: timeout (ns)
240ebb58dc2SBen Skeggs// $r3  - opcode desciption
241ebb58dc2SBen Skeggs// $r0  - zero
242ebb58dc2SBen Skeggsmemx_func_wait:
243ebb58dc2SBen Skeggs	nv_iord($r8, NV_PPWR_TIMER_LOW)
244ebb58dc2SBen Skeggs	ld b32 $r14 D[$r1 + 0x00]
245ebb58dc2SBen Skeggs	ld b32 $r13 D[$r1 + 0x04]
246ebb58dc2SBen Skeggs	ld b32 $r12 D[$r1 + 0x08]
247ebb58dc2SBen Skeggs	ld b32 $r11 D[$r1 + 0x0c]
248ebb58dc2SBen Skeggs	add b32 $r1 0x10
249ebb58dc2SBen Skeggs	call(wait)
250ebb58dc2SBen Skeggs	ret
251ebb58dc2SBen Skeggs
252ebb58dc2SBen Skeggs// description
253ebb58dc2SBen Skeggs//
254ebb58dc2SBen Skeggs// $r15 - current (memx)
255ebb58dc2SBen Skeggs// $r4  - packet length
256ebb58dc2SBen Skeggs//	+00: time (ns)
257ebb58dc2SBen Skeggs// $r3  - opcode desciption
258ebb58dc2SBen Skeggs// $r0  - zero
259ebb58dc2SBen Skeggsmemx_func_delay:
260ebb58dc2SBen Skeggs	ld b32 $r14 D[$r1 + 0x00]
261ebb58dc2SBen Skeggs	add b32 $r1 0x04
262ebb58dc2SBen Skeggs	call(nsec)
263ebb58dc2SBen Skeggs	ret
264ebb58dc2SBen Skeggs
265ebb58dc2SBen Skeggs// description
266ebb58dc2SBen Skeggs//
267ebb58dc2SBen Skeggs// $r15 - current (memx)
268ebb58dc2SBen Skeggs// $r4  - packet length
269ebb58dc2SBen Skeggs// $r3  - opcode desciption
270ebb58dc2SBen Skeggs// $r0  - zero
271ebb58dc2SBen Skeggsmemx_func_train:
272ebb58dc2SBen Skeggs#if NVKM_PPWR_CHIPSET == GT215
273ebb58dc2SBen Skeggs// $r5 - outer loop counter
274ebb58dc2SBen Skeggs// $r6 - inner loop counter
275ebb58dc2SBen Skeggs// $r7 - entry counter (#memx_train_head + $r7)
276fe9748b7SKarol Herbst	mov $r5 0x3
277fe9748b7SKarol Herbst	mov $r7 0x0
278ebb58dc2SBen Skeggs
279ebb58dc2SBen Skeggs// Read random memory to wake up... things
280ebb58dc2SBen Skeggs	imm32($r9, 0x700000)
281ebb58dc2SBen Skeggs	nv_rd32($r8,$r9)
282fe9748b7SKarol Herbst	mov $r14 0x2710
283ebb58dc2SBen Skeggs	call(nsec)
284ebb58dc2SBen Skeggs
285ebb58dc2SBen Skeggs	memx_func_train_loop_outer:
286ebb58dc2SBen Skeggs		mulu $r8 $r5 0x101
287ebb58dc2SBen Skeggs		sethi $r8 0x02000000
288ebb58dc2SBen Skeggs		imm32($r9, 0x1111e0)
289ebb58dc2SBen Skeggs		nv_wr32($r9, $r8)
290ebb58dc2SBen Skeggs		push $r5
291ebb58dc2SBen Skeggs
292fe9748b7SKarol Herbst		mov $r6 0x0
293ebb58dc2SBen Skeggs		memx_func_train_loop_inner:
294fe9748b7SKarol Herbst			mov $r8 0x1111
295ebb58dc2SBen Skeggs			mulu $r9 $r6 $r8
296ebb58dc2SBen Skeggs			shl b32 $r8 $r9 0x10
297ebb58dc2SBen Skeggs			or $r8 $r9
298ebb58dc2SBen Skeggs			imm32($r9, 0x100720)
299ebb58dc2SBen Skeggs			nv_wr32($r9, $r8)
300ebb58dc2SBen Skeggs
301ebb58dc2SBen Skeggs			imm32($r9, 0x100080)
302ebb58dc2SBen Skeggs			nv_rd32($r8, $r9)
303ebb58dc2SBen Skeggs			or $r8 $r8 0x20
304ebb58dc2SBen Skeggs			nv_wr32($r9, $r8)
305ebb58dc2SBen Skeggs
306ebb58dc2SBen Skeggs			imm32($r9, 0x10053c)
307ebb58dc2SBen Skeggs			imm32($r8, 0x80003002)
308ebb58dc2SBen Skeggs			nv_wr32($r9, $r8)
309ebb58dc2SBen Skeggs
310ebb58dc2SBen Skeggs			imm32($r14, 0x100560)
311ebb58dc2SBen Skeggs			imm32($r13, 0x80000000)
312ebb58dc2SBen Skeggs			add b32 $r12 $r13 0
313ebb58dc2SBen Skeggs			imm32($r11, 0x001e8480)
314ebb58dc2SBen Skeggs			call(wait)
315ebb58dc2SBen Skeggs
316ebb58dc2SBen Skeggs			// $r5 - inner inner loop counter
317ebb58dc2SBen Skeggs			// $r9 - result
318fe9748b7SKarol Herbst			mov $r5 0
319ebb58dc2SBen Skeggs			imm32($r9, 0x8300ffff)
320ebb58dc2SBen Skeggs			memx_func_train_loop_4x:
321ebb58dc2SBen Skeggs				imm32($r10, 0x100080)
322ebb58dc2SBen Skeggs				nv_rd32($r8, $r10)
323ebb58dc2SBen Skeggs				imm32($r11, 0xffffffdf)
324ebb58dc2SBen Skeggs				and $r8 $r11
325ebb58dc2SBen Skeggs				nv_wr32($r10, $r8)
326ebb58dc2SBen Skeggs
327ebb58dc2SBen Skeggs				imm32($r10, 0x10053c)
328ebb58dc2SBen Skeggs				imm32($r8, 0x80003002)
329ebb58dc2SBen Skeggs				nv_wr32($r10, $r8)
330ebb58dc2SBen Skeggs
331ebb58dc2SBen Skeggs				imm32($r14, 0x100560)
332ebb58dc2SBen Skeggs				imm32($r13, 0x80000000)
333ebb58dc2SBen Skeggs				mov b32 $r12 $r13
334ebb58dc2SBen Skeggs				imm32($r11, 0x00002710)
335ebb58dc2SBen Skeggs				call(wait)
336ebb58dc2SBen Skeggs
337ebb58dc2SBen Skeggs				nv_rd32($r13, $r14)
338ebb58dc2SBen Skeggs				and $r9 $r9 $r13
339ebb58dc2SBen Skeggs
340ebb58dc2SBen Skeggs				add b32 $r5 1
341ebb58dc2SBen Skeggs				cmp b16 $r5 0x4
342ebb58dc2SBen Skeggs				bra l #memx_func_train_loop_4x
343ebb58dc2SBen Skeggs
344ebb58dc2SBen Skeggs			add b32 $r10 $r7 #memx_train_head
345ebb58dc2SBen Skeggs			st b32 D[$r10 + 0] $r9
346ebb58dc2SBen Skeggs			add b32 $r6 1
347ebb58dc2SBen Skeggs			add b32 $r7 4
348ebb58dc2SBen Skeggs
349ebb58dc2SBen Skeggs			cmp b16 $r6 0x10
350ebb58dc2SBen Skeggs			bra l #memx_func_train_loop_inner
351ebb58dc2SBen Skeggs
352ebb58dc2SBen Skeggs		pop $r5
353ebb58dc2SBen Skeggs		add b32 $r5 1
354ebb58dc2SBen Skeggs		cmp b16 $r5 7
355ebb58dc2SBen Skeggs		bra l #memx_func_train_loop_outer
356ebb58dc2SBen Skeggs
357ebb58dc2SBen Skeggs#endif
358ebb58dc2SBen Skeggs	ret
359ebb58dc2SBen Skeggs
360ebb58dc2SBen Skeggs// description
361ebb58dc2SBen Skeggs//
362ebb58dc2SBen Skeggs// $r15 - current (memx)
363ebb58dc2SBen Skeggs// $r14 - sender process name
364ebb58dc2SBen Skeggs// $r13 - message (exec)
365ebb58dc2SBen Skeggs// $r12 - head of script
366ebb58dc2SBen Skeggs// $r11 - tail of script
367ebb58dc2SBen Skeggs// $r0  - zero
368ebb58dc2SBen Skeggsmemx_exec:
369ebb58dc2SBen Skeggs	push $r14
370ebb58dc2SBen Skeggs	push $r13
371ebb58dc2SBen Skeggs	mov b32 $r1 $r12
372ebb58dc2SBen Skeggs	mov b32 $r2 $r11
373ebb58dc2SBen Skeggs
374ebb58dc2SBen Skeggs	memx_exec_next:
375ebb58dc2SBen Skeggs		// fetch the packet header
376ebb58dc2SBen Skeggs		ld b32 $r3 D[$r1]
377ebb58dc2SBen Skeggs		add b32 $r1 4
378ebb58dc2SBen Skeggs		extr $r4 $r3 16:31
379ebb58dc2SBen Skeggs		extr $r3 $r3 0:15
380ebb58dc2SBen Skeggs
381ebb58dc2SBen Skeggs		// execute the opcode handler
382ebb58dc2SBen Skeggs		sub b32 $r3 1
383ebb58dc2SBen Skeggs		mulu $r3 #memx_func_size
384ebb58dc2SBen Skeggs		ld b32 $r5 D[$r3 + #memx_func_head + #memx_func]
385ebb58dc2SBen Skeggs		call $r5
386ebb58dc2SBen Skeggs
387ebb58dc2SBen Skeggs		// keep going, if we haven't reached the end
388ebb58dc2SBen Skeggs		cmp b32 $r1 $r2
389ebb58dc2SBen Skeggs		bra l #memx_exec_next
390ebb58dc2SBen Skeggs
391ebb58dc2SBen Skeggs	// send completion reply
392ebb58dc2SBen Skeggs	ld b32 $r11 D[$r0 + #memx_ts_start]
393ebb58dc2SBen Skeggs	ld b32 $r12 D[$r0 + #memx_ts_end]
394ebb58dc2SBen Skeggs	sub b32 $r12 $r11
395ebb58dc2SBen Skeggs	nv_iord($r11, NV_PPWR_INPUT)
396ebb58dc2SBen Skeggs	pop $r13
397ebb58dc2SBen Skeggs	pop $r14
398ebb58dc2SBen Skeggs	call(send)
399ebb58dc2SBen Skeggs	ret
400ebb58dc2SBen Skeggs
401ebb58dc2SBen Skeggs// description
402ebb58dc2SBen Skeggs//
403ebb58dc2SBen Skeggs// $r15 - current (memx)
404ebb58dc2SBen Skeggs// $r14 - sender process name
405ebb58dc2SBen Skeggs// $r13 - message
406ebb58dc2SBen Skeggs// $r12 - data0
407ebb58dc2SBen Skeggs// $r11 - data1
408ebb58dc2SBen Skeggs// $r0  - zero
409ebb58dc2SBen Skeggsmemx_info:
410ebb58dc2SBen Skeggs	cmp b16 $r12 0x1
411ebb58dc2SBen Skeggs	bra e #memx_info_train
412ebb58dc2SBen Skeggs
413ebb58dc2SBen Skeggs	memx_info_data:
414ebb58dc2SBen Skeggs	mov $r12 #memx_data_head
415ebb58dc2SBen Skeggs	mov $r11 #memx_data_tail - #memx_data_head
416ebb58dc2SBen Skeggs	bra #memx_info_send
417ebb58dc2SBen Skeggs
418ebb58dc2SBen Skeggs	memx_info_train:
419ebb58dc2SBen Skeggs	mov $r12 #memx_train_head
420ebb58dc2SBen Skeggs	mov $r11 #memx_train_tail - #memx_train_head
421ebb58dc2SBen Skeggs
422ebb58dc2SBen Skeggs	memx_info_send:
423ebb58dc2SBen Skeggs	call(send)
424ebb58dc2SBen Skeggs	ret
425ebb58dc2SBen Skeggs
426ebb58dc2SBen Skeggs// description
427ebb58dc2SBen Skeggs//
428ebb58dc2SBen Skeggs// $r15 - current (memx)
429ebb58dc2SBen Skeggs// $r14 - sender process name
430ebb58dc2SBen Skeggs// $r13 - message
431ebb58dc2SBen Skeggs// $r12 - data0
432ebb58dc2SBen Skeggs// $r11 - data1
433ebb58dc2SBen Skeggs// $r0  - zero
434ebb58dc2SBen Skeggsmemx_recv:
435ebb58dc2SBen Skeggs	cmp b32 $r13 MEMX_MSG_EXEC
436ebb58dc2SBen Skeggs	bra e #memx_exec
437ebb58dc2SBen Skeggs	cmp b32 $r13 MEMX_MSG_INFO
438ebb58dc2SBen Skeggs	bra e #memx_info
439ebb58dc2SBen Skeggs	ret
440ebb58dc2SBen Skeggs
441ebb58dc2SBen Skeggs// description
442ebb58dc2SBen Skeggs//
443ebb58dc2SBen Skeggs// $r15 - current (memx)
444ebb58dc2SBen Skeggs// $r0  - zero
445ebb58dc2SBen Skeggsmemx_init:
446ebb58dc2SBen Skeggs	ret
447ebb58dc2SBen Skeggs#endif
448