2 * Copyright 2013 Red Hat Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
26 process(PROC_MEMX, #memx_init, #memx_recv)
29 /******************************************************************************
31 *****************************************************************************/
38 #define handler(cmd,hdr,len,func) /*
46 handler(ENTER , 0x0001, 0x0000, #memx_func_enter)
48 handler(LEAVE , 0x0000, 0x0000, #memx_func_leave)
49 handler(WR32 , 0x0000, 0x0002, #memx_func_wr32)
50 handler(WAIT , 0x0004, 0x0000, #memx_func_wait)
51 handler(DELAY , 0x0001, 0x0000, #memx_func_delay)
54 .equ #memx_func_size #memx_func_next - #memx_func_head
55 .equ #memx_func_num (#memx_func_tail - #memx_func_head) / #memx_func_size
62 /******************************************************************************
64 *****************************************************************************/
68 // $r15 - current (memx)
69 // $r4 - packet length
70 // +00: bitmask of heads to wait for vblank on
71 // $r3 - opcode desciption
74 mov $r6 NV_PPWR_OUTPUT_SET_FB_PAUSE
75 nv_iowr(NV_PPWR_OUTPUT_SET, $r6)
77 nv_iord($r6, NV_PPWR_OUTPUT)
78 and $r6 NV_PPWR_OUTPUT_FB_PAUSE
79 bra z #memx_func_enter_wait
81 ld b32 $r6 D[$r1 + 0x00]
87 // $r15 - current (memx)
88 // $r4 - packet length
89 // $r3 - opcode desciption
92 mov $r6 NV_PPWR_OUTPUT_CLR_FB_PAUSE
93 nv_iowr(NV_PPWR_OUTPUT_CLR, $r6)
95 nv_iord($r6, NV_PPWR_OUTPUT)
96 and $r6 NV_PPWR_OUTPUT_FB_PAUSE
97 bra nz #memx_func_leave_wait
102 // $r15 - current (memx)
103 // $r4 - packet length
106 // $r3 - opcode desciption
109 ld b32 $r6 D[$r1 + 0x00]
110 ld b32 $r5 D[$r1 + 0x04]
114 bra nz #memx_func_wr32
119 // $r15 - current (memx)
120 // $r4 - packet length
125 // $r3 - opcode desciption
128 nv_iord($r8, NV_PPWR_TIMER_LOW)
129 ld b32 $r14 D[$r1 + 0x00]
130 ld b32 $r13 D[$r1 + 0x04]
131 ld b32 $r12 D[$r1 + 0x08]
132 ld b32 $r11 D[$r1 + 0x0c]
139 // $r15 - current (memx)
140 // $r4 - packet length
142 // $r3 - opcode desciption
145 ld b32 $r14 D[$r1 + 0x00]
152 // $r15 - current (memx)
153 // $r14 - sender process name
154 // $r13 - message (exec)
155 // $r12 - head of script
156 // $r11 - tail of script
164 // fetch the packet header, and locate opcode info
168 mulu $r3 #memx_func_size
170 // execute the opcode handler
171 ld b32 $r5 D[$r3 + #memx_func_head + #memx_func]
174 // keep going, if we haven't reached the end
176 bra l #memx_exec_next
178 // send completion reply
186 // $r15 - current (memx)
187 // $r14 - sender process name
193 mov $r12 #memx_data_head
194 mov $r11 #memx_data_tail - #memx_data_head
200 // $r15 - current (memx)
201 // $r14 - sender process name
207 cmp b32 $r13 MEMX_MSG_EXEC
209 cmp b32 $r13 MEMX_MSG_INFO
215 // $r15 - current (memx)