1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2015 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 "aub_write.h"
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
27*61046927SAndroid Build Coastguard Worker #include <signal.h>
28*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
29*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
30*61046927SAndroid Build Coastguard Worker #include <string.h>
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker #include "intel_aub.h"
33*61046927SAndroid Build Coastguard Worker #include "intel_context.h"
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker #define MI_BATCH_NON_SECURE_I965 (1 << 8)
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker #define min(a, b) ({ \
40*61046927SAndroid Build Coastguard Worker __typeof(a) _a = (a); \
41*61046927SAndroid Build Coastguard Worker __typeof(b) _b = (b); \
42*61046927SAndroid Build Coastguard Worker _a < _b ? _a : _b; \
43*61046927SAndroid Build Coastguard Worker })
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker #define max(a, b) ({ \
46*61046927SAndroid Build Coastguard Worker __typeof(a) _a = (a); \
47*61046927SAndroid Build Coastguard Worker __typeof(b) _b = (b); \
48*61046927SAndroid Build Coastguard Worker _a > _b ? _a : _b; \
49*61046927SAndroid Build Coastguard Worker })
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker static struct aub_context *aub_context_new(struct aub_file *aub, uint32_t new_id);
52*61046927SAndroid Build Coastguard Worker static void mem_trace_memory_write_header_out(struct aub_file *aub, uint64_t addr,
53*61046927SAndroid Build Coastguard Worker uint32_t len, uint32_t addr_space,
54*61046927SAndroid Build Coastguard Worker const char *desc);
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker #define fail_if(cond, ...) _fail_if(cond, NULL, __VA_ARGS__)
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker static void
aub_ppgtt_table_finish(struct aub_ppgtt_table * table,int level)59*61046927SAndroid Build Coastguard Worker aub_ppgtt_table_finish(struct aub_ppgtt_table *table, int level)
60*61046927SAndroid Build Coastguard Worker {
61*61046927SAndroid Build Coastguard Worker if (level == 1)
62*61046927SAndroid Build Coastguard Worker return;
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(table->subtables); i++) {
65*61046927SAndroid Build Coastguard Worker if (table->subtables[i]) {
66*61046927SAndroid Build Coastguard Worker aub_ppgtt_table_finish(table->subtables[i], level - 1);
67*61046927SAndroid Build Coastguard Worker free(table->subtables[i]);
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker static void
data_out(struct aub_file * aub,const void * data,size_t size)73*61046927SAndroid Build Coastguard Worker data_out(struct aub_file *aub, const void *data, size_t size)
74*61046927SAndroid Build Coastguard Worker {
75*61046927SAndroid Build Coastguard Worker if (size == 0)
76*61046927SAndroid Build Coastguard Worker return;
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker fail_if(fwrite(data, 1, size, aub->file) == 0,
79*61046927SAndroid Build Coastguard Worker "Writing to output failed\n");
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker static void
dword_out(struct aub_file * aub,uint32_t data)83*61046927SAndroid Build Coastguard Worker dword_out(struct aub_file *aub, uint32_t data)
84*61046927SAndroid Build Coastguard Worker {
85*61046927SAndroid Build Coastguard Worker data_out(aub, &data, sizeof(data));
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker static void
write_execlists_header(struct aub_file * aub,const char * name)89*61046927SAndroid Build Coastguard Worker write_execlists_header(struct aub_file *aub, const char *name)
90*61046927SAndroid Build Coastguard Worker {
91*61046927SAndroid Build Coastguard Worker char app_name[8 * 4];
92*61046927SAndroid Build Coastguard Worker int app_name_len, dwords;
93*61046927SAndroid Build Coastguard Worker
94*61046927SAndroid Build Coastguard Worker app_name_len =
95*61046927SAndroid Build Coastguard Worker snprintf(app_name, sizeof(app_name), "PCI-ID=0x%X %s",
96*61046927SAndroid Build Coastguard Worker aub->pci_id, name);
97*61046927SAndroid Build Coastguard Worker app_name_len = ALIGN(app_name_len, sizeof(uint32_t));
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker dwords = 5 + app_name_len / sizeof(uint32_t);
100*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_MEM_TRACE_VERSION | (dwords - 1));
101*61046927SAndroid Build Coastguard Worker dword_out(aub, AUB_MEM_TRACE_VERSION_FILE_VERSION);
102*61046927SAndroid Build Coastguard Worker dword_out(aub, aub->devinfo.simulator_id << AUB_MEM_TRACE_VERSION_DEVICE_SHIFT);
103*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* version */
104*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* version */
105*61046927SAndroid Build Coastguard Worker data_out(aub, app_name, app_name_len);
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker static void
write_legacy_header(struct aub_file * aub,const char * name)109*61046927SAndroid Build Coastguard Worker write_legacy_header(struct aub_file *aub, const char *name)
110*61046927SAndroid Build Coastguard Worker {
111*61046927SAndroid Build Coastguard Worker char app_name[8 * 4];
112*61046927SAndroid Build Coastguard Worker char comment[16];
113*61046927SAndroid Build Coastguard Worker int comment_len, comment_dwords, dwords;
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker comment_len = snprintf(comment, sizeof(comment), "PCI-ID=0x%x", aub->pci_id);
116*61046927SAndroid Build Coastguard Worker comment_dwords = ((comment_len + 3) / 4);
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker /* Start with a (required) version packet. */
119*61046927SAndroid Build Coastguard Worker dwords = 13 + comment_dwords;
120*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_AUB_HEADER | (dwords - 2));
121*61046927SAndroid Build Coastguard Worker dword_out(aub, (4 << AUB_HEADER_MAJOR_SHIFT) |
122*61046927SAndroid Build Coastguard Worker (0 << AUB_HEADER_MINOR_SHIFT));
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker /* Next comes a 32-byte application name. */
125*61046927SAndroid Build Coastguard Worker strncpy(app_name, name, sizeof(app_name));
126*61046927SAndroid Build Coastguard Worker app_name[sizeof(app_name) - 1] = 0;
127*61046927SAndroid Build Coastguard Worker data_out(aub, app_name, sizeof(app_name));
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* timestamp */
130*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* timestamp */
131*61046927SAndroid Build Coastguard Worker dword_out(aub, comment_len);
132*61046927SAndroid Build Coastguard Worker data_out(aub, comment, comment_dwords * 4);
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker static void
aub_write_header(struct aub_file * aub,const char * app_name)137*61046927SAndroid Build Coastguard Worker aub_write_header(struct aub_file *aub, const char *app_name)
138*61046927SAndroid Build Coastguard Worker {
139*61046927SAndroid Build Coastguard Worker if (aub_use_execlists(aub))
140*61046927SAndroid Build Coastguard Worker write_execlists_header(aub, app_name);
141*61046927SAndroid Build Coastguard Worker else
142*61046927SAndroid Build Coastguard Worker write_legacy_header(aub, app_name);
143*61046927SAndroid Build Coastguard Worker }
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker void
aub_file_init(struct aub_file * aub,FILE * file,FILE * debug,uint16_t pci_id,const char * app_name)146*61046927SAndroid Build Coastguard Worker aub_file_init(struct aub_file *aub, FILE *file, FILE *debug, uint16_t pci_id, const char *app_name)
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker memset(aub, 0, sizeof(*aub));
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker aub->verbose_log_file = debug;
151*61046927SAndroid Build Coastguard Worker aub->file = file;
152*61046927SAndroid Build Coastguard Worker aub->pci_id = pci_id;
153*61046927SAndroid Build Coastguard Worker fail_if(!intel_get_device_info_from_pci_id(pci_id, &aub->devinfo),
154*61046927SAndroid Build Coastguard Worker "failed to identify chipset=0x%x\n", pci_id);
155*61046927SAndroid Build Coastguard Worker aub->addr_bits = aub->devinfo.ver >= 8 ? 48 : 32;
156*61046927SAndroid Build Coastguard Worker
157*61046927SAndroid Build Coastguard Worker aub_write_header(aub, app_name);
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker aub->phys_addrs_allocator = 0;
160*61046927SAndroid Build Coastguard Worker aub->ggtt_addrs_allocator = 0;
161*61046927SAndroid Build Coastguard Worker aub->pml4.phys_addr = aub->phys_addrs_allocator++ << 12;
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, aub->ggtt_addrs_allocator++,
164*61046927SAndroid Build Coastguard Worker GFX8_PTE_SIZE,
165*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT_ENTRY,
166*61046927SAndroid Build Coastguard Worker "GGTT PT");
167*61046927SAndroid Build Coastguard Worker dword_out(aub, 1);
168*61046927SAndroid Build Coastguard Worker dword_out(aub, 0);
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker aub->next_context_handle = 1;
171*61046927SAndroid Build Coastguard Worker aub_context_new(aub, 0); /* Default context */
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker void
aub_file_finish(struct aub_file * aub)175*61046927SAndroid Build Coastguard Worker aub_file_finish(struct aub_file *aub)
176*61046927SAndroid Build Coastguard Worker {
177*61046927SAndroid Build Coastguard Worker aub_ppgtt_table_finish(&aub->pml4, 4);
178*61046927SAndroid Build Coastguard Worker fclose(aub->file);
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker uint32_t
aub_gtt_size(struct aub_file * aub)182*61046927SAndroid Build Coastguard Worker aub_gtt_size(struct aub_file *aub)
183*61046927SAndroid Build Coastguard Worker {
184*61046927SAndroid Build Coastguard Worker return NUM_PT_ENTRIES * (aub->addr_bits > 32 ? GFX8_PTE_SIZE : PTE_SIZE);
185*61046927SAndroid Build Coastguard Worker }
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker static void
mem_trace_memory_write_header_out(struct aub_file * aub,uint64_t addr,uint32_t len,uint32_t addr_space,const char * desc)188*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(struct aub_file *aub, uint64_t addr,
189*61046927SAndroid Build Coastguard Worker uint32_t len, uint32_t addr_space,
190*61046927SAndroid Build Coastguard Worker const char *desc)
191*61046927SAndroid Build Coastguard Worker {
192*61046927SAndroid Build Coastguard Worker uint32_t dwords = ALIGN(len, sizeof(uint32_t)) / sizeof(uint32_t);
193*61046927SAndroid Build Coastguard Worker
194*61046927SAndroid Build Coastguard Worker if (aub->verbose_log_file) {
195*61046927SAndroid Build Coastguard Worker fprintf(aub->verbose_log_file,
196*61046927SAndroid Build Coastguard Worker " MEM WRITE (0x%016" PRIx64 "-0x%016" PRIx64 ") %s\n",
197*61046927SAndroid Build Coastguard Worker addr, addr + len, desc);
198*61046927SAndroid Build Coastguard Worker }
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_MEM_TRACE_MEMORY_WRITE | (5 + dwords - 1));
201*61046927SAndroid Build Coastguard Worker dword_out(aub, addr & 0xFFFFFFFF); /* addr lo */
202*61046927SAndroid Build Coastguard Worker dword_out(aub, addr >> 32); /* addr hi */
203*61046927SAndroid Build Coastguard Worker dword_out(aub, addr_space); /* gtt */
204*61046927SAndroid Build Coastguard Worker dword_out(aub, len);
205*61046927SAndroid Build Coastguard Worker }
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker static void
register_write_out(struct aub_file * aub,uint32_t addr,uint32_t value)208*61046927SAndroid Build Coastguard Worker register_write_out(struct aub_file *aub, uint32_t addr, uint32_t value)
209*61046927SAndroid Build Coastguard Worker {
210*61046927SAndroid Build Coastguard Worker uint32_t dwords = 1;
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker if (aub->verbose_log_file) {
213*61046927SAndroid Build Coastguard Worker fprintf(aub->verbose_log_file,
214*61046927SAndroid Build Coastguard Worker " MMIO WRITE (0x%08x = 0x%08x)\n", addr, value);
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_MEM_TRACE_REGISTER_WRITE | (5 + dwords - 1));
218*61046927SAndroid Build Coastguard Worker dword_out(aub, addr);
219*61046927SAndroid Build Coastguard Worker dword_out(aub, AUB_MEM_TRACE_REGISTER_SIZE_DWORD |
220*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_REGISTER_SPACE_MMIO);
221*61046927SAndroid Build Coastguard Worker dword_out(aub, 0xFFFFFFFF); /* mask lo */
222*61046927SAndroid Build Coastguard Worker dword_out(aub, 0x00000000); /* mask hi */
223*61046927SAndroid Build Coastguard Worker dword_out(aub, value);
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker static void
populate_ppgtt_table(struct aub_file * aub,struct aub_ppgtt_table * table,int start,int end,int level)227*61046927SAndroid Build Coastguard Worker populate_ppgtt_table(struct aub_file *aub, struct aub_ppgtt_table *table,
228*61046927SAndroid Build Coastguard Worker int start, int end, int level)
229*61046927SAndroid Build Coastguard Worker {
230*61046927SAndroid Build Coastguard Worker uint64_t entries[512] = {0};
231*61046927SAndroid Build Coastguard Worker int dirty_start = 512, dirty_end = 0;
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker if (aub->verbose_log_file) {
234*61046927SAndroid Build Coastguard Worker fprintf(aub->verbose_log_file,
235*61046927SAndroid Build Coastguard Worker " PPGTT (0x%016" PRIx64 "), lvl %d, start: %x, end: %x\n",
236*61046927SAndroid Build Coastguard Worker table->phys_addr, level, start, end);
237*61046927SAndroid Build Coastguard Worker }
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker for (int i = start; i <= end; i++) {
240*61046927SAndroid Build Coastguard Worker if (!table->subtables[i]) {
241*61046927SAndroid Build Coastguard Worker dirty_start = min(dirty_start, i);
242*61046927SAndroid Build Coastguard Worker dirty_end = max(dirty_end, i);
243*61046927SAndroid Build Coastguard Worker if (level == 1) {
244*61046927SAndroid Build Coastguard Worker table->subtables[i] =
245*61046927SAndroid Build Coastguard Worker (void *)(uintptr_t)(aub->phys_addrs_allocator++ << 12);
246*61046927SAndroid Build Coastguard Worker if (aub->verbose_log_file) {
247*61046927SAndroid Build Coastguard Worker fprintf(aub->verbose_log_file,
248*61046927SAndroid Build Coastguard Worker " Adding entry: %x, phys_addr: 0x%016" PRIx64 "\n",
249*61046927SAndroid Build Coastguard Worker i, (uint64_t)(uintptr_t)table->subtables[i]);
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker } else {
252*61046927SAndroid Build Coastguard Worker table->subtables[i] =
253*61046927SAndroid Build Coastguard Worker calloc(1, sizeof(struct aub_ppgtt_table));
254*61046927SAndroid Build Coastguard Worker table->subtables[i]->phys_addr =
255*61046927SAndroid Build Coastguard Worker aub->phys_addrs_allocator++ << 12;
256*61046927SAndroid Build Coastguard Worker if (aub->verbose_log_file) {
257*61046927SAndroid Build Coastguard Worker fprintf(aub->verbose_log_file,
258*61046927SAndroid Build Coastguard Worker " Adding entry: %x, phys_addr: 0x%016" PRIx64 "\n",
259*61046927SAndroid Build Coastguard Worker i, table->subtables[i]->phys_addr);
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker }
263*61046927SAndroid Build Coastguard Worker entries[i] = 3 /* read/write | present */ |
264*61046927SAndroid Build Coastguard Worker (level == 1 ? (uint64_t)(uintptr_t)table->subtables[i] :
265*61046927SAndroid Build Coastguard Worker table->subtables[i]->phys_addr);
266*61046927SAndroid Build Coastguard Worker }
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker if (dirty_start <= dirty_end) {
269*61046927SAndroid Build Coastguard Worker uint64_t write_addr = table->phys_addr + dirty_start *
270*61046927SAndroid Build Coastguard Worker sizeof(uint64_t);
271*61046927SAndroid Build Coastguard Worker uint64_t write_size = (dirty_end - dirty_start + 1) *
272*61046927SAndroid Build Coastguard Worker sizeof(uint64_t);
273*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, write_addr, write_size,
274*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_PHYSICAL,
275*61046927SAndroid Build Coastguard Worker "PPGTT update");
276*61046927SAndroid Build Coastguard Worker data_out(aub, entries + dirty_start, write_size);
277*61046927SAndroid Build Coastguard Worker }
278*61046927SAndroid Build Coastguard Worker }
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker void
aub_map_ppgtt(struct aub_file * aub,uint64_t start,uint64_t size)281*61046927SAndroid Build Coastguard Worker aub_map_ppgtt(struct aub_file *aub, uint64_t start, uint64_t size)
282*61046927SAndroid Build Coastguard Worker {
283*61046927SAndroid Build Coastguard Worker uint64_t l4_start = start & 0xff8000000000;
284*61046927SAndroid Build Coastguard Worker uint64_t l4_end = ((start + size - 1) | 0x007fffffffff) & 0xffffffffffff;
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker #define L4_index(addr) (((addr) >> 39) & 0x1ff)
287*61046927SAndroid Build Coastguard Worker #define L3_index(addr) (((addr) >> 30) & 0x1ff)
288*61046927SAndroid Build Coastguard Worker #define L2_index(addr) (((addr) >> 21) & 0x1ff)
289*61046927SAndroid Build Coastguard Worker #define L1_index(addr) (((addr) >> 12) & 0x1ff)
290*61046927SAndroid Build Coastguard Worker
291*61046927SAndroid Build Coastguard Worker #define L3_table(addr) (aub->pml4.subtables[L4_index(addr)])
292*61046927SAndroid Build Coastguard Worker #define L2_table(addr) (L3_table(addr)->subtables[L3_index(addr)])
293*61046927SAndroid Build Coastguard Worker #define L1_table(addr) (L2_table(addr)->subtables[L2_index(addr)])
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker if (aub->verbose_log_file) {
296*61046927SAndroid Build Coastguard Worker fprintf(aub->verbose_log_file,
297*61046927SAndroid Build Coastguard Worker " Mapping PPGTT address: 0x%" PRIx64 ", size: %" PRIu64"\n",
298*61046927SAndroid Build Coastguard Worker start, size);
299*61046927SAndroid Build Coastguard Worker }
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker populate_ppgtt_table(aub, &aub->pml4, L4_index(l4_start), L4_index(l4_end), 4);
302*61046927SAndroid Build Coastguard Worker
303*61046927SAndroid Build Coastguard Worker for (uint64_t l4 = l4_start; l4 < l4_end; l4 += (1ULL << 39)) {
304*61046927SAndroid Build Coastguard Worker uint64_t l3_start = max(l4, start & 0xffffc0000000);
305*61046927SAndroid Build Coastguard Worker uint64_t l3_end = min(l4 + (1ULL << 39) - 1,
306*61046927SAndroid Build Coastguard Worker ((start + size - 1) | 0x00003fffffff) & 0xffffffffffff);
307*61046927SAndroid Build Coastguard Worker uint64_t l3_start_idx = L3_index(l3_start);
308*61046927SAndroid Build Coastguard Worker uint64_t l3_end_idx = L3_index(l3_end);
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker populate_ppgtt_table(aub, L3_table(l4), l3_start_idx, l3_end_idx, 3);
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker for (uint64_t l3 = l3_start; l3 < l3_end; l3 += (1ULL << 30)) {
313*61046927SAndroid Build Coastguard Worker uint64_t l2_start = max(l3, start & 0xffffffe00000);
314*61046927SAndroid Build Coastguard Worker uint64_t l2_end = min(l3 + (1ULL << 30) - 1,
315*61046927SAndroid Build Coastguard Worker ((start + size - 1) | 0x0000001fffff) & 0xffffffffffff);
316*61046927SAndroid Build Coastguard Worker uint64_t l2_start_idx = L2_index(l2_start);
317*61046927SAndroid Build Coastguard Worker uint64_t l2_end_idx = L2_index(l2_end);
318*61046927SAndroid Build Coastguard Worker
319*61046927SAndroid Build Coastguard Worker populate_ppgtt_table(aub, L2_table(l3), l2_start_idx, l2_end_idx, 2);
320*61046927SAndroid Build Coastguard Worker
321*61046927SAndroid Build Coastguard Worker for (uint64_t l2 = l2_start; l2 < l2_end; l2 += (1ULL << 21)) {
322*61046927SAndroid Build Coastguard Worker uint64_t l1_start = max(l2, start & 0xfffffffff000);
323*61046927SAndroid Build Coastguard Worker uint64_t l1_end = min(l2 + (1ULL << 21) - 1,
324*61046927SAndroid Build Coastguard Worker ((start + size - 1) | 0x000000000fff) & 0xffffffffffff);
325*61046927SAndroid Build Coastguard Worker uint64_t l1_start_idx = L1_index(l1_start);
326*61046927SAndroid Build Coastguard Worker uint64_t l1_end_idx = L1_index(l1_end);
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker populate_ppgtt_table(aub, L1_table(l2), l1_start_idx, l1_end_idx, 1);
329*61046927SAndroid Build Coastguard Worker }
330*61046927SAndroid Build Coastguard Worker }
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker }
333*61046927SAndroid Build Coastguard Worker
334*61046927SAndroid Build Coastguard Worker static uint64_t
ppgtt_lookup(struct aub_file * aub,uint64_t ppgtt_addr)335*61046927SAndroid Build Coastguard Worker ppgtt_lookup(struct aub_file *aub, uint64_t ppgtt_addr)
336*61046927SAndroid Build Coastguard Worker {
337*61046927SAndroid Build Coastguard Worker return (uint64_t)(uintptr_t)L1_table(ppgtt_addr)->subtables[L1_index(ppgtt_addr)];
338*61046927SAndroid Build Coastguard Worker }
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker static const struct engine {
341*61046927SAndroid Build Coastguard Worker const char *name;
342*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class;
343*61046927SAndroid Build Coastguard Worker uint32_t hw_class;
344*61046927SAndroid Build Coastguard Worker uint32_t elsp_reg;
345*61046927SAndroid Build Coastguard Worker uint32_t elsq_reg;
346*61046927SAndroid Build Coastguard Worker uint32_t status_reg;
347*61046927SAndroid Build Coastguard Worker uint32_t control_reg;
348*61046927SAndroid Build Coastguard Worker } engines[] = {
349*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_RENDER] = {
350*61046927SAndroid Build Coastguard Worker .name = "RENDER",
351*61046927SAndroid Build Coastguard Worker .engine_class = INTEL_ENGINE_CLASS_RENDER,
352*61046927SAndroid Build Coastguard Worker .hw_class = 1,
353*61046927SAndroid Build Coastguard Worker .elsp_reg = RCSUNIT(EXECLIST_SUBMITPORT),
354*61046927SAndroid Build Coastguard Worker .elsq_reg = RCSUNIT(EXECLIST_SQ_CONTENTS),
355*61046927SAndroid Build Coastguard Worker .status_reg = RCSUNIT(EXECLIST_STATUS),
356*61046927SAndroid Build Coastguard Worker .control_reg = RCSUNIT(EXECLIST_CONTROL),
357*61046927SAndroid Build Coastguard Worker },
358*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_VIDEO] = {
359*61046927SAndroid Build Coastguard Worker .name = "VIDEO",
360*61046927SAndroid Build Coastguard Worker .engine_class = INTEL_ENGINE_CLASS_VIDEO,
361*61046927SAndroid Build Coastguard Worker .hw_class = 3,
362*61046927SAndroid Build Coastguard Worker .elsp_reg = VCSUNIT0(EXECLIST_SUBMITPORT),
363*61046927SAndroid Build Coastguard Worker .elsq_reg = VCSUNIT0(EXECLIST_SQ_CONTENTS),
364*61046927SAndroid Build Coastguard Worker .status_reg = VCSUNIT0(EXECLIST_STATUS),
365*61046927SAndroid Build Coastguard Worker .control_reg = VCSUNIT0(EXECLIST_CONTROL),
366*61046927SAndroid Build Coastguard Worker },
367*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_COPY] = {
368*61046927SAndroid Build Coastguard Worker .name = "BLITTER",
369*61046927SAndroid Build Coastguard Worker .engine_class = INTEL_ENGINE_CLASS_COPY,
370*61046927SAndroid Build Coastguard Worker .hw_class = 2,
371*61046927SAndroid Build Coastguard Worker .elsp_reg = BCSUNIT0(EXECLIST_SUBMITPORT),
372*61046927SAndroid Build Coastguard Worker .elsq_reg = BCSUNIT0(EXECLIST_SQ_CONTENTS),
373*61046927SAndroid Build Coastguard Worker .status_reg = BCSUNIT0(EXECLIST_STATUS),
374*61046927SAndroid Build Coastguard Worker .control_reg = BCSUNIT0(EXECLIST_CONTROL),
375*61046927SAndroid Build Coastguard Worker },
376*61046927SAndroid Build Coastguard Worker };
377*61046927SAndroid Build Coastguard Worker
378*61046927SAndroid Build Coastguard Worker static void
aub_map_ggtt(struct aub_file * aub,uint64_t virt_addr,uint64_t size)379*61046927SAndroid Build Coastguard Worker aub_map_ggtt(struct aub_file *aub, uint64_t virt_addr, uint64_t size)
380*61046927SAndroid Build Coastguard Worker {
381*61046927SAndroid Build Coastguard Worker /* Makes the code below a bit simpler. In practice all of the write we
382*61046927SAndroid Build Coastguard Worker * receive from error2aub are page aligned.
383*61046927SAndroid Build Coastguard Worker */
384*61046927SAndroid Build Coastguard Worker assert(virt_addr % 4096 == 0);
385*61046927SAndroid Build Coastguard Worker assert((aub->phys_addrs_allocator + size) < (1ULL << 32));
386*61046927SAndroid Build Coastguard Worker
387*61046927SAndroid Build Coastguard Worker /* GGTT PT */
388*61046927SAndroid Build Coastguard Worker uint32_t ggtt_ptes = DIV_ROUND_UP(size, 4096);
389*61046927SAndroid Build Coastguard Worker uint64_t phys_addr = aub->phys_addrs_allocator << 12;
390*61046927SAndroid Build Coastguard Worker aub->phys_addrs_allocator += ggtt_ptes;
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker if (aub->verbose_log_file) {
393*61046927SAndroid Build Coastguard Worker fprintf(aub->verbose_log_file,
394*61046927SAndroid Build Coastguard Worker " Mapping GGTT address: 0x%" PRIx64 ", size: %" PRIu64" phys_addr=0x%" PRIx64 " entries=%u\n",
395*61046927SAndroid Build Coastguard Worker virt_addr, size, phys_addr, ggtt_ptes);
396*61046927SAndroid Build Coastguard Worker }
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub,
399*61046927SAndroid Build Coastguard Worker (virt_addr >> 12) * GFX8_PTE_SIZE,
400*61046927SAndroid Build Coastguard Worker ggtt_ptes * GFX8_PTE_SIZE,
401*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT_ENTRY,
402*61046927SAndroid Build Coastguard Worker "GGTT PT");
403*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ggtt_ptes; i++) {
404*61046927SAndroid Build Coastguard Worker dword_out(aub, 1 + phys_addr + i * 4096);
405*61046927SAndroid Build Coastguard Worker dword_out(aub, 0);
406*61046927SAndroid Build Coastguard Worker }
407*61046927SAndroid Build Coastguard Worker }
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker void
aub_write_ggtt(struct aub_file * aub,uint64_t virt_addr,uint64_t size,const void * data)410*61046927SAndroid Build Coastguard Worker aub_write_ggtt(struct aub_file *aub, uint64_t virt_addr, uint64_t size, const void *data)
411*61046927SAndroid Build Coastguard Worker {
412*61046927SAndroid Build Coastguard Worker /* Default setup assumes a 1 to 1 mapping between physical and virtual GGTT
413*61046927SAndroid Build Coastguard Worker * addresses. This is somewhat incompatible with the aub_write_ggtt()
414*61046927SAndroid Build Coastguard Worker * function. In practice it doesn't matter as the GGTT writes are used to
415*61046927SAndroid Build Coastguard Worker * replace the default setup and we've taken care to setup the PML4 as the
416*61046927SAndroid Build Coastguard Worker * top of the GGTT.
417*61046927SAndroid Build Coastguard Worker */
418*61046927SAndroid Build Coastguard Worker assert(!aub->has_default_setup);
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker aub_map_ggtt(aub, virt_addr, size);
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker /* We write the GGTT buffer through the GGTT aub command rather than the
423*61046927SAndroid Build Coastguard Worker * PHYSICAL aub command. This is because the Gfx9 simulator seems to have 2
424*61046927SAndroid Build Coastguard Worker * different set of memory pools for GGTT and physical (probably someone
425*61046927SAndroid Build Coastguard Worker * didn't really understand the concept?).
426*61046927SAndroid Build Coastguard Worker */
427*61046927SAndroid Build Coastguard Worker static const char null_block[8 * 4096];
428*61046927SAndroid Build Coastguard Worker for (uint64_t offset = 0; offset < size; offset += 4096) {
429*61046927SAndroid Build Coastguard Worker uint32_t block_size = min(4096, size - offset);
430*61046927SAndroid Build Coastguard Worker
431*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, virt_addr + offset, block_size,
432*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT,
433*61046927SAndroid Build Coastguard Worker "GGTT buffer");
434*61046927SAndroid Build Coastguard Worker data_out(aub, (char *) data + offset, block_size);
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker /* Pad to a multiple of 4 bytes. */
437*61046927SAndroid Build Coastguard Worker data_out(aub, null_block, -block_size & 3);
438*61046927SAndroid Build Coastguard Worker }
439*61046927SAndroid Build Coastguard Worker }
440*61046927SAndroid Build Coastguard Worker
441*61046927SAndroid Build Coastguard Worker static const struct engine *
engine_from_engine_class(enum intel_engine_class engine_class)442*61046927SAndroid Build Coastguard Worker engine_from_engine_class(enum intel_engine_class engine_class)
443*61046927SAndroid Build Coastguard Worker {
444*61046927SAndroid Build Coastguard Worker switch (engine_class) {
445*61046927SAndroid Build Coastguard Worker case INTEL_ENGINE_CLASS_RENDER:
446*61046927SAndroid Build Coastguard Worker case INTEL_ENGINE_CLASS_COPY:
447*61046927SAndroid Build Coastguard Worker case INTEL_ENGINE_CLASS_VIDEO:
448*61046927SAndroid Build Coastguard Worker return &engines[engine_class];
449*61046927SAndroid Build Coastguard Worker default:
450*61046927SAndroid Build Coastguard Worker unreachable("unknown ring");
451*61046927SAndroid Build Coastguard Worker }
452*61046927SAndroid Build Coastguard Worker }
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker static void
get_context_init(const struct intel_device_info * devinfo,const struct intel_context_parameters * params,enum intel_engine_class engine_class,uint32_t * data,uint32_t * size)455*61046927SAndroid Build Coastguard Worker get_context_init(const struct intel_device_info *devinfo,
456*61046927SAndroid Build Coastguard Worker const struct intel_context_parameters *params,
457*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class,
458*61046927SAndroid Build Coastguard Worker uint32_t *data,
459*61046927SAndroid Build Coastguard Worker uint32_t *size)
460*61046927SAndroid Build Coastguard Worker {
461*61046927SAndroid Build Coastguard Worker static const intel_context_init_t gfx8_contexts[] = {
462*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_RENDER] = gfx8_render_context_init,
463*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_COPY] = gfx8_blitter_context_init,
464*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_VIDEO] = gfx8_video_context_init,
465*61046927SAndroid Build Coastguard Worker };
466*61046927SAndroid Build Coastguard Worker static const intel_context_init_t gfx10_contexts[] = {
467*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_RENDER] = gfx10_render_context_init,
468*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_COPY] = gfx10_blitter_context_init,
469*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_VIDEO] = gfx10_video_context_init,
470*61046927SAndroid Build Coastguard Worker };
471*61046927SAndroid Build Coastguard Worker
472*61046927SAndroid Build Coastguard Worker assert(devinfo->ver >= 8);
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker if (devinfo->ver <= 10)
475*61046927SAndroid Build Coastguard Worker gfx8_contexts[engine_class](params, data, size);
476*61046927SAndroid Build Coastguard Worker else
477*61046927SAndroid Build Coastguard Worker gfx10_contexts[engine_class](params, data, size);
478*61046927SAndroid Build Coastguard Worker }
479*61046927SAndroid Build Coastguard Worker
480*61046927SAndroid Build Coastguard Worker static uint64_t
alloc_ggtt_address(struct aub_file * aub,uint64_t size)481*61046927SAndroid Build Coastguard Worker alloc_ggtt_address(struct aub_file *aub, uint64_t size)
482*61046927SAndroid Build Coastguard Worker {
483*61046927SAndroid Build Coastguard Worker uint32_t ggtt_ptes = DIV_ROUND_UP(size, 4096);
484*61046927SAndroid Build Coastguard Worker uint64_t addr = aub->ggtt_addrs_allocator << 12;
485*61046927SAndroid Build Coastguard Worker
486*61046927SAndroid Build Coastguard Worker aub->ggtt_addrs_allocator += ggtt_ptes;
487*61046927SAndroid Build Coastguard Worker aub_map_ggtt(aub, addr, size);
488*61046927SAndroid Build Coastguard Worker
489*61046927SAndroid Build Coastguard Worker return addr;
490*61046927SAndroid Build Coastguard Worker }
491*61046927SAndroid Build Coastguard Worker
492*61046927SAndroid Build Coastguard Worker static void
write_hwsp(struct aub_file * aub,enum intel_engine_class engine_class)493*61046927SAndroid Build Coastguard Worker write_hwsp(struct aub_file *aub,
494*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class)
495*61046927SAndroid Build Coastguard Worker {
496*61046927SAndroid Build Coastguard Worker uint32_t reg = 0;
497*61046927SAndroid Build Coastguard Worker switch (engine_class) {
498*61046927SAndroid Build Coastguard Worker case INTEL_ENGINE_CLASS_RENDER: reg = RCSUNIT (HWS_PGA); break;
499*61046927SAndroid Build Coastguard Worker case INTEL_ENGINE_CLASS_COPY: reg = BCSUNIT0(HWS_PGA); break;
500*61046927SAndroid Build Coastguard Worker case INTEL_ENGINE_CLASS_VIDEO: reg = VCSUNIT0(HWS_PGA); break;
501*61046927SAndroid Build Coastguard Worker default:
502*61046927SAndroid Build Coastguard Worker unreachable("unknown ring");
503*61046927SAndroid Build Coastguard Worker }
504*61046927SAndroid Build Coastguard Worker
505*61046927SAndroid Build Coastguard Worker register_write_out(aub, reg, aub->engine_setup[engine_class].hwsp_addr);
506*61046927SAndroid Build Coastguard Worker }
507*61046927SAndroid Build Coastguard Worker
508*61046927SAndroid Build Coastguard Worker static uint32_t
write_engine_execlist_setup(struct aub_file * aub,uint32_t ctx_id,struct aub_hw_context * hw_ctx,enum intel_engine_class engine_class)509*61046927SAndroid Build Coastguard Worker write_engine_execlist_setup(struct aub_file *aub,
510*61046927SAndroid Build Coastguard Worker uint32_t ctx_id,
511*61046927SAndroid Build Coastguard Worker struct aub_hw_context *hw_ctx,
512*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class)
513*61046927SAndroid Build Coastguard Worker {
514*61046927SAndroid Build Coastguard Worker const struct engine *cs = engine_from_engine_class(engine_class);
515*61046927SAndroid Build Coastguard Worker uint32_t context_size;
516*61046927SAndroid Build Coastguard Worker
517*61046927SAndroid Build Coastguard Worker get_context_init(&aub->devinfo, NULL, engine_class, NULL, &context_size);
518*61046927SAndroid Build Coastguard Worker
519*61046927SAndroid Build Coastguard Worker /* GGTT PT */
520*61046927SAndroid Build Coastguard Worker uint32_t total_size = RING_SIZE + PPHWSP_SIZE + context_size;
521*61046927SAndroid Build Coastguard Worker char name[80];
522*61046927SAndroid Build Coastguard Worker uint64_t ggtt_addr = alloc_ggtt_address(aub, total_size);
523*61046927SAndroid Build Coastguard Worker
524*61046927SAndroid Build Coastguard Worker snprintf(name, sizeof(name), "%s (ctx id: %d) GGTT PT", cs->name, ctx_id);
525*61046927SAndroid Build Coastguard Worker
526*61046927SAndroid Build Coastguard Worker /* RING */
527*61046927SAndroid Build Coastguard Worker hw_ctx->ring_addr = ggtt_addr;
528*61046927SAndroid Build Coastguard Worker snprintf(name, sizeof(name), "%s RING", cs->name);
529*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, ggtt_addr, RING_SIZE,
530*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT,
531*61046927SAndroid Build Coastguard Worker name);
532*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < RING_SIZE; i += sizeof(uint32_t))
533*61046927SAndroid Build Coastguard Worker dword_out(aub, 0);
534*61046927SAndroid Build Coastguard Worker ggtt_addr += RING_SIZE;
535*61046927SAndroid Build Coastguard Worker
536*61046927SAndroid Build Coastguard Worker /* PPHWSP */
537*61046927SAndroid Build Coastguard Worker hw_ctx->pphwsp_addr = ggtt_addr;
538*61046927SAndroid Build Coastguard Worker snprintf(name, sizeof(name), "%s PPHWSP", cs->name);
539*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, ggtt_addr,
540*61046927SAndroid Build Coastguard Worker PPHWSP_SIZE + context_size,
541*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT,
542*61046927SAndroid Build Coastguard Worker name);
543*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < PPHWSP_SIZE; i += sizeof(uint32_t))
544*61046927SAndroid Build Coastguard Worker dword_out(aub, 0);
545*61046927SAndroid Build Coastguard Worker
546*61046927SAndroid Build Coastguard Worker /* CONTEXT */
547*61046927SAndroid Build Coastguard Worker struct intel_context_parameters params = {
548*61046927SAndroid Build Coastguard Worker .ring_addr = hw_ctx->ring_addr,
549*61046927SAndroid Build Coastguard Worker .ring_size = RING_SIZE,
550*61046927SAndroid Build Coastguard Worker .pml4_addr = aub->pml4.phys_addr,
551*61046927SAndroid Build Coastguard Worker };
552*61046927SAndroid Build Coastguard Worker uint32_t *context_data = calloc(1, context_size);
553*61046927SAndroid Build Coastguard Worker get_context_init(&aub->devinfo, ¶ms, engine_class, context_data, &context_size);
554*61046927SAndroid Build Coastguard Worker data_out(aub, context_data, context_size);
555*61046927SAndroid Build Coastguard Worker free(context_data);
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Worker hw_ctx->initialized = true;
558*61046927SAndroid Build Coastguard Worker
559*61046927SAndroid Build Coastguard Worker return total_size;
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker static void
write_execlists_default_setup(struct aub_file * aub)563*61046927SAndroid Build Coastguard Worker write_execlists_default_setup(struct aub_file *aub)
564*61046927SAndroid Build Coastguard Worker {
565*61046927SAndroid Build Coastguard Worker register_write_out(aub, RCSUNIT(GFX_MODE), 0x80008000 /* execlist enable */);
566*61046927SAndroid Build Coastguard Worker register_write_out(aub, VCSUNIT0(GFX_MODE), 0x80008000 /* execlist enable */);
567*61046927SAndroid Build Coastguard Worker register_write_out(aub, BCSUNIT0(GFX_MODE), 0x80008000 /* execlist enable */);
568*61046927SAndroid Build Coastguard Worker }
569*61046927SAndroid Build Coastguard Worker
write_legacy_default_setup(struct aub_file * aub)570*61046927SAndroid Build Coastguard Worker static void write_legacy_default_setup(struct aub_file *aub)
571*61046927SAndroid Build Coastguard Worker {
572*61046927SAndroid Build Coastguard Worker uint32_t entry = 0x200003;
573*61046927SAndroid Build Coastguard Worker
574*61046927SAndroid Build Coastguard Worker /* Set up the GTT. The max we can handle is 64M */
575*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_AUB_TRACE_HEADER_BLOCK |
576*61046927SAndroid Build Coastguard Worker ((aub->addr_bits > 32 ? 6 : 5) - 2));
577*61046927SAndroid Build Coastguard Worker dword_out(aub, AUB_TRACE_MEMTYPE_GTT_ENTRY |
578*61046927SAndroid Build Coastguard Worker AUB_TRACE_TYPE_NOTYPE | AUB_TRACE_OP_DATA_WRITE);
579*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* subtype */
580*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* offset */
581*61046927SAndroid Build Coastguard Worker dword_out(aub, aub_gtt_size(aub)); /* size */
582*61046927SAndroid Build Coastguard Worker if (aub->addr_bits > 32)
583*61046927SAndroid Build Coastguard Worker dword_out(aub, 0);
584*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < NUM_PT_ENTRIES; i++) {
585*61046927SAndroid Build Coastguard Worker dword_out(aub, entry + 0x1000 * i);
586*61046927SAndroid Build Coastguard Worker if (aub->addr_bits > 32)
587*61046927SAndroid Build Coastguard Worker dword_out(aub, 0);
588*61046927SAndroid Build Coastguard Worker }
589*61046927SAndroid Build Coastguard Worker }
590*61046927SAndroid Build Coastguard Worker
591*61046927SAndroid Build Coastguard Worker /**
592*61046927SAndroid Build Coastguard Worker * Sets up a default GGTT/PPGTT address space and execlists context (when
593*61046927SAndroid Build Coastguard Worker * supported).
594*61046927SAndroid Build Coastguard Worker */
595*61046927SAndroid Build Coastguard Worker void
aub_write_default_setup(struct aub_file * aub)596*61046927SAndroid Build Coastguard Worker aub_write_default_setup(struct aub_file *aub)
597*61046927SAndroid Build Coastguard Worker {
598*61046927SAndroid Build Coastguard Worker if (aub_use_execlists(aub))
599*61046927SAndroid Build Coastguard Worker write_execlists_default_setup(aub);
600*61046927SAndroid Build Coastguard Worker else
601*61046927SAndroid Build Coastguard Worker write_legacy_default_setup(aub);
602*61046927SAndroid Build Coastguard Worker
603*61046927SAndroid Build Coastguard Worker aub->has_default_setup = true;
604*61046927SAndroid Build Coastguard Worker }
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker static struct aub_context *
aub_context_new(struct aub_file * aub,uint32_t new_id)607*61046927SAndroid Build Coastguard Worker aub_context_new(struct aub_file *aub, uint32_t new_id)
608*61046927SAndroid Build Coastguard Worker {
609*61046927SAndroid Build Coastguard Worker assert(aub->num_contexts < MAX_CONTEXT_COUNT);
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker struct aub_context *ctx = &aub->contexts[aub->num_contexts++];
612*61046927SAndroid Build Coastguard Worker memset(ctx, 0, sizeof(*ctx));
613*61046927SAndroid Build Coastguard Worker ctx->id = new_id;
614*61046927SAndroid Build Coastguard Worker
615*61046927SAndroid Build Coastguard Worker return ctx;
616*61046927SAndroid Build Coastguard Worker }
617*61046927SAndroid Build Coastguard Worker
618*61046927SAndroid Build Coastguard Worker uint32_t
aub_write_context_create(struct aub_file * aub,uint32_t * ctx_id)619*61046927SAndroid Build Coastguard Worker aub_write_context_create(struct aub_file *aub, uint32_t *ctx_id)
620*61046927SAndroid Build Coastguard Worker {
621*61046927SAndroid Build Coastguard Worker uint32_t new_id = ctx_id ? *ctx_id : aub->next_context_handle;
622*61046927SAndroid Build Coastguard Worker
623*61046927SAndroid Build Coastguard Worker aub_context_new(aub, new_id);
624*61046927SAndroid Build Coastguard Worker
625*61046927SAndroid Build Coastguard Worker if (!ctx_id)
626*61046927SAndroid Build Coastguard Worker aub->next_context_handle++;
627*61046927SAndroid Build Coastguard Worker
628*61046927SAndroid Build Coastguard Worker return new_id;
629*61046927SAndroid Build Coastguard Worker }
630*61046927SAndroid Build Coastguard Worker
631*61046927SAndroid Build Coastguard Worker static struct aub_context *
aub_context_find(struct aub_file * aub,uint32_t id)632*61046927SAndroid Build Coastguard Worker aub_context_find(struct aub_file *aub, uint32_t id)
633*61046927SAndroid Build Coastguard Worker {
634*61046927SAndroid Build Coastguard Worker for (int i = 0; i < aub->num_contexts; i++) {
635*61046927SAndroid Build Coastguard Worker if (aub->contexts[i].id == id)
636*61046927SAndroid Build Coastguard Worker return &aub->contexts[i];
637*61046927SAndroid Build Coastguard Worker }
638*61046927SAndroid Build Coastguard Worker
639*61046927SAndroid Build Coastguard Worker return NULL;
640*61046927SAndroid Build Coastguard Worker }
641*61046927SAndroid Build Coastguard Worker
642*61046927SAndroid Build Coastguard Worker static struct aub_hw_context *
aub_write_ensure_context(struct aub_file * aub,uint32_t ctx_id,enum intel_engine_class engine_class)643*61046927SAndroid Build Coastguard Worker aub_write_ensure_context(struct aub_file *aub, uint32_t ctx_id,
644*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class)
645*61046927SAndroid Build Coastguard Worker {
646*61046927SAndroid Build Coastguard Worker struct aub_context *ctx = aub_context_find(aub, ctx_id);
647*61046927SAndroid Build Coastguard Worker assert(ctx != NULL);
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker struct aub_hw_context *hw_ctx = &ctx->hw_contexts[engine_class];
650*61046927SAndroid Build Coastguard Worker if (!hw_ctx->initialized)
651*61046927SAndroid Build Coastguard Worker write_engine_execlist_setup(aub, ctx->id, hw_ctx, engine_class);
652*61046927SAndroid Build Coastguard Worker
653*61046927SAndroid Build Coastguard Worker return hw_ctx;
654*61046927SAndroid Build Coastguard Worker }
655*61046927SAndroid Build Coastguard Worker
656*61046927SAndroid Build Coastguard Worker static uint64_t
get_context_descriptor(struct aub_file * aub,const struct engine * cs,struct aub_hw_context * hw_ctx)657*61046927SAndroid Build Coastguard Worker get_context_descriptor(struct aub_file *aub,
658*61046927SAndroid Build Coastguard Worker const struct engine *cs,
659*61046927SAndroid Build Coastguard Worker struct aub_hw_context *hw_ctx)
660*61046927SAndroid Build Coastguard Worker {
661*61046927SAndroid Build Coastguard Worker return cs->hw_class | hw_ctx->pphwsp_addr | CONTEXT_FLAGS;
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker
664*61046927SAndroid Build Coastguard Worker /**
665*61046927SAndroid Build Coastguard Worker * Break up large objects into multiple writes. Otherwise a 128kb VBO
666*61046927SAndroid Build Coastguard Worker * would overflow the 16 bits of size field in the packet header and
667*61046927SAndroid Build Coastguard Worker * everything goes badly after that.
668*61046927SAndroid Build Coastguard Worker */
669*61046927SAndroid Build Coastguard Worker void
aub_write_trace_block(struct aub_file * aub,uint32_t type,void * virtual,uint32_t size,uint64_t gtt_offset)670*61046927SAndroid Build Coastguard Worker aub_write_trace_block(struct aub_file *aub,
671*61046927SAndroid Build Coastguard Worker uint32_t type, void *virtual,
672*61046927SAndroid Build Coastguard Worker uint32_t size, uint64_t gtt_offset)
673*61046927SAndroid Build Coastguard Worker {
674*61046927SAndroid Build Coastguard Worker uint32_t block_size;
675*61046927SAndroid Build Coastguard Worker uint32_t subtype = 0;
676*61046927SAndroid Build Coastguard Worker static const char null_block[8 * 4096];
677*61046927SAndroid Build Coastguard Worker
678*61046927SAndroid Build Coastguard Worker for (uint32_t offset = 0; offset < size; offset += block_size) {
679*61046927SAndroid Build Coastguard Worker block_size = min(8 * 4096, size - offset);
680*61046927SAndroid Build Coastguard Worker
681*61046927SAndroid Build Coastguard Worker if (aub_use_execlists(aub)) {
682*61046927SAndroid Build Coastguard Worker block_size = min(4096, block_size);
683*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub,
684*61046927SAndroid Build Coastguard Worker ppgtt_lookup(aub, gtt_offset + offset),
685*61046927SAndroid Build Coastguard Worker block_size,
686*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_PHYSICAL,
687*61046927SAndroid Build Coastguard Worker "Trace Block");
688*61046927SAndroid Build Coastguard Worker } else {
689*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_AUB_TRACE_HEADER_BLOCK |
690*61046927SAndroid Build Coastguard Worker ((aub->addr_bits > 32 ? 6 : 5) - 2));
691*61046927SAndroid Build Coastguard Worker dword_out(aub, AUB_TRACE_MEMTYPE_GTT |
692*61046927SAndroid Build Coastguard Worker type | AUB_TRACE_OP_DATA_WRITE);
693*61046927SAndroid Build Coastguard Worker dword_out(aub, subtype);
694*61046927SAndroid Build Coastguard Worker dword_out(aub, gtt_offset + offset);
695*61046927SAndroid Build Coastguard Worker dword_out(aub, align(block_size, 4));
696*61046927SAndroid Build Coastguard Worker if (aub->addr_bits > 32)
697*61046927SAndroid Build Coastguard Worker dword_out(aub, (gtt_offset + offset) >> 32);
698*61046927SAndroid Build Coastguard Worker }
699*61046927SAndroid Build Coastguard Worker
700*61046927SAndroid Build Coastguard Worker if (virtual)
701*61046927SAndroid Build Coastguard Worker data_out(aub, ((char *) virtual) + offset, block_size);
702*61046927SAndroid Build Coastguard Worker else
703*61046927SAndroid Build Coastguard Worker data_out(aub, null_block, block_size);
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker /* Pad to a multiple of 4 bytes. */
706*61046927SAndroid Build Coastguard Worker data_out(aub, null_block, -block_size & 3);
707*61046927SAndroid Build Coastguard Worker }
708*61046927SAndroid Build Coastguard Worker }
709*61046927SAndroid Build Coastguard Worker
710*61046927SAndroid Build Coastguard Worker static void
aub_dump_ring_buffer_execlist(struct aub_file * aub,struct aub_hw_context * hw_ctx,const struct engine * cs,uint64_t batch_offset)711*61046927SAndroid Build Coastguard Worker aub_dump_ring_buffer_execlist(struct aub_file *aub,
712*61046927SAndroid Build Coastguard Worker struct aub_hw_context *hw_ctx,
713*61046927SAndroid Build Coastguard Worker const struct engine *cs,
714*61046927SAndroid Build Coastguard Worker uint64_t batch_offset)
715*61046927SAndroid Build Coastguard Worker {
716*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, hw_ctx->ring_addr, 16,
717*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT,
718*61046927SAndroid Build Coastguard Worker "RING MI_BATCH_BUFFER_START user");
719*61046927SAndroid Build Coastguard Worker dword_out(aub, AUB_MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965 | (3 - 2));
720*61046927SAndroid Build Coastguard Worker dword_out(aub, batch_offset & 0xFFFFFFFF);
721*61046927SAndroid Build Coastguard Worker dword_out(aub, batch_offset >> 32);
722*61046927SAndroid Build Coastguard Worker dword_out(aub, 0 /* MI_NOOP */);
723*61046927SAndroid Build Coastguard Worker
724*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, hw_ctx->ring_addr + 8192 + 20, 4,
725*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT,
726*61046927SAndroid Build Coastguard Worker "RING BUFFER HEAD");
727*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* RING_BUFFER_HEAD */
728*61046927SAndroid Build Coastguard Worker mem_trace_memory_write_header_out(aub, hw_ctx->ring_addr + 8192 + 28, 4,
729*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_MEMORY_ADDRESS_SPACE_GGTT,
730*61046927SAndroid Build Coastguard Worker "RING BUFFER TAIL");
731*61046927SAndroid Build Coastguard Worker dword_out(aub, 16); /* RING_BUFFER_TAIL */
732*61046927SAndroid Build Coastguard Worker }
733*61046927SAndroid Build Coastguard Worker
734*61046927SAndroid Build Coastguard Worker static void
aub_dump_execlist(struct aub_file * aub,const struct engine * cs,uint64_t descriptor)735*61046927SAndroid Build Coastguard Worker aub_dump_execlist(struct aub_file *aub, const struct engine *cs, uint64_t descriptor)
736*61046927SAndroid Build Coastguard Worker {
737*61046927SAndroid Build Coastguard Worker if (aub->devinfo.ver >= 11) {
738*61046927SAndroid Build Coastguard Worker register_write_out(aub, cs->elsq_reg, descriptor & 0xFFFFFFFF);
739*61046927SAndroid Build Coastguard Worker register_write_out(aub, cs->elsq_reg + sizeof(uint32_t), descriptor >> 32);
740*61046927SAndroid Build Coastguard Worker register_write_out(aub, cs->control_reg, 1);
741*61046927SAndroid Build Coastguard Worker } else {
742*61046927SAndroid Build Coastguard Worker register_write_out(aub, cs->elsp_reg, 0);
743*61046927SAndroid Build Coastguard Worker register_write_out(aub, cs->elsp_reg, 0);
744*61046927SAndroid Build Coastguard Worker register_write_out(aub, cs->elsp_reg, descriptor >> 32);
745*61046927SAndroid Build Coastguard Worker register_write_out(aub, cs->elsp_reg, descriptor & 0xFFFFFFFF);
746*61046927SAndroid Build Coastguard Worker }
747*61046927SAndroid Build Coastguard Worker
748*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_MEM_TRACE_REGISTER_POLL | (5 + 1 - 1));
749*61046927SAndroid Build Coastguard Worker dword_out(aub, cs->status_reg);
750*61046927SAndroid Build Coastguard Worker dword_out(aub, AUB_MEM_TRACE_REGISTER_SIZE_DWORD |
751*61046927SAndroid Build Coastguard Worker AUB_MEM_TRACE_REGISTER_SPACE_MMIO);
752*61046927SAndroid Build Coastguard Worker if (aub->devinfo.ver >= 11) {
753*61046927SAndroid Build Coastguard Worker dword_out(aub, 0x00000001); /* mask lo */
754*61046927SAndroid Build Coastguard Worker dword_out(aub, 0x00000000); /* mask hi */
755*61046927SAndroid Build Coastguard Worker dword_out(aub, 0x00000001);
756*61046927SAndroid Build Coastguard Worker } else {
757*61046927SAndroid Build Coastguard Worker dword_out(aub, 0x00000010); /* mask lo */
758*61046927SAndroid Build Coastguard Worker dword_out(aub, 0x00000000); /* mask hi */
759*61046927SAndroid Build Coastguard Worker dword_out(aub, 0x00000000);
760*61046927SAndroid Build Coastguard Worker }
761*61046927SAndroid Build Coastguard Worker }
762*61046927SAndroid Build Coastguard Worker
763*61046927SAndroid Build Coastguard Worker static void
aub_dump_ring_buffer_legacy(struct aub_file * aub,uint64_t batch_offset,uint64_t offset,enum intel_engine_class engine_class)764*61046927SAndroid Build Coastguard Worker aub_dump_ring_buffer_legacy(struct aub_file *aub,
765*61046927SAndroid Build Coastguard Worker uint64_t batch_offset,
766*61046927SAndroid Build Coastguard Worker uint64_t offset,
767*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class)
768*61046927SAndroid Build Coastguard Worker {
769*61046927SAndroid Build Coastguard Worker uint32_t ringbuffer[4096];
770*61046927SAndroid Build Coastguard Worker unsigned aub_mi_bbs_len;
771*61046927SAndroid Build Coastguard Worker int ring_count = 0;
772*61046927SAndroid Build Coastguard Worker static const int engine_class_to_ring[] = {
773*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_RENDER] = AUB_TRACE_TYPE_RING_PRB0,
774*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_VIDEO] = AUB_TRACE_TYPE_RING_PRB1,
775*61046927SAndroid Build Coastguard Worker [INTEL_ENGINE_CLASS_COPY] = AUB_TRACE_TYPE_RING_PRB2,
776*61046927SAndroid Build Coastguard Worker };
777*61046927SAndroid Build Coastguard Worker int ring = engine_class_to_ring[engine_class];
778*61046927SAndroid Build Coastguard Worker
779*61046927SAndroid Build Coastguard Worker /* Make a ring buffer to execute our batchbuffer. */
780*61046927SAndroid Build Coastguard Worker memset(ringbuffer, 0, sizeof(ringbuffer));
781*61046927SAndroid Build Coastguard Worker
782*61046927SAndroid Build Coastguard Worker aub_mi_bbs_len = aub->addr_bits > 32 ? 3 : 2;
783*61046927SAndroid Build Coastguard Worker ringbuffer[ring_count] = AUB_MI_BATCH_BUFFER_START | (aub_mi_bbs_len - 2);
784*61046927SAndroid Build Coastguard Worker aub_write_reloc(&aub->devinfo, &ringbuffer[ring_count + 1], batch_offset);
785*61046927SAndroid Build Coastguard Worker ring_count += aub_mi_bbs_len;
786*61046927SAndroid Build Coastguard Worker
787*61046927SAndroid Build Coastguard Worker /* Write out the ring. This appears to trigger execution of
788*61046927SAndroid Build Coastguard Worker * the ring in the simulator.
789*61046927SAndroid Build Coastguard Worker */
790*61046927SAndroid Build Coastguard Worker dword_out(aub, CMD_AUB_TRACE_HEADER_BLOCK |
791*61046927SAndroid Build Coastguard Worker ((aub->addr_bits > 32 ? 6 : 5) - 2));
792*61046927SAndroid Build Coastguard Worker dword_out(aub, AUB_TRACE_MEMTYPE_GTT | ring | AUB_TRACE_OP_COMMAND_WRITE);
793*61046927SAndroid Build Coastguard Worker dword_out(aub, 0); /* general/surface subtype */
794*61046927SAndroid Build Coastguard Worker dword_out(aub, offset);
795*61046927SAndroid Build Coastguard Worker dword_out(aub, ring_count * 4);
796*61046927SAndroid Build Coastguard Worker if (aub->addr_bits > 32)
797*61046927SAndroid Build Coastguard Worker dword_out(aub, offset >> 32);
798*61046927SAndroid Build Coastguard Worker
799*61046927SAndroid Build Coastguard Worker data_out(aub, ringbuffer, ring_count * 4);
800*61046927SAndroid Build Coastguard Worker }
801*61046927SAndroid Build Coastguard Worker
802*61046927SAndroid Build Coastguard Worker static void
aub_write_ensure_hwsp(struct aub_file * aub,enum intel_engine_class engine_class)803*61046927SAndroid Build Coastguard Worker aub_write_ensure_hwsp(struct aub_file *aub,
804*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class)
805*61046927SAndroid Build Coastguard Worker {
806*61046927SAndroid Build Coastguard Worker uint64_t *hwsp_addr = &aub->engine_setup[engine_class].hwsp_addr;
807*61046927SAndroid Build Coastguard Worker
808*61046927SAndroid Build Coastguard Worker if (*hwsp_addr != 0)
809*61046927SAndroid Build Coastguard Worker return;
810*61046927SAndroid Build Coastguard Worker
811*61046927SAndroid Build Coastguard Worker *hwsp_addr = alloc_ggtt_address(aub, 4096);
812*61046927SAndroid Build Coastguard Worker write_hwsp(aub, engine_class);
813*61046927SAndroid Build Coastguard Worker }
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker void
aub_write_exec(struct aub_file * aub,uint32_t ctx_id,uint64_t batch_addr,uint64_t offset,enum intel_engine_class engine_class)816*61046927SAndroid Build Coastguard Worker aub_write_exec(struct aub_file *aub, uint32_t ctx_id, uint64_t batch_addr,
817*61046927SAndroid Build Coastguard Worker uint64_t offset, enum intel_engine_class engine_class)
818*61046927SAndroid Build Coastguard Worker {
819*61046927SAndroid Build Coastguard Worker const struct engine *cs = engine_from_engine_class(engine_class);
820*61046927SAndroid Build Coastguard Worker
821*61046927SAndroid Build Coastguard Worker if (aub_use_execlists(aub)) {
822*61046927SAndroid Build Coastguard Worker struct aub_hw_context *hw_ctx =
823*61046927SAndroid Build Coastguard Worker aub_write_ensure_context(aub, ctx_id, engine_class);
824*61046927SAndroid Build Coastguard Worker uint64_t descriptor = get_context_descriptor(aub, cs, hw_ctx);
825*61046927SAndroid Build Coastguard Worker aub_write_ensure_hwsp(aub, engine_class);
826*61046927SAndroid Build Coastguard Worker aub_dump_ring_buffer_execlist(aub, hw_ctx, cs, batch_addr);
827*61046927SAndroid Build Coastguard Worker aub_dump_execlist(aub, cs, descriptor);
828*61046927SAndroid Build Coastguard Worker } else {
829*61046927SAndroid Build Coastguard Worker /* Dump ring buffer */
830*61046927SAndroid Build Coastguard Worker aub_dump_ring_buffer_legacy(aub, batch_addr, offset, engine_class);
831*61046927SAndroid Build Coastguard Worker }
832*61046927SAndroid Build Coastguard Worker fflush(aub->file);
833*61046927SAndroid Build Coastguard Worker }
834*61046927SAndroid Build Coastguard Worker
835*61046927SAndroid Build Coastguard Worker void
aub_write_context_execlists(struct aub_file * aub,uint64_t context_addr,enum intel_engine_class engine_class)836*61046927SAndroid Build Coastguard Worker aub_write_context_execlists(struct aub_file *aub, uint64_t context_addr,
837*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class)
838*61046927SAndroid Build Coastguard Worker {
839*61046927SAndroid Build Coastguard Worker const struct engine *cs = engine_from_engine_class(engine_class);
840*61046927SAndroid Build Coastguard Worker uint64_t descriptor = ((uint64_t)1 << 62 | context_addr | CONTEXT_FLAGS);
841*61046927SAndroid Build Coastguard Worker aub_dump_execlist(aub, cs, descriptor);
842*61046927SAndroid Build Coastguard Worker }
843