17ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs/* fuc microcode for copy engine on nva3- chipsets
27ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *
37ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * Copyright 2011 Red Hat Inc.
47ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *
57ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
67ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * copy of this software and associated documentation files (the "Software"),
77ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * to deal in the Software without restriction, including without limitation
87ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
97ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the
107ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * Software is furnished to do so, subject to the following conditions:
117ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *
127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * The above copyright notice and this permission notice shall be included in
137ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * all copies or substantial portions of the Software.
147ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *
157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
187ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
217ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * OTHER DEALINGS IN THE SOFTWARE.
227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *
237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * Authors: Ben Skeggs
247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs */
257ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs/* To build for nva3:nvc0
277ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *    m4 -DNVA3 nva3_copy.fuc | envyas -a -w -m fuc -V nva3 -o nva3_copy.fuc.h
287ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *
297ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs * To build for nvc0-
307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs *    m4 -DNVC0 nva3_copy.fuc | envyas -a -w -m fuc -V nva3 -o nvc0_copy.fuc.h
317ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs */
327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
337ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3',
34971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.section #nva3_pcopy_data
35971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs,
36971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.section #nvc0_pcopy_data
377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs)
387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
397ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_object:                   .b32 0
407ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3',
417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dma:
427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dma_query:                .b32 0
437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dma_src:                  .b32 0
447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dma_dst:                  .b32 0
457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs,)
46971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.equ #ctx_dma_count 3
477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_query_address_high:       .b32 0
487ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_query_address_low:        .b32 0
497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_query_counter:            .b32 0
507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_address_high:         .b32 0
517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_address_low:          .b32 0
527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_pitch:                .b32 0
537ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_tile_mode:            .b32 0
547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_xsize:                .b32 0
557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_ysize:                .b32 0
567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_zsize:                .b32 0
577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_zoff:                 .b32 0
587ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_xoff:                 .b32 0
597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_yoff:                 .b32 0
607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_src_cpp:                  .b32 0
617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_address_high:         .b32 0
627ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_address_low:          .b32 0
637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_pitch:                .b32 0
647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_tile_mode:            .b32 0
657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_xsize:                .b32 0
667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_ysize:                .b32 0
677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_zsize:                .b32 0
687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_zoff:                 .b32 0
697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_xoff:                 .b32 0
707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_yoff:                 .b32 0
717ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_dst_cpp:                  .b32 0
727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_format:                   .b32 0
737ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_swz_const0:               .b32 0
747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_swz_const1:               .b32 0
757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_xcnt:                     .b32 0
767ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsctx_ycnt:                     .b32 0
777ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.align 256
787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
797ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsdispatch_table:
807ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x0000, NAME
817ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0x000 1
82971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_object                     ~0xffffffff
837ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x0100, NOP
847ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0x040 1
85971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 0x00010000 + #cmd_nop           ~0xffffffff
867ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x0140, PM_TRIGGER
877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0x050 1
88971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 0x00010000 + #cmd_pm_trigger    ~0xffffffff
897ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3', `
907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x0180-0x018c, DMA_
91971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b16 0x060 #ctx_dma_count
927ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsdispatch_dma:
93971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 0x00010000 + #cmd_dma           ~0xffffffff
94971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 0x00010000 + #cmd_dma           ~0xffffffff
95971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 0x00010000 + #cmd_dma           ~0xffffffff
967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs',)
977ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x0200-0x0218, SRC_TILE
987ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0x80 7
99971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_tile_mode              ~0x00000fff
100971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_xsize                  ~0x0007ffff
101971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_ysize                  ~0x00001fff
102971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_zsize                  ~0x000007ff
103971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_zoff                   ~0x00000fff
104971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_xoff                   ~0x0007ffff
105971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_yoff                   ~0x00001fff
1067ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x0220-0x0238, DST_TILE
1077ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0x88 7
108971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_tile_mode              ~0x00000fff
109971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_xsize                  ~0x0007ffff
110971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_ysize                  ~0x00001fff
111971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_zsize                  ~0x000007ff
112971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_zoff                   ~0x00000fff
113971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_xoff                   ~0x0007ffff
114971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_yoff                   ~0x00001fff
1157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x0300-0x0304, EXEC, WRCACHE_FLUSH
1167ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0xc0 2
117971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 0x00010000 + #cmd_exec          ~0xffffffff
118971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 0x00010000 + #cmd_wrcache_flush ~0xffffffff
1197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// mthd 0x030c-0x0340, various stuff
1207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0xc3 14
121971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_address_high           ~0x000000ff
122ce806a30470bcd846d148bf39d46de3ad7748228Maarten Lankhorst.b32 #ctx_src_address_low            ~0xffffffff
123971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_address_high           ~0x000000ff
124ce806a30470bcd846d148bf39d46de3ad7748228Maarten Lankhorst.b32 #ctx_dst_address_low            ~0xffffffff
125971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_src_pitch                  ~0x0007ffff
126971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_dst_pitch                  ~0x0007ffff
127971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_xcnt                       ~0x0000ffff
128971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_ycnt                       ~0x00001fff
129971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_format                     ~0x0333ffff
130971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_swz_const0                 ~0xffffffff
131971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_swz_const1                 ~0xffffffff
132971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_query_address_high         ~0x000000ff
133971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_query_address_low          ~0xffffffff
134971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.b32 #ctx_query_counter              ~0xffffffff
1357ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.b16 0x800 0
1367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3',
138971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.section #nva3_pcopy_code
139971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs,
140971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs.section #nvc0_pcopy_code
1417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs)
1427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsmain:
1447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r0
1457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $sp $r0
1467ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // setup i0 handler and route fifo and ctxswitch to it
148971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   mov $r1 #ih
1497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $iv0 $r1
1507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r1 0x400
1517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   movw $r2 0xfff3
1527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r2 0
1530f0f7be8bdfc31f21b4a6b7e02a63b1b26b00123Ben Skeggs   iowr I[$r1 + 0x300] $r2
1547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // enable interrupts
1567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r2 0xc
1577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r1] $r2
1587ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   bset $flags ie0
1597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // enable fifo access and context switching
1617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r1 0x1200
1627ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r2 3
1637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r1] $r2
1647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // sleep forever, waking for interrupts
1667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   bset $flags $p0
1677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   spin:
1687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      sleep $p0
169971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #spin
1707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1717ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// i0 handler
1727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsih:
1737ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iord $r1 I[$r0 + 0x200]
1747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r2 $r1 0x00000008
176971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #ih_no_chsw
177971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #chsw
1787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ih_no_chsw:
1797ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r2 $r1 0x00000004
180971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #ih_no_cmd
181971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #dispatch
1827ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1837ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ih_no_cmd:
1847ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r1 $r1 0x0000000c
1857ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r0 + 0x100] $r1
1867ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iret
1877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
1887ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// $p1 direction (0 = unload, 1 = load)
1897ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// $r3 channel
1907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsswctx:
1917ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r4 0x7700
1927ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $xtargets $r4
1937ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3', `
1947ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // target 7 hardcoded to ctx dma object
1957ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $xdbase $r0
1967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs', ` // NVC0
1977ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // read SCRATCH3 to decide if we are PCOPY0 or PCOPY1
1987ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r4 0x2100
1997ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iord $r4 I[$r4 + 0]
2007ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r4 1
2017ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r4 4
2027ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r4 0x30
2037ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2047ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // channel is in vram
2057ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r15 0x61c
2067ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r15 6
2077ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 0x114
2087ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowrs I[$r15] $r5
2097ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2107ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // read 16-byte PCOPYn info, containing context pointer, from channel
2117ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r5 $r3 4
2127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r5 2
2137ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $xdbase $r5
2147ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 $sp
2157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // get a chunk of stack space, aligned to 256 byte boundary
2167ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r5 0x100
2177ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r6 0xff
2187ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   not b32 $r6
2197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r5 $r6
2207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r5 0x00020000
2217ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xdld $r4 $r5
2227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xdwait
2237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r5 0
2247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2257ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // set context pointer, from within channel VM
2267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r14 0
2277ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowrs I[$r15] $r14
2287ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b32 $r4 D[$r5 + 0]
2297ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shr b32 $r4 8
2307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b32 $r6 D[$r5 + 4]
2317ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r6 24
2327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r4 $r6
2337ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $xdbase $r4
2347ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs')
2357ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // 256-byte context, at start of data segment
2367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov b32 $r4 $r0
2377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r4 0x60000
2387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2397ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // swap!
240971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra $p1 #swctx_load
2417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      xdst $r0 $r4
242971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #swctx_done
2437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   swctx_load:
2447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      xdld $r0 $r4
2457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   swctx_done:
2467ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xdwait
2477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
2487ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggschsw:
2507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // read current channel
2517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r2 0x1400
2527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iord $r3 I[$r2]
2537ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // if it's active, unload it and return
2557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r15 $r3 0x1e
256971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #chsw_no_unload
2577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      bclr $flags $p1
258971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #swctx
2597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      bclr $r3 0x1e
2607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r2] $r3
2617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r4 1
2627ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r2 + 0x200] $r4
2637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      ret
2647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // read next channel
2667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   chsw_no_unload:
2677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iord $r3 I[$r2 + 0x100]
2687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // is there a channel waiting to be loaded?
2707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r13 $r3 0x1e
271971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #chsw_finish_load
2727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      bset $flags $p1
273971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #swctx
2747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3',
2757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      // load dma objects back into TARGET regs
276971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      mov $r5 #ctx_dma
277971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      mov $r6 #ctx_dma_count
2787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      chsw_load_ctx_dma:
2797ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         ld b32 $r7 D[$r5 + $r6 * 4]
2807ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         add b32 $r8 $r6 0x180
2817ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         shl b32 $r8 8
2827ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         iowr I[$r8] $r7
2837ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         sub b32 $r6 1
284971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs         bra nc #chsw_load_ctx_dma
2857ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs,)
2867ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   chsw_finish_load:
2887ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r3 2
2897ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r2 + 0x200] $r3
2907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
2917ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
2927ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsdispatch:
2937ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // read incoming fifo command
2947ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r3 0x1900
2957ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iord $r2 I[$r3 + 0x100]
2967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iord $r3 I[$r3 + 0x000]
2977ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r4 $r2 0x7ff
2987ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // $r2 will be used to store exception data
2997ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r2 0x10
3007ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3017ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // lookup method in the dispatch table, ILLEGAL_MTHD if not found
302971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   mov $r5 #dispatch_table
3037ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r6
3047ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r7
3057ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dispatch_loop:
3067ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      ld b16 $r6 D[$r5 + 0]
3077ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      ld b16 $r7 D[$r5 + 2]
3087ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      add b32 $r5 4
3097ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      cmpu b32 $r4 $r6
310971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra c #dispatch_illegal_mthd
3117ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      add b32 $r7 $r6
3127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      cmpu b32 $r4 $r7
313971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra c #dispatch_valid_mthd
3147ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      sub b32 $r7 $r6
3157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      shl b32 $r7 3
3167ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      add b32 $r5 $r7
317971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #dispatch_loop
3187ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // ensure no bits set in reserved fields, INVALID_BITFIELD
3207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dispatch_valid_mthd:
3217ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r4 $r6
3227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r4 3
3237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r4 $r5
3247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b32 $r5 D[$r4 + 4]
3257ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r5 $r3
3267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmpu b32 $r5 0
327971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra ne #dispatch_invalid_bitfield
3287ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3297ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // depending on dispatch flags: execute method, or save data as state
3307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b16 $r5 D[$r4 + 0]
3317ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b16 $r6 D[$r4 + 2]
3327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmpu b32 $r6 0
333971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra ne #dispatch_cmd
3347ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      st b32 D[$r5] $r3
335971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #dispatch_done
3367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dispatch_cmd:
3377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      bclr $flags $p1
3387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      call $r5
339971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra $p1 #dispatch_error
340971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #dispatch_done
3417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dispatch_invalid_bitfield:
3437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r2 2
3447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dispatch_illegal_mthd:
3457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r2 1
3467ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // store exception data in SCRATCH0/SCRATCH1, signal hostirq
3487ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dispatch_error:
3497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r4 0x1000
3507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x000] $r2
3517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x100] $r3
3527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r2 0x40
3537ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r0] $r2
3547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   hostirq_wait:
3557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iord $r2 I[$r0 + 0x200]
3567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      and $r2 0x40
3577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      cmpu b32 $r2 0
358971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra ne #hostirq_wait
3597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dispatch_done:
3617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r2 0x1d00
3627ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r3 1
3637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r2] $r3
3647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
3657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// No-operation
3677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
3687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Inputs:
3697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
3707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r2: hostirq state
3717ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r3: data
3727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r4: dispatch table entry
3737ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Outputs:
3747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
3757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $p1: set on error
3767ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r2: hostirq state
3777ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r3: data
3787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_nop:
3797ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
3807ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
3817ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// PM_TRIGGER
3827ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
3837ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Inputs:
3847ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
3857ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r2: hostirq state
3867ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r3: data
3877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r4: dispatch table entry
3887ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Outputs:
3897ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
3907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $p1: set on error
3917ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r2: hostirq state
3927ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r3: data
3937ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_pm_trigger:
3947ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r2 0x2200
3957ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r3
3967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r3 0x20000
3977ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r2] $r3
3987ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
3997ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
4007ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3',
4017ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// SET_DMA_* method handler
4027ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
4037ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Inputs:
4047ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
4057ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r2: hostirq state
4067ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r3: data
4077ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r4: dispatch table entry
4087ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Outputs:
4097ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
4107ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $p1: set on error
4117ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r2: hostirq state
4127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r3: data
4137ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_dma:
414971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   sub b32 $r4 #dispatch_dma
4157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shr b32 $r4 1
4167ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   bset $r3 0x1e
417971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   st b32 D[$r4 + #ctx_dma] $r3
4187ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r4 0x600
4197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r4 6
4207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4] $r3
4217ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
4227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs,)
4237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
4247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Calculates the hw swizzle mask and adjusts the surface's xcnt to match
4257ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
4267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_exec_set_format:
4277ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // zero out a chunk of the stack to store the swizzle into
4287ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add $sp -0x10
4297ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   st b32 D[$sp + 0x00] $r0
4307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   st b32 D[$sp + 0x04] $r0
4317ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   st b32 D[$sp + 0x08] $r0
4327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   st b32 D[$sp + 0x0c] $r0
4337ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
4347ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // extract cpp, src_ncomp and dst_ncomp from FORMAT
435971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r4 D[$r0 + #ctx_format]
4367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   extr $r5 $r4 16:17
4377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r5 1
4387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   extr $r6 $r4 20:21
4397ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r6 1
4407ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   extr $r7 $r4 24:25
4417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r7 1
4427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
4437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // convert FORMAT swizzle mask to hw swizzle mask
4447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   bclr $flags $p2
4457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r8
4467ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r9
4477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ncomp_loop:
4487ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      and $r10 $r4 0xf
4497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      shr b32 $r4 4
4507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      clear b32 $r11
4517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      bpc_loop:
4527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         cmpu b8 $r10 4
453971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs         bra nc #cmp_c0
4547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            mulu $r12 $r10 $r5
4557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            add b32 $r12 $r11
4567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            bset $flags $p2
457971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs            bra #bpc_next
4587ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         cmp_c0:
459971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs         bra ne #cmp_c1
4607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            mov $r12 0x10
4617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            add b32 $r12 $r11
462971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs            bra #bpc_next
4637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         cmp_c1:
4647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         cmpu b8 $r10 6
465971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs         bra nc #cmp_zero
4667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            mov $r12 0x14
4677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            add b32 $r12 $r11
468971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs            bra #bpc_next
4697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         cmp_zero:
4707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs            mov $r12 0x80
4717ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         bpc_next:
4727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         st b8 D[$sp + $r8] $r12
4737ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         add b32 $r8 1
4747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         add b32 $r11 1
4757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs         cmpu b32 $r11 $r5
476971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs         bra c #bpc_loop
4777ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      add b32 $r9 1
4787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      cmpu b32 $r9 $r7
479971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra c #ncomp_loop
4807ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
4817ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // SRC_XCNT = (xcnt * src_cpp), or 0 if no src ref in swz (hw will hang)
4827ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r6 $r5
483971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   st b32 D[$r0 + #ctx_src_cpp] $r6
484971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r8 D[$r0 + #ctx_xcnt]
4857ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r6 $r8
486971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra $p2 #dst_xcnt
4877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r6
4887ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
4897ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dst_xcnt:
4907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r7 $r5
491971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   st b32 D[$r0 + #ctx_dst_cpp] $r7
4927ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r7 $r8
4937ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
4947ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 0x810
4957ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r5 6
4967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x000] $r6
4977ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x100] $r7
4987ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r5 0x800
499971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r6 D[$r0 + #ctx_dst_cpp]
5007ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r6 1
5017ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r6 8
502971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r7 D[$r0 + #ctx_src_cpp]
5037ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r7 1
5047ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r6 $r7
5057ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x000] $r6
5067ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r5 0x100
5077ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b32 $r6 D[$sp + 0x00]
5087ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x000] $r6
5097ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b32 $r6 D[$sp + 0x04]
5107ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x100] $r6
5117ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b32 $r6 D[$sp + 0x08]
5127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x200] $r6
5137ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ld b32 $r6 D[$sp + 0x0c]
5147ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x300] $r6
5157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r5 0x400
516971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r6 D[$r0 + #ctx_swz_const0]
5177ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x000] $r6
518971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r6 D[$r0 + #ctx_swz_const1]
5197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x100] $r6
5207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add $sp 0x10
5217ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
5227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
5237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Setup to handle a tiled surface
5247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
5257ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Calculates a number of parameters the hardware requires in order
5267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// to correctly handle tiling.
5277ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
5287ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Offset calculation is performed as follows (Tp/Th/Td from TILE_MODE):
5297ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    nTx = round_up(w * cpp, 1 << Tp) >> Tp
5307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    nTy = round_up(h, 1 << Th) >> Th
5317ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    Txo = (x * cpp) & ((1 << Tp) - 1)
5327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//     Tx = (x * cpp) >> Tp
5337ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    Tyo = y & ((1 << Th) - 1)
5347ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//     Ty = y >> Th
5357ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    Tzo = z & ((1 << Td) - 1)
5367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//     Tz = z >> Td
5377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
5387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    off  = (Tzo << Tp << Th) + (Tyo << Tp) + Txo
5397ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    off += ((Tz * nTy * nTx)) + (Ty * nTx) + Tx) << Td << Th << Tp;
5407ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
5417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Inputs:
5427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r4: hw command (0x104800)
5437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r5: ctx offset adjustment for src/dst selection
5447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $p2: set if dst surface
5457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
5467ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_exec_set_surface_tiled:
5477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // translate TILE_MODE into Tp, Th, Td shift values
548971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r7 D[$r5 + #ctx_src_tile_mode]
5497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   extr $r9 $r7 8:11
5507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   extr $r8 $r7 4:7
5517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggsifdef(`NVA3',
5527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r8 2
5537ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs,
5547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r8 3
5557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs)
5567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   extr $r7 $r7 0:3
5577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmp b32 $r7 0xe
558971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra ne #xtile64
5597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r7 4
560971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra #xtileok
5617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xtile64:
5627ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r7 $flags $p2
5637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r7 17
5647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   bset $r4 $r7
5657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r7 6
5667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xtileok:
5677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
5687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Op = (x * cpp) & ((1 << Tp) - 1)
5697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Tx = (x * cpp) >> Tp
570971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r10 D[$r5 + #ctx_src_xoff]
571971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r11 D[$r5 + #ctx_src_cpp]
5727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r10 $r11
5737ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r11 1
5747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r11 $r7
5757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r11 1
5767ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r12 $r10 $r11
5777ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shr b32 $r10 $r7
5787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
5797ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Tyo = y & ((1 << Th) - 1)
5807ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Ty  = y >> Th
581971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r13 D[$r5 + #ctx_src_yoff]
5827ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r14 1
5837ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r14 $r8
5847ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r14 1
5857ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r11 $r13 $r14
5867ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shr b32 $r13 $r8
5877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
5887ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // YTILE = ((1 << Th) << 12) | ((1 << Th) - Tyo)
5897ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r14 1
5907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r15 $r14 12
5917ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r14 $r11
5927ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r15 $r14
5937ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r6 $flags $p2
5947ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r6 0x208
5957ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r6 8
5967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r6 + 0x000] $r15
5977ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
5987ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Op += Tyo << Tp
5997ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r11 $r7
6007ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r12 $r11
6017ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6027ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // nTx = ((w * cpp) + ((1 << Tp) - 1) >> Tp)
603971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r15 D[$r5 + #ctx_src_xsize]
604971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r11 D[$r5 + #ctx_src_cpp]
6057ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r15 $r11
6067ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r11 1
6077ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r11 $r7
6087ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r11 1
6097ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r15 $r11
6107ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shr b32 $r15 $r7
6117ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   push $r15
6127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6137ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // nTy = (h + ((1 << Th) - 1)) >> Th
614971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r15 D[$r5 + #ctx_src_ysize]
6157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r11 1
6167ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r11 $r8
6177ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r11 1
6187ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r15 $r11
6197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shr b32 $r15 $r8
6207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   push $r15
6217ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Tys = Tp + Th
6237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // CFG_YZ_TILE_SIZE = ((1 << Th) >> 2) << Td
6247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r7 $r8
6257ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r8 2
6267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r11 1
6277ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r11 $r8
6287ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r11 $r9
6297ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Tzo = z & ((1 << Td) - 1)
6317ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Tz  = z >> Td
6327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Op += Tzo << Tys
6337ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Ts  = Tys + Td
634971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r8 D[$r5 + #ctx_src_zoff]
6357ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r14 1
6367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r14 $r9
6377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r14 1
6387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   and $r15 $r8 $r14
6397ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r15 $r7
6407ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r12 $r15
6417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r7 $r9
6427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shr b32 $r8 $r9
6437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // Ot = ((Tz * nTy * nTx) + (Ty * nTx) + Tx) << Ts
6457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   pop $r15
6467ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   pop $r9
6477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r13 $r9
6487ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r10 $r13
6497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r8 $r9
6507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mulu $r8 $r15
6517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r10 $r8
6527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r10 $r7
6537ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // PITCH = (nTx - 1) << Ts
6557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r9 1
6567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r9 $r7
6577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r6 + 0x200] $r9
6587ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // SRC_ADDRESS_LOW   = (Ot + Op) & 0xffffffff
6607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // CFG_ADDRESS_HIGH |= ((Ot + Op) >> 32) << 16
661971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r7 D[$r5 + #ctx_src_address_low]
662971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r8 D[$r5 + #ctx_src_address_high]
6637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r10 $r12
6647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r7 $r10
6657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   adc b32 $r8 0
6667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r8 16
6677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r8 $r11
6687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sub b32 $r6 0x600
6697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r6 + 0x000] $r7
6707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r6 0x400
6717ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r6 + 0x000] $r8
6727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
6737ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Setup to handle a linear surface
6757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
6767ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Nothing to see here.. Sets ADDRESS and PITCH, pretty non-exciting
6777ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
6787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_exec_set_surface_linear:
6797ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r6 $flags $p2
6807ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r6 0x202
6817ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r6 8
682971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r7 D[$r5 + #ctx_src_address_low]
6837ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r6 + 0x000] $r7
6847ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r6 0x400
685971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r7 D[$r5 + #ctx_src_address_high]
6867ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r7 16
6877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r6 + 0x000] $r7
6887ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r6 0x400
689971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r7 D[$r5 + #ctx_src_pitch]
6907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r6 + 0x000] $r7
6917ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
6927ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
6937ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// wait for regs to be available for use
6947ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_exec_wait:
6957ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   push $r0
6967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   push $r1
6977ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r0 0x800
6987ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r0 6
6997ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   loop:
7007ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iord $r1 I[$r0]
7017ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      and $r1 1
702971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra ne #loop
7037ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   pop $r1
7047ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   pop $r0
7057ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
7067ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
7077ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_exec_query:
7087ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // if QUERY_SHORT not set, write out { -, 0, TIME_LO, TIME_HI }
7097ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r4 $r3 13
710971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra ne #query_counter
711971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #cmd_exec_wait
7127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r4 0x80c
7137ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      shl b32 $r4 6
714971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      ld b32 $r5 D[$r0 + #ctx_query_address_low]
7157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      add b32 $r5 4
7167ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x000] $r5
7177ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x100] $r0
7187ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r5 0xc
7197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x200] $r5
7207ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      add b32 $r4 0x400
721971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      ld b32 $r5 D[$r0 + #ctx_query_address_high]
7227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      shl b32 $r5 16
7237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x000] $r5
7247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      add b32 $r4 0x500
7257ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r5 0x00000b00
7267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      sethi $r5 0x00010000
7277ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x000] $r5
7287ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r5 0x00004040
7297ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      shl b32 $r5 1
7307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      sethi $r5 0x80800000
7317ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x100] $r5
7327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r5 0x00001110
7337ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      sethi $r5 0x13120000
7347ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x200] $r5
7357ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r5 0x00001514
7367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      sethi $r5 0x17160000
7377ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x300] $r5
7387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r5 0x00002601
7397ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      sethi $r5 0x00010000
7407ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r4 0x800
7417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      shl b32 $r4 6
7427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r4 + 0x000] $r5
7437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
7447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // write COUNTER
7457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   query_counter:
746971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   call #cmd_exec_wait
7477ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r4 0x80c
7487ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r4 6
749971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r5 D[$r0 + #ctx_query_address_low]
7507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x000] $r5
7517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x100] $r0
7527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 0x4
7537ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x200] $r5
7547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r4 0x400
755971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r5 D[$r0 + #ctx_query_address_high]
7567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r5 16
7577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x000] $r5
7587ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r4 0x500
7597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 0x00000300
7607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x000] $r5
7617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 0x00001110
7627ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r5 0x13120000
7637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x100] $r5
764971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r5 D[$r0 + #ctx_query_counter]
7657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   add b32 $r4 0x500
7667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x000] $r5
7677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 0x00002601
7687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r5 0x00010000
7697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r4 0x800
7707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r4 6
7717ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r4 + 0x000] $r5
7727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
7737ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
7747ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Execute a copy operation
7757ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
7767ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Inputs:
7777ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
7787ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r2: hostirq state
7797ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r3: data
7807ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       000002000 QUERY_SHORT
7817ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       000001000 QUERY
7827ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       000000100 DST_LINEAR
7837ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       000000010 SRC_LINEAR
7847ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       000000001 FORMAT
7857ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r4: dispatch table entry
7867ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Outputs:
7877ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
7887ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $p1: set on error
7897ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r2: hostirq state
7907ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r3: data
7917ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_exec:
792971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   call #cmd_exec_wait
7937ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
7947ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // if format requested, call function to calculate it, otherwise
7957ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // fill in cpp/xcnt for both surfaces as if (cpp == 1)
7967ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r15 $r3 0
797971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #cmd_exec_no_format
798971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #cmd_exec_set_format
7997ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r4 0x200
800971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #cmd_exec_init_src_surface
8017ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmd_exec_no_format:
8027ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r6 0x810
8037ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      shl b32 $r6 6
8047ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      mov $r7 1
805971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      st b32 D[$r0 + #ctx_src_cpp] $r7
806971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      st b32 D[$r0 + #ctx_dst_cpp] $r7
807971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      ld b32 $r7 D[$r0 + #ctx_xcnt]
8087ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r6 + 0x000] $r7
8097ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      iowr I[$r6 + 0x100] $r7
8107ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      clear b32 $r4
8117ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
8127ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmd_exec_init_src_surface:
8137ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   bclr $flags $p2
8147ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r5
8157ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r15 $r3 4
816971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #src_tiled
817971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #cmd_exec_set_surface_linear
818971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #cmd_exec_init_dst_surface
8197ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   src_tiled:
820971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #cmd_exec_set_surface_tiled
8217ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      bset $r4 7
8227ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
8237ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmd_exec_init_dst_surface:
8247ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   bset $flags $p2
825971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   mov $r5 #ctx_dst_address_high - #ctx_src_address_high
8267ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r15 $r3 8
827971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #dst_tiled
828971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #cmd_exec_set_surface_linear
829971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      bra #cmd_exec_kick
8307ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   dst_tiled:
831971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #cmd_exec_set_surface_tiled
8327ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs      bset $r4 8
8337ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
8347ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmd_exec_kick:
8357ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r5 0x800
8367ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   shl b32 $r5 6
837971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   ld b32 $r6 D[$r0 + #ctx_ycnt]
8387ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5 + 0x100] $r6
8397ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r6 0x0041
8407ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // SRC_TARGET = 1, DST_TARGET = 2
8417ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r6 0x44000000
8427ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   or $r4 $r6
8437ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r5] $r4
8447ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
8457ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   // if requested, queue up a QUERY write after the copy has completed
8467ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   xbit $r15 $r3 12
847971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs   bra e #cmd_exec_done
848971fa6b46df2edc02c9937938d9ba1d6d6724e74Ben Skeggs      call #cmd_exec_query
8497ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
8507ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   cmd_exec_done:
8517ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
8527ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
8537ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Flush write cache
8547ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//
8557ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Inputs:
8567ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
8577ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r2: hostirq state
8587ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r3: data
8597ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r4: dispatch table entry
8607ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs// Outputs:
8617ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $r1: irqh state
8627ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//    $p1: set on error
8637ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r2: hostirq state
8647ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs//       $r3: data
8657ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggscmd_wrcache_flush:
8667ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   mov $r2 0x2200
8677ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   clear b32 $r3
8687ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   sethi $r3 0x10000
8697ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   iowr I[$r2] $r3
8707ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs   ret
8717ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs
8727ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69Ben Skeggs.align 0x100
873