xref: /aosp_15_r20/external/mesa3d/src/amd/vulkan/radv_rmv.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Friedrich Vock
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #ifndef _WIN32
8*61046927SAndroid Build Coastguard Worker #include <dirent.h>
9*61046927SAndroid Build Coastguard Worker #include <unistd.h>
10*61046927SAndroid Build Coastguard Worker #endif
11*61046927SAndroid Build Coastguard Worker #include <errno.h>
12*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
13*61046927SAndroid Build Coastguard Worker #include <stdio.h>
14*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
15*61046927SAndroid Build Coastguard Worker #include "ac_gpu_info.h"
16*61046927SAndroid Build Coastguard Worker #include "radv_buffer.h"
17*61046927SAndroid Build Coastguard Worker #include "radv_descriptor_set.h"
18*61046927SAndroid Build Coastguard Worker #include "radv_device_memory.h"
19*61046927SAndroid Build Coastguard Worker #include "radv_event.h"
20*61046927SAndroid Build Coastguard Worker #include "radv_image.h"
21*61046927SAndroid Build Coastguard Worker #include "radv_pipeline_graphics.h"
22*61046927SAndroid Build Coastguard Worker #include "radv_pipeline_rt.h"
23*61046927SAndroid Build Coastguard Worker #include "radv_query.h"
24*61046927SAndroid Build Coastguard Worker #include "radv_rmv.h"
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #define RADV_FTRACE_INSTANCE_PATH "/sys/kernel/tracing/instances/amd_rmv"
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker static FILE *
open_event_file(const char * event_name,const char * event_filename,const char * mode)29*61046927SAndroid Build Coastguard Worker open_event_file(const char *event_name, const char *event_filename, const char *mode)
30*61046927SAndroid Build Coastguard Worker {
31*61046927SAndroid Build Coastguard Worker    char filename[2048];
32*61046927SAndroid Build Coastguard Worker    snprintf(filename, sizeof(filename), RADV_FTRACE_INSTANCE_PATH "/events/amdgpu/%s/%s", event_name, event_filename);
33*61046927SAndroid Build Coastguard Worker    return fopen(filename, mode);
34*61046927SAndroid Build Coastguard Worker }
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker static bool
set_event_tracing_enabled(const char * event_name,bool enabled)37*61046927SAndroid Build Coastguard Worker set_event_tracing_enabled(const char *event_name, bool enabled)
38*61046927SAndroid Build Coastguard Worker {
39*61046927SAndroid Build Coastguard Worker    FILE *file = open_event_file(event_name, "enable", "w");
40*61046927SAndroid Build Coastguard Worker    if (!file)
41*61046927SAndroid Build Coastguard Worker       return false;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    size_t written_bytes = fwrite("1", 1, 1, file);
44*61046927SAndroid Build Coastguard Worker    fclose(file);
45*61046927SAndroid Build Coastguard Worker    return written_bytes == 1;
46*61046927SAndroid Build Coastguard Worker }
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker static uint16_t
trace_event_id(const char * event_name)49*61046927SAndroid Build Coastguard Worker trace_event_id(const char *event_name)
50*61046927SAndroid Build Coastguard Worker {
51*61046927SAndroid Build Coastguard Worker    /* id is 16-bit, so <= 65535 */
52*61046927SAndroid Build Coastguard Worker    char data[6];
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker    FILE *file = open_event_file(event_name, "id", "r");
55*61046927SAndroid Build Coastguard Worker    if (!file)
56*61046927SAndroid Build Coastguard Worker       return (uint16_t)~0;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    size_t read_bytes = fread(data, 1, 6, file);
59*61046927SAndroid Build Coastguard Worker    fclose(file);
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    if (!read_bytes)
62*61046927SAndroid Build Coastguard Worker       return (uint16_t)~0;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    return (uint16_t)strtoul(data, NULL, 10);
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker static void
open_trace_pipe(uint32_t cpu_index,int * dst_fd)68*61046927SAndroid Build Coastguard Worker open_trace_pipe(uint32_t cpu_index, int *dst_fd)
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
71*61046927SAndroid Build Coastguard Worker    *dst_fd = -1;
72*61046927SAndroid Build Coastguard Worker #else
73*61046927SAndroid Build Coastguard Worker    char filename[2048];
74*61046927SAndroid Build Coastguard Worker    snprintf(filename, sizeof(filename), RADV_FTRACE_INSTANCE_PATH "/per_cpu/cpu%d/trace_pipe_raw", cpu_index);
75*61046927SAndroid Build Coastguard Worker    /* I/O to the pipe needs to be non-blocking, otherwise reading all available
76*61046927SAndroid Build Coastguard Worker     * data would block indefinitely by waiting for more data to be written to the pipe */
77*61046927SAndroid Build Coastguard Worker    *dst_fd = open(filename, O_RDONLY | O_NONBLOCK);
78*61046927SAndroid Build Coastguard Worker #endif
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker /*
82*61046927SAndroid Build Coastguard Worker  * Kernel trace buffer parsing
83*61046927SAndroid Build Coastguard Worker  */
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker struct trace_page_header {
86*61046927SAndroid Build Coastguard Worker    uint64_t timestamp;
87*61046927SAndroid Build Coastguard Worker    int32_t commit;
88*61046927SAndroid Build Coastguard Worker };
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker enum trace_event_type { TRACE_EVENT_TYPE_PADDING = 29, TRACE_EVENT_TYPE_EXTENDED_DELTA, TRACE_EVENT_TYPE_TIMESTAMP };
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker struct trace_event_header {
93*61046927SAndroid Build Coastguard Worker    uint32_t type_len : 5;
94*61046927SAndroid Build Coastguard Worker    uint32_t time_delta : 27;
95*61046927SAndroid Build Coastguard Worker    /* Only present if length is too big for type_len */
96*61046927SAndroid Build Coastguard Worker    uint32_t excess_length;
97*61046927SAndroid Build Coastguard Worker };
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker struct trace_event_common {
100*61046927SAndroid Build Coastguard Worker    unsigned short type;
101*61046927SAndroid Build Coastguard Worker    unsigned char flags;
102*61046927SAndroid Build Coastguard Worker    unsigned char preempt_count;
103*61046927SAndroid Build Coastguard Worker    int pid;
104*61046927SAndroid Build Coastguard Worker };
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker struct trace_event_amdgpu_vm_update_ptes {
107*61046927SAndroid Build Coastguard Worker    struct trace_event_common common;
108*61046927SAndroid Build Coastguard Worker    uint64_t start;
109*61046927SAndroid Build Coastguard Worker    uint64_t end;
110*61046927SAndroid Build Coastguard Worker    uint64_t flags;
111*61046927SAndroid Build Coastguard Worker    unsigned int num_ptes;
112*61046927SAndroid Build Coastguard Worker    uint64_t incr;
113*61046927SAndroid Build Coastguard Worker    int pid;
114*61046927SAndroid Build Coastguard Worker    uint64_t vm_ctx;
115*61046927SAndroid Build Coastguard Worker };
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker /* Represents a dynamic array of addresses in the ftrace buffer. */
118*61046927SAndroid Build Coastguard Worker struct trace_event_address_array {
119*61046927SAndroid Build Coastguard Worker    uint16_t data_size;
120*61046927SAndroid Build Coastguard Worker    uint16_t reserved;
121*61046927SAndroid Build Coastguard Worker    char data[];
122*61046927SAndroid Build Coastguard Worker };
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker /* Possible flags for PTEs, taken from amdgpu_vm.h */
125*61046927SAndroid Build Coastguard Worker #define AMDGPU_PTE_VALID  (1ULL << 0)
126*61046927SAndroid Build Coastguard Worker #define AMDGPU_PTE_SYSTEM (1ULL << 1)
127*61046927SAndroid Build Coastguard Worker #define AMDGPU_PTE_PRT    (1ULL << 51)
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker /* The minimum size of a GPU page */
130*61046927SAndroid Build Coastguard Worker #define MIN_GPU_PAGE_SIZE 4096
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker static void
emit_page_table_update_event(struct vk_memory_trace_data * data,bool is_apu,uint64_t timestamp,struct trace_event_amdgpu_vm_update_ptes * event,uint64_t * addrs,unsigned int pte_index)133*61046927SAndroid Build Coastguard Worker emit_page_table_update_event(struct vk_memory_trace_data *data, bool is_apu, uint64_t timestamp,
134*61046927SAndroid Build Coastguard Worker                              struct trace_event_amdgpu_vm_update_ptes *event, uint64_t *addrs, unsigned int pte_index)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker    struct vk_rmv_token token;
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker    uint64_t end_addr;
139*61046927SAndroid Build Coastguard Worker    /* There may be more updated PTEs than the ones reported in the ftrace buffer.
140*61046927SAndroid Build Coastguard Worker     * We choose the reported end virtual address here to report the correct total committed memory. */
141*61046927SAndroid Build Coastguard Worker    if (pte_index == event->num_ptes - 1)
142*61046927SAndroid Build Coastguard Worker       end_addr = event->end;
143*61046927SAndroid Build Coastguard Worker    else
144*61046927SAndroid Build Coastguard Worker       end_addr = event->start + (pte_index + 1) * (event->incr / MIN_GPU_PAGE_SIZE);
145*61046927SAndroid Build Coastguard Worker    uint64_t start_addr = event->start + pte_index * (event->incr / MIN_GPU_PAGE_SIZE);
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    token.type = VK_RMV_TOKEN_TYPE_PAGE_TABLE_UPDATE;
148*61046927SAndroid Build Coastguard Worker    token.timestamp = timestamp;
149*61046927SAndroid Build Coastguard Worker    token.data.page_table_update.type = VK_RMV_PAGE_TABLE_UPDATE_TYPE_UPDATE;
150*61046927SAndroid Build Coastguard Worker    token.data.page_table_update.page_size = event->incr;
151*61046927SAndroid Build Coastguard Worker    token.data.page_table_update.page_count = (end_addr - start_addr) * MIN_GPU_PAGE_SIZE / event->incr;
152*61046927SAndroid Build Coastguard Worker    token.data.page_table_update.pid = event->common.pid;
153*61046927SAndroid Build Coastguard Worker    token.data.page_table_update.virtual_address = event->start * MIN_GPU_PAGE_SIZE + pte_index * event->incr;
154*61046927SAndroid Build Coastguard Worker    /* RMV expects mappings to system memory to have a physical address of 0.
155*61046927SAndroid Build Coastguard Worker     * Even with traces generated by AMDGPU-PRO, on APUs without dedicated VRAM everything seems to
156*61046927SAndroid Build Coastguard Worker     * be marked as "committed to system memory". */
157*61046927SAndroid Build Coastguard Worker    token.data.page_table_update.physical_address = event->flags & AMDGPU_PTE_SYSTEM || is_apu ? 0 : addrs[pte_index];
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    token.data.page_table_update.is_unmap = !(event->flags & (AMDGPU_PTE_VALID | AMDGPU_PTE_PRT));
160*61046927SAndroid Build Coastguard Worker    util_dynarray_append(&data->tokens, struct vk_rmv_token, token);
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker static void
evaluate_trace_event(struct radv_device * device,uint64_t timestamp,struct util_dynarray * tokens,struct trace_event_amdgpu_vm_update_ptes * event)164*61046927SAndroid Build Coastguard Worker evaluate_trace_event(struct radv_device *device, uint64_t timestamp, struct util_dynarray *tokens,
165*61046927SAndroid Build Coastguard Worker                      struct trace_event_amdgpu_vm_update_ptes *event)
166*61046927SAndroid Build Coastguard Worker {
167*61046927SAndroid Build Coastguard Worker    const struct radv_physical_device *pdev = radv_device_physical(device);
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker    if (event->common.pid != getpid() && event->pid != getpid()) {
170*61046927SAndroid Build Coastguard Worker       return;
171*61046927SAndroid Build Coastguard Worker    }
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker    struct trace_event_address_array *array = (struct trace_event_address_array *)(event + 1);
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < event->num_ptes; ++i)
176*61046927SAndroid Build Coastguard Worker       emit_page_table_update_event(&device->vk.memory_trace_data, !pdev->info.has_dedicated_vram, timestamp, event,
177*61046927SAndroid Build Coastguard Worker                                    (uint64_t *)array->data, i);
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker static void
append_trace_events(struct radv_device * device,int pipe_fd)181*61046927SAndroid Build Coastguard Worker append_trace_events(struct radv_device *device, int pipe_fd)
182*61046927SAndroid Build Coastguard Worker {
183*61046927SAndroid Build Coastguard Worker    /* Assuming 4KB if os_get_page_size fails. */
184*61046927SAndroid Build Coastguard Worker    uint64_t page_size = 4096;
185*61046927SAndroid Build Coastguard Worker    os_get_page_size(&page_size);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker    uint64_t timestamp;
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker    /*
190*61046927SAndroid Build Coastguard Worker     * Parse the trace ring buffer page by page.
191*61046927SAndroid Build Coastguard Worker     */
192*61046927SAndroid Build Coastguard Worker    char *page = (char *)malloc(page_size);
193*61046927SAndroid Build Coastguard Worker    if (!page) {
194*61046927SAndroid Build Coastguard Worker       return;
195*61046927SAndroid Build Coastguard Worker    }
196*61046927SAndroid Build Coastguard Worker    int64_t read_bytes;
197*61046927SAndroid Build Coastguard Worker    do {
198*61046927SAndroid Build Coastguard Worker       read_bytes = (int64_t)read(pipe_fd, page, page_size);
199*61046927SAndroid Build Coastguard Worker       if (read_bytes < (int64_t)sizeof(struct trace_page_header))
200*61046927SAndroid Build Coastguard Worker          break;
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker       struct trace_page_header *page_header = (struct trace_page_header *)page;
203*61046927SAndroid Build Coastguard Worker       timestamp = page_header->timestamp;
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker       size_t data_size = MIN2((size_t)read_bytes, (size_t)page_header->commit);
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker       char *read_ptr = page + sizeof(struct trace_page_header);
208*61046927SAndroid Build Coastguard Worker       while (read_ptr - page < data_size) {
209*61046927SAndroid Build Coastguard Worker          struct trace_event_header *event_header = (struct trace_event_header *)read_ptr;
210*61046927SAndroid Build Coastguard Worker          read_ptr += sizeof(struct trace_event_header);
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker          /* Handle special event type, see include/linux/ring_buffer.h in the
213*61046927SAndroid Build Coastguard Worker           * kernel source */
214*61046927SAndroid Build Coastguard Worker          switch (event_header->type_len) {
215*61046927SAndroid Build Coastguard Worker          case TRACE_EVENT_TYPE_PADDING:
216*61046927SAndroid Build Coastguard Worker             if (event_header->time_delta) {
217*61046927SAndroid Build Coastguard Worker                /* Specified size, skip past padding */
218*61046927SAndroid Build Coastguard Worker                read_ptr += event_header->excess_length;
219*61046927SAndroid Build Coastguard Worker                timestamp += event_header->time_delta;
220*61046927SAndroid Build Coastguard Worker                continue;
221*61046927SAndroid Build Coastguard Worker             } else {
222*61046927SAndroid Build Coastguard Worker                /* Padding is until end of page, skip until next page */
223*61046927SAndroid Build Coastguard Worker                read_ptr = page + data_size;
224*61046927SAndroid Build Coastguard Worker                continue;
225*61046927SAndroid Build Coastguard Worker             }
226*61046927SAndroid Build Coastguard Worker          case TRACE_EVENT_TYPE_EXTENDED_DELTA:
227*61046927SAndroid Build Coastguard Worker             timestamp += event_header->time_delta;
228*61046927SAndroid Build Coastguard Worker             timestamp += (uint64_t)event_header->excess_length << 27ULL;
229*61046927SAndroid Build Coastguard Worker             continue;
230*61046927SAndroid Build Coastguard Worker          case TRACE_EVENT_TYPE_TIMESTAMP:
231*61046927SAndroid Build Coastguard Worker             timestamp = event_header->time_delta;
232*61046927SAndroid Build Coastguard Worker             timestamp |= (uint64_t)event_header->excess_length << 27ULL;
233*61046927SAndroid Build Coastguard Worker             continue;
234*61046927SAndroid Build Coastguard Worker          default:
235*61046927SAndroid Build Coastguard Worker             break;
236*61046927SAndroid Build Coastguard Worker          }
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker          timestamp += event_header->time_delta;
239*61046927SAndroid Build Coastguard Worker 
240*61046927SAndroid Build Coastguard Worker          /* If type_len is not one of the special types and not zero, it is
241*61046927SAndroid Build Coastguard Worker           * the data length / 4. */
242*61046927SAndroid Build Coastguard Worker          size_t length;
243*61046927SAndroid Build Coastguard Worker          struct trace_event_common *event;
244*61046927SAndroid Build Coastguard Worker          if (event_header->type_len) {
245*61046927SAndroid Build Coastguard Worker             length = event_header->type_len * 4 + 4;
246*61046927SAndroid Build Coastguard Worker             /* The length variable already contains event data in this case.
247*61046927SAndroid Build Coastguard Worker              */
248*61046927SAndroid Build Coastguard Worker             event = (struct trace_event_common *)&event_header->excess_length;
249*61046927SAndroid Build Coastguard Worker          } else {
250*61046927SAndroid Build Coastguard Worker             length = event_header->excess_length + 4;
251*61046927SAndroid Build Coastguard Worker             event = (struct trace_event_common *)read_ptr;
252*61046927SAndroid Build Coastguard Worker          }
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker          if (event->type == device->memory_trace.ftrace_update_ptes_id)
255*61046927SAndroid Build Coastguard Worker             evaluate_trace_event(device, timestamp, &device->vk.memory_trace_data.tokens,
256*61046927SAndroid Build Coastguard Worker                                  (struct trace_event_amdgpu_vm_update_ptes *)event);
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker          read_ptr += length - sizeof(struct trace_event_header);
259*61046927SAndroid Build Coastguard Worker       }
260*61046927SAndroid Build Coastguard Worker    } while (true);
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker    free(page);
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker static void
close_pipe_fds(struct radv_device * device)266*61046927SAndroid Build Coastguard Worker close_pipe_fds(struct radv_device *device)
267*61046927SAndroid Build Coastguard Worker {
268*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < device->memory_trace.num_cpus; ++i) {
269*61046927SAndroid Build Coastguard Worker       close(device->memory_trace.pipe_fds[i]);
270*61046927SAndroid Build Coastguard Worker    }
271*61046927SAndroid Build Coastguard Worker }
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker void
radv_memory_trace_init(struct radv_device * device)274*61046927SAndroid Build Coastguard Worker radv_memory_trace_init(struct radv_device *device)
275*61046927SAndroid Build Coastguard Worker {
276*61046927SAndroid Build Coastguard Worker #ifndef _WIN32
277*61046927SAndroid Build Coastguard Worker    DIR *dir = opendir(RADV_FTRACE_INSTANCE_PATH);
278*61046927SAndroid Build Coastguard Worker    if (!dir) {
279*61046927SAndroid Build Coastguard Worker       fprintf(stderr,
280*61046927SAndroid Build Coastguard Worker               "radv: Couldn't initialize memory tracing: "
281*61046927SAndroid Build Coastguard Worker               "Can't access the tracing instance directory (%s)\n",
282*61046927SAndroid Build Coastguard Worker               strerror(errno));
283*61046927SAndroid Build Coastguard Worker       goto error;
284*61046927SAndroid Build Coastguard Worker    }
285*61046927SAndroid Build Coastguard Worker    closedir(dir);
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker    device->memory_trace.num_cpus = 0;
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    char cpuinfo_line[1024];
290*61046927SAndroid Build Coastguard Worker    FILE *cpuinfo_file = fopen("/proc/cpuinfo", "r");
291*61046927SAndroid Build Coastguard Worker    uint32_t num_physical_cores;
292*61046927SAndroid Build Coastguard Worker    while (fgets(cpuinfo_line, sizeof(cpuinfo_line), cpuinfo_file)) {
293*61046927SAndroid Build Coastguard Worker       char *logical_core_string = strstr(cpuinfo_line, "siblings");
294*61046927SAndroid Build Coastguard Worker       if (logical_core_string)
295*61046927SAndroid Build Coastguard Worker          sscanf(logical_core_string, "siblings : %d", &device->memory_trace.num_cpus);
296*61046927SAndroid Build Coastguard Worker       char *physical_core_string = strstr(cpuinfo_line, "cpu cores");
297*61046927SAndroid Build Coastguard Worker       if (physical_core_string)
298*61046927SAndroid Build Coastguard Worker          sscanf(physical_core_string, "cpu cores : %d", &num_physical_cores);
299*61046927SAndroid Build Coastguard Worker    }
300*61046927SAndroid Build Coastguard Worker    if (!device->memory_trace.num_cpus)
301*61046927SAndroid Build Coastguard Worker       device->memory_trace.num_cpus = num_physical_cores;
302*61046927SAndroid Build Coastguard Worker    fclose(cpuinfo_file);
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker    FILE *clock_file = fopen(RADV_FTRACE_INSTANCE_PATH "/trace_clock", "w");
305*61046927SAndroid Build Coastguard Worker    if (!clock_file) {
306*61046927SAndroid Build Coastguard Worker       fprintf(stderr,
307*61046927SAndroid Build Coastguard Worker               "radv: Couldn't initialize memory tracing: "
308*61046927SAndroid Build Coastguard Worker               "Can't access the tracing control files (%s).\n",
309*61046927SAndroid Build Coastguard Worker               strerror(errno));
310*61046927SAndroid Build Coastguard Worker       goto error;
311*61046927SAndroid Build Coastguard Worker    }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    fprintf(clock_file, "mono");
314*61046927SAndroid Build Coastguard Worker    fclose(clock_file);
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    device->memory_trace.pipe_fds = malloc(device->memory_trace.num_cpus * sizeof(int));
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker    if (!device->memory_trace.pipe_fds) {
319*61046927SAndroid Build Coastguard Worker       device->memory_trace.num_cpus = 0;
320*61046927SAndroid Build Coastguard Worker    }
321*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < device->memory_trace.num_cpus; ++i) {
322*61046927SAndroid Build Coastguard Worker       open_trace_pipe(i, device->memory_trace.pipe_fds + i);
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker       if (device->memory_trace.pipe_fds[i] == -1) {
325*61046927SAndroid Build Coastguard Worker          fprintf(stderr,
326*61046927SAndroid Build Coastguard Worker                  "radv: Couldn't initialize memory tracing: "
327*61046927SAndroid Build Coastguard Worker                  "Can't access the trace buffer pipes (%s).\n",
328*61046927SAndroid Build Coastguard Worker                  strerror(errno));
329*61046927SAndroid Build Coastguard Worker          for (i -= 1; i < device->memory_trace.num_cpus; --i) {
330*61046927SAndroid Build Coastguard Worker             close(device->memory_trace.pipe_fds[i]);
331*61046927SAndroid Build Coastguard Worker          }
332*61046927SAndroid Build Coastguard Worker          goto error;
333*61046927SAndroid Build Coastguard Worker       }
334*61046927SAndroid Build Coastguard Worker    }
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker    device->memory_trace.ftrace_update_ptes_id = trace_event_id("amdgpu_vm_update_ptes");
337*61046927SAndroid Build Coastguard Worker    if (device->memory_trace.ftrace_update_ptes_id == (uint16_t)~0U) {
338*61046927SAndroid Build Coastguard Worker       fprintf(stderr,
339*61046927SAndroid Build Coastguard Worker               "radv: Couldn't initialize memory tracing: "
340*61046927SAndroid Build Coastguard Worker               "Can't access the trace event ID file (%s).\n",
341*61046927SAndroid Build Coastguard Worker               strerror(errno));
342*61046927SAndroid Build Coastguard Worker       goto error_pipes;
343*61046927SAndroid Build Coastguard Worker    }
344*61046927SAndroid Build Coastguard Worker 
345*61046927SAndroid Build Coastguard Worker    if (!set_event_tracing_enabled("amdgpu_vm_update_ptes", true)) {
346*61046927SAndroid Build Coastguard Worker       fprintf(stderr,
347*61046927SAndroid Build Coastguard Worker               "radv: Couldn't initialize memory tracing: "
348*61046927SAndroid Build Coastguard Worker               "Can't enable trace events (%s).\n",
349*61046927SAndroid Build Coastguard Worker               strerror(errno));
350*61046927SAndroid Build Coastguard Worker       goto error_pipes;
351*61046927SAndroid Build Coastguard Worker    }
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "radv: Enabled Memory Trace.\n");
354*61046927SAndroid Build Coastguard Worker    return;
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker error_pipes:
357*61046927SAndroid Build Coastguard Worker    close_pipe_fds(device);
358*61046927SAndroid Build Coastguard Worker error:
359*61046927SAndroid Build Coastguard Worker    vk_memory_trace_finish(&device->vk);
360*61046927SAndroid Build Coastguard Worker #endif
361*61046927SAndroid Build Coastguard Worker }
362*61046927SAndroid Build Coastguard Worker 
363*61046927SAndroid Build Coastguard Worker static void
fill_memory_info(const struct radeon_info * gpu_info,struct vk_rmv_memory_info * out_info,int32_t index)364*61046927SAndroid Build Coastguard Worker fill_memory_info(const struct radeon_info *gpu_info, struct vk_rmv_memory_info *out_info, int32_t index)
365*61046927SAndroid Build Coastguard Worker {
366*61046927SAndroid Build Coastguard Worker    switch (index) {
367*61046927SAndroid Build Coastguard Worker    case VK_RMV_MEMORY_LOCATION_DEVICE:
368*61046927SAndroid Build Coastguard Worker       out_info->physical_base_address = 0;
369*61046927SAndroid Build Coastguard Worker       out_info->size = gpu_info->all_vram_visible ? (uint64_t)gpu_info->vram_size_kb * 1024ULL
370*61046927SAndroid Build Coastguard Worker                                                   : (uint64_t)gpu_info->vram_vis_size_kb * 1024ULL;
371*61046927SAndroid Build Coastguard Worker       break;
372*61046927SAndroid Build Coastguard Worker    case VK_RMV_MEMORY_LOCATION_DEVICE_INVISIBLE:
373*61046927SAndroid Build Coastguard Worker       out_info->physical_base_address = (uint64_t)gpu_info->vram_vis_size_kb * 1024ULL;
374*61046927SAndroid Build Coastguard Worker       out_info->size = gpu_info->all_vram_visible ? 0 : (uint64_t)gpu_info->vram_size_kb * 1024ULL;
375*61046927SAndroid Build Coastguard Worker       break;
376*61046927SAndroid Build Coastguard Worker    case VK_RMV_MEMORY_LOCATION_HOST: {
377*61046927SAndroid Build Coastguard Worker       uint64_t ram_size = -1U;
378*61046927SAndroid Build Coastguard Worker       os_get_total_physical_memory(&ram_size);
379*61046927SAndroid Build Coastguard Worker       out_info->physical_base_address = 0;
380*61046927SAndroid Build Coastguard Worker       out_info->size = MIN2((uint64_t)gpu_info->gart_size_kb * 1024ULL, ram_size);
381*61046927SAndroid Build Coastguard Worker    } break;
382*61046927SAndroid Build Coastguard Worker    default:
383*61046927SAndroid Build Coastguard Worker       unreachable("invalid memory index");
384*61046927SAndroid Build Coastguard Worker    }
385*61046927SAndroid Build Coastguard Worker }
386*61046927SAndroid Build Coastguard Worker 
387*61046927SAndroid Build Coastguard Worker static enum vk_rmv_memory_type
memory_type_from_vram_type(uint32_t vram_type)388*61046927SAndroid Build Coastguard Worker memory_type_from_vram_type(uint32_t vram_type)
389*61046927SAndroid Build Coastguard Worker {
390*61046927SAndroid Build Coastguard Worker    switch (vram_type) {
391*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_UNKNOWN:
392*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_UNKNOWN;
393*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR2:
394*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_DDR2;
395*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR3:
396*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_DDR3;
397*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR4:
398*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_DDR4;
399*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_GDDR5:
400*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_GDDR5;
401*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_HBM:
402*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_HBM;
403*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_GDDR6:
404*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_GDDR6;
405*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR5:
406*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_DDR5;
407*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_LPDDR4:
408*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_LPDDR4;
409*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_LPDDR5:
410*61046927SAndroid Build Coastguard Worker       return VK_RMV_MEMORY_TYPE_LPDDR5;
411*61046927SAndroid Build Coastguard Worker    default:
412*61046927SAndroid Build Coastguard Worker       unreachable("Invalid vram type");
413*61046927SAndroid Build Coastguard Worker    }
414*61046927SAndroid Build Coastguard Worker }
415*61046927SAndroid Build Coastguard Worker 
416*61046927SAndroid Build Coastguard Worker void
radv_rmv_fill_device_info(const struct radv_physical_device * pdev,struct vk_rmv_device_info * info)417*61046927SAndroid Build Coastguard Worker radv_rmv_fill_device_info(const struct radv_physical_device *pdev, struct vk_rmv_device_info *info)
418*61046927SAndroid Build Coastguard Worker {
419*61046927SAndroid Build Coastguard Worker    const struct radeon_info *gpu_info = &pdev->info;
420*61046927SAndroid Build Coastguard Worker 
421*61046927SAndroid Build Coastguard Worker    for (int32_t i = 0; i < VK_RMV_MEMORY_LOCATION_COUNT; ++i) {
422*61046927SAndroid Build Coastguard Worker       fill_memory_info(gpu_info, &info->memory_infos[i], i);
423*61046927SAndroid Build Coastguard Worker    }
424*61046927SAndroid Build Coastguard Worker 
425*61046927SAndroid Build Coastguard Worker    if (gpu_info->marketing_name)
426*61046927SAndroid Build Coastguard Worker       strncpy(info->device_name, gpu_info->marketing_name, sizeof(info->device_name) - 1);
427*61046927SAndroid Build Coastguard Worker    info->pcie_family_id = gpu_info->family_id;
428*61046927SAndroid Build Coastguard Worker    info->pcie_revision_id = gpu_info->pci_rev_id;
429*61046927SAndroid Build Coastguard Worker    info->pcie_device_id = gpu_info->pci.dev;
430*61046927SAndroid Build Coastguard Worker    info->minimum_shader_clock = 0;
431*61046927SAndroid Build Coastguard Worker    info->maximum_shader_clock = gpu_info->max_gpu_freq_mhz;
432*61046927SAndroid Build Coastguard Worker    info->vram_type = memory_type_from_vram_type(gpu_info->vram_type);
433*61046927SAndroid Build Coastguard Worker    info->vram_bus_width = gpu_info->memory_bus_width;
434*61046927SAndroid Build Coastguard Worker    info->vram_operations_per_clock = ac_memory_ops_per_clock(gpu_info->vram_type);
435*61046927SAndroid Build Coastguard Worker    info->minimum_memory_clock = 0;
436*61046927SAndroid Build Coastguard Worker    info->maximum_memory_clock = gpu_info->memory_freq_mhz;
437*61046927SAndroid Build Coastguard Worker    info->vram_bandwidth = gpu_info->memory_bandwidth_gbps;
438*61046927SAndroid Build Coastguard Worker }
439*61046927SAndroid Build Coastguard Worker 
440*61046927SAndroid Build Coastguard Worker void
radv_rmv_collect_trace_events(struct radv_device * device)441*61046927SAndroid Build Coastguard Worker radv_rmv_collect_trace_events(struct radv_device *device)
442*61046927SAndroid Build Coastguard Worker {
443*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < device->memory_trace.num_cpus; ++i) {
444*61046927SAndroid Build Coastguard Worker       append_trace_events(device, device->memory_trace.pipe_fds[i]);
445*61046927SAndroid Build Coastguard Worker    }
446*61046927SAndroid Build Coastguard Worker }
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker void
radv_memory_trace_finish(struct radv_device * device)449*61046927SAndroid Build Coastguard Worker radv_memory_trace_finish(struct radv_device *device)
450*61046927SAndroid Build Coastguard Worker {
451*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
452*61046927SAndroid Build Coastguard Worker       return;
453*61046927SAndroid Build Coastguard Worker 
454*61046927SAndroid Build Coastguard Worker    set_event_tracing_enabled("amdgpu_vm_update_ptes", false);
455*61046927SAndroid Build Coastguard Worker    close_pipe_fds(device);
456*61046927SAndroid Build Coastguard Worker }
457*61046927SAndroid Build Coastguard Worker 
458*61046927SAndroid Build Coastguard Worker /* The token lock must be held when entering _locked functions */
459*61046927SAndroid Build Coastguard Worker static void
log_resource_bind_locked(struct radv_device * device,uint64_t resource,struct radeon_winsys_bo * bo,uint64_t offset,uint64_t size)460*61046927SAndroid Build Coastguard Worker log_resource_bind_locked(struct radv_device *device, uint64_t resource, struct radeon_winsys_bo *bo, uint64_t offset,
461*61046927SAndroid Build Coastguard Worker                          uint64_t size)
462*61046927SAndroid Build Coastguard Worker {
463*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_bind_token token = {0};
464*61046927SAndroid Build Coastguard Worker    token.address = bo->va + offset;
465*61046927SAndroid Build Coastguard Worker    token.is_system_memory = bo->initial_domain & RADEON_DOMAIN_GTT;
466*61046927SAndroid Build Coastguard Worker    token.size = size;
467*61046927SAndroid Build Coastguard Worker    token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, resource);
468*61046927SAndroid Build Coastguard Worker 
469*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_BIND, &token);
470*61046927SAndroid Build Coastguard Worker }
471*61046927SAndroid Build Coastguard Worker 
472*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_heap_create(struct radv_device * device,VkDeviceMemory heap,bool is_internal,VkMemoryAllocateFlags alloc_flags)473*61046927SAndroid Build Coastguard Worker radv_rmv_log_heap_create(struct radv_device *device, VkDeviceMemory heap, bool is_internal,
474*61046927SAndroid Build Coastguard Worker                          VkMemoryAllocateFlags alloc_flags)
475*61046927SAndroid Build Coastguard Worker {
476*61046927SAndroid Build Coastguard Worker    const struct radv_physical_device *pdev = radv_device_physical(device);
477*61046927SAndroid Build Coastguard Worker 
478*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
479*61046927SAndroid Build Coastguard Worker       return;
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(radv_device_memory, memory, heap);
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker    /* Do not log zero-sized device memory objects. */
484*61046927SAndroid Build Coastguard Worker    if (!memory->alloc_size)
485*61046927SAndroid Build Coastguard Worker       return;
486*61046927SAndroid Build Coastguard Worker 
487*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token token = {0};
490*61046927SAndroid Build Coastguard Worker    token.is_driver_internal = is_internal;
491*61046927SAndroid Build Coastguard Worker    token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)heap);
492*61046927SAndroid Build Coastguard Worker    token.type = VK_RMV_RESOURCE_TYPE_HEAP;
493*61046927SAndroid Build Coastguard Worker    token.heap.alignment = pdev->info.max_alignment;
494*61046927SAndroid Build Coastguard Worker    token.heap.size = memory->alloc_size;
495*61046927SAndroid Build Coastguard Worker    token.heap.heap_index = memory->heap_index;
496*61046927SAndroid Build Coastguard Worker    token.heap.alloc_flags = alloc_flags;
497*61046927SAndroid Build Coastguard Worker 
498*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &token);
499*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, (uint64_t)heap, memory->bo, 0, memory->alloc_size);
500*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
501*61046927SAndroid Build Coastguard Worker }
502*61046927SAndroid Build Coastguard Worker 
503*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_bo_allocate(struct radv_device * device,struct radeon_winsys_bo * bo,bool is_internal)504*61046927SAndroid Build Coastguard Worker radv_rmv_log_bo_allocate(struct radv_device *device, struct radeon_winsys_bo *bo, bool is_internal)
505*61046927SAndroid Build Coastguard Worker {
506*61046927SAndroid Build Coastguard Worker    const struct radv_physical_device *pdev = radv_device_physical(device);
507*61046927SAndroid Build Coastguard Worker 
508*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
509*61046927SAndroid Build Coastguard Worker       return;
510*61046927SAndroid Build Coastguard Worker 
511*61046927SAndroid Build Coastguard Worker    /* RMV doesn't seem to support GDS/OA domains. */
512*61046927SAndroid Build Coastguard Worker    if (!(bo->initial_domain & RADEON_DOMAIN_VRAM_GTT))
513*61046927SAndroid Build Coastguard Worker       return;
514*61046927SAndroid Build Coastguard Worker 
515*61046927SAndroid Build Coastguard Worker    struct vk_rmv_virtual_allocate_token token = {0};
516*61046927SAndroid Build Coastguard Worker    token.address = bo->va;
517*61046927SAndroid Build Coastguard Worker    /* If all VRAM is visible, no bo will be in invisible memory. */
518*61046927SAndroid Build Coastguard Worker    token.is_in_invisible_vram = bo->vram_no_cpu_access && !pdev->info.all_vram_visible;
519*61046927SAndroid Build Coastguard Worker    token.preferred_domains = (enum vk_rmv_kernel_memory_domain)bo->initial_domain;
520*61046927SAndroid Build Coastguard Worker    token.is_driver_internal = is_internal;
521*61046927SAndroid Build Coastguard Worker    token.page_count = DIV_ROUND_UP(bo->size, 4096);
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
524*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_VIRTUAL_ALLOCATE, &token);
525*61046927SAndroid Build Coastguard Worker    radv_rmv_collect_trace_events(device);
526*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
527*61046927SAndroid Build Coastguard Worker }
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_bo_destroy(struct radv_device * device,struct radeon_winsys_bo * bo)530*61046927SAndroid Build Coastguard Worker radv_rmv_log_bo_destroy(struct radv_device *device, struct radeon_winsys_bo *bo)
531*61046927SAndroid Build Coastguard Worker {
532*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
533*61046927SAndroid Build Coastguard Worker       return;
534*61046927SAndroid Build Coastguard Worker 
535*61046927SAndroid Build Coastguard Worker    /* RMV doesn't seem to support GDS/OA domains. */
536*61046927SAndroid Build Coastguard Worker    if (!(bo->initial_domain & RADEON_DOMAIN_VRAM_GTT))
537*61046927SAndroid Build Coastguard Worker       return;
538*61046927SAndroid Build Coastguard Worker 
539*61046927SAndroid Build Coastguard Worker    struct vk_rmv_virtual_free_token token = {0};
540*61046927SAndroid Build Coastguard Worker    token.address = bo->va;
541*61046927SAndroid Build Coastguard Worker 
542*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
543*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_VIRTUAL_FREE, &token);
544*61046927SAndroid Build Coastguard Worker    radv_rmv_collect_trace_events(device);
545*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
546*61046927SAndroid Build Coastguard Worker }
547*61046927SAndroid Build Coastguard Worker 
548*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_buffer_bind(struct radv_device * device,VkBuffer _buffer)549*61046927SAndroid Build Coastguard Worker radv_rmv_log_buffer_bind(struct radv_device *device, VkBuffer _buffer)
550*61046927SAndroid Build Coastguard Worker {
551*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
552*61046927SAndroid Build Coastguard Worker       return;
553*61046927SAndroid Build Coastguard Worker 
554*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(radv_buffer, buffer, _buffer);
555*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
556*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, (uint64_t)_buffer, buffer->bo, buffer->offset, buffer->vk.size);
557*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
558*61046927SAndroid Build Coastguard Worker }
559*61046927SAndroid Build Coastguard Worker 
560*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_image_create(struct radv_device * device,const VkImageCreateInfo * create_info,bool is_internal,VkImage _image)561*61046927SAndroid Build Coastguard Worker radv_rmv_log_image_create(struct radv_device *device, const VkImageCreateInfo *create_info, bool is_internal,
562*61046927SAndroid Build Coastguard Worker                           VkImage _image)
563*61046927SAndroid Build Coastguard Worker {
564*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
565*61046927SAndroid Build Coastguard Worker       return;
566*61046927SAndroid Build Coastguard Worker 
567*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(radv_image, image, _image);
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
570*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token token = {0};
571*61046927SAndroid Build Coastguard Worker    token.is_driver_internal = is_internal;
572*61046927SAndroid Build Coastguard Worker    token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_image);
573*61046927SAndroid Build Coastguard Worker    token.type = VK_RMV_RESOURCE_TYPE_IMAGE;
574*61046927SAndroid Build Coastguard Worker    token.image.create_flags = create_info->flags;
575*61046927SAndroid Build Coastguard Worker    token.image.usage_flags = create_info->usage;
576*61046927SAndroid Build Coastguard Worker    token.image.type = create_info->imageType;
577*61046927SAndroid Build Coastguard Worker    token.image.extent = create_info->extent;
578*61046927SAndroid Build Coastguard Worker    token.image.format = create_info->format;
579*61046927SAndroid Build Coastguard Worker    token.image.num_mips = create_info->mipLevels;
580*61046927SAndroid Build Coastguard Worker    token.image.num_slices = create_info->arrayLayers;
581*61046927SAndroid Build Coastguard Worker    token.image.tiling = create_info->tiling;
582*61046927SAndroid Build Coastguard Worker    token.image.alignment_log2 = util_logbase2(image->alignment);
583*61046927SAndroid Build Coastguard Worker    token.image.log2_samples = util_logbase2(image->vk.samples);
584*61046927SAndroid Build Coastguard Worker    token.image.log2_storage_samples = util_logbase2(image->vk.samples);
585*61046927SAndroid Build Coastguard Worker    token.image.metadata_alignment_log2 = image->planes[0].surface.meta_alignment_log2;
586*61046927SAndroid Build Coastguard Worker    token.image.image_alignment_log2 = image->planes[0].surface.alignment_log2;
587*61046927SAndroid Build Coastguard Worker    token.image.size = image->size;
588*61046927SAndroid Build Coastguard Worker    token.image.metadata_size = image->planes[0].surface.meta_size;
589*61046927SAndroid Build Coastguard Worker    token.image.metadata_header_size = 0;
590*61046927SAndroid Build Coastguard Worker    token.image.metadata_offset = image->planes[0].surface.meta_offset;
591*61046927SAndroid Build Coastguard Worker    token.image.metadata_header_offset = image->planes[0].surface.meta_offset;
592*61046927SAndroid Build Coastguard Worker    token.image.presentable = image->planes[0].surface.is_displayable;
593*61046927SAndroid Build Coastguard Worker 
594*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &token);
595*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
596*61046927SAndroid Build Coastguard Worker }
597*61046927SAndroid Build Coastguard Worker 
598*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_image_bind(struct radv_device * device,uint32_t bind_idx,VkImage _image)599*61046927SAndroid Build Coastguard Worker radv_rmv_log_image_bind(struct radv_device *device, uint32_t bind_idx, VkImage _image)
600*61046927SAndroid Build Coastguard Worker {
601*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
602*61046927SAndroid Build Coastguard Worker       return;
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(radv_image, image, _image);
605*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
606*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, (uint64_t)_image, image->bindings[bind_idx].bo, image->bindings[bind_idx].offset,
607*61046927SAndroid Build Coastguard Worker                             image->bindings[bind_idx].range);
608*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
609*61046927SAndroid Build Coastguard Worker }
610*61046927SAndroid Build Coastguard Worker 
611*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_query_pool_create(struct radv_device * device,VkQueryPool _pool)612*61046927SAndroid Build Coastguard Worker radv_rmv_log_query_pool_create(struct radv_device *device, VkQueryPool _pool)
613*61046927SAndroid Build Coastguard Worker {
614*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
615*61046927SAndroid Build Coastguard Worker       return;
616*61046927SAndroid Build Coastguard Worker 
617*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(radv_query_pool, pool, _pool);
618*61046927SAndroid Build Coastguard Worker 
619*61046927SAndroid Build Coastguard Worker    if (pool->vk.query_type != VK_QUERY_TYPE_OCCLUSION && pool->vk.query_type != VK_QUERY_TYPE_PIPELINE_STATISTICS &&
620*61046927SAndroid Build Coastguard Worker        pool->vk.query_type != VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT)
621*61046927SAndroid Build Coastguard Worker       return;
622*61046927SAndroid Build Coastguard Worker 
623*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
624*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
625*61046927SAndroid Build Coastguard Worker    create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_pool);
626*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_QUERY_HEAP;
627*61046927SAndroid Build Coastguard Worker    create_token.query_pool.type = pool->vk.query_type;
628*61046927SAndroid Build Coastguard Worker    create_token.query_pool.has_cpu_access = true;
629*61046927SAndroid Build Coastguard Worker 
630*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
631*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, (uint64_t)_pool, pool->bo, 0, pool->size);
632*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
633*61046927SAndroid Build Coastguard Worker }
634*61046927SAndroid Build Coastguard Worker 
635*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_command_buffer_bo_create(struct radv_device * device,struct radeon_winsys_bo * bo,uint32_t executable_size,uint32_t data_size,uint32_t scratch_size)636*61046927SAndroid Build Coastguard Worker radv_rmv_log_command_buffer_bo_create(struct radv_device *device, struct radeon_winsys_bo *bo, uint32_t executable_size,
637*61046927SAndroid Build Coastguard Worker                                       uint32_t data_size, uint32_t scratch_size)
638*61046927SAndroid Build Coastguard Worker {
639*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
640*61046927SAndroid Build Coastguard Worker       return;
641*61046927SAndroid Build Coastguard Worker 
642*61046927SAndroid Build Coastguard Worker    uint64_t upload_resource_identifier = (uint64_t)(uintptr_t)bo;
643*61046927SAndroid Build Coastguard Worker 
644*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
645*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
646*61046927SAndroid Build Coastguard Worker    create_token.is_driver_internal = true;
647*61046927SAndroid Build Coastguard Worker    create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, upload_resource_identifier);
648*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_COMMAND_ALLOCATOR;
649*61046927SAndroid Build Coastguard Worker    create_token.command_buffer.preferred_domain = (enum vk_rmv_kernel_memory_domain)device->ws->cs_domain(device->ws);
650*61046927SAndroid Build Coastguard Worker    create_token.command_buffer.executable_size = executable_size;
651*61046927SAndroid Build Coastguard Worker    create_token.command_buffer.app_available_executable_size = executable_size;
652*61046927SAndroid Build Coastguard Worker    create_token.command_buffer.embedded_data_size = data_size;
653*61046927SAndroid Build Coastguard Worker    create_token.command_buffer.app_available_embedded_data_size = data_size;
654*61046927SAndroid Build Coastguard Worker    create_token.command_buffer.scratch_size = scratch_size;
655*61046927SAndroid Build Coastguard Worker    create_token.command_buffer.app_available_scratch_size = scratch_size;
656*61046927SAndroid Build Coastguard Worker 
657*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
658*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, upload_resource_identifier, bo, 0, bo->size);
659*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
660*61046927SAndroid Build Coastguard Worker    vk_rmv_log_cpu_map(&device->vk, bo->va, false);
661*61046927SAndroid Build Coastguard Worker }
662*61046927SAndroid Build Coastguard Worker 
663*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_command_buffer_bo_destroy(struct radv_device * device,struct radeon_winsys_bo * bo)664*61046927SAndroid Build Coastguard Worker radv_rmv_log_command_buffer_bo_destroy(struct radv_device *device, struct radeon_winsys_bo *bo)
665*61046927SAndroid Build Coastguard Worker {
666*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
667*61046927SAndroid Build Coastguard Worker       return;
668*61046927SAndroid Build Coastguard Worker 
669*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
670*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_destroy_token destroy_token = {0};
671*61046927SAndroid Build Coastguard Worker    destroy_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)(uintptr_t)bo);
672*61046927SAndroid Build Coastguard Worker 
673*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_DESTROY, &destroy_token);
674*61046927SAndroid Build Coastguard Worker    vk_rmv_destroy_resource_id_locked(&device->vk, (uint64_t)(uintptr_t)bo);
675*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
676*61046927SAndroid Build Coastguard Worker    vk_rmv_log_cpu_map(&device->vk, bo->va, true);
677*61046927SAndroid Build Coastguard Worker }
678*61046927SAndroid Build Coastguard Worker 
679*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_border_color_palette_create(struct radv_device * device,struct radeon_winsys_bo * bo)680*61046927SAndroid Build Coastguard Worker radv_rmv_log_border_color_palette_create(struct radv_device *device, struct radeon_winsys_bo *bo)
681*61046927SAndroid Build Coastguard Worker {
682*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
683*61046927SAndroid Build Coastguard Worker       return;
684*61046927SAndroid Build Coastguard Worker 
685*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
686*61046927SAndroid Build Coastguard Worker    uint32_t resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)(uintptr_t)bo);
687*61046927SAndroid Build Coastguard Worker 
688*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
689*61046927SAndroid Build Coastguard Worker    create_token.is_driver_internal = true;
690*61046927SAndroid Build Coastguard Worker    create_token.resource_id = resource_id;
691*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_BORDER_COLOR_PALETTE;
692*61046927SAndroid Build Coastguard Worker    /*
693*61046927SAndroid Build Coastguard Worker     * We have 4096 entries, but the corresponding RMV token only has 8 bits.
694*61046927SAndroid Build Coastguard Worker     */
695*61046927SAndroid Build Coastguard Worker    create_token.border_color_palette.num_entries = 255; /* = RADV_BORDER_COLOR_COUNT; */
696*61046927SAndroid Build Coastguard Worker 
697*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_bind_token bind_token;
698*61046927SAndroid Build Coastguard Worker    bind_token.address = bo->va;
699*61046927SAndroid Build Coastguard Worker    bind_token.is_system_memory = false;
700*61046927SAndroid Build Coastguard Worker    bind_token.resource_id = resource_id;
701*61046927SAndroid Build Coastguard Worker    bind_token.size = RADV_BORDER_COLOR_BUFFER_SIZE;
702*61046927SAndroid Build Coastguard Worker 
703*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
704*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_BIND, &bind_token);
705*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
706*61046927SAndroid Build Coastguard Worker    vk_rmv_log_cpu_map(&device->vk, bo->va, false);
707*61046927SAndroid Build Coastguard Worker }
708*61046927SAndroid Build Coastguard Worker 
709*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_border_color_palette_destroy(struct radv_device * device,struct radeon_winsys_bo * bo)710*61046927SAndroid Build Coastguard Worker radv_rmv_log_border_color_palette_destroy(struct radv_device *device, struct radeon_winsys_bo *bo)
711*61046927SAndroid Build Coastguard Worker {
712*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
713*61046927SAndroid Build Coastguard Worker       return;
714*61046927SAndroid Build Coastguard Worker 
715*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
716*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_destroy_token token = {0};
717*61046927SAndroid Build Coastguard Worker    /* same resource id as the create token */
718*61046927SAndroid Build Coastguard Worker    token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)(uintptr_t)bo);
719*61046927SAndroid Build Coastguard Worker 
720*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_DESTROY, &token);
721*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
722*61046927SAndroid Build Coastguard Worker    vk_rmv_log_cpu_map(&device->vk, bo->va, true);
723*61046927SAndroid Build Coastguard Worker }
724*61046927SAndroid Build Coastguard Worker 
725*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_sparse_add_residency(struct radv_device * device,struct radeon_winsys_bo * src_bo,uint64_t offset)726*61046927SAndroid Build Coastguard Worker radv_rmv_log_sparse_add_residency(struct radv_device *device, struct radeon_winsys_bo *src_bo, uint64_t offset)
727*61046927SAndroid Build Coastguard Worker {
728*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
729*61046927SAndroid Build Coastguard Worker       return;
730*61046927SAndroid Build Coastguard Worker 
731*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_reference_token token = {0};
732*61046927SAndroid Build Coastguard Worker    token.virtual_address = src_bo->va + offset;
733*61046927SAndroid Build Coastguard Worker    token.residency_removed = false;
734*61046927SAndroid Build Coastguard Worker 
735*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
736*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_REFERENCE, &token);
737*61046927SAndroid Build Coastguard Worker    radv_rmv_collect_trace_events(device);
738*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
739*61046927SAndroid Build Coastguard Worker }
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_sparse_remove_residency(struct radv_device * device,struct radeon_winsys_bo * src_bo,uint64_t offset)742*61046927SAndroid Build Coastguard Worker radv_rmv_log_sparse_remove_residency(struct radv_device *device, struct radeon_winsys_bo *src_bo, uint64_t offset)
743*61046927SAndroid Build Coastguard Worker {
744*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
745*61046927SAndroid Build Coastguard Worker       return;
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_reference_token token = {0};
748*61046927SAndroid Build Coastguard Worker    token.virtual_address = src_bo->va + offset;
749*61046927SAndroid Build Coastguard Worker    token.residency_removed = true;
750*61046927SAndroid Build Coastguard Worker 
751*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
752*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_REFERENCE, &token);
753*61046927SAndroid Build Coastguard Worker    radv_rmv_collect_trace_events(device);
754*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
755*61046927SAndroid Build Coastguard Worker }
756*61046927SAndroid Build Coastguard Worker 
757*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_descriptor_pool_create(struct radv_device * device,const VkDescriptorPoolCreateInfo * create_info,VkDescriptorPool _pool)758*61046927SAndroid Build Coastguard Worker radv_rmv_log_descriptor_pool_create(struct radv_device *device, const VkDescriptorPoolCreateInfo *create_info,
759*61046927SAndroid Build Coastguard Worker                                     VkDescriptorPool _pool)
760*61046927SAndroid Build Coastguard Worker {
761*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
762*61046927SAndroid Build Coastguard Worker       return;
763*61046927SAndroid Build Coastguard Worker 
764*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(radv_descriptor_pool, pool, _pool);
765*61046927SAndroid Build Coastguard Worker 
766*61046927SAndroid Build Coastguard Worker    if (pool->bo)
767*61046927SAndroid Build Coastguard Worker       vk_rmv_log_cpu_map(&device->vk, pool->bo->va, false);
768*61046927SAndroid Build Coastguard Worker 
769*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
770*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
771*61046927SAndroid Build Coastguard Worker    create_token.is_driver_internal = false;
772*61046927SAndroid Build Coastguard Worker    create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_pool);
773*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_DESCRIPTOR_POOL;
774*61046927SAndroid Build Coastguard Worker    create_token.descriptor_pool.max_sets = create_info->maxSets;
775*61046927SAndroid Build Coastguard Worker    create_token.descriptor_pool.pool_size_count = create_info->poolSizeCount;
776*61046927SAndroid Build Coastguard Worker    /* Using vk_rmv_token_pool_alloc frees the allocation automatically when the trace is done. */
777*61046927SAndroid Build Coastguard Worker    create_token.descriptor_pool.pool_sizes = malloc(create_info->poolSizeCount * sizeof(VkDescriptorPoolSize));
778*61046927SAndroid Build Coastguard Worker    if (!create_token.descriptor_pool.pool_sizes)
779*61046927SAndroid Build Coastguard Worker       return;
780*61046927SAndroid Build Coastguard Worker 
781*61046927SAndroid Build Coastguard Worker    memcpy(create_token.descriptor_pool.pool_sizes, create_info->pPoolSizes,
782*61046927SAndroid Build Coastguard Worker           create_info->poolSizeCount * sizeof(VkDescriptorPoolSize));
783*61046927SAndroid Build Coastguard Worker 
784*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
785*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
786*61046927SAndroid Build Coastguard Worker 
787*61046927SAndroid Build Coastguard Worker    if (pool->bo) {
788*61046927SAndroid Build Coastguard Worker       simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
789*61046927SAndroid Build Coastguard Worker       struct vk_rmv_resource_bind_token bind_token;
790*61046927SAndroid Build Coastguard Worker       bind_token.address = pool->bo->va;
791*61046927SAndroid Build Coastguard Worker       bind_token.is_system_memory = false;
792*61046927SAndroid Build Coastguard Worker       bind_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_pool);
793*61046927SAndroid Build Coastguard Worker       bind_token.size = pool->size;
794*61046927SAndroid Build Coastguard Worker 
795*61046927SAndroid Build Coastguard Worker       vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_BIND, &bind_token);
796*61046927SAndroid Build Coastguard Worker       simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
797*61046927SAndroid Build Coastguard Worker    }
798*61046927SAndroid Build Coastguard Worker }
799*61046927SAndroid Build Coastguard Worker 
800*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_graphics_pipeline_create(struct radv_device * device,struct radv_pipeline * pipeline,bool is_internal)801*61046927SAndroid Build Coastguard Worker radv_rmv_log_graphics_pipeline_create(struct radv_device *device, struct radv_pipeline *pipeline, bool is_internal)
802*61046927SAndroid Build Coastguard Worker {
803*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
804*61046927SAndroid Build Coastguard Worker       return;
805*61046927SAndroid Build Coastguard Worker 
806*61046927SAndroid Build Coastguard Worker    VkPipeline _pipeline = radv_pipeline_to_handle(pipeline);
807*61046927SAndroid Build Coastguard Worker    struct radv_graphics_pipeline *graphics_pipeline = radv_pipeline_to_graphics(pipeline);
808*61046927SAndroid Build Coastguard Worker 
809*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
810*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
811*61046927SAndroid Build Coastguard Worker    create_token.is_driver_internal = is_internal;
812*61046927SAndroid Build Coastguard Worker    create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_pipeline);
813*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_PIPELINE;
814*61046927SAndroid Build Coastguard Worker    create_token.pipeline.is_internal = is_internal;
815*61046927SAndroid Build Coastguard Worker    create_token.pipeline.hash_lo = pipeline->pipeline_hash;
816*61046927SAndroid Build Coastguard Worker    create_token.pipeline.is_ngg = graphics_pipeline->is_ngg;
817*61046927SAndroid Build Coastguard Worker    create_token.pipeline.shader_stages = graphics_pipeline->active_stages;
818*61046927SAndroid Build Coastguard Worker 
819*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
820*61046927SAndroid Build Coastguard Worker    for (unsigned s = 0; s < MESA_VULKAN_SHADER_STAGES; s++) {
821*61046927SAndroid Build Coastguard Worker       struct radv_shader *shader = pipeline->shaders[s];
822*61046927SAndroid Build Coastguard Worker 
823*61046927SAndroid Build Coastguard Worker       if (!shader)
824*61046927SAndroid Build Coastguard Worker          continue;
825*61046927SAndroid Build Coastguard Worker 
826*61046927SAndroid Build Coastguard Worker       log_resource_bind_locked(device, (uint64_t)_pipeline, shader->bo, shader->alloc->offset, shader->alloc->size);
827*61046927SAndroid Build Coastguard Worker    }
828*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
829*61046927SAndroid Build Coastguard Worker }
830*61046927SAndroid Build Coastguard Worker 
831*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_compute_pipeline_create(struct radv_device * device,struct radv_pipeline * pipeline,bool is_internal)832*61046927SAndroid Build Coastguard Worker radv_rmv_log_compute_pipeline_create(struct radv_device *device, struct radv_pipeline *pipeline, bool is_internal)
833*61046927SAndroid Build Coastguard Worker {
834*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
835*61046927SAndroid Build Coastguard Worker       return;
836*61046927SAndroid Build Coastguard Worker 
837*61046927SAndroid Build Coastguard Worker    VkPipeline _pipeline = radv_pipeline_to_handle(pipeline);
838*61046927SAndroid Build Coastguard Worker 
839*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
840*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
841*61046927SAndroid Build Coastguard Worker    create_token.is_driver_internal = is_internal;
842*61046927SAndroid Build Coastguard Worker    create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_pipeline);
843*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_PIPELINE;
844*61046927SAndroid Build Coastguard Worker    create_token.pipeline.is_internal = is_internal;
845*61046927SAndroid Build Coastguard Worker    create_token.pipeline.hash_lo = pipeline->pipeline_hash;
846*61046927SAndroid Build Coastguard Worker    create_token.pipeline.is_ngg = false;
847*61046927SAndroid Build Coastguard Worker    create_token.pipeline.shader_stages = VK_SHADER_STAGE_COMPUTE_BIT;
848*61046927SAndroid Build Coastguard Worker 
849*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
850*61046927SAndroid Build Coastguard Worker    struct radv_shader *shader = pipeline->shaders[MESA_SHADER_COMPUTE];
851*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, (uint64_t)_pipeline, shader->bo, shader->alloc->offset, shader->alloc->size);
852*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
853*61046927SAndroid Build Coastguard Worker }
854*61046927SAndroid Build Coastguard Worker 
855*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_rt_pipeline_create(struct radv_device * device,struct radv_ray_tracing_pipeline * pipeline)856*61046927SAndroid Build Coastguard Worker radv_rmv_log_rt_pipeline_create(struct radv_device *device, struct radv_ray_tracing_pipeline *pipeline)
857*61046927SAndroid Build Coastguard Worker {
858*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
859*61046927SAndroid Build Coastguard Worker       return;
860*61046927SAndroid Build Coastguard Worker 
861*61046927SAndroid Build Coastguard Worker    VkPipeline _pipeline = radv_pipeline_to_handle(&pipeline->base.base);
862*61046927SAndroid Build Coastguard Worker 
863*61046927SAndroid Build Coastguard Worker    struct radv_shader *prolog = pipeline->prolog;
864*61046927SAndroid Build Coastguard Worker    struct radv_shader *traversal = pipeline->base.base.shaders[MESA_SHADER_INTERSECTION];
865*61046927SAndroid Build Coastguard Worker 
866*61046927SAndroid Build Coastguard Worker    VkShaderStageFlagBits active_stages = traversal ? VK_SHADER_STAGE_INTERSECTION_BIT_KHR : 0;
867*61046927SAndroid Build Coastguard Worker    if (prolog)
868*61046927SAndroid Build Coastguard Worker       active_stages |= VK_SHADER_STAGE_COMPUTE_BIT;
869*61046927SAndroid Build Coastguard Worker 
870*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pipeline->stage_count; i++) {
871*61046927SAndroid Build Coastguard Worker       if (pipeline->stages[i].shader)
872*61046927SAndroid Build Coastguard Worker          active_stages |= mesa_to_vk_shader_stage(pipeline->stages[i].stage);
873*61046927SAndroid Build Coastguard Worker    }
874*61046927SAndroid Build Coastguard Worker 
875*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
876*61046927SAndroid Build Coastguard Worker 
877*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
878*61046927SAndroid Build Coastguard Worker    create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_pipeline);
879*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_PIPELINE;
880*61046927SAndroid Build Coastguard Worker    create_token.pipeline.hash_lo = pipeline->base.base.pipeline_hash;
881*61046927SAndroid Build Coastguard Worker    create_token.pipeline.shader_stages = active_stages;
882*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
883*61046927SAndroid Build Coastguard Worker 
884*61046927SAndroid Build Coastguard Worker    if (prolog)
885*61046927SAndroid Build Coastguard Worker       log_resource_bind_locked(device, (uint64_t)_pipeline, prolog->bo, prolog->alloc->offset, prolog->alloc->size);
886*61046927SAndroid Build Coastguard Worker 
887*61046927SAndroid Build Coastguard Worker    if (traversal)
888*61046927SAndroid Build Coastguard Worker       log_resource_bind_locked(device, (uint64_t)_pipeline, traversal->bo, traversal->alloc->offset,
889*61046927SAndroid Build Coastguard Worker                                traversal->alloc->size);
890*61046927SAndroid Build Coastguard Worker 
891*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pipeline->non_imported_stage_count; i++) {
892*61046927SAndroid Build Coastguard Worker       struct radv_shader *shader = pipeline->stages[i].shader;
893*61046927SAndroid Build Coastguard Worker       if (shader)
894*61046927SAndroid Build Coastguard Worker          log_resource_bind_locked(device, (uint64_t)_pipeline, shader->bo, shader->alloc->offset, shader->alloc->size);
895*61046927SAndroid Build Coastguard Worker    }
896*61046927SAndroid Build Coastguard Worker 
897*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
898*61046927SAndroid Build Coastguard Worker }
899*61046927SAndroid Build Coastguard Worker 
900*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_event_create(struct radv_device * device,VkEvent _event,VkEventCreateFlags flags,bool is_internal)901*61046927SAndroid Build Coastguard Worker radv_rmv_log_event_create(struct radv_device *device, VkEvent _event, VkEventCreateFlags flags, bool is_internal)
902*61046927SAndroid Build Coastguard Worker {
903*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
904*61046927SAndroid Build Coastguard Worker       return;
905*61046927SAndroid Build Coastguard Worker 
906*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(radv_event, event, _event);
907*61046927SAndroid Build Coastguard Worker 
908*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
909*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_create_token create_token = {0};
910*61046927SAndroid Build Coastguard Worker    create_token.is_driver_internal = is_internal;
911*61046927SAndroid Build Coastguard Worker    create_token.type = VK_RMV_RESOURCE_TYPE_GPU_EVENT;
912*61046927SAndroid Build Coastguard Worker    create_token.event.flags = flags;
913*61046927SAndroid Build Coastguard Worker    create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_event);
914*61046927SAndroid Build Coastguard Worker 
915*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
916*61046927SAndroid Build Coastguard Worker    log_resource_bind_locked(device, (uint64_t)_event, event->bo, 0, 8);
917*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
918*61046927SAndroid Build Coastguard Worker 
919*61046927SAndroid Build Coastguard Worker    if (event->map)
920*61046927SAndroid Build Coastguard Worker       vk_rmv_log_cpu_map(&device->vk, event->bo->va, false);
921*61046927SAndroid Build Coastguard Worker }
922*61046927SAndroid Build Coastguard Worker 
923*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_submit(struct radv_device * device,enum amd_ip_type type)924*61046927SAndroid Build Coastguard Worker radv_rmv_log_submit(struct radv_device *device, enum amd_ip_type type)
925*61046927SAndroid Build Coastguard Worker {
926*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled)
927*61046927SAndroid Build Coastguard Worker       return;
928*61046927SAndroid Build Coastguard Worker 
929*61046927SAndroid Build Coastguard Worker    switch (type) {
930*61046927SAndroid Build Coastguard Worker    case AMD_IP_GFX:
931*61046927SAndroid Build Coastguard Worker       vk_rmv_log_misc_token(&device->vk, VK_RMV_MISC_EVENT_TYPE_SUBMIT_GRAPHICS);
932*61046927SAndroid Build Coastguard Worker       break;
933*61046927SAndroid Build Coastguard Worker    case AMD_IP_COMPUTE:
934*61046927SAndroid Build Coastguard Worker       vk_rmv_log_misc_token(&device->vk, VK_RMV_MISC_EVENT_TYPE_SUBMIT_COMPUTE);
935*61046927SAndroid Build Coastguard Worker       break;
936*61046927SAndroid Build Coastguard Worker    case AMD_IP_SDMA:
937*61046927SAndroid Build Coastguard Worker       vk_rmv_log_misc_token(&device->vk, VK_RMV_MISC_EVENT_TYPE_SUBMIT_COPY);
938*61046927SAndroid Build Coastguard Worker       break;
939*61046927SAndroid Build Coastguard Worker    default:
940*61046927SAndroid Build Coastguard Worker       unreachable("invalid ip type");
941*61046927SAndroid Build Coastguard Worker    }
942*61046927SAndroid Build Coastguard Worker }
943*61046927SAndroid Build Coastguard Worker 
944*61046927SAndroid Build Coastguard Worker void
radv_rmv_log_resource_destroy(struct radv_device * device,uint64_t handle)945*61046927SAndroid Build Coastguard Worker radv_rmv_log_resource_destroy(struct radv_device *device, uint64_t handle)
946*61046927SAndroid Build Coastguard Worker {
947*61046927SAndroid Build Coastguard Worker    if (!device->vk.memory_trace_data.is_enabled || handle == 0)
948*61046927SAndroid Build Coastguard Worker       return;
949*61046927SAndroid Build Coastguard Worker 
950*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&device->vk.memory_trace_data.token_mtx);
951*61046927SAndroid Build Coastguard Worker    struct vk_rmv_resource_destroy_token token = {0};
952*61046927SAndroid Build Coastguard Worker    token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, handle);
953*61046927SAndroid Build Coastguard Worker 
954*61046927SAndroid Build Coastguard Worker    vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_DESTROY, &token);
955*61046927SAndroid Build Coastguard Worker    vk_rmv_destroy_resource_id_locked(&device->vk, handle);
956*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&device->vk.memory_trace_data.token_mtx);
957*61046927SAndroid Build Coastguard Worker }
958