xref: /aosp_15_r20/external/mesa3d/src/intel/tools/aubinator.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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