xref: /aosp_15_r20/external/mesa3d/src/amd/common/ac_rgp.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2020 Advanced Micro Devices, Inc.
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2020 Valve Corporation
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker  */
7*61046927SAndroid Build Coastguard Worker #include "ac_rgp.h"
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
10*61046927SAndroid Build Coastguard Worker #include "util/os_misc.h"
11*61046927SAndroid Build Coastguard Worker #include "util/os_time.h"
12*61046927SAndroid Build Coastguard Worker #include "util/u_process.h"
13*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #include "ac_spm.h"
16*61046927SAndroid Build Coastguard Worker #include "ac_sqtt.h"
17*61046927SAndroid Build Coastguard Worker #include "ac_gpu_info.h"
18*61046927SAndroid Build Coastguard Worker #include "amd_family.h"
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
21*61046927SAndroid Build Coastguard Worker #include <string.h>
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker #define SQTT_FILE_MAGIC_NUMBER  0x50303042
24*61046927SAndroid Build Coastguard Worker #define SQTT_FILE_VERSION_MAJOR 1
25*61046927SAndroid Build Coastguard Worker #define SQTT_FILE_VERSION_MINOR 5
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #define SQTT_GPU_NAME_MAX_SIZE 256
28*61046927SAndroid Build Coastguard Worker #define SQTT_MAX_NUM_SE        32
29*61046927SAndroid Build Coastguard Worker #define SQTT_SA_PER_SE         2
30*61046927SAndroid Build Coastguard Worker #define SQTT_ACTIVE_PIXEL_PACKER_MASK_DWORDS 4
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker enum sqtt_version
33*61046927SAndroid Build Coastguard Worker {
34*61046927SAndroid Build Coastguard Worker    SQTT_VERSION_NONE = 0x0,
35*61046927SAndroid Build Coastguard Worker    SQTT_VERSION_2_2 = 0x5, /* GFX8 */
36*61046927SAndroid Build Coastguard Worker    SQTT_VERSION_2_3 = 0x6, /* GFX9 */
37*61046927SAndroid Build Coastguard Worker    SQTT_VERSION_2_4 = 0x7, /* GFX10+ */
38*61046927SAndroid Build Coastguard Worker    SQTT_VERSION_3_2 = 0xb, /* GFX11+ */
39*61046927SAndroid Build Coastguard Worker };
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker /**
42*61046927SAndroid Build Coastguard Worker  * SQTT chunks.
43*61046927SAndroid Build Coastguard Worker  */
44*61046927SAndroid Build Coastguard Worker enum sqtt_file_chunk_type
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_ASIC_INFO,
47*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_SQTT_DESC,
48*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_SQTT_DATA,
49*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_API_INFO,
50*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_RESERVED,
51*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_QUEUE_EVENT_TIMINGS,
52*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_CLOCK_CALIBRATION,
53*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_CPU_INFO,
54*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_SPM_DB,
55*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_DATABASE,
56*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_LOADER_EVENTS,
57*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_PSO_CORRELATION,
58*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_INSTRUMENTATION_TABLE,
59*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_TYPE_COUNT
60*61046927SAndroid Build Coastguard Worker };
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_id {
63*61046927SAndroid Build Coastguard Worker    enum sqtt_file_chunk_type type : 8;
64*61046927SAndroid Build Coastguard Worker    int32_t index : 8;
65*61046927SAndroid Build Coastguard Worker    int32_t reserved : 16;
66*61046927SAndroid Build Coastguard Worker };
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_header {
69*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_id chunk_id;
70*61046927SAndroid Build Coastguard Worker    uint16_t minor_version;
71*61046927SAndroid Build Coastguard Worker    uint16_t major_version;
72*61046927SAndroid Build Coastguard Worker    int32_t size_in_bytes;
73*61046927SAndroid Build Coastguard Worker    int32_t padding;
74*61046927SAndroid Build Coastguard Worker };
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker /**
77*61046927SAndroid Build Coastguard Worker  * SQTT file header.
78*61046927SAndroid Build Coastguard Worker  */
79*61046927SAndroid Build Coastguard Worker struct sqtt_file_header_flags {
80*61046927SAndroid Build Coastguard Worker    union {
81*61046927SAndroid Build Coastguard Worker       struct {
82*61046927SAndroid Build Coastguard Worker          uint32_t is_semaphore_queue_timing_etw : 1;
83*61046927SAndroid Build Coastguard Worker          uint32_t no_queue_semaphore_timestamps : 1;
84*61046927SAndroid Build Coastguard Worker          uint32_t reserved : 30;
85*61046927SAndroid Build Coastguard Worker       };
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker       uint32_t value;
88*61046927SAndroid Build Coastguard Worker    };
89*61046927SAndroid Build Coastguard Worker };
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker struct sqtt_file_header {
92*61046927SAndroid Build Coastguard Worker    uint32_t magic_number;
93*61046927SAndroid Build Coastguard Worker    uint32_t version_major;
94*61046927SAndroid Build Coastguard Worker    uint32_t version_minor;
95*61046927SAndroid Build Coastguard Worker    struct sqtt_file_header_flags flags;
96*61046927SAndroid Build Coastguard Worker    int32_t chunk_offset;
97*61046927SAndroid Build Coastguard Worker    int32_t second;
98*61046927SAndroid Build Coastguard Worker    int32_t minute;
99*61046927SAndroid Build Coastguard Worker    int32_t hour;
100*61046927SAndroid Build Coastguard Worker    int32_t day_in_month;
101*61046927SAndroid Build Coastguard Worker    int32_t month;
102*61046927SAndroid Build Coastguard Worker    int32_t year;
103*61046927SAndroid Build Coastguard Worker    int32_t day_in_week;
104*61046927SAndroid Build Coastguard Worker    int32_t day_in_year;
105*61046927SAndroid Build Coastguard Worker    int32_t is_daylight_savings;
106*61046927SAndroid Build Coastguard Worker };
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_header) == 56, "sqtt_file_header doesn't match RGP spec");
109*61046927SAndroid Build Coastguard Worker 
ac_sqtt_fill_header(struct sqtt_file_header * header)110*61046927SAndroid Build Coastguard Worker static void ac_sqtt_fill_header(struct sqtt_file_header *header)
111*61046927SAndroid Build Coastguard Worker {
112*61046927SAndroid Build Coastguard Worker    struct tm *timep, result;
113*61046927SAndroid Build Coastguard Worker    time_t raw_time;
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker    header->magic_number = SQTT_FILE_MAGIC_NUMBER;
116*61046927SAndroid Build Coastguard Worker    header->version_major = SQTT_FILE_VERSION_MAJOR;
117*61046927SAndroid Build Coastguard Worker    header->version_minor = SQTT_FILE_VERSION_MINOR;
118*61046927SAndroid Build Coastguard Worker    header->flags.value = 0;
119*61046927SAndroid Build Coastguard Worker    header->flags.is_semaphore_queue_timing_etw = 1;
120*61046927SAndroid Build Coastguard Worker    header->flags.no_queue_semaphore_timestamps = 0;
121*61046927SAndroid Build Coastguard Worker    header->chunk_offset = sizeof(*header);
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    time(&raw_time);
124*61046927SAndroid Build Coastguard Worker    timep = os_localtime(&raw_time, &result);
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker    header->second = timep->tm_sec;
127*61046927SAndroid Build Coastguard Worker    header->minute = timep->tm_min;
128*61046927SAndroid Build Coastguard Worker    header->hour = timep->tm_hour;
129*61046927SAndroid Build Coastguard Worker    header->day_in_month = timep->tm_mday;
130*61046927SAndroid Build Coastguard Worker    header->month = timep->tm_mon;
131*61046927SAndroid Build Coastguard Worker    header->year = timep->tm_year;
132*61046927SAndroid Build Coastguard Worker    header->day_in_week = timep->tm_wday;
133*61046927SAndroid Build Coastguard Worker    header->day_in_year = timep->tm_yday;
134*61046927SAndroid Build Coastguard Worker    header->is_daylight_savings = timep->tm_isdst;
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker /**
138*61046927SAndroid Build Coastguard Worker  * SQTT CPU info.
139*61046927SAndroid Build Coastguard Worker  */
140*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_cpu_info {
141*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
142*61046927SAndroid Build Coastguard Worker    uint32_t vendor_id[4];
143*61046927SAndroid Build Coastguard Worker    uint32_t processor_brand[12];
144*61046927SAndroid Build Coastguard Worker    uint32_t reserved[2];
145*61046927SAndroid Build Coastguard Worker    uint64_t cpu_timestamp_freq;
146*61046927SAndroid Build Coastguard Worker    uint32_t clock_speed;
147*61046927SAndroid Build Coastguard Worker    uint32_t num_logical_cores;
148*61046927SAndroid Build Coastguard Worker    uint32_t num_physical_cores;
149*61046927SAndroid Build Coastguard Worker    uint32_t system_ram_size;
150*61046927SAndroid Build Coastguard Worker };
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_cpu_info) == 112,
153*61046927SAndroid Build Coastguard Worker               "sqtt_file_chunk_cpu_info doesn't match RGP spec");
154*61046927SAndroid Build Coastguard Worker 
ac_sqtt_fill_cpu_info(struct sqtt_file_chunk_cpu_info * chunk)155*61046927SAndroid Build Coastguard Worker static void ac_sqtt_fill_cpu_info(struct sqtt_file_chunk_cpu_info *chunk)
156*61046927SAndroid Build Coastguard Worker {
157*61046927SAndroid Build Coastguard Worker    uint32_t cpu_clock_speed_total = 0;
158*61046927SAndroid Build Coastguard Worker    uint64_t system_ram_size = 0;
159*61046927SAndroid Build Coastguard Worker    char line[1024];
160*61046927SAndroid Build Coastguard Worker    FILE *f;
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_CPU_INFO;
163*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
164*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
165*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 0;
166*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = sizeof(*chunk);
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker    chunk->cpu_timestamp_freq = 1000000000; /* tick set to 1ns */
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker    strncpy((char *)chunk->vendor_id, "Unknown", sizeof(chunk->vendor_id));
171*61046927SAndroid Build Coastguard Worker    strncpy((char *)chunk->processor_brand, "Unknown", sizeof(chunk->processor_brand));
172*61046927SAndroid Build Coastguard Worker    chunk->clock_speed = 0;
173*61046927SAndroid Build Coastguard Worker    chunk->num_logical_cores = 0;
174*61046927SAndroid Build Coastguard Worker    chunk->num_physical_cores = 0;
175*61046927SAndroid Build Coastguard Worker    chunk->system_ram_size = 0;
176*61046927SAndroid Build Coastguard Worker    if (os_get_total_physical_memory(&system_ram_size))
177*61046927SAndroid Build Coastguard Worker       chunk->system_ram_size = system_ram_size / (1024 * 1024);
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker    /* Parse cpuinfo to get more detailed information. */
180*61046927SAndroid Build Coastguard Worker    f = fopen("/proc/cpuinfo", "r");
181*61046927SAndroid Build Coastguard Worker    if (!f)
182*61046927SAndroid Build Coastguard Worker       return;
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker    while (fgets(line, sizeof(line), f)) {
185*61046927SAndroid Build Coastguard Worker       char *str;
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker       /* Parse vendor name. */
188*61046927SAndroid Build Coastguard Worker       str = strstr(line, "vendor_id");
189*61046927SAndroid Build Coastguard Worker       if (str) {
190*61046927SAndroid Build Coastguard Worker          char *ptr = (char *)chunk->vendor_id;
191*61046927SAndroid Build Coastguard Worker          char *v = strtok(str, ":");
192*61046927SAndroid Build Coastguard Worker          v = strtok(NULL, ":");
193*61046927SAndroid Build Coastguard Worker          strncpy(ptr, v + 1, sizeof(chunk->vendor_id) - 1);
194*61046927SAndroid Build Coastguard Worker          ptr[sizeof(chunk->vendor_id) - 1] = '\0';
195*61046927SAndroid Build Coastguard Worker       }
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker       /* Parse processor name. */
198*61046927SAndroid Build Coastguard Worker       str = strstr(line, "model name");
199*61046927SAndroid Build Coastguard Worker       if (str) {
200*61046927SAndroid Build Coastguard Worker          char *ptr = (char *)chunk->processor_brand;
201*61046927SAndroid Build Coastguard Worker          char *v = strtok(str, ":");
202*61046927SAndroid Build Coastguard Worker          v = strtok(NULL, ":");
203*61046927SAndroid Build Coastguard Worker          strncpy(ptr, v + 1, sizeof(chunk->processor_brand) - 1);
204*61046927SAndroid Build Coastguard Worker          ptr[sizeof(chunk->processor_brand) - 1] = '\0';
205*61046927SAndroid Build Coastguard Worker       }
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker       /* Parse the current CPU clock speed for each cores. */
208*61046927SAndroid Build Coastguard Worker       str = strstr(line, "cpu MHz");
209*61046927SAndroid Build Coastguard Worker       if (str) {
210*61046927SAndroid Build Coastguard Worker          uint32_t v = 0;
211*61046927SAndroid Build Coastguard Worker          if (sscanf(str, "cpu MHz : %d", &v) == 1)
212*61046927SAndroid Build Coastguard Worker             cpu_clock_speed_total += v;
213*61046927SAndroid Build Coastguard Worker       }
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker       /* Parse the number of logical cores. */
216*61046927SAndroid Build Coastguard Worker       str = strstr(line, "siblings");
217*61046927SAndroid Build Coastguard Worker       if (str) {
218*61046927SAndroid Build Coastguard Worker          uint32_t v = 0;
219*61046927SAndroid Build Coastguard Worker          if (sscanf(str, "siblings : %d", &v) == 1)
220*61046927SAndroid Build Coastguard Worker             chunk->num_logical_cores = v;
221*61046927SAndroid Build Coastguard Worker       }
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker       /* Parse the number of physical cores. */
224*61046927SAndroid Build Coastguard Worker       str = strstr(line, "cpu cores");
225*61046927SAndroid Build Coastguard Worker       if (str) {
226*61046927SAndroid Build Coastguard Worker          uint32_t v = 0;
227*61046927SAndroid Build Coastguard Worker          if (sscanf(str, "cpu cores : %d", &v) == 1)
228*61046927SAndroid Build Coastguard Worker             chunk->num_physical_cores = v;
229*61046927SAndroid Build Coastguard Worker       }
230*61046927SAndroid Build Coastguard Worker    }
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    if (chunk->num_logical_cores)
233*61046927SAndroid Build Coastguard Worker       chunk->clock_speed = cpu_clock_speed_total / chunk->num_logical_cores;
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker    fclose(f);
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker /**
239*61046927SAndroid Build Coastguard Worker  * SQTT ASIC info.
240*61046927SAndroid Build Coastguard Worker  */
241*61046927SAndroid Build Coastguard Worker enum sqtt_file_chunk_asic_info_flags
242*61046927SAndroid Build Coastguard Worker {
243*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_ASIC_INFO_FLAG_SC_PACKER_NUMBERING = (1 << 0),
244*61046927SAndroid Build Coastguard Worker    SQTT_FILE_CHUNK_ASIC_INFO_FLAG_PS1_EVENT_TOKENS_ENABLED = (1 << 1)
245*61046927SAndroid Build Coastguard Worker };
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker enum sqtt_gpu_type
248*61046927SAndroid Build Coastguard Worker {
249*61046927SAndroid Build Coastguard Worker    SQTT_GPU_TYPE_UNKNOWN = 0x0,
250*61046927SAndroid Build Coastguard Worker    SQTT_GPU_TYPE_INTEGRATED = 0x1,
251*61046927SAndroid Build Coastguard Worker    SQTT_GPU_TYPE_DISCRETE = 0x2,
252*61046927SAndroid Build Coastguard Worker    SQTT_GPU_TYPE_VIRTUAL = 0x3
253*61046927SAndroid Build Coastguard Worker };
254*61046927SAndroid Build Coastguard Worker 
255*61046927SAndroid Build Coastguard Worker enum sqtt_gfxip_level
256*61046927SAndroid Build Coastguard Worker {
257*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_NONE = 0x0,
258*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_6 = 0x1,
259*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_7 = 0x2,
260*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_8 = 0x3,
261*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_8_1 = 0x4,
262*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_9 = 0x5,
263*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_10_1 = 0x7,
264*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_10_3 = 0x9,
265*61046927SAndroid Build Coastguard Worker    SQTT_GFXIP_LEVEL_GFXIP_11_0 = 0xc,
266*61046927SAndroid Build Coastguard Worker };
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker enum sqtt_memory_type
269*61046927SAndroid Build Coastguard Worker {
270*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_UNKNOWN = 0x0,
271*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_DDR = 0x1,
272*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_DDR2 = 0x2,
273*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_DDR3 = 0x3,
274*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_DDR4 = 0x4,
275*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_DDR5 = 0x5,
276*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_GDDR3 = 0x10,
277*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_GDDR4 = 0x11,
278*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_GDDR5 = 0x12,
279*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_GDDR6 = 0x13,
280*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_HBM = 0x20,
281*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_HBM2 = 0x21,
282*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_HBM3 = 0x22,
283*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_LPDDR4 = 0x30,
284*61046927SAndroid Build Coastguard Worker    SQTT_MEMORY_TYPE_LPDDR5 = 0x31,
285*61046927SAndroid Build Coastguard Worker };
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_asic_info {
288*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
289*61046927SAndroid Build Coastguard Worker    uint64_t flags;
290*61046927SAndroid Build Coastguard Worker    uint64_t trace_shader_core_clock;
291*61046927SAndroid Build Coastguard Worker    uint64_t trace_memory_clock;
292*61046927SAndroid Build Coastguard Worker    int32_t device_id;
293*61046927SAndroid Build Coastguard Worker    int32_t device_revision_id;
294*61046927SAndroid Build Coastguard Worker    int32_t vgprs_per_simd;
295*61046927SAndroid Build Coastguard Worker    int32_t sgprs_per_simd;
296*61046927SAndroid Build Coastguard Worker    int32_t shader_engines;
297*61046927SAndroid Build Coastguard Worker    int32_t compute_unit_per_shader_engine;
298*61046927SAndroid Build Coastguard Worker    int32_t simd_per_compute_unit;
299*61046927SAndroid Build Coastguard Worker    int32_t wavefronts_per_simd;
300*61046927SAndroid Build Coastguard Worker    int32_t minimum_vgpr_alloc;
301*61046927SAndroid Build Coastguard Worker    int32_t vgpr_alloc_granularity;
302*61046927SAndroid Build Coastguard Worker    int32_t minimum_sgpr_alloc;
303*61046927SAndroid Build Coastguard Worker    int32_t sgpr_alloc_granularity;
304*61046927SAndroid Build Coastguard Worker    int32_t hardware_contexts;
305*61046927SAndroid Build Coastguard Worker    enum sqtt_gpu_type gpu_type;
306*61046927SAndroid Build Coastguard Worker    enum sqtt_gfxip_level gfxip_level;
307*61046927SAndroid Build Coastguard Worker    int32_t gpu_index;
308*61046927SAndroid Build Coastguard Worker    int32_t gds_size;
309*61046927SAndroid Build Coastguard Worker    int32_t gds_per_shader_engine;
310*61046927SAndroid Build Coastguard Worker    int32_t ce_ram_size;
311*61046927SAndroid Build Coastguard Worker    int32_t ce_ram_size_graphics;
312*61046927SAndroid Build Coastguard Worker    int32_t ce_ram_size_compute;
313*61046927SAndroid Build Coastguard Worker    int32_t max_number_of_dedicated_cus;
314*61046927SAndroid Build Coastguard Worker    int64_t vram_size;
315*61046927SAndroid Build Coastguard Worker    int32_t vram_bus_width;
316*61046927SAndroid Build Coastguard Worker    int32_t l2_cache_size;
317*61046927SAndroid Build Coastguard Worker    int32_t l1_cache_size;
318*61046927SAndroid Build Coastguard Worker    int32_t lds_size;
319*61046927SAndroid Build Coastguard Worker    char gpu_name[SQTT_GPU_NAME_MAX_SIZE];
320*61046927SAndroid Build Coastguard Worker    float alu_per_clock;
321*61046927SAndroid Build Coastguard Worker    float texture_per_clock;
322*61046927SAndroid Build Coastguard Worker    float prims_per_clock;
323*61046927SAndroid Build Coastguard Worker    float pixels_per_clock;
324*61046927SAndroid Build Coastguard Worker    uint64_t gpu_timestamp_frequency;
325*61046927SAndroid Build Coastguard Worker    uint64_t max_shader_core_clock;
326*61046927SAndroid Build Coastguard Worker    uint64_t max_memory_clock;
327*61046927SAndroid Build Coastguard Worker    uint32_t memory_ops_per_clock;
328*61046927SAndroid Build Coastguard Worker    enum sqtt_memory_type memory_chip_type;
329*61046927SAndroid Build Coastguard Worker    uint32_t lds_granularity;
330*61046927SAndroid Build Coastguard Worker    uint16_t cu_mask[SQTT_MAX_NUM_SE][SQTT_SA_PER_SE];
331*61046927SAndroid Build Coastguard Worker    char reserved1[128];
332*61046927SAndroid Build Coastguard Worker    uint32_t active_pixel_packer_mask[SQTT_ACTIVE_PIXEL_PACKER_MASK_DWORDS];
333*61046927SAndroid Build Coastguard Worker    char reserved2[16];
334*61046927SAndroid Build Coastguard Worker    uint32_t gl1_cache_size;
335*61046927SAndroid Build Coastguard Worker    uint32_t instruction_cache_size;
336*61046927SAndroid Build Coastguard Worker    uint32_t scalar_cache_size;
337*61046927SAndroid Build Coastguard Worker    uint32_t mall_cache_size;
338*61046927SAndroid Build Coastguard Worker    char padding[4];
339*61046927SAndroid Build Coastguard Worker };
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_asic_info) == 768,
342*61046927SAndroid Build Coastguard Worker               "sqtt_file_chunk_asic_info doesn't match RGP spec");
343*61046927SAndroid Build Coastguard Worker 
ac_gfx_level_to_sqtt_gfxip_level(enum amd_gfx_level gfx_level)344*61046927SAndroid Build Coastguard Worker static enum sqtt_gfxip_level ac_gfx_level_to_sqtt_gfxip_level(enum amd_gfx_level gfx_level)
345*61046927SAndroid Build Coastguard Worker {
346*61046927SAndroid Build Coastguard Worker    switch (gfx_level) {
347*61046927SAndroid Build Coastguard Worker    case GFX8:
348*61046927SAndroid Build Coastguard Worker       return SQTT_GFXIP_LEVEL_GFXIP_8;
349*61046927SAndroid Build Coastguard Worker    case GFX9:
350*61046927SAndroid Build Coastguard Worker       return SQTT_GFXIP_LEVEL_GFXIP_9;
351*61046927SAndroid Build Coastguard Worker    case GFX10:
352*61046927SAndroid Build Coastguard Worker       return SQTT_GFXIP_LEVEL_GFXIP_10_1;
353*61046927SAndroid Build Coastguard Worker    case GFX10_3:
354*61046927SAndroid Build Coastguard Worker       return SQTT_GFXIP_LEVEL_GFXIP_10_3;
355*61046927SAndroid Build Coastguard Worker    case GFX11:
356*61046927SAndroid Build Coastguard Worker    case GFX11_5:
357*61046927SAndroid Build Coastguard Worker       return SQTT_GFXIP_LEVEL_GFXIP_11_0;
358*61046927SAndroid Build Coastguard Worker    default:
359*61046927SAndroid Build Coastguard Worker       unreachable("Invalid gfx level");
360*61046927SAndroid Build Coastguard Worker    }
361*61046927SAndroid Build Coastguard Worker }
362*61046927SAndroid Build Coastguard Worker 
ac_vram_type_to_sqtt_memory_type(uint32_t vram_type)363*61046927SAndroid Build Coastguard Worker static enum sqtt_memory_type ac_vram_type_to_sqtt_memory_type(uint32_t vram_type)
364*61046927SAndroid Build Coastguard Worker {
365*61046927SAndroid Build Coastguard Worker    switch (vram_type) {
366*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_UNKNOWN:
367*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_UNKNOWN;
368*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR2:
369*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_DDR2;
370*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR3:
371*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_DDR3;
372*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR4:
373*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_DDR4;
374*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_DDR5:
375*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_DDR5;
376*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_GDDR3:
377*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_GDDR3;
378*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_GDDR4:
379*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_GDDR4;
380*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_GDDR5:
381*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_GDDR5;
382*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_GDDR6:
383*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_GDDR6;
384*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_HBM:
385*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_HBM;
386*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_LPDDR4:
387*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_LPDDR4;
388*61046927SAndroid Build Coastguard Worker    case AMD_VRAM_TYPE_LPDDR5:
389*61046927SAndroid Build Coastguard Worker       return SQTT_MEMORY_TYPE_LPDDR5;
390*61046927SAndroid Build Coastguard Worker    default:
391*61046927SAndroid Build Coastguard Worker       unreachable("Invalid vram type");
392*61046927SAndroid Build Coastguard Worker    }
393*61046927SAndroid Build Coastguard Worker }
394*61046927SAndroid Build Coastguard Worker 
ac_sqtt_fill_asic_info(const struct radeon_info * rad_info,struct sqtt_file_chunk_asic_info * chunk)395*61046927SAndroid Build Coastguard Worker static void ac_sqtt_fill_asic_info(const struct radeon_info *rad_info,
396*61046927SAndroid Build Coastguard Worker                                    struct sqtt_file_chunk_asic_info *chunk)
397*61046927SAndroid Build Coastguard Worker {
398*61046927SAndroid Build Coastguard Worker    bool has_wave32 = rad_info->gfx_level >= GFX10;
399*61046927SAndroid Build Coastguard Worker 
400*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_ASIC_INFO;
401*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
402*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
403*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 5;
404*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = sizeof(*chunk);
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker    chunk->flags = 0;
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker    /* All chips older than GFX9 are affected by the "SPI not
409*61046927SAndroid Build Coastguard Worker     * differentiating pkr_id for newwave commands" bug.
410*61046927SAndroid Build Coastguard Worker     */
411*61046927SAndroid Build Coastguard Worker    if (rad_info->gfx_level < GFX9)
412*61046927SAndroid Build Coastguard Worker       chunk->flags |= SQTT_FILE_CHUNK_ASIC_INFO_FLAG_SC_PACKER_NUMBERING;
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker    /* Only GFX9+ support PS1 events. */
415*61046927SAndroid Build Coastguard Worker    if (rad_info->gfx_level >= GFX9)
416*61046927SAndroid Build Coastguard Worker       chunk->flags |= SQTT_FILE_CHUNK_ASIC_INFO_FLAG_PS1_EVENT_TOKENS_ENABLED;
417*61046927SAndroid Build Coastguard Worker 
418*61046927SAndroid Build Coastguard Worker    chunk->trace_shader_core_clock = rad_info->max_gpu_freq_mhz * 1000000ull;
419*61046927SAndroid Build Coastguard Worker    chunk->trace_memory_clock = rad_info->memory_freq_mhz * 1000000ull;
420*61046927SAndroid Build Coastguard Worker 
421*61046927SAndroid Build Coastguard Worker    /* RGP gets very confused if these clocks are 0. The numbers here are for profile_peak on
422*61046927SAndroid Build Coastguard Worker     * VGH since that is the chips where we've seen the need for this workaround. */
423*61046927SAndroid Build Coastguard Worker    if (!chunk->trace_shader_core_clock)
424*61046927SAndroid Build Coastguard Worker       chunk->trace_shader_core_clock = 1300000000;
425*61046927SAndroid Build Coastguard Worker    if (!chunk->trace_memory_clock)
426*61046927SAndroid Build Coastguard Worker       chunk->trace_memory_clock = 687000000;
427*61046927SAndroid Build Coastguard Worker 
428*61046927SAndroid Build Coastguard Worker    chunk->device_id = rad_info->pci_id;
429*61046927SAndroid Build Coastguard Worker    chunk->device_revision_id = rad_info->pci_rev_id;
430*61046927SAndroid Build Coastguard Worker    chunk->vgprs_per_simd = rad_info->num_physical_wave64_vgprs_per_simd * (has_wave32 ? 2 : 1);
431*61046927SAndroid Build Coastguard Worker    chunk->sgprs_per_simd = rad_info->num_physical_sgprs_per_simd;
432*61046927SAndroid Build Coastguard Worker    chunk->shader_engines = rad_info->max_se;
433*61046927SAndroid Build Coastguard Worker    chunk->compute_unit_per_shader_engine = rad_info->min_good_cu_per_sa * rad_info->max_sa_per_se;
434*61046927SAndroid Build Coastguard Worker    chunk->simd_per_compute_unit = rad_info->num_simd_per_compute_unit;
435*61046927SAndroid Build Coastguard Worker    chunk->wavefronts_per_simd = rad_info->max_waves_per_simd;
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker    chunk->minimum_vgpr_alloc = rad_info->min_wave64_vgpr_alloc;
438*61046927SAndroid Build Coastguard Worker    chunk->vgpr_alloc_granularity = rad_info->wave64_vgpr_alloc_granularity * (has_wave32 ? 2 : 1);
439*61046927SAndroid Build Coastguard Worker    chunk->minimum_sgpr_alloc = rad_info->min_sgpr_alloc;
440*61046927SAndroid Build Coastguard Worker    chunk->sgpr_alloc_granularity = rad_info->sgpr_alloc_granularity;
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker    chunk->hardware_contexts = 8;
443*61046927SAndroid Build Coastguard Worker    chunk->gpu_type =
444*61046927SAndroid Build Coastguard Worker       rad_info->has_dedicated_vram ? SQTT_GPU_TYPE_DISCRETE : SQTT_GPU_TYPE_INTEGRATED;
445*61046927SAndroid Build Coastguard Worker    chunk->gfxip_level = ac_gfx_level_to_sqtt_gfxip_level(rad_info->gfx_level);
446*61046927SAndroid Build Coastguard Worker    chunk->gpu_index = 0;
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker    chunk->max_number_of_dedicated_cus = 0;
449*61046927SAndroid Build Coastguard Worker    chunk->ce_ram_size = 0;
450*61046927SAndroid Build Coastguard Worker    chunk->ce_ram_size_graphics = 0;
451*61046927SAndroid Build Coastguard Worker    chunk->ce_ram_size_compute = 0;
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    chunk->vram_bus_width = rad_info->memory_bus_width;
454*61046927SAndroid Build Coastguard Worker    chunk->vram_size = (uint64_t)rad_info->vram_size_kb * 1024;
455*61046927SAndroid Build Coastguard Worker    chunk->l2_cache_size = rad_info->l2_cache_size;
456*61046927SAndroid Build Coastguard Worker    chunk->l1_cache_size = rad_info->tcp_cache_size;
457*61046927SAndroid Build Coastguard Worker    chunk->lds_size = rad_info->lds_size_per_workgroup;
458*61046927SAndroid Build Coastguard Worker    if (rad_info->gfx_level >= GFX10) {
459*61046927SAndroid Build Coastguard Worker       /* RGP expects the LDS size in CU mode. */
460*61046927SAndroid Build Coastguard Worker       chunk->lds_size /= 2;
461*61046927SAndroid Build Coastguard Worker    }
462*61046927SAndroid Build Coastguard Worker 
463*61046927SAndroid Build Coastguard Worker    strncpy(chunk->gpu_name, rad_info->name, SQTT_GPU_NAME_MAX_SIZE - 1);
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker    chunk->alu_per_clock = 0.0;
466*61046927SAndroid Build Coastguard Worker    chunk->texture_per_clock = 0.0;
467*61046927SAndroid Build Coastguard Worker    chunk->prims_per_clock = rad_info->max_se;
468*61046927SAndroid Build Coastguard Worker    if (rad_info->gfx_level == GFX10)
469*61046927SAndroid Build Coastguard Worker       chunk->prims_per_clock *= 2;
470*61046927SAndroid Build Coastguard Worker    chunk->pixels_per_clock = 0.0;
471*61046927SAndroid Build Coastguard Worker 
472*61046927SAndroid Build Coastguard Worker    chunk->gpu_timestamp_frequency = rad_info->clock_crystal_freq * 1000;
473*61046927SAndroid Build Coastguard Worker    chunk->max_shader_core_clock = rad_info->max_gpu_freq_mhz * 1000000;
474*61046927SAndroid Build Coastguard Worker    chunk->max_memory_clock = rad_info->memory_freq_mhz * 1000000;
475*61046927SAndroid Build Coastguard Worker    chunk->memory_ops_per_clock = ac_memory_ops_per_clock(rad_info->vram_type);
476*61046927SAndroid Build Coastguard Worker    chunk->memory_chip_type = ac_vram_type_to_sqtt_memory_type(rad_info->vram_type);
477*61046927SAndroid Build Coastguard Worker    chunk->lds_granularity = rad_info->lds_encode_granularity;
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker    for (unsigned se = 0; se < AMD_MAX_SE; se++) {
480*61046927SAndroid Build Coastguard Worker       for (unsigned sa = 0; sa < AMD_MAX_SA_PER_SE; sa++) {
481*61046927SAndroid Build Coastguard Worker          chunk->cu_mask[se][sa] = rad_info->cu_mask[se][sa];
482*61046927SAndroid Build Coastguard Worker       }
483*61046927SAndroid Build Coastguard Worker    }
484*61046927SAndroid Build Coastguard Worker 
485*61046927SAndroid Build Coastguard Worker    chunk->gl1_cache_size = rad_info->l1_cache_size;
486*61046927SAndroid Build Coastguard Worker    chunk->instruction_cache_size = rad_info->sqc_inst_cache_size;
487*61046927SAndroid Build Coastguard Worker    chunk->scalar_cache_size = rad_info->sqc_scalar_cache_size;
488*61046927SAndroid Build Coastguard Worker    chunk->mall_cache_size = rad_info->l3_cache_size_mb * 1024 * 1024;
489*61046927SAndroid Build Coastguard Worker }
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker /**
492*61046927SAndroid Build Coastguard Worker  * SQTT API info.
493*61046927SAndroid Build Coastguard Worker  */
494*61046927SAndroid Build Coastguard Worker enum sqtt_api_type
495*61046927SAndroid Build Coastguard Worker {
496*61046927SAndroid Build Coastguard Worker    SQTT_API_TYPE_DIRECTX_12,
497*61046927SAndroid Build Coastguard Worker    SQTT_API_TYPE_VULKAN,
498*61046927SAndroid Build Coastguard Worker    SQTT_API_TYPE_GENERIC,
499*61046927SAndroid Build Coastguard Worker    SQTT_API_TYPE_OPENCL
500*61046927SAndroid Build Coastguard Worker };
501*61046927SAndroid Build Coastguard Worker 
502*61046927SAndroid Build Coastguard Worker enum sqtt_instruction_trace_mode
503*61046927SAndroid Build Coastguard Worker {
504*61046927SAndroid Build Coastguard Worker    SQTT_INSTRUCTION_TRACE_DISABLED = 0x0,
505*61046927SAndroid Build Coastguard Worker    SQTT_INSTRUCTION_TRACE_FULL_FRAME = 0x1,
506*61046927SAndroid Build Coastguard Worker    SQTT_INSTRUCTION_TRACE_API_PSO = 0x2,
507*61046927SAndroid Build Coastguard Worker };
508*61046927SAndroid Build Coastguard Worker 
509*61046927SAndroid Build Coastguard Worker enum sqtt_profiling_mode
510*61046927SAndroid Build Coastguard Worker {
511*61046927SAndroid Build Coastguard Worker    SQTT_PROFILING_MODE_PRESENT = 0x0,
512*61046927SAndroid Build Coastguard Worker    SQTT_PROFILING_MODE_USER_MARKERS = 0x1,
513*61046927SAndroid Build Coastguard Worker    SQTT_PROFILING_MODE_INDEX = 0x2,
514*61046927SAndroid Build Coastguard Worker    SQTT_PROFILING_MODE_TAG = 0x3,
515*61046927SAndroid Build Coastguard Worker };
516*61046927SAndroid Build Coastguard Worker 
517*61046927SAndroid Build Coastguard Worker union sqtt_profiling_mode_data {
518*61046927SAndroid Build Coastguard Worker    struct {
519*61046927SAndroid Build Coastguard Worker       char start[256];
520*61046927SAndroid Build Coastguard Worker       char end[256];
521*61046927SAndroid Build Coastguard Worker    } user_marker_profiling_data;
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker    struct {
524*61046927SAndroid Build Coastguard Worker       uint32_t start;
525*61046927SAndroid Build Coastguard Worker       uint32_t end;
526*61046927SAndroid Build Coastguard Worker    } index_profiling_data;
527*61046927SAndroid Build Coastguard Worker 
528*61046927SAndroid Build Coastguard Worker    struct {
529*61046927SAndroid Build Coastguard Worker       uint32_t begin_hi;
530*61046927SAndroid Build Coastguard Worker       uint32_t begin_lo;
531*61046927SAndroid Build Coastguard Worker       uint32_t end_hi;
532*61046927SAndroid Build Coastguard Worker       uint32_t end_lo;
533*61046927SAndroid Build Coastguard Worker    } tag_profiling_data;
534*61046927SAndroid Build Coastguard Worker };
535*61046927SAndroid Build Coastguard Worker 
536*61046927SAndroid Build Coastguard Worker union sqtt_instruction_trace_data {
537*61046927SAndroid Build Coastguard Worker    struct {
538*61046927SAndroid Build Coastguard Worker       uint64_t api_pso_filter;
539*61046927SAndroid Build Coastguard Worker    } api_pso_data;
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker    struct {
542*61046927SAndroid Build Coastguard Worker       uint32_t mask;
543*61046927SAndroid Build Coastguard Worker    } shader_engine_filter;
544*61046927SAndroid Build Coastguard Worker };
545*61046927SAndroid Build Coastguard Worker 
546*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_api_info {
547*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
548*61046927SAndroid Build Coastguard Worker    enum sqtt_api_type api_type;
549*61046927SAndroid Build Coastguard Worker    uint16_t major_version;
550*61046927SAndroid Build Coastguard Worker    uint16_t minor_version;
551*61046927SAndroid Build Coastguard Worker    enum sqtt_profiling_mode profiling_mode;
552*61046927SAndroid Build Coastguard Worker    uint32_t reserved;
553*61046927SAndroid Build Coastguard Worker    union sqtt_profiling_mode_data profiling_mode_data;
554*61046927SAndroid Build Coastguard Worker    enum sqtt_instruction_trace_mode instruction_trace_mode;
555*61046927SAndroid Build Coastguard Worker    uint32_t reserved2;
556*61046927SAndroid Build Coastguard Worker    union sqtt_instruction_trace_data instruction_trace_data;
557*61046927SAndroid Build Coastguard Worker };
558*61046927SAndroid Build Coastguard Worker 
559*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_api_info) == 560,
560*61046927SAndroid Build Coastguard Worker               "sqtt_file_chunk_api_info doesn't match RGP spec");
561*61046927SAndroid Build Coastguard Worker 
ac_sqtt_fill_api_info(struct sqtt_file_chunk_api_info * chunk)562*61046927SAndroid Build Coastguard Worker static void ac_sqtt_fill_api_info(struct sqtt_file_chunk_api_info *chunk)
563*61046927SAndroid Build Coastguard Worker {
564*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_API_INFO;
565*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
566*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
567*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 2;
568*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = sizeof(*chunk);
569*61046927SAndroid Build Coastguard Worker 
570*61046927SAndroid Build Coastguard Worker    chunk->api_type = SQTT_API_TYPE_VULKAN;
571*61046927SAndroid Build Coastguard Worker    chunk->major_version = 0;
572*61046927SAndroid Build Coastguard Worker    chunk->minor_version = 0;
573*61046927SAndroid Build Coastguard Worker    chunk->profiling_mode = SQTT_PROFILING_MODE_PRESENT;
574*61046927SAndroid Build Coastguard Worker    chunk->instruction_trace_mode = SQTT_INSTRUCTION_TRACE_DISABLED;
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker 
577*61046927SAndroid Build Coastguard Worker struct sqtt_code_object_database_record {
578*61046927SAndroid Build Coastguard Worker    uint32_t size;
579*61046927SAndroid Build Coastguard Worker };
580*61046927SAndroid Build Coastguard Worker 
581*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_code_object_database {
582*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
583*61046927SAndroid Build Coastguard Worker    uint32_t offset;
584*61046927SAndroid Build Coastguard Worker    uint32_t flags;
585*61046927SAndroid Build Coastguard Worker    uint32_t size;
586*61046927SAndroid Build Coastguard Worker    uint32_t record_count;
587*61046927SAndroid Build Coastguard Worker };
588*61046927SAndroid Build Coastguard Worker 
589*61046927SAndroid Build Coastguard Worker static void
ac_sqtt_fill_code_object(const struct rgp_code_object * rgp_code_object,struct sqtt_file_chunk_code_object_database * chunk,size_t file_offset,uint32_t chunk_size)590*61046927SAndroid Build Coastguard Worker ac_sqtt_fill_code_object(const struct rgp_code_object *rgp_code_object,
591*61046927SAndroid Build Coastguard Worker                          struct sqtt_file_chunk_code_object_database *chunk, size_t file_offset,
592*61046927SAndroid Build Coastguard Worker                          uint32_t chunk_size)
593*61046927SAndroid Build Coastguard Worker {
594*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_DATABASE;
595*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
596*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
597*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 0;
598*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = chunk_size;
599*61046927SAndroid Build Coastguard Worker    chunk->offset = file_offset;
600*61046927SAndroid Build Coastguard Worker    chunk->flags = 0;
601*61046927SAndroid Build Coastguard Worker    chunk->size = chunk_size;
602*61046927SAndroid Build Coastguard Worker    chunk->record_count = rgp_code_object->record_count;
603*61046927SAndroid Build Coastguard Worker }
604*61046927SAndroid Build Coastguard Worker 
605*61046927SAndroid Build Coastguard Worker struct sqtt_code_object_loader_events_record {
606*61046927SAndroid Build Coastguard Worker    uint32_t loader_event_type;
607*61046927SAndroid Build Coastguard Worker    uint32_t reserved;
608*61046927SAndroid Build Coastguard Worker    uint64_t base_address;
609*61046927SAndroid Build Coastguard Worker    uint64_t code_object_hash[2];
610*61046927SAndroid Build Coastguard Worker    uint64_t time_stamp;
611*61046927SAndroid Build Coastguard Worker };
612*61046927SAndroid Build Coastguard Worker 
613*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_code_object_loader_events {
614*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
615*61046927SAndroid Build Coastguard Worker    uint32_t offset;
616*61046927SAndroid Build Coastguard Worker    uint32_t flags;
617*61046927SAndroid Build Coastguard Worker    uint32_t record_size;
618*61046927SAndroid Build Coastguard Worker    uint32_t record_count;
619*61046927SAndroid Build Coastguard Worker };
620*61046927SAndroid Build Coastguard Worker 
621*61046927SAndroid Build Coastguard Worker static void
ac_sqtt_fill_loader_events(const struct rgp_loader_events * rgp_loader_events,struct sqtt_file_chunk_code_object_loader_events * chunk,size_t file_offset)622*61046927SAndroid Build Coastguard Worker ac_sqtt_fill_loader_events(const struct rgp_loader_events *rgp_loader_events,
623*61046927SAndroid Build Coastguard Worker                            struct sqtt_file_chunk_code_object_loader_events *chunk,
624*61046927SAndroid Build Coastguard Worker                            size_t file_offset)
625*61046927SAndroid Build Coastguard Worker {
626*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type =
627*61046927SAndroid Build Coastguard Worker                                SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_LOADER_EVENTS;
628*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
629*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 1;
630*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 0;
631*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = (rgp_loader_events->record_count *
632*61046927SAndroid Build Coastguard Worker                                  sizeof(struct sqtt_code_object_loader_events_record)) +
633*61046927SAndroid Build Coastguard Worker                                  sizeof(*chunk);
634*61046927SAndroid Build Coastguard Worker    chunk->offset = file_offset;
635*61046927SAndroid Build Coastguard Worker    chunk->flags = 0;
636*61046927SAndroid Build Coastguard Worker    chunk->record_size = sizeof(struct sqtt_code_object_loader_events_record);
637*61046927SAndroid Build Coastguard Worker    chunk->record_count = rgp_loader_events->record_count;
638*61046927SAndroid Build Coastguard Worker }
639*61046927SAndroid Build Coastguard Worker struct sqtt_pso_correlation_record {
640*61046927SAndroid Build Coastguard Worker    uint64_t api_pso_hash;
641*61046927SAndroid Build Coastguard Worker    uint64_t pipeline_hash[2];
642*61046927SAndroid Build Coastguard Worker    char api_level_obj_name[64];
643*61046927SAndroid Build Coastguard Worker };
644*61046927SAndroid Build Coastguard Worker 
645*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_pso_correlation {
646*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
647*61046927SAndroid Build Coastguard Worker    uint32_t offset;
648*61046927SAndroid Build Coastguard Worker    uint32_t flags;
649*61046927SAndroid Build Coastguard Worker    uint32_t record_size;
650*61046927SAndroid Build Coastguard Worker    uint32_t record_count;
651*61046927SAndroid Build Coastguard Worker };
652*61046927SAndroid Build Coastguard Worker 
653*61046927SAndroid Build Coastguard Worker static void
ac_sqtt_fill_pso_correlation(const struct rgp_pso_correlation * rgp_pso_correlation,struct sqtt_file_chunk_pso_correlation * chunk,size_t file_offset)654*61046927SAndroid Build Coastguard Worker ac_sqtt_fill_pso_correlation(const struct rgp_pso_correlation *rgp_pso_correlation,
655*61046927SAndroid Build Coastguard Worker                              struct sqtt_file_chunk_pso_correlation *chunk, size_t file_offset)
656*61046927SAndroid Build Coastguard Worker {
657*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_PSO_CORRELATION;
658*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
659*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
660*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 0;
661*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = (rgp_pso_correlation->record_count *
662*61046927SAndroid Build Coastguard Worker                                  sizeof(struct sqtt_pso_correlation_record)) +
663*61046927SAndroid Build Coastguard Worker                                  sizeof(*chunk);
664*61046927SAndroid Build Coastguard Worker    chunk->offset = file_offset;
665*61046927SAndroid Build Coastguard Worker    chunk->flags = 0;
666*61046927SAndroid Build Coastguard Worker    chunk->record_size = sizeof(struct sqtt_pso_correlation_record);
667*61046927SAndroid Build Coastguard Worker    chunk->record_count = rgp_pso_correlation->record_count;
668*61046927SAndroid Build Coastguard Worker }
669*61046927SAndroid Build Coastguard Worker 
670*61046927SAndroid Build Coastguard Worker /**
671*61046927SAndroid Build Coastguard Worker  * SQTT desc info.
672*61046927SAndroid Build Coastguard Worker  */
673*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_sqtt_desc {
674*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
675*61046927SAndroid Build Coastguard Worker    int32_t shader_engine_index;
676*61046927SAndroid Build Coastguard Worker    enum sqtt_version sqtt_version;
677*61046927SAndroid Build Coastguard Worker    union {
678*61046927SAndroid Build Coastguard Worker       struct {
679*61046927SAndroid Build Coastguard Worker          int32_t instrumentation_version;
680*61046927SAndroid Build Coastguard Worker       } v0;
681*61046927SAndroid Build Coastguard Worker       struct {
682*61046927SAndroid Build Coastguard Worker          int16_t instrumentation_spec_version;
683*61046927SAndroid Build Coastguard Worker          int16_t instrumentation_api_version;
684*61046927SAndroid Build Coastguard Worker          int32_t compute_unit_index;
685*61046927SAndroid Build Coastguard Worker       } v1;
686*61046927SAndroid Build Coastguard Worker    };
687*61046927SAndroid Build Coastguard Worker };
688*61046927SAndroid Build Coastguard Worker 
689*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_sqtt_desc) == 32,
690*61046927SAndroid Build Coastguard Worker               "sqtt_file_chunk_sqtt_desc doesn't match RGP spec");
691*61046927SAndroid Build Coastguard Worker 
ac_gfx_level_to_sqtt_version(enum amd_gfx_level gfx_level)692*61046927SAndroid Build Coastguard Worker static enum sqtt_version ac_gfx_level_to_sqtt_version(enum amd_gfx_level gfx_level)
693*61046927SAndroid Build Coastguard Worker {
694*61046927SAndroid Build Coastguard Worker    switch (gfx_level) {
695*61046927SAndroid Build Coastguard Worker    case GFX8:
696*61046927SAndroid Build Coastguard Worker       return SQTT_VERSION_2_2;
697*61046927SAndroid Build Coastguard Worker    case GFX9:
698*61046927SAndroid Build Coastguard Worker       return SQTT_VERSION_2_3;
699*61046927SAndroid Build Coastguard Worker    case GFX10:
700*61046927SAndroid Build Coastguard Worker       return SQTT_VERSION_2_4;
701*61046927SAndroid Build Coastguard Worker    case GFX10_3:
702*61046927SAndroid Build Coastguard Worker       return SQTT_VERSION_2_4;
703*61046927SAndroid Build Coastguard Worker    case GFX11:
704*61046927SAndroid Build Coastguard Worker    case GFX11_5:
705*61046927SAndroid Build Coastguard Worker       return SQTT_VERSION_3_2;
706*61046927SAndroid Build Coastguard Worker    default:
707*61046927SAndroid Build Coastguard Worker       unreachable("Invalid gfx level");
708*61046927SAndroid Build Coastguard Worker    }
709*61046927SAndroid Build Coastguard Worker }
710*61046927SAndroid Build Coastguard Worker 
ac_sqtt_fill_sqtt_desc(const struct radeon_info * info,struct sqtt_file_chunk_sqtt_desc * chunk,int32_t chunk_index,int32_t shader_engine_index,int32_t compute_unit_index)711*61046927SAndroid Build Coastguard Worker static void ac_sqtt_fill_sqtt_desc(const struct radeon_info *info,
712*61046927SAndroid Build Coastguard Worker                                    struct sqtt_file_chunk_sqtt_desc *chunk, int32_t chunk_index,
713*61046927SAndroid Build Coastguard Worker                                    int32_t shader_engine_index, int32_t compute_unit_index)
714*61046927SAndroid Build Coastguard Worker {
715*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_SQTT_DESC;
716*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = chunk_index;
717*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
718*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 2;
719*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = sizeof(*chunk);
720*61046927SAndroid Build Coastguard Worker 
721*61046927SAndroid Build Coastguard Worker    chunk->sqtt_version =
722*61046927SAndroid Build Coastguard Worker       ac_gfx_level_to_sqtt_version(info->gfx_level);
723*61046927SAndroid Build Coastguard Worker    chunk->shader_engine_index = shader_engine_index;
724*61046927SAndroid Build Coastguard Worker    chunk->v1.instrumentation_spec_version = 1;
725*61046927SAndroid Build Coastguard Worker    chunk->v1.instrumentation_api_version = 0;
726*61046927SAndroid Build Coastguard Worker    chunk->v1.compute_unit_index = compute_unit_index;
727*61046927SAndroid Build Coastguard Worker }
728*61046927SAndroid Build Coastguard Worker 
729*61046927SAndroid Build Coastguard Worker /**
730*61046927SAndroid Build Coastguard Worker  * SQTT data info.
731*61046927SAndroid Build Coastguard Worker  */
732*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_sqtt_data {
733*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
734*61046927SAndroid Build Coastguard Worker    int32_t offset; /* in bytes */
735*61046927SAndroid Build Coastguard Worker    int32_t size;   /* in bytes */
736*61046927SAndroid Build Coastguard Worker };
737*61046927SAndroid Build Coastguard Worker 
738*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_sqtt_data) == 24,
739*61046927SAndroid Build Coastguard Worker               "sqtt_file_chunk_sqtt_data doesn't match RGP spec");
740*61046927SAndroid Build Coastguard Worker 
ac_sqtt_fill_sqtt_data(struct sqtt_file_chunk_sqtt_data * chunk,int32_t chunk_index,int32_t offset,int32_t size)741*61046927SAndroid Build Coastguard Worker static void ac_sqtt_fill_sqtt_data(struct sqtt_file_chunk_sqtt_data *chunk, int32_t chunk_index,
742*61046927SAndroid Build Coastguard Worker                                    int32_t offset, int32_t size)
743*61046927SAndroid Build Coastguard Worker {
744*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_SQTT_DATA;
745*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = chunk_index;
746*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
747*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 0;
748*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = sizeof(*chunk) + size;
749*61046927SAndroid Build Coastguard Worker 
750*61046927SAndroid Build Coastguard Worker    chunk->offset = sizeof(*chunk) + offset;
751*61046927SAndroid Build Coastguard Worker    chunk->size = size;
752*61046927SAndroid Build Coastguard Worker }
753*61046927SAndroid Build Coastguard Worker 
754*61046927SAndroid Build Coastguard Worker /**
755*61046927SAndroid Build Coastguard Worker  * SQTT queue event timings info.
756*61046927SAndroid Build Coastguard Worker  */
757*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_queue_event_timings {
758*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
759*61046927SAndroid Build Coastguard Worker    uint32_t queue_info_table_record_count;
760*61046927SAndroid Build Coastguard Worker    uint32_t queue_info_table_size;
761*61046927SAndroid Build Coastguard Worker    uint32_t queue_event_table_record_count;
762*61046927SAndroid Build Coastguard Worker    uint32_t queue_event_table_size;
763*61046927SAndroid Build Coastguard Worker };
764*61046927SAndroid Build Coastguard Worker 
765*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_queue_event_timings) == 32,
766*61046927SAndroid Build Coastguard Worker 	      "sqtt_file_chunk_queue_event_timings doesn't match RGP spec");
767*61046927SAndroid Build Coastguard Worker 
768*61046927SAndroid Build Coastguard Worker struct sqtt_queue_info_record {
769*61046927SAndroid Build Coastguard Worker    uint64_t queue_id;
770*61046927SAndroid Build Coastguard Worker    uint64_t queue_context;
771*61046927SAndroid Build Coastguard Worker    struct sqtt_queue_hardware_info hardware_info;
772*61046927SAndroid Build Coastguard Worker    uint32_t reserved;
773*61046927SAndroid Build Coastguard Worker };
774*61046927SAndroid Build Coastguard Worker 
775*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_queue_info_record) == 24,
776*61046927SAndroid Build Coastguard Worker 	      "sqtt_queue_info_record doesn't match RGP spec");
777*61046927SAndroid Build Coastguard Worker 
778*61046927SAndroid Build Coastguard Worker struct sqtt_queue_event_record {
779*61046927SAndroid Build Coastguard Worker    enum sqtt_queue_event_type event_type;
780*61046927SAndroid Build Coastguard Worker    uint32_t sqtt_cb_id;
781*61046927SAndroid Build Coastguard Worker    uint64_t frame_index;
782*61046927SAndroid Build Coastguard Worker    uint32_t queue_info_index;
783*61046927SAndroid Build Coastguard Worker    uint32_t submit_sub_index;
784*61046927SAndroid Build Coastguard Worker    uint64_t api_id;
785*61046927SAndroid Build Coastguard Worker    uint64_t cpu_timestamp;
786*61046927SAndroid Build Coastguard Worker    uint64_t gpu_timestamps[2];
787*61046927SAndroid Build Coastguard Worker };
788*61046927SAndroid Build Coastguard Worker 
789*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_queue_event_record) == 56,
790*61046927SAndroid Build Coastguard Worker 	      "sqtt_queue_event_record doesn't match RGP spec");
791*61046927SAndroid Build Coastguard Worker 
792*61046927SAndroid Build Coastguard Worker static void
ac_sqtt_fill_queue_event_timings(const struct rgp_queue_info * rgp_queue_info,const struct rgp_queue_event * rgp_queue_event,struct sqtt_file_chunk_queue_event_timings * chunk)793*61046927SAndroid Build Coastguard Worker ac_sqtt_fill_queue_event_timings(const struct rgp_queue_info *rgp_queue_info,
794*61046927SAndroid Build Coastguard Worker                                  const struct rgp_queue_event *rgp_queue_event,
795*61046927SAndroid Build Coastguard Worker                                  struct sqtt_file_chunk_queue_event_timings *chunk)
796*61046927SAndroid Build Coastguard Worker {
797*61046927SAndroid Build Coastguard Worker    unsigned queue_info_size =
798*61046927SAndroid Build Coastguard Worker       rgp_queue_info->record_count * sizeof(struct sqtt_queue_info_record);
799*61046927SAndroid Build Coastguard Worker    unsigned queue_event_size =
800*61046927SAndroid Build Coastguard Worker       rgp_queue_event->record_count * sizeof(struct sqtt_queue_event_record);
801*61046927SAndroid Build Coastguard Worker 
802*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_QUEUE_EVENT_TIMINGS;
803*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
804*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 1;
805*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 1;
806*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = queue_info_size + queue_event_size +
807*61046927SAndroid Build Coastguard Worker                                  sizeof(*chunk);
808*61046927SAndroid Build Coastguard Worker 
809*61046927SAndroid Build Coastguard Worker    chunk->queue_info_table_record_count = rgp_queue_info->record_count;
810*61046927SAndroid Build Coastguard Worker    chunk->queue_info_table_size = queue_info_size;
811*61046927SAndroid Build Coastguard Worker    chunk->queue_event_table_record_count = rgp_queue_event->record_count;
812*61046927SAndroid Build Coastguard Worker    chunk->queue_event_table_size = queue_event_size;
813*61046927SAndroid Build Coastguard Worker }
814*61046927SAndroid Build Coastguard Worker 
815*61046927SAndroid Build Coastguard Worker /**
816*61046927SAndroid Build Coastguard Worker  * SQTT clock calibration info.
817*61046927SAndroid Build Coastguard Worker  */
818*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_clock_calibration {
819*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
820*61046927SAndroid Build Coastguard Worker    uint64_t cpu_timestamp;
821*61046927SAndroid Build Coastguard Worker    uint64_t gpu_timestamp;
822*61046927SAndroid Build Coastguard Worker    uint64_t reserved;
823*61046927SAndroid Build Coastguard Worker };
824*61046927SAndroid Build Coastguard Worker 
825*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_clock_calibration) == 40,
826*61046927SAndroid Build Coastguard Worker 	      "sqtt_file_chunk_clock_calibration doesn't match RGP spec");
827*61046927SAndroid Build Coastguard Worker 
828*61046927SAndroid Build Coastguard Worker static void
ac_sqtt_fill_clock_calibration(struct sqtt_file_chunk_clock_calibration * chunk,int32_t chunk_index)829*61046927SAndroid Build Coastguard Worker ac_sqtt_fill_clock_calibration(struct sqtt_file_chunk_clock_calibration *chunk,
830*61046927SAndroid Build Coastguard Worker                                int32_t chunk_index)
831*61046927SAndroid Build Coastguard Worker {
832*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_CLOCK_CALIBRATION;
833*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = chunk_index;
834*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 0;
835*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 0;
836*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = sizeof(*chunk);
837*61046927SAndroid Build Coastguard Worker }
838*61046927SAndroid Build Coastguard Worker 
839*61046927SAndroid Build Coastguard Worker /* Below values are from from llvm project
840*61046927SAndroid Build Coastguard Worker  * llvm/include/llvm/BinaryFormat/ELF.h
841*61046927SAndroid Build Coastguard Worker  */
842*61046927SAndroid Build Coastguard Worker enum elf_gfxip_level
843*61046927SAndroid Build Coastguard Worker {
844*61046927SAndroid Build Coastguard Worker    EF_AMDGPU_MACH_AMDGCN_GFX801 = 0x028,
845*61046927SAndroid Build Coastguard Worker    EF_AMDGPU_MACH_AMDGCN_GFX900 = 0x02c,
846*61046927SAndroid Build Coastguard Worker    EF_AMDGPU_MACH_AMDGCN_GFX1010 = 0x033,
847*61046927SAndroid Build Coastguard Worker    EF_AMDGPU_MACH_AMDGCN_GFX1030 = 0x036,
848*61046927SAndroid Build Coastguard Worker    EF_AMDGPU_MACH_AMDGCN_GFX1100 = 0x041,
849*61046927SAndroid Build Coastguard Worker };
850*61046927SAndroid Build Coastguard Worker 
ac_gfx_level_to_elf_gfxip_level(enum amd_gfx_level gfx_level)851*61046927SAndroid Build Coastguard Worker static enum elf_gfxip_level ac_gfx_level_to_elf_gfxip_level(enum amd_gfx_level gfx_level)
852*61046927SAndroid Build Coastguard Worker {
853*61046927SAndroid Build Coastguard Worker    switch (gfx_level) {
854*61046927SAndroid Build Coastguard Worker    case GFX8:
855*61046927SAndroid Build Coastguard Worker       return EF_AMDGPU_MACH_AMDGCN_GFX801;
856*61046927SAndroid Build Coastguard Worker    case GFX9:
857*61046927SAndroid Build Coastguard Worker       return EF_AMDGPU_MACH_AMDGCN_GFX900;
858*61046927SAndroid Build Coastguard Worker    case GFX10:
859*61046927SAndroid Build Coastguard Worker       return EF_AMDGPU_MACH_AMDGCN_GFX1010;
860*61046927SAndroid Build Coastguard Worker    case GFX10_3:
861*61046927SAndroid Build Coastguard Worker       return EF_AMDGPU_MACH_AMDGCN_GFX1030;
862*61046927SAndroid Build Coastguard Worker    case GFX11:
863*61046927SAndroid Build Coastguard Worker    case GFX11_5:
864*61046927SAndroid Build Coastguard Worker       return EF_AMDGPU_MACH_AMDGCN_GFX1100;
865*61046927SAndroid Build Coastguard Worker    default:
866*61046927SAndroid Build Coastguard Worker       unreachable("Invalid gfx level");
867*61046927SAndroid Build Coastguard Worker    }
868*61046927SAndroid Build Coastguard Worker }
869*61046927SAndroid Build Coastguard Worker 
870*61046927SAndroid Build Coastguard Worker /**
871*61046927SAndroid Build Coastguard Worker  * SQTT SPM DB info.
872*61046927SAndroid Build Coastguard Worker  */
873*61046927SAndroid Build Coastguard Worker struct sqtt_spm_counter_info {
874*61046927SAndroid Build Coastguard Worker    enum ac_pc_gpu_block block;
875*61046927SAndroid Build Coastguard Worker    uint32_t instance;
876*61046927SAndroid Build Coastguard Worker    uint32_t event_index; /* index of counter within the block */
877*61046927SAndroid Build Coastguard Worker    uint32_t data_offset; /* offset of counter from the beginning of the chunk */
878*61046927SAndroid Build Coastguard Worker    uint32_t data_size;   /* size in bytes of a single counter data item */
879*61046927SAndroid Build Coastguard Worker };
880*61046927SAndroid Build Coastguard Worker 
881*61046927SAndroid Build Coastguard Worker struct sqtt_file_chunk_spm_db {
882*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_header header;
883*61046927SAndroid Build Coastguard Worker    uint32_t flags;
884*61046927SAndroid Build Coastguard Worker    uint32_t preamble_size;
885*61046927SAndroid Build Coastguard Worker    uint32_t num_timestamps;
886*61046927SAndroid Build Coastguard Worker    uint32_t num_spm_counter_info;
887*61046927SAndroid Build Coastguard Worker    uint32_t spm_counter_info_size;
888*61046927SAndroid Build Coastguard Worker    uint32_t sample_interval;
889*61046927SAndroid Build Coastguard Worker };
890*61046927SAndroid Build Coastguard Worker 
891*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct sqtt_file_chunk_spm_db) == 40,
892*61046927SAndroid Build Coastguard Worker               "sqtt_file_chunk_spm_db doesn't match RGP spec");
893*61046927SAndroid Build Coastguard Worker 
ac_sqtt_fill_spm_db(const struct ac_spm_trace * spm_trace,struct sqtt_file_chunk_spm_db * chunk,uint32_t num_samples,uint32_t chunk_size)894*61046927SAndroid Build Coastguard Worker static void ac_sqtt_fill_spm_db(const struct ac_spm_trace *spm_trace,
895*61046927SAndroid Build Coastguard Worker                                 struct sqtt_file_chunk_spm_db *chunk,
896*61046927SAndroid Build Coastguard Worker                                 uint32_t num_samples,
897*61046927SAndroid Build Coastguard Worker                                 uint32_t chunk_size)
898*61046927SAndroid Build Coastguard Worker {
899*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.type = SQTT_FILE_CHUNK_TYPE_SPM_DB;
900*61046927SAndroid Build Coastguard Worker    chunk->header.chunk_id.index = 0;
901*61046927SAndroid Build Coastguard Worker    chunk->header.major_version = 2;
902*61046927SAndroid Build Coastguard Worker    chunk->header.minor_version = 0;
903*61046927SAndroid Build Coastguard Worker    chunk->header.size_in_bytes = chunk_size;
904*61046927SAndroid Build Coastguard Worker 
905*61046927SAndroid Build Coastguard Worker    chunk->flags = 0;
906*61046927SAndroid Build Coastguard Worker    chunk->preamble_size = sizeof(struct sqtt_file_chunk_spm_db);
907*61046927SAndroid Build Coastguard Worker    chunk->num_timestamps = num_samples;
908*61046927SAndroid Build Coastguard Worker    chunk->num_spm_counter_info = spm_trace->num_counters;
909*61046927SAndroid Build Coastguard Worker    chunk->spm_counter_info_size = sizeof(struct sqtt_spm_counter_info);
910*61046927SAndroid Build Coastguard Worker    chunk->sample_interval = spm_trace->sample_interval;
911*61046927SAndroid Build Coastguard Worker }
912*61046927SAndroid Build Coastguard Worker 
ac_sqtt_dump_spm(const struct ac_spm_trace * spm_trace,size_t file_offset,FILE * output)913*61046927SAndroid Build Coastguard Worker static void ac_sqtt_dump_spm(const struct ac_spm_trace *spm_trace,
914*61046927SAndroid Build Coastguard Worker                              size_t file_offset,
915*61046927SAndroid Build Coastguard Worker                              FILE *output)
916*61046927SAndroid Build Coastguard Worker {
917*61046927SAndroid Build Coastguard Worker    uint32_t sample_size_in_bytes = spm_trace->sample_size_in_bytes;
918*61046927SAndroid Build Coastguard Worker    uint32_t num_samples = spm_trace->num_samples;
919*61046927SAndroid Build Coastguard Worker    uint8_t *spm_data_ptr = (uint8_t *)spm_trace->ptr;
920*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_spm_db spm_db;
921*61046927SAndroid Build Coastguard Worker    size_t file_spm_db_offset = file_offset;
922*61046927SAndroid Build Coastguard Worker 
923*61046927SAndroid Build Coastguard Worker    fseek(output, sizeof(struct sqtt_file_chunk_spm_db), SEEK_CUR);
924*61046927SAndroid Build Coastguard Worker    file_offset += sizeof(struct sqtt_file_chunk_spm_db);
925*61046927SAndroid Build Coastguard Worker 
926*61046927SAndroid Build Coastguard Worker    /* Skip the reserved 32 bytes of data at beginning. */
927*61046927SAndroid Build Coastguard Worker    spm_data_ptr += 32;
928*61046927SAndroid Build Coastguard Worker 
929*61046927SAndroid Build Coastguard Worker    /* SPM timestamps. */
930*61046927SAndroid Build Coastguard Worker    uint32_t sample_size_in_qwords = sample_size_in_bytes / sizeof(uint64_t);
931*61046927SAndroid Build Coastguard Worker    uint64_t *timestamp_ptr = (uint64_t *)spm_data_ptr;
932*61046927SAndroid Build Coastguard Worker 
933*61046927SAndroid Build Coastguard Worker    for (uint32_t s = 0; s < num_samples; s++) {
934*61046927SAndroid Build Coastguard Worker       uint64_t index = s * sample_size_in_qwords;
935*61046927SAndroid Build Coastguard Worker       uint64_t timestamp = timestamp_ptr[index];
936*61046927SAndroid Build Coastguard Worker 
937*61046927SAndroid Build Coastguard Worker       file_offset += sizeof(timestamp);
938*61046927SAndroid Build Coastguard Worker       fwrite(&timestamp, sizeof(timestamp), 1, output);
939*61046927SAndroid Build Coastguard Worker    }
940*61046927SAndroid Build Coastguard Worker 
941*61046927SAndroid Build Coastguard Worker    /* SPM counter info. */
942*61046927SAndroid Build Coastguard Worker    uint64_t counter_values_size = num_samples * sizeof(uint16_t);
943*61046927SAndroid Build Coastguard Worker    uint64_t counter_values_offset = num_samples * sizeof(uint64_t) +
944*61046927SAndroid Build Coastguard Worker                                     spm_trace->num_counters * sizeof(struct sqtt_spm_counter_info);
945*61046927SAndroid Build Coastguard Worker 
946*61046927SAndroid Build Coastguard Worker    for (uint32_t c = 0; c < spm_trace->num_counters; c++) {
947*61046927SAndroid Build Coastguard Worker       struct sqtt_spm_counter_info cntr_info = {
948*61046927SAndroid Build Coastguard Worker          .block = spm_trace->counters[c].gpu_block,
949*61046927SAndroid Build Coastguard Worker          .instance = spm_trace->counters[c].instance,
950*61046927SAndroid Build Coastguard Worker          .data_offset = counter_values_offset,
951*61046927SAndroid Build Coastguard Worker          .data_size = sizeof(uint16_t),
952*61046927SAndroid Build Coastguard Worker          .event_index = spm_trace->counters[c].event_id,
953*61046927SAndroid Build Coastguard Worker       };
954*61046927SAndroid Build Coastguard Worker 
955*61046927SAndroid Build Coastguard Worker       file_offset += sizeof(cntr_info);
956*61046927SAndroid Build Coastguard Worker       fwrite(&cntr_info, sizeof(cntr_info), 1, output);
957*61046927SAndroid Build Coastguard Worker 
958*61046927SAndroid Build Coastguard Worker       counter_values_offset += counter_values_size;
959*61046927SAndroid Build Coastguard Worker    }
960*61046927SAndroid Build Coastguard Worker 
961*61046927SAndroid Build Coastguard Worker    /* SPM counter values. */
962*61046927SAndroid Build Coastguard Worker    uint32_t sample_size_in_hwords = sample_size_in_bytes / sizeof(uint16_t);
963*61046927SAndroid Build Coastguard Worker    uint16_t *counter_values_ptr = (uint16_t *)spm_data_ptr;
964*61046927SAndroid Build Coastguard Worker 
965*61046927SAndroid Build Coastguard Worker    for (uint32_t c = 0; c < spm_trace->num_counters; c++) {
966*61046927SAndroid Build Coastguard Worker       uint64_t offset = spm_trace->counters[c].offset;
967*61046927SAndroid Build Coastguard Worker 
968*61046927SAndroid Build Coastguard Worker       for (uint32_t s = 0; s < num_samples; s++) {
969*61046927SAndroid Build Coastguard Worker          uint64_t index = offset + (s * sample_size_in_hwords);
970*61046927SAndroid Build Coastguard Worker          uint16_t value = counter_values_ptr[index];
971*61046927SAndroid Build Coastguard Worker 
972*61046927SAndroid Build Coastguard Worker          file_offset += sizeof(value);
973*61046927SAndroid Build Coastguard Worker          fwrite(&value, sizeof(value), 1, output);
974*61046927SAndroid Build Coastguard Worker       }
975*61046927SAndroid Build Coastguard Worker    }
976*61046927SAndroid Build Coastguard Worker 
977*61046927SAndroid Build Coastguard Worker    /* SQTT SPM DB chunk. */
978*61046927SAndroid Build Coastguard Worker    ac_sqtt_fill_spm_db(spm_trace, &spm_db, num_samples,
979*61046927SAndroid Build Coastguard Worker                        file_offset - file_spm_db_offset);
980*61046927SAndroid Build Coastguard Worker    fseek(output, file_spm_db_offset, SEEK_SET);
981*61046927SAndroid Build Coastguard Worker    fwrite(&spm_db, sizeof(struct sqtt_file_chunk_spm_db), 1, output);
982*61046927SAndroid Build Coastguard Worker    fseek(output, file_offset, SEEK_SET);
983*61046927SAndroid Build Coastguard Worker }
984*61046927SAndroid Build Coastguard Worker 
985*61046927SAndroid Build Coastguard Worker #if defined(USE_LIBELF)
986*61046927SAndroid Build Coastguard Worker static void
ac_sqtt_dump_data(const struct radeon_info * rad_info,struct ac_sqtt_trace * sqtt_trace,const struct ac_spm_trace * spm_trace,FILE * output)987*61046927SAndroid Build Coastguard Worker ac_sqtt_dump_data(const struct radeon_info *rad_info, struct ac_sqtt_trace *sqtt_trace,
988*61046927SAndroid Build Coastguard Worker                   const struct ac_spm_trace *spm_trace, FILE *output)
989*61046927SAndroid Build Coastguard Worker {
990*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_asic_info asic_info = {0};
991*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_cpu_info cpu_info = {0};
992*61046927SAndroid Build Coastguard Worker    struct sqtt_file_chunk_api_info api_info = {0};
993*61046927SAndroid Build Coastguard Worker    struct sqtt_file_header header = {0};
994*61046927SAndroid Build Coastguard Worker    size_t file_offset = 0;
995*61046927SAndroid Build Coastguard Worker    const struct rgp_code_object *rgp_code_object = sqtt_trace->rgp_code_object;
996*61046927SAndroid Build Coastguard Worker    const struct rgp_loader_events *rgp_loader_events = sqtt_trace->rgp_loader_events;
997*61046927SAndroid Build Coastguard Worker    const struct rgp_pso_correlation *rgp_pso_correlation = sqtt_trace->rgp_pso_correlation;
998*61046927SAndroid Build Coastguard Worker    const struct rgp_queue_info *rgp_queue_info = sqtt_trace->rgp_queue_info;
999*61046927SAndroid Build Coastguard Worker    const struct rgp_queue_event *rgp_queue_event = sqtt_trace->rgp_queue_event;
1000*61046927SAndroid Build Coastguard Worker    const struct rgp_clock_calibration *rgp_clock_calibration = sqtt_trace->rgp_clock_calibration;
1001*61046927SAndroid Build Coastguard Worker 
1002*61046927SAndroid Build Coastguard Worker    /* SQTT header file. */
1003*61046927SAndroid Build Coastguard Worker    ac_sqtt_fill_header(&header);
1004*61046927SAndroid Build Coastguard Worker    file_offset += sizeof(header);
1005*61046927SAndroid Build Coastguard Worker    fwrite(&header, sizeof(header), 1, output);
1006*61046927SAndroid Build Coastguard Worker 
1007*61046927SAndroid Build Coastguard Worker    /* SQTT cpu chunk. */
1008*61046927SAndroid Build Coastguard Worker    ac_sqtt_fill_cpu_info(&cpu_info);
1009*61046927SAndroid Build Coastguard Worker    file_offset += sizeof(cpu_info);
1010*61046927SAndroid Build Coastguard Worker    fwrite(&cpu_info, sizeof(cpu_info), 1, output);
1011*61046927SAndroid Build Coastguard Worker 
1012*61046927SAndroid Build Coastguard Worker    /* SQTT asic chunk. */
1013*61046927SAndroid Build Coastguard Worker    ac_sqtt_fill_asic_info(rad_info, &asic_info);
1014*61046927SAndroid Build Coastguard Worker    file_offset += sizeof(asic_info);
1015*61046927SAndroid Build Coastguard Worker    fwrite(&asic_info, sizeof(asic_info), 1, output);
1016*61046927SAndroid Build Coastguard Worker 
1017*61046927SAndroid Build Coastguard Worker    /* SQTT api chunk. */
1018*61046927SAndroid Build Coastguard Worker    ac_sqtt_fill_api_info(&api_info);
1019*61046927SAndroid Build Coastguard Worker    file_offset += sizeof(api_info);
1020*61046927SAndroid Build Coastguard Worker    fwrite(&api_info, sizeof(api_info), 1, output);
1021*61046927SAndroid Build Coastguard Worker 
1022*61046927SAndroid Build Coastguard Worker     /* SQTT code object database chunk. */
1023*61046927SAndroid Build Coastguard Worker    if (rgp_code_object->record_count) {
1024*61046927SAndroid Build Coastguard Worker       size_t file_code_object_offset = file_offset;
1025*61046927SAndroid Build Coastguard Worker       struct sqtt_file_chunk_code_object_database code_object;
1026*61046927SAndroid Build Coastguard Worker       struct sqtt_code_object_database_record code_object_record;
1027*61046927SAndroid Build Coastguard Worker       uint32_t elf_size_calc = 0;
1028*61046927SAndroid Build Coastguard Worker       uint32_t flags = ac_gfx_level_to_elf_gfxip_level(rad_info->gfx_level);
1029*61046927SAndroid Build Coastguard Worker 
1030*61046927SAndroid Build Coastguard Worker       fseek(output, sizeof(struct sqtt_file_chunk_code_object_database), SEEK_CUR);
1031*61046927SAndroid Build Coastguard Worker       file_offset += sizeof(struct sqtt_file_chunk_code_object_database);
1032*61046927SAndroid Build Coastguard Worker       list_for_each_entry_safe(struct rgp_code_object_record, record,
1033*61046927SAndroid Build Coastguard Worker                                &rgp_code_object->record, list) {
1034*61046927SAndroid Build Coastguard Worker          fseek(output, sizeof(struct sqtt_code_object_database_record), SEEK_CUR);
1035*61046927SAndroid Build Coastguard Worker          ac_rgp_file_write_elf_object(output, file_offset +
1036*61046927SAndroid Build Coastguard Worker                                       sizeof(struct sqtt_code_object_database_record),
1037*61046927SAndroid Build Coastguard Worker                                       record, &elf_size_calc, flags);
1038*61046927SAndroid Build Coastguard Worker          /* Align to 4 bytes per the RGP file spec. */
1039*61046927SAndroid Build Coastguard Worker          code_object_record.size = ALIGN(elf_size_calc, 4);
1040*61046927SAndroid Build Coastguard Worker          fseek(output, file_offset, SEEK_SET);
1041*61046927SAndroid Build Coastguard Worker          fwrite(&code_object_record, sizeof(struct sqtt_code_object_database_record),
1042*61046927SAndroid Build Coastguard Worker                 1, output);
1043*61046927SAndroid Build Coastguard Worker          file_offset += (sizeof(struct sqtt_code_object_database_record) +
1044*61046927SAndroid Build Coastguard Worker                          code_object_record.size);
1045*61046927SAndroid Build Coastguard Worker          fseek(output, file_offset, SEEK_SET);
1046*61046927SAndroid Build Coastguard Worker       }
1047*61046927SAndroid Build Coastguard Worker       ac_sqtt_fill_code_object(rgp_code_object, &code_object,
1048*61046927SAndroid Build Coastguard Worker                                file_code_object_offset,
1049*61046927SAndroid Build Coastguard Worker                                file_offset - file_code_object_offset);
1050*61046927SAndroid Build Coastguard Worker       fseek(output, file_code_object_offset, SEEK_SET);
1051*61046927SAndroid Build Coastguard Worker       fwrite(&code_object, sizeof(struct sqtt_file_chunk_code_object_database), 1, output);
1052*61046927SAndroid Build Coastguard Worker       fseek(output, file_offset, SEEK_SET);
1053*61046927SAndroid Build Coastguard Worker    }
1054*61046927SAndroid Build Coastguard Worker 
1055*61046927SAndroid Build Coastguard Worker    /* SQTT code object loader events chunk. */
1056*61046927SAndroid Build Coastguard Worker    if (rgp_loader_events->record_count) {
1057*61046927SAndroid Build Coastguard Worker       struct sqtt_file_chunk_code_object_loader_events loader_events;
1058*61046927SAndroid Build Coastguard Worker 
1059*61046927SAndroid Build Coastguard Worker       ac_sqtt_fill_loader_events(rgp_loader_events, &loader_events,
1060*61046927SAndroid Build Coastguard Worker                                  file_offset);
1061*61046927SAndroid Build Coastguard Worker       fwrite(&loader_events, sizeof(struct sqtt_file_chunk_code_object_loader_events),
1062*61046927SAndroid Build Coastguard Worker              1, output);
1063*61046927SAndroid Build Coastguard Worker       file_offset += sizeof(struct sqtt_file_chunk_code_object_loader_events);
1064*61046927SAndroid Build Coastguard Worker       list_for_each_entry_safe(struct rgp_loader_events_record, record,
1065*61046927SAndroid Build Coastguard Worker                                &rgp_loader_events->record, list) {
1066*61046927SAndroid Build Coastguard Worker          fwrite(record, sizeof(struct sqtt_code_object_loader_events_record), 1, output);
1067*61046927SAndroid Build Coastguard Worker       }
1068*61046927SAndroid Build Coastguard Worker       file_offset += (rgp_loader_events->record_count *
1069*61046927SAndroid Build Coastguard Worker                       sizeof(struct sqtt_code_object_loader_events_record));
1070*61046927SAndroid Build Coastguard Worker    }
1071*61046927SAndroid Build Coastguard Worker 
1072*61046927SAndroid Build Coastguard Worker    /* SQTT pso correlation chunk. */
1073*61046927SAndroid Build Coastguard Worker    if (rgp_pso_correlation->record_count) {
1074*61046927SAndroid Build Coastguard Worker       struct sqtt_file_chunk_pso_correlation pso_correlation;
1075*61046927SAndroid Build Coastguard Worker 
1076*61046927SAndroid Build Coastguard Worker       ac_sqtt_fill_pso_correlation(rgp_pso_correlation,
1077*61046927SAndroid Build Coastguard Worker                                    &pso_correlation, file_offset);
1078*61046927SAndroid Build Coastguard Worker       fwrite(&pso_correlation, sizeof(struct sqtt_file_chunk_pso_correlation), 1,
1079*61046927SAndroid Build Coastguard Worker              output);
1080*61046927SAndroid Build Coastguard Worker       file_offset += sizeof(struct sqtt_file_chunk_pso_correlation);
1081*61046927SAndroid Build Coastguard Worker       list_for_each_entry_safe(struct rgp_pso_correlation_record, record,
1082*61046927SAndroid Build Coastguard Worker                                &rgp_pso_correlation->record, list) {
1083*61046927SAndroid Build Coastguard Worker          fwrite(record, sizeof(struct sqtt_pso_correlation_record),
1084*61046927SAndroid Build Coastguard Worker                 1, output);
1085*61046927SAndroid Build Coastguard Worker       }
1086*61046927SAndroid Build Coastguard Worker       file_offset += (rgp_pso_correlation->record_count *
1087*61046927SAndroid Build Coastguard Worker                       sizeof(struct sqtt_pso_correlation_record));
1088*61046927SAndroid Build Coastguard Worker    }
1089*61046927SAndroid Build Coastguard Worker 
1090*61046927SAndroid Build Coastguard Worker    /* SQTT queue event timings. */
1091*61046927SAndroid Build Coastguard Worker    if (rgp_queue_info->record_count || rgp_queue_event->record_count) {
1092*61046927SAndroid Build Coastguard Worker       struct sqtt_file_chunk_queue_event_timings queue_event_timings;
1093*61046927SAndroid Build Coastguard Worker 
1094*61046927SAndroid Build Coastguard Worker       ac_sqtt_fill_queue_event_timings(rgp_queue_info, rgp_queue_event,
1095*61046927SAndroid Build Coastguard Worker                                        &queue_event_timings);
1096*61046927SAndroid Build Coastguard Worker       fwrite(&queue_event_timings, sizeof(struct sqtt_file_chunk_queue_event_timings), 1,
1097*61046927SAndroid Build Coastguard Worker              output);
1098*61046927SAndroid Build Coastguard Worker       file_offset += sizeof(struct sqtt_file_chunk_queue_event_timings);
1099*61046927SAndroid Build Coastguard Worker 
1100*61046927SAndroid Build Coastguard Worker       /* Queue info. */
1101*61046927SAndroid Build Coastguard Worker       list_for_each_entry_safe(struct rgp_queue_info_record, record,
1102*61046927SAndroid Build Coastguard Worker                                &rgp_queue_info->record, list) {
1103*61046927SAndroid Build Coastguard Worker          fwrite(record, sizeof(struct sqtt_queue_info_record), 1, output);
1104*61046927SAndroid Build Coastguard Worker       }
1105*61046927SAndroid Build Coastguard Worker       file_offset += (rgp_queue_info->record_count *
1106*61046927SAndroid Build Coastguard Worker                       sizeof(struct sqtt_queue_info_record));
1107*61046927SAndroid Build Coastguard Worker 
1108*61046927SAndroid Build Coastguard Worker       /* Queue event. */
1109*61046927SAndroid Build Coastguard Worker       list_for_each_entry_safe(struct rgp_queue_event_record, record,
1110*61046927SAndroid Build Coastguard Worker                                &rgp_queue_event->record, list) {
1111*61046927SAndroid Build Coastguard Worker          struct sqtt_queue_event_record queue_event = {
1112*61046927SAndroid Build Coastguard Worker             .event_type = record->event_type,
1113*61046927SAndroid Build Coastguard Worker             .sqtt_cb_id = record->sqtt_cb_id,
1114*61046927SAndroid Build Coastguard Worker             .frame_index = record->frame_index,
1115*61046927SAndroid Build Coastguard Worker             .queue_info_index = record->queue_info_index,
1116*61046927SAndroid Build Coastguard Worker             .submit_sub_index = record->submit_sub_index,
1117*61046927SAndroid Build Coastguard Worker             .api_id = record->api_id,
1118*61046927SAndroid Build Coastguard Worker             .cpu_timestamp = record->cpu_timestamp,
1119*61046927SAndroid Build Coastguard Worker          };
1120*61046927SAndroid Build Coastguard Worker 
1121*61046927SAndroid Build Coastguard Worker          switch (queue_event.event_type)
1122*61046927SAndroid Build Coastguard Worker          case SQTT_QUEUE_TIMING_EVENT_CMDBUF_SUBMIT: {
1123*61046927SAndroid Build Coastguard Worker             queue_event.gpu_timestamps[0] = *record->gpu_timestamps[0];
1124*61046927SAndroid Build Coastguard Worker             queue_event.gpu_timestamps[1] = *record->gpu_timestamps[1];
1125*61046927SAndroid Build Coastguard Worker             break;
1126*61046927SAndroid Build Coastguard Worker          case SQTT_QUEUE_TIMING_EVENT_PRESENT:
1127*61046927SAndroid Build Coastguard Worker             queue_event.gpu_timestamps[0] = *record->gpu_timestamps[0];
1128*61046927SAndroid Build Coastguard Worker             break;
1129*61046927SAndroid Build Coastguard Worker          default:
1130*61046927SAndroid Build Coastguard Worker             /* GPU timestamps are ignored for other queue events. */
1131*61046927SAndroid Build Coastguard Worker             break;
1132*61046927SAndroid Build Coastguard Worker          }
1133*61046927SAndroid Build Coastguard Worker 
1134*61046927SAndroid Build Coastguard Worker          fwrite(&queue_event, sizeof(struct sqtt_queue_event_record), 1, output);
1135*61046927SAndroid Build Coastguard Worker       }
1136*61046927SAndroid Build Coastguard Worker       file_offset += (rgp_queue_event->record_count *
1137*61046927SAndroid Build Coastguard Worker                       sizeof(struct sqtt_queue_event_record));
1138*61046927SAndroid Build Coastguard Worker    }
1139*61046927SAndroid Build Coastguard Worker 
1140*61046927SAndroid Build Coastguard Worker    /* SQTT clock calibration. */
1141*61046927SAndroid Build Coastguard Worker    if (rgp_clock_calibration->record_count) {
1142*61046927SAndroid Build Coastguard Worker       uint32_t num_records = 0;
1143*61046927SAndroid Build Coastguard Worker 
1144*61046927SAndroid Build Coastguard Worker       list_for_each_entry_safe(struct rgp_clock_calibration_record, record,
1145*61046927SAndroid Build Coastguard Worker                                &rgp_clock_calibration->record, list) {
1146*61046927SAndroid Build Coastguard Worker          struct sqtt_file_chunk_clock_calibration clock_calibration;
1147*61046927SAndroid Build Coastguard Worker          memset(&clock_calibration, 0, sizeof(clock_calibration));
1148*61046927SAndroid Build Coastguard Worker 
1149*61046927SAndroid Build Coastguard Worker          ac_sqtt_fill_clock_calibration(&clock_calibration, num_records);
1150*61046927SAndroid Build Coastguard Worker 
1151*61046927SAndroid Build Coastguard Worker          clock_calibration.cpu_timestamp = record->cpu_timestamp;
1152*61046927SAndroid Build Coastguard Worker          clock_calibration.gpu_timestamp = record->gpu_timestamp;
1153*61046927SAndroid Build Coastguard Worker 
1154*61046927SAndroid Build Coastguard Worker          fwrite(&clock_calibration, sizeof(struct sqtt_file_chunk_clock_calibration), 1,
1155*61046927SAndroid Build Coastguard Worker              output);
1156*61046927SAndroid Build Coastguard Worker          file_offset += sizeof(struct sqtt_file_chunk_clock_calibration);
1157*61046927SAndroid Build Coastguard Worker 
1158*61046927SAndroid Build Coastguard Worker          num_records++;
1159*61046927SAndroid Build Coastguard Worker       }
1160*61046927SAndroid Build Coastguard Worker    }
1161*61046927SAndroid Build Coastguard Worker 
1162*61046927SAndroid Build Coastguard Worker    if (sqtt_trace) {
1163*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < sqtt_trace->num_traces; i++) {
1164*61046927SAndroid Build Coastguard Worker          const struct ac_sqtt_data_se *se = &sqtt_trace->traces[i];
1165*61046927SAndroid Build Coastguard Worker          const struct ac_sqtt_data_info *info = &se->info;
1166*61046927SAndroid Build Coastguard Worker          struct sqtt_file_chunk_sqtt_desc desc = {0};
1167*61046927SAndroid Build Coastguard Worker          struct sqtt_file_chunk_sqtt_data data = {0};
1168*61046927SAndroid Build Coastguard Worker          uint64_t size = info->cur_offset * 32; /* unit of 32 bytes */
1169*61046927SAndroid Build Coastguard Worker 
1170*61046927SAndroid Build Coastguard Worker          /* SQTT desc chunk. */
1171*61046927SAndroid Build Coastguard Worker          ac_sqtt_fill_sqtt_desc(rad_info, &desc, i, se->shader_engine, se->compute_unit);
1172*61046927SAndroid Build Coastguard Worker          file_offset += sizeof(desc);
1173*61046927SAndroid Build Coastguard Worker          fwrite(&desc, sizeof(desc), 1, output);
1174*61046927SAndroid Build Coastguard Worker 
1175*61046927SAndroid Build Coastguard Worker          /* SQTT data chunk. */
1176*61046927SAndroid Build Coastguard Worker          ac_sqtt_fill_sqtt_data(&data, i, file_offset, size);
1177*61046927SAndroid Build Coastguard Worker          file_offset += sizeof(data);
1178*61046927SAndroid Build Coastguard Worker          fwrite(&data, sizeof(data), 1, output);
1179*61046927SAndroid Build Coastguard Worker 
1180*61046927SAndroid Build Coastguard Worker          /* Copy thread trace data generated by the hardware. */
1181*61046927SAndroid Build Coastguard Worker          file_offset += size;
1182*61046927SAndroid Build Coastguard Worker          fwrite(se->data_ptr, size, 1, output);
1183*61046927SAndroid Build Coastguard Worker       }
1184*61046927SAndroid Build Coastguard Worker    }
1185*61046927SAndroid Build Coastguard Worker 
1186*61046927SAndroid Build Coastguard Worker    if (spm_trace) {
1187*61046927SAndroid Build Coastguard Worker       ac_sqtt_dump_spm(spm_trace, file_offset, output);
1188*61046927SAndroid Build Coastguard Worker    }
1189*61046927SAndroid Build Coastguard Worker }
1190*61046927SAndroid Build Coastguard Worker #endif
1191*61046927SAndroid Build Coastguard Worker 
1192*61046927SAndroid Build Coastguard Worker int
ac_dump_rgp_capture(const struct radeon_info * info,struct ac_sqtt_trace * sqtt_trace,const struct ac_spm_trace * spm_trace)1193*61046927SAndroid Build Coastguard Worker ac_dump_rgp_capture(const struct radeon_info *info, struct ac_sqtt_trace *sqtt_trace,
1194*61046927SAndroid Build Coastguard Worker                     const struct ac_spm_trace *spm_trace)
1195*61046927SAndroid Build Coastguard Worker {
1196*61046927SAndroid Build Coastguard Worker #if !defined(USE_LIBELF)
1197*61046927SAndroid Build Coastguard Worker    return -1;
1198*61046927SAndroid Build Coastguard Worker #else
1199*61046927SAndroid Build Coastguard Worker    char filename[2048];
1200*61046927SAndroid Build Coastguard Worker    struct tm now;
1201*61046927SAndroid Build Coastguard Worker    time_t t;
1202*61046927SAndroid Build Coastguard Worker    FILE *f;
1203*61046927SAndroid Build Coastguard Worker 
1204*61046927SAndroid Build Coastguard Worker    t = time(NULL);
1205*61046927SAndroid Build Coastguard Worker    now = *localtime(&t);
1206*61046927SAndroid Build Coastguard Worker 
1207*61046927SAndroid Build Coastguard Worker    snprintf(filename, sizeof(filename), "/tmp/%s_%04d.%02d.%02d_%02d.%02d.%02d.rgp",
1208*61046927SAndroid Build Coastguard Worker             util_get_process_name(), 1900 + now.tm_year, now.tm_mon + 1, now.tm_mday, now.tm_hour,
1209*61046927SAndroid Build Coastguard Worker             now.tm_min, now.tm_sec);
1210*61046927SAndroid Build Coastguard Worker 
1211*61046927SAndroid Build Coastguard Worker    f = fopen(filename, "w+");
1212*61046927SAndroid Build Coastguard Worker    if (!f)
1213*61046927SAndroid Build Coastguard Worker       return -1;
1214*61046927SAndroid Build Coastguard Worker 
1215*61046927SAndroid Build Coastguard Worker    ac_sqtt_dump_data(info, sqtt_trace, spm_trace, f);
1216*61046927SAndroid Build Coastguard Worker 
1217*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "RGP capture saved to '%s'\n", filename);
1218*61046927SAndroid Build Coastguard Worker 
1219*61046927SAndroid Build Coastguard Worker    fclose(f);
1220*61046927SAndroid Build Coastguard Worker    return 0;
1221*61046927SAndroid Build Coastguard Worker #endif
1222*61046927SAndroid Build Coastguard Worker }
1223