xref: /aosp_15_r20/external/mesa3d/src/intel/tools/aub_read.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2016-2018 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 
25*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
26*61046927SAndroid Build Coastguard Worker #include <stdio.h>
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include <string.h>
29*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #include "common/intel_gem.h"
32*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #include "aub_read.h"
35*61046927SAndroid Build Coastguard Worker #include "intel_context.h"
36*61046927SAndroid Build Coastguard Worker #include "intel_aub.h"
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker #define TYPE(dw)       (((dw) >> 29) & 7)
39*61046927SAndroid Build Coastguard Worker #define OPCODE(dw)     (((dw) >> 23) & 0x3f)
40*61046927SAndroid Build Coastguard Worker #define SUBOPCODE(dw)  (((dw) >> 16) & 0x7f)
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #define MAKE_HEADER(type, opcode, subopcode) \
43*61046927SAndroid Build Coastguard Worker                    ((((unsigned) (type)) << 29) | ((opcode) << 23) | ((subopcode) << 16))
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker #define TYPE_AUB            0x7
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker /* Classic AUB opcodes */
48*61046927SAndroid Build Coastguard Worker #define OPCODE_AUB          0x01
49*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_HEADER    0x05
50*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_BLOCK     0x41
51*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_BMP       0x1e
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker /* Newer version AUB opcode */
54*61046927SAndroid Build Coastguard Worker #define OPCODE_NEW_AUB              0x2e
55*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_VERSION           0x00
56*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_REG_CMP           0x01
57*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_REG_POLL          0x02
58*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_REG_WRITE         0x03
59*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_MEM_CMP           0x04
60*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_MEM_POLL          0x05
61*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_MEM_WRITE         0x06
62*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_FRAME_BEGIN       0x07
63*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_COMMENT           0x08
64*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_TRACE_DELAY       0x09
65*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_MEM_DUMP          0x0a
66*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_MEM_WRITE_DISCONT 0x0b
67*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_TEST_PHASE_MARKER 0x0c
68*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_MEM_CONT_REGION   0x0d
69*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_VERSION_EXT       0x0e
70*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_PREDICATE         0x0f
71*61046927SAndroid Build Coastguard Worker #define SUBOPCODE_DUMP_COMPRESS     0x10
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker static PRINTFLIKE(3, 4) void
parse_error(struct aub_read * read,const uint32_t * p,const char * fmt,...)74*61046927SAndroid Build Coastguard Worker parse_error(struct aub_read *read, const uint32_t *p, const char *fmt, ...)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker    if (!read->error)
77*61046927SAndroid Build Coastguard Worker       return;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    va_list ap;
80*61046927SAndroid Build Coastguard Worker    va_start(ap, fmt);
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    char msg[80];
83*61046927SAndroid Build Coastguard Worker    vsnprintf(msg, sizeof(msg), fmt, ap);
84*61046927SAndroid Build Coastguard Worker    read->error(read->user_data, p, msg);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    va_end(ap);
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker static bool
handle_trace_header(struct aub_read * read,const uint32_t * p)90*61046927SAndroid Build Coastguard Worker handle_trace_header(struct aub_read *read, const uint32_t *p)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker    /* The intel_aubdump tool from IGT is kind enough to put a PCI-ID= tag in
93*61046927SAndroid Build Coastguard Worker     * the AUB header comment.  If the user hasn't specified a hardware
94*61046927SAndroid Build Coastguard Worker     * generation, try to use the one from the AUB file.
95*61046927SAndroid Build Coastguard Worker     */
96*61046927SAndroid Build Coastguard Worker    const uint32_t *end = p + (p[0] & 0xffff) + 2;
97*61046927SAndroid Build Coastguard Worker    int aub_pci_id = 0;
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    if (end > &p[12] && p[12] > 0) {
100*61046927SAndroid Build Coastguard Worker       if (sscanf((char *)&p[13], "PCI-ID=%i", &aub_pci_id) > 0) {
101*61046927SAndroid Build Coastguard Worker          if (!intel_get_device_info_from_pci_id(aub_pci_id, &read->devinfo)) {
102*61046927SAndroid Build Coastguard Worker             parse_error(read, p,
103*61046927SAndroid Build Coastguard Worker                         "can't find device information: pci_id=0x%x\n", aub_pci_id);
104*61046927SAndroid Build Coastguard Worker             return false;
105*61046927SAndroid Build Coastguard Worker          }
106*61046927SAndroid Build Coastguard Worker       }
107*61046927SAndroid Build Coastguard Worker    }
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    char app_name[33];
110*61046927SAndroid Build Coastguard Worker    strncpy(app_name, (const char *)&p[2], 32);
111*61046927SAndroid Build Coastguard Worker    app_name[32] = 0;
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    if (read->info)
114*61046927SAndroid Build Coastguard Worker       read->info(read->user_data, aub_pci_id, app_name);
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker    return true;
117*61046927SAndroid Build Coastguard Worker }
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker static bool
handle_memtrace_version(struct aub_read * read,const uint32_t * p)120*61046927SAndroid Build Coastguard Worker handle_memtrace_version(struct aub_read *read, const uint32_t *p)
121*61046927SAndroid Build Coastguard Worker {
122*61046927SAndroid Build Coastguard Worker    int header_length = p[0] & 0xffff;
123*61046927SAndroid Build Coastguard Worker    char app_name[64];
124*61046927SAndroid Build Coastguard Worker    int app_name_len = MIN2(4 * (header_length + 1 - 5), ARRAY_SIZE(app_name) - 1);
125*61046927SAndroid Build Coastguard Worker    int pci_id_len = 0;
126*61046927SAndroid Build Coastguard Worker    int aub_pci_id = 0;
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker    strncpy(app_name, (const char *)&p[5], app_name_len);
129*61046927SAndroid Build Coastguard Worker    app_name[app_name_len] = 0;
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker    if (sscanf(app_name, "PCI-ID=%i %n", &aub_pci_id, &pci_id_len) > 0) {
132*61046927SAndroid Build Coastguard Worker       if (!intel_get_device_info_from_pci_id(aub_pci_id, &read->devinfo)) {
133*61046927SAndroid Build Coastguard Worker          parse_error(read, p, "can't find device information: pci_id=0x%x\n", aub_pci_id);
134*61046927SAndroid Build Coastguard Worker          return false;
135*61046927SAndroid Build Coastguard Worker       }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker       if (read->info)
138*61046927SAndroid Build Coastguard Worker          read->info(read->user_data, aub_pci_id, app_name + pci_id_len);
139*61046927SAndroid Build Coastguard Worker    }
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    return true;
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker static bool
handle_trace_block(struct aub_read * read,const uint32_t * p)145*61046927SAndroid Build Coastguard Worker handle_trace_block(struct aub_read *read, const uint32_t *p)
146*61046927SAndroid Build Coastguard Worker {
147*61046927SAndroid Build Coastguard Worker    int operation = p[1] & AUB_TRACE_OPERATION_MASK;
148*61046927SAndroid Build Coastguard Worker    int type = p[1] & AUB_TRACE_TYPE_MASK;
149*61046927SAndroid Build Coastguard Worker    int address_space = p[1] & AUB_TRACE_ADDRESS_SPACE_MASK;
150*61046927SAndroid Build Coastguard Worker    int header_length = p[0] & 0xffff;
151*61046927SAndroid Build Coastguard Worker    enum intel_engine_class engine = INTEL_ENGINE_CLASS_RENDER;
152*61046927SAndroid Build Coastguard Worker    const void *data = p + header_length + 2;
153*61046927SAndroid Build Coastguard Worker    uint64_t address = intel_48b_address((read->devinfo.ver >= 8 ? ((uint64_t) p[5] << 32) : 0) |
154*61046927SAndroid Build Coastguard Worker                                         ((uint64_t) p[3]));
155*61046927SAndroid Build Coastguard Worker    uint32_t size = p[4];
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    switch (operation) {
158*61046927SAndroid Build Coastguard Worker    case AUB_TRACE_OP_DATA_WRITE:
159*61046927SAndroid Build Coastguard Worker       if (address_space == AUB_TRACE_MEMTYPE_GTT) {
160*61046927SAndroid Build Coastguard Worker          if (read->local_write)
161*61046927SAndroid Build Coastguard Worker             read->local_write(read->user_data, address, data, size);
162*61046927SAndroid Build Coastguard Worker       break;
163*61046927SAndroid Build Coastguard Worker    case AUB_TRACE_OP_COMMAND_WRITE:
164*61046927SAndroid Build Coastguard Worker       switch (type) {
165*61046927SAndroid Build Coastguard Worker       case AUB_TRACE_TYPE_RING_PRB0:
166*61046927SAndroid Build Coastguard Worker          engine = INTEL_ENGINE_CLASS_RENDER;
167*61046927SAndroid Build Coastguard Worker          break;
168*61046927SAndroid Build Coastguard Worker       case AUB_TRACE_TYPE_RING_PRB1:
169*61046927SAndroid Build Coastguard Worker          engine = INTEL_ENGINE_CLASS_VIDEO;
170*61046927SAndroid Build Coastguard Worker          break;
171*61046927SAndroid Build Coastguard Worker       case AUB_TRACE_TYPE_RING_PRB2:
172*61046927SAndroid Build Coastguard Worker          engine = INTEL_ENGINE_CLASS_COPY;
173*61046927SAndroid Build Coastguard Worker          break;
174*61046927SAndroid Build Coastguard Worker       default:
175*61046927SAndroid Build Coastguard Worker          parse_error(read, p, "command write to unknown ring %d\n", type);
176*61046927SAndroid Build Coastguard Worker          return false;
177*61046927SAndroid Build Coastguard Worker       }
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker       if (read->ring_write)
180*61046927SAndroid Build Coastguard Worker          read->ring_write(read->user_data, engine, data, size);
181*61046927SAndroid Build Coastguard Worker       break;
182*61046927SAndroid Build Coastguard Worker       }
183*61046927SAndroid Build Coastguard Worker    }
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker    return true;
186*61046927SAndroid Build Coastguard Worker }
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker static void
handle_memtrace_reg_write(struct aub_read * read,const uint32_t * p)189*61046927SAndroid Build Coastguard Worker handle_memtrace_reg_write(struct aub_read *read, const uint32_t *p)
190*61046927SAndroid Build Coastguard Worker {
191*61046927SAndroid Build Coastguard Worker    uint32_t offset = p[1];
192*61046927SAndroid Build Coastguard Worker    uint32_t value = p[5];
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker    if (read->reg_write)
195*61046927SAndroid Build Coastguard Worker       read->reg_write(read->user_data, offset, value);
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    enum intel_engine_class engine;
198*61046927SAndroid Build Coastguard Worker    uint64_t context_descriptor;
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker    switch (offset) {
201*61046927SAndroid Build Coastguard Worker    case RCSUNIT(EXECLIST_SUBMITPORT): /* render elsp */
202*61046927SAndroid Build Coastguard Worker       read->render_elsp[read->render_elsp_index++] = value;
203*61046927SAndroid Build Coastguard Worker       if (read->render_elsp_index < 4)
204*61046927SAndroid Build Coastguard Worker          return;
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker       read->render_elsp_index = 0;
207*61046927SAndroid Build Coastguard Worker       engine = INTEL_ENGINE_CLASS_RENDER;
208*61046927SAndroid Build Coastguard Worker       context_descriptor = (uint64_t)read->render_elsp[2] << 32 |
209*61046927SAndroid Build Coastguard Worker          read->render_elsp[3];
210*61046927SAndroid Build Coastguard Worker       break;
211*61046927SAndroid Build Coastguard Worker    case VCSUNIT0(EXECLIST_SUBMITPORT): /* video elsp */
212*61046927SAndroid Build Coastguard Worker       read->video_elsp[read->video_elsp_index++] = value;
213*61046927SAndroid Build Coastguard Worker       if (read->video_elsp_index < 4)
214*61046927SAndroid Build Coastguard Worker          return;
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker       read->video_elsp_index = 0;
217*61046927SAndroid Build Coastguard Worker       engine = INTEL_ENGINE_CLASS_VIDEO;
218*61046927SAndroid Build Coastguard Worker       context_descriptor = (uint64_t)read->video_elsp[2] << 32 |
219*61046927SAndroid Build Coastguard Worker          read->video_elsp[3];
220*61046927SAndroid Build Coastguard Worker       break;
221*61046927SAndroid Build Coastguard Worker    case BCSUNIT0(EXECLIST_SUBMITPORT): /* blitter elsp */
222*61046927SAndroid Build Coastguard Worker       read->blitter_elsp[read->blitter_elsp_index++] = value;
223*61046927SAndroid Build Coastguard Worker       if (read->blitter_elsp_index < 4)
224*61046927SAndroid Build Coastguard Worker          return;
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker       read->blitter_elsp_index = 0;
227*61046927SAndroid Build Coastguard Worker       engine = INTEL_ENGINE_CLASS_COPY;
228*61046927SAndroid Build Coastguard Worker       context_descriptor = (uint64_t)read->blitter_elsp[2] << 32 |
229*61046927SAndroid Build Coastguard Worker          read->blitter_elsp[3];
230*61046927SAndroid Build Coastguard Worker       break;
231*61046927SAndroid Build Coastguard Worker    case RCSUNIT(EXECLIST_SQ_CONTENTS): /* render elsq0 lo */
232*61046927SAndroid Build Coastguard Worker       read->render_elsp[3] = value;
233*61046927SAndroid Build Coastguard Worker       return;
234*61046927SAndroid Build Coastguard Worker    case RCSUNIT(EXECLIST_SQ_CONTENTS) + 4: /* render elsq0 hi */
235*61046927SAndroid Build Coastguard Worker       read->render_elsp[2] = value;
236*61046927SAndroid Build Coastguard Worker       return;
237*61046927SAndroid Build Coastguard Worker    case VCSUNIT0(EXECLIST_SQ_CONTENTS): /* video elsq0 lo */
238*61046927SAndroid Build Coastguard Worker       read->video_elsp[3] = value;
239*61046927SAndroid Build Coastguard Worker       return;
240*61046927SAndroid Build Coastguard Worker    case VCSUNIT0(EXECLIST_SQ_CONTENTS) + 4: /* video elsq0 hi */
241*61046927SAndroid Build Coastguard Worker       read->video_elsp[2] = value;
242*61046927SAndroid Build Coastguard Worker       return;
243*61046927SAndroid Build Coastguard Worker    case BCSUNIT0(EXECLIST_SQ_CONTENTS): /* blitter elsq0 lo */
244*61046927SAndroid Build Coastguard Worker       read->blitter_elsp[3] = value;
245*61046927SAndroid Build Coastguard Worker       return;
246*61046927SAndroid Build Coastguard Worker    case BCSUNIT0(EXECLIST_SQ_CONTENTS) + 4: /* blitter elsq0 hi */
247*61046927SAndroid Build Coastguard Worker       read->blitter_elsp[2] = value;
248*61046927SAndroid Build Coastguard Worker       return;
249*61046927SAndroid Build Coastguard Worker    case RCSUNIT(EXECLIST_CONTROL): /* render elsc */
250*61046927SAndroid Build Coastguard Worker       engine = INTEL_ENGINE_CLASS_RENDER;
251*61046927SAndroid Build Coastguard Worker       context_descriptor = (uint64_t)read->render_elsp[2] << 32 |
252*61046927SAndroid Build Coastguard Worker          read->render_elsp[3];
253*61046927SAndroid Build Coastguard Worker       break;
254*61046927SAndroid Build Coastguard Worker    case VCSUNIT0(EXECLIST_CONTROL): /* video_elsc */
255*61046927SAndroid Build Coastguard Worker       engine = INTEL_ENGINE_CLASS_VIDEO;
256*61046927SAndroid Build Coastguard Worker       context_descriptor = (uint64_t)read->video_elsp[2] << 32 |
257*61046927SAndroid Build Coastguard Worker          read->video_elsp[3];
258*61046927SAndroid Build Coastguard Worker       break;
259*61046927SAndroid Build Coastguard Worker    case BCSUNIT0(EXECLIST_CONTROL): /* blitter elsc */
260*61046927SAndroid Build Coastguard Worker       engine = INTEL_ENGINE_CLASS_COPY;
261*61046927SAndroid Build Coastguard Worker       context_descriptor = (uint64_t)read->blitter_elsp[2] << 32 |
262*61046927SAndroid Build Coastguard Worker          read->blitter_elsp[3];
263*61046927SAndroid Build Coastguard Worker       break;
264*61046927SAndroid Build Coastguard Worker    default:
265*61046927SAndroid Build Coastguard Worker       return;
266*61046927SAndroid Build Coastguard Worker    }
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker    if (read->execlist_write)
269*61046927SAndroid Build Coastguard Worker       read->execlist_write(read->user_data, engine, context_descriptor);
270*61046927SAndroid Build Coastguard Worker }
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker static void
do_write(struct aub_read * read,uint32_t address_space,uint64_t addr,const void * data,uint32_t size)273*61046927SAndroid Build Coastguard Worker do_write(struct aub_read *read, uint32_t address_space, uint64_t addr, const void *data, uint32_t size)
274*61046927SAndroid Build Coastguard Worker {
275*61046927SAndroid Build Coastguard Worker    if (0)
276*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "*0x%" PRIx64 " = *0x%p (%d)\n", addr, data, size);
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker    switch (address_space) {
279*61046927SAndroid Build Coastguard Worker    case 0: /* GGTT */
280*61046927SAndroid Build Coastguard Worker       if (read->ggtt_write)
281*61046927SAndroid Build Coastguard Worker          read->ggtt_write(read->user_data, addr, data, size);
282*61046927SAndroid Build Coastguard Worker       break;
283*61046927SAndroid Build Coastguard Worker    case 1: /* Local */
284*61046927SAndroid Build Coastguard Worker       if (read->local_write)
285*61046927SAndroid Build Coastguard Worker          read->local_write(read->user_data, addr, data, size);
286*61046927SAndroid Build Coastguard Worker       break;
287*61046927SAndroid Build Coastguard Worker    case 2: /* Physical */
288*61046927SAndroid Build Coastguard Worker       if (read->phys_write)
289*61046927SAndroid Build Coastguard Worker          read->phys_write(read->user_data, addr, data, size);
290*61046927SAndroid Build Coastguard Worker       break;
291*61046927SAndroid Build Coastguard Worker    case 4: /* GGTT Entry */
292*61046927SAndroid Build Coastguard Worker       if (read->ggtt_entry_write)
293*61046927SAndroid Build Coastguard Worker          read->ggtt_entry_write(read->user_data, addr, data, size);
294*61046927SAndroid Build Coastguard Worker       break;
295*61046927SAndroid Build Coastguard Worker    }
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker static void
handle_memtrace_mem_write(struct aub_read * read,const uint32_t * p)299*61046927SAndroid Build Coastguard Worker handle_memtrace_mem_write(struct aub_read *read, const uint32_t *p)
300*61046927SAndroid Build Coastguard Worker {
301*61046927SAndroid Build Coastguard Worker    const void *data = p + 5;
302*61046927SAndroid Build Coastguard Worker    uint64_t addr = intel_48b_address(*(uint64_t*)&p[1]);
303*61046927SAndroid Build Coastguard Worker    uint32_t size = p[4];
304*61046927SAndroid Build Coastguard Worker    uint32_t address_space = p[3] >> 28;
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker    do_write(read, address_space, addr, data, size);
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker static void
handle_memtrace_mem_write_discont(struct aub_read * read,const uint32_t * p)310*61046927SAndroid Build Coastguard Worker handle_memtrace_mem_write_discont(struct aub_read *read, const uint32_t *p)
311*61046927SAndroid Build Coastguard Worker {
312*61046927SAndroid Build Coastguard Worker    uint32_t address_space = p[1] >> 28;
313*61046927SAndroid Build Coastguard Worker    const struct {
314*61046927SAndroid Build Coastguard Worker       uint64_t address;
315*61046927SAndroid Build Coastguard Worker       uint32_t size;
316*61046927SAndroid Build Coastguard Worker    } __attribute__((packed)) *cur = (const void *)(p + 2);
317*61046927SAndroid Build Coastguard Worker    const void *data = p + 2 + 3 * 63;
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < 63; ++i, ++cur) {
320*61046927SAndroid Build Coastguard Worker       uint64_t addr = intel_48b_address(cur->address);
321*61046927SAndroid Build Coastguard Worker       uint32_t size = cur->size;
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker       if (size == 0)
324*61046927SAndroid Build Coastguard Worker          continue;
325*61046927SAndroid Build Coastguard Worker 
326*61046927SAndroid Build Coastguard Worker       do_write(read, address_space, addr, data, size);
327*61046927SAndroid Build Coastguard Worker    }
328*61046927SAndroid Build Coastguard Worker }
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker int
aub_read_command(struct aub_read * read,const void * data,uint32_t data_len)331*61046927SAndroid Build Coastguard Worker aub_read_command(struct aub_read *read, const void *data, uint32_t data_len)
332*61046927SAndroid Build Coastguard Worker {
333*61046927SAndroid Build Coastguard Worker    const uint32_t *p = data, *next;
334*61046927SAndroid Build Coastguard Worker    ASSERTED const uint32_t *end = data + data_len;
335*61046927SAndroid Build Coastguard Worker    uint32_t h, header_length, bias;
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker    assert(data_len >= 4);
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker    h = *p;
340*61046927SAndroid Build Coastguard Worker    header_length = h & 0xffff;
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker    switch (OPCODE(h)) {
343*61046927SAndroid Build Coastguard Worker    case OPCODE_AUB:
344*61046927SAndroid Build Coastguard Worker       bias = 2;
345*61046927SAndroid Build Coastguard Worker       break;
346*61046927SAndroid Build Coastguard Worker    case OPCODE_NEW_AUB:
347*61046927SAndroid Build Coastguard Worker       bias = 1;
348*61046927SAndroid Build Coastguard Worker       break;
349*61046927SAndroid Build Coastguard Worker    default:
350*61046927SAndroid Build Coastguard Worker       parse_error(read, data, "unknown opcode %d\n", OPCODE(h));
351*61046927SAndroid Build Coastguard Worker       return -1;
352*61046927SAndroid Build Coastguard Worker    }
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker    next = p + header_length + bias;
355*61046927SAndroid Build Coastguard Worker    if ((h & 0xffff0000) == MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BLOCK)) {
356*61046927SAndroid Build Coastguard Worker       assert(end - p >= 4);
357*61046927SAndroid Build Coastguard Worker       next += p[4] / 4;
358*61046927SAndroid Build Coastguard Worker    }
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker    if (next > end) {
361*61046927SAndroid Build Coastguard Worker       parse_error(read, data,
362*61046927SAndroid Build Coastguard Worker             "input ends unexpectedly (command length: %zu, remaining bytes: %zu)\n",
363*61046927SAndroid Build Coastguard Worker             (uintptr_t)next - (uintptr_t)data,
364*61046927SAndroid Build Coastguard Worker             (uintptr_t)end  - (uintptr_t)data);
365*61046927SAndroid Build Coastguard Worker       return -1;
366*61046927SAndroid Build Coastguard Worker    }
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker    if (0) {
369*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "0x%x, 0x%x, 0x%x, len: %d\n",
370*61046927SAndroid Build Coastguard Worker             TYPE(h), OPCODE(h), SUBOPCODE(h), header_length);
371*61046927SAndroid Build Coastguard Worker       for (const uint32_t *cur = p; cur < next; ++cur)
372*61046927SAndroid Build Coastguard Worker          fprintf(stderr, "0x%08x ", *cur);
373*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "\n");
374*61046927SAndroid Build Coastguard Worker    }
375*61046927SAndroid Build Coastguard Worker 
376*61046927SAndroid Build Coastguard Worker    switch (h & 0xffff0000) {
377*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_HEADER):
378*61046927SAndroid Build Coastguard Worker       if (!handle_trace_header(read, p))
379*61046927SAndroid Build Coastguard Worker          return -1;
380*61046927SAndroid Build Coastguard Worker       break;
381*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BLOCK):
382*61046927SAndroid Build Coastguard Worker       if (!handle_trace_block(read, p))
383*61046927SAndroid Build Coastguard Worker          return -1;
384*61046927SAndroid Build Coastguard Worker       break;
385*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_AUB, SUBOPCODE_BMP):
386*61046927SAndroid Build Coastguard Worker       break;
387*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_VERSION_EXT):
388*61046927SAndroid Build Coastguard Worker       if (!handle_memtrace_version(read, p))
389*61046927SAndroid Build Coastguard Worker          return -1;
390*61046927SAndroid Build Coastguard Worker       break;
391*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_WRITE):
392*61046927SAndroid Build Coastguard Worker       handle_memtrace_reg_write(read, p);
393*61046927SAndroid Build Coastguard Worker       break;
394*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_WRITE):
395*61046927SAndroid Build Coastguard Worker       handle_memtrace_mem_write(read, p);
396*61046927SAndroid Build Coastguard Worker       break;
397*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_POLL):
398*61046927SAndroid Build Coastguard Worker       /* fprintf(outfile, "memory poll block (dwords %d):\n", h & 0xffff); */
399*61046927SAndroid Build Coastguard Worker       break;
400*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_POLL):
401*61046927SAndroid Build Coastguard Worker       break;
402*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_COMMENT):
403*61046927SAndroid Build Coastguard Worker       if (read->comment)
404*61046927SAndroid Build Coastguard Worker          read->comment(read->user_data, (const char *)(p + 2));
405*61046927SAndroid Build Coastguard Worker       break;
406*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_WRITE_DISCONT):
407*61046927SAndroid Build Coastguard Worker       handle_memtrace_mem_write_discont(read, p);
408*61046927SAndroid Build Coastguard Worker       break;
409*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_VERSION):
410*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_REG_CMP):
411*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_CMP):
412*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_FRAME_BEGIN):
413*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_TRACE_DELAY):
414*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_DUMP):
415*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_TEST_PHASE_MARKER):
416*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_MEM_CONT_REGION):
417*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_PREDICATE):
418*61046927SAndroid Build Coastguard Worker    case MAKE_HEADER(TYPE_AUB, OPCODE_NEW_AUB, SUBOPCODE_DUMP_COMPRESS):
419*61046927SAndroid Build Coastguard Worker    default:
420*61046927SAndroid Build Coastguard Worker       parse_error(read, p,
421*61046927SAndroid Build Coastguard Worker                   "unknown block type=0x%x, opcode=0x%x, subopcode=0x%x (%08x)\n",
422*61046927SAndroid Build Coastguard Worker                   TYPE(h), OPCODE(h), SUBOPCODE(h), h);
423*61046927SAndroid Build Coastguard Worker       return -1;
424*61046927SAndroid Build Coastguard Worker    }
425*61046927SAndroid Build Coastguard Worker 
426*61046927SAndroid Build Coastguard Worker    return (next - p) * sizeof(*p);
427*61046927SAndroid Build Coastguard Worker }
428