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