File amd/gcn/pm4/dis.c added (mode: 100644) (index 0000000..36d598d) |
|
1 |
|
#include <stdbool.h> |
|
2 |
|
#include <stdio.h> |
|
3 |
|
#include <stdint.h> |
|
4 |
|
#include <stdlib.h> |
|
5 |
|
#include <string.h> |
|
6 |
|
/* |
|
7 |
|
* ABBREVIATIONS: |
|
8 |
|
* blk : BLocK |
|
9 |
|
* cfg : ConFiG |
|
10 |
|
* coher : COHERent |
|
11 |
|
* ctx : ConTeX |
|
12 |
|
* desc : DESCription |
|
13 |
|
* dest : DESTination |
|
14 |
|
* hdr :HeaDeR |
|
15 |
|
* idx : InDeX |
|
16 |
|
* me : Micro Engine |
|
17 |
|
* n : couNt |
|
18 |
|
* oft(s) : OFfseT(S) |
|
19 |
|
* pfp : PreFetch Processor |
|
20 |
|
* pkt : PacKeT |
|
21 |
|
* reg(s) : REGister(S) |
|
22 |
|
* sel : SELection |
|
23 |
|
* src : SouRCe |
|
24 |
|
* w(s) : Word(S) |
|
25 |
|
*/ |
|
26 |
|
#define u8 uint8_t |
|
27 |
|
#define u16 uint16_t |
|
28 |
|
#define u32 uint32_t |
|
29 |
|
#define u64 uint64_t |
|
30 |
|
#define constant enum |
|
31 |
|
#define loop for(;;) |
|
32 |
|
#define out(fmt,...) fprintf(stdout,fmt, ##__VA_ARGS__) |
|
33 |
|
#define ARRAY_N(x) ((u64)(sizeof(x) / sizeof(x[0]))) |
|
34 |
|
/*----------------------------------------------------------------------------*/ |
|
35 |
|
static u32 pkt_hdr_w; |
|
36 |
|
#define PKT_HDR_TYPE (pkt_hdr_w >> 30) |
|
37 |
|
/* 0-based index of the last body w from the first body w */ |
|
38 |
|
#define PKT_HDR_BODY_WS_LAST ((pkt_hdr_w & 0x3fff0000) >> 16) |
|
39 |
|
/* n of ws in body is all pkt types bits [29:16], aka 14 bits */ |
|
40 |
|
static u32 pkt_body_ws[0x3fff]; |
|
41 |
|
static u32 pkt_body_ws_n; |
|
42 |
|
/*----------------------------------------------------------------------------*/ |
|
43 |
|
#define PKT3_OPCODE_NOP 0x10 |
|
44 |
|
#define PKT3_OPCODE_SET_BASE 0x11 |
|
45 |
|
#define PKT3_OPCODE_INDEX_BUFFER_SIZE 0x13 |
|
46 |
|
/* vulkan indirect draw */ |
|
47 |
|
#define PKT3_OPCODE_DRAW_INDIRECT 0x24 |
|
48 |
|
/* vulkan indirect draw */ |
|
49 |
|
#define PKT3_OPCODE_DRAW_INDEX_INDIRECT 0x25 |
|
50 |
|
#define PKT3_OPCODE_INDEX_BASE 0x26 |
|
51 |
|
/* vulkan draw_indexed */ |
|
52 |
|
#define PKT3_OPCODE_DRAW_INDEX_2 0x27 |
|
53 |
|
/* vulkan indirect draw */ |
|
54 |
|
#define PKT3_OPCODE_DRAW_INDIRECT_MULTI 0x2c |
|
55 |
|
/* vulkan draw */ |
|
56 |
|
#define PKT3_OPCODE_DRAW_INDEX_AUTO 0x2d |
|
57 |
|
#define PKT3_OPCODE_NUM_INSTANCES 0x2f |
|
58 |
|
#define PKT3_OPCODE_WRITE_DATA 0x37 |
|
59 |
|
/* vulkan indirect draw */ |
|
60 |
|
#define PKT3_OPCODE_DRAW_INDEX_INDIRECT_MULTI 0x38 |
|
61 |
|
#define PKT3_OPCODE_COPY_DATA 0x40 |
|
62 |
|
#define PKT3_OPCODE_PFP_SYNC_ME 0x42 |
|
63 |
|
#define PKT3_OPCODE_SURFACE_SYNC 0x43 /* deprecated on CIK chips */ |
|
64 |
|
#define PKT3_OPCODE_EVENT_WRITE 0x46 |
|
65 |
|
#define PKT3_OPCODE_SET_CONFIG 0x68 |
|
66 |
|
#define PKT3_OPCODE_SET_CONTEXT 0x69 |
|
67 |
|
#define PKT3_OPCODE_SET_SH_REG 0x76 |
|
68 |
|
/*----------------------------------------------------------------------------*/ |
|
69 |
|
#define OK 0 |
|
70 |
|
#define END 1 |
|
71 |
|
#define ERR 2 |
|
72 |
|
static u8 pkt_hdr_w_read(void) |
|
73 |
|
{ |
|
74 |
|
size_t read_bytes_n; |
|
75 |
|
|
|
76 |
|
read_bytes_n = fread(&pkt_hdr_w, sizeof(pkt_hdr_w), 1, stdin); |
|
77 |
|
if (read_bytes_n != sizeof(pkt_hdr_w)) { |
|
78 |
|
if (feof(stdin) != 0) |
|
79 |
|
return END; |
|
80 |
|
if (ferror(stdin) != 0) |
|
81 |
|
return ERR; |
|
82 |
|
} |
|
83 |
|
} |
|
84 |
|
|
|
85 |
|
static u8 pkt_body_ws_read(void) |
|
86 |
|
|
|
87 |
|
{ |
|
88 |
|
size_t read_bytes_n; |
|
89 |
|
|
|
90 |
|
read_bytes_n = fread(pkt_body_ws, sizeof(u32), pkt_body_ws_n, stdin); |
|
91 |
|
if (read_bytes_n != (sizeof(u32) * pkt_body_ws_n)) { |
|
92 |
|
if (feof(stdin) != 0) |
|
93 |
|
return END; |
|
94 |
|
if (ferror(stdin) != 0) |
|
95 |
|
return ERR; |
|
96 |
|
} |
|
97 |
|
} |
|
98 |
|
/*----------------------------------------------------------------------------*/ |
|
99 |
|
#include "regs.h" |
|
100 |
|
static u8 *reg_name(u8 blk, u64 w_oft) |
|
101 |
|
{ |
|
102 |
|
u64 i; |
|
103 |
|
u8 *name; |
|
104 |
|
static u8 desc[256]; |
|
105 |
|
u64 global_w_oft; |
|
106 |
|
|
|
107 |
|
i = 0; |
|
108 |
|
loop { |
|
109 |
|
if (i == ARRAY_N(reg_descs)) { |
|
110 |
|
name = "no_register_description"; |
|
111 |
|
break; |
|
112 |
|
} |
|
113 |
|
if (reg_descs[i].blk == blk && reg_descs[i].w_oft == w_oft) { |
|
114 |
|
name = reg_descs[i].name; |
|
115 |
|
break; |
|
116 |
|
} |
|
117 |
|
++i; |
|
118 |
|
} |
|
119 |
|
global_w_oft = reg_blk_w_ofts[blk] + w_oft; |
|
120 |
|
snprintf(desc, 256, "%s[0x%016lx global byte offset/%lu global byte offset/0x%016lx global word offset]", name, global_w_oft * 4, global_w_oft * 4, global_w_oft); |
|
121 |
|
return desc; |
|
122 |
|
} |
|
123 |
|
/*----------------------------------------------------------------------------*/ |
|
124 |
|
#define PKT0_BASE_IDX (pkt_hdr_w & 0x0000ffff) |
|
125 |
|
static void pkt0_out(void) |
|
126 |
|
{ |
|
127 |
|
u16 i; |
|
128 |
|
|
|
129 |
|
out("\nPKT0(%u words):base_idx_w=0x%08x\n", pkt_body_ws_n, PKT0_BASE_IDX); |
|
130 |
|
|
|
131 |
|
i = 0; |
|
132 |
|
loop { |
|
133 |
|
if (i == pkt_body_ws_n) |
|
134 |
|
break; |
|
135 |
|
out("\tREG_DATA[%u]=0x%08x\n", i, pkt_body_ws[i]); |
|
136 |
|
++i; |
|
137 |
|
} |
|
138 |
|
} |
|
139 |
|
|
|
140 |
|
static void pkt1_out(void) |
|
141 |
|
{ |
|
142 |
|
out("\nPKT1(UNSUPPORTED)\n"); |
|
143 |
|
} |
|
144 |
|
|
|
145 |
|
static void pkt2_out(void) |
|
146 |
|
{ |
|
147 |
|
out("\nPKT2(FILLER)\n"); |
|
148 |
|
} |
|
149 |
|
|
|
150 |
|
static u8 *shader_type_to_str(u8 type) |
|
151 |
|
{ |
|
152 |
|
if (type != 0) |
|
153 |
|
return "compute"; |
|
154 |
|
return "graphics"; |
|
155 |
|
} |
|
156 |
|
|
|
157 |
|
static u8 *engine_to_str(u8 engine) |
|
158 |
|
{ |
|
159 |
|
switch (engine) { |
|
160 |
|
case 0x00: |
|
161 |
|
return "micro_engine"; |
|
162 |
|
case 0x01: |
|
163 |
|
return "prefect_engine(unsupported)"; |
|
164 |
|
case 0x02: |
|
165 |
|
return "constant_engine"; |
|
166 |
|
case 0x04: |
|
167 |
|
return "reserved"; |
|
168 |
|
default: |
|
169 |
|
return "unknown_engine_code"; |
|
170 |
|
} |
|
171 |
|
} |
|
172 |
|
|
|
173 |
|
static u8 *count_sel_to_str(u8 count_sel) |
|
174 |
|
{ |
|
175 |
|
switch (count_sel) { |
|
176 |
|
case 0: |
|
177 |
|
return "32bits"; |
|
178 |
|
case 1: |
|
179 |
|
return "64bits"; |
|
180 |
|
default: |
|
181 |
|
return "unknown_w_count_selection_code"; |
|
182 |
|
} |
|
183 |
|
} |
|
184 |
|
|
|
185 |
|
static u8 *dest_sel_to_str(u8 dest_sel) |
|
186 |
|
{ |
|
187 |
|
switch (dest_sel) { |
|
188 |
|
case 0x00: |
|
189 |
|
return "memory_mapped_register"; |
|
190 |
|
case 0x01: |
|
191 |
|
return "memory(synchronous)"; |
|
192 |
|
case 0x02: |
|
193 |
|
return "texture_cache(level_2)"; |
|
194 |
|
case 0x03: |
|
195 |
|
return "global_data_share"; |
|
196 |
|
case 0x04: |
|
197 |
|
return "reserved"; |
|
198 |
|
case 0x05: |
|
199 |
|
return "memory(asynchronous)"; |
|
200 |
|
default: |
|
201 |
|
return "unknown_destination_selection_code"; |
|
202 |
|
} |
|
203 |
|
} |
|
204 |
|
|
|
205 |
|
static u8 *src_sel_to_str(u8 src_sel) |
|
206 |
|
{ |
|
207 |
|
switch (src_sel) { |
|
208 |
|
case 0x00: |
|
209 |
|
return "memory_mapped_register"; |
|
210 |
|
case 0x01: |
|
211 |
|
return "memory"; |
|
212 |
|
case 0x02: |
|
213 |
|
return "texture_cache(level_2)"; |
|
214 |
|
case 0x03: |
|
215 |
|
return "global_data_share"; |
|
216 |
|
case 0x04: |
|
217 |
|
return "reserved"; |
|
218 |
|
case 0x05: |
|
219 |
|
return "immediate_data"; |
|
220 |
|
case 0x06: |
|
221 |
|
return "atomic_return_data"; |
|
222 |
|
case 0x07: |
|
223 |
|
return "global_data_share_return_data_0"; |
|
224 |
|
case 0x08: |
|
225 |
|
return "global_data_share_return_data_1"; |
|
226 |
|
default: |
|
227 |
|
return "unknown_source_selection_code"; |
|
228 |
|
} |
|
229 |
|
} |
|
230 |
|
|
|
231 |
|
#define WRITE_DATA_ENGINE ((u8)(pkt_body_ws[0] & 0xc0000000) >> 31) |
|
232 |
|
#define WRITE_DATA_WRITE_IS_CONFIRMED ((pkt_body_ws[0] & 0x00100000) != 0) |
|
233 |
|
#define WRITE_DATA_DOES_INCREMENT_ADDRESS ((u8)(pkt_body_ws[0] & 0x00010000) != 0) |
|
234 |
|
#define WRITE_DATA_DEST_SEL ((u8)((pkt_body_ws[0] & 0x000000f00) >> 8)) |
|
235 |
|
static void opcode_write_data_out(void) |
|
236 |
|
{ |
|
237 |
|
u16 i; |
|
238 |
|
|
|
239 |
|
out("\tcontrol:engine=%s wait_write_confirmation=%s increment_address=%s destination_selection=%s\n", engine_to_str(WRITE_DATA_ENGINE), WRITE_DATA_WRITE_IS_CONFIRMED ? "yes" : "no", WRITE_DATA_DOES_INCREMENT_ADDRESS ? "yes" : "no", dest_sel_to_str(WRITE_DATA_DEST_SEL)); |
|
240 |
|
out("\tdestination_address_lo=0x%08x\n", pkt_body_ws[1]); |
|
241 |
|
out("\tdestination_address_hi=0x%08x\n", pkt_body_ws[2]); |
|
242 |
|
|
|
243 |
|
i = 3; |
|
244 |
|
loop { |
|
245 |
|
if (i == pkt_body_ws_n) |
|
246 |
|
break; |
|
247 |
|
out("\tdata[%u]=0x%08x\n", i - 3, pkt_body_ws[i]); |
|
248 |
|
++i; |
|
249 |
|
} |
|
250 |
|
} |
|
251 |
|
|
|
252 |
|
#define COPY_DATA_ENGINE ((u8)(pkt_body_ws[0] & 0xc0000000) >> 31) |
|
253 |
|
#define COPY_DATA_WRITE_IS_CONFIRMED ((pkt_body_ws[0] & 0x00100000) != 0) |
|
254 |
|
#define COPY_DATA_COUNT_SEL ((u8)(pkt_body_ws[0] & 0x00010000) >> 16) |
|
255 |
|
#define COPY_DATA_DEST_SEL ((u8)((pkt_body_ws[0] & 0x000000f00) >> 8)) |
|
256 |
|
#define COPY_DATA_SRC_SEL ((u8)(pkt_body_ws[0] & 0x0000000f)) |
|
257 |
|
static void opcode_copy_data_out(void) |
|
258 |
|
{ |
|
259 |
|
out("\tcontrol:engine=%s wait_write_confirmation=%s count_selection=%s destination_selection=%s source_selection=%s\n", engine_to_str(COPY_DATA_ENGINE), COPY_DATA_WRITE_IS_CONFIRMED ? "yes" : "no", count_sel_to_str(COPY_DATA_COUNT_SEL), dest_sel_to_str(COPY_DATA_DEST_SEL), src_sel_to_str(COPY_DATA_SRC_SEL)); |
|
260 |
|
out("\tsrc_addr_lo=0x%08x\n", pkt_body_ws[1]); |
|
261 |
|
out("\tsrc_addr_hi=0x%08x\n", pkt_body_ws[2]); |
|
262 |
|
out("\tdest_addr_lo=0x%08x\n", pkt_body_ws[3]); |
|
263 |
|
out("\tdest_addr_hi=0x%08x\n", pkt_body_ws[4]); |
|
264 |
|
} |
|
265 |
|
|
|
266 |
|
static u8 *opcode_to_str(u8 opcode) |
|
267 |
|
{ |
|
268 |
|
/* TODO */ |
|
269 |
|
switch (opcode) { |
|
270 |
|
case PKT3_OPCODE_NOP: |
|
271 |
|
return "nop"; |
|
272 |
|
case PKT3_OPCODE_SET_SH_REG: |
|
273 |
|
return "set_sh_reg"; |
|
274 |
|
case PKT3_OPCODE_WRITE_DATA: |
|
275 |
|
return "write_data"; |
|
276 |
|
case PKT3_OPCODE_COPY_DATA: |
|
277 |
|
return "copy_data"; |
|
278 |
|
case PKT3_OPCODE_DRAW_INDIRECT: |
|
279 |
|
return "draw_indirect"; |
|
280 |
|
case PKT3_OPCODE_DRAW_INDEX_INDIRECT: |
|
281 |
|
return "draw_index_indirect"; |
|
282 |
|
case PKT3_OPCODE_DRAW_INDEX_2: |
|
283 |
|
return "draw_index_2"; |
|
284 |
|
case PKT3_OPCODE_DRAW_INDIRECT_MULTI: |
|
285 |
|
return "draw_indirect_multi"; |
|
286 |
|
case PKT3_OPCODE_DRAW_INDEX_AUTO: |
|
287 |
|
return "draw_index_auto"; |
|
288 |
|
case PKT3_OPCODE_DRAW_INDEX_INDIRECT_MULTI: |
|
289 |
|
return "draw_index_indirect_multi"; |
|
290 |
|
case PKT3_OPCODE_SET_BASE: |
|
291 |
|
return "set_base"; |
|
292 |
|
case PKT3_OPCODE_INDEX_BASE: |
|
293 |
|
return "index_base"; |
|
294 |
|
case PKT3_OPCODE_INDEX_BUFFER_SIZE: |
|
295 |
|
return "index_buffer_size"; |
|
296 |
|
case PKT3_OPCODE_SET_CONTEXT: |
|
297 |
|
return "set_context"; |
|
298 |
|
case PKT3_OPCODE_SET_CONFIG: |
|
299 |
|
return "set_config"; |
|
300 |
|
case PKT3_OPCODE_NUM_INSTANCES: |
|
301 |
|
return "num_instances"; |
|
302 |
|
case PKT3_OPCODE_EVENT_WRITE: |
|
303 |
|
return "event_write"; |
|
304 |
|
case PKT3_OPCODE_PFP_SYNC_ME: |
|
305 |
|
return "pfp_sync_me"; |
|
306 |
|
case PKT3_OPCODE_SURFACE_SYNC: |
|
307 |
|
return "surface_sync(deprecated on cik chips)"; |
|
308 |
|
default: |
|
309 |
|
return "unknown_opcode"; |
|
310 |
|
} |
|
311 |
|
} |
|
312 |
|
|
|
313 |
|
/* an all chips, the register byte offset is 0x8000, or 0x2000 as a w offset */ |
|
314 |
|
static void opcode_set_config_reg_out(void) |
|
315 |
|
{ |
|
316 |
|
u16 i; |
|
317 |
|
|
|
318 |
|
out("\treg_offset_w=0x%08x\n", pkt_body_ws[0]); |
|
319 |
|
|
|
320 |
|
i = 1; |
|
321 |
|
loop { |
|
322 |
|
if (i == pkt_body_ws_n) |
|
323 |
|
break; |
|
324 |
|
out("\treg_data[%u]=0x%08x %s\n", i - 1, pkt_body_ws[i], reg_name(reg_blk_cfg, (u64)pkt_body_ws[0] + i - 1)); |
|
325 |
|
++i; |
|
326 |
|
} |
|
327 |
|
} |
|
328 |
|
|
|
329 |
|
/* an all chips, the register byte offset is 0xb000, or 0x2c00 as a w offset */ |
|
330 |
|
static void opcode_set_sh_reg_out(void) |
|
331 |
|
{ |
|
332 |
|
u16 i; |
|
333 |
|
|
|
334 |
|
out("\treg_offset_w=0x%08x\n", pkt_body_ws[0]); |
|
335 |
|
|
|
336 |
|
i = 1; |
|
337 |
|
loop { |
|
338 |
|
if (i == pkt_body_ws_n) |
|
339 |
|
break; |
|
340 |
|
out("\treg_data[%u]=0x%08x %s\n", i - 1, pkt_body_ws[i], reg_name(reg_blk_sh, (u64)pkt_body_ws[0] + i - 1)); |
|
341 |
|
++i; |
|
342 |
|
} |
|
343 |
|
} |
|
344 |
|
|
|
345 |
|
/* an all chips, the register byte offset is 0x28000, or 0xa000 as a w offset */ |
|
346 |
|
static void opcode_set_context_reg_out(void) |
|
347 |
|
{ |
|
348 |
|
u16 i; |
|
349 |
|
|
|
350 |
|
out("\treg_offset_w=0x%08x\n", pkt_body_ws[0]); |
|
351 |
|
|
|
352 |
|
i = 1; |
|
353 |
|
loop { |
|
354 |
|
if (i == pkt_body_ws_n) |
|
355 |
|
break; |
|
356 |
|
out("\treg_data[%u]=0x%08x %s\n", i - 1, pkt_body_ws[i], reg_name(reg_blk_ctx, (u64)pkt_body_ws[0] + i - 1)); |
|
357 |
|
++i; |
|
358 |
|
} |
|
359 |
|
} |
|
360 |
|
|
|
361 |
|
static void opcode_event_write_out(void) |
|
362 |
|
{ |
|
363 |
|
out("\tevent_cntl=0x%08x\n", pkt_body_ws[0]); |
|
364 |
|
if (pkt_body_ws_n >= 2) |
|
365 |
|
out("\taddress_lo=0x%08x", pkt_body_ws[1]); |
|
366 |
|
if (pkt_body_ws_n >= 3) |
|
367 |
|
out("\taddress_hi=0x%08x", pkt_body_ws[2]); |
|
368 |
|
} |
|
369 |
|
|
|
370 |
|
#define PKT3_HDR_IS_PREDICATE ((pkt_hdr_w & 0x1) != 0) |
|
371 |
|
#define PKT3_HDR_SHADER_TYPE ((u8)((pkt_hdr_w & 0x2) >> 1)) |
|
372 |
|
#define PKT3_HDR_OPCODE ((u8)((pkt_hdr_w & 0x0000ff00) >> 8)) |
|
373 |
|
static void pkt3_out(void) |
|
374 |
|
{ |
|
375 |
|
out("\nPKT3(%u words):opcode=%s(0x%x) is_predicate=%s shader_type_is=%s\n", pkt_body_ws_n, opcode_to_str(PKT3_HDR_OPCODE), PKT3_HDR_OPCODE, PKT3_HDR_IS_PREDICATE ? "yes" : "no", shader_type_to_str(PKT3_HDR_SHADER_TYPE)); |
|
376 |
|
|
|
377 |
|
/* TODO */ |
|
378 |
|
switch (PKT3_HDR_OPCODE) { |
|
379 |
|
case PKT3_OPCODE_NOP: |
|
380 |
|
/* discard the body ws */ |
|
381 |
|
break; |
|
382 |
|
case PKT3_OPCODE_SET_SH_REG: |
|
383 |
|
opcode_set_sh_reg_out(); |
|
384 |
|
break; |
|
385 |
|
case PKT3_OPCODE_WRITE_DATA: |
|
386 |
|
opcode_write_data_out(); |
|
387 |
|
break; |
|
388 |
|
case PKT3_OPCODE_COPY_DATA: |
|
389 |
|
opcode_copy_data_out(); |
|
390 |
|
break; |
|
391 |
|
case PKT3_OPCODE_DRAW_INDEX_AUTO: |
|
392 |
|
out("\tindexes_n(written to VGT_NUM_INDICE)=%u\n", pkt_body_ws[0]); |
|
393 |
|
out("\tvgt_draw_initiator=0x%08x\n", pkt_body_ws[1]); |
|
394 |
|
break; |
|
395 |
|
case PKT3_OPCODE_DRAW_INDEX_2: |
|
396 |
|
/* this is the hard limit for the dma engine */ |
|
397 |
|
out("\tindexes_n_max=%u\n", pkt_body_ws[0]); |
|
398 |
|
out("\tindexes_buf_addr_lo=0x%08x\n", pkt_body_ws[1]); |
|
399 |
|
out("\tindexes_buf_addr_hi=0x%08x\n", pkt_body_ws[2]); |
|
400 |
|
out("\tindexes_n=%u\n", pkt_body_ws[3]); |
|
401 |
|
out("\tvgt_draw_initiator=0x%08x\n", pkt_body_ws[4]); |
|
402 |
|
break; |
|
403 |
|
/*===================================================================*/ |
|
404 |
|
/* |
|
405 |
|
* the command processor will read structs in a vram buffer which |
|
406 |
|
* describes what to do. The vram buffer is setup with the PKT3 |
|
407 |
|
* SET_BASE, and for the index version, the index buffer should be |
|
408 |
|
* setup (considering DMA memory access granularity) with PKT3 |
|
409 |
|
* INDEX_BASE and INDEX_BUFFER_SIZE (see AMD programing manuals). |
|
410 |
|
*/ |
|
411 |
|
case PKT3_OPCODE_DRAW_INDIRECT: |
|
412 |
|
out("\tdata_offset=0x%08x\n", pkt_body_ws[0]); |
|
413 |
|
out("\tbase_vertex_location=0x%08x(user sgpr selected via a register shader block word offset\n", pkt_body_ws[1]); |
|
414 |
|
out("\tstart_instance_location=0x%08x\n(user sgpr selected via a register shader block word offset)", pkt_body_ws[2]); |
|
415 |
|
out("\tvgt_draw_initiator=0x%08x\n", pkt_body_ws[3]); |
|
416 |
|
break; |
|
417 |
|
case PKT3_OPCODE_DRAW_INDEX_INDIRECT: |
|
418 |
|
out("\tdata_offset=0x%08x\n", pkt_body_ws[0]); |
|
419 |
|
out("\tbase_vertex_location=0x%08x(user sgpr selected via a register shader block word offset)\n", pkt_body_ws[1]); |
|
420 |
|
out("\tstart_instance_location=0x%08x\n(user sgpr selected via a register shader block word offset)", pkt_body_ws[2]); |
|
421 |
|
out("\tvgt_draw_initiator=0x%08x\n", pkt_body_ws[3]); |
|
422 |
|
break; |
|
423 |
|
/*===================================================================*/ |
|
424 |
|
/* |
|
425 |
|
* non documented. based on driver code (radv_cmd_buffer.c). it seems |
|
426 |
|
* to be the same than above, but with an array of lines of such |
|
427 |
|
* buffers, hence with a stride to go from one line to the next one, |
|
428 |
|
* and with a count specific for each line, namely with a array of |
|
429 |
|
* counts in vram. |
|
430 |
|
*/ |
|
431 |
|
case PKT3_OPCODE_DRAW_INDIRECT_MULTI: |
|
432 |
|
case PKT3_OPCODE_DRAW_INDEX_INDIRECT_MULTI: |
|
433 |
|
out("\tdata_offset=0x%08x\n", pkt_body_ws[0]); |
|
434 |
|
out("\tbase_vertex_location=0x%08x(user sgpr selected via a register shader block word offset)\n", pkt_body_ws[1]); |
|
435 |
|
out("\tstart_instance_location=0x%08x\n(user sgpr selected via a register shader block word offset)", pkt_body_ws[2]); |
|
436 |
|
out("\tnon_documented=0x%08x\n(user sgpr selected via a register shader block word offset with bits 31/30 enabling the index mode/indirect count)", pkt_body_ws[3]); |
|
437 |
|
out("\tdraw_count=%u\n", pkt_body_ws[4]); |
|
438 |
|
out("\tcount_va=0x%08x\n", pkt_body_ws[5]); |
|
439 |
|
out("\tcount_va_hi=0x%08x\n", pkt_body_ws[6]); |
|
440 |
|
out("\tstride=0x%08x\n", pkt_body_ws[7]); |
|
441 |
|
out("\tvgt_draw_initiator=0x%08x\n", pkt_body_ws[8]); |
|
442 |
|
break; |
|
443 |
|
/*===================================================================*/ |
|
444 |
|
case PKT3_OPCODE_SET_BASE: |
|
445 |
|
out("\tbase_index=0x%08x\n", pkt_body_ws[0]); |
|
446 |
|
out("\taddress_0=0x%08x\n", pkt_body_ws[1]); |
|
447 |
|
out("\taddress_1=0x%08x\n", pkt_body_ws[2]); |
|
448 |
|
break; |
|
449 |
|
case PKT3_OPCODE_INDEX_BASE: |
|
450 |
|
out("\tindex_base_lo=0x%08x\n", pkt_body_ws[0]); |
|
451 |
|
out("\tindex_base_hi=0x%08x\n", pkt_body_ws[1]); |
|
452 |
|
break; |
|
453 |
|
case PKT3_OPCODE_INDEX_BUFFER_SIZE: |
|
454 |
|
out("\tindex_buffer_size=0x%08x\n", pkt_body_ws[0]); |
|
455 |
|
break; |
|
456 |
|
case PKT3_OPCODE_SET_CONTEXT: |
|
457 |
|
opcode_set_context_reg_out(); |
|
458 |
|
break; |
|
459 |
|
case PKT3_OPCODE_SET_CONFIG: |
|
460 |
|
opcode_set_config_reg_out(); |
|
461 |
|
break; |
|
462 |
|
case PKT3_OPCODE_NUM_INSTANCES: |
|
463 |
|
out("\tnum_instances=%u\n", pkt_body_ws[0]); |
|
464 |
|
break; |
|
465 |
|
case PKT3_OPCODE_EVENT_WRITE: |
|
466 |
|
opcode_event_write_out(); |
|
467 |
|
break; |
|
468 |
|
case PKT3_OPCODE_PFP_SYNC_ME: |
|
469 |
|
out("\tdummy_data=0x%08x\n", pkt_body_ws[0]); |
|
470 |
|
break; |
|
471 |
|
case PKT3_OPCODE_SURFACE_SYNC: |
|
472 |
|
out("\tword[0]=0x%08x\n", pkt_body_ws[0]); |
|
473 |
|
out("\tcoher_size=0x%08x\n", pkt_body_ws[1]); |
|
474 |
|
out("\tcoher_base=0x%08x\n", pkt_body_ws[2]); |
|
475 |
|
out("\tpoll_interval=0x%08x\n", pkt_body_ws[3]); |
|
476 |
|
break; |
|
477 |
|
default: |
|
478 |
|
/* unknow opcode, we do not interpret the body ws */ |
|
479 |
|
break; |
|
480 |
|
} |
|
481 |
|
} |
|
482 |
|
|
|
483 |
|
static void pkt_out(void) |
|
484 |
|
{ |
|
485 |
|
switch (PKT_HDR_TYPE) { |
|
486 |
|
case 0: |
|
487 |
|
pkt0_out(); |
|
488 |
|
break; |
|
489 |
|
case 1: |
|
490 |
|
pkt1_out(); |
|
491 |
|
break; |
|
492 |
|
case 2: |
|
493 |
|
pkt2_out(); |
|
494 |
|
break; |
|
495 |
|
case 3: |
|
496 |
|
pkt3_out(); |
|
497 |
|
break; |
|
498 |
|
} |
|
499 |
|
} |
|
500 |
|
|
|
501 |
|
int main(void) |
|
502 |
|
{ |
|
503 |
|
clearerr(stdin); |
|
504 |
|
loop { |
|
505 |
|
u8 r; |
|
506 |
|
|
|
507 |
|
r = pkt_hdr_w_read(); |
|
508 |
|
if (r != OK) |
|
509 |
|
exit(0); |
|
510 |
|
|
|
511 |
|
pkt_body_ws_n = PKT_HDR_BODY_WS_LAST + 1; |
|
512 |
|
|
|
513 |
|
r = pkt_body_ws_read(); |
|
514 |
|
|
|
515 |
|
pkt_out(); |
|
516 |
|
|
|
517 |
|
if (r != OK) { |
|
518 |
|
out("ERROR:packet is incomplete\n"); |
|
519 |
|
exit(1); |
|
520 |
|
} |
|
521 |
|
} |
|
522 |
|
exit(0); |
|
523 |
|
} |