1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2012 Rob Clark <[email protected]>
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include <assert.h>
7*61046927SAndroid Build Coastguard Worker #include <ctype.h>
8*61046927SAndroid Build Coastguard Worker #include <err.h>
9*61046927SAndroid Build Coastguard Worker #include <errno.h>
10*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
11*61046927SAndroid Build Coastguard Worker #include <getopt.h>
12*61046927SAndroid Build Coastguard Worker #include <signal.h>
13*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
14*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
15*61046927SAndroid Build Coastguard Worker #include <stdint.h>
16*61046927SAndroid Build Coastguard Worker #include <stdio.h>
17*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
18*61046927SAndroid Build Coastguard Worker #include <string.h>
19*61046927SAndroid Build Coastguard Worker #include <unistd.h>
20*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
21*61046927SAndroid Build Coastguard Worker #include <sys/stat.h>
22*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
23*61046927SAndroid Build Coastguard Worker #include <sys/wait.h>
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker #include "buffers.h"
26*61046927SAndroid Build Coastguard Worker #include "cffdec.h"
27*61046927SAndroid Build Coastguard Worker #include "disasm.h"
28*61046927SAndroid Build Coastguard Worker #include "io.h"
29*61046927SAndroid Build Coastguard Worker #include "pager.h"
30*61046927SAndroid Build Coastguard Worker #include "redump.h"
31*61046927SAndroid Build Coastguard Worker #include "rnnutil.h"
32*61046927SAndroid Build Coastguard Worker #include "script.h"
33*61046927SAndroid Build Coastguard Worker #include "rdutil.h"
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker static struct cffdec_options options;
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker static bool needs_wfi = false;
38*61046927SAndroid Build Coastguard Worker static bool is_blob = false;
39*61046927SAndroid Build Coastguard Worker static int show_comp = false;
40*61046927SAndroid Build Coastguard Worker static int interactive;
41*61046927SAndroid Build Coastguard Worker static int vertices;
42*61046927SAndroid Build Coastguard Worker static const char *exename;
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker static int handle_file(const char *filename, int start, int end, int draw);
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker static void
print_usage(const char * name)47*61046927SAndroid Build Coastguard Worker print_usage(const char *name)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker /* clang-format off */
50*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Usage:\n\n"
51*61046927SAndroid Build Coastguard Worker "\t%s [OPTIONS]... FILE...\n\n"
52*61046927SAndroid Build Coastguard Worker "Options:\n"
53*61046927SAndroid Build Coastguard Worker "\t-v, --verbose - more verbose disassembly\n"
54*61046927SAndroid Build Coastguard Worker "\t--dump-shaders - dump each shader to a raw file\n"
55*61046927SAndroid Build Coastguard Worker "\t--no-color - disable colorized output (default for non-console\n"
56*61046927SAndroid Build Coastguard Worker "\t output)\n"
57*61046927SAndroid Build Coastguard Worker "\t--color - enable colorized output (default for tty output)\n"
58*61046927SAndroid Build Coastguard Worker "\t--no-pager - disable pager (default for non-console output)\n"
59*61046927SAndroid Build Coastguard Worker "\t--pager - enable pager (default for tty output)\n"
60*61046927SAndroid Build Coastguard Worker "\t-s, --summary - don't show individual register writes, but just\n"
61*61046927SAndroid Build Coastguard Worker "\t register values on draws\n"
62*61046927SAndroid Build Coastguard Worker "\t-a, --allregs - show all registers (including ones not written\n"
63*61046927SAndroid Build Coastguard Worker "\t since previous draw) on each draw\n"
64*61046927SAndroid Build Coastguard Worker "\t-S, --start=N - start decoding from frame N\n"
65*61046927SAndroid Build Coastguard Worker "\t-E, --end=N - stop decoding after frame N\n"
66*61046927SAndroid Build Coastguard Worker "\t-F, --frame=N - decode only frame N\n"
67*61046927SAndroid Build Coastguard Worker "\t-D, --draw=N - decode only draw N\n"
68*61046927SAndroid Build Coastguard Worker "\t-e, --exe=NAME - only decode cmdstream from named process\n"
69*61046927SAndroid Build Coastguard Worker "\t--textures - dump texture contents (if possible)\n"
70*61046927SAndroid Build Coastguard Worker "\t-L, --script=LUA - run specified lua script to analyze state\n"
71*61046927SAndroid Build Coastguard Worker "\t-q, --query=REG - query mode, dump only specified query registers on\n"
72*61046927SAndroid Build Coastguard Worker "\t each draw; multiple --query/-q args can be given to\n"
73*61046927SAndroid Build Coastguard Worker "\t dump multiple registers; register can be specified\n"
74*61046927SAndroid Build Coastguard Worker "\t either by name or numeric offset\n"
75*61046927SAndroid Build Coastguard Worker "\t--query-all - in query mode, show all queried regs on each draw\n"
76*61046927SAndroid Build Coastguard Worker "\t (default query mode)\n"
77*61046927SAndroid Build Coastguard Worker "\t--query-written - in query mode, show queried regs on draws if any of\n"
78*61046927SAndroid Build Coastguard Worker "\t them have been written since previous draw\n"
79*61046927SAndroid Build Coastguard Worker "\t--query-delta - in query mode, show queried regs on draws if any of\n"
80*61046927SAndroid Build Coastguard Worker "\t them have changed since previous draw\n"
81*61046927SAndroid Build Coastguard Worker "\t--query-compare - dump registers for BINNING vs GMEM/BYPASS per draw;\n"
82*61046927SAndroid Build Coastguard Worker "\t only applicable for regs set via SDS group (a6xx+),\n"
83*61046927SAndroid Build Coastguard Worker "\t implies --once, can be combined with --query-all,\n"
84*61046927SAndroid Build Coastguard Worker "\t --query-written, or --query-delta\n"
85*61046927SAndroid Build Coastguard Worker "\t--once - decode cmdstream only once (per draw mode); if same\n"
86*61046927SAndroid Build Coastguard Worker "\t cmdstream is executed for each tile, this will decode\n"
87*61046927SAndroid Build Coastguard Worker "\t it only for the first tile and skip the remainder,\n"
88*61046927SAndroid Build Coastguard Worker "\t which can be useful when looking at state that does\n"
89*61046927SAndroid Build Coastguard Worker "\t not change per tile\n"
90*61046927SAndroid Build Coastguard Worker "\t--not-once - decode cmdstream for each IB (default)\n"
91*61046927SAndroid Build Coastguard Worker "\t--unit-test - make reproducible output for unit testing\n"
92*61046927SAndroid Build Coastguard Worker "\t-h, --help - show this message\n"
93*61046927SAndroid Build Coastguard Worker , name);
94*61046927SAndroid Build Coastguard Worker /* clang-format on */
95*61046927SAndroid Build Coastguard Worker exit(2);
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker /* clang-format off */
99*61046927SAndroid Build Coastguard Worker static const struct option opts[] = {
100*61046927SAndroid Build Coastguard Worker /* Long opts that simply set a flag (no corresponding short alias: */
101*61046927SAndroid Build Coastguard Worker { "dump-shaders", no_argument, &options.dump_shaders, 1 },
102*61046927SAndroid Build Coastguard Worker { "no-color", no_argument, &options.color, 0 },
103*61046927SAndroid Build Coastguard Worker { "color", no_argument, &options.color, 1 },
104*61046927SAndroid Build Coastguard Worker { "no-pager", no_argument, &interactive, 0 },
105*61046927SAndroid Build Coastguard Worker { "pager", no_argument, &interactive, 1 },
106*61046927SAndroid Build Coastguard Worker { "textures", no_argument, &options.dump_textures, 1 },
107*61046927SAndroid Build Coastguard Worker { "show-compositor", no_argument, &show_comp, 1 },
108*61046927SAndroid Build Coastguard Worker { "query-all", no_argument, &options.query_mode, QUERY_ALL },
109*61046927SAndroid Build Coastguard Worker { "query-written", no_argument, &options.query_mode, QUERY_WRITTEN },
110*61046927SAndroid Build Coastguard Worker { "query-delta", no_argument, &options.query_mode, QUERY_DELTA },
111*61046927SAndroid Build Coastguard Worker { "query-compare", no_argument, &options.query_compare, 1 },
112*61046927SAndroid Build Coastguard Worker { "once", no_argument, &options.once, 1 },
113*61046927SAndroid Build Coastguard Worker { "not-once", no_argument, &options.once, 0 },
114*61046927SAndroid Build Coastguard Worker { "unit-test", no_argument, &options.unit_test, 1 },
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker /* Long opts with short alias: */
117*61046927SAndroid Build Coastguard Worker { "verbose", no_argument, 0, 'v' },
118*61046927SAndroid Build Coastguard Worker { "summary", no_argument, 0, 's' },
119*61046927SAndroid Build Coastguard Worker { "allregs", no_argument, 0, 'a' },
120*61046927SAndroid Build Coastguard Worker { "start", required_argument, 0, 'S' },
121*61046927SAndroid Build Coastguard Worker { "end", required_argument, 0, 'E' },
122*61046927SAndroid Build Coastguard Worker { "frame", required_argument, 0, 'F' },
123*61046927SAndroid Build Coastguard Worker { "draw", required_argument, 0, 'D' },
124*61046927SAndroid Build Coastguard Worker { "exe", required_argument, 0, 'e' },
125*61046927SAndroid Build Coastguard Worker { "script", required_argument, 0, 'L' },
126*61046927SAndroid Build Coastguard Worker { "query", required_argument, 0, 'q' },
127*61046927SAndroid Build Coastguard Worker { "help", no_argument, 0, 'h' },
128*61046927SAndroid Build Coastguard Worker };
129*61046927SAndroid Build Coastguard Worker /* clang-format on */
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker int
main(int argc,char ** argv)132*61046927SAndroid Build Coastguard Worker main(int argc, char **argv)
133*61046927SAndroid Build Coastguard Worker {
134*61046927SAndroid Build Coastguard Worker enum debug_t debug = PRINT_RAW | PRINT_STATS;
135*61046927SAndroid Build Coastguard Worker int ret = -1;
136*61046927SAndroid Build Coastguard Worker int start = 0, end = 0x7ffffff, draw = -1;
137*61046927SAndroid Build Coastguard Worker int c;
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker interactive = isatty(STDOUT_FILENO);
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker options.color = interactive;
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker while ((c = getopt_long(argc, argv, "vsaS:E:F:D:e:L:q:h", opts, NULL)) !=
144*61046927SAndroid Build Coastguard Worker -1) {
145*61046927SAndroid Build Coastguard Worker switch (c) {
146*61046927SAndroid Build Coastguard Worker case 0:
147*61046927SAndroid Build Coastguard Worker /* option that set a flag, nothing to do */
148*61046927SAndroid Build Coastguard Worker break;
149*61046927SAndroid Build Coastguard Worker case 'v':
150*61046927SAndroid Build Coastguard Worker debug |= (PRINT_RAW | EXPAND_REPEAT | PRINT_VERBOSE);
151*61046927SAndroid Build Coastguard Worker break;
152*61046927SAndroid Build Coastguard Worker case 's':
153*61046927SAndroid Build Coastguard Worker options.summary = true;
154*61046927SAndroid Build Coastguard Worker break;
155*61046927SAndroid Build Coastguard Worker case 'a':
156*61046927SAndroid Build Coastguard Worker options.allregs = true;
157*61046927SAndroid Build Coastguard Worker break;
158*61046927SAndroid Build Coastguard Worker case 'S':
159*61046927SAndroid Build Coastguard Worker start = atoi(optarg);
160*61046927SAndroid Build Coastguard Worker break;
161*61046927SAndroid Build Coastguard Worker case 'E':
162*61046927SAndroid Build Coastguard Worker end = atoi(optarg);
163*61046927SAndroid Build Coastguard Worker break;
164*61046927SAndroid Build Coastguard Worker case 'F':
165*61046927SAndroid Build Coastguard Worker start = end = atoi(optarg);
166*61046927SAndroid Build Coastguard Worker break;
167*61046927SAndroid Build Coastguard Worker case 'D':
168*61046927SAndroid Build Coastguard Worker draw = atoi(optarg);
169*61046927SAndroid Build Coastguard Worker break;
170*61046927SAndroid Build Coastguard Worker case 'e':
171*61046927SAndroid Build Coastguard Worker exename = optarg;
172*61046927SAndroid Build Coastguard Worker break;
173*61046927SAndroid Build Coastguard Worker case 'L':
174*61046927SAndroid Build Coastguard Worker options.script = optarg;
175*61046927SAndroid Build Coastguard Worker if (script_load(options.script)) {
176*61046927SAndroid Build Coastguard Worker errx(-1, "error loading %s\n", options.script);
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker break;
179*61046927SAndroid Build Coastguard Worker case 'q':
180*61046927SAndroid Build Coastguard Worker options.querystrs =
181*61046927SAndroid Build Coastguard Worker realloc(options.querystrs,
182*61046927SAndroid Build Coastguard Worker (options.nquery + 1) * sizeof(*options.querystrs));
183*61046927SAndroid Build Coastguard Worker options.querystrs[options.nquery] = optarg;
184*61046927SAndroid Build Coastguard Worker options.nquery++;
185*61046927SAndroid Build Coastguard Worker interactive = 0;
186*61046927SAndroid Build Coastguard Worker break;
187*61046927SAndroid Build Coastguard Worker case 'h':
188*61046927SAndroid Build Coastguard Worker default:
189*61046927SAndroid Build Coastguard Worker print_usage(argv[0]);
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker disasm_a2xx_set_debug(debug);
194*61046927SAndroid Build Coastguard Worker disasm_a3xx_set_debug(debug);
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker if (interactive) {
197*61046927SAndroid Build Coastguard Worker pager_open();
198*61046927SAndroid Build Coastguard Worker }
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker while (optind < argc) {
201*61046927SAndroid Build Coastguard Worker ret = handle_file(argv[optind], start, end, draw);
202*61046927SAndroid Build Coastguard Worker if (ret) {
203*61046927SAndroid Build Coastguard Worker fprintf(stderr, "error reading: %s\n", argv[optind]);
204*61046927SAndroid Build Coastguard Worker fprintf(stderr, "continuing..\n");
205*61046927SAndroid Build Coastguard Worker }
206*61046927SAndroid Build Coastguard Worker optind++;
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker if (ret)
210*61046927SAndroid Build Coastguard Worker print_usage(argv[0]);
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker if ((options.query_mode || options.query_compare) && !options.nquery) {
213*61046927SAndroid Build Coastguard Worker fprintf(stderr, "query options only valid in query mode!\n");
214*61046927SAndroid Build Coastguard Worker print_usage(argv[0]);
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker script_finish();
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker if (interactive) {
220*61046927SAndroid Build Coastguard Worker pager_close();
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker return ret;
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker static int
handle_file(const char * filename,int start,int end,int draw)227*61046927SAndroid Build Coastguard Worker handle_file(const char *filename, int start, int end, int draw)
228*61046927SAndroid Build Coastguard Worker {
229*61046927SAndroid Build Coastguard Worker struct io *io;
230*61046927SAndroid Build Coastguard Worker int submit = 0, got_gpu_id = 0;
231*61046927SAndroid Build Coastguard Worker bool needs_reset = false;
232*61046927SAndroid Build Coastguard Worker bool skip = false;
233*61046927SAndroid Build Coastguard Worker struct rd_parsed_section ps = {0};
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker options.draw_filter = draw;
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker cffdec_init(&options);
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker if (!options.unit_test)
240*61046927SAndroid Build Coastguard Worker printf("Reading %s...\n", filename);
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker script_start_cmdstream(filename);
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker if (!strcmp(filename, "-"))
245*61046927SAndroid Build Coastguard Worker io = io_openfd(0);
246*61046927SAndroid Build Coastguard Worker else
247*61046927SAndroid Build Coastguard Worker io = io_open(filename);
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker if (!io) {
250*61046927SAndroid Build Coastguard Worker fprintf(stderr, "could not open: %s\n", filename);
251*61046927SAndroid Build Coastguard Worker return -1;
252*61046927SAndroid Build Coastguard Worker }
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker struct {
255*61046927SAndroid Build Coastguard Worker unsigned int len;
256*61046927SAndroid Build Coastguard Worker uint64_t gpuaddr;
257*61046927SAndroid Build Coastguard Worker } gpuaddr = {0};
258*61046927SAndroid Build Coastguard Worker
259*61046927SAndroid Build Coastguard Worker while (parse_rd_section(io, &ps)) {
260*61046927SAndroid Build Coastguard Worker needs_wfi = false;
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker switch (ps.type) {
263*61046927SAndroid Build Coastguard Worker case RD_TEST:
264*61046927SAndroid Build Coastguard Worker printl(1, "test: %s\n", (char *)ps.buf);
265*61046927SAndroid Build Coastguard Worker break;
266*61046927SAndroid Build Coastguard Worker case RD_CMD:
267*61046927SAndroid Build Coastguard Worker is_blob = true;
268*61046927SAndroid Build Coastguard Worker printl(2, "cmd: %s\n", (char *)ps.buf);
269*61046927SAndroid Build Coastguard Worker skip = false;
270*61046927SAndroid Build Coastguard Worker if (exename) {
271*61046927SAndroid Build Coastguard Worker skip |= (strstr(ps.buf, exename) != ps.buf);
272*61046927SAndroid Build Coastguard Worker } else if (!show_comp) {
273*61046927SAndroid Build Coastguard Worker skip |= (strstr(ps.buf, "fdperf") == ps.buf);
274*61046927SAndroid Build Coastguard Worker skip |= (strstr(ps.buf, "chrome") == ps.buf);
275*61046927SAndroid Build Coastguard Worker skip |= (strstr(ps.buf, "surfaceflinger") == ps.buf);
276*61046927SAndroid Build Coastguard Worker skip |= ((char *)ps.buf)[0] == 'X';
277*61046927SAndroid Build Coastguard Worker }
278*61046927SAndroid Build Coastguard Worker break;
279*61046927SAndroid Build Coastguard Worker case RD_VERT_SHADER:
280*61046927SAndroid Build Coastguard Worker printl(2, "vertex shader:\n%s\n", (char *)ps.buf);
281*61046927SAndroid Build Coastguard Worker break;
282*61046927SAndroid Build Coastguard Worker case RD_FRAG_SHADER:
283*61046927SAndroid Build Coastguard Worker printl(2, "fragment shader:\n%s\n", (char *)ps.buf);
284*61046927SAndroid Build Coastguard Worker break;
285*61046927SAndroid Build Coastguard Worker case RD_GPUADDR:
286*61046927SAndroid Build Coastguard Worker if (needs_reset) {
287*61046927SAndroid Build Coastguard Worker reset_buffers();
288*61046927SAndroid Build Coastguard Worker needs_reset = false;
289*61046927SAndroid Build Coastguard Worker }
290*61046927SAndroid Build Coastguard Worker parse_addr(ps.buf, ps.sz, &gpuaddr.len, &gpuaddr.gpuaddr);
291*61046927SAndroid Build Coastguard Worker break;
292*61046927SAndroid Build Coastguard Worker case RD_BUFFER_CONTENTS:
293*61046927SAndroid Build Coastguard Worker add_buffer(gpuaddr.gpuaddr, gpuaddr.len, ps.buf);
294*61046927SAndroid Build Coastguard Worker ps.buf = NULL;
295*61046927SAndroid Build Coastguard Worker break;
296*61046927SAndroid Build Coastguard Worker case RD_CMDSTREAM_ADDR:
297*61046927SAndroid Build Coastguard Worker if ((start <= submit) && (submit <= end)) {
298*61046927SAndroid Build Coastguard Worker unsigned int sizedwords;
299*61046927SAndroid Build Coastguard Worker uint64_t gpuaddr;
300*61046927SAndroid Build Coastguard Worker parse_addr(ps.buf, ps.sz, &sizedwords, &gpuaddr);
301*61046927SAndroid Build Coastguard Worker printl(2, "############################################################\n");
302*61046927SAndroid Build Coastguard Worker printl(2, "cmdstream[%d]: %d dwords\n", submit, sizedwords);
303*61046927SAndroid Build Coastguard Worker if (!skip) {
304*61046927SAndroid Build Coastguard Worker script_start_submit();
305*61046927SAndroid Build Coastguard Worker dump_commands(hostptr(gpuaddr), sizedwords, 0);
306*61046927SAndroid Build Coastguard Worker script_end_submit();
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker printl(2, "############################################################\n");
309*61046927SAndroid Build Coastguard Worker printl(2, "vertices: %d\n", vertices);
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker needs_reset = true;
312*61046927SAndroid Build Coastguard Worker submit++;
313*61046927SAndroid Build Coastguard Worker break;
314*61046927SAndroid Build Coastguard Worker case RD_GPU_ID:
315*61046927SAndroid Build Coastguard Worker if (!got_gpu_id) {
316*61046927SAndroid Build Coastguard Worker uint32_t gpu_id = parse_gpu_id(ps.buf);
317*61046927SAndroid Build Coastguard Worker if (!gpu_id)
318*61046927SAndroid Build Coastguard Worker break;
319*61046927SAndroid Build Coastguard Worker options.dev_id.gpu_id = gpu_id;
320*61046927SAndroid Build Coastguard Worker printl(2, "gpu_id: %d\n", options.dev_id.gpu_id);
321*61046927SAndroid Build Coastguard Worker
322*61046927SAndroid Build Coastguard Worker options.info = fd_dev_info_raw(&options.dev_id);
323*61046927SAndroid Build Coastguard Worker if (!options.info)
324*61046927SAndroid Build Coastguard Worker break;
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker cffdec_init(&options);
327*61046927SAndroid Build Coastguard Worker got_gpu_id = 1;
328*61046927SAndroid Build Coastguard Worker }
329*61046927SAndroid Build Coastguard Worker break;
330*61046927SAndroid Build Coastguard Worker case RD_CHIP_ID:
331*61046927SAndroid Build Coastguard Worker if (!got_gpu_id) {
332*61046927SAndroid Build Coastguard Worker options.dev_id.chip_id = parse_chip_id(ps.buf);
333*61046927SAndroid Build Coastguard Worker printl(2, "chip_id: 0x%" PRIx64 "\n", options.dev_id.chip_id);
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker options.info = fd_dev_info_raw(&options.dev_id);
336*61046927SAndroid Build Coastguard Worker if (!options.info)
337*61046927SAndroid Build Coastguard Worker break;
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker cffdec_init(&options);
340*61046927SAndroid Build Coastguard Worker got_gpu_id = 1;
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker break;
343*61046927SAndroid Build Coastguard Worker default:
344*61046927SAndroid Build Coastguard Worker break;
345*61046927SAndroid Build Coastguard Worker }
346*61046927SAndroid Build Coastguard Worker }
347*61046927SAndroid Build Coastguard Worker
348*61046927SAndroid Build Coastguard Worker script_end_cmdstream();
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker reset_buffers();
351*61046927SAndroid Build Coastguard Worker
352*61046927SAndroid Build Coastguard Worker io_close(io);
353*61046927SAndroid Build Coastguard Worker fflush(stdout);
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker if (ps.ret < 0) {
356*61046927SAndroid Build Coastguard Worker printf("corrupt file\n");
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker return 0;
359*61046927SAndroid Build Coastguard Worker }
360