OSDN Git Service

intel: Drop the code for counting parsing failures.
[android-x86/external-libdrm.git] / intel / intel_decode.c
1 /*
2  * Copyright © 2009-2011 Intel Corporation
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 (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23
24 #include <stdint.h>
25 #include <stdlib.h>
26 #include <stdio.h>
27 #include <stdbool.h>
28 #include <stdarg.h>
29 #include <string.h>
30
31 #include "intel_chipset.h"
32 #include "intel_bufmgr.h"
33
34 /* Struct for tracking drm_intel_decode state. */
35 struct drm_intel_decode {
36         /** stdio file where the output should land.  Defaults to stdout. */
37         FILE *out;
38
39         /** PCI device ID. */
40         uint32_t devid;
41
42         /** GPU address of the start of the current packet. */
43         uint32_t hw_offset;
44         /** CPU virtual address of the start of the current packet. */
45         uint32_t *data;
46         /** DWORDs of remaining batchbuffer data starting from the packet. */
47         uint32_t count;
48
49         /** GPU address of the start of the batchbuffer data. */
50         uint32_t base_hw_offset;
51         /** CPU Virtual address of the start of the batchbuffer data. */
52         uint32_t *base_data;
53         /** Number of DWORDs of batchbuffer data. */
54         uint32_t base_count;
55
56         /** @{
57          * GPU head and tail pointers, which will be noted in the dump, or ~0.
58          */
59         uint32_t head, tail;
60         /** @} */
61
62         /**
63          * Whether to dump the dwords after MI_BATCHBUFFER_END.
64          *
65          * This sometimes provides clues in corrupted batchbuffers,
66          * and is used by the intel-gpu-tools.
67          */
68         bool dump_past_end;
69 };
70
71 static FILE *out;
72 static uint32_t saved_s2 = 0, saved_s4 = 0;
73 static char saved_s2_set = 0, saved_s4_set = 0;
74 static uint32_t head_offset = 0xffffffff;       /* undefined */
75 static uint32_t tail_offset = 0xffffffff;       /* undefined */
76
77 #ifndef ARRAY_SIZE
78 #define ARRAY_SIZE(A) (sizeof(A)/sizeof(A[0]))
79 #endif
80
81 #define BUFFER_FAIL(_count, _len, _name) do {                   \
82     fprintf(out, "Buffer size too small in %s (%d < %d)\n",     \
83             (_name), (_count), (_len));                         \
84     return count;                                               \
85 } while (0)
86
87 static float int_as_float(uint32_t intval)
88 {
89         union intfloat {
90                 uint32_t i;
91                 float f;
92         } uval;
93
94         uval.i = intval;
95         return uval.f;
96 }
97
98 static void
99 instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
100           const char *fmt, ...) __attribute__((format(__printf__, 4, 5)));
101
102 static void
103 instr_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
104           const char *fmt, ...)
105 {
106         va_list va;
107         const char *parseinfo;
108         uint32_t offset = hw_offset + index * 4;
109
110         if (offset == head_offset)
111                 parseinfo = "HEAD";
112         else if (offset == tail_offset)
113                 parseinfo = "TAIL";
114         else
115                 parseinfo = "    ";
116
117         fprintf(out, "0x%08x: %s 0x%08x: %s", offset, parseinfo,
118                 data[index], index == 0 ? "" : "   ");
119         va_start(va, fmt);
120         vfprintf(out, fmt, va);
121         va_end(va);
122 }
123
124 static int
125 decode_mi(uint32_t *data, uint32_t count, uint32_t hw_offset)
126 {
127         unsigned int opcode, len = -1;
128         const char *post_sync_op = "";
129
130         struct {
131                 uint32_t opcode;
132                 int len_mask;
133                 unsigned int min_len;
134                 unsigned int max_len;
135                 const char *name;
136         } opcodes_mi[] = {
137                 { 0x08, 0, 1, 1, "MI_ARB_ON_OFF" },
138                 { 0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END" },
139                 { 0x30, 0x3f, 3, 3, "MI_BATCH_BUFFER" },
140                 { 0x31, 0x3f, 2, 2, "MI_BATCH_BUFFER_START" },
141                 { 0x14, 0x3f, 3, 3, "MI_DISPLAY_BUFFER_INFO" },
142                 { 0x04, 0, 1, 1, "MI_FLUSH" },
143                 { 0x22, 0x1f, 3, 3, "MI_LOAD_REGISTER_IMM" },
144                 { 0x13, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_EXCL" },
145                 { 0x12, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_INCL" },
146                 { 0x00, 0, 1, 1, "MI_NOOP" },
147                 { 0x11, 0x3f, 2, 2, "MI_OVERLAY_FLIP" },
148                 { 0x07, 0, 1, 1, "MI_REPORT_HEAD" },
149                 { 0x18, 0x3f, 2, 2, "MI_SET_CONTEXT" },
150                 { 0x20, 0x3f, 3, 4, "MI_STORE_DATA_IMM" },
151                 { 0x21, 0x3f, 3, 4, "MI_STORE_DATA_INDEX" },
152                 { 0x24, 0x3f, 3, 3, "MI_STORE_REGISTER_MEM" },
153                 { 0x02, 0, 1, 1, "MI_USER_INTERRUPT" },
154                 { 0x03, 0, 1, 1, "MI_WAIT_FOR_EVENT" },
155                 { 0x16, 0x7f, 3, 3, "MI_SEMAPHORE_MBOX" },
156                 { 0x26, 0x1f, 3, 4, "MI_FLUSH_DW" },
157                 { 0x0b, 0, 1, 1, "MI_SUSPEND_FLUSH"},
158         };
159
160         /* check instruction length */
161         for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
162              opcode++) {
163                 if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
164                         len = 1;
165                         if (opcodes_mi[opcode].max_len > 1) {
166                                 len =
167                                     (data[0] & opcodes_mi[opcode].len_mask) + 2;
168                                 if (len < opcodes_mi[opcode].min_len
169                                     || len > opcodes_mi[opcode].max_len) {
170                                         fprintf(out,
171                                                 "Bad length (%d) in %s, [%d, %d]\n",
172                                                 len, opcodes_mi[opcode].name,
173                                                 opcodes_mi[opcode].min_len,
174                                                 opcodes_mi[opcode].max_len);
175                                 }
176                         }
177                         break;
178                 }
179         }
180
181         switch ((data[0] & 0x1f800000) >> 23) {
182         case 0x0a:
183                 instr_out(data, hw_offset, 0, "MI_BATCH_BUFFER_END\n");
184                 return -1;
185         case 0x16:
186                 instr_out(data, hw_offset, 0, "MI_SEMAPHORE_MBOX%s%s%s%s %u\n",
187                           data[0] & (1 << 22) ? " global gtt," : "",
188                           data[0] & (1 << 21) ? " update semaphore," : "",
189                           data[0] & (1 << 20) ? " compare semaphore," : "",
190                           data[0] & (1 << 18) ? " use compare reg" : "",
191                           (data[0] & (0x3 << 16)) >> 16);
192                 instr_out(data, hw_offset, 1, "value\n");
193                 instr_out(data, hw_offset, 2, "address\n");
194                 return len;
195         case 0x21:
196                 instr_out(data, hw_offset, 0, "MI_STORE_DATA_INDEX%s\n",
197                           data[0] & (1 << 21) ? " use per-process HWS," : "");
198                 instr_out(data, hw_offset, 1, "index\n");
199                 instr_out(data, hw_offset, 2, "dword\n");
200                 if (len == 4)
201                         instr_out(data, hw_offset, 3, "upper dword\n");
202                 return len;
203         case 0x00:
204                 if (data[0] & (1 << 22))
205                         instr_out(data, hw_offset, 0,
206                                   "MI_NOOP write NOPID reg, val=0x%x\n",
207                                   data[0] & ((1 << 22) - 1));
208                 else
209                         instr_out(data, hw_offset, 0, "MI_NOOP\n");
210                 return len;
211         case 0x26:
212                 switch (data[0] & (0x3 << 14)) {
213                 case (0 << 14):
214                         post_sync_op = "no write";
215                         break;
216                 case (1 << 14):
217                         post_sync_op = "write data";
218                         break;
219                 case (2 << 14):
220                         post_sync_op = "reserved";
221                         break;
222                 case (3 << 14):
223                         post_sync_op = "write TIMESTAMP";
224                         break;
225                 }
226                 instr_out(data, hw_offset, 0,
227                           "MI_FLUSH_DW%s%s%s%s post_sync_op='%s' %s%s\n",
228                           data[0] & (1 << 22) ?
229                           " enable protected mem (BCS-only)," : "",
230                           data[0] & (1 << 21) ? " store in hws," : "",
231                           data[0] & (1 << 18) ? " invalidate tlb," : "",
232                           data[0] & (1 << 17) ? " flush gfdt," : "",
233                           post_sync_op,
234                           data[0] & (1 << 8) ? " enable notify interrupt," : "",
235                           data[0] & (1 << 7) ?
236                           " invalidate video state (BCS-only)," : "");
237                 if (data[0] & (1 << 21))
238                         instr_out(data, hw_offset, 1, "hws index\n");
239                 else
240                         instr_out(data, hw_offset, 1, "address\n");
241                 instr_out(data, hw_offset, 2, "dword\n");
242                 if (len == 4)
243                         instr_out(data, hw_offset, 3, "upper dword\n");
244                 return len;
245         }
246
247         for (opcode = 0; opcode < sizeof(opcodes_mi) / sizeof(opcodes_mi[0]);
248              opcode++) {
249                 if ((data[0] & 0x1f800000) >> 23 == opcodes_mi[opcode].opcode) {
250                         unsigned int i;
251
252                         instr_out(data, hw_offset, 0, "%s\n",
253                                   opcodes_mi[opcode].name);
254                         for (i = 1; i < len; i++) {
255                                 if (i >= count)
256                                         BUFFER_FAIL(count, len,
257                                                     opcodes_mi[opcode].name);
258                                 instr_out(data, hw_offset, i, "dword %d\n", i);
259                         }
260
261                         return len;
262                 }
263         }
264
265         instr_out(data, hw_offset, 0, "MI UNKNOWN\n");
266         return 1;
267 }
268
269 static void
270 decode_2d_br00(uint32_t *data, uint32_t count, uint32_t hw_offset,
271                const char *cmd)
272 {
273         instr_out(data, hw_offset, 0,
274                   "%s (rgb %sabled, alpha %sabled, src tile %d, dst tile %d)\n",
275                   cmd,
276                   (data[count] & (1 << 20)) ? "en" : "dis",
277                   (data[count] & (1 << 21)) ? "en" : "dis",
278                   (data[count] >> 15) & 1, (data[count] >> 11) & 1);
279 }
280
281 static void decode_2d_br01(uint32_t *data, uint32_t count, uint32_t hw_offset)
282 {
283         const char *format;
284         switch ((data[count] >> 24) & 0x3) {
285         case 0:
286                 format = "8";
287                 break;
288         case 1:
289                 format = "565";
290                 break;
291         case 2:
292                 format = "1555";
293                 break;
294         case 3:
295                 format = "8888";
296                 break;
297         }
298
299         instr_out(data, hw_offset, count, "format %s, pitch %d, rop 0x%02x, "
300                   "clipping %sabled, %s%s \n",
301                   format,
302                   (short)(data[count] & 0xffff),
303                   (data[count] >> 16) & 0xff,
304                   data[count] & (1 << 30) ? "en" : "dis",
305                   data[count] & (1 << 31) ? "solid pattern enabled, " : "",
306                   data[count] & (1 << 31) ?
307                   "mono pattern transparency enabled, " : "");
308
309 }
310
311 static int
312 decode_2d(uint32_t *data, uint32_t count, uint32_t hw_offset)
313 {
314         unsigned int opcode, len;
315
316         struct {
317                 uint32_t opcode;
318                 unsigned int min_len;
319                 unsigned int max_len;
320                 const char *name;
321         } opcodes_2d[] = {
322                 { 0x40, 5, 5, "COLOR_BLT" },
323                 { 0x43, 6, 6, "SRC_COPY_BLT" },
324                 { 0x01, 8, 8, "XY_SETUP_BLT" },
325                 { 0x11, 9, 9, "XY_SETUP_MONO_PATTERN_SL_BLT" },
326                 { 0x03, 3, 3, "XY_SETUP_CLIP_BLT" },
327                 { 0x24, 2, 2, "XY_PIXEL_BLT" },
328                 { 0x25, 3, 3, "XY_SCANLINES_BLT" },
329                 { 0x26, 4, 4, "Y_TEXT_BLT" },
330                 { 0x31, 5, 134, "XY_TEXT_IMMEDIATE_BLT" },
331                 { 0x50, 6, 6, "XY_COLOR_BLT" },
332                 { 0x51, 6, 6, "XY_PAT_BLT" },
333                 { 0x76, 8, 8, "XY_PAT_CHROMA_BLT" },
334                 { 0x72, 7, 135, "XY_PAT_BLT_IMMEDIATE" },
335                 { 0x77, 9, 137, "XY_PAT_CHROMA_BLT_IMMEDIATE" },
336                 { 0x52, 9, 9, "XY_MONO_PAT_BLT" },
337                 { 0x59, 7, 7, "XY_MONO_PAT_FIXED_BLT" },
338                 { 0x53, 8, 8, "XY_SRC_COPY_BLT" },
339                 { 0x54, 8, 8, "XY_MONO_SRC_COPY_BLT" },
340                 { 0x71, 9, 137, "XY_MONO_SRC_COPY_IMMEDIATE_BLT" },
341                 { 0x55, 9, 9, "XY_FULL_BLT" },
342                 { 0x55, 9, 137, "XY_FULL_IMMEDIATE_PATTERN_BLT" },
343                 { 0x56, 9, 9, "XY_FULL_MONO_SRC_BLT" },
344                 { 0x75, 10, 138, "XY_FULL_MONO_SRC_IMMEDIATE_PATTERN_BLT" },
345                 { 0x57, 12, 12, "XY_FULL_MONO_PATTERN_BLT" },
346                 { 0x58, 12, 12, "XY_FULL_MONO_PATTERN_MONO_SRC_BLT"},
347         };
348
349         switch ((data[0] & 0x1fc00000) >> 22) {
350         case 0x25:
351                 instr_out(data, hw_offset, 0,
352                           "XY_SCANLINES_BLT (pattern seed (%d, %d), dst tile %d)\n",
353                           (data[0] >> 12) & 0x8,
354                           (data[0] >> 8) & 0x8, (data[0] >> 11) & 1);
355
356                 len = (data[0] & 0x000000ff) + 2;
357                 if (len != 3)
358                         fprintf(out, "Bad count in XY_SCANLINES_BLT\n");
359                 if (count < 3)
360                         BUFFER_FAIL(count, len, "XY_SCANLINES_BLT");
361
362                 instr_out(data, hw_offset, 1, "dest (%d,%d)\n",
363                           data[1] & 0xffff, data[1] >> 16);
364                 instr_out(data, hw_offset, 2, "dest (%d,%d)\n",
365                           data[2] & 0xffff, data[2] >> 16);
366                 return len;
367         case 0x01:
368                 decode_2d_br00(data, 0, hw_offset, "XY_SETUP_BLT");
369
370                 len = (data[0] & 0x000000ff) + 2;
371                 if (len != 8)
372                         fprintf(out, "Bad count in XY_SETUP_BLT\n");
373                 if (count < 8)
374                         BUFFER_FAIL(count, len, "XY_SETUP_BLT");
375
376                 decode_2d_br01(data, 1, hw_offset);
377                 instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
378                           data[2] & 0xffff, data[2] >> 16);
379                 instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
380                           data[3] & 0xffff, data[3] >> 16);
381                 instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n",
382                           data[4]);
383                 instr_out(data, hw_offset, 5, "setup background color\n");
384                 instr_out(data, hw_offset, 6, "setup foreground color\n");
385                 instr_out(data, hw_offset, 7, "color pattern offset\n");
386                 return len;
387         case 0x03:
388                 decode_2d_br00(data, 0, hw_offset, "XY_SETUP_CLIP_BLT");
389
390                 len = (data[0] & 0x000000ff) + 2;
391                 if (len != 3)
392                         fprintf(out, "Bad count in XY_SETUP_CLIP_BLT\n");
393                 if (count < 3)
394                         BUFFER_FAIL(count, len, "XY_SETUP_CLIP_BLT");
395
396                 instr_out(data, hw_offset, 1, "cliprect (%d,%d)\n",
397                           data[1] & 0xffff, data[2] >> 16);
398                 instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
399                           data[2] & 0xffff, data[3] >> 16);
400                 return len;
401         case 0x11:
402                 decode_2d_br00(data, 0, hw_offset,
403                                "XY_SETUP_MONO_PATTERN_SL_BLT");
404
405                 len = (data[0] & 0x000000ff) + 2;
406                 if (len != 9)
407                         fprintf(out,
408                                 "Bad count in XY_SETUP_MONO_PATTERN_SL_BLT\n");
409                 if (count < 9)
410                         BUFFER_FAIL(count, len, "XY_SETUP_MONO_PATTERN_SL_BLT");
411
412                 decode_2d_br01(data, 1, hw_offset);
413                 instr_out(data, hw_offset, 2, "cliprect (%d,%d)\n",
414                           data[2] & 0xffff, data[2] >> 16);
415                 instr_out(data, hw_offset, 3, "cliprect (%d,%d)\n",
416                           data[3] & 0xffff, data[3] >> 16);
417                 instr_out(data, hw_offset, 4, "setup dst offset 0x%08x\n",
418                           data[4]);
419                 instr_out(data, hw_offset, 5, "setup background color\n");
420                 instr_out(data, hw_offset, 6, "setup foreground color\n");
421                 instr_out(data, hw_offset, 7, "mono pattern dw0\n");
422                 instr_out(data, hw_offset, 8, "mono pattern dw1\n");
423                 return len;
424         case 0x50:
425                 decode_2d_br00(data, 0, hw_offset, "XY_COLOR_BLT");
426
427                 len = (data[0] & 0x000000ff) + 2;
428                 if (len != 6)
429                         fprintf(out, "Bad count in XY_COLOR_BLT\n");
430                 if (count < 6)
431                         BUFFER_FAIL(count, len, "XY_COLOR_BLT");
432
433                 decode_2d_br01(data, 1, hw_offset);
434                 instr_out(data, hw_offset, 2, "(%d,%d)\n",
435                           data[2] & 0xffff, data[2] >> 16);
436                 instr_out(data, hw_offset, 3, "(%d,%d)\n",
437                           data[3] & 0xffff, data[3] >> 16);
438                 instr_out(data, hw_offset, 4, "offset 0x%08x\n", data[4]);
439                 instr_out(data, hw_offset, 5, "color\n");
440                 return len;
441         case 0x53:
442                 decode_2d_br00(data, 0, hw_offset, "XY_SRC_COPY_BLT");
443
444                 len = (data[0] & 0x000000ff) + 2;
445                 if (len != 8)
446                         fprintf(out, "Bad count in XY_SRC_COPY_BLT\n");
447                 if (count < 8)
448                         BUFFER_FAIL(count, len, "XY_SRC_COPY_BLT");
449
450                 decode_2d_br01(data, 1, hw_offset);
451                 instr_out(data, hw_offset, 2, "dst (%d,%d)\n",
452                           data[2] & 0xffff, data[2] >> 16);
453                 instr_out(data, hw_offset, 3, "dst (%d,%d)\n",
454                           data[3] & 0xffff, data[3] >> 16);
455                 instr_out(data, hw_offset, 4, "dst offset 0x%08x\n", data[4]);
456                 instr_out(data, hw_offset, 5, "src (%d,%d)\n",
457                           data[5] & 0xffff, data[5] >> 16);
458                 instr_out(data, hw_offset, 6, "src pitch %d\n",
459                           (short)(data[6] & 0xffff));
460                 instr_out(data, hw_offset, 7, "src offset 0x%08x\n", data[7]);
461                 return len;
462         }
463
464         for (opcode = 0; opcode < sizeof(opcodes_2d) / sizeof(opcodes_2d[0]);
465              opcode++) {
466                 if ((data[0] & 0x1fc00000) >> 22 == opcodes_2d[opcode].opcode) {
467                         unsigned int i;
468
469                         len = 1;
470                         instr_out(data, hw_offset, 0, "%s\n",
471                                   opcodes_2d[opcode].name);
472                         if (opcodes_2d[opcode].max_len > 1) {
473                                 len = (data[0] & 0x000000ff) + 2;
474                                 if (len < opcodes_2d[opcode].min_len ||
475                                     len > opcodes_2d[opcode].max_len) {
476                                         fprintf(out, "Bad count in %s\n",
477                                                 opcodes_2d[opcode].name);
478                                 }
479                         }
480
481                         for (i = 1; i < len; i++) {
482                                 if (i >= count)
483                                         BUFFER_FAIL(count, len,
484                                                     opcodes_2d[opcode].name);
485                                 instr_out(data, hw_offset, i, "dword %d\n", i);
486                         }
487
488                         return len;
489                 }
490         }
491
492         instr_out(data, hw_offset, 0, "2D UNKNOWN\n");
493         return 1;
494 }
495
496 static int
497 decode_3d_1c(uint32_t *data, uint32_t count, uint32_t hw_offset)
498 {
499         uint32_t opcode;
500
501         opcode = (data[0] & 0x00f80000) >> 19;
502
503         switch (opcode) {
504         case 0x11:
505                 instr_out(data, hw_offset, 0,
506                           "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE\n");
507                 return 1;
508         case 0x10:
509                 instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_ENABLE %s\n",
510                           data[0] & 1 ? "enabled" : "disabled");
511                 return 1;
512         case 0x01:
513                 instr_out(data, hw_offset, 0, "3DSTATE_MAP_COORD_SET_I830\n");
514                 return 1;
515         case 0x0a:
516                 instr_out(data, hw_offset, 0, "3DSTATE_MAP_CUBE_I830\n");
517                 return 1;
518         case 0x05:
519                 instr_out(data, hw_offset, 0, "3DSTATE_MAP_TEX_STREAM_I830\n");
520                 return 1;
521         }
522
523         instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1c opcode = 0x%x\n",
524                   opcode);
525         return 1;
526 }
527
528 /** Sets the string dstname to describe the destination of the PS instruction */
529 static void
530 i915_get_instruction_dst(uint32_t *data, int i, char *dstname, int do_mask)
531 {
532         uint32_t a0 = data[i];
533         int dst_nr = (a0 >> 14) & 0xf;
534         char dstmask[8];
535         const char *sat;
536
537         if (do_mask) {
538                 if (((a0 >> 10) & 0xf) == 0xf) {
539                         dstmask[0] = 0;
540                 } else {
541                         int dstmask_index = 0;
542
543                         dstmask[dstmask_index++] = '.';
544                         if (a0 & (1 << 10))
545                                 dstmask[dstmask_index++] = 'x';
546                         if (a0 & (1 << 11))
547                                 dstmask[dstmask_index++] = 'y';
548                         if (a0 & (1 << 12))
549                                 dstmask[dstmask_index++] = 'z';
550                         if (a0 & (1 << 13))
551                                 dstmask[dstmask_index++] = 'w';
552                         dstmask[dstmask_index++] = 0;
553                 }
554
555                 if (a0 & (1 << 22))
556                         sat = ".sat";
557                 else
558                         sat = "";
559         } else {
560                 dstmask[0] = 0;
561                 sat = "";
562         }
563
564         switch ((a0 >> 19) & 0x7) {
565         case 0:
566                 if (dst_nr > 15)
567                         fprintf(out, "bad destination reg R%d\n", dst_nr);
568                 sprintf(dstname, "R%d%s%s", dst_nr, dstmask, sat);
569                 break;
570         case 4:
571                 if (dst_nr > 0)
572                         fprintf(out, "bad destination reg oC%d\n", dst_nr);
573                 sprintf(dstname, "oC%s%s", dstmask, sat);
574                 break;
575         case 5:
576                 if (dst_nr > 0)
577                         fprintf(out, "bad destination reg oD%d\n", dst_nr);
578                 sprintf(dstname, "oD%s%s", dstmask, sat);
579                 break;
580         case 6:
581                 if (dst_nr > 3)
582                         fprintf(out, "bad destination reg U%d\n", dst_nr);
583                 sprintf(dstname, "U%d%s%s", dst_nr, dstmask, sat);
584                 break;
585         default:
586                 sprintf(dstname, "RESERVED");
587                 break;
588         }
589 }
590
591 static const char *
592 i915_get_channel_swizzle(uint32_t select)
593 {
594         switch (select & 0x7) {
595         case 0:
596                 return (select & 8) ? "-x" : "x";
597         case 1:
598                 return (select & 8) ? "-y" : "y";
599         case 2:
600                 return (select & 8) ? "-z" : "z";
601         case 3:
602                 return (select & 8) ? "-w" : "w";
603         case 4:
604                 return (select & 8) ? "-0" : "0";
605         case 5:
606                 return (select & 8) ? "-1" : "1";
607         default:
608                 return (select & 8) ? "-bad" : "bad";
609         }
610 }
611
612 static void
613 i915_get_instruction_src_name(uint32_t src_type, uint32_t src_nr, char *name)
614 {
615         switch (src_type) {
616         case 0:
617                 sprintf(name, "R%d", src_nr);
618                 if (src_nr > 15)
619                         fprintf(out, "bad src reg %s\n", name);
620                 break;
621         case 1:
622                 if (src_nr < 8)
623                         sprintf(name, "T%d", src_nr);
624                 else if (src_nr == 8)
625                         sprintf(name, "DIFFUSE");
626                 else if (src_nr == 9)
627                         sprintf(name, "SPECULAR");
628                 else if (src_nr == 10)
629                         sprintf(name, "FOG");
630                 else {
631                         fprintf(out, "bad src reg T%d\n", src_nr);
632                         sprintf(name, "RESERVED");
633                 }
634                 break;
635         case 2:
636                 sprintf(name, "C%d", src_nr);
637                 if (src_nr > 31)
638                         fprintf(out, "bad src reg %s\n", name);
639                 break;
640         case 4:
641                 sprintf(name, "oC");
642                 if (src_nr > 0)
643                         fprintf(out, "bad src reg oC%d\n", src_nr);
644                 break;
645         case 5:
646                 sprintf(name, "oD");
647                 if (src_nr > 0)
648                         fprintf(out, "bad src reg oD%d\n", src_nr);
649                 break;
650         case 6:
651                 sprintf(name, "U%d", src_nr);
652                 if (src_nr > 3)
653                         fprintf(out, "bad src reg %s\n", name);
654                 break;
655         default:
656                 fprintf(out, "bad src reg type %d\n", src_type);
657                 sprintf(name, "RESERVED");
658                 break;
659         }
660 }
661
662 static void i915_get_instruction_src0(uint32_t *data, int i, char *srcname)
663 {
664         uint32_t a0 = data[i];
665         uint32_t a1 = data[i + 1];
666         int src_nr = (a0 >> 2) & 0x1f;
667         const char *swizzle_x = i915_get_channel_swizzle((a1 >> 28) & 0xf);
668         const char *swizzle_y = i915_get_channel_swizzle((a1 >> 24) & 0xf);
669         const char *swizzle_z = i915_get_channel_swizzle((a1 >> 20) & 0xf);
670         const char *swizzle_w = i915_get_channel_swizzle((a1 >> 16) & 0xf);
671         char swizzle[100];
672
673         i915_get_instruction_src_name((a0 >> 7) & 0x7, src_nr, srcname);
674         sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z,
675                 swizzle_w);
676         if (strcmp(swizzle, ".xyzw") != 0)
677                 strcat(srcname, swizzle);
678 }
679
680 static void i915_get_instruction_src1(uint32_t *data, int i, char *srcname)
681 {
682         uint32_t a1 = data[i + 1];
683         uint32_t a2 = data[i + 2];
684         int src_nr = (a1 >> 8) & 0x1f;
685         const char *swizzle_x = i915_get_channel_swizzle((a1 >> 4) & 0xf);
686         const char *swizzle_y = i915_get_channel_swizzle((a1 >> 0) & 0xf);
687         const char *swizzle_z = i915_get_channel_swizzle((a2 >> 28) & 0xf);
688         const char *swizzle_w = i915_get_channel_swizzle((a2 >> 24) & 0xf);
689         char swizzle[100];
690
691         i915_get_instruction_src_name((a1 >> 13) & 0x7, src_nr, srcname);
692         sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z,
693                 swizzle_w);
694         if (strcmp(swizzle, ".xyzw") != 0)
695                 strcat(srcname, swizzle);
696 }
697
698 static void i915_get_instruction_src2(uint32_t *data, int i, char *srcname)
699 {
700         uint32_t a2 = data[i + 2];
701         int src_nr = (a2 >> 16) & 0x1f;
702         const char *swizzle_x = i915_get_channel_swizzle((a2 >> 12) & 0xf);
703         const char *swizzle_y = i915_get_channel_swizzle((a2 >> 8) & 0xf);
704         const char *swizzle_z = i915_get_channel_swizzle((a2 >> 4) & 0xf);
705         const char *swizzle_w = i915_get_channel_swizzle((a2 >> 0) & 0xf);
706         char swizzle[100];
707
708         i915_get_instruction_src_name((a2 >> 21) & 0x7, src_nr, srcname);
709         sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z,
710                 swizzle_w);
711         if (strcmp(swizzle, ".xyzw") != 0)
712                 strcat(srcname, swizzle);
713 }
714
715 static void
716 i915_get_instruction_addr(uint32_t src_type, uint32_t src_nr, char *name)
717 {
718         switch (src_type) {
719         case 0:
720                 sprintf(name, "R%d", src_nr);
721                 if (src_nr > 15)
722                         fprintf(out, "bad src reg %s\n", name);
723                 break;
724         case 1:
725                 if (src_nr < 8)
726                         sprintf(name, "T%d", src_nr);
727                 else if (src_nr == 8)
728                         sprintf(name, "DIFFUSE");
729                 else if (src_nr == 9)
730                         sprintf(name, "SPECULAR");
731                 else if (src_nr == 10)
732                         sprintf(name, "FOG");
733                 else {
734                         fprintf(out, "bad src reg T%d\n", src_nr);
735                         sprintf(name, "RESERVED");
736                 }
737                 break;
738         case 4:
739                 sprintf(name, "oC");
740                 if (src_nr > 0)
741                         fprintf(out, "bad src reg oC%d\n", src_nr);
742                 break;
743         case 5:
744                 sprintf(name, "oD");
745                 if (src_nr > 0)
746                         fprintf(out, "bad src reg oD%d\n", src_nr);
747                 break;
748         default:
749                 fprintf(out, "bad src reg type %d\n", src_type);
750                 sprintf(name, "RESERVED");
751                 break;
752         }
753 }
754
755 static void
756 i915_decode_alu1(uint32_t *data, uint32_t hw_offset,
757                  int i, char *instr_prefix, const char *op_name)
758 {
759         char dst[100], src0[100];
760
761         i915_get_instruction_dst(data, i, dst, 1);
762         i915_get_instruction_src0(data, i, src0);
763
764         instr_out(data, hw_offset, i++, "%s: %s %s, %s\n", instr_prefix,
765                   op_name, dst, src0);
766         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
767         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
768 }
769
770 static void
771 i915_decode_alu2(uint32_t *data, uint32_t hw_offset,
772                  int i, char *instr_prefix, const char *op_name)
773 {
774         char dst[100], src0[100], src1[100];
775
776         i915_get_instruction_dst(data, i, dst, 1);
777         i915_get_instruction_src0(data, i, src0);
778         i915_get_instruction_src1(data, i, src1);
779
780         instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s\n", instr_prefix,
781                   op_name, dst, src0, src1);
782         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
783         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
784 }
785
786 static void
787 i915_decode_alu3(uint32_t *data, uint32_t hw_offset,
788                  int i, char *instr_prefix, const char *op_name)
789 {
790         char dst[100], src0[100], src1[100], src2[100];
791
792         i915_get_instruction_dst(data, i, dst, 1);
793         i915_get_instruction_src0(data, i, src0);
794         i915_get_instruction_src1(data, i, src1);
795         i915_get_instruction_src2(data, i, src2);
796
797         instr_out(data, hw_offset, i++, "%s: %s %s, %s, %s, %s\n", instr_prefix,
798                   op_name, dst, src0, src1, src2);
799         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
800         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
801 }
802
803 static void
804 i915_decode_tex(uint32_t *data, uint32_t hw_offset, int i,
805                 const char *instr_prefix, const char *tex_name)
806 {
807         uint32_t t0 = data[i];
808         uint32_t t1 = data[i + 1];
809         char dst_name[100];
810         char addr_name[100];
811         int sampler_nr;
812
813         i915_get_instruction_dst(data, i, dst_name, 0);
814         i915_get_instruction_addr((t1 >> 24) & 0x7,
815                                   (t1 >> 17) & 0xf, addr_name);
816         sampler_nr = t0 & 0xf;
817
818         instr_out(data, hw_offset, i++, "%s: %s %s, S%d, %s\n", instr_prefix,
819                   tex_name, dst_name, sampler_nr, addr_name);
820         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
821         instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
822 }
823
824 static void
825 i915_decode_dcl(uint32_t *data, uint32_t hw_offset, int i, char *instr_prefix)
826 {
827         uint32_t d0 = data[i];
828         const char *sampletype;
829         int dcl_nr = (d0 >> 14) & 0xf;
830         const char *dcl_x = d0 & (1 << 10) ? "x" : "";
831         const char *dcl_y = d0 & (1 << 11) ? "y" : "";
832         const char *dcl_z = d0 & (1 << 12) ? "z" : "";
833         const char *dcl_w = d0 & (1 << 13) ? "w" : "";
834         char dcl_mask[10];
835
836         switch ((d0 >> 19) & 0x3) {
837         case 1:
838                 sprintf(dcl_mask, ".%s%s%s%s", dcl_x, dcl_y, dcl_z, dcl_w);
839                 if (strcmp(dcl_mask, ".") == 0)
840                         fprintf(out, "bad (empty) dcl mask\n");
841
842                 if (dcl_nr > 10)
843                         fprintf(out, "bad T%d dcl register number\n", dcl_nr);
844                 if (dcl_nr < 8) {
845                         if (strcmp(dcl_mask, ".x") != 0 &&
846                             strcmp(dcl_mask, ".xy") != 0 &&
847                             strcmp(dcl_mask, ".xz") != 0 &&
848                             strcmp(dcl_mask, ".w") != 0 &&
849                             strcmp(dcl_mask, ".xyzw") != 0) {
850                                 fprintf(out, "bad T%d.%s dcl mask\n", dcl_nr,
851                                         dcl_mask);
852                         }
853                         instr_out(data, hw_offset, i++, "%s: DCL T%d%s\n",
854                                   instr_prefix, dcl_nr, dcl_mask);
855                 } else {
856                         if (strcmp(dcl_mask, ".xz") == 0)
857                                 fprintf(out, "errataed bad dcl mask %s\n",
858                                         dcl_mask);
859                         else if (strcmp(dcl_mask, ".xw") == 0)
860                                 fprintf(out, "errataed bad dcl mask %s\n",
861                                         dcl_mask);
862                         else if (strcmp(dcl_mask, ".xzw") == 0)
863                                 fprintf(out, "errataed bad dcl mask %s\n",
864                                         dcl_mask);
865
866                         if (dcl_nr == 8) {
867                                 instr_out(data, hw_offset, i++,
868                                           "%s: DCL DIFFUSE%s\n", instr_prefix,
869                                           dcl_mask);
870                         } else if (dcl_nr == 9) {
871                                 instr_out(data, hw_offset, i++,
872                                           "%s: DCL SPECULAR%s\n", instr_prefix,
873                                           dcl_mask);
874                         } else if (dcl_nr == 10) {
875                                 instr_out(data, hw_offset, i++,
876                                           "%s: DCL FOG%s\n", instr_prefix,
877                                           dcl_mask);
878                         }
879                 }
880                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
881                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
882                 break;
883         case 3:
884                 switch ((d0 >> 22) & 0x3) {
885                 case 0:
886                         sampletype = "2D";
887                         break;
888                 case 1:
889                         sampletype = "CUBE";
890                         break;
891                 case 2:
892                         sampletype = "3D";
893                         break;
894                 default:
895                         sampletype = "RESERVED";
896                         break;
897                 }
898                 if (dcl_nr > 15)
899                         fprintf(out, "bad S%d dcl register number\n", dcl_nr);
900                 instr_out(data, hw_offset, i++, "%s: DCL S%d %s\n",
901                           instr_prefix, dcl_nr, sampletype);
902                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
903                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
904                 break;
905         default:
906                 instr_out(data, hw_offset, i++, "%s: DCL RESERVED%d\n",
907                           instr_prefix, dcl_nr);
908                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
909                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
910         }
911 }
912
913 static void
914 i915_decode_instruction(uint32_t *data, uint32_t hw_offset,
915                         int i, char *instr_prefix)
916 {
917         switch ((data[i] >> 24) & 0x1f) {
918         case 0x0:
919                 instr_out(data, hw_offset, i++, "%s: NOP\n", instr_prefix);
920                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
921                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
922                 break;
923         case 0x01:
924                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "ADD");
925                 break;
926         case 0x02:
927                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOV");
928                 break;
929         case 0x03:
930                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "MUL");
931                 break;
932         case 0x04:
933                 i915_decode_alu3(data, hw_offset, i, instr_prefix, "MAD");
934                 break;
935         case 0x05:
936                 i915_decode_alu3(data, hw_offset, i, instr_prefix, "DP2ADD");
937                 break;
938         case 0x06:
939                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP3");
940                 break;
941         case 0x07:
942                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "DP4");
943                 break;
944         case 0x08:
945                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "FRC");
946                 break;
947         case 0x09:
948                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "RCP");
949                 break;
950         case 0x0a:
951                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "RSQ");
952                 break;
953         case 0x0b:
954                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "EXP");
955                 break;
956         case 0x0c:
957                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "LOG");
958                 break;
959         case 0x0d:
960                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "CMP");
961                 break;
962         case 0x0e:
963                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "MIN");
964                 break;
965         case 0x0f:
966                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "MAX");
967                 break;
968         case 0x10:
969                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "FLR");
970                 break;
971         case 0x11:
972                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "MOD");
973                 break;
974         case 0x12:
975                 i915_decode_alu1(data, hw_offset, i, instr_prefix, "TRC");
976                 break;
977         case 0x13:
978                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "SGE");
979                 break;
980         case 0x14:
981                 i915_decode_alu2(data, hw_offset, i, instr_prefix, "SLT");
982                 break;
983         case 0x15:
984                 i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLD");
985                 break;
986         case 0x16:
987                 i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDP");
988                 break;
989         case 0x17:
990                 i915_decode_tex(data, hw_offset, i, instr_prefix, "TEXLDB");
991                 break;
992         case 0x19:
993                 i915_decode_dcl(data, hw_offset, i, instr_prefix);
994                 break;
995         default:
996                 instr_out(data, hw_offset, i++, "%s: unknown\n", instr_prefix);
997                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
998                 instr_out(data, hw_offset, i++, "%s\n", instr_prefix);
999                 break;
1000         }
1001 }
1002
1003 static const char *
1004 decode_compare_func(uint32_t op)
1005 {
1006         switch (op & 0x7) {
1007         case 0:
1008                 return "always";
1009         case 1:
1010                 return "never";
1011         case 2:
1012                 return "less";
1013         case 3:
1014                 return "equal";
1015         case 4:
1016                 return "lequal";
1017         case 5:
1018                 return "greater";
1019         case 6:
1020                 return "notequal";
1021         case 7:
1022                 return "gequal";
1023         }
1024         return "";
1025 }
1026
1027 static const char *
1028 decode_stencil_op(uint32_t op)
1029 {
1030         switch (op & 0x7) {
1031         case 0:
1032                 return "keep";
1033         case 1:
1034                 return "zero";
1035         case 2:
1036                 return "replace";
1037         case 3:
1038                 return "incr_sat";
1039         case 4:
1040                 return "decr_sat";
1041         case 5:
1042                 return "greater";
1043         case 6:
1044                 return "incr";
1045         case 7:
1046                 return "decr";
1047         }
1048         return "";
1049 }
1050
1051 #if 0
1052 static const char *
1053 decode_logic_op(uint32_t op)
1054 {
1055         switch (op & 0xf) {
1056         case 0:
1057                 return "clear";
1058         case 1:
1059                 return "nor";
1060         case 2:
1061                 return "and_inv";
1062         case 3:
1063                 return "copy_inv";
1064         case 4:
1065                 return "and_rvrse";
1066         case 5:
1067                 return "inv";
1068         case 6:
1069                 return "xor";
1070         case 7:
1071                 return "nand";
1072         case 8:
1073                 return "and";
1074         case 9:
1075                 return "equiv";
1076         case 10:
1077                 return "noop";
1078         case 11:
1079                 return "or_inv";
1080         case 12:
1081                 return "copy";
1082         case 13:
1083                 return "or_rvrse";
1084         case 14:
1085                 return "or";
1086         case 15:
1087                 return "set";
1088         }
1089         return "";
1090 }
1091 #endif
1092
1093 static const char *
1094 decode_blend_fact(uint32_t op)
1095 {
1096         switch (op & 0xf) {
1097         case 1:
1098                 return "zero";
1099         case 2:
1100                 return "one";
1101         case 3:
1102                 return "src_colr";
1103         case 4:
1104                 return "inv_src_colr";
1105         case 5:
1106                 return "src_alpha";
1107         case 6:
1108                 return "inv_src_alpha";
1109         case 7:
1110                 return "dst_alpha";
1111         case 8:
1112                 return "inv_dst_alpha";
1113         case 9:
1114                 return "dst_colr";
1115         case 10:
1116                 return "inv_dst_colr";
1117         case 11:
1118                 return "src_alpha_sat";
1119         case 12:
1120                 return "cnst_colr";
1121         case 13:
1122                 return "inv_cnst_colr";
1123         case 14:
1124                 return "cnst_alpha";
1125         case 15:
1126                 return "inv_const_alpha";
1127         }
1128         return "";
1129 }
1130
1131 static const char *
1132 decode_tex_coord_mode(uint32_t mode)
1133 {
1134         switch (mode & 0x7) {
1135         case 0:
1136                 return "wrap";
1137         case 1:
1138                 return "mirror";
1139         case 2:
1140                 return "clamp_edge";
1141         case 3:
1142                 return "cube";
1143         case 4:
1144                 return "clamp_border";
1145         case 5:
1146                 return "mirror_once";
1147         }
1148         return "";
1149 }
1150
1151 static const char *
1152 decode_sample_filter(uint32_t mode)
1153 {
1154         switch (mode & 0x7) {
1155         case 0:
1156                 return "nearest";
1157         case 1:
1158                 return "linear";
1159         case 2:
1160                 return "anisotropic";
1161         case 3:
1162                 return "4x4_1";
1163         case 4:
1164                 return "4x4_2";
1165         case 5:
1166                 return "4x4_flat";
1167         case 6:
1168                 return "6x5_mono";
1169         }
1170         return "";
1171 }
1172
1173 static int
1174 decode_3d_1d(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid)
1175 {
1176         unsigned int len, i, c, idx, word, map, sampler, instr;
1177         const char *format, *zformat, *type;
1178         uint32_t opcode;
1179
1180         struct {
1181                 uint32_t opcode;
1182                 int i830_only;
1183                 unsigned int min_len;
1184                 unsigned int max_len;
1185                 const char *name;
1186         } opcodes_3d_1d[] = {
1187                 { 0x86, 0, 4, 4, "3DSTATE_CHROMA_KEY" },
1188                 { 0x88, 0, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR" },
1189                 { 0x99, 0, 2, 2, "3DSTATE_DEFAULT_DIFFUSE" },
1190                 { 0x9a, 0, 2, 2, "3DSTATE_DEFAULT_SPECULAR" },
1191                 { 0x98, 0, 2, 2, "3DSTATE_DEFAULT_Z" },
1192                 { 0x97, 0, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE" },
1193                 { 0x9d, 0, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4" },
1194                 { 0x9e, 0, 4, 4, "3DSTATE_MONO_FILTER" },
1195                 { 0x89, 0, 4, 4, "3DSTATE_FOG_MODE" },
1196                 { 0x8f, 0, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32" },
1197                 { 0x83, 0, 2, 2, "3DSTATE_SPAN_STIPPLE" },
1198                 { 0x8c, 1, 2, 2, "3DSTATE_MAP_COORD_TRANSFORM_I830" },
1199                 { 0x8b, 1, 2, 2, "3DSTATE_MAP_VERTEX_TRANSFORM_I830" },
1200                 { 0x8d, 1, 3, 3, "3DSTATE_W_STATE_I830" },
1201                 { 0x01, 1, 2, 2, "3DSTATE_COLOR_FACTOR_I830" },
1202                 { 0x02, 1, 2, 2, "3DSTATE_MAP_COORD_SETBIND_I830"},
1203         }, *opcode_3d_1d;
1204
1205         opcode = (data[0] & 0x00ff0000) >> 16;
1206
1207         switch (opcode) {
1208         case 0x07:
1209                 /* This instruction is unusual.  A 0 length means just
1210                  * 1 DWORD instead of 2.  The 0 length is specified in
1211                  * one place to be unsupported, but stated to be
1212                  * required in another, and 0 length LOAD_INDIRECTs
1213                  * appear to cause no harm at least.
1214                  */
1215                 instr_out(data, hw_offset, 0, "3DSTATE_LOAD_INDIRECT\n");
1216                 len = (data[0] & 0x000000ff) + 1;
1217                 i = 1;
1218                 if (data[0] & (0x01 << 8)) {
1219                         if (i + 2 >= count)
1220                                 BUFFER_FAIL(count, len,
1221                                             "3DSTATE_LOAD_INDIRECT");
1222                         instr_out(data, hw_offset, i++, "SIS.0\n");
1223                         instr_out(data, hw_offset, i++, "SIS.1\n");
1224                 }
1225                 if (data[0] & (0x02 << 8)) {
1226                         if (i + 1 >= count)
1227                                 BUFFER_FAIL(count, len,
1228                                             "3DSTATE_LOAD_INDIRECT");
1229                         instr_out(data, hw_offset, i++, "DIS.0\n");
1230                 }
1231                 if (data[0] & (0x04 << 8)) {
1232                         if (i + 2 >= count)
1233                                 BUFFER_FAIL(count, len,
1234                                             "3DSTATE_LOAD_INDIRECT");
1235                         instr_out(data, hw_offset, i++, "SSB.0\n");
1236                         instr_out(data, hw_offset, i++, "SSB.1\n");
1237                 }
1238                 if (data[0] & (0x08 << 8)) {
1239                         if (i + 2 >= count)
1240                                 BUFFER_FAIL(count, len,
1241                                             "3DSTATE_LOAD_INDIRECT");
1242                         instr_out(data, hw_offset, i++, "MSB.0\n");
1243                         instr_out(data, hw_offset, i++, "MSB.1\n");
1244                 }
1245                 if (data[0] & (0x10 << 8)) {
1246                         if (i + 2 >= count)
1247                                 BUFFER_FAIL(count, len,
1248                                             "3DSTATE_LOAD_INDIRECT");
1249                         instr_out(data, hw_offset, i++, "PSP.0\n");
1250                         instr_out(data, hw_offset, i++, "PSP.1\n");
1251                 }
1252                 if (data[0] & (0x20 << 8)) {
1253                         if (i + 2 >= count)
1254                                 BUFFER_FAIL(count, len,
1255                                             "3DSTATE_LOAD_INDIRECT");
1256                         instr_out(data, hw_offset, i++, "PSC.0\n");
1257                         instr_out(data, hw_offset, i++, "PSC.1\n");
1258                 }
1259                 if (len != i) {
1260                         fprintf(out, "Bad count in 3DSTATE_LOAD_INDIRECT\n");
1261                         return len;
1262                 }
1263                 return len;
1264         case 0x04:
1265                 instr_out(data, hw_offset, 0,
1266                           "3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
1267                 len = (data[0] & 0x0000000f) + 2;
1268                 i = 1;
1269                 for (word = 0; word <= 8; word++) {
1270                         if (data[0] & (1 << (4 + word))) {
1271                                 if (i >= count)
1272                                         BUFFER_FAIL(count, len,
1273                                                     "3DSTATE_LOAD_STATE_IMMEDIATE_1");
1274
1275                                 /* save vertex state for decode */
1276                                 if (!IS_GEN2(devid)) {
1277                                         int tex_num;
1278
1279                                         if (word == 2) {
1280                                                 saved_s2_set = 1;
1281                                                 saved_s2 = data[i];
1282                                         }
1283                                         if (word == 4) {
1284                                                 saved_s4_set = 1;
1285                                                 saved_s4 = data[i];
1286                                         }
1287
1288                                         switch (word) {
1289                                         case 0:
1290                                                 instr_out(data, hw_offset, i,
1291                                                           "S0: vbo offset: 0x%08x%s\n",
1292                                                           data[i] & (~1),
1293                                                           data[i] & 1 ?
1294                                                           ", auto cache invalidate disabled"
1295                                                           : "");
1296                                                 break;
1297                                         case 1:
1298                                                 instr_out(data, hw_offset, i,
1299                                                           "S1: vertex width: %i, vertex pitch: %i\n",
1300                                                           (data[i] >> 24) &
1301                                                           0x3f,
1302                                                           (data[i] >> 16) &
1303                                                           0x3f);
1304                                                 break;
1305                                         case 2:
1306                                                 instr_out(data, hw_offset, i,
1307                                                           "S2: texcoord formats: ");
1308                                                 for (tex_num = 0;
1309                                                      tex_num < 8; tex_num++) {
1310                                                         switch ((data[i] >>
1311                                                                  tex_num *
1312                                                                  4) & 0xf) {
1313                                                         case 0:
1314                                                                 fprintf(out,
1315                                                                         "%i=2D ",
1316                                                                         tex_num);
1317                                                                 break;
1318                                                         case 1:
1319                                                                 fprintf(out,
1320                                                                         "%i=3D ",
1321                                                                         tex_num);
1322                                                                 break;
1323                                                         case 2:
1324                                                                 fprintf(out,
1325                                                                         "%i=4D ",
1326                                                                         tex_num);
1327                                                                 break;
1328                                                         case 3:
1329                                                                 fprintf(out,
1330                                                                         "%i=1D ",
1331                                                                         tex_num);
1332                                                                 break;
1333                                                         case 4:
1334                                                                 fprintf(out,
1335                                                                         "%i=2D_16 ",
1336                                                                         tex_num);
1337                                                                 break;
1338                                                         case 5:
1339                                                                 fprintf(out,
1340                                                                         "%i=4D_16 ",
1341                                                                         tex_num);
1342                                                                 break;
1343                                                         case 0xf:
1344                                                                 fprintf(out,
1345                                                                         "%i=NP ",
1346                                                                         tex_num);
1347                                                                 break;
1348                                                         }
1349                                                 }
1350                                                 fprintf(out, "\n");
1351
1352                                                 break;
1353                                         case 3:
1354                                                 instr_out(data, hw_offset, i,
1355                                                           "S3: not documented\n");
1356                                                 break;
1357                                         case 4:
1358                                                 {
1359                                                         const char *cullmode = "";
1360                                                         const char *vfmt_xyzw = "";
1361                                                         switch ((data[i] >> 13)
1362                                                                 & 0x3) {
1363                                                         case 0:
1364                                                                 cullmode =
1365                                                                     "both";
1366                                                                 break;
1367                                                         case 1:
1368                                                                 cullmode =
1369                                                                     "none";
1370                                                                 break;
1371                                                         case 2:
1372                                                                 cullmode = "cw";
1373                                                                 break;
1374                                                         case 3:
1375                                                                 cullmode =
1376                                                                     "ccw";
1377                                                                 break;
1378                                                         }
1379                                                         switch (data[i] &
1380                                                                 (7 << 6 | 1 <<
1381                                                                  2)) {
1382                                                         case 1 << 6:
1383                                                                 vfmt_xyzw =
1384                                                                     "XYZ,";
1385                                                                 break;
1386                                                         case 2 << 6:
1387                                                                 vfmt_xyzw =
1388                                                                     "XYZW,";
1389                                                                 break;
1390                                                         case 3 << 6:
1391                                                                 vfmt_xyzw =
1392                                                                     "XY,";
1393                                                                 break;
1394                                                         case 4 << 6:
1395                                                                 vfmt_xyzw =
1396                                                                     "XYW,";
1397                                                                 break;
1398                                                         case 1 << 6 | 1 << 2:
1399                                                                 vfmt_xyzw =
1400                                                                     "XYZF,";
1401                                                                 break;
1402                                                         case 2 << 6 | 1 << 2:
1403                                                                 vfmt_xyzw =
1404                                                                     "XYZWF,";
1405                                                                 break;
1406                                                         case 3 << 6 | 1 << 2:
1407                                                                 vfmt_xyzw =
1408                                                                     "XYF,";
1409                                                                 break;
1410                                                         case 4 << 6 | 1 << 2:
1411                                                                 vfmt_xyzw =
1412                                                                     "XYWF,";
1413                                                                 break;
1414                                                         }
1415                                                         instr_out(data,
1416                                                                   hw_offset, i,
1417                                                                   "S4: point_width=%i, line_width=%.1f,"
1418                                                                   "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%s%s%s "
1419                                                                   "%s%s%s%s%s\n",
1420                                                                   (data[i] >>
1421                                                                    23) & 0x1ff,
1422                                                                   ((data[i] >>
1423                                                                     19) & 0xf) /
1424                                                                   2.0,
1425                                                                   data[i] & (0xf
1426                                                                              <<
1427                                                                              15)
1428                                                                   ?
1429                                                                   " flatshade="
1430                                                                   : "",
1431                                                                   data[i] & (1
1432                                                                              <<
1433                                                                              18)
1434                                                                   ? "Alpha," :
1435                                                                   "",
1436                                                                   data[i] & (1
1437                                                                              <<
1438                                                                              17)
1439                                                                   ? "Fog," : "",
1440                                                                   data[i] & (1
1441                                                                              <<
1442                                                                              16)
1443                                                                   ? "Specular,"
1444                                                                   : "",
1445                                                                   data[i] & (1
1446                                                                              <<
1447                                                                              15)
1448                                                                   ? "Color," :
1449                                                                   "", cullmode,
1450                                                                   data[i] & (1
1451                                                                              <<
1452                                                                              12)
1453                                                                   ?
1454                                                                   "PointWidth,"
1455                                                                   : "",
1456                                                                   data[i] & (1
1457                                                                              <<
1458                                                                              11)
1459                                                                   ? "SpecFog," :
1460                                                                   "",
1461                                                                   data[i] & (1
1462                                                                              <<
1463                                                                              10)
1464                                                                   ? "Color," :
1465                                                                   "",
1466                                                                   data[i] & (1
1467                                                                              <<
1468                                                                              9)
1469                                                                   ? "DepthOfs,"
1470                                                                   : "",
1471                                                                   vfmt_xyzw,
1472                                                                   data[i] & (1
1473                                                                              <<
1474                                                                              9)
1475                                                                   ? "FogParam,"
1476                                                                   : "",
1477                                                                   data[i] & (1
1478                                                                              <<
1479                                                                              5)
1480                                                                   ?
1481                                                                   "force default diffuse, "
1482                                                                   : "",
1483                                                                   data[i] & (1
1484                                                                              <<
1485                                                                              4)
1486                                                                   ?
1487                                                                   "force default specular, "
1488                                                                   : "",
1489                                                                   data[i] & (1
1490                                                                              <<
1491                                                                              3)
1492                                                                   ?
1493                                                                   "local depth ofs enable, "
1494                                                                   : "",
1495                                                                   data[i] & (1
1496                                                                              <<
1497                                                                              1)
1498                                                                   ?
1499                                                                   "point sprite enable, "
1500                                                                   : "",
1501                                                                   data[i] & (1
1502                                                                              <<
1503                                                                              0)
1504                                                                   ?
1505                                                                   "line AA enable, "
1506                                                                   : "");
1507                                                         break;
1508                                                 }
1509                                         case 5:
1510                                                 {
1511                                                         instr_out(data,
1512                                                                   hw_offset, i,
1513                                                                   "S5:%s%s%s%s%s"
1514                                                                   "%s%s%s%s stencil_ref=0x%x, stencil_test=%s, "
1515                                                                   "stencil_fail=%s, stencil_pass_z_fail=%s, "
1516                                                                   "stencil_pass_z_pass=%s, %s%s%s%s\n",
1517                                                                   data[i] & (0xf
1518                                                                              <<
1519                                                                              28)
1520                                                                   ?
1521                                                                   " write_disable="
1522                                                                   : "",
1523                                                                   data[i] & (1
1524                                                                              <<
1525                                                                              31)
1526                                                                   ? "Alpha," :
1527                                                                   "",
1528                                                                   data[i] & (1
1529                                                                              <<
1530                                                                              30)
1531                                                                   ? "Red," : "",
1532                                                                   data[i] & (1
1533                                                                              <<
1534                                                                              29)
1535                                                                   ? "Green," :
1536                                                                   "",
1537                                                                   data[i] & (1
1538                                                                              <<
1539                                                                              28)
1540                                                                   ? "Blue," :
1541                                                                   "",
1542                                                                   data[i] & (1
1543                                                                              <<
1544                                                                              27)
1545                                                                   ?
1546                                                                   " force default point size,"
1547                                                                   : "",
1548                                                                   data[i] & (1
1549                                                                              <<
1550                                                                              26)
1551                                                                   ?
1552                                                                   " last pixel enable,"
1553                                                                   : "",
1554                                                                   data[i] & (1
1555                                                                              <<
1556                                                                              25)
1557                                                                   ?
1558                                                                   " global depth ofs enable,"
1559                                                                   : "",
1560                                                                   data[i] & (1
1561                                                                              <<
1562                                                                              24)
1563                                                                   ?
1564                                                                   " fog enable,"
1565                                                                   : "",
1566                                                                   (data[i] >>
1567                                                                    16) & 0xff,
1568                                                                   decode_compare_func
1569                                                                   (data[i] >>
1570                                                                    13),
1571                                                                   decode_stencil_op
1572                                                                   (data[i] >>
1573                                                                    10),
1574                                                                   decode_stencil_op
1575                                                                   (data[i] >>
1576                                                                    7),
1577                                                                   decode_stencil_op
1578                                                                   (data[i] >>
1579                                                                    4),
1580                                                                   data[i] & (1
1581                                                                              <<
1582                                                                              3)
1583                                                                   ?
1584                                                                   "stencil write enable, "
1585                                                                   : "",
1586                                                                   data[i] & (1
1587                                                                              <<
1588                                                                              2)
1589                                                                   ?
1590                                                                   "stencil test enable, "
1591                                                                   : "",
1592                                                                   data[i] & (1
1593                                                                              <<
1594                                                                              1)
1595                                                                   ?
1596                                                                   "color dither enable, "
1597                                                                   : "",
1598                                                                   data[i] & (1
1599                                                                              <<
1600                                                                              0)
1601                                                                   ?
1602                                                                   "logicop enable, "
1603                                                                   : "");
1604                                                 }
1605                                                 break;
1606                                         case 6:
1607                                                 instr_out(data, hw_offset, i,
1608                                                           "S6: %salpha_test=%s, alpha_ref=0x%x, "
1609                                                           "depth_test=%s, %ssrc_blnd_fct=%s, dst_blnd_fct=%s, "
1610                                                           "%s%stristrip_provoking_vertex=%i\n",
1611                                                           data[i] & (1 << 31) ?
1612                                                           "alpha test enable, "
1613                                                           : "",
1614                                                           decode_compare_func
1615                                                           (data[i] >> 28),
1616                                                           data[i] & (0xff <<
1617                                                                      20),
1618                                                           decode_compare_func
1619                                                           (data[i] >> 16),
1620                                                           data[i] & (1 << 15) ?
1621                                                           "cbuf blend enable, "
1622                                                           : "",
1623                                                           decode_blend_fact(data
1624                                                                             [i]
1625                                                                             >>
1626                                                                             8),
1627                                                           decode_blend_fact(data
1628                                                                             [i]
1629                                                                             >>
1630                                                                             4),
1631                                                           data[i] & (1 << 3) ?
1632                                                           "depth write enable, "
1633                                                           : "",
1634                                                           data[i] & (1 << 2) ?
1635                                                           "cbuf write enable, "
1636                                                           : "",
1637                                                           data[i] & (0x3));
1638                                                 break;
1639                                         case 7:
1640                                                 instr_out(data, hw_offset, i,
1641                                                           "S7: depth offset constant: 0x%08x\n",
1642                                                           data[i]);
1643                                                 break;
1644                                         }
1645                                 } else {
1646                                         instr_out(data, hw_offset, i,
1647                                                   "S%d: 0x%08x\n", i, data[i]);
1648                                 }
1649                                 i++;
1650                         }
1651                 }
1652                 if (len != i) {
1653                         fprintf(out,
1654                                 "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_1\n");
1655                 }
1656                 return len;
1657         case 0x03:
1658                 instr_out(data, hw_offset, 0,
1659                           "3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
1660                 len = (data[0] & 0x0000000f) + 2;
1661                 i = 1;
1662                 for (word = 6; word <= 14; word++) {
1663                         if (data[0] & (1 << word)) {
1664                                 if (i >= count)
1665                                         BUFFER_FAIL(count, len,
1666                                                     "3DSTATE_LOAD_STATE_IMMEDIATE_2");
1667
1668                                 if (word == 6)
1669                                         instr_out(data, hw_offset, i++,
1670                                                   "TBCF\n");
1671                                 else if (word >= 7 && word <= 10) {
1672                                         instr_out(data, hw_offset, i++,
1673                                                   "TB%dC\n", word - 7);
1674                                         instr_out(data, hw_offset, i++,
1675                                                   "TB%dA\n", word - 7);
1676                                 } else if (word >= 11 && word <= 14) {
1677                                         instr_out(data, hw_offset, i,
1678                                                   "TM%dS0: offset=0x%08x, %s\n",
1679                                                   word - 11,
1680                                                   data[i] & 0xfffffffe,
1681                                                   data[i] & 1 ? "use fence" :
1682                                                   "");
1683                                         i++;
1684                                         instr_out(data, hw_offset, i,
1685                                                   "TM%dS1: height=%i, width=%i, %s\n",
1686                                                   word - 11, data[i] >> 21,
1687                                                   (data[i] >> 10) & 0x3ff,
1688                                                   data[i] & 2 ? (data[i] & 1 ?
1689                                                                  "y-tiled" :
1690                                                                  "x-tiled") :
1691                                                   "");
1692                                         i++;
1693                                         instr_out(data, hw_offset, i,
1694                                                   "TM%dS2: pitch=%i, \n",
1695                                                   word - 11,
1696                                                   ((data[i] >> 21) + 1) * 4);
1697                                         i++;
1698                                         instr_out(data, hw_offset, i++,
1699                                                   "TM%dS3\n", word - 11);
1700                                         instr_out(data, hw_offset, i++,
1701                                                   "TM%dS4: dflt color\n",
1702                                                   word - 11);
1703                                 }
1704                         }
1705                 }
1706                 if (len != i) {
1707                         fprintf(out,
1708                                 "Bad count in 3DSTATE_LOAD_STATE_IMMEDIATE_2\n");
1709                 }
1710                 return len;
1711         case 0x00:
1712                 instr_out(data, hw_offset, 0, "3DSTATE_MAP_STATE\n");
1713                 len = (data[0] & 0x0000003f) + 2;
1714                 instr_out(data, hw_offset, 1, "mask\n");
1715
1716                 i = 2;
1717                 for (map = 0; map <= 15; map++) {
1718                         if (data[1] & (1 << map)) {
1719                                 int width, height, pitch, dword;
1720                                 const char *tiling;
1721
1722                                 if (i + 3 >= count)
1723                                         BUFFER_FAIL(count, len,
1724                                                     "3DSTATE_MAP_STATE");
1725
1726                                 dword = data[i];
1727                                 instr_out(data, hw_offset, i++,
1728                                           "map %d MS2 %s%s%s\n", map,
1729                                           dword & (1 << 31) ?
1730                                           "untrusted surface, " : "",
1731                                           dword & (1 << 1) ?
1732                                           "vertical line stride enable, " : "",
1733                                           dword & (1 << 0) ?
1734                                           "vertical ofs enable, " : "");
1735
1736                                 dword = data[i];
1737                                 width = ((dword >> 10) & ((1 << 11) - 1)) + 1;
1738                                 height = ((dword >> 21) & ((1 << 11) - 1)) + 1;
1739
1740                                 tiling = "none";
1741                                 if (dword & (1 << 2))
1742                                         tiling = "fenced";
1743                                 else if (dword & (1 << 1))
1744                                         tiling = dword & (1 << 0) ? "Y" : "X";
1745                                 type = " BAD";
1746                                 format = "BAD";
1747                                 switch ((dword >> 7) & 0x7) {
1748                                 case 1:
1749                                         type = "8b";
1750                                         switch ((dword >> 3) & 0xf) {
1751                                         case 0:
1752                                                 format = "I";
1753                                                 break;
1754                                         case 1:
1755                                                 format = "L";
1756                                                 break;
1757                                         case 4:
1758                                                 format = "A";
1759                                                 break;
1760                                         case 5:
1761                                                 format = " mono";
1762                                                 break;
1763                                         }
1764                                         break;
1765                                 case 2:
1766                                         type = "16b";
1767                                         switch ((dword >> 3) & 0xf) {
1768                                         case 0:
1769                                                 format = " rgb565";
1770                                                 break;
1771                                         case 1:
1772                                                 format = " argb1555";
1773                                                 break;
1774                                         case 2:
1775                                                 format = " argb4444";
1776                                                 break;
1777                                         case 5:
1778                                                 format = " ay88";
1779                                                 break;
1780                                         case 6:
1781                                                 format = " bump655";
1782                                                 break;
1783                                         case 7:
1784                                                 format = "I";
1785                                                 break;
1786                                         case 8:
1787                                                 format = "L";
1788                                                 break;
1789                                         case 9:
1790                                                 format = "A";
1791                                                 break;
1792                                         }
1793                                         break;
1794                                 case 3:
1795                                         type = "32b";
1796                                         switch ((dword >> 3) & 0xf) {
1797                                         case 0:
1798                                                 format = " argb8888";
1799                                                 break;
1800                                         case 1:
1801                                                 format = " abgr8888";
1802                                                 break;
1803                                         case 2:
1804                                                 format = " xrgb8888";
1805                                                 break;
1806                                         case 3:
1807                                                 format = " xbgr8888";
1808                                                 break;
1809                                         case 4:
1810                                                 format = " qwvu8888";
1811                                                 break;
1812                                         case 5:
1813                                                 format = " axvu8888";
1814                                                 break;
1815                                         case 6:
1816                                                 format = " lxvu8888";
1817                                                 break;
1818                                         case 7:
1819                                                 format = " xlvu8888";
1820                                                 break;
1821                                         case 8:
1822                                                 format = " argb2101010";
1823                                                 break;
1824                                         case 9:
1825                                                 format = " abgr2101010";
1826                                                 break;
1827                                         case 10:
1828                                                 format = " awvu2101010";
1829                                                 break;
1830                                         case 11:
1831                                                 format = " gr1616";
1832                                                 break;
1833                                         case 12:
1834                                                 format = " vu1616";
1835                                                 break;
1836                                         case 13:
1837                                                 format = " xI824";
1838                                                 break;
1839                                         case 14:
1840                                                 format = " xA824";
1841                                                 break;
1842                                         case 15:
1843                                                 format = " xL824";
1844                                                 break;
1845                                         }
1846                                         break;
1847                                 case 5:
1848                                         type = "422";
1849                                         switch ((dword >> 3) & 0xf) {
1850                                         case 0:
1851                                                 format = " yuv_swapy";
1852                                                 break;
1853                                         case 1:
1854                                                 format = " yuv";
1855                                                 break;
1856                                         case 2:
1857                                                 format = " yuv_swapuv";
1858                                                 break;
1859                                         case 3:
1860                                                 format = " yuv_swapuvy";
1861                                                 break;
1862                                         }
1863                                         break;
1864                                 case 6:
1865                                         type = "compressed";
1866                                         switch ((dword >> 3) & 0x7) {
1867                                         case 0:
1868                                                 format = " dxt1";
1869                                                 break;
1870                                         case 1:
1871                                                 format = " dxt2_3";
1872                                                 break;
1873                                         case 2:
1874                                                 format = " dxt4_5";
1875                                                 break;
1876                                         case 3:
1877                                                 format = " fxt1";
1878                                                 break;
1879                                         case 4:
1880                                                 format = " dxt1_rb";
1881                                                 break;
1882                                         }
1883                                         break;
1884                                 case 7:
1885                                         type = "4b indexed";
1886                                         switch ((dword >> 3) & 0xf) {
1887                                         case 7:
1888                                                 format = " argb8888";
1889                                                 break;
1890                                         }
1891                                         break;
1892                                 }
1893                                 dword = data[i];
1894                                 instr_out(data, hw_offset, i++,
1895                                           "map %d MS3 [width=%d, height=%d, format=%s%s, tiling=%s%s]\n",
1896                                           map, width, height, type, format,
1897                                           tiling,
1898                                           dword & (1 << 9) ? " palette select" :
1899                                           "");
1900
1901                                 dword = data[i];
1902                                 pitch =
1903                                     4 * (((dword >> 21) & ((1 << 11) - 1)) + 1);
1904                                 instr_out(data, hw_offset, i++,
1905                                           "map %d MS4 [pitch=%d, max_lod=%i, vol_depth=%i, cube_face_ena=%x, %s]\n",
1906                                           map, pitch, (dword >> 9) & 0x3f,
1907                                           dword & 0xff, (dword >> 15) & 0x3f,
1908                                           dword & (1 << 8) ? "miplayout legacy"
1909                                           : "miplayout right");
1910                         }
1911                 }
1912                 if (len != i) {
1913                         fprintf(out, "Bad count in 3DSTATE_MAP_STATE\n");
1914                         return len;
1915                 }
1916                 return len;
1917         case 0x06:
1918                 instr_out(data, hw_offset, 0,
1919                           "3DSTATE_PIXEL_SHADER_CONSTANTS\n");
1920                 len = (data[0] & 0x000000ff) + 2;
1921
1922                 i = 2;
1923                 for (c = 0; c <= 31; c++) {
1924                         if (data[1] & (1 << c)) {
1925                                 if (i + 4 >= count)
1926                                         BUFFER_FAIL(count, len,
1927                                                     "3DSTATE_PIXEL_SHADER_CONSTANTS");
1928                                 instr_out(data, hw_offset, i, "C%d.X = %f\n", c,
1929                                           int_as_float(data[i]));
1930                                 i++;
1931                                 instr_out(data, hw_offset, i, "C%d.Y = %f\n",
1932                                           c, int_as_float(data[i]));
1933                                 i++;
1934                                 instr_out(data, hw_offset, i, "C%d.Z = %f\n",
1935                                           c, int_as_float(data[i]));
1936                                 i++;
1937                                 instr_out(data, hw_offset, i, "C%d.W = %f\n",
1938                                           c, int_as_float(data[i]));
1939                                 i++;
1940                         }
1941                 }
1942                 if (len != i) {
1943                         fprintf(out,
1944                                 "Bad count in 3DSTATE_PIXEL_SHADER_CONSTANTS\n");
1945                 }
1946                 return len;
1947         case 0x05:
1948                 instr_out(data, hw_offset, 0, "3DSTATE_PIXEL_SHADER_PROGRAM\n");
1949                 len = (data[0] & 0x000000ff) + 2;
1950                 if ((len - 1) % 3 != 0 || len > 370) {
1951                         fprintf(out,
1952                                 "Bad count in 3DSTATE_PIXEL_SHADER_PROGRAM\n");
1953                 }
1954                 i = 1;
1955                 for (instr = 0; instr < (len - 1) / 3; instr++) {
1956                         char instr_prefix[10];
1957
1958                         if (i + 3 >= count)
1959                                 BUFFER_FAIL(count, len,
1960                                             "3DSTATE_PIXEL_SHADER_PROGRAM");
1961                         sprintf(instr_prefix, "PS%03d", instr);
1962                         i915_decode_instruction(data, hw_offset, i,
1963                                                 instr_prefix);
1964                         i += 3;
1965                 }
1966                 return len;
1967         case 0x01:
1968                 if (IS_GEN2(devid))
1969                         break;
1970                 instr_out(data, hw_offset, 0, "3DSTATE_SAMPLER_STATE\n");
1971                 instr_out(data, hw_offset, 1, "mask\n");
1972                 len = (data[0] & 0x0000003f) + 2;
1973                 i = 2;
1974                 for (sampler = 0; sampler <= 15; sampler++) {
1975                         if (data[1] & (1 << sampler)) {
1976                                 uint32_t dword;
1977                                 const char *mip_filter = "";
1978                                 if (i + 3 >= count)
1979                                         BUFFER_FAIL(count, len,
1980                                                     "3DSTATE_SAMPLER_STATE");
1981                                 dword = data[i];
1982                                 switch ((dword >> 20) & 0x3) {
1983                                 case 0:
1984                                         mip_filter = "none";
1985                                         break;
1986                                 case 1:
1987                                         mip_filter = "nearest";
1988                                         break;
1989                                 case 3:
1990                                         mip_filter = "linear";
1991                                         break;
1992                                 }
1993                                 instr_out(data, hw_offset, i++,
1994                                           "sampler %d SS2:%s%s%s "
1995                                           "base_mip_level=%i, mip_filter=%s, mag_filter=%s, min_filter=%s "
1996                                           "lod_bias=%.2f,%s max_aniso=%i, shadow_func=%s\n",
1997                                           sampler,
1998                                           dword & (1 << 31) ? " reverse gamma,"
1999                                           : "",
2000                                           dword & (1 << 30) ? " packed2planar,"
2001                                           : "",
2002                                           dword & (1 << 29) ?
2003                                           " colorspace conversion," : "",
2004                                           (dword >> 22) & 0x1f, mip_filter,
2005                                           decode_sample_filter(dword >> 17),
2006                                           decode_sample_filter(dword >> 14),
2007                                           ((dword >> 5) & 0x1ff) / (0x10 * 1.0),
2008                                           dword & (1 << 4) ? " shadow," : "",
2009                                           dword & (1 << 3) ? 4 : 2,
2010                                           decode_compare_func(dword));
2011                                 dword = data[i];
2012                                 instr_out(data, hw_offset, i++,
2013                                           "sampler %d SS3: min_lod=%.2f,%s "
2014                                           "tcmode_x=%s, tcmode_y=%s, tcmode_z=%s,%s texmap_idx=%i,%s\n",
2015                                           sampler,
2016                                           ((dword >> 24) & 0xff) / (0x10 * 1.0),
2017                                           dword & (1 << 17) ?
2018                                           " kill pixel enable," : "",
2019                                           decode_tex_coord_mode(dword >> 12),
2020                                           decode_tex_coord_mode(dword >> 9),
2021                                           decode_tex_coord_mode(dword >> 6),
2022                                           dword & (1 << 5) ?
2023                                           " normalized coords," : "",
2024                                           (dword >> 1) & 0xf,
2025                                           dword & (1 << 0) ? " deinterlacer," :
2026                                           "");
2027                                 dword = data[i];
2028                                 instr_out(data, hw_offset, i++,
2029                                           "sampler %d SS4: border color\n",
2030                                           sampler);
2031                         }
2032                 }
2033                 if (len != i) {
2034                         fprintf(out, "Bad count in 3DSTATE_SAMPLER_STATE\n");
2035                 }
2036                 return len;
2037         case 0x85:
2038                 len = (data[0] & 0x0000000f) + 2;
2039
2040                 if (len != 2)
2041                         fprintf(out,
2042                                 "Bad count in 3DSTATE_DEST_BUFFER_VARIABLES\n");
2043                 if (count < 2)
2044                         BUFFER_FAIL(count, len,
2045                                     "3DSTATE_DEST_BUFFER_VARIABLES");
2046
2047                 instr_out(data, hw_offset, 0,
2048                           "3DSTATE_DEST_BUFFER_VARIABLES\n");
2049
2050                 switch ((data[1] >> 8) & 0xf) {
2051                 case 0x0:
2052                         format = "g8";
2053                         break;
2054                 case 0x1:
2055                         format = "x1r5g5b5";
2056                         break;
2057                 case 0x2:
2058                         format = "r5g6b5";
2059                         break;
2060                 case 0x3:
2061                         format = "a8r8g8b8";
2062                         break;
2063                 case 0x4:
2064                         format = "ycrcb_swapy";
2065                         break;
2066                 case 0x5:
2067                         format = "ycrcb_normal";
2068                         break;
2069                 case 0x6:
2070                         format = "ycrcb_swapuv";
2071                         break;
2072                 case 0x7:
2073                         format = "ycrcb_swapuvy";
2074                         break;
2075                 case 0x8:
2076                         format = "a4r4g4b4";
2077                         break;
2078                 case 0x9:
2079                         format = "a1r5g5b5";
2080                         break;
2081                 case 0xa:
2082                         format = "a2r10g10b10";
2083                         break;
2084                 default:
2085                         format = "BAD";
2086                         break;
2087                 }
2088                 switch ((data[1] >> 2) & 0x3) {
2089                 case 0x0:
2090                         zformat = "u16";
2091                         break;
2092                 case 0x1:
2093                         zformat = "f16";
2094                         break;
2095                 case 0x2:
2096                         zformat = "u24x8";
2097                         break;
2098                 default:
2099                         zformat = "BAD";
2100                         break;
2101                 }
2102                 instr_out(data, hw_offset, 1,
2103                           "%s format, %s depth format, early Z %sabled\n",
2104                           format, zformat,
2105                           (data[1] & (1 << 31)) ? "en" : "dis");
2106                 return len;
2107
2108         case 0x8e:
2109                 {
2110                         const char *name, *tiling;
2111
2112                         len = (data[0] & 0x0000000f) + 2;
2113                         if (len != 3)
2114                                 fprintf(out,
2115                                         "Bad count in 3DSTATE_BUFFER_INFO\n");
2116                         if (count < 3)
2117                                 BUFFER_FAIL(count, len, "3DSTATE_BUFFER_INFO");
2118
2119                         switch ((data[1] >> 24) & 0x7) {
2120                         case 0x3:
2121                                 name = "color";
2122                                 break;
2123                         case 0x7:
2124                                 name = "depth";
2125                                 break;
2126                         default:
2127                                 name = "unknown";
2128                                 break;
2129                         }
2130
2131                         tiling = "none";
2132                         if (data[1] & (1 << 23))
2133                                 tiling = "fenced";
2134                         else if (data[1] & (1 << 22))
2135                                 tiling = data[1] & (1 << 21) ? "Y" : "X";
2136
2137                         instr_out(data, hw_offset, 0, "3DSTATE_BUFFER_INFO\n");
2138                         instr_out(data, hw_offset, 1,
2139                                   "%s, tiling = %s, pitch=%d\n", name, tiling,
2140                                   data[1] & 0xffff);
2141
2142                         instr_out(data, hw_offset, 2, "address\n");
2143                         return len;
2144                 }
2145         case 0x81:
2146                 len = (data[0] & 0x0000000f) + 2;
2147
2148                 if (len != 3)
2149                         fprintf(out,
2150                                 "Bad count in 3DSTATE_SCISSOR_RECTANGLE\n");
2151                 if (count < 3)
2152                         BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_RECTANGLE");
2153
2154                 instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_RECTANGLE\n");
2155                 instr_out(data, hw_offset, 1, "(%d,%d)\n",
2156                           data[1] & 0xffff, data[1] >> 16);
2157                 instr_out(data, hw_offset, 2, "(%d,%d)\n",
2158                           data[2] & 0xffff, data[2] >> 16);
2159
2160                 return len;
2161         case 0x80:
2162                 len = (data[0] & 0x0000000f) + 2;
2163
2164                 if (len != 5)
2165                         fprintf(out,
2166                                 "Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
2167                 if (count < 5)
2168                         BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
2169
2170                 instr_out(data, hw_offset, 0, "3DSTATE_DRAWING_RECTANGLE\n");
2171                 instr_out(data, hw_offset, 1, "%s\n",
2172                           data[1] & (1 << 30) ? "depth ofs disabled " : "");
2173                 instr_out(data, hw_offset, 2, "(%d,%d)\n",
2174                           data[2] & 0xffff, data[2] >> 16);
2175                 instr_out(data, hw_offset, 3, "(%d,%d)\n",
2176                           data[3] & 0xffff, data[3] >> 16);
2177                 instr_out(data, hw_offset, 4, "(%d,%d)\n",
2178                           data[4] & 0xffff, data[4] >> 16);
2179
2180                 return len;
2181         case 0x9c:
2182                 len = (data[0] & 0x0000000f) + 2;
2183
2184                 if (len != 7)
2185                         fprintf(out, "Bad count in 3DSTATE_CLEAR_PARAMETERS\n");
2186                 if (count < 7)
2187                         BUFFER_FAIL(count, len, "3DSTATE_CLEAR_PARAMETERS");
2188
2189                 instr_out(data, hw_offset, 0, "3DSTATE_CLEAR_PARAMETERS\n");
2190                 instr_out(data, hw_offset, 1, "prim_type=%s, clear=%s%s%s\n",
2191                           data[1] & (1 << 16) ? "CLEAR_RECT" : "ZONE_INIT",
2192                           data[1] & (1 << 2) ? "color," : "",
2193                           data[1] & (1 << 1) ? "depth," : "",
2194                           data[1] & (1 << 0) ? "stencil," : "");
2195                 instr_out(data, hw_offset, 2, "clear color\n");
2196                 instr_out(data, hw_offset, 3, "clear depth/stencil\n");
2197                 instr_out(data, hw_offset, 4, "color value (rgba8888)\n");
2198                 instr_out(data, hw_offset, 5, "depth value %f\n",
2199                           int_as_float(data[5]));
2200                 instr_out(data, hw_offset, 6, "clear stencil\n");
2201                 return len;
2202         }
2203
2204         for (idx = 0; idx < ARRAY_SIZE(opcodes_3d_1d); idx++) {
2205                 opcode_3d_1d = &opcodes_3d_1d[idx];
2206                 if (opcode_3d_1d->i830_only && !IS_GEN2(devid))
2207                         continue;
2208
2209                 if (((data[0] & 0x00ff0000) >> 16) == opcode_3d_1d->opcode) {
2210                         len = 1;
2211
2212                         instr_out(data, hw_offset, 0, "%s\n",
2213                                   opcode_3d_1d->name);
2214                         if (opcode_3d_1d->max_len > 1) {
2215                                 len = (data[0] & 0x0000ffff) + 2;
2216                                 if (len < opcode_3d_1d->min_len ||
2217                                     len > opcode_3d_1d->max_len) {
2218                                         fprintf(out, "Bad count in %s\n",
2219                                                 opcode_3d_1d->name);
2220                                 }
2221                         }
2222
2223                         for (i = 1; i < len; i++) {
2224                                 if (i >= count)
2225                                         BUFFER_FAIL(count, len,
2226                                                     opcode_3d_1d->name);
2227                                 instr_out(data, hw_offset, i, "dword %d\n", i);
2228                         }
2229
2230                         return len;
2231                 }
2232         }
2233
2234         instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_1d opcode = 0x%x\n",
2235                   opcode);
2236         return 1;
2237 }
2238
2239 static int
2240 decode_3d_primitive(uint32_t *data, uint32_t count, uint32_t hw_offset)
2241 {
2242         char immediate = (data[0] & (1 << 23)) == 0;
2243         unsigned int len, i, j, ret;
2244         const char *primtype;
2245         int original_s2 = saved_s2;
2246         int original_s4 = saved_s4;
2247
2248         switch ((data[0] >> 18) & 0xf) {
2249         case 0x0:
2250                 primtype = "TRILIST";
2251                 break;
2252         case 0x1:
2253                 primtype = "TRISTRIP";
2254                 break;
2255         case 0x2:
2256                 primtype = "TRISTRIP_REVERSE";
2257                 break;
2258         case 0x3:
2259                 primtype = "TRIFAN";
2260                 break;
2261         case 0x4:
2262                 primtype = "POLYGON";
2263                 break;
2264         case 0x5:
2265                 primtype = "LINELIST";
2266                 break;
2267         case 0x6:
2268                 primtype = "LINESTRIP";
2269                 break;
2270         case 0x7:
2271                 primtype = "RECTLIST";
2272                 break;
2273         case 0x8:
2274                 primtype = "POINTLIST";
2275                 break;
2276         case 0x9:
2277                 primtype = "DIB";
2278                 break;
2279         case 0xa:
2280                 primtype = "CLEAR_RECT";
2281                 saved_s4 = 3 << 6;
2282                 saved_s2 = ~0;
2283                 break;
2284         default:
2285                 primtype = "unknown";
2286                 break;
2287         }
2288
2289         /* XXX: 3DPRIM_DIB not supported */
2290         if (immediate) {
2291                 len = (data[0] & 0x0003ffff) + 2;
2292                 instr_out(data, hw_offset, 0, "3DPRIMITIVE inline %s\n",
2293                           primtype);
2294                 if (count < len)
2295                         BUFFER_FAIL(count, len, "3DPRIMITIVE inline");
2296                 if (!saved_s2_set || !saved_s4_set) {
2297                         fprintf(out, "unknown vertex format\n");
2298                         for (i = 1; i < len; i++) {
2299                                 instr_out(data, hw_offset, i,
2300                                           "           vertex data (%f float)\n",
2301                                           int_as_float(data[i]));
2302                         }
2303                 } else {
2304                         unsigned int vertex = 0;
2305                         for (i = 1; i < len;) {
2306                                 unsigned int tc;
2307
2308 #define VERTEX_OUT(fmt, ...) do {                                       \
2309     if (i < len)                                                        \
2310         instr_out(data, hw_offset, i, " V%d."fmt"\n", vertex, __VA_ARGS__); \
2311     else                                                                \
2312         fprintf(out, " missing data in V%d\n", vertex);                 \
2313     i++;                                                                \
2314 } while (0)
2315
2316                                 VERTEX_OUT("X = %f", int_as_float(data[i]));
2317                                 VERTEX_OUT("Y = %f", int_as_float(data[i]));
2318                                 switch (saved_s4 >> 6 & 0x7) {
2319                                 case 0x1:
2320                                         VERTEX_OUT("Z = %f",
2321                                                    int_as_float(data[i]));
2322                                         break;
2323                                 case 0x2:
2324                                         VERTEX_OUT("Z = %f",
2325                                                    int_as_float(data[i]));
2326                                         VERTEX_OUT("W = %f",
2327                                                    int_as_float(data[i]));
2328                                         break;
2329                                 case 0x3:
2330                                         break;
2331                                 case 0x4:
2332                                         VERTEX_OUT("W = %f",
2333                                                    int_as_float(data[i]));
2334                                         break;
2335                                 default:
2336                                         fprintf(out, "bad S4 position mask\n");
2337                                 }
2338
2339                                 if (saved_s4 & (1 << 10)) {
2340                                         VERTEX_OUT
2341                                             ("color = (A=0x%02x, R=0x%02x, G=0x%02x, "
2342                                              "B=0x%02x)", data[i] >> 24,
2343                                              (data[i] >> 16) & 0xff,
2344                                              (data[i] >> 8) & 0xff,
2345                                              data[i] & 0xff);
2346                                 }
2347                                 if (saved_s4 & (1 << 11)) {
2348                                         VERTEX_OUT
2349                                             ("spec = (A=0x%02x, R=0x%02x, G=0x%02x, "
2350                                              "B=0x%02x)", data[i] >> 24,
2351                                              (data[i] >> 16) & 0xff,
2352                                              (data[i] >> 8) & 0xff,
2353                                              data[i] & 0xff);
2354                                 }
2355                                 if (saved_s4 & (1 << 12))
2356                                         VERTEX_OUT("width = 0x%08x)", data[i]);
2357
2358                                 for (tc = 0; tc <= 7; tc++) {
2359                                         switch ((saved_s2 >> (tc * 4)) & 0xf) {
2360                                         case 0x0:
2361                                                 VERTEX_OUT("T%d.X = %f", tc,
2362                                                            int_as_float(data
2363                                                                         [i]));
2364                                                 VERTEX_OUT("T%d.Y = %f", tc,
2365                                                            int_as_float(data
2366                                                                         [i]));
2367                                                 break;
2368                                         case 0x1:
2369                                                 VERTEX_OUT("T%d.X = %f", tc,
2370                                                            int_as_float(data
2371                                                                         [i]));
2372                                                 VERTEX_OUT("T%d.Y = %f", tc,
2373                                                            int_as_float(data
2374                                                                         [i]));
2375                                                 VERTEX_OUT("T%d.Z = %f", tc,
2376                                                            int_as_float(data
2377                                                                         [i]));
2378                                                 break;
2379                                         case 0x2:
2380                                                 VERTEX_OUT("T%d.X = %f", tc,
2381                                                            int_as_float(data
2382                                                                         [i]));
2383                                                 VERTEX_OUT("T%d.Y = %f", tc,
2384                                                            int_as_float(data
2385                                                                         [i]));
2386                                                 VERTEX_OUT("T%d.Z = %f", tc,
2387                                                            int_as_float(data
2388                                                                         [i]));
2389                                                 VERTEX_OUT("T%d.W = %f", tc,
2390                                                            int_as_float(data
2391                                                                         [i]));
2392                                                 break;
2393                                         case 0x3:
2394                                                 VERTEX_OUT("T%d.X = %f", tc,
2395                                                            int_as_float(data
2396                                                                         [i]));
2397                                                 break;
2398                                         case 0x4:
2399                                                 VERTEX_OUT
2400                                                     ("T%d.XY = 0x%08x half-float",
2401                                                      tc, data[i]);
2402                                                 break;
2403                                         case 0x5:
2404                                                 VERTEX_OUT
2405                                                     ("T%d.XY = 0x%08x half-float",
2406                                                      tc, data[i]);
2407                                                 VERTEX_OUT
2408                                                     ("T%d.ZW = 0x%08x half-float",
2409                                                      tc, data[i]);
2410                                                 break;
2411                                         case 0xf:
2412                                                 break;
2413                                         default:
2414                                                 fprintf(out,
2415                                                         "bad S2.T%d format\n",
2416                                                         tc);
2417                                         }
2418                                 }
2419                                 vertex++;
2420                         }
2421                 }
2422
2423                 ret = len;
2424         } else {
2425                 /* indirect vertices */
2426                 len = data[0] & 0x0000ffff;     /* index count */
2427                 if (data[0] & (1 << 17)) {
2428                         /* random vertex access */
2429                         if (count < (len + 1) / 2 + 1) {
2430                                 BUFFER_FAIL(count, (len + 1) / 2 + 1,
2431                                             "3DPRIMITIVE random indirect");
2432                         }
2433                         instr_out(data, hw_offset, 0,
2434                                   "3DPRIMITIVE random indirect %s (%d)\n",
2435                                   primtype, len);
2436                         if (len == 0) {
2437                                 /* vertex indices continue until 0xffff is
2438                                  * found
2439                                  */
2440                                 for (i = 1; i < count; i++) {
2441                                         if ((data[i] & 0xffff) == 0xffff) {
2442                                                 instr_out(data, hw_offset, i,
2443                                                           "    indices: (terminator)\n");
2444                                                 ret = i;
2445                                                 goto out;
2446                                         } else if ((data[i] >> 16) == 0xffff) {
2447                                                 instr_out(data, hw_offset, i,
2448                                                           "    indices: 0x%04x, (terminator)\n",
2449                                                           data[i] & 0xffff);
2450                                                 ret = i;
2451                                                 goto out;
2452                                         } else {
2453                                                 instr_out(data, hw_offset, i,
2454                                                           "    indices: 0x%04x, 0x%04x\n",
2455                                                           data[i] & 0xffff,
2456                                                           data[i] >> 16);
2457                                         }
2458                                 }
2459                                 fprintf(out,
2460                                         "3DPRIMITIVE: no terminator found in index buffer\n");
2461                                 ret = count;
2462                                 goto out;
2463                         } else {
2464                                 /* fixed size vertex index buffer */
2465                                 for (j = 1, i = 0; i < len; i += 2, j++) {
2466                                         if (i * 2 == len - 1) {
2467                                                 instr_out(data, hw_offset, j,
2468                                                           "    indices: 0x%04x\n",
2469                                                           data[j] & 0xffff);
2470                                         } else {
2471                                                 instr_out(data, hw_offset, j,
2472                                                           "    indices: 0x%04x, 0x%04x\n",
2473                                                           data[j] & 0xffff,
2474                                                           data[j] >> 16);
2475                                         }
2476                                 }
2477                         }
2478                         ret = (len + 1) / 2 + 1;
2479                         goto out;
2480                 } else {
2481                         /* sequential vertex access */
2482                         if (count < 2)
2483                                 BUFFER_FAIL(count, 2,
2484                                             "3DPRIMITIVE seq indirect");
2485                         instr_out(data, hw_offset, 0,
2486                                   "3DPRIMITIVE sequential indirect %s, %d starting from "
2487                                   "%d\n", primtype, len, data[1] & 0xffff);
2488                         instr_out(data, hw_offset, 1, "           start\n");
2489                         ret = 2;
2490                         goto out;
2491                 }
2492         }
2493
2494 out:
2495         saved_s2 = original_s2;
2496         saved_s4 = original_s4;
2497         return ret;
2498 }
2499
2500 static int
2501 decode_3d(uint32_t *data, uint32_t count, uint32_t hw_offset, uint32_t devid)
2502 {
2503         uint32_t opcode;
2504         unsigned int idx;
2505
2506         struct {
2507                 uint32_t opcode;
2508                 unsigned int min_len;
2509                 unsigned int max_len;
2510                 const char *name;
2511         } opcodes_3d[] = {
2512                 { 0x06, 1, 1, "3DSTATE_ANTI_ALIASING" },
2513                 { 0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS" },
2514                 { 0x09, 1, 1, "3DSTATE_BACKFACE_STENCIL_MASKS" },
2515                 { 0x16, 1, 1, "3DSTATE_COORD_SET_BINDINGS" },
2516                 { 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
2517                 { 0x0b, 1, 1, "3DSTATE_INDEPENDENT_ALPHA_BLEND" },
2518                 { 0x0d, 1, 1, "3DSTATE_MODES_4" },
2519                 { 0x0c, 1, 1, "3DSTATE_MODES_5" },
2520                 { 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES"},
2521         }, *opcode_3d;
2522
2523         opcode = (data[0] & 0x1f000000) >> 24;
2524
2525         switch (opcode) {
2526         case 0x1f:
2527                 return decode_3d_primitive(data, count, hw_offset);
2528         case 0x1d:
2529                 return decode_3d_1d(data, count, hw_offset, devid);
2530         case 0x1c:
2531                 return decode_3d_1c(data, count, hw_offset);
2532         }
2533
2534         for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
2535                 opcode_3d = &opcodes_3d[idx];
2536                 if (opcode == opcode_3d->opcode) {
2537                         unsigned int len = 1, i;
2538
2539                         instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
2540                         if (opcode_3d->max_len > 1) {
2541                                 len = (data[0] & 0xff) + 2;
2542                                 if (len < opcode_3d->min_len ||
2543                                     len > opcode_3d->max_len) {
2544                                         fprintf(out, "Bad count in %s\n",
2545                                                 opcode_3d->name);
2546                                 }
2547                         }
2548
2549                         for (i = 1; i < len; i++) {
2550                                 if (i >= count)
2551                                         BUFFER_FAIL(count, len,
2552                                                     opcode_3d->name);
2553                                 instr_out(data, hw_offset, i, "dword %d\n", i);
2554                         }
2555                         return len;
2556                 }
2557         }
2558
2559         instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d opcode = 0x%x\n", opcode);
2560         return 1;
2561 }
2562
2563 static const char *get_965_surfacetype(unsigned int surfacetype)
2564 {
2565         switch (surfacetype) {
2566         case 0:
2567                 return "1D";
2568         case 1:
2569                 return "2D";
2570         case 2:
2571                 return "3D";
2572         case 3:
2573                 return "CUBE";
2574         case 4:
2575                 return "BUFFER";
2576         case 7:
2577                 return "NULL";
2578         default:
2579                 return "unknown";
2580         }
2581 }
2582
2583 static const char *get_965_depthformat(unsigned int depthformat)
2584 {
2585         switch (depthformat) {
2586         case 0:
2587                 return "s8_z24float";
2588         case 1:
2589                 return "z32float";
2590         case 2:
2591                 return "z24s8";
2592         case 5:
2593                 return "z16";
2594         default:
2595                 return "unknown";
2596         }
2597 }
2598
2599 static const char *get_965_element_component(uint32_t data, int component)
2600 {
2601         uint32_t component_control = (data >> (16 + (3 - component) * 4)) & 0x7;
2602
2603         switch (component_control) {
2604         case 0:
2605                 return "nostore";
2606         case 1:
2607                 switch (component) {
2608                 case 0:
2609                         return "X";
2610                 case 1:
2611                         return "Y";
2612                 case 2:
2613                         return "Z";
2614                 case 3:
2615                         return "W";
2616                 default:
2617                         return "fail";
2618                 }
2619         case 2:
2620                 return "0.0";
2621         case 3:
2622                 return "1.0";
2623         case 4:
2624                 return "0x1";
2625         case 5:
2626                 return "VID";
2627         default:
2628                 return "fail";
2629         }
2630 }
2631
2632 static const char *get_965_prim_type(uint32_t data)
2633 {
2634         uint32_t primtype = (data >> 10) & 0x1f;
2635
2636         switch (primtype) {
2637         case 0x01:
2638                 return "point list";
2639         case 0x02:
2640                 return "line list";
2641         case 0x03:
2642                 return "line strip";
2643         case 0x04:
2644                 return "tri list";
2645         case 0x05:
2646                 return "tri strip";
2647         case 0x06:
2648                 return "tri fan";
2649         case 0x07:
2650                 return "quad list";
2651         case 0x08:
2652                 return "quad strip";
2653         case 0x09:
2654                 return "line list adj";
2655         case 0x0a:
2656                 return "line strip adj";
2657         case 0x0b:
2658                 return "tri list adj";
2659         case 0x0c:
2660                 return "tri strip adj";
2661         case 0x0d:
2662                 return "tri strip reverse";
2663         case 0x0e:
2664                 return "polygon";
2665         case 0x0f:
2666                 return "rect list";
2667         case 0x10:
2668                 return "line loop";
2669         case 0x11:
2670                 return "point list bf";
2671         case 0x12:
2672                 return "line strip cont";
2673         case 0x13:
2674                 return "line strip bf";
2675         case 0x14:
2676                 return "line strip cont bf";
2677         case 0x15:
2678                 return "tri fan no stipple";
2679         default:
2680                 return "fail";
2681         }
2682 }
2683
2684 static int
2685 i965_decode_urb_fence(uint32_t *data, uint32_t hw_offset, int len,
2686                       uint32_t count)
2687 {
2688         uint32_t vs_fence, clip_fence, gs_fence, sf_fence, vfe_fence, cs_fence;
2689
2690         if (len != 3)
2691                 fprintf(out, "Bad count in URB_FENCE\n");
2692         if (count < 3)
2693                 BUFFER_FAIL(count, len, "URB_FENCE");
2694
2695         vs_fence = data[1] & 0x3ff;
2696         gs_fence = (data[1] >> 10) & 0x3ff;
2697         clip_fence = (data[1] >> 20) & 0x3ff;
2698         sf_fence = data[2] & 0x3ff;
2699         vfe_fence = (data[2] >> 10) & 0x3ff;
2700         cs_fence = (data[2] >> 20) & 0x7ff;
2701
2702         instr_out(data, hw_offset, 0, "URB_FENCE: %s%s%s%s%s%s\n",
2703                   (data[0] >> 13) & 1 ? "cs " : "",
2704                   (data[0] >> 12) & 1 ? "vfe " : "",
2705                   (data[0] >> 11) & 1 ? "sf " : "",
2706                   (data[0] >> 10) & 1 ? "clip " : "",
2707                   (data[0] >> 9) & 1 ? "gs " : "",
2708                   (data[0] >> 8) & 1 ? "vs " : "");
2709         instr_out(data, hw_offset, 1,
2710                   "vs fence: %d, clip_fence: %d, gs_fence: %d\n",
2711                   vs_fence, clip_fence, gs_fence);
2712         instr_out(data, hw_offset, 2,
2713                   "sf fence: %d, vfe_fence: %d, cs_fence: %d\n",
2714                   sf_fence, vfe_fence, cs_fence);
2715         if (gs_fence < vs_fence)
2716                 fprintf(out, "gs fence < vs fence!\n");
2717         if (clip_fence < gs_fence)
2718                 fprintf(out, "clip fence < gs fence!\n");
2719         if (sf_fence < clip_fence)
2720                 fprintf(out, "sf fence < clip fence!\n");
2721         if (cs_fence < sf_fence)
2722                 fprintf(out, "cs fence < sf fence!\n");
2723
2724         return len;
2725 }
2726
2727 static void
2728 state_base_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
2729                const char *name)
2730 {
2731         if (data[index] & 1) {
2732                 instr_out(data, hw_offset, index,
2733                           "%s state base address 0x%08x\n", name,
2734                           data[index] & ~1);
2735         } else {
2736                 instr_out(data, hw_offset, index, "%s state base not updated\n",
2737                           name);
2738         }
2739 }
2740
2741 static void
2742 state_max_out(uint32_t *data, uint32_t hw_offset, unsigned int index,
2743               const char *name)
2744 {
2745         if (data[index] & 1) {
2746                 if (data[index] == 1) {
2747                         instr_out(data, hw_offset, index,
2748                                   "%s state upper bound disabled\n", name);
2749                 } else {
2750                         instr_out(data, hw_offset, index,
2751                                   "%s state upper bound 0x%08x\n", name,
2752                                   data[index] & ~1);
2753                 }
2754         } else {
2755                 instr_out(data, hw_offset, index,
2756                           "%s state upper bound not updated\n", name);
2757         }
2758 }
2759
2760 static int
2761 decode_3d_965(uint32_t *data, uint32_t count, uint32_t hw_offset,
2762               uint32_t devid)
2763 {
2764         uint32_t opcode;
2765         unsigned int idx, len;
2766         unsigned int i, j, sba_len;
2767         const char *desc1 = NULL;
2768
2769         struct {
2770                 uint32_t opcode;
2771                 int unsigned min_len;
2772                 int unsigned max_len;
2773                 const char *name;
2774         } opcodes_3d[] = {
2775                 { 0x6000, 3, 3, "URB_FENCE" },
2776                 { 0x6001, 2, 2, "CS_URB_STATE" },
2777                 { 0x6002, 2, 2, "CONSTANT_BUFFER" },
2778                 { 0x6101, 6, 6, "STATE_BASE_ADDRESS" },
2779                 { 0x6102, 2, 2, "STATE_SIP" },
2780                 { 0x6104, 1, 1, "3DSTATE_PIPELINE_SELECT" },
2781                 { 0x680b, 1, 1, "3DSTATE_VF_STATISTICS" },
2782                 { 0x6904, 1, 1, "3DSTATE_PIPELINE_SELECT" },
2783                 { 0x7800, 7, 7, "3DSTATE_PIPELINED_POINTERS" },
2784                 { 0x7801, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS" },
2785                 { 0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS" },
2786                 { 0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS" },
2787                 { 0x780a, 3, 3, "3DSTATE_INDEX_BUFFER" },
2788                 { 0x780b, 1, 1, "3DSTATE_VF_STATISTICS" },
2789                 { 0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE" },
2790                 { 0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR" },
2791                 { 0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER" },
2792                 { 0x7906, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET" },
2793                 { 0x7907, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN" },
2794                 { 0x7908, 3, 3, "3DSTATE_LINE_STIPPLE" },
2795                 { 0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" },
2796                 { 0x7909, 2, 2, "3DSTATE_CLEAR_PARAMS" },
2797                 { 0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" },
2798                 { 0x790b, 4, 4, "3DSTATE_GS_SVB_INDEX" },
2799                 { 0x790d, 3, 3, "3DSTATE_MULTISAMPLE" },
2800                 { 0x7910, 2, 2, "3DSTATE_CLEAR_PARAMS" },
2801                 { 0x7b00, 6, 6, "3DPRIMITIVE" },
2802                 { 0x7802, 4, 4, "3DSTATE_SAMPLER_STATE_POINTERS" },
2803                 { 0x7805, 3, 3, "3DSTATE_URB" },
2804                 { 0x780d, 4, 4, "3DSTATE_VIEWPORT_STATE_POINTERS" },
2805                 { 0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS" },
2806                 { 0x780f, 2, 2, "3DSTATE_SCISSOR_STATE_POINTERS" },
2807                 { 0x7810, 6, 6, "3DSTATE_VS_STATE" },
2808                 { 0x7811, 7, 7, "3DSTATE_GS_STATE" },
2809                 { 0x7812, 4, 4, "3DSTATE_CLIP_STATE" },
2810                 { 0x7813, 20, 20, "3DSTATE_SF_STATE" },
2811                 { 0x7814, 9, 9, "3DSTATE_WM_STATE" },
2812                 { 0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE" },
2813                 { 0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE" },
2814                 { 0x7817, 5, 5, "3DSTATE_CONSTANT_PS_STATE" },
2815                 { 0x7818, 2, 2, "3DSTATE_SAMPLE_MASK"},
2816         }, *opcode_3d;
2817
2818         len = (data[0] & 0x0000ffff) + 2;
2819
2820         opcode = (data[0] & 0xffff0000) >> 16;
2821         switch (opcode) {
2822         case 0x6000:
2823                 len = (data[0] & 0x000000ff) + 2;
2824                 return i965_decode_urb_fence(data, hw_offset, len, count);
2825         case 0x6001:
2826                 instr_out(data, hw_offset, 0, "CS_URB_STATE\n");
2827                 instr_out(data, hw_offset, 1,
2828                           "entry_size: %d [%d bytes], n_entries: %d\n",
2829                           (data[1] >> 4) & 0x1f,
2830                           (((data[1] >> 4) & 0x1f) + 1) * 64, data[1] & 0x7);
2831                 return len;
2832         case 0x6002:
2833                 len = (data[0] & 0x000000ff) + 2;
2834                 instr_out(data, hw_offset, 0, "CONSTANT_BUFFER: %s\n",
2835                           (data[0] >> 8) & 1 ? "valid" : "invalid");
2836                 instr_out(data, hw_offset, 1,
2837                           "offset: 0x%08x, length: %d bytes\n", data[1] & ~0x3f,
2838                           ((data[1] & 0x3f) + 1) * 64);
2839                 return len;
2840         case 0x6101:
2841                 i = 0;
2842                 instr_out(data, hw_offset, 0, "STATE_BASE_ADDRESS\n");
2843                 i++;
2844
2845                 if (IS_GEN6(devid) || IS_GEN7(devid))
2846                         sba_len = 10;
2847                 else if (IS_GEN5(devid))
2848                         sba_len = 8;
2849                 else
2850                         sba_len = 6;
2851                 if (len != sba_len)
2852                         fprintf(out, "Bad count in STATE_BASE_ADDRESS\n");
2853                 if (len != sba_len)
2854                         BUFFER_FAIL(count, len, "STATE_BASE_ADDRESS");
2855
2856                 state_base_out(data, hw_offset, i++, "general");
2857                 state_base_out(data, hw_offset, i++, "surface");
2858                 if (IS_GEN6(devid) || IS_GEN7(devid))
2859                         state_base_out(data, hw_offset, i++, "dynamic");
2860                 state_base_out(data, hw_offset, i++, "indirect");
2861                 if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
2862                         state_base_out(data, hw_offset, i++, "instruction");
2863
2864                 state_max_out(data, hw_offset, i++, "general");
2865                 if (IS_GEN6(devid) || IS_GEN7(devid))
2866                         state_max_out(data, hw_offset, i++, "dynamic");
2867                 state_max_out(data, hw_offset, i++, "indirect");
2868                 if (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))
2869                         state_max_out(data, hw_offset, i++, "instruction");
2870
2871                 return len;
2872         case 0x7800:
2873                 if (len != 7)
2874                         fprintf(out,
2875                                 "Bad count in 3DSTATE_PIPELINED_POINTERS\n");
2876                 if (count < 7)
2877                         BUFFER_FAIL(count, len, "3DSTATE_PIPELINED_POINTERS");
2878
2879                 instr_out(data, hw_offset, 0, "3DSTATE_PIPELINED_POINTERS\n");
2880                 instr_out(data, hw_offset, 1, "VS state\n");
2881                 instr_out(data, hw_offset, 2, "GS state\n");
2882                 instr_out(data, hw_offset, 3, "Clip state\n");
2883                 instr_out(data, hw_offset, 4, "SF state\n");
2884                 instr_out(data, hw_offset, 5, "WM state\n");
2885                 instr_out(data, hw_offset, 6, "CC state\n");
2886                 return len;
2887         case 0x7801:
2888                 len = (data[0] & 0x000000ff) + 2;
2889                 if (len != 6 && len != 4)
2890                         fprintf(out,
2891                                 "Bad count in 3DSTATE_BINDING_TABLE_POINTERS\n");
2892                 if (len == 6) {
2893                         if (count < 6)
2894                                 BUFFER_FAIL(count, len,
2895                                             "3DSTATE_BINDING_TABLE_POINTERS");
2896                         instr_out(data, hw_offset, 0,
2897                                   "3DSTATE_BINDING_TABLE_POINTERS\n");
2898                         instr_out(data, hw_offset, 1, "VS binding table\n");
2899                         instr_out(data, hw_offset, 2, "GS binding table\n");
2900                         instr_out(data, hw_offset, 3, "Clip binding table\n");
2901                         instr_out(data, hw_offset, 4, "SF binding table\n");
2902                         instr_out(data, hw_offset, 5, "WM binding table\n");
2903                 } else {
2904                         if (count < 4)
2905                                 BUFFER_FAIL(count, len,
2906                                             "3DSTATE_BINDING_TABLE_POINTERS");
2907
2908                         instr_out(data, hw_offset, 0,
2909                                   "3DSTATE_BINDING_TABLE_POINTERS: VS mod %d, "
2910                                   "GS mod %d, PS mod %d\n",
2911                                   (data[0] & (1 << 8)) != 0,
2912                                   (data[0] & (1 << 9)) != 0,
2913                                   (data[0] & (1 << 12)) != 0);
2914                         instr_out(data, hw_offset, 1, "VS binding table\n");
2915                         instr_out(data, hw_offset, 2, "GS binding table\n");
2916                         instr_out(data, hw_offset, 3, "WM binding table\n");
2917                 }
2918
2919                 return len;
2920         case 0x7802:
2921                 len = (data[0] & 0xff) + 2;
2922                 if (len != 4)
2923                         fprintf(out,
2924                                 "Bad count in 3DSTATE_SAMPLER_STATE_POINTERS\n");
2925                 if (count < 4)
2926                         BUFFER_FAIL(count, len,
2927                                     "3DSTATE_SAMPLER_STATE_POINTERS");
2928                 instr_out(data, hw_offset, 0,
2929                           "3DSTATE_SAMPLER_STATE_POINTERS: VS mod %d, "
2930                           "GS mod %d, PS mod %d\n", (data[0] & (1 << 8)) != 0,
2931                           (data[0] & (1 << 9)) != 0,
2932                           (data[0] & (1 << 12)) != 0);
2933                 instr_out(data, hw_offset, 1, "VS sampler state\n");
2934                 instr_out(data, hw_offset, 2, "GS sampler state\n");
2935                 instr_out(data, hw_offset, 3, "WM sampler state\n");
2936                 return len;
2937         case 0x7805:
2938                 len = (data[0] & 0xff) + 2;
2939                 if (len != 3)
2940                         fprintf(out, "Bad count in 3DSTATE_URB\n");
2941                 if (count < 3)
2942                         BUFFER_FAIL(count, len, "3DSTATE_URB");
2943                 instr_out(data, hw_offset, 0, "3DSTATE_URB\n");
2944                 instr_out(data, hw_offset, 1,
2945                           "VS entries %d, alloc size %d (1024bit row)\n",
2946                           data[1] & 0xffff, ((data[1] >> 16) & 0x07f) + 1);
2947                 instr_out(data, hw_offset, 2,
2948                           "GS entries %d, alloc size %d (1024bit row)\n",
2949                           (data[2] >> 8) & 0x3ff, (data[2] & 7) + 1);
2950                 return len;
2951
2952         case 0x7808:
2953                 len = (data[0] & 0xff) + 2;
2954                 if ((len - 1) % 4 != 0)
2955                         fprintf(out, "Bad count in 3DSTATE_VERTEX_BUFFERS\n");
2956                 if (count < len)
2957                         BUFFER_FAIL(count, len, "3DSTATE_VERTEX_BUFFERS");
2958                 instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_BUFFERS\n");
2959
2960                 for (i = 1; i < len;) {
2961                         int idx, access;
2962                         if (IS_GEN6(devid)) {
2963                                 idx = 26;
2964                                 access = 20;
2965                         } else {
2966                                 idx = 27;
2967                                 access = 26;
2968                         }
2969                         instr_out(data, hw_offset, i,
2970                                   "buffer %d: %s, pitch %db\n", data[i] >> idx,
2971                                   data[i] & (1 << access) ? "random" :
2972                                   "sequential", data[i] & 0x07ff);
2973                         i++;
2974                         instr_out(data, hw_offset, i++, "buffer address\n");
2975                         instr_out(data, hw_offset, i++, "max index\n");
2976                         instr_out(data, hw_offset, i++, "mbz\n");
2977                 }
2978                 return len;
2979
2980         case 0x7809:
2981                 len = (data[0] & 0xff) + 2;
2982                 if ((len + 1) % 2 != 0)
2983                         fprintf(out, "Bad count in 3DSTATE_VERTEX_ELEMENTS\n");
2984                 if (count < len)
2985                         BUFFER_FAIL(count, len, "3DSTATE_VERTEX_ELEMENTS");
2986                 instr_out(data, hw_offset, 0, "3DSTATE_VERTEX_ELEMENTS\n");
2987
2988                 for (i = 1; i < len;) {
2989                         instr_out(data, hw_offset, i,
2990                                   "buffer %d: %svalid, type 0x%04x, "
2991                                   "src offset 0x%04x bytes\n",
2992                                   data[i] >> (IS_GEN6(devid) ? 26 : 27),
2993                                   data[i] & (1 << (IS_GEN6(devid) ? 25 : 26)) ?
2994                                   "" : "in", (data[i] >> 16) & 0x1ff,
2995                                   data[i] & 0x07ff);
2996                         i++;
2997                         instr_out(data, hw_offset, i, "(%s, %s, %s, %s), "
2998                                   "dst offset 0x%02x bytes\n",
2999                                   get_965_element_component(data[i], 0),
3000                                   get_965_element_component(data[i], 1),
3001                                   get_965_element_component(data[i], 2),
3002                                   get_965_element_component(data[i], 3),
3003                                   (data[i] & 0xff) * 4);
3004                         i++;
3005                 }
3006                 return len;
3007
3008         case 0x780d:
3009                 len = (data[0] & 0xff) + 2;
3010                 if (len != 4)
3011                         fprintf(out,
3012                                 "Bad count in 3DSTATE_VIEWPORT_STATE_POINTERS\n");
3013                 if (count < len)
3014                         BUFFER_FAIL(count, len,
3015                                     "3DSTATE_VIEWPORT_STATE_POINTERS");
3016                 instr_out(data, hw_offset, 0,
3017                           "3DSTATE_VIEWPORT_STATE_POINTERS\n");
3018                 instr_out(data, hw_offset, 1, "clip\n");
3019                 instr_out(data, hw_offset, 2, "sf\n");
3020                 instr_out(data, hw_offset, 3, "cc\n");
3021                 return len;
3022
3023         case 0x780a:
3024                 len = (data[0] & 0xff) + 2;
3025                 if (len != 3)
3026                         fprintf(out, "Bad count in 3DSTATE_INDEX_BUFFER\n");
3027                 if (count < len)
3028                         BUFFER_FAIL(count, len, "3DSTATE_INDEX_BUFFER");
3029                 instr_out(data, hw_offset, 0, "3DSTATE_INDEX_BUFFER\n");
3030                 instr_out(data, hw_offset, 1, "beginning buffer address\n");
3031                 instr_out(data, hw_offset, 2, "ending buffer address\n");
3032                 return len;
3033
3034         case 0x780e:
3035                 len = (data[0] & 0xff) + 2;
3036                 if (len != 4)
3037                         fprintf(out,
3038                                 "Bad count in 3DSTATE_CC_STATE_POINTERS\n");
3039                 if (count < 4)
3040                         BUFFER_FAIL(count, len, "3DSTATE_CC_STATE_POINTERS");
3041                 instr_out(data, hw_offset, 0, "3DSTATE_CC_STATE_POINTERS\n");
3042                 instr_out(data, hw_offset, 1, "blend change %d\n", data[1] & 1);
3043                 instr_out(data, hw_offset, 2, "depth stencil change %d\n",
3044                           data[2] & 1);
3045                 instr_out(data, hw_offset, 3, "cc change %d\n", data[3] & 1);
3046                 return len;
3047
3048         case 0x780f:
3049                 len = (data[0] & 0xff) + 2;
3050                 if (len != 2)
3051                         fprintf(out, "Bad count in 3DSTATE_SCISSOR_POINTERS\n");
3052                 if (count < 2)
3053                         BUFFER_FAIL(count, len, "3DSTATE_SCISSOR_POINTERS");
3054                 instr_out(data, hw_offset, 0, "3DSTATE_SCISSOR_POINTERS\n");
3055                 instr_out(data, hw_offset, 1, "scissor rect offset\n");
3056                 return len;
3057
3058         case 0x7810:
3059                 len = (data[0] & 0xff) + 2;
3060                 if (len != 6)
3061                         fprintf(out, "Bad count in 3DSTATE_VS\n");
3062                 if (count < 6)
3063                         BUFFER_FAIL(count, len, "3DSTATE_VS");
3064                 instr_out(data, hw_offset, 0, "3DSTATE_VS\n");
3065                 instr_out(data, hw_offset, 1, "kernel pointer\n");
3066                 instr_out(data, hw_offset, 2,
3067                           "SPF=%d, VME=%d, Sampler Count %d, "
3068                           "Binding table count %d\n", (data[2] >> 31) & 1,
3069                           (data[2] >> 30) & 1, (data[2] >> 27) & 7,
3070                           (data[2] >> 18) & 0xff);
3071                 instr_out(data, hw_offset, 3, "scratch offset\n");
3072                 instr_out(data, hw_offset, 4,
3073                           "Dispatch GRF start %d, VUE read length %d, "
3074                           "VUE read offset %d\n", (data[4] >> 20) & 0x1f,
3075                           (data[4] >> 11) & 0x3f, (data[4] >> 4) & 0x3f);
3076                 instr_out(data, hw_offset, 5,
3077                           "Max Threads %d, Vertex Cache %sable, "
3078                           "VS func %sable\n", ((data[5] >> 25) & 0x7f) + 1,
3079                           (data[5] & (1 << 1)) != 0 ? "dis" : "en",
3080                           (data[5] & 1) != 0 ? "en" : "dis");
3081                 return len;
3082
3083         case 0x7811:
3084                 len = (data[0] & 0xff) + 2;
3085                 if (len != 7)
3086                         fprintf(out, "Bad count in 3DSTATE_GS\n");
3087                 if (count < 7)
3088                         BUFFER_FAIL(count, len, "3DSTATE_GS");
3089                 instr_out(data, hw_offset, 0, "3DSTATE_GS\n");
3090                 instr_out(data, hw_offset, 1, "kernel pointer\n");
3091                 instr_out(data, hw_offset, 2,
3092                           "SPF=%d, VME=%d, Sampler Count %d, "
3093                           "Binding table count %d\n", (data[2] >> 31) & 1,
3094                           (data[2] >> 30) & 1, (data[2] >> 27) & 7,
3095                           (data[2] >> 18) & 0xff);
3096                 instr_out(data, hw_offset, 3, "scratch offset\n");
3097                 instr_out(data, hw_offset, 4,
3098                           "Dispatch GRF start %d, VUE read length %d, "
3099                           "VUE read offset %d\n", (data[4] & 0xf),
3100                           (data[4] >> 11) & 0x3f, (data[4] >> 4) & 0x3f);
3101                 instr_out(data, hw_offset, 5,
3102                           "Max Threads %d, Rendering %sable\n",
3103                           ((data[5] >> 25) & 0x7f) + 1,
3104                           (data[5] & (1 << 8)) != 0 ? "en" : "dis");
3105                 instr_out(data, hw_offset, 6,
3106                           "Reorder %sable, Discard Adjaceny %sable, "
3107                           "GS %sable\n",
3108                           (data[6] & (1 << 30)) != 0 ? "en" : "dis",
3109                           (data[6] & (1 << 29)) != 0 ? "en" : "dis",
3110                           (data[6] & (1 << 15)) != 0 ? "en" : "dis");
3111                 return len;
3112
3113         case 0x7812:
3114                 len = (data[0] & 0xff) + 2;
3115                 if (len != 4)
3116                         fprintf(out, "Bad count in 3DSTATE_CLIP\n");
3117                 if (count < 4)
3118                         BUFFER_FAIL(count, len, "3DSTATE_CLIP");
3119                 instr_out(data, hw_offset, 0, "3DSTATE_CLIP\n");
3120                 instr_out(data, hw_offset, 1,
3121                           "UserClip distance cull test mask 0x%x\n",
3122                           data[1] & 0xff);
3123                 instr_out(data, hw_offset, 2,
3124                           "Clip %sable, API mode %s, Viewport XY test %sable, "
3125                           "Viewport Z test %sable, Guardband test %sable, Clip mode %d, "
3126                           "Perspective Divide %sable, Non-Perspective Barycentric %sable, "
3127                           "Tri Provoking %d, Line Provoking %d, Trifan Provoking %d\n",
3128                           (data[2] & (1 << 31)) != 0 ? "en" : "dis",
3129                           (data[2] & (1 << 30)) != 0 ? "D3D" : "OGL",
3130                           (data[2] & (1 << 28)) != 0 ? "en" : "dis",
3131                           (data[2] & (1 << 27)) != 0 ? "en" : "dis",
3132                           (data[2] & (1 << 26)) != 0 ? "en" : "dis",
3133                           (data[2] >> 13) & 7,
3134                           (data[2] & (1 << 9)) != 0 ? "dis" : "en",
3135                           (data[2] & (1 << 8)) != 0 ? "en" : "dis",
3136                           (data[2] >> 4) & 3, (data[2] >> 2) & 3,
3137                           (data[2] & 3));
3138                 instr_out(data, hw_offset, 3,
3139                           "Min PointWidth %d, Max PointWidth %d, "
3140                           "Force Zero RTAIndex %sable, Max VPIndex %d\n",
3141                           (data[3] >> 17) & 0x7ff, (data[3] >> 6) & 0x7ff,
3142                           (data[3] & (1 << 5)) != 0 ? "en" : "dis",
3143                           (data[3] & 0xf));
3144                 return len;
3145
3146         case 0x7813:
3147                 len = (data[0] & 0xff) + 2;
3148                 if (len != 20)
3149                         fprintf(out, "Bad count in 3DSTATE_SF\n");
3150                 if (count < 20)
3151                         BUFFER_FAIL(count, len, "3DSTATE_SF");
3152                 instr_out(data, hw_offset, 0, "3DSTATE_SF\n");
3153                 instr_out(data, hw_offset, 1,
3154                           "Attrib Out %d, Attrib Swizzle %sable, VUE read length %d, "
3155                           "VUE read offset %d\n", (data[1] >> 22) & 0x3f,
3156                           (data[1] & (1 << 21)) != 0 ? "en" : "dis",
3157                           (data[1] >> 11) & 0x1f, (data[1] >> 4) & 0x3f);
3158                 instr_out(data, hw_offset, 2,
3159                           "Legacy Global DepthBias %sable, FrontFace fill %d, BF fill %d, "
3160                           "VP transform %sable, FrontWinding_%s\n",
3161                           (data[2] & (1 << 11)) != 0 ? "en" : "dis",
3162                           (data[2] >> 5) & 3, (data[2] >> 3) & 3,
3163                           (data[2] & (1 << 1)) != 0 ? "en" : "dis",
3164                           (data[2] & 1) != 0 ? "CCW" : "CW");
3165                 instr_out(data, hw_offset, 3,
3166                           "AA %sable, CullMode %d, Scissor %sable, Multisample m ode %d\n",
3167                           (data[3] & (1 << 31)) != 0 ? "en" : "dis",
3168                           (data[3] >> 29) & 3,
3169                           (data[3] & (1 << 11)) != 0 ? "en" : "dis",
3170                           (data[3] >> 8) & 3);
3171                 instr_out(data, hw_offset, 4,
3172                           "Last Pixel %sable, SubPixel Precision %d, Use PixelWidth %d\n",
3173                           (data[4] & (1 << 31)) != 0 ? "en" : "dis",
3174                           (data[4] & (1 << 12)) != 0 ? 4 : 8,
3175                           (data[4] & (1 << 11)) != 0);
3176                 instr_out(data, hw_offset, 5,
3177                           "Global Depth Offset Constant %f\n",
3178                           *(float *)(&data[5]));
3179                 instr_out(data, hw_offset, 6, "Global Depth Offset Scale %f\n",
3180                           *(float *)(&data[6]));
3181                 instr_out(data, hw_offset, 7, "Global Depth Offset Clamp %f\n",
3182                           *(float *)(&data[7]));
3183
3184                 for (i = 0, j = 0; i < 8; i++, j += 2)
3185                         instr_out(data, hw_offset, i + 8,
3186                                   "Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, "
3187                                   "Source %d); Attrib %d (Override %s%s%s%s, Const Source %d, Swizzle Select %d, Source %d)\n",
3188                                   j + 1,
3189                                   (data[8 + i] & (1 << 31)) != 0 ? "W" : "",
3190                                   (data[8 + i] & (1 << 30)) != 0 ? "Z" : "",
3191                                   (data[8 + i] & (1 << 29)) != 0 ? "Y" : "",
3192                                   (data[8 + i] & (1 << 28)) != 0 ? "X" : "",
3193                                   (data[8 + i] >> 25) & 3,
3194                                   (data[8 + i] >> 22) & 3,
3195                                   (data[8 + i] >> 16) & 0x1f, j,
3196                                   (data[8 + i] & (1 << 15)) != 0 ? "W" : "",
3197                                   (data[8 + i] & (1 << 14)) != 0 ? "Z" : "",
3198                                   (data[8 + i] & (1 << 13)) != 0 ? "Y" : "",
3199                                   (data[8 + i] & (1 << 12)) != 0 ? "X" : "",
3200                                   (data[8 + i] >> 9) & 3,
3201                                   (data[8 + i] >> 6) & 3, (data[8 + i] & 0x1f));
3202                 instr_out(data, hw_offset, 16,
3203                           "Point Sprite TexCoord Enable\n");
3204                 instr_out(data, hw_offset, 17, "Const Interp Enable\n");
3205                 instr_out(data, hw_offset, 18,
3206                           "Attrib 7-0 WrapShortest Enable\n");
3207                 instr_out(data, hw_offset, 19,
3208                           "Attrib 15-8 WrapShortest Enable\n");
3209
3210                 return len;
3211
3212         case 0x7814:
3213                 len = (data[0] & 0xff) + 2;
3214                 if (len != 9)
3215                         fprintf(out, "Bad count in 3DSTATE_WM\n");
3216                 if (count < 9)
3217                         BUFFER_FAIL(count, len, "3DSTATE_WM");
3218                 instr_out(data, hw_offset, 0, "3DSTATE_WM\n");
3219                 instr_out(data, hw_offset, 1, "kernel start pointer 0\n");
3220                 instr_out(data, hw_offset, 2,
3221                           "SPF=%d, VME=%d, Sampler Count %d, "
3222                           "Binding table count %d\n", (data[2] >> 31) & 1,
3223                           (data[2] >> 30) & 1, (data[2] >> 27) & 7,
3224                           (data[2] >> 18) & 0xff);
3225                 instr_out(data, hw_offset, 3, "scratch offset\n");
3226                 instr_out(data, hw_offset, 4,
3227                           "Depth Clear %d, Depth Resolve %d, HiZ Resolve %d, "
3228                           "Dispatch GRF start[0] %d, start[1] %d, start[2] %d\n",
3229                           (data[4] & (1 << 30)) != 0,
3230                           (data[4] & (1 << 28)) != 0,
3231                           (data[4] & (1 << 27)) != 0, (data[4] >> 16) & 0x7f,
3232                           (data[4] >> 8) & 0x7f, (data[4] & 0x7f));
3233                 instr_out(data, hw_offset, 5,
3234                           "MaxThreads %d, PS KillPixel %d, PS computed Z %d, "
3235                           "PS use sourceZ %d, Thread Dispatch %d, PS use sourceW %d, Dispatch32 %d, "
3236                           "Dispatch16 %d, Dispatch8 %d\n",
3237                           ((data[5] >> 25) & 0x7f) + 1,
3238                           (data[5] & (1 << 22)) != 0,
3239                           (data[5] & (1 << 21)) != 0,
3240                           (data[5] & (1 << 20)) != 0,
3241                           (data[5] & (1 << 19)) != 0, (data[5] & (1 << 8)) != 0,
3242                           (data[5] & (1 << 2)) != 0, (data[5] & (1 << 1)) != 0,
3243                           (data[5] & (1 << 0)) != 0);
3244                 instr_out(data, hw_offset, 6,
3245                           "Num SF output %d, Pos XY offset %d, ZW interp mode %d , "
3246                           "Barycentric interp mode 0x%x, Point raster rule %d, Multisample mode %d, "
3247                           "Multisample Dispatch mode %d\n",
3248                           (data[6] >> 20) & 0x3f, (data[6] >> 18) & 3,
3249                           (data[6] >> 16) & 3, (data[6] >> 10) & 0x3f,
3250                           (data[6] & (1 << 9)) != 0, (data[6] >> 1) & 3,
3251                           (data[6] & 1));
3252                 instr_out(data, hw_offset, 7, "kernel start pointer 1\n");
3253                 instr_out(data, hw_offset, 8, "kernel start pointer 2\n");
3254
3255                 return len;
3256
3257         case 0x7900:
3258                 if (len != 4)
3259                         fprintf(out,
3260                                 "Bad count in 3DSTATE_DRAWING_RECTANGLE\n");
3261                 if (count < 4)
3262                         BUFFER_FAIL(count, len, "3DSTATE_DRAWING_RECTANGLE");
3263
3264                 instr_out(data, hw_offset, 0, "3DSTATE_DRAWING_RECTANGLE\n");
3265                 instr_out(data, hw_offset, 1, "top left: %d,%d\n",
3266                           data[1] & 0xffff, (data[1] >> 16) & 0xffff);
3267                 instr_out(data, hw_offset, 2, "bottom right: %d,%d\n",
3268                           data[2] & 0xffff, (data[2] >> 16) & 0xffff);
3269                 instr_out(data, hw_offset, 3, "origin: %d,%d\n",
3270                           (int)data[3] & 0xffff, ((int)data[3] >> 16) & 0xffff);
3271
3272                 return len;
3273
3274         case 0x7905:
3275                 if (len < 5 || len > 7)
3276                         fprintf(out, "Bad count in 3DSTATE_DEPTH_BUFFER\n");
3277                 if (count < len)
3278                         BUFFER_FAIL(count, len, "3DSTATE_DEPTH_BUFFER");
3279
3280                 instr_out(data, hw_offset, 0, "3DSTATE_DEPTH_BUFFER\n");
3281                 if (IS_GEN5(devid) || IS_GEN6(devid))
3282                         instr_out(data, hw_offset, 1,
3283                                   "%s, %s, pitch = %d bytes, %stiled, HiZ %d, Seperate Stencil %d\n",
3284                                   get_965_surfacetype(data[1] >> 29),
3285                                   get_965_depthformat((data[1] >> 18) & 0x7),
3286                                   (data[1] & 0x0001ffff) + 1,
3287                                   data[1] & (1 << 27) ? "" : "not ",
3288                                   (data[1] & (1 << 22)) != 0,
3289                                   (data[1] & (1 << 21)) != 0);
3290                 else
3291                         instr_out(data, hw_offset, 1,
3292                                   "%s, %s, pitch = %d bytes, %stiled\n",
3293                                   get_965_surfacetype(data[1] >> 29),
3294                                   get_965_depthformat((data[1] >> 18) & 0x7),
3295                                   (data[1] & 0x0001ffff) + 1,
3296                                   data[1] & (1 << 27) ? "" : "not ");
3297                 instr_out(data, hw_offset, 2, "depth offset\n");
3298                 instr_out(data, hw_offset, 3, "%dx%d\n",
3299                           ((data[3] & 0x0007ffc0) >> 6) + 1,
3300                           ((data[3] & 0xfff80000) >> 19) + 1);
3301                 instr_out(data, hw_offset, 4, "volume depth\n");
3302                 if (len >= 6)
3303                         instr_out(data, hw_offset, 5, "\n");
3304                 if (len >= 7) {
3305                         if (IS_GEN6(devid))
3306                                 instr_out(data, hw_offset, 6, "\n");
3307                         else
3308                                 instr_out(data, hw_offset, 6,
3309                                           "render target view extent\n");
3310                 }
3311
3312                 return len;
3313
3314         case 0x7a00:
3315                 if (IS_GEN6(devid) || IS_GEN7(devid)) {
3316                         unsigned int i;
3317                         len = (data[0] & 0xff) + 2;
3318                         if (len != 4 && len != 5)
3319                                 fprintf(out, "Bad count in PIPE_CONTROL\n");
3320                         if (count < len)
3321                                 BUFFER_FAIL(count, len, "PIPE_CONTROL");
3322
3323                         switch ((data[1] >> 14) & 0x3) {
3324                         case 0:
3325                                 desc1 = "no write";
3326                                 break;
3327                         case 1:
3328                                 desc1 = "qword write";
3329                                 break;
3330                         case 2:
3331                                 desc1 = "PS_DEPTH_COUNT write";
3332                                 break;
3333                         case 3:
3334                                 desc1 = "TIMESTAMP write";
3335                                 break;
3336                         }
3337                         instr_out(data, hw_offset, 0, "PIPE_CONTROL\n");
3338                         instr_out(data, hw_offset, 1,
3339                                   "%s, %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
3340                                   desc1,
3341                                   data[1] & (1 << 20) ? "cs stall, " : "",
3342                                   data[1] & (1 << 19) ?
3343                                   "global snapshot count reset, " : "",
3344                                   data[1] & (1 << 18) ? "tlb invalidate, " : "",
3345                                   data[1] & (1 << 17) ? "gfdt flush, " : "",
3346                                   data[1] & (1 << 17) ? "media state clear, " :
3347                                   "",
3348                                   data[1] & (1 << 13) ? "depth stall, " : "",
3349                                   data[1] & (1 << 12) ?
3350                                   "render target cache flush, " : "",
3351                                   data[1] & (1 << 11) ?
3352                                   "instruction cache invalidate, " : "",
3353                                   data[1] & (1 << 10) ?
3354                                   "texture cache invalidate, " : "",
3355                                   data[1] & (1 << 9) ?
3356                                   "indirect state invalidate, " : "",
3357                                   data[1] & (1 << 8) ? "notify irq, " : "",
3358                                   data[1] & (1 << 7) ? "PIPE_CONTROL flush, " :
3359                                   "",
3360                                   data[1] & (1 << 6) ? "protect mem app_id, " :
3361                                   "", data[1] & (1 << 5) ? "DC flush, " : "",
3362                                   data[1] & (1 << 4) ? "vf fetch invalidate, " :
3363                                   "",
3364                                   data[1] & (1 << 3) ?
3365                                   "constant cache invalidate, " : "",
3366                                   data[1] & (1 << 2) ?
3367                                   "state cache invalidate, " : "",
3368                                   data[1] & (1 << 1) ? "stall at scoreboard, " :
3369                                   "",
3370                                   data[1] & (1 << 0) ? "depth cache flush, " :
3371                                   "");
3372                         if (len == 5) {
3373                                 instr_out(data, hw_offset, 2,
3374                                           "destination address\n");
3375                                 instr_out(data, hw_offset, 3,
3376                                           "immediate dword low\n");
3377                                 instr_out(data, hw_offset, 4,
3378                                           "immediate dword high\n");
3379                         } else {
3380                                 for (i = 2; i < len; i++) {
3381                                         instr_out(data, hw_offset, i, "\n");
3382                                 }
3383                         }
3384                         return len;
3385                 } else {
3386                         len = (data[0] & 0xff) + 2;
3387                         if (len != 4)
3388                                 fprintf(out, "Bad count in PIPE_CONTROL\n");
3389                         if (count < len)
3390                                 BUFFER_FAIL(count, len, "PIPE_CONTROL");
3391
3392                         switch ((data[0] >> 14) & 0x3) {
3393                         case 0:
3394                                 desc1 = "no write";
3395                                 break;
3396                         case 1:
3397                                 desc1 = "qword write";
3398                                 break;
3399                         case 2:
3400                                 desc1 = "PS_DEPTH_COUNT write";
3401                                 break;
3402                         case 3:
3403                                 desc1 = "TIMESTAMP write";
3404                                 break;
3405                         }
3406                         instr_out(data, hw_offset, 0,
3407                                   "PIPE_CONTROL: %s, %sdepth stall, %sRC write flush, "
3408                                   "%sinst flush\n",
3409                                   desc1,
3410                                   data[0] & (1 << 13) ? "" : "no ",
3411                                   data[0] & (1 << 12) ? "" : "no ",
3412                                   data[0] & (1 << 11) ? "" : "no ");
3413                         instr_out(data, hw_offset, 1, "destination address\n");
3414                         instr_out(data, hw_offset, 2, "immediate dword low\n");
3415                         instr_out(data, hw_offset, 3, "immediate dword high\n");
3416                         return len;
3417                 }
3418         case 0x7b00:
3419                 len = (data[0] & 0xff) + 2;
3420                 if (len != 6)
3421                         fprintf(out, "Bad count in 3DPRIMITIVE\n");
3422                 if (count < len)
3423                         BUFFER_FAIL(count, len, "3DPRIMITIVE");
3424
3425                 instr_out(data, hw_offset, 0,
3426                           "3DPRIMITIVE: %s %s\n",
3427                           get_965_prim_type(data[0]),
3428                           (data[0] & (1 << 15)) ? "random" : "sequential");
3429                 instr_out(data, hw_offset, 1, "vertex count\n");
3430                 instr_out(data, hw_offset, 2, "start vertex\n");
3431                 instr_out(data, hw_offset, 3, "instance count\n");
3432                 instr_out(data, hw_offset, 4, "start instance\n");
3433                 instr_out(data, hw_offset, 5, "index bias\n");
3434                 return len;
3435         }
3436
3437         for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
3438                 opcode_3d = &opcodes_3d[idx];
3439                 if ((data[0] & 0xffff0000) >> 16 == opcode_3d->opcode) {
3440                         unsigned int i;
3441                         len = 1;
3442
3443                         instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
3444                         if (opcode_3d->max_len > 1) {
3445                                 len = (data[0] & 0xff) + 2;
3446                                 if (len < opcode_3d->min_len ||
3447                                     len > opcode_3d->max_len) {
3448                                         fprintf(out, "Bad count in %s\n",
3449                                                 opcode_3d->name);
3450                                 }
3451                         }
3452
3453                         for (i = 1; i < len; i++) {
3454                                 if (i >= count)
3455                                         BUFFER_FAIL(count, len,
3456                                                     opcode_3d->name);
3457                                 instr_out(data, hw_offset, i, "dword %d\n", i);
3458                         }
3459                         return len;
3460                 }
3461         }
3462
3463         instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_965 opcode = 0x%x\n",
3464                   opcode);
3465         return 1;
3466 }
3467
3468 static int
3469 decode_3d_i830(uint32_t *data, uint32_t count, uint32_t hw_offset,
3470                uint32_t devid)
3471 {
3472         unsigned int idx;
3473         uint32_t opcode;
3474
3475         struct {
3476                 uint32_t opcode;
3477                 unsigned int min_len;
3478                 unsigned int max_len;
3479                 const char *name;
3480         } opcodes_3d[] = {
3481                 { 0x02, 1, 1, "3DSTATE_MODES_3" },
3482                 { 0x03, 1, 1, "3DSTATE_ENABLES_1" },
3483                 { 0x04, 1, 1, "3DSTATE_ENABLES_2" },
3484                 { 0x05, 1, 1, "3DSTATE_VFT0" },
3485                 { 0x06, 1, 1, "3DSTATE_AA" },
3486                 { 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES" },
3487                 { 0x08, 1, 1, "3DSTATE_MODES_1" },
3488                 { 0x09, 1, 1, "3DSTATE_STENCIL_TEST" },
3489                 { 0x0a, 1, 1, "3DSTATE_VFT1" },
3490                 { 0x0b, 1, 1, "3DSTATE_INDPT_ALPHA_BLEND" },
3491                 { 0x0c, 1, 1, "3DSTATE_MODES_5" },
3492                 { 0x0d, 1, 1, "3DSTATE_MAP_BLEND_OP" },
3493                 { 0x0e, 1, 1, "3DSTATE_MAP_BLEND_ARG" },
3494                 { 0x0f, 1, 1, "3DSTATE_MODES_2" },
3495                 { 0x15, 1, 1, "3DSTATE_FOG_COLOR" },
3496                 { 0x16, 1, 1, "3DSTATE_MODES_4"},
3497         }, *opcode_3d;
3498
3499         opcode = (data[0] & 0x1f000000) >> 24;
3500
3501         switch (opcode) {
3502         case 0x1f:
3503                 return decode_3d_primitive(data, count, hw_offset);
3504         case 0x1d:
3505                 return decode_3d_1d(data, count, hw_offset, devid);
3506         case 0x1c:
3507                 return decode_3d_1c(data, count, hw_offset);
3508         }
3509
3510         for (idx = 0; idx < ARRAY_SIZE(opcodes_3d); idx++) {
3511                 opcode_3d = &opcodes_3d[idx];
3512                 if ((data[0] & 0x1f000000) >> 24 == opcode_3d->opcode) {
3513                         unsigned int len = 1, i;
3514
3515                         instr_out(data, hw_offset, 0, "%s\n", opcode_3d->name);
3516                         if (opcode_3d->max_len > 1) {
3517                                 len = (data[0] & 0xff) + 2;
3518                                 if (len < opcode_3d->min_len ||
3519                                     len > opcode_3d->max_len) {
3520                                         fprintf(out, "Bad count in %s\n",
3521                                                 opcode_3d->name);
3522                                 }
3523                         }
3524
3525                         for (i = 1; i < len; i++) {
3526                                 if (i >= count)
3527                                         BUFFER_FAIL(count, len,
3528                                                     opcode_3d->name);
3529                                 instr_out(data, hw_offset, i, "dword %d\n", i);
3530                         }
3531                         return len;
3532                 }
3533         }
3534
3535         instr_out(data, hw_offset, 0, "3D UNKNOWN: 3d_i830 opcode = 0x%x\n",
3536                   opcode);
3537         return 1;
3538 }
3539
3540 struct drm_intel_decode *
3541 drm_intel_decode_context_alloc(uint32_t devid)
3542 {
3543         struct drm_intel_decode *ctx;
3544
3545         ctx = calloc(1, sizeof(struct drm_intel_decode));
3546         if (!ctx)
3547                 return NULL;
3548
3549         ctx->devid = devid;
3550         ctx->out = stdout;
3551
3552         return ctx;
3553 }
3554
3555 void
3556 drm_intel_decode_context_free(struct drm_intel_decode *ctx)
3557 {
3558         free(ctx);
3559 }
3560
3561 void
3562 drm_intel_decode_set_dump_past_end(struct drm_intel_decode *ctx,
3563                                    int dump_past_end)
3564 {
3565         ctx->dump_past_end = !!dump_past_end;
3566 }
3567
3568 void
3569 drm_intel_decode_set_batch_pointer(struct drm_intel_decode *ctx,
3570                                    void *data, uint32_t hw_offset, int count)
3571 {
3572         ctx->base_data = data;
3573         ctx->base_hw_offset = hw_offset;
3574         ctx->base_count = count;
3575 }
3576
3577 void
3578 drm_intel_decode_set_head_tail(struct drm_intel_decode *ctx,
3579                                uint32_t head, uint32_t tail)
3580 {
3581         ctx->head = head;
3582         ctx->tail = tail;
3583 }
3584
3585 void
3586 drm_intel_decode_set_output_file(struct drm_intel_decode *ctx,
3587                                  FILE *out)
3588 {
3589         ctx->out = out;
3590 }
3591
3592 /**
3593  * Decodes an i830-i915 batch buffer, writing the output to stdout.
3594  *
3595  * \param data batch buffer contents
3596  * \param count number of DWORDs to decode in the batch buffer
3597  * \param hw_offset hardware address for the buffer
3598  */
3599 void
3600 drm_intel_decode(struct drm_intel_decode *ctx)
3601 {
3602         int ret;
3603         unsigned int index = 0;
3604         uint32_t devid;
3605
3606         if (!ctx)
3607                 return;
3608
3609         ctx->data = ctx->base_data;
3610         ctx->hw_offset = ctx->base_hw_offset;
3611         ctx->count = ctx->base_count;
3612
3613         devid = ctx->devid;
3614         head_offset = ctx->head;
3615         tail_offset = ctx->tail;
3616         out = ctx->out;
3617
3618         saved_s2_set = 0;
3619         saved_s4_set = 1;
3620
3621         while (ctx->count > 0) {
3622                 index = 0;
3623
3624                 switch ((ctx->data[index] & 0xe0000000) >> 29) {
3625                 case 0x0:
3626                         ret = decode_mi(ctx->data, ctx->count,
3627                                         ctx->hw_offset);
3628
3629                         /* If MI_BATCHBUFFER_END happened, then dump
3630                          * the rest of the output in case we some day
3631                          * want it in debugging, but don't decode it
3632                          * since it'll just confuse in the common
3633                          * case.
3634                          */
3635                         if (ret == -1) {
3636                                 if (ctx->dump_past_end) {
3637                                         index++;
3638                                 } else {
3639                                         for (index = index + 1; index < ctx->count;
3640                                              index++) {
3641                                                 instr_out(ctx->data,
3642                                                           ctx->hw_offset,
3643                                                           index, "\n");
3644                                         }
3645                                 }
3646                         } else
3647                                 index += ret;
3648                         break;
3649                 case 0x2:
3650                         index += decode_2d(ctx->data, ctx->count,
3651                                            ctx->hw_offset);
3652                         break;
3653                 case 0x3:
3654                         if (IS_9XX(devid) && !IS_GEN3(devid)) {
3655                                 index +=
3656                                     decode_3d_965(ctx->data, ctx->count,
3657                                                   ctx->hw_offset, devid);
3658                         } else if (IS_GEN3(devid)) {
3659                                 index += decode_3d(ctx->data, ctx->count,
3660                                                    ctx->hw_offset, devid);
3661                         } else {
3662                                 index +=
3663                                     decode_3d_i830(ctx->data, ctx->count,
3664                                                    ctx->hw_offset, devid);
3665                         }
3666                         break;
3667                 default:
3668                         instr_out(ctx->data, ctx->hw_offset, index,
3669                                   "UNKNOWN\n");
3670                         index++;
3671                         break;
3672                 }
3673                 fflush(out);
3674
3675                 if (ctx->count < index)
3676                         break;
3677
3678                 ctx->count -= index;
3679                 ctx->data += index;
3680                 ctx->hw_offset += 4 * index;
3681         }
3682 }