diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-03-17 20:25:59 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-05-15 20:48:48 -0400 |
commit | 7ff5441e55feb1f6f38c39f32f31aa8a0e8f4b69 (patch) | |
tree | 59c10167be68dcca3e71a5215246502feb51f4a2 | |
parent | a82dd49f14742e2529f79feb6360e0993277e788 (diff) |
drm/nva3: implement support for copy engine
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/Makefile | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drv.h | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_graph.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nva3_copy.c | 226 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nva3_copy.fuc | 870 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nva3_copy.fuc.h | 534 |
7 files changed, 1656 insertions, 1 deletions
diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile index e12c97fd8db8..fc5702e8ce85 100644 --- a/drivers/gpu/drm/nouveau/Makefile +++ b/drivers/gpu/drm/nouveau/Makefile | |||
@@ -20,6 +20,7 @@ nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \ | |||
20 | nv40_graph.o nv50_graph.o nvc0_graph.o \ | 20 | nv40_graph.o nv50_graph.o nvc0_graph.o \ |
21 | nv40_grctx.o nv50_grctx.o nvc0_grctx.o \ | 21 | nv40_grctx.o nv50_grctx.o nvc0_grctx.o \ |
22 | nv84_crypt.o \ | 22 | nv84_crypt.o \ |
23 | nva3_copy.o \ | ||
23 | nv04_instmem.o nv50_instmem.o nvc0_instmem.o \ | 24 | nv04_instmem.o nv50_instmem.o nvc0_instmem.o \ |
24 | nv50_evo.o nv50_crtc.o nv50_dac.o nv50_sor.o \ | 25 | nv50_evo.o nv50_crtc.o nv50_dac.o nv50_sor.o \ |
25 | nv50_cursor.o nv50_display.o \ | 26 | nv50_cursor.o nv50_display.o \ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 3f90f3891f59..78db2850d9ea 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
@@ -151,6 +151,8 @@ enum nouveau_flags { | |||
151 | #define NVOBJ_ENGINE_SW 0 | 151 | #define NVOBJ_ENGINE_SW 0 |
152 | #define NVOBJ_ENGINE_GR 1 | 152 | #define NVOBJ_ENGINE_GR 1 |
153 | #define NVOBJ_ENGINE_CRYPT 2 | 153 | #define NVOBJ_ENGINE_CRYPT 2 |
154 | #define NVOBJ_ENGINE_COPY0 3 | ||
155 | #define NVOBJ_ENGINE_COPY1 4 | ||
154 | #define NVOBJ_ENGINE_DISPLAY 15 | 156 | #define NVOBJ_ENGINE_DISPLAY 15 |
155 | #define NVOBJ_ENGINE_NR 16 | 157 | #define NVOBJ_ENGINE_NR 16 |
156 | 158 | ||
@@ -1137,6 +1139,7 @@ extern void nv40_grctx_init(struct nouveau_grctx *); | |||
1137 | extern int nv50_graph_create(struct drm_device *); | 1139 | extern int nv50_graph_create(struct drm_device *); |
1138 | extern int nv50_grctx_init(struct nouveau_grctx *); | 1140 | extern int nv50_grctx_init(struct nouveau_grctx *); |
1139 | extern struct nouveau_enum nv50_data_error_names[]; | 1141 | extern struct nouveau_enum nv50_data_error_names[]; |
1142 | extern int nv50_graph_isr_chid(struct drm_device *dev, u64 inst); | ||
1140 | 1143 | ||
1141 | /* nvc0_graph.c */ | 1144 | /* nvc0_graph.c */ |
1142 | extern int nvc0_graph_create(struct drm_device *); | 1145 | extern int nvc0_graph_create(struct drm_device *); |
@@ -1144,6 +1147,12 @@ extern int nvc0_graph_create(struct drm_device *); | |||
1144 | /* nv84_crypt.c */ | 1147 | /* nv84_crypt.c */ |
1145 | extern int nv84_crypt_create(struct drm_device *); | 1148 | extern int nv84_crypt_create(struct drm_device *); |
1146 | 1149 | ||
1150 | /* nva3_copy.c */ | ||
1151 | extern int nva3_copy_create(struct drm_device *dev); | ||
1152 | |||
1153 | /* nvc0_copy.c */ | ||
1154 | extern int nvc0_copy_create(struct drm_device *dev, int engine); | ||
1155 | |||
1147 | /* nv04_instmem.c */ | 1156 | /* nv04_instmem.c */ |
1148 | extern int nv04_instmem_init(struct drm_device *); | 1157 | extern int nv04_instmem_init(struct drm_device *); |
1149 | extern void nv04_instmem_takedown(struct drm_device *); | 1158 | extern void nv04_instmem_takedown(struct drm_device *); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index e50156cdcabd..fa1e08510eb5 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
@@ -598,6 +598,21 @@ nouveau_card_init(struct drm_device *dev) | |||
598 | break; | 598 | break; |
599 | } | 599 | } |
600 | 600 | ||
601 | switch (dev_priv->card_type) { | ||
602 | case NV_50: | ||
603 | switch (dev_priv->chipset) { | ||
604 | case 0xa3: | ||
605 | case 0xa5: | ||
606 | case 0xa8: | ||
607 | case 0xaf: | ||
608 | nva3_copy_create(dev); | ||
609 | break; | ||
610 | } | ||
611 | break; | ||
612 | default: | ||
613 | break; | ||
614 | } | ||
615 | |||
601 | if (!nouveau_noaccel) { | 616 | if (!nouveau_noaccel) { |
602 | for (e = 0; e < NVOBJ_ENGINE_NR; e++) { | 617 | for (e = 0; e < NVOBJ_ENGINE_NR; e++) { |
603 | if (dev_priv->eng[e]) { | 618 | if (dev_priv->eng[e]) { |
diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c index 5794cdef32c5..e25cbb46789a 100644 --- a/drivers/gpu/drm/nouveau/nv50_graph.c +++ b/drivers/gpu/drm/nouveau/nv50_graph.c | |||
@@ -939,7 +939,7 @@ nv50_pgraph_trap_handler(struct drm_device *dev, u32 display, u64 inst, u32 chid | |||
939 | return 1; | 939 | return 1; |
940 | } | 940 | } |
941 | 941 | ||
942 | static int | 942 | int |
943 | nv50_graph_isr_chid(struct drm_device *dev, u64 inst) | 943 | nv50_graph_isr_chid(struct drm_device *dev, u64 inst) |
944 | { | 944 | { |
945 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 945 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.c b/drivers/gpu/drm/nouveau/nva3_copy.c new file mode 100644 index 000000000000..b86820a61220 --- /dev/null +++ b/drivers/gpu/drm/nouveau/nva3_copy.c | |||
@@ -0,0 +1,226 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Red Hat Inc. | ||
3 | * | ||
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: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
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. | ||
21 | * | ||
22 | * Authors: Ben Skeggs | ||
23 | */ | ||
24 | |||
25 | #include <linux/firmware.h> | ||
26 | #include "drmP.h" | ||
27 | #include "nouveau_drv.h" | ||
28 | #include "nouveau_util.h" | ||
29 | #include "nouveau_vm.h" | ||
30 | #include "nouveau_ramht.h" | ||
31 | #include "nva3_copy.fuc.h" | ||
32 | |||
33 | struct nva3_copy_engine { | ||
34 | struct nouveau_exec_engine base; | ||
35 | }; | ||
36 | |||
37 | static int | ||
38 | nva3_copy_context_new(struct nouveau_channel *chan, int engine) | ||
39 | { | ||
40 | struct drm_device *dev = chan->dev; | ||
41 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
42 | struct nouveau_gpuobj *ramin = chan->ramin; | ||
43 | struct nouveau_gpuobj *ctx = NULL; | ||
44 | int ret; | ||
45 | |||
46 | NV_DEBUG(dev, "ch%d\n", chan->id); | ||
47 | |||
48 | ret = nouveau_gpuobj_new(dev, chan, 256, 0, NVOBJ_FLAG_ZERO_ALLOC | | ||
49 | NVOBJ_FLAG_ZERO_FREE, &ctx); | ||
50 | if (ret) | ||
51 | return ret; | ||
52 | |||
53 | nv_wo32(ramin, 0xc0, 0x00190000); | ||
54 | nv_wo32(ramin, 0xc4, ctx->vinst + ctx->size - 1); | ||
55 | nv_wo32(ramin, 0xc8, ctx->vinst); | ||
56 | nv_wo32(ramin, 0xcc, 0x00000000); | ||
57 | nv_wo32(ramin, 0xd0, 0x00000000); | ||
58 | nv_wo32(ramin, 0xd4, 0x00000000); | ||
59 | dev_priv->engine.instmem.flush(dev); | ||
60 | |||
61 | atomic_inc(&chan->vm->engref[engine]); | ||
62 | chan->engctx[engine] = ctx; | ||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | static int | ||
67 | nva3_copy_object_new(struct nouveau_channel *chan, int engine, | ||
68 | u32 handle, u16 class) | ||
69 | { | ||
70 | struct nouveau_gpuobj *ctx = chan->engctx[engine]; | ||
71 | |||
72 | /* fuc engine doesn't need an object, our ramht code does.. */ | ||
73 | ctx->engine = 3; | ||
74 | ctx->class = class; | ||
75 | return nouveau_ramht_insert(chan, handle, ctx); | ||
76 | } | ||
77 | |||
78 | static void | ||
79 | nva3_copy_context_del(struct nouveau_channel *chan, int engine) | ||
80 | { | ||
81 | struct nouveau_gpuobj *ctx = chan->engctx[engine]; | ||
82 | struct drm_device *dev = chan->dev; | ||
83 | u32 inst; | ||
84 | |||
85 | inst = (chan->ramin->vinst >> 12); | ||
86 | inst |= 0x40000000; | ||
87 | |||
88 | /* disable fifo access */ | ||
89 | nv_wr32(dev, 0x104048, 0x00000000); | ||
90 | /* mark channel as unloaded if it's currently active */ | ||
91 | if (nv_rd32(dev, 0x104050) == inst) | ||
92 | nv_mask(dev, 0x104050, 0x40000000, 0x00000000); | ||
93 | /* mark next channel as invalid if it's about to be loaded */ | ||
94 | if (nv_rd32(dev, 0x104054) == inst) | ||
95 | nv_mask(dev, 0x104054, 0x40000000, 0x00000000); | ||
96 | /* restore fifo access */ | ||
97 | nv_wr32(dev, 0x104048, 0x00000003); | ||
98 | |||
99 | for (inst = 0xc0; inst <= 0xd4; inst += 4) | ||
100 | nv_wo32(chan->ramin, inst, 0x00000000); | ||
101 | |||
102 | nouveau_gpuobj_ref(NULL, &ctx); | ||
103 | |||
104 | atomic_dec(&chan->vm->engref[engine]); | ||
105 | chan->engctx[engine] = ctx; | ||
106 | } | ||
107 | |||
108 | static void | ||
109 | nva3_copy_tlb_flush(struct drm_device *dev, int engine) | ||
110 | { | ||
111 | nv50_vm_flush_engine(dev, 0x0d); | ||
112 | } | ||
113 | |||
114 | static int | ||
115 | nva3_copy_init(struct drm_device *dev, int engine) | ||
116 | { | ||
117 | int i; | ||
118 | |||
119 | nv_mask(dev, 0x000200, 0x00002000, 0x00000000); | ||
120 | nv_mask(dev, 0x000200, 0x00002000, 0x00002000); | ||
121 | nv_wr32(dev, 0x104014, 0xffffffff); /* disable all interrupts */ | ||
122 | |||
123 | /* upload ucode */ | ||
124 | nv_wr32(dev, 0x1041c0, 0x01000000); | ||
125 | for (i = 0; i < sizeof(nva3_pcopy_data) / 4; i++) | ||
126 | nv_wr32(dev, 0x1041c4, nva3_pcopy_data[i]); | ||
127 | |||
128 | nv_wr32(dev, 0x104180, 0x01000000); | ||
129 | for (i = 0; i < sizeof(nva3_pcopy_code) / 4; i++) { | ||
130 | if ((i & 0x3f) == 0) | ||
131 | nv_wr32(dev, 0x104188, i >> 6); | ||
132 | nv_wr32(dev, 0x104184, nva3_pcopy_code[i]); | ||
133 | } | ||
134 | |||
135 | /* start it running */ | ||
136 | nv_wr32(dev, 0x10410c, 0x00000000); | ||
137 | nv_wr32(dev, 0x104104, 0x00000000); /* ENTRY */ | ||
138 | nv_wr32(dev, 0x104100, 0x00000002); /* TRIGGER */ | ||
139 | return 0; | ||
140 | } | ||
141 | |||
142 | static int | ||
143 | nva3_copy_fini(struct drm_device *dev, int engine) | ||
144 | { | ||
145 | nv_mask(dev, 0x104048, 0x00000003, 0x00000000); | ||
146 | |||
147 | /* trigger fuc context unload */ | ||
148 | nv_wait(dev, 0x104008, 0x0000000c, 0x00000000); | ||
149 | nv_mask(dev, 0x104054, 0x40000000, 0x00000000); | ||
150 | nv_wr32(dev, 0x104000, 0x00000008); | ||
151 | nv_wait(dev, 0x104008, 0x00000008, 0x00000000); | ||
152 | |||
153 | nv_wr32(dev, 0x104014, 0xffffffff); | ||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static struct nouveau_enum nva3_copy_isr_error_name[] = { | ||
158 | { 0x0001, "ILLEGAL_MTHD" }, | ||
159 | { 0x0002, "INVALID_ENUM" }, | ||
160 | { 0x0003, "INVALID_BITFIELD" }, | ||
161 | {} | ||
162 | }; | ||
163 | |||
164 | static void | ||
165 | nva3_copy_isr(struct drm_device *dev) | ||
166 | { | ||
167 | u32 dispatch = nv_rd32(dev, 0x10401c); | ||
168 | u32 stat = nv_rd32(dev, 0x104008) & dispatch & ~(dispatch >> 16); | ||
169 | u32 inst = nv_rd32(dev, 0x104050) & 0x3fffffff; | ||
170 | u32 ssta = nv_rd32(dev, 0x104040) & 0x0000ffff; | ||
171 | u32 addr = nv_rd32(dev, 0x104040) >> 16; | ||
172 | u32 mthd = (addr & 0x07ff) << 2; | ||
173 | u32 subc = (addr & 0x3800) >> 11; | ||
174 | u32 data = nv_rd32(dev, 0x104044); | ||
175 | int chid = nv50_graph_isr_chid(dev, inst); | ||
176 | |||
177 | if (stat & 0x00000040) { | ||
178 | NV_INFO(dev, "PCOPY: DISPATCH_ERROR ["); | ||
179 | nouveau_enum_print(nva3_copy_isr_error_name, ssta); | ||
180 | printk("] ch %d [0x%08x] subc %d mthd 0x%04x data 0x%08x\n", | ||
181 | chid, inst, subc, mthd, data); | ||
182 | nv_wr32(dev, 0x104004, 0x00000040); | ||
183 | stat &= ~0x00000040; | ||
184 | } | ||
185 | |||
186 | if (stat) { | ||
187 | NV_INFO(dev, "PCOPY: unhandled intr 0x%08x\n", stat); | ||
188 | nv_wr32(dev, 0x104004, stat); | ||
189 | } | ||
190 | nv50_fb_vm_trap(dev, 1); | ||
191 | } | ||
192 | |||
193 | static void | ||
194 | nva3_copy_destroy(struct drm_device *dev, int engine) | ||
195 | { | ||
196 | struct nva3_copy_engine *pcopy = nv_engine(dev, engine); | ||
197 | |||
198 | nouveau_irq_unregister(dev, 22); | ||
199 | |||
200 | NVOBJ_ENGINE_DEL(dev, COPY0); | ||
201 | kfree(pcopy); | ||
202 | } | ||
203 | |||
204 | int | ||
205 | nva3_copy_create(struct drm_device *dev) | ||
206 | { | ||
207 | struct nva3_copy_engine *pcopy; | ||
208 | |||
209 | pcopy = kzalloc(sizeof(*pcopy), GFP_KERNEL); | ||
210 | if (!pcopy) | ||
211 | return -ENOMEM; | ||
212 | |||
213 | pcopy->base.destroy = nva3_copy_destroy; | ||
214 | pcopy->base.init = nva3_copy_init; | ||
215 | pcopy->base.fini = nva3_copy_fini; | ||
216 | pcopy->base.context_new = nva3_copy_context_new; | ||
217 | pcopy->base.context_del = nva3_copy_context_del; | ||
218 | pcopy->base.object_new = nva3_copy_object_new; | ||
219 | pcopy->base.tlb_flush = nva3_copy_tlb_flush; | ||
220 | |||
221 | nouveau_irq_register(dev, 22, nva3_copy_isr); | ||
222 | |||
223 | NVOBJ_ENGINE_ADD(dev, COPY0, &pcopy->base); | ||
224 | NVOBJ_CLASS(dev, 0x85b5, COPY0); | ||
225 | return 0; | ||
226 | } | ||
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc b/drivers/gpu/drm/nouveau/nva3_copy.fuc new file mode 100644 index 000000000000..eaf35f8321ee --- /dev/null +++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc | |||
@@ -0,0 +1,870 @@ | |||
1 | /* fuc microcode for copy engine on nva3- chipsets | ||
2 | * | ||
3 | * Copyright 2011 Red Hat Inc. | ||
4 | * | ||
5 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
6 | * copy of this software and associated documentation files (the "Software"), | ||
7 | * to deal in the Software without restriction, including without limitation | ||
8 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
9 | * and/or sell copies of the Software, and to permit persons to whom the | ||
10 | * Software is furnished to do so, subject to the following conditions: | ||
11 | * | ||
12 | * The above copyright notice and this permission notice shall be included in | ||
13 | * all copies or substantial portions of the Software. | ||
14 | * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
18 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
19 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
20 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
21 | * OTHER DEALINGS IN THE SOFTWARE. | ||
22 | * | ||
23 | * Authors: Ben Skeggs | ||
24 | */ | ||
25 | |||
26 | /* To build for nva3:nvc0 | ||
27 | * m4 -DNVA3 nva3_copy.fuc | envyas -a -w -m fuc -V nva3 -o nva3_copy.fuc.h | ||
28 | * | ||
29 | * To build for nvc0- | ||
30 | * m4 -DNVC0 nva3_copy.fuc | envyas -a -w -m fuc -V nva3 -o nvc0_copy.fuc.h | ||
31 | */ | ||
32 | |||
33 | ifdef(`NVA3', | ||
34 | .section nva3_pcopy_data, | ||
35 | .section nvc0_pcopy_data | ||
36 | ) | ||
37 | |||
38 | ctx_object: .b32 0 | ||
39 | ifdef(`NVA3', | ||
40 | ctx_dma: | ||
41 | ctx_dma_query: .b32 0 | ||
42 | ctx_dma_src: .b32 0 | ||
43 | ctx_dma_dst: .b32 0 | ||
44 | ,) | ||
45 | .equ ctx_dma_count 3 | ||
46 | ctx_query_address_high: .b32 0 | ||
47 | ctx_query_address_low: .b32 0 | ||
48 | ctx_query_counter: .b32 0 | ||
49 | ctx_src_address_high: .b32 0 | ||
50 | ctx_src_address_low: .b32 0 | ||
51 | ctx_src_pitch: .b32 0 | ||
52 | ctx_src_tile_mode: .b32 0 | ||
53 | ctx_src_xsize: .b32 0 | ||
54 | ctx_src_ysize: .b32 0 | ||
55 | ctx_src_zsize: .b32 0 | ||
56 | ctx_src_zoff: .b32 0 | ||
57 | ctx_src_xoff: .b32 0 | ||
58 | ctx_src_yoff: .b32 0 | ||
59 | ctx_src_cpp: .b32 0 | ||
60 | ctx_dst_address_high: .b32 0 | ||
61 | ctx_dst_address_low: .b32 0 | ||
62 | ctx_dst_pitch: .b32 0 | ||
63 | ctx_dst_tile_mode: .b32 0 | ||
64 | ctx_dst_xsize: .b32 0 | ||
65 | ctx_dst_ysize: .b32 0 | ||
66 | ctx_dst_zsize: .b32 0 | ||
67 | ctx_dst_zoff: .b32 0 | ||
68 | ctx_dst_xoff: .b32 0 | ||
69 | ctx_dst_yoff: .b32 0 | ||
70 | ctx_dst_cpp: .b32 0 | ||
71 | ctx_format: .b32 0 | ||
72 | ctx_swz_const0: .b32 0 | ||
73 | ctx_swz_const1: .b32 0 | ||
74 | ctx_xcnt: .b32 0 | ||
75 | ctx_ycnt: .b32 0 | ||
76 | .align 256 | ||
77 | |||
78 | dispatch_table: | ||
79 | // mthd 0x0000, NAME | ||
80 | .b16 0x000 1 | ||
81 | .b32 ctx_object ~0xffffffff | ||
82 | // mthd 0x0100, NOP | ||
83 | .b16 0x040 1 | ||
84 | .b32 0x00010000 + cmd_nop ~0xffffffff | ||
85 | // mthd 0x0140, PM_TRIGGER | ||
86 | .b16 0x050 1 | ||
87 | .b32 0x00010000 + cmd_pm_trigger ~0xffffffff | ||
88 | ifdef(`NVA3', ` | ||
89 | // mthd 0x0180-0x018c, DMA_ | ||
90 | .b16 0x060 ctx_dma_count | ||
91 | dispatch_dma: | ||
92 | .b32 0x00010000 + cmd_dma ~0xffffffff | ||
93 | .b32 0x00010000 + cmd_dma ~0xffffffff | ||
94 | .b32 0x00010000 + cmd_dma ~0xffffffff | ||
95 | ',) | ||
96 | // mthd 0x0200-0x0218, SRC_TILE | ||
97 | .b16 0x80 7 | ||
98 | .b32 ctx_src_tile_mode ~0x00000fff | ||
99 | .b32 ctx_src_xsize ~0x0007ffff | ||
100 | .b32 ctx_src_ysize ~0x00001fff | ||
101 | .b32 ctx_src_zsize ~0x000007ff | ||
102 | .b32 ctx_src_zoff ~0x00000fff | ||
103 | .b32 ctx_src_xoff ~0x0007ffff | ||
104 | .b32 ctx_src_yoff ~0x00001fff | ||
105 | // mthd 0x0220-0x0238, DST_TILE | ||
106 | .b16 0x88 7 | ||
107 | .b32 ctx_dst_tile_mode ~0x00000fff | ||
108 | .b32 ctx_dst_xsize ~0x0007ffff | ||
109 | .b32 ctx_dst_ysize ~0x00001fff | ||
110 | .b32 ctx_dst_zsize ~0x000007ff | ||
111 | .b32 ctx_dst_zoff ~0x00000fff | ||
112 | .b32 ctx_dst_xoff ~0x0007ffff | ||
113 | .b32 ctx_dst_yoff ~0x00001fff | ||
114 | // mthd 0x0300-0x0304, EXEC, WRCACHE_FLUSH | ||
115 | .b16 0xc0 2 | ||
116 | .b32 0x00010000 + cmd_exec ~0xffffffff | ||
117 | .b32 0x00010000 + cmd_wrcache_flush ~0xffffffff | ||
118 | // mthd 0x030c-0x0340, various stuff | ||
119 | .b16 0xc3 14 | ||
120 | .b32 ctx_src_address_high ~0x000000ff | ||
121 | .b32 ctx_src_address_low ~0xfffffff0 | ||
122 | .b32 ctx_dst_address_high ~0x000000ff | ||
123 | .b32 ctx_dst_address_low ~0xfffffff0 | ||
124 | .b32 ctx_src_pitch ~0x0007ffff | ||
125 | .b32 ctx_dst_pitch ~0x0007ffff | ||
126 | .b32 ctx_xcnt ~0x0000ffff | ||
127 | .b32 ctx_ycnt ~0x00001fff | ||
128 | .b32 ctx_format ~0x0333ffff | ||
129 | .b32 ctx_swz_const0 ~0xffffffff | ||
130 | .b32 ctx_swz_const1 ~0xffffffff | ||
131 | .b32 ctx_query_address_high ~0x000000ff | ||
132 | .b32 ctx_query_address_low ~0xffffffff | ||
133 | .b32 ctx_query_counter ~0xffffffff | ||
134 | .b16 0x800 0 | ||
135 | |||
136 | ifdef(`NVA3', | ||
137 | .section nva3_pcopy_code, | ||
138 | .section nvc0_pcopy_code | ||
139 | ) | ||
140 | |||
141 | main: | ||
142 | clear b32 $r0 | ||
143 | mov $sp $r0 | ||
144 | |||
145 | // setup i0 handler and route fifo and ctxswitch to it | ||
146 | mov $r1 ih | ||
147 | mov $iv0 $r1 | ||
148 | mov $r1 0x400 | ||
149 | movw $r2 0xfff3 | ||
150 | sethi $r2 0 | ||
151 | iowr I[$r2 + 0x300] $r2 | ||
152 | |||
153 | // enable interrupts | ||
154 | or $r2 0xc | ||
155 | iowr I[$r1] $r2 | ||
156 | bset $flags ie0 | ||
157 | |||
158 | // enable fifo access and context switching | ||
159 | mov $r1 0x1200 | ||
160 | mov $r2 3 | ||
161 | iowr I[$r1] $r2 | ||
162 | |||
163 | // sleep forever, waking for interrupts | ||
164 | bset $flags $p0 | ||
165 | spin: | ||
166 | sleep $p0 | ||
167 | bra spin | ||
168 | |||
169 | // i0 handler | ||
170 | ih: | ||
171 | iord $r1 I[$r0 + 0x200] | ||
172 | |||
173 | and $r2 $r1 0x00000008 | ||
174 | bra e ih_no_chsw | ||
175 | call chsw | ||
176 | ih_no_chsw: | ||
177 | and $r2 $r1 0x00000004 | ||
178 | bra e ih_no_cmd | ||
179 | call dispatch | ||
180 | |||
181 | ih_no_cmd: | ||
182 | and $r1 $r1 0x0000000c | ||
183 | iowr I[$r0 + 0x100] $r1 | ||
184 | iret | ||
185 | |||
186 | // $p1 direction (0 = unload, 1 = load) | ||
187 | // $r3 channel | ||
188 | swctx: | ||
189 | mov $r4 0x7700 | ||
190 | mov $xtargets $r4 | ||
191 | ifdef(`NVA3', ` | ||
192 | // target 7 hardcoded to ctx dma object | ||
193 | mov $xdbase $r0 | ||
194 | ', ` // NVC0 | ||
195 | // read SCRATCH3 to decide if we are PCOPY0 or PCOPY1 | ||
196 | mov $r4 0x2100 | ||
197 | iord $r4 I[$r4 + 0] | ||
198 | and $r4 1 | ||
199 | shl b32 $r4 4 | ||
200 | add b32 $r4 0x30 | ||
201 | |||
202 | // channel is in vram | ||
203 | mov $r15 0x61c | ||
204 | shl b32 $r15 6 | ||
205 | mov $r5 0x114 | ||
206 | iowrs I[$r15] $r5 | ||
207 | |||
208 | // read 16-byte PCOPYn info, containing context pointer, from channel | ||
209 | shl b32 $r5 $r3 4 | ||
210 | add b32 $r5 2 | ||
211 | mov $xdbase $r5 | ||
212 | mov $r5 $sp | ||
213 | // get a chunk of stack space, aligned to 256 byte boundary | ||
214 | sub b32 $r5 0x100 | ||
215 | mov $r6 0xff | ||
216 | not b32 $r6 | ||
217 | and $r5 $r6 | ||
218 | sethi $r5 0x00020000 | ||
219 | xdld $r4 $r5 | ||
220 | xdwait | ||
221 | sethi $r5 0 | ||
222 | |||
223 | // set context pointer, from within channel VM | ||
224 | mov $r14 0 | ||
225 | iowrs I[$r15] $r14 | ||
226 | ld b32 $r4 D[$r5 + 0] | ||
227 | shr b32 $r4 8 | ||
228 | ld b32 $r6 D[$r5 + 4] | ||
229 | shl b32 $r6 24 | ||
230 | or $r4 $r6 | ||
231 | mov $xdbase $r4 | ||
232 | ') | ||
233 | // 256-byte context, at start of data segment | ||
234 | mov b32 $r4 $r0 | ||
235 | sethi $r4 0x60000 | ||
236 | |||
237 | // swap! | ||
238 | bra $p1 swctx_load | ||
239 | xdst $r0 $r4 | ||
240 | bra swctx_done | ||
241 | swctx_load: | ||
242 | xdld $r0 $r4 | ||
243 | swctx_done: | ||
244 | xdwait | ||
245 | ret | ||
246 | |||
247 | chsw: | ||
248 | // read current channel | ||
249 | mov $r2 0x1400 | ||
250 | iord $r3 I[$r2] | ||
251 | |||
252 | // if it's active, unload it and return | ||
253 | xbit $r15 $r3 0x1e | ||
254 | bra e chsw_no_unload | ||
255 | bclr $flags $p1 | ||
256 | call swctx | ||
257 | bclr $r3 0x1e | ||
258 | iowr I[$r2] $r3 | ||
259 | mov $r4 1 | ||
260 | iowr I[$r2 + 0x200] $r4 | ||
261 | ret | ||
262 | |||
263 | // read next channel | ||
264 | chsw_no_unload: | ||
265 | iord $r3 I[$r2 + 0x100] | ||
266 | |||
267 | // is there a channel waiting to be loaded? | ||
268 | xbit $r13 $r3 0x1e | ||
269 | bra e chsw_finish_load | ||
270 | bset $flags $p1 | ||
271 | call swctx | ||
272 | ifdef(`NVA3', | ||
273 | // load dma objects back into TARGET regs | ||
274 | mov $r5 ctx_dma | ||
275 | mov $r6 ctx_dma_count | ||
276 | chsw_load_ctx_dma: | ||
277 | ld b32 $r7 D[$r5 + $r6 * 4] | ||
278 | add b32 $r8 $r6 0x180 | ||
279 | shl b32 $r8 8 | ||
280 | iowr I[$r8] $r7 | ||
281 | sub b32 $r6 1 | ||
282 | bra nc chsw_load_ctx_dma | ||
283 | ,) | ||
284 | |||
285 | chsw_finish_load: | ||
286 | mov $r3 2 | ||
287 | iowr I[$r2 + 0x200] $r3 | ||
288 | ret | ||
289 | |||
290 | dispatch: | ||
291 | // read incoming fifo command | ||
292 | mov $r3 0x1900 | ||
293 | iord $r2 I[$r3 + 0x100] | ||
294 | iord $r3 I[$r3 + 0x000] | ||
295 | and $r4 $r2 0x7ff | ||
296 | // $r2 will be used to store exception data | ||
297 | shl b32 $r2 0x10 | ||
298 | |||
299 | // lookup method in the dispatch table, ILLEGAL_MTHD if not found | ||
300 | mov $r5 dispatch_table | ||
301 | clear b32 $r6 | ||
302 | clear b32 $r7 | ||
303 | dispatch_loop: | ||
304 | ld b16 $r6 D[$r5 + 0] | ||
305 | ld b16 $r7 D[$r5 + 2] | ||
306 | add b32 $r5 4 | ||
307 | cmpu b32 $r4 $r6 | ||
308 | bra c dispatch_illegal_mthd | ||
309 | add b32 $r7 $r6 | ||
310 | cmpu b32 $r4 $r7 | ||
311 | bra c dispatch_valid_mthd | ||
312 | sub b32 $r7 $r6 | ||
313 | shl b32 $r7 3 | ||
314 | add b32 $r5 $r7 | ||
315 | bra dispatch_loop | ||
316 | |||
317 | // ensure no bits set in reserved fields, INVALID_BITFIELD | ||
318 | dispatch_valid_mthd: | ||
319 | sub b32 $r4 $r6 | ||
320 | shl b32 $r4 3 | ||
321 | add b32 $r4 $r5 | ||
322 | ld b32 $r5 D[$r4 + 4] | ||
323 | and $r5 $r3 | ||
324 | cmpu b32 $r5 0 | ||
325 | bra ne dispatch_invalid_bitfield | ||
326 | |||
327 | // depending on dispatch flags: execute method, or save data as state | ||
328 | ld b16 $r5 D[$r4 + 0] | ||
329 | ld b16 $r6 D[$r4 + 2] | ||
330 | cmpu b32 $r6 0 | ||
331 | bra ne dispatch_cmd | ||
332 | st b32 D[$r5] $r3 | ||
333 | bra dispatch_done | ||
334 | dispatch_cmd: | ||
335 | bclr $flags $p1 | ||
336 | call $r5 | ||
337 | bra $p1 dispatch_error | ||
338 | bra dispatch_done | ||
339 | |||
340 | dispatch_invalid_bitfield: | ||
341 | or $r2 2 | ||
342 | dispatch_illegal_mthd: | ||
343 | or $r2 1 | ||
344 | |||
345 | // store exception data in SCRATCH0/SCRATCH1, signal hostirq | ||
346 | dispatch_error: | ||
347 | mov $r4 0x1000 | ||
348 | iowr I[$r4 + 0x000] $r2 | ||
349 | iowr I[$r4 + 0x100] $r3 | ||
350 | mov $r2 0x40 | ||
351 | iowr I[$r0] $r2 | ||
352 | hostirq_wait: | ||
353 | iord $r2 I[$r0 + 0x200] | ||
354 | and $r2 0x40 | ||
355 | cmpu b32 $r2 0 | ||
356 | bra ne hostirq_wait | ||
357 | |||
358 | dispatch_done: | ||
359 | mov $r2 0x1d00 | ||
360 | mov $r3 1 | ||
361 | iowr I[$r2] $r3 | ||
362 | ret | ||
363 | |||
364 | // No-operation | ||
365 | // | ||
366 | // Inputs: | ||
367 | // $r1: irqh state | ||
368 | // $r2: hostirq state | ||
369 | // $r3: data | ||
370 | // $r4: dispatch table entry | ||
371 | // Outputs: | ||
372 | // $r1: irqh state | ||
373 | // $p1: set on error | ||
374 | // $r2: hostirq state | ||
375 | // $r3: data | ||
376 | cmd_nop: | ||
377 | ret | ||
378 | |||
379 | // PM_TRIGGER | ||
380 | // | ||
381 | // Inputs: | ||
382 | // $r1: irqh state | ||
383 | // $r2: hostirq state | ||
384 | // $r3: data | ||
385 | // $r4: dispatch table entry | ||
386 | // Outputs: | ||
387 | // $r1: irqh state | ||
388 | // $p1: set on error | ||
389 | // $r2: hostirq state | ||
390 | // $r3: data | ||
391 | cmd_pm_trigger: | ||
392 | mov $r2 0x2200 | ||
393 | clear b32 $r3 | ||
394 | sethi $r3 0x20000 | ||
395 | iowr I[$r2] $r3 | ||
396 | ret | ||
397 | |||
398 | ifdef(`NVA3', | ||
399 | // SET_DMA_* method handler | ||
400 | // | ||
401 | // Inputs: | ||
402 | // $r1: irqh state | ||
403 | // $r2: hostirq state | ||
404 | // $r3: data | ||
405 | // $r4: dispatch table entry | ||
406 | // Outputs: | ||
407 | // $r1: irqh state | ||
408 | // $p1: set on error | ||
409 | // $r2: hostirq state | ||
410 | // $r3: data | ||
411 | cmd_dma: | ||
412 | sub b32 $r4 dispatch_dma | ||
413 | shr b32 $r4 1 | ||
414 | bset $r3 0x1e | ||
415 | st b32 D[$r4 + ctx_dma] $r3 | ||
416 | add b32 $r4 0x600 | ||
417 | shl b32 $r4 6 | ||
418 | iowr I[$r4] $r3 | ||
419 | ret | ||
420 | ,) | ||
421 | |||
422 | // Calculates the hw swizzle mask and adjusts the surface's xcnt to match | ||
423 | // | ||
424 | cmd_exec_set_format: | ||
425 | // zero out a chunk of the stack to store the swizzle into | ||
426 | add $sp -0x10 | ||
427 | st b32 D[$sp + 0x00] $r0 | ||
428 | st b32 D[$sp + 0x04] $r0 | ||
429 | st b32 D[$sp + 0x08] $r0 | ||
430 | st b32 D[$sp + 0x0c] $r0 | ||
431 | |||
432 | // extract cpp, src_ncomp and dst_ncomp from FORMAT | ||
433 | ld b32 $r4 D[$r0 + ctx_format] | ||
434 | extr $r5 $r4 16:17 | ||
435 | add b32 $r5 1 | ||
436 | extr $r6 $r4 20:21 | ||
437 | add b32 $r6 1 | ||
438 | extr $r7 $r4 24:25 | ||
439 | add b32 $r7 1 | ||
440 | |||
441 | // convert FORMAT swizzle mask to hw swizzle mask | ||
442 | bclr $flags $p2 | ||
443 | clear b32 $r8 | ||
444 | clear b32 $r9 | ||
445 | ncomp_loop: | ||
446 | and $r10 $r4 0xf | ||
447 | shr b32 $r4 4 | ||
448 | clear b32 $r11 | ||
449 | bpc_loop: | ||
450 | cmpu b8 $r10 4 | ||
451 | bra nc cmp_c0 | ||
452 | mulu $r12 $r10 $r5 | ||
453 | add b32 $r12 $r11 | ||
454 | bset $flags $p2 | ||
455 | bra bpc_next | ||
456 | cmp_c0: | ||
457 | bra ne cmp_c1 | ||
458 | mov $r12 0x10 | ||
459 | add b32 $r12 $r11 | ||
460 | bra bpc_next | ||
461 | cmp_c1: | ||
462 | cmpu b8 $r10 6 | ||
463 | bra nc cmp_zero | ||
464 | mov $r12 0x14 | ||
465 | add b32 $r12 $r11 | ||
466 | bra bpc_next | ||
467 | cmp_zero: | ||
468 | mov $r12 0x80 | ||
469 | bpc_next: | ||
470 | st b8 D[$sp + $r8] $r12 | ||
471 | add b32 $r8 1 | ||
472 | add b32 $r11 1 | ||
473 | cmpu b32 $r11 $r5 | ||
474 | bra c bpc_loop | ||
475 | add b32 $r9 1 | ||
476 | cmpu b32 $r9 $r7 | ||
477 | bra c ncomp_loop | ||
478 | |||
479 | // SRC_XCNT = (xcnt * src_cpp), or 0 if no src ref in swz (hw will hang) | ||
480 | mulu $r6 $r5 | ||
481 | st b32 D[$r0 + ctx_src_cpp] $r6 | ||
482 | ld b32 $r8 D[$r0 + ctx_xcnt] | ||
483 | mulu $r6 $r8 | ||
484 | bra $p2 dst_xcnt | ||
485 | clear b32 $r6 | ||
486 | |||
487 | dst_xcnt: | ||
488 | mulu $r7 $r5 | ||
489 | st b32 D[$r0 + ctx_dst_cpp] $r7 | ||
490 | mulu $r7 $r8 | ||
491 | |||
492 | mov $r5 0x810 | ||
493 | shl b32 $r5 6 | ||
494 | iowr I[$r5 + 0x000] $r6 | ||
495 | iowr I[$r5 + 0x100] $r7 | ||
496 | add b32 $r5 0x800 | ||
497 | ld b32 $r6 D[$r0 + ctx_dst_cpp] | ||
498 | sub b32 $r6 1 | ||
499 | shl b32 $r6 8 | ||
500 | ld b32 $r7 D[$r0 + ctx_src_cpp] | ||
501 | sub b32 $r7 1 | ||
502 | or $r6 $r7 | ||
503 | iowr I[$r5 + 0x000] $r6 | ||
504 | add b32 $r5 0x100 | ||
505 | ld b32 $r6 D[$sp + 0x00] | ||
506 | iowr I[$r5 + 0x000] $r6 | ||
507 | ld b32 $r6 D[$sp + 0x04] | ||
508 | iowr I[$r5 + 0x100] $r6 | ||
509 | ld b32 $r6 D[$sp + 0x08] | ||
510 | iowr I[$r5 + 0x200] $r6 | ||
511 | ld b32 $r6 D[$sp + 0x0c] | ||
512 | iowr I[$r5 + 0x300] $r6 | ||
513 | add b32 $r5 0x400 | ||
514 | ld b32 $r6 D[$r0 + ctx_swz_const0] | ||
515 | iowr I[$r5 + 0x000] $r6 | ||
516 | ld b32 $r6 D[$r0 + ctx_swz_const1] | ||
517 | iowr I[$r5 + 0x100] $r6 | ||
518 | add $sp 0x10 | ||
519 | ret | ||
520 | |||
521 | // Setup to handle a tiled surface | ||
522 | // | ||
523 | // Calculates a number of parameters the hardware requires in order | ||
524 | // to correctly handle tiling. | ||
525 | // | ||
526 | // Offset calculation is performed as follows (Tp/Th/Td from TILE_MODE): | ||
527 | // nTx = round_up(w * cpp, 1 << Tp) >> Tp | ||
528 | // nTy = round_up(h, 1 << Th) >> Th | ||
529 | // Txo = (x * cpp) & ((1 << Tp) - 1) | ||
530 | // Tx = (x * cpp) >> Tp | ||
531 | // Tyo = y & ((1 << Th) - 1) | ||
532 | // Ty = y >> Th | ||
533 | // Tzo = z & ((1 << Td) - 1) | ||
534 | // Tz = z >> Td | ||
535 | // | ||
536 | // off = (Tzo << Tp << Th) + (Tyo << Tp) + Txo | ||
537 | // off += ((Tz * nTy * nTx)) + (Ty * nTx) + Tx) << Td << Th << Tp; | ||
538 | // | ||
539 | // Inputs: | ||
540 | // $r4: hw command (0x104800) | ||
541 | // $r5: ctx offset adjustment for src/dst selection | ||
542 | // $p2: set if dst surface | ||
543 | // | ||
544 | cmd_exec_set_surface_tiled: | ||
545 | // translate TILE_MODE into Tp, Th, Td shift values | ||
546 | ld b32 $r7 D[$r5 + ctx_src_tile_mode] | ||
547 | extr $r9 $r7 8:11 | ||
548 | extr $r8 $r7 4:7 | ||
549 | ifdef(`NVA3', | ||
550 | add b32 $r8 2 | ||
551 | , | ||
552 | add b32 $r8 3 | ||
553 | ) | ||
554 | extr $r7 $r7 0:3 | ||
555 | cmp b32 $r7 0xe | ||
556 | bra ne xtile64 | ||
557 | mov $r7 4 | ||
558 | bra xtileok | ||
559 | xtile64: | ||
560 | xbit $r7 $flags $p2 | ||
561 | add b32 $r7 17 | ||
562 | bset $r4 $r7 | ||
563 | mov $r7 6 | ||
564 | xtileok: | ||
565 | |||
566 | // Op = (x * cpp) & ((1 << Tp) - 1) | ||
567 | // Tx = (x * cpp) >> Tp | ||
568 | ld b32 $r10 D[$r5 + ctx_src_xoff] | ||
569 | ld b32 $r11 D[$r5 + ctx_src_cpp] | ||
570 | mulu $r10 $r11 | ||
571 | mov $r11 1 | ||
572 | shl b32 $r11 $r7 | ||
573 | sub b32 $r11 1 | ||
574 | and $r12 $r10 $r11 | ||
575 | shr b32 $r10 $r7 | ||
576 | |||
577 | // Tyo = y & ((1 << Th) - 1) | ||
578 | // Ty = y >> Th | ||
579 | ld b32 $r13 D[$r5 + ctx_src_yoff] | ||
580 | mov $r14 1 | ||
581 | shl b32 $r14 $r8 | ||
582 | sub b32 $r14 1 | ||
583 | and $r11 $r13 $r14 | ||
584 | shr b32 $r13 $r8 | ||
585 | |||
586 | // YTILE = ((1 << Th) << 12) | ((1 << Th) - Tyo) | ||
587 | add b32 $r14 1 | ||
588 | shl b32 $r15 $r14 12 | ||
589 | sub b32 $r14 $r11 | ||
590 | or $r15 $r14 | ||
591 | xbit $r6 $flags $p2 | ||
592 | add b32 $r6 0x208 | ||
593 | shl b32 $r6 8 | ||
594 | iowr I[$r6 + 0x000] $r15 | ||
595 | |||
596 | // Op += Tyo << Tp | ||
597 | shl b32 $r11 $r7 | ||
598 | add b32 $r12 $r11 | ||
599 | |||
600 | // nTx = ((w * cpp) + ((1 << Tp) - 1) >> Tp) | ||
601 | ld b32 $r15 D[$r5 + ctx_src_xsize] | ||
602 | ld b32 $r11 D[$r5 + ctx_src_cpp] | ||
603 | mulu $r15 $r11 | ||
604 | mov $r11 1 | ||
605 | shl b32 $r11 $r7 | ||
606 | sub b32 $r11 1 | ||
607 | add b32 $r15 $r11 | ||
608 | shr b32 $r15 $r7 | ||
609 | push $r15 | ||
610 | |||
611 | // nTy = (h + ((1 << Th) - 1)) >> Th | ||
612 | ld b32 $r15 D[$r5 + ctx_src_ysize] | ||
613 | mov $r11 1 | ||
614 | shl b32 $r11 $r8 | ||
615 | sub b32 $r11 1 | ||
616 | add b32 $r15 $r11 | ||
617 | shr b32 $r15 $r8 | ||
618 | push $r15 | ||
619 | |||
620 | // Tys = Tp + Th | ||
621 | // CFG_YZ_TILE_SIZE = ((1 << Th) >> 2) << Td | ||
622 | add b32 $r7 $r8 | ||
623 | sub b32 $r8 2 | ||
624 | mov $r11 1 | ||
625 | shl b32 $r11 $r8 | ||
626 | shl b32 $r11 $r9 | ||
627 | |||
628 | // Tzo = z & ((1 << Td) - 1) | ||
629 | // Tz = z >> Td | ||
630 | // Op += Tzo << Tys | ||
631 | // Ts = Tys + Td | ||
632 | ld b32 $r8 D[$r5 + ctx_src_zoff] | ||
633 | mov $r14 1 | ||
634 | shl b32 $r14 $r9 | ||
635 | sub b32 $r14 1 | ||
636 | and $r15 $r8 $r14 | ||
637 | shl b32 $r15 $r7 | ||
638 | add b32 $r12 $r15 | ||
639 | add b32 $r7 $r9 | ||
640 | shr b32 $r8 $r9 | ||
641 | |||
642 | // Ot = ((Tz * nTy * nTx) + (Ty * nTx) + Tx) << Ts | ||
643 | pop $r15 | ||
644 | pop $r9 | ||
645 | mulu $r13 $r9 | ||
646 | add b32 $r10 $r13 | ||
647 | mulu $r8 $r9 | ||
648 | mulu $r8 $r15 | ||
649 | add b32 $r10 $r8 | ||
650 | shl b32 $r10 $r7 | ||
651 | |||
652 | // PITCH = (nTx - 1) << Ts | ||
653 | sub b32 $r9 1 | ||
654 | shl b32 $r9 $r7 | ||
655 | iowr I[$r6 + 0x200] $r9 | ||
656 | |||
657 | // SRC_ADDRESS_LOW = (Ot + Op) & 0xffffffff | ||
658 | // CFG_ADDRESS_HIGH |= ((Ot + Op) >> 32) << 16 | ||
659 | ld b32 $r7 D[$r5 + ctx_src_address_low] | ||
660 | ld b32 $r8 D[$r5 + ctx_src_address_high] | ||
661 | add b32 $r10 $r12 | ||
662 | add b32 $r7 $r10 | ||
663 | adc b32 $r8 0 | ||
664 | shl b32 $r8 16 | ||
665 | or $r8 $r11 | ||
666 | sub b32 $r6 0x600 | ||
667 | iowr I[$r6 + 0x000] $r7 | ||
668 | add b32 $r6 0x400 | ||
669 | iowr I[$r6 + 0x000] $r8 | ||
670 | ret | ||
671 | |||
672 | // Setup to handle a linear surface | ||
673 | // | ||
674 | // Nothing to see here.. Sets ADDRESS and PITCH, pretty non-exciting | ||
675 | // | ||
676 | cmd_exec_set_surface_linear: | ||
677 | xbit $r6 $flags $p2 | ||
678 | add b32 $r6 0x202 | ||
679 | shl b32 $r6 8 | ||
680 | ld b32 $r7 D[$r5 + ctx_src_address_low] | ||
681 | iowr I[$r6 + 0x000] $r7 | ||
682 | add b32 $r6 0x400 | ||
683 | ld b32 $r7 D[$r5 + ctx_src_address_high] | ||
684 | shl b32 $r7 16 | ||
685 | iowr I[$r6 + 0x000] $r7 | ||
686 | add b32 $r6 0x400 | ||
687 | ld b32 $r7 D[$r5 + ctx_src_pitch] | ||
688 | iowr I[$r6 + 0x000] $r7 | ||
689 | ret | ||
690 | |||
691 | // wait for regs to be available for use | ||
692 | cmd_exec_wait: | ||
693 | push $r0 | ||
694 | push $r1 | ||
695 | mov $r0 0x800 | ||
696 | shl b32 $r0 6 | ||
697 | loop: | ||
698 | iord $r1 I[$r0] | ||
699 | and $r1 1 | ||
700 | bra ne loop | ||
701 | pop $r1 | ||
702 | pop $r0 | ||
703 | ret | ||
704 | |||
705 | cmd_exec_query: | ||
706 | // if QUERY_SHORT not set, write out { -, 0, TIME_LO, TIME_HI } | ||
707 | xbit $r4 $r3 13 | ||
708 | bra ne query_counter | ||
709 | call cmd_exec_wait | ||
710 | mov $r4 0x80c | ||
711 | shl b32 $r4 6 | ||
712 | ld b32 $r5 D[$r0 + ctx_query_address_low] | ||
713 | add b32 $r5 4 | ||
714 | iowr I[$r4 + 0x000] $r5 | ||
715 | iowr I[$r4 + 0x100] $r0 | ||
716 | mov $r5 0xc | ||
717 | iowr I[$r4 + 0x200] $r5 | ||
718 | add b32 $r4 0x400 | ||
719 | ld b32 $r5 D[$r0 + ctx_query_address_high] | ||
720 | shl b32 $r5 16 | ||
721 | iowr I[$r4 + 0x000] $r5 | ||
722 | add b32 $r4 0x500 | ||
723 | mov $r5 0x00000b00 | ||
724 | sethi $r5 0x00010000 | ||
725 | iowr I[$r4 + 0x000] $r5 | ||
726 | mov $r5 0x00004040 | ||
727 | shl b32 $r5 1 | ||
728 | sethi $r5 0x80800000 | ||
729 | iowr I[$r4 + 0x100] $r5 | ||
730 | mov $r5 0x00001110 | ||
731 | sethi $r5 0x13120000 | ||
732 | iowr I[$r4 + 0x200] $r5 | ||
733 | mov $r5 0x00001514 | ||
734 | sethi $r5 0x17160000 | ||
735 | iowr I[$r4 + 0x300] $r5 | ||
736 | mov $r5 0x00002601 | ||
737 | sethi $r5 0x00010000 | ||
738 | mov $r4 0x800 | ||
739 | shl b32 $r4 6 | ||
740 | iowr I[$r4 + 0x000] $r5 | ||
741 | |||
742 | // write COUNTER | ||
743 | query_counter: | ||
744 | call cmd_exec_wait | ||
745 | mov $r4 0x80c | ||
746 | shl b32 $r4 6 | ||
747 | ld b32 $r5 D[$r0 + ctx_query_address_low] | ||
748 | iowr I[$r4 + 0x000] $r5 | ||
749 | iowr I[$r4 + 0x100] $r0 | ||
750 | mov $r5 0x4 | ||
751 | iowr I[$r4 + 0x200] $r5 | ||
752 | add b32 $r4 0x400 | ||
753 | ld b32 $r5 D[$r0 + ctx_query_address_high] | ||
754 | shl b32 $r5 16 | ||
755 | iowr I[$r4 + 0x000] $r5 | ||
756 | add b32 $r4 0x500 | ||
757 | mov $r5 0x00000300 | ||
758 | iowr I[$r4 + 0x000] $r5 | ||
759 | mov $r5 0x00001110 | ||
760 | sethi $r5 0x13120000 | ||
761 | iowr I[$r4 + 0x100] $r5 | ||
762 | ld b32 $r5 D[$r0 + ctx_query_counter] | ||
763 | add b32 $r4 0x500 | ||
764 | iowr I[$r4 + 0x000] $r5 | ||
765 | mov $r5 0x00002601 | ||
766 | sethi $r5 0x00010000 | ||
767 | mov $r4 0x800 | ||
768 | shl b32 $r4 6 | ||
769 | iowr I[$r4 + 0x000] $r5 | ||
770 | ret | ||
771 | |||
772 | // Execute a copy operation | ||
773 | // | ||
774 | // Inputs: | ||
775 | // $r1: irqh state | ||
776 | // $r2: hostirq state | ||
777 | // $r3: data | ||
778 | // 000002000 QUERY_SHORT | ||
779 | // 000001000 QUERY | ||
780 | // 000000100 DST_LINEAR | ||
781 | // 000000010 SRC_LINEAR | ||
782 | // 000000001 FORMAT | ||
783 | // $r4: dispatch table entry | ||
784 | // Outputs: | ||
785 | // $r1: irqh state | ||
786 | // $p1: set on error | ||
787 | // $r2: hostirq state | ||
788 | // $r3: data | ||
789 | cmd_exec: | ||
790 | call cmd_exec_wait | ||
791 | |||
792 | // if format requested, call function to calculate it, otherwise | ||
793 | // fill in cpp/xcnt for both surfaces as if (cpp == 1) | ||
794 | xbit $r15 $r3 0 | ||
795 | bra e cmd_exec_no_format | ||
796 | call cmd_exec_set_format | ||
797 | mov $r4 0x200 | ||
798 | bra cmd_exec_init_src_surface | ||
799 | cmd_exec_no_format: | ||
800 | mov $r6 0x810 | ||
801 | shl b32 $r6 6 | ||
802 | mov $r7 1 | ||
803 | st b32 D[$r0 + ctx_src_cpp] $r7 | ||
804 | st b32 D[$r0 + ctx_dst_cpp] $r7 | ||
805 | ld b32 $r7 D[$r0 + ctx_xcnt] | ||
806 | iowr I[$r6 + 0x000] $r7 | ||
807 | iowr I[$r6 + 0x100] $r7 | ||
808 | clear b32 $r4 | ||
809 | |||
810 | cmd_exec_init_src_surface: | ||
811 | bclr $flags $p2 | ||
812 | clear b32 $r5 | ||
813 | xbit $r15 $r3 4 | ||
814 | bra e src_tiled | ||
815 | call cmd_exec_set_surface_linear | ||
816 | bra cmd_exec_init_dst_surface | ||
817 | src_tiled: | ||
818 | call cmd_exec_set_surface_tiled | ||
819 | bset $r4 7 | ||
820 | |||
821 | cmd_exec_init_dst_surface: | ||
822 | bset $flags $p2 | ||
823 | mov $r5 ctx_dst_address_high - ctx_src_address_high | ||
824 | xbit $r15 $r3 8 | ||
825 | bra e dst_tiled | ||
826 | call cmd_exec_set_surface_linear | ||
827 | bra cmd_exec_kick | ||
828 | dst_tiled: | ||
829 | call cmd_exec_set_surface_tiled | ||
830 | bset $r4 8 | ||
831 | |||
832 | cmd_exec_kick: | ||
833 | mov $r5 0x800 | ||
834 | shl b32 $r5 6 | ||
835 | ld b32 $r6 D[$r0 + ctx_ycnt] | ||
836 | iowr I[$r5 + 0x100] $r6 | ||
837 | mov $r6 0x0041 | ||
838 | // SRC_TARGET = 1, DST_TARGET = 2 | ||
839 | sethi $r6 0x44000000 | ||
840 | or $r4 $r6 | ||
841 | iowr I[$r5] $r4 | ||
842 | |||
843 | // if requested, queue up a QUERY write after the copy has completed | ||
844 | xbit $r15 $r3 12 | ||
845 | bra e cmd_exec_done | ||
846 | call cmd_exec_query | ||
847 | |||
848 | cmd_exec_done: | ||
849 | ret | ||
850 | |||
851 | // Flush write cache | ||
852 | // | ||
853 | // Inputs: | ||
854 | // $r1: irqh state | ||
855 | // $r2: hostirq state | ||
856 | // $r3: data | ||
857 | // $r4: dispatch table entry | ||
858 | // Outputs: | ||
859 | // $r1: irqh state | ||
860 | // $p1: set on error | ||
861 | // $r2: hostirq state | ||
862 | // $r3: data | ||
863 | cmd_wrcache_flush: | ||
864 | mov $r2 0x2200 | ||
865 | clear b32 $r3 | ||
866 | sethi $r3 0x10000 | ||
867 | iowr I[$r2] $r3 | ||
868 | ret | ||
869 | |||
870 | .align 0x100 | ||
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc.h b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h new file mode 100644 index 000000000000..2731de22ebe9 --- /dev/null +++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h | |||
@@ -0,0 +1,534 @@ | |||
1 | uint32_t nva3_pcopy_data[] = { | ||
2 | 0x00000000, | ||
3 | 0x00000000, | ||
4 | 0x00000000, | ||
5 | 0x00000000, | ||
6 | 0x00000000, | ||
7 | 0x00000000, | ||
8 | 0x00000000, | ||
9 | 0x00000000, | ||
10 | 0x00000000, | ||
11 | 0x00000000, | ||
12 | 0x00000000, | ||
13 | 0x00000000, | ||
14 | 0x00000000, | ||
15 | 0x00000000, | ||
16 | 0x00000000, | ||
17 | 0x00000000, | ||
18 | 0x00000000, | ||
19 | 0x00000000, | ||
20 | 0x00000000, | ||
21 | 0x00000000, | ||
22 | 0x00000000, | ||
23 | 0x00000000, | ||
24 | 0x00000000, | ||
25 | 0x00000000, | ||
26 | 0x00000000, | ||
27 | 0x00000000, | ||
28 | 0x00000000, | ||
29 | 0x00000000, | ||
30 | 0x00000000, | ||
31 | 0x00000000, | ||
32 | 0x00000000, | ||
33 | 0x00000000, | ||
34 | 0x00000000, | ||
35 | 0x00000000, | ||
36 | 0x00000000, | ||
37 | 0x00000000, | ||
38 | 0x00000000, | ||
39 | 0x00000000, | ||
40 | 0x00000000, | ||
41 | 0x00000000, | ||
42 | 0x00000000, | ||
43 | 0x00000000, | ||
44 | 0x00000000, | ||
45 | 0x00000000, | ||
46 | 0x00000000, | ||
47 | 0x00000000, | ||
48 | 0x00000000, | ||
49 | 0x00000000, | ||
50 | 0x00000000, | ||
51 | 0x00000000, | ||
52 | 0x00000000, | ||
53 | 0x00000000, | ||
54 | 0x00000000, | ||
55 | 0x00000000, | ||
56 | 0x00000000, | ||
57 | 0x00000000, | ||
58 | 0x00000000, | ||
59 | 0x00000000, | ||
60 | 0x00000000, | ||
61 | 0x00000000, | ||
62 | 0x00000000, | ||
63 | 0x00000000, | ||
64 | 0x00000000, | ||
65 | 0x00000000, | ||
66 | 0x00010000, | ||
67 | 0x00000000, | ||
68 | 0x00000000, | ||
69 | 0x00010040, | ||
70 | 0x00010160, | ||
71 | 0x00000000, | ||
72 | 0x00010050, | ||
73 | 0x00010162, | ||
74 | 0x00000000, | ||
75 | 0x00030060, | ||
76 | 0x00010170, | ||
77 | 0x00000000, | ||
78 | 0x00010170, | ||
79 | 0x00000000, | ||
80 | 0x00010170, | ||
81 | 0x00000000, | ||
82 | 0x00070080, | ||
83 | 0x00000028, | ||
84 | 0xfffff000, | ||
85 | 0x0000002c, | ||
86 | 0xfff80000, | ||
87 | 0x00000030, | ||
88 | 0xffffe000, | ||
89 | 0x00000034, | ||
90 | 0xfffff800, | ||
91 | 0x00000038, | ||
92 | 0xfffff000, | ||
93 | 0x0000003c, | ||
94 | 0xfff80000, | ||
95 | 0x00000040, | ||
96 | 0xffffe000, | ||
97 | 0x00070088, | ||
98 | 0x00000054, | ||
99 | 0xfffff000, | ||
100 | 0x00000058, | ||
101 | 0xfff80000, | ||
102 | 0x0000005c, | ||
103 | 0xffffe000, | ||
104 | 0x00000060, | ||
105 | 0xfffff800, | ||
106 | 0x00000064, | ||
107 | 0xfffff000, | ||
108 | 0x00000068, | ||
109 | 0xfff80000, | ||
110 | 0x0000006c, | ||
111 | 0xffffe000, | ||
112 | 0x000200c0, | ||
113 | 0x00010492, | ||
114 | 0x00000000, | ||
115 | 0x0001051b, | ||
116 | 0x00000000, | ||
117 | 0x000e00c3, | ||
118 | 0x0000001c, | ||
119 | 0xffffff00, | ||
120 | 0x00000020, | ||
121 | 0x0000000f, | ||
122 | 0x00000048, | ||
123 | 0xffffff00, | ||
124 | 0x0000004c, | ||
125 | 0x0000000f, | ||
126 | 0x00000024, | ||
127 | 0xfff80000, | ||
128 | 0x00000050, | ||
129 | 0xfff80000, | ||
130 | 0x00000080, | ||
131 | 0xffff0000, | ||
132 | 0x00000084, | ||
133 | 0xffffe000, | ||
134 | 0x00000074, | ||
135 | 0xfccc0000, | ||
136 | 0x00000078, | ||
137 | 0x00000000, | ||
138 | 0x0000007c, | ||
139 | 0x00000000, | ||
140 | 0x00000010, | ||
141 | 0xffffff00, | ||
142 | 0x00000014, | ||
143 | 0x00000000, | ||
144 | 0x00000018, | ||
145 | 0x00000000, | ||
146 | 0x00000800, | ||
147 | }; | ||
148 | |||
149 | uint32_t nva3_pcopy_code[] = { | ||
150 | 0x04fe04bd, | ||
151 | 0x3517f000, | ||
152 | 0xf10010fe, | ||
153 | 0xf1040017, | ||
154 | 0xf0fff327, | ||
155 | 0x22d00023, | ||
156 | 0x0c25f0c0, | ||
157 | 0xf40012d0, | ||
158 | 0x17f11031, | ||
159 | 0x27f01200, | ||
160 | 0x0012d003, | ||
161 | 0xf40031f4, | ||
162 | 0x0ef40028, | ||
163 | 0x8001cffd, | ||
164 | 0xf40812c4, | ||
165 | 0x21f4060b, | ||
166 | 0x0412c472, | ||
167 | 0xf4060bf4, | ||
168 | 0x11c4c321, | ||
169 | 0x4001d00c, | ||
170 | 0x47f101f8, | ||
171 | 0x4bfe7700, | ||
172 | 0x0007fe00, | ||
173 | 0xf00204b9, | ||
174 | 0x01f40643, | ||
175 | 0x0604fa09, | ||
176 | 0xfa060ef4, | ||
177 | 0x03f80504, | ||
178 | 0x27f100f8, | ||
179 | 0x23cf1400, | ||
180 | 0x1e3fc800, | ||
181 | 0xf4170bf4, | ||
182 | 0x21f40132, | ||
183 | 0x1e3af052, | ||
184 | 0xf00023d0, | ||
185 | 0x24d00147, | ||
186 | 0xcf00f880, | ||
187 | 0x3dc84023, | ||
188 | 0x220bf41e, | ||
189 | 0xf40131f4, | ||
190 | 0x57f05221, | ||
191 | 0x0367f004, | ||
192 | 0xa07856bc, | ||
193 | 0xb6018068, | ||
194 | 0x87d00884, | ||
195 | 0x0162b600, | ||
196 | 0xf0f018f4, | ||
197 | 0x23d00237, | ||
198 | 0xf100f880, | ||
199 | 0xcf190037, | ||
200 | 0x33cf4032, | ||
201 | 0xff24e400, | ||
202 | 0x1024b607, | ||
203 | 0x010057f1, | ||
204 | 0x74bd64bd, | ||
205 | 0x58005658, | ||
206 | 0x50b60157, | ||
207 | 0x0446b804, | ||
208 | 0xbb4d08f4, | ||
209 | 0x47b80076, | ||
210 | 0x0f08f404, | ||
211 | 0xb60276bb, | ||
212 | 0x57bb0374, | ||
213 | 0xdf0ef400, | ||
214 | 0xb60246bb, | ||
215 | 0x45bb0344, | ||
216 | 0x01459800, | ||
217 | 0xb00453fd, | ||
218 | 0x1bf40054, | ||
219 | 0x00455820, | ||
220 | 0xb0014658, | ||
221 | 0x1bf40064, | ||
222 | 0x00538009, | ||
223 | 0xf4300ef4, | ||
224 | 0x55f90132, | ||
225 | 0xf40c01f4, | ||
226 | 0x25f0250e, | ||
227 | 0x0125f002, | ||
228 | 0x100047f1, | ||
229 | 0xd00042d0, | ||
230 | 0x27f04043, | ||
231 | 0x0002d040, | ||
232 | 0xf08002cf, | ||
233 | 0x24b04024, | ||
234 | 0xf71bf400, | ||
235 | 0x1d0027f1, | ||
236 | 0xd00137f0, | ||
237 | 0x00f80023, | ||
238 | 0x27f100f8, | ||
239 | 0x34bd2200, | ||
240 | 0xd00233f0, | ||
241 | 0x00f80023, | ||
242 | 0x012842b7, | ||
243 | 0xf00145b6, | ||
244 | 0x43801e39, | ||
245 | 0x0040b701, | ||
246 | 0x0644b606, | ||
247 | 0xf80043d0, | ||
248 | 0xf030f400, | ||
249 | 0xb00001b0, | ||
250 | 0x01b00101, | ||
251 | 0x0301b002, | ||
252 | 0xc71d0498, | ||
253 | 0x50b63045, | ||
254 | 0x3446c701, | ||
255 | 0xc70160b6, | ||
256 | 0x70b63847, | ||
257 | 0x0232f401, | ||
258 | 0x94bd84bd, | ||
259 | 0xb60f4ac4, | ||
260 | 0xb4bd0445, | ||
261 | 0xf404a430, | ||
262 | 0xa5ff0f18, | ||
263 | 0x00cbbbc0, | ||
264 | 0xf40231f4, | ||
265 | 0x1bf4220e, | ||
266 | 0x10c7f00c, | ||
267 | 0xf400cbbb, | ||
268 | 0xa430160e, | ||
269 | 0x0c18f406, | ||
270 | 0xbb14c7f0, | ||
271 | 0x0ef400cb, | ||
272 | 0x80c7f107, | ||
273 | 0x01c83800, | ||
274 | 0xb60180b6, | ||
275 | 0xb5b801b0, | ||
276 | 0xc308f404, | ||
277 | 0xb80190b6, | ||
278 | 0x08f40497, | ||
279 | 0x0065fdb2, | ||
280 | 0x98110680, | ||
281 | 0x68fd2008, | ||
282 | 0x0502f400, | ||
283 | 0x75fd64bd, | ||
284 | 0x1c078000, | ||
285 | 0xf10078fd, | ||
286 | 0xb6081057, | ||
287 | 0x56d00654, | ||
288 | 0x4057d000, | ||
289 | 0x080050b7, | ||
290 | 0xb61c0698, | ||
291 | 0x64b60162, | ||
292 | 0x11079808, | ||
293 | 0xfd0172b6, | ||
294 | 0x56d00567, | ||
295 | 0x0050b700, | ||
296 | 0x0060b401, | ||
297 | 0xb40056d0, | ||
298 | 0x56d00160, | ||
299 | 0x0260b440, | ||
300 | 0xb48056d0, | ||
301 | 0x56d00360, | ||
302 | 0x0050b7c0, | ||
303 | 0x1e069804, | ||
304 | 0x980056d0, | ||
305 | 0x56d01f06, | ||
306 | 0x1030f440, | ||
307 | 0x579800f8, | ||
308 | 0x6879c70a, | ||
309 | 0xb66478c7, | ||
310 | 0x77c70280, | ||
311 | 0x0e76b060, | ||
312 | 0xf0091bf4, | ||
313 | 0x0ef40477, | ||
314 | 0x027cf00f, | ||
315 | 0xfd1170b6, | ||
316 | 0x77f00947, | ||
317 | 0x0f5a9806, | ||
318 | 0xfd115b98, | ||
319 | 0xb7f000ab, | ||
320 | 0x04b7bb01, | ||
321 | 0xff01b2b6, | ||
322 | 0xa7bbc4ab, | ||
323 | 0x105d9805, | ||
324 | 0xbb01e7f0, | ||
325 | 0xe2b604e8, | ||
326 | 0xb4deff01, | ||
327 | 0xb605d8bb, | ||
328 | 0xef9401e0, | ||
329 | 0x02ebbb0c, | ||
330 | 0xf005fefd, | ||
331 | 0x60b7026c, | ||
332 | 0x64b60208, | ||
333 | 0x006fd008, | ||
334 | 0xbb04b7bb, | ||
335 | 0x5f9800cb, | ||
336 | 0x115b980b, | ||
337 | 0xf000fbfd, | ||
338 | 0xb7bb01b7, | ||
339 | 0x01b2b604, | ||
340 | 0xbb00fbbb, | ||
341 | 0xf0f905f7, | ||
342 | 0xf00c5f98, | ||
343 | 0xb8bb01b7, | ||
344 | 0x01b2b604, | ||
345 | 0xbb00fbbb, | ||
346 | 0xf0f905f8, | ||
347 | 0xb60078bb, | ||
348 | 0xb7f00282, | ||
349 | 0x04b8bb01, | ||
350 | 0x9804b9bb, | ||
351 | 0xe7f00e58, | ||
352 | 0x04e9bb01, | ||
353 | 0xff01e2b6, | ||
354 | 0xf7bbf48e, | ||
355 | 0x00cfbb04, | ||
356 | 0xbb0079bb, | ||
357 | 0xf0fc0589, | ||
358 | 0xd9fd90fc, | ||
359 | 0x00adbb00, | ||
360 | 0xfd0089fd, | ||
361 | 0xa8bb008f, | ||
362 | 0x04a7bb00, | ||
363 | 0xbb0192b6, | ||
364 | 0x69d00497, | ||
365 | 0x08579880, | ||
366 | 0xbb075898, | ||
367 | 0x7abb00ac, | ||
368 | 0x0081b600, | ||
369 | 0xfd1084b6, | ||
370 | 0x62b7058b, | ||
371 | 0x67d00600, | ||
372 | 0x0060b700, | ||
373 | 0x0068d004, | ||
374 | 0x6cf000f8, | ||
375 | 0x0260b702, | ||
376 | 0x0864b602, | ||
377 | 0xd0085798, | ||
378 | 0x60b70067, | ||
379 | 0x57980400, | ||
380 | 0x1074b607, | ||
381 | 0xb70067d0, | ||
382 | 0x98040060, | ||
383 | 0x67d00957, | ||
384 | 0xf900f800, | ||
385 | 0xf110f900, | ||
386 | 0xb6080007, | ||
387 | 0x01cf0604, | ||
388 | 0x0114f000, | ||
389 | 0xfcfa1bf4, | ||
390 | 0xf800fc10, | ||
391 | 0x0d34c800, | ||
392 | 0xf5701bf4, | ||
393 | 0xf103ab21, | ||
394 | 0xb6080c47, | ||
395 | 0x05980644, | ||
396 | 0x0450b605, | ||
397 | 0xd00045d0, | ||
398 | 0x57f04040, | ||
399 | 0x8045d00c, | ||
400 | 0x040040b7, | ||
401 | 0xb6040598, | ||
402 | 0x45d01054, | ||
403 | 0x0040b700, | ||
404 | 0x0057f105, | ||
405 | 0x0153f00b, | ||
406 | 0xf10045d0, | ||
407 | 0xb6404057, | ||
408 | 0x53f10154, | ||
409 | 0x45d08080, | ||
410 | 0x1057f140, | ||
411 | 0x1253f111, | ||
412 | 0x8045d013, | ||
413 | 0x151457f1, | ||
414 | 0x171653f1, | ||
415 | 0xf1c045d0, | ||
416 | 0xf0260157, | ||
417 | 0x47f10153, | ||
418 | 0x44b60800, | ||
419 | 0x0045d006, | ||
420 | 0x03ab21f5, | ||
421 | 0x080c47f1, | ||
422 | 0x980644b6, | ||
423 | 0x45d00505, | ||
424 | 0x4040d000, | ||
425 | 0xd00457f0, | ||
426 | 0x40b78045, | ||
427 | 0x05980400, | ||
428 | 0x1054b604, | ||
429 | 0xb70045d0, | ||
430 | 0xf1050040, | ||
431 | 0xd0030057, | ||
432 | 0x57f10045, | ||
433 | 0x53f11110, | ||
434 | 0x45d01312, | ||
435 | 0x06059840, | ||
436 | 0x050040b7, | ||
437 | 0xf10045d0, | ||
438 | 0xf0260157, | ||
439 | 0x47f10153, | ||
440 | 0x44b60800, | ||
441 | 0x0045d006, | ||
442 | 0x21f500f8, | ||
443 | 0x3fc803ab, | ||
444 | 0x0e0bf400, | ||
445 | 0x018921f5, | ||
446 | 0x020047f1, | ||
447 | 0xf11e0ef4, | ||
448 | 0xb6081067, | ||
449 | 0x77f00664, | ||
450 | 0x11078001, | ||
451 | 0x981c0780, | ||
452 | 0x67d02007, | ||
453 | 0x4067d000, | ||
454 | 0x32f444bd, | ||
455 | 0xc854bd02, | ||
456 | 0x0bf4043f, | ||
457 | 0x8221f50a, | ||
458 | 0x0a0ef403, | ||
459 | 0x027621f5, | ||
460 | 0xf40749f0, | ||
461 | 0x57f00231, | ||
462 | 0x083fc82c, | ||
463 | 0xf50a0bf4, | ||
464 | 0xf4038221, | ||
465 | 0x21f50a0e, | ||
466 | 0x49f00276, | ||
467 | 0x0057f108, | ||
468 | 0x0654b608, | ||
469 | 0xd0210698, | ||
470 | 0x67f04056, | ||
471 | 0x0063f141, | ||
472 | 0x0546fd44, | ||
473 | 0xc80054d0, | ||
474 | 0x0bf40c3f, | ||
475 | 0xc521f507, | ||
476 | 0xf100f803, | ||
477 | 0xbd220027, | ||
478 | 0x0133f034, | ||
479 | 0xf80023d0, | ||
480 | 0x00000000, | ||
481 | 0x00000000, | ||
482 | 0x00000000, | ||
483 | 0x00000000, | ||
484 | 0x00000000, | ||
485 | 0x00000000, | ||
486 | 0x00000000, | ||
487 | 0x00000000, | ||
488 | 0x00000000, | ||
489 | 0x00000000, | ||
490 | 0x00000000, | ||
491 | 0x00000000, | ||
492 | 0x00000000, | ||
493 | 0x00000000, | ||
494 | 0x00000000, | ||
495 | 0x00000000, | ||
496 | 0x00000000, | ||
497 | 0x00000000, | ||
498 | 0x00000000, | ||
499 | 0x00000000, | ||
500 | 0x00000000, | ||
501 | 0x00000000, | ||
502 | 0x00000000, | ||
503 | 0x00000000, | ||
504 | 0x00000000, | ||
505 | 0x00000000, | ||
506 | 0x00000000, | ||
507 | 0x00000000, | ||
508 | 0x00000000, | ||
509 | 0x00000000, | ||
510 | 0x00000000, | ||
511 | 0x00000000, | ||
512 | 0x00000000, | ||
513 | 0x00000000, | ||
514 | 0x00000000, | ||
515 | 0x00000000, | ||
516 | 0x00000000, | ||
517 | 0x00000000, | ||
518 | 0x00000000, | ||
519 | 0x00000000, | ||
520 | 0x00000000, | ||
521 | 0x00000000, | ||
522 | 0x00000000, | ||
523 | 0x00000000, | ||
524 | 0x00000000, | ||
525 | 0x00000000, | ||
526 | 0x00000000, | ||
527 | 0x00000000, | ||
528 | 0x00000000, | ||
529 | 0x00000000, | ||
530 | 0x00000000, | ||
531 | 0x00000000, | ||
532 | 0x00000000, | ||
533 | 0x00000000, | ||
534 | }; | ||