1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Intel Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include <stdio.h>
25*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
26*61046927SAndroid Build Coastguard Worker #include <stdint.h>
27*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
28*61046927SAndroid Build Coastguard Worker #include <getopt.h>
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker #include <unistd.h>
31*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
32*61046927SAndroid Build Coastguard Worker #include <string.h>
33*61046927SAndroid Build Coastguard Worker #include <signal.h>
34*61046927SAndroid Build Coastguard Worker #include <errno.h>
35*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
36*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
37*61046927SAndroid Build Coastguard Worker #include <sys/stat.h>
38*61046927SAndroid Build Coastguard Worker #include <sys/wait.h>
39*61046927SAndroid Build Coastguard Worker #include <sys/mman.h>
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker #include "intel/compiler/brw_isa_info.h"
42*61046927SAndroid Build Coastguard Worker #include "intel/compiler/elk/elk_isa_info.h"
43*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker #include "aub_read.h"
46*61046927SAndroid Build Coastguard Worker #include "aub_mem.h"
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker #define CSI "\e["
49*61046927SAndroid Build Coastguard Worker #define GREEN_HEADER CSI "1;42m"
50*61046927SAndroid Build Coastguard Worker #define NORMAL CSI "0m"
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker /* options */
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker static int option_full_decode = true;
55*61046927SAndroid Build Coastguard Worker static int option_print_offsets = true;
56*61046927SAndroid Build Coastguard Worker static int max_vbo_lines = -1;
57*61046927SAndroid Build Coastguard Worker static enum { COLOR_AUTO, COLOR_ALWAYS, COLOR_NEVER } option_color;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker /* state */
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker uint16_t pci_id = 0;
62*61046927SAndroid Build Coastguard Worker char *input_file = NULL, *xml_path = NULL;
63*61046927SAndroid Build Coastguard Worker struct intel_device_info devinfo;
64*61046927SAndroid Build Coastguard Worker struct brw_isa_info brw;
65*61046927SAndroid Build Coastguard Worker struct elk_isa_info elk;
66*61046927SAndroid Build Coastguard Worker struct intel_batch_decode_ctx batch_ctx;
67*61046927SAndroid Build Coastguard Worker struct aub_mem mem;
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker FILE *outfile;
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker static void
aubinator_error(void * user_data,const void * aub_data,const char * msg)72*61046927SAndroid Build Coastguard Worker aubinator_error(void *user_data, const void *aub_data, const char *msg)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker fprintf(stderr, "%s", msg);
75*61046927SAndroid Build Coastguard Worker }
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker static void
aubinator_comment(void * user_data,const char * str)78*61046927SAndroid Build Coastguard Worker aubinator_comment(void *user_data, const char *str)
79*61046927SAndroid Build Coastguard Worker {
80*61046927SAndroid Build Coastguard Worker fprintf(outfile, "%s\n", str);
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker static void
aubinator_init(void * user_data,int aub_pci_id,const char * app_name)84*61046927SAndroid Build Coastguard Worker aubinator_init(void *user_data, int aub_pci_id, const char *app_name)
85*61046927SAndroid Build Coastguard Worker {
86*61046927SAndroid Build Coastguard Worker pci_id = aub_pci_id;
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker if (!intel_get_device_info_from_pci_id(pci_id, &devinfo)) {
89*61046927SAndroid Build Coastguard Worker fprintf(stderr, "can't find device information: pci_id=0x%x\n", pci_id);
90*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker enum intel_batch_decode_flags batch_flags = 0;
94*61046927SAndroid Build Coastguard Worker if (option_color == COLOR_ALWAYS)
95*61046927SAndroid Build Coastguard Worker batch_flags |= INTEL_BATCH_DECODE_IN_COLOR;
96*61046927SAndroid Build Coastguard Worker if (option_full_decode)
97*61046927SAndroid Build Coastguard Worker batch_flags |= INTEL_BATCH_DECODE_FULL;
98*61046927SAndroid Build Coastguard Worker if (option_print_offsets)
99*61046927SAndroid Build Coastguard Worker batch_flags |= INTEL_BATCH_DECODE_OFFSETS;
100*61046927SAndroid Build Coastguard Worker batch_flags |= INTEL_BATCH_DECODE_FLOATS;
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker if (devinfo.ver >= 9) {
103*61046927SAndroid Build Coastguard Worker brw_init_isa_info(&brw, &devinfo);
104*61046927SAndroid Build Coastguard Worker intel_batch_decode_ctx_init_brw(&batch_ctx, &brw, &devinfo, outfile,
105*61046927SAndroid Build Coastguard Worker batch_flags, xml_path, NULL, NULL, NULL);
106*61046927SAndroid Build Coastguard Worker } else {
107*61046927SAndroid Build Coastguard Worker elk_init_isa_info(&elk, &devinfo);
108*61046927SAndroid Build Coastguard Worker intel_batch_decode_ctx_init_elk(&batch_ctx, &elk, &devinfo, outfile,
109*61046927SAndroid Build Coastguard Worker batch_flags, xml_path, NULL, NULL, NULL);
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker /* Check for valid spec instance, if wrong xml_path is passed then spec
113*61046927SAndroid Build Coastguard Worker * instance is not initialized properly
114*61046927SAndroid Build Coastguard Worker */
115*61046927SAndroid Build Coastguard Worker if (!batch_ctx.spec) {
116*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Failed to initialize intel_batch_decode_ctx "
117*61046927SAndroid Build Coastguard Worker "spec instance\n");
118*61046927SAndroid Build Coastguard Worker free(xml_path);
119*61046927SAndroid Build Coastguard Worker intel_batch_decode_ctx_finish(&batch_ctx);
120*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker batch_ctx.max_vbo_decoded_lines = max_vbo_lines;
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker char *color = GREEN_HEADER, *reset_color = NORMAL;
126*61046927SAndroid Build Coastguard Worker if (option_color == COLOR_NEVER)
127*61046927SAndroid Build Coastguard Worker color = reset_color = "";
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker fprintf(outfile, "%sAubinator: Intel AUB file decoder.%-80s%s\n",
130*61046927SAndroid Build Coastguard Worker color, "", reset_color);
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker if (input_file)
133*61046927SAndroid Build Coastguard Worker fprintf(outfile, "File name: %s\n", input_file);
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker if (aub_pci_id)
136*61046927SAndroid Build Coastguard Worker fprintf(outfile, "PCI ID: 0x%x\n", aub_pci_id);
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker fprintf(outfile, "Application name: %s\n", app_name);
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker fprintf(outfile, "Decoding as: %s\n", devinfo.name);
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker /* Throw in a new line before the first batch */
143*61046927SAndroid Build Coastguard Worker fprintf(outfile, "\n");
144*61046927SAndroid Build Coastguard Worker }
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker static struct intel_batch_decode_bo
get_bo(void * user_data,bool ppgtt,uint64_t addr)147*61046927SAndroid Build Coastguard Worker get_bo(void *user_data, bool ppgtt, uint64_t addr)
148*61046927SAndroid Build Coastguard Worker {
149*61046927SAndroid Build Coastguard Worker if (ppgtt)
150*61046927SAndroid Build Coastguard Worker return aub_mem_get_ppgtt_bo(user_data, addr);
151*61046927SAndroid Build Coastguard Worker else
152*61046927SAndroid Build Coastguard Worker return aub_mem_get_ggtt_bo(user_data, addr);
153*61046927SAndroid Build Coastguard Worker }
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker static void
handle_execlist_write(void * user_data,enum intel_engine_class engine,uint64_t context_descriptor)156*61046927SAndroid Build Coastguard Worker handle_execlist_write(void *user_data, enum intel_engine_class engine, uint64_t context_descriptor)
157*61046927SAndroid Build Coastguard Worker {
158*61046927SAndroid Build Coastguard Worker const uint32_t pphwsp_size = 4096;
159*61046927SAndroid Build Coastguard Worker uint32_t pphwsp_addr = context_descriptor & 0xfffff000;
160*61046927SAndroid Build Coastguard Worker struct intel_batch_decode_bo pphwsp_bo = aub_mem_get_ggtt_bo(&mem, pphwsp_addr);
161*61046927SAndroid Build Coastguard Worker uint32_t *context = (uint32_t *)((uint8_t *)pphwsp_bo.map +
162*61046927SAndroid Build Coastguard Worker (pphwsp_addr - pphwsp_bo.addr) +
163*61046927SAndroid Build Coastguard Worker pphwsp_size);
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker uint32_t ring_buffer_head = context[5];
166*61046927SAndroid Build Coastguard Worker uint32_t ring_buffer_tail = context[7];
167*61046927SAndroid Build Coastguard Worker uint32_t ring_buffer_start = context[9];
168*61046927SAndroid Build Coastguard Worker uint32_t ring_buffer_length = (context[11] & 0x1ff000) + 4096;
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker mem.pml4 = (uint64_t)context[49] << 32 | context[51];
171*61046927SAndroid Build Coastguard Worker batch_ctx.user_data = &mem;
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker struct intel_batch_decode_bo ring_bo = aub_mem_get_ggtt_bo(&mem,
174*61046927SAndroid Build Coastguard Worker ring_buffer_start);
175*61046927SAndroid Build Coastguard Worker assert(ring_bo.size > 0);
176*61046927SAndroid Build Coastguard Worker void *commands = (uint8_t *)ring_bo.map + (ring_buffer_start - ring_bo.addr) + ring_buffer_head;
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Worker batch_ctx.get_bo = get_bo;
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker batch_ctx.engine = engine;
181*61046927SAndroid Build Coastguard Worker intel_print_batch(&batch_ctx, commands,
182*61046927SAndroid Build Coastguard Worker MIN2(ring_buffer_tail - ring_buffer_head, ring_buffer_length),
183*61046927SAndroid Build Coastguard Worker ring_bo.addr + ring_buffer_head, true);
184*61046927SAndroid Build Coastguard Worker aub_mem_clear_bo_maps(&mem);
185*61046927SAndroid Build Coastguard Worker }
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker static struct intel_batch_decode_bo
get_legacy_bo(void * user_data,bool ppgtt,uint64_t addr)188*61046927SAndroid Build Coastguard Worker get_legacy_bo(void *user_data, bool ppgtt, uint64_t addr)
189*61046927SAndroid Build Coastguard Worker {
190*61046927SAndroid Build Coastguard Worker return aub_mem_get_ggtt_bo(user_data, addr);
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker static void
handle_ring_write(void * user_data,enum intel_engine_class engine,const void * data,uint32_t data_len)194*61046927SAndroid Build Coastguard Worker handle_ring_write(void *user_data, enum intel_engine_class engine,
195*61046927SAndroid Build Coastguard Worker const void *data, uint32_t data_len)
196*61046927SAndroid Build Coastguard Worker {
197*61046927SAndroid Build Coastguard Worker batch_ctx.user_data = &mem;
198*61046927SAndroid Build Coastguard Worker batch_ctx.get_bo = get_legacy_bo;
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker batch_ctx.engine = engine;
201*61046927SAndroid Build Coastguard Worker intel_print_batch(&batch_ctx, data, data_len, 0, false);
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard Worker aub_mem_clear_bo_maps(&mem);
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker struct aub_file {
207*61046927SAndroid Build Coastguard Worker FILE *stream;
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker void *map, *end, *cursor;
210*61046927SAndroid Build Coastguard Worker };
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker static struct aub_file *
aub_file_open(const char * filename)213*61046927SAndroid Build Coastguard Worker aub_file_open(const char *filename)
214*61046927SAndroid Build Coastguard Worker {
215*61046927SAndroid Build Coastguard Worker struct aub_file *file;
216*61046927SAndroid Build Coastguard Worker struct stat sb;
217*61046927SAndroid Build Coastguard Worker int fd;
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker file = calloc(1, sizeof *file);
220*61046927SAndroid Build Coastguard Worker if (file == NULL)
221*61046927SAndroid Build Coastguard Worker return NULL;
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker fd = open(filename, O_RDONLY);
224*61046927SAndroid Build Coastguard Worker if (fd == -1) {
225*61046927SAndroid Build Coastguard Worker fprintf(stderr, "open %s failed: %s\n", filename, strerror(errno));
226*61046927SAndroid Build Coastguard Worker free(file);
227*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
228*61046927SAndroid Build Coastguard Worker }
229*61046927SAndroid Build Coastguard Worker
230*61046927SAndroid Build Coastguard Worker if (fstat(fd, &sb) == -1) {
231*61046927SAndroid Build Coastguard Worker fprintf(stderr, "stat failed: %s\n", strerror(errno));
232*61046927SAndroid Build Coastguard Worker free(file);
233*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
234*61046927SAndroid Build Coastguard Worker }
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker file->map = mmap(NULL, sb.st_size,
237*61046927SAndroid Build Coastguard Worker PROT_READ, MAP_SHARED, fd, 0);
238*61046927SAndroid Build Coastguard Worker if (file->map == MAP_FAILED) {
239*61046927SAndroid Build Coastguard Worker fprintf(stderr, "mmap failed: %s\n", strerror(errno));
240*61046927SAndroid Build Coastguard Worker free(file);
241*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker close(fd);
245*61046927SAndroid Build Coastguard Worker
246*61046927SAndroid Build Coastguard Worker file->cursor = file->map;
247*61046927SAndroid Build Coastguard Worker file->end = file->map + sb.st_size;
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker return file;
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker static int
aub_file_more_stuff(struct aub_file * file)253*61046927SAndroid Build Coastguard Worker aub_file_more_stuff(struct aub_file *file)
254*61046927SAndroid Build Coastguard Worker {
255*61046927SAndroid Build Coastguard Worker return file->cursor < file->end || (file->stream && !feof(file->stream));
256*61046927SAndroid Build Coastguard Worker }
257*61046927SAndroid Build Coastguard Worker
258*61046927SAndroid Build Coastguard Worker static void
setup_pager(void)259*61046927SAndroid Build Coastguard Worker setup_pager(void)
260*61046927SAndroid Build Coastguard Worker {
261*61046927SAndroid Build Coastguard Worker int fds[2];
262*61046927SAndroid Build Coastguard Worker pid_t pid;
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker if (!isatty(1))
265*61046927SAndroid Build Coastguard Worker return;
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker if (pipe(fds) == -1)
268*61046927SAndroid Build Coastguard Worker return;
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker pid = fork();
271*61046927SAndroid Build Coastguard Worker if (pid == -1)
272*61046927SAndroid Build Coastguard Worker return;
273*61046927SAndroid Build Coastguard Worker
274*61046927SAndroid Build Coastguard Worker if (pid == 0) {
275*61046927SAndroid Build Coastguard Worker close(fds[1]);
276*61046927SAndroid Build Coastguard Worker dup2(fds[0], 0);
277*61046927SAndroid Build Coastguard Worker execlp("less", "less", "-FRSi", NULL);
278*61046927SAndroid Build Coastguard Worker }
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker close(fds[0]);
281*61046927SAndroid Build Coastguard Worker dup2(fds[1], 1);
282*61046927SAndroid Build Coastguard Worker close(fds[1]);
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker static void
print_help(const char * progname,FILE * file)286*61046927SAndroid Build Coastguard Worker print_help(const char *progname, FILE *file)
287*61046927SAndroid Build Coastguard Worker {
288*61046927SAndroid Build Coastguard Worker fprintf(file,
289*61046927SAndroid Build Coastguard Worker "Usage: %s [OPTION]... FILE\n"
290*61046927SAndroid Build Coastguard Worker "Decode aub file contents from FILE.\n\n"
291*61046927SAndroid Build Coastguard Worker " --help display this help and exit\n"
292*61046927SAndroid Build Coastguard Worker " --gen=platform decode for given platform (3 letter platform name)\n"
293*61046927SAndroid Build Coastguard Worker " --headers decode only command headers\n"
294*61046927SAndroid Build Coastguard Worker " --color[=WHEN] colorize the output; WHEN can be 'auto' (default\n"
295*61046927SAndroid Build Coastguard Worker " if omitted), 'always', or 'never'\n"
296*61046927SAndroid Build Coastguard Worker " --max-vbo-lines=N limit the number of decoded VBO lines\n"
297*61046927SAndroid Build Coastguard Worker " --no-pager don't launch pager\n"
298*61046927SAndroid Build Coastguard Worker " --no-offsets don't print instruction offsets\n"
299*61046927SAndroid Build Coastguard Worker " --xml=DIR load hardware xml description from directory DIR\n",
300*61046927SAndroid Build Coastguard Worker progname);
301*61046927SAndroid Build Coastguard Worker }
302*61046927SAndroid Build Coastguard Worker
main(int argc,char * argv[])303*61046927SAndroid Build Coastguard Worker int main(int argc, char *argv[])
304*61046927SAndroid Build Coastguard Worker {
305*61046927SAndroid Build Coastguard Worker struct aub_file *file;
306*61046927SAndroid Build Coastguard Worker int c, i;
307*61046927SAndroid Build Coastguard Worker bool help = false, pager = true;
308*61046927SAndroid Build Coastguard Worker const struct option aubinator_opts[] = {
309*61046927SAndroid Build Coastguard Worker { "help", no_argument, (int *) &help, true },
310*61046927SAndroid Build Coastguard Worker { "no-pager", no_argument, (int *) &pager, false },
311*61046927SAndroid Build Coastguard Worker { "no-offsets", no_argument, (int *) &option_print_offsets, false },
312*61046927SAndroid Build Coastguard Worker { "gen", required_argument, NULL, 'g' },
313*61046927SAndroid Build Coastguard Worker { "headers", no_argument, (int *) &option_full_decode, false },
314*61046927SAndroid Build Coastguard Worker { "color", optional_argument, NULL, 'c' },
315*61046927SAndroid Build Coastguard Worker { "xml", required_argument, NULL, 'x' },
316*61046927SAndroid Build Coastguard Worker { "max-vbo-lines", required_argument, NULL, 'v' },
317*61046927SAndroid Build Coastguard Worker { NULL, 0, NULL, 0 }
318*61046927SAndroid Build Coastguard Worker };
319*61046927SAndroid Build Coastguard Worker
320*61046927SAndroid Build Coastguard Worker outfile = stdout;
321*61046927SAndroid Build Coastguard Worker
322*61046927SAndroid Build Coastguard Worker i = 0;
323*61046927SAndroid Build Coastguard Worker while ((c = getopt_long(argc, argv, "", aubinator_opts, &i)) != -1) {
324*61046927SAndroid Build Coastguard Worker switch (c) {
325*61046927SAndroid Build Coastguard Worker case 'g': {
326*61046927SAndroid Build Coastguard Worker const int id = intel_device_name_to_pci_device_id(optarg);
327*61046927SAndroid Build Coastguard Worker if (id < 0) {
328*61046927SAndroid Build Coastguard Worker fprintf(stderr, "can't parse gen: '%s', expected lpt, brw, g4x, ilk, "
329*61046927SAndroid Build Coastguard Worker "snb, ivb, hsw, byt, bdw, chv, skl, bxt, kbl, "
330*61046927SAndroid Build Coastguard Worker "aml, glk, cfl, whl, cml, icl, ehl, jsl, tgl, "
331*61046927SAndroid Build Coastguard Worker "rkl, dg1, adl, sg1, rpl, dg2\n", optarg);
332*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
333*61046927SAndroid Build Coastguard Worker } else {
334*61046927SAndroid Build Coastguard Worker pci_id = id;
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker break;
337*61046927SAndroid Build Coastguard Worker }
338*61046927SAndroid Build Coastguard Worker case 'c':
339*61046927SAndroid Build Coastguard Worker if (optarg == NULL || strcmp(optarg, "always") == 0)
340*61046927SAndroid Build Coastguard Worker option_color = COLOR_ALWAYS;
341*61046927SAndroid Build Coastguard Worker else if (strcmp(optarg, "never") == 0)
342*61046927SAndroid Build Coastguard Worker option_color = COLOR_NEVER;
343*61046927SAndroid Build Coastguard Worker else if (strcmp(optarg, "auto") == 0)
344*61046927SAndroid Build Coastguard Worker option_color = COLOR_AUTO;
345*61046927SAndroid Build Coastguard Worker else {
346*61046927SAndroid Build Coastguard Worker fprintf(stderr, "invalid value for --color: %s", optarg);
347*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
348*61046927SAndroid Build Coastguard Worker }
349*61046927SAndroid Build Coastguard Worker break;
350*61046927SAndroid Build Coastguard Worker case 'x':
351*61046927SAndroid Build Coastguard Worker xml_path = strdup(optarg);
352*61046927SAndroid Build Coastguard Worker break;
353*61046927SAndroid Build Coastguard Worker case 'v':
354*61046927SAndroid Build Coastguard Worker max_vbo_lines = atoi(optarg);
355*61046927SAndroid Build Coastguard Worker break;
356*61046927SAndroid Build Coastguard Worker default:
357*61046927SAndroid Build Coastguard Worker break;
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker }
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Worker if (optind < argc)
362*61046927SAndroid Build Coastguard Worker input_file = argv[optind];
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Worker if (help || !input_file) {
365*61046927SAndroid Build Coastguard Worker print_help(argv[0], stderr);
366*61046927SAndroid Build Coastguard Worker exit(0);
367*61046927SAndroid Build Coastguard Worker }
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker /* Do this before we redirect stdout to pager. */
370*61046927SAndroid Build Coastguard Worker if (option_color == COLOR_AUTO)
371*61046927SAndroid Build Coastguard Worker option_color = isatty(1) ? COLOR_ALWAYS : COLOR_NEVER;
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker if (isatty(1) && pager)
374*61046927SAndroid Build Coastguard Worker setup_pager();
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker if (!aub_mem_init(&mem)) {
377*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Unable to create GTT\n");
378*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
379*61046927SAndroid Build Coastguard Worker }
380*61046927SAndroid Build Coastguard Worker
381*61046927SAndroid Build Coastguard Worker file = aub_file_open(input_file);
382*61046927SAndroid Build Coastguard Worker if (!file) {
383*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Unable to allocate buffer to open aub file\n");
384*61046927SAndroid Build Coastguard Worker free(xml_path);
385*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
386*61046927SAndroid Build Coastguard Worker }
387*61046927SAndroid Build Coastguard Worker
388*61046927SAndroid Build Coastguard Worker struct aub_read aub_read = {
389*61046927SAndroid Build Coastguard Worker .user_data = &mem,
390*61046927SAndroid Build Coastguard Worker .error = aubinator_error,
391*61046927SAndroid Build Coastguard Worker .info = aubinator_init,
392*61046927SAndroid Build Coastguard Worker .comment = aubinator_comment,
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker .local_write = aub_mem_local_write,
395*61046927SAndroid Build Coastguard Worker .phys_write = aub_mem_phys_write,
396*61046927SAndroid Build Coastguard Worker .ggtt_write = aub_mem_ggtt_write,
397*61046927SAndroid Build Coastguard Worker .ggtt_entry_write = aub_mem_ggtt_entry_write,
398*61046927SAndroid Build Coastguard Worker
399*61046927SAndroid Build Coastguard Worker .execlist_write = handle_execlist_write,
400*61046927SAndroid Build Coastguard Worker .ring_write = handle_ring_write,
401*61046927SAndroid Build Coastguard Worker };
402*61046927SAndroid Build Coastguard Worker int consumed;
403*61046927SAndroid Build Coastguard Worker while (aub_file_more_stuff(file) &&
404*61046927SAndroid Build Coastguard Worker (consumed = aub_read_command(&aub_read, file->cursor,
405*61046927SAndroid Build Coastguard Worker file->end - file->cursor)) > 0) {
406*61046927SAndroid Build Coastguard Worker file->cursor += consumed;
407*61046927SAndroid Build Coastguard Worker }
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker aub_mem_fini(&mem);
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker fflush(stdout);
412*61046927SAndroid Build Coastguard Worker /* close the stdout which is opened to write the output */
413*61046927SAndroid Build Coastguard Worker close(1);
414*61046927SAndroid Build Coastguard Worker free(file);
415*61046927SAndroid Build Coastguard Worker free(xml_path);
416*61046927SAndroid Build Coastguard Worker
417*61046927SAndroid Build Coastguard Worker wait(NULL);
418*61046927SAndroid Build Coastguard Worker intel_batch_decode_ctx_finish(&batch_ctx);
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker return EXIT_SUCCESS;
421*61046927SAndroid Build Coastguard Worker }
422