xref: /aosp_15_r20/external/mesa3d/src/amd/common/ac_sqtt.h (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 
8*61046927SAndroid Build Coastguard Worker #ifndef AC_SQTT_H
9*61046927SAndroid Build Coastguard Worker #define AC_SQTT_H
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include <stdint.h>
12*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #include <assert.h>
15*61046927SAndroid Build Coastguard Worker #include "ac_pm4.h"
16*61046927SAndroid Build Coastguard Worker #include "ac_rgp.h"
17*61046927SAndroid Build Coastguard Worker #include "amd_family.h"
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker struct radeon_cmdbuf;
20*61046927SAndroid Build Coastguard Worker struct radeon_info;
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker /**
23*61046927SAndroid Build Coastguard Worker  * SQ Thread tracing is a tracing mechanism that allows taking a detailed look
24*61046927SAndroid Build Coastguard Worker  * at what the shader cores are doing.
25*61046927SAndroid Build Coastguard Worker  *
26*61046927SAndroid Build Coastguard Worker  * Among the things recorded are:
27*61046927SAndroid Build Coastguard Worker  *  - draws/dispatches + state
28*61046927SAndroid Build Coastguard Worker  *  - when each wave starts and stops.
29*61046927SAndroid Build Coastguard Worker  *  - for one SIMD per SE all instructions executed on that SIMD.
30*61046927SAndroid Build Coastguard Worker  *
31*61046927SAndroid Build Coastguard Worker  * The hardware stores all these as events in a buffer, no manual barrier
32*61046927SAndroid Build Coastguard Worker  * around each command needed. The primary user of this is RGP.
33*61046927SAndroid Build Coastguard Worker  */
34*61046927SAndroid Build Coastguard Worker struct ac_sqtt {
35*61046927SAndroid Build Coastguard Worker    struct radeon_cmdbuf *start_cs[2];
36*61046927SAndroid Build Coastguard Worker    struct radeon_cmdbuf *stop_cs[2];
37*61046927SAndroid Build Coastguard Worker    /* struct radeon_winsys_bo or struct pb_buffer */
38*61046927SAndroid Build Coastguard Worker    void *bo;
39*61046927SAndroid Build Coastguard Worker    uint64_t buffer_va;
40*61046927SAndroid Build Coastguard Worker    void *ptr;
41*61046927SAndroid Build Coastguard Worker    uint32_t buffer_size;
42*61046927SAndroid Build Coastguard Worker    int start_frame;
43*61046927SAndroid Build Coastguard Worker    char *trigger_file;
44*61046927SAndroid Build Coastguard Worker    bool instruction_timing_enabled;
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker    uint32_t cmdbuf_ids_per_queue[AMD_NUM_IP_TYPES];
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker    struct rgp_code_object rgp_code_object;
49*61046927SAndroid Build Coastguard Worker    struct rgp_loader_events rgp_loader_events;
50*61046927SAndroid Build Coastguard Worker    struct rgp_pso_correlation rgp_pso_correlation;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    struct rgp_queue_info rgp_queue_info;
53*61046927SAndroid Build Coastguard Worker    struct rgp_queue_event rgp_queue_event;
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    struct rgp_clock_calibration rgp_clock_calibration;
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker    struct hash_table_u64 *pipeline_bos;
58*61046927SAndroid Build Coastguard Worker };
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker #define SQTT_BUFFER_ALIGN_SHIFT 12
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker struct ac_sqtt_data_info {
63*61046927SAndroid Build Coastguard Worker    uint32_t cur_offset;
64*61046927SAndroid Build Coastguard Worker    uint32_t trace_status;
65*61046927SAndroid Build Coastguard Worker    union {
66*61046927SAndroid Build Coastguard Worker       uint32_t gfx9_write_counter;
67*61046927SAndroid Build Coastguard Worker       uint32_t gfx10_dropped_cntr;
68*61046927SAndroid Build Coastguard Worker    };
69*61046927SAndroid Build Coastguard Worker };
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker struct ac_sqtt_data_se {
72*61046927SAndroid Build Coastguard Worker    struct ac_sqtt_data_info info;
73*61046927SAndroid Build Coastguard Worker    void *data_ptr;
74*61046927SAndroid Build Coastguard Worker    uint32_t shader_engine;
75*61046927SAndroid Build Coastguard Worker    uint32_t compute_unit;
76*61046927SAndroid Build Coastguard Worker };
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker #define SQTT_MAX_TRACES 6
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker struct ac_sqtt_trace {
81*61046927SAndroid Build Coastguard Worker    const struct rgp_code_object *rgp_code_object;
82*61046927SAndroid Build Coastguard Worker    const struct rgp_loader_events *rgp_loader_events;
83*61046927SAndroid Build Coastguard Worker    const struct rgp_pso_correlation *rgp_pso_correlation;
84*61046927SAndroid Build Coastguard Worker    const struct rgp_queue_info *rgp_queue_info;
85*61046927SAndroid Build Coastguard Worker    const struct rgp_queue_event *rgp_queue_event;
86*61046927SAndroid Build Coastguard Worker    const struct rgp_clock_calibration *rgp_clock_calibration;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker    uint32_t num_traces;
89*61046927SAndroid Build Coastguard Worker    struct ac_sqtt_data_se traces[SQTT_MAX_TRACES];
90*61046927SAndroid Build Coastguard Worker };
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker uint64_t ac_sqtt_get_info_offset(unsigned se);
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker uint64_t ac_sqtt_get_data_offset(const struct radeon_info *rad_info, const struct ac_sqtt *sqtt,
95*61046927SAndroid Build Coastguard Worker                                  unsigned se);
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker void ac_sqtt_init(struct ac_sqtt *data);
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker void ac_sqtt_finish(struct ac_sqtt *data);
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker bool ac_is_sqtt_complete(const struct radeon_info *rad_info, const struct ac_sqtt *sqtt,
102*61046927SAndroid Build Coastguard Worker                          const struct ac_sqtt_data_info *info);
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker uint32_t ac_get_expected_buffer_size(struct radeon_info *rad_info,
105*61046927SAndroid Build Coastguard Worker                                      const struct ac_sqtt_data_info *info);
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker /**
108*61046927SAndroid Build Coastguard Worker  * Identifiers for RGP SQ thread-tracing markers (Table 1)
109*61046927SAndroid Build Coastguard Worker  */
110*61046927SAndroid Build Coastguard Worker enum rgp_sqtt_marker_identifier
111*61046927SAndroid Build Coastguard Worker {
112*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_EVENT = 0x0,
113*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_CB_START = 0x1,
114*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_CB_END = 0x2,
115*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_BARRIER_START = 0x3,
116*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_BARRIER_END = 0x4,
117*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT = 0x5,
118*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API = 0x6,
119*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_SYNC = 0x7,
120*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_PRESENT = 0x8,
121*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_LAYOUT_TRANSITION = 0x9,
122*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_RENDER_PASS = 0xA,
123*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_RESERVED2 = 0xB,
124*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_BIND_PIPELINE = 0xC,
125*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_RESERVED4 = 0xD,
126*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_RESERVED5 = 0xE,
127*61046927SAndroid Build Coastguard Worker    RGP_SQTT_MARKER_IDENTIFIER_RESERVED6 = 0xF
128*61046927SAndroid Build Coastguard Worker };
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker /**
131*61046927SAndroid Build Coastguard Worker  * Command buffer IDs used in RGP SQ thread-tracing markers (only 20 bits).
132*61046927SAndroid Build Coastguard Worker  */
133*61046927SAndroid Build Coastguard Worker union rgp_sqtt_marker_cb_id {
134*61046927SAndroid Build Coastguard Worker    struct {
135*61046927SAndroid Build Coastguard Worker       uint32_t per_frame : 1; /* Must be 1, frame-based command buffer ID. */
136*61046927SAndroid Build Coastguard Worker       uint32_t frame_index : 7;
137*61046927SAndroid Build Coastguard Worker       uint32_t cb_index : 12; /* Command buffer index within the frame. */
138*61046927SAndroid Build Coastguard Worker       uint32_t reserved : 12;
139*61046927SAndroid Build Coastguard Worker    } per_frame_cb_id;
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    struct {
142*61046927SAndroid Build Coastguard Worker       uint32_t per_frame : 1; /* Must be 0, global command buffer ID. */
143*61046927SAndroid Build Coastguard Worker       uint32_t cb_index : 19; /* Global command buffer index. */
144*61046927SAndroid Build Coastguard Worker       uint32_t reserved : 12;
145*61046927SAndroid Build Coastguard Worker    } global_cb_id;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    uint32_t all;
148*61046927SAndroid Build Coastguard Worker };
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker /**
151*61046927SAndroid Build Coastguard Worker  * RGP SQ thread-tracing marker for the start of a command buffer. (Table 2)
152*61046927SAndroid Build Coastguard Worker  */
153*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_cb_start {
154*61046927SAndroid Build Coastguard Worker    union {
155*61046927SAndroid Build Coastguard Worker       struct {
156*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
157*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
158*61046927SAndroid Build Coastguard Worker          uint32_t cb_id : 20;
159*61046927SAndroid Build Coastguard Worker          uint32_t queue : 5;
160*61046927SAndroid Build Coastguard Worker       };
161*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
162*61046927SAndroid Build Coastguard Worker    };
163*61046927SAndroid Build Coastguard Worker    union {
164*61046927SAndroid Build Coastguard Worker       uint32_t device_id_low;
165*61046927SAndroid Build Coastguard Worker       uint32_t dword02;
166*61046927SAndroid Build Coastguard Worker    };
167*61046927SAndroid Build Coastguard Worker    union {
168*61046927SAndroid Build Coastguard Worker       uint32_t device_id_high;
169*61046927SAndroid Build Coastguard Worker       uint32_t dword03;
170*61046927SAndroid Build Coastguard Worker    };
171*61046927SAndroid Build Coastguard Worker    union {
172*61046927SAndroid Build Coastguard Worker       uint32_t queue_flags;
173*61046927SAndroid Build Coastguard Worker       uint32_t dword04;
174*61046927SAndroid Build Coastguard Worker    };
175*61046927SAndroid Build Coastguard Worker };
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_cb_start) == 16,
178*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_cb_start doesn't match RGP spec");
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker /**
181*61046927SAndroid Build Coastguard Worker  *
182*61046927SAndroid Build Coastguard Worker  * RGP SQ thread-tracing marker for the end of a command buffer. (Table 3)
183*61046927SAndroid Build Coastguard Worker  */
184*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_cb_end {
185*61046927SAndroid Build Coastguard Worker    union {
186*61046927SAndroid Build Coastguard Worker       struct {
187*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
188*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
189*61046927SAndroid Build Coastguard Worker          uint32_t cb_id : 20;
190*61046927SAndroid Build Coastguard Worker          uint32_t reserved : 5;
191*61046927SAndroid Build Coastguard Worker       };
192*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
193*61046927SAndroid Build Coastguard Worker    };
194*61046927SAndroid Build Coastguard Worker    union {
195*61046927SAndroid Build Coastguard Worker       uint32_t device_id_low;
196*61046927SAndroid Build Coastguard Worker       uint32_t dword02;
197*61046927SAndroid Build Coastguard Worker    };
198*61046927SAndroid Build Coastguard Worker    union {
199*61046927SAndroid Build Coastguard Worker       uint32_t device_id_high;
200*61046927SAndroid Build Coastguard Worker       uint32_t dword03;
201*61046927SAndroid Build Coastguard Worker    };
202*61046927SAndroid Build Coastguard Worker };
203*61046927SAndroid Build Coastguard Worker 
204*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_cb_end) == 12,
205*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_cb_end doesn't match RGP spec");
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker /**
208*61046927SAndroid Build Coastguard Worker  * API types used in RGP SQ thread-tracing markers for the "General API"
209*61046927SAndroid Build Coastguard Worker  * packet.
210*61046927SAndroid Build Coastguard Worker  */
211*61046927SAndroid Build Coastguard Worker enum rgp_sqtt_marker_general_api_type
212*61046927SAndroid Build Coastguard Worker {
213*61046927SAndroid Build Coastguard Worker    ApiCmdBindPipeline = 0,
214*61046927SAndroid Build Coastguard Worker    ApiCmdBindDescriptorSets = 1,
215*61046927SAndroid Build Coastguard Worker    ApiCmdBindIndexBuffer = 2,
216*61046927SAndroid Build Coastguard Worker    ApiCmdBindVertexBuffers = 3,
217*61046927SAndroid Build Coastguard Worker    ApiCmdDraw = 4,
218*61046927SAndroid Build Coastguard Worker    ApiCmdDrawIndexed = 5,
219*61046927SAndroid Build Coastguard Worker    ApiCmdDrawIndirect = 6,
220*61046927SAndroid Build Coastguard Worker    ApiCmdDrawIndexedIndirect = 7,
221*61046927SAndroid Build Coastguard Worker    ApiCmdDrawIndirectCountAMD = 8,
222*61046927SAndroid Build Coastguard Worker    ApiCmdDrawIndexedIndirectCountAMD = 9,
223*61046927SAndroid Build Coastguard Worker    ApiCmdDispatch = 10,
224*61046927SAndroid Build Coastguard Worker    ApiCmdDispatchIndirect = 11,
225*61046927SAndroid Build Coastguard Worker    ApiCmdCopyBuffer = 12,
226*61046927SAndroid Build Coastguard Worker    ApiCmdCopyImage = 13,
227*61046927SAndroid Build Coastguard Worker    ApiCmdBlitImage = 14,
228*61046927SAndroid Build Coastguard Worker    ApiCmdCopyBufferToImage = 15,
229*61046927SAndroid Build Coastguard Worker    ApiCmdCopyImageToBuffer = 16,
230*61046927SAndroid Build Coastguard Worker    ApiCmdUpdateBuffer = 17,
231*61046927SAndroid Build Coastguard Worker    ApiCmdFillBuffer = 18,
232*61046927SAndroid Build Coastguard Worker    ApiCmdClearColorImage = 19,
233*61046927SAndroid Build Coastguard Worker    ApiCmdClearDepthStencilImage = 20,
234*61046927SAndroid Build Coastguard Worker    ApiCmdClearAttachments = 21,
235*61046927SAndroid Build Coastguard Worker    ApiCmdResolveImage = 22,
236*61046927SAndroid Build Coastguard Worker    ApiCmdWaitEvents = 23,
237*61046927SAndroid Build Coastguard Worker    ApiCmdPipelineBarrier = 24,
238*61046927SAndroid Build Coastguard Worker    ApiCmdBeginQuery = 25,
239*61046927SAndroid Build Coastguard Worker    ApiCmdEndQuery = 26,
240*61046927SAndroid Build Coastguard Worker    ApiCmdResetQueryPool = 27,
241*61046927SAndroid Build Coastguard Worker    ApiCmdWriteTimestamp = 28,
242*61046927SAndroid Build Coastguard Worker    ApiCmdCopyQueryPoolResults = 29,
243*61046927SAndroid Build Coastguard Worker    ApiCmdPushConstants = 30,
244*61046927SAndroid Build Coastguard Worker    ApiCmdBeginRenderPass = 31,
245*61046927SAndroid Build Coastguard Worker    ApiCmdNextSubpass = 32,
246*61046927SAndroid Build Coastguard Worker    ApiCmdEndRenderPass = 33,
247*61046927SAndroid Build Coastguard Worker    ApiCmdExecuteCommands = 34,
248*61046927SAndroid Build Coastguard Worker    ApiCmdSetViewport = 35,
249*61046927SAndroid Build Coastguard Worker    ApiCmdSetScissor = 36,
250*61046927SAndroid Build Coastguard Worker    ApiCmdSetLineWidth = 37,
251*61046927SAndroid Build Coastguard Worker    ApiCmdSetDepthBias = 38,
252*61046927SAndroid Build Coastguard Worker    ApiCmdSetBlendConstants = 39,
253*61046927SAndroid Build Coastguard Worker    ApiCmdSetDepthBounds = 40,
254*61046927SAndroid Build Coastguard Worker    ApiCmdSetStencilCompareMask = 41,
255*61046927SAndroid Build Coastguard Worker    ApiCmdSetStencilWriteMask = 42,
256*61046927SAndroid Build Coastguard Worker    ApiCmdSetStencilReference = 43,
257*61046927SAndroid Build Coastguard Worker    ApiCmdDrawIndirectCount = 44,
258*61046927SAndroid Build Coastguard Worker    ApiCmdDrawIndexedIndirectCount = 45,
259*61046927SAndroid Build Coastguard Worker    /* gap */
260*61046927SAndroid Build Coastguard Worker    ApiCmdDrawMeshTasksEXT = 47,
261*61046927SAndroid Build Coastguard Worker    ApiCmdDrawMeshTasksIndirectCountEXT = 48,
262*61046927SAndroid Build Coastguard Worker    ApiCmdDrawMeshTasksIndirectEXT = 49,
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker    ApiRayTracingSeparateCompiled = 0x800000,
265*61046927SAndroid Build Coastguard Worker    ApiInvalid = 0xffffffff
266*61046927SAndroid Build Coastguard Worker };
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker /**
269*61046927SAndroid Build Coastguard Worker  * RGP SQ thread-tracing marker for a "General API" instrumentation packet.
270*61046927SAndroid Build Coastguard Worker  */
271*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_general_api {
272*61046927SAndroid Build Coastguard Worker    union {
273*61046927SAndroid Build Coastguard Worker       struct {
274*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
275*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
276*61046927SAndroid Build Coastguard Worker          uint32_t api_type : 20;
277*61046927SAndroid Build Coastguard Worker          uint32_t is_end : 1;
278*61046927SAndroid Build Coastguard Worker          uint32_t reserved : 4;
279*61046927SAndroid Build Coastguard Worker       };
280*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
281*61046927SAndroid Build Coastguard Worker    };
282*61046927SAndroid Build Coastguard Worker };
283*61046927SAndroid Build Coastguard Worker 
284*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_general_api) == 4,
285*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_general_api doesn't match RGP spec");
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker /**
288*61046927SAndroid Build Coastguard Worker  * API types used in RGP SQ thread-tracing markers (Table 16).
289*61046927SAndroid Build Coastguard Worker  */
290*61046927SAndroid Build Coastguard Worker enum rgp_sqtt_marker_event_type
291*61046927SAndroid Build Coastguard Worker {
292*61046927SAndroid Build Coastguard Worker    EventCmdDraw = 0,
293*61046927SAndroid Build Coastguard Worker    EventCmdDrawIndexed = 1,
294*61046927SAndroid Build Coastguard Worker    EventCmdDrawIndirect = 2,
295*61046927SAndroid Build Coastguard Worker    EventCmdDrawIndexedIndirect = 3,
296*61046927SAndroid Build Coastguard Worker    EventCmdDrawIndirectCountAMD = 4,
297*61046927SAndroid Build Coastguard Worker    EventCmdDrawIndexedIndirectCountAMD = 5,
298*61046927SAndroid Build Coastguard Worker    EventCmdDispatch = 6,
299*61046927SAndroid Build Coastguard Worker    EventCmdDispatchIndirect = 7,
300*61046927SAndroid Build Coastguard Worker    EventCmdCopyBuffer = 8,
301*61046927SAndroid Build Coastguard Worker    EventCmdCopyImage = 9,
302*61046927SAndroid Build Coastguard Worker    EventCmdBlitImage = 10,
303*61046927SAndroid Build Coastguard Worker    EventCmdCopyBufferToImage = 11,
304*61046927SAndroid Build Coastguard Worker    EventCmdCopyImageToBuffer = 12,
305*61046927SAndroid Build Coastguard Worker    EventCmdUpdateBuffer = 13,
306*61046927SAndroid Build Coastguard Worker    EventCmdFillBuffer = 14,
307*61046927SAndroid Build Coastguard Worker    EventCmdClearColorImage = 15,
308*61046927SAndroid Build Coastguard Worker    EventCmdClearDepthStencilImage = 16,
309*61046927SAndroid Build Coastguard Worker    EventCmdClearAttachments = 17,
310*61046927SAndroid Build Coastguard Worker    EventCmdResolveImage = 18,
311*61046927SAndroid Build Coastguard Worker    EventCmdWaitEvents = 19,
312*61046927SAndroid Build Coastguard Worker    EventCmdPipelineBarrier = 20,
313*61046927SAndroid Build Coastguard Worker    EventCmdResetQueryPool = 21,
314*61046927SAndroid Build Coastguard Worker    EventCmdCopyQueryPoolResults = 22,
315*61046927SAndroid Build Coastguard Worker    EventRenderPassColorClear = 23,
316*61046927SAndroid Build Coastguard Worker    EventRenderPassDepthStencilClear = 24,
317*61046927SAndroid Build Coastguard Worker    EventRenderPassResolve = 25,
318*61046927SAndroid Build Coastguard Worker    EventInternalUnknown = 26,
319*61046927SAndroid Build Coastguard Worker    EventCmdDrawIndirectCount = 27,
320*61046927SAndroid Build Coastguard Worker    EventCmdDrawIndexedIndirectCount = 28,
321*61046927SAndroid Build Coastguard Worker    /* gap */
322*61046927SAndroid Build Coastguard Worker    EventCmdTraceRaysKHR = 30,
323*61046927SAndroid Build Coastguard Worker    EventCmdTraceRaysIndirectKHR = 31,
324*61046927SAndroid Build Coastguard Worker    EventCmdBuildAccelerationStructuresKHR = 32,
325*61046927SAndroid Build Coastguard Worker    EventCmdBuildAccelerationStructuresIndirectKHR = 33,
326*61046927SAndroid Build Coastguard Worker    EventCmdCopyAccelerationStructureKHR = 34,
327*61046927SAndroid Build Coastguard Worker    EventCmdCopyAccelerationStructureToMemoryKHR = 35,
328*61046927SAndroid Build Coastguard Worker    EventCmdCopyMemoryToAccelerationStructureKHR = 36,
329*61046927SAndroid Build Coastguard Worker    /* gap */
330*61046927SAndroid Build Coastguard Worker    EventCmdDrawMeshTasksEXT = 41,
331*61046927SAndroid Build Coastguard Worker    EventCmdDrawMeshTasksIndirectCountEXT = 42,
332*61046927SAndroid Build Coastguard Worker    EventCmdDrawMeshTasksIndirectEXT = 43,
333*61046927SAndroid Build Coastguard Worker    EventUnknown = 0x7fff,
334*61046927SAndroid Build Coastguard Worker    EventInvalid = 0xffffffff
335*61046927SAndroid Build Coastguard Worker };
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker /**
338*61046927SAndroid Build Coastguard Worker  * "Event (Per-draw/dispatch)" RGP SQ thread-tracing marker. (Table 4)
339*61046927SAndroid Build Coastguard Worker  */
340*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_event {
341*61046927SAndroid Build Coastguard Worker    union {
342*61046927SAndroid Build Coastguard Worker       struct {
343*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
344*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
345*61046927SAndroid Build Coastguard Worker          uint32_t api_type : 24;
346*61046927SAndroid Build Coastguard Worker          uint32_t has_thread_dims : 1;
347*61046927SAndroid Build Coastguard Worker       };
348*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
349*61046927SAndroid Build Coastguard Worker    };
350*61046927SAndroid Build Coastguard Worker    union {
351*61046927SAndroid Build Coastguard Worker       struct {
352*61046927SAndroid Build Coastguard Worker          uint32_t cb_id : 20;
353*61046927SAndroid Build Coastguard Worker          uint32_t vertex_offset_reg_idx : 4;
354*61046927SAndroid Build Coastguard Worker          uint32_t instance_offset_reg_idx : 4;
355*61046927SAndroid Build Coastguard Worker          uint32_t draw_index_reg_idx : 4;
356*61046927SAndroid Build Coastguard Worker       };
357*61046927SAndroid Build Coastguard Worker       uint32_t dword02;
358*61046927SAndroid Build Coastguard Worker    };
359*61046927SAndroid Build Coastguard Worker    union {
360*61046927SAndroid Build Coastguard Worker       uint32_t cmd_id;
361*61046927SAndroid Build Coastguard Worker       uint32_t dword03;
362*61046927SAndroid Build Coastguard Worker    };
363*61046927SAndroid Build Coastguard Worker };
364*61046927SAndroid Build Coastguard Worker 
365*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_event) == 12,
366*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_event doesn't match RGP spec");
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker /**
369*61046927SAndroid Build Coastguard Worker  * Per-dispatch specific marker where workgroup dims are included.
370*61046927SAndroid Build Coastguard Worker  */
371*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_event_with_dims {
372*61046927SAndroid Build Coastguard Worker    struct rgp_sqtt_marker_event event;
373*61046927SAndroid Build Coastguard Worker    uint32_t thread_x;
374*61046927SAndroid Build Coastguard Worker    uint32_t thread_y;
375*61046927SAndroid Build Coastguard Worker    uint32_t thread_z;
376*61046927SAndroid Build Coastguard Worker };
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_event_with_dims) == 24,
379*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_event_with_dims doesn't match RGP spec");
380*61046927SAndroid Build Coastguard Worker 
381*61046927SAndroid Build Coastguard Worker /**
382*61046927SAndroid Build Coastguard Worker  * "Barrier Start" RGP SQTT instrumentation marker (Table 5)
383*61046927SAndroid Build Coastguard Worker  */
384*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_barrier_start {
385*61046927SAndroid Build Coastguard Worker    union {
386*61046927SAndroid Build Coastguard Worker       struct {
387*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
388*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
389*61046927SAndroid Build Coastguard Worker          uint32_t cb_id : 20;
390*61046927SAndroid Build Coastguard Worker          uint32_t reserved : 5;
391*61046927SAndroid Build Coastguard Worker       };
392*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
393*61046927SAndroid Build Coastguard Worker    };
394*61046927SAndroid Build Coastguard Worker    union {
395*61046927SAndroid Build Coastguard Worker       struct {
396*61046927SAndroid Build Coastguard Worker          uint32_t driver_reason : 31;
397*61046927SAndroid Build Coastguard Worker          uint32_t internal : 1;
398*61046927SAndroid Build Coastguard Worker       };
399*61046927SAndroid Build Coastguard Worker       uint32_t dword02;
400*61046927SAndroid Build Coastguard Worker    };
401*61046927SAndroid Build Coastguard Worker };
402*61046927SAndroid Build Coastguard Worker 
403*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_barrier_start) == 8,
404*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_barrier_start doesn't match RGP spec");
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker /**
407*61046927SAndroid Build Coastguard Worker  * "Barrier End" RGP SQTT instrumentation marker (Table 6)
408*61046927SAndroid Build Coastguard Worker  */
409*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_barrier_end {
410*61046927SAndroid Build Coastguard Worker    union {
411*61046927SAndroid Build Coastguard Worker       struct {
412*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
413*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
414*61046927SAndroid Build Coastguard Worker          uint32_t cb_id : 20;
415*61046927SAndroid Build Coastguard Worker          uint32_t wait_on_eop_ts : 1;
416*61046927SAndroid Build Coastguard Worker          uint32_t vs_partial_flush : 1;
417*61046927SAndroid Build Coastguard Worker          uint32_t ps_partial_flush : 1;
418*61046927SAndroid Build Coastguard Worker          uint32_t cs_partial_flush : 1;
419*61046927SAndroid Build Coastguard Worker          uint32_t pfp_sync_me : 1;
420*61046927SAndroid Build Coastguard Worker       };
421*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
422*61046927SAndroid Build Coastguard Worker    };
423*61046927SAndroid Build Coastguard Worker    union {
424*61046927SAndroid Build Coastguard Worker       struct {
425*61046927SAndroid Build Coastguard Worker          uint32_t sync_cp_dma : 1;
426*61046927SAndroid Build Coastguard Worker          uint32_t inval_tcp : 1;
427*61046927SAndroid Build Coastguard Worker          uint32_t inval_sqI : 1;
428*61046927SAndroid Build Coastguard Worker          uint32_t inval_sqK : 1;
429*61046927SAndroid Build Coastguard Worker          uint32_t flush_tcc : 1;
430*61046927SAndroid Build Coastguard Worker          uint32_t inval_tcc : 1;
431*61046927SAndroid Build Coastguard Worker          uint32_t flush_cb : 1;
432*61046927SAndroid Build Coastguard Worker          uint32_t inval_cb : 1;
433*61046927SAndroid Build Coastguard Worker          uint32_t flush_db : 1;
434*61046927SAndroid Build Coastguard Worker          uint32_t inval_db : 1;
435*61046927SAndroid Build Coastguard Worker          uint32_t num_layout_transitions : 16;
436*61046927SAndroid Build Coastguard Worker          uint32_t inval_gl1 : 1;
437*61046927SAndroid Build Coastguard Worker          uint32_t wait_on_ts : 1;
438*61046927SAndroid Build Coastguard Worker          uint32_t eop_ts_bottom_of_pipe : 1;
439*61046927SAndroid Build Coastguard Worker          uint32_t eos_ts_ps_done : 1;
440*61046927SAndroid Build Coastguard Worker          uint32_t eos_ts_cs_done : 1;
441*61046927SAndroid Build Coastguard Worker          uint32_t reserved : 1;
442*61046927SAndroid Build Coastguard Worker       };
443*61046927SAndroid Build Coastguard Worker       uint32_t dword02;
444*61046927SAndroid Build Coastguard Worker    };
445*61046927SAndroid Build Coastguard Worker };
446*61046927SAndroid Build Coastguard Worker 
447*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_barrier_end) == 8,
448*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_barrier_end doesn't match RGP spec");
449*61046927SAndroid Build Coastguard Worker 
450*61046927SAndroid Build Coastguard Worker /**
451*61046927SAndroid Build Coastguard Worker  * "Layout Transition" RGP SQTT instrumentation marker (Table 7)
452*61046927SAndroid Build Coastguard Worker  */
453*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_layout_transition {
454*61046927SAndroid Build Coastguard Worker    union {
455*61046927SAndroid Build Coastguard Worker       struct {
456*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
457*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
458*61046927SAndroid Build Coastguard Worker          uint32_t depth_stencil_expand : 1;
459*61046927SAndroid Build Coastguard Worker          uint32_t htile_hiz_range_expand : 1;
460*61046927SAndroid Build Coastguard Worker          uint32_t depth_stencil_resummarize : 1;
461*61046927SAndroid Build Coastguard Worker          uint32_t dcc_decompress : 1;
462*61046927SAndroid Build Coastguard Worker          uint32_t fmask_decompress : 1;
463*61046927SAndroid Build Coastguard Worker          uint32_t fast_clear_eliminate : 1;
464*61046927SAndroid Build Coastguard Worker          uint32_t fmask_color_expand : 1;
465*61046927SAndroid Build Coastguard Worker          uint32_t init_mask_ram : 1;
466*61046927SAndroid Build Coastguard Worker          uint32_t reserved1 : 17;
467*61046927SAndroid Build Coastguard Worker       };
468*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
469*61046927SAndroid Build Coastguard Worker    };
470*61046927SAndroid Build Coastguard Worker    union {
471*61046927SAndroid Build Coastguard Worker       struct {
472*61046927SAndroid Build Coastguard Worker          uint32_t reserved2 : 32;
473*61046927SAndroid Build Coastguard Worker       };
474*61046927SAndroid Build Coastguard Worker       uint32_t dword02;
475*61046927SAndroid Build Coastguard Worker    };
476*61046927SAndroid Build Coastguard Worker };
477*61046927SAndroid Build Coastguard Worker 
478*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_layout_transition) == 8,
479*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_layout_transition doesn't match RGP spec");
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker 
482*61046927SAndroid Build Coastguard Worker /**
483*61046927SAndroid Build Coastguard Worker  * "User Event" RGP SQTT instrumentation marker (Table 8)
484*61046927SAndroid Build Coastguard Worker  */
485*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_user_event {
486*61046927SAndroid Build Coastguard Worker    union {
487*61046927SAndroid Build Coastguard Worker       struct {
488*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
489*61046927SAndroid Build Coastguard Worker          uint32_t reserved0 : 8;
490*61046927SAndroid Build Coastguard Worker          uint32_t data_type : 8;
491*61046927SAndroid Build Coastguard Worker          uint32_t reserved1 : 12;
492*61046927SAndroid Build Coastguard Worker       };
493*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
494*61046927SAndroid Build Coastguard Worker    };
495*61046927SAndroid Build Coastguard Worker };
496*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_user_event_with_length {
497*61046927SAndroid Build Coastguard Worker    struct rgp_sqtt_marker_user_event user_event;
498*61046927SAndroid Build Coastguard Worker    uint32_t length;
499*61046927SAndroid Build Coastguard Worker };
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_user_event) == 4,
502*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_user_event doesn't match RGP spec");
503*61046927SAndroid Build Coastguard Worker 
504*61046927SAndroid Build Coastguard Worker enum rgp_sqtt_marker_user_event_type
505*61046927SAndroid Build Coastguard Worker {
506*61046927SAndroid Build Coastguard Worker    UserEventTrigger = 0,
507*61046927SAndroid Build Coastguard Worker    UserEventPop,
508*61046927SAndroid Build Coastguard Worker    UserEventPush,
509*61046927SAndroid Build Coastguard Worker    UserEventObjectName,
510*61046927SAndroid Build Coastguard Worker };
511*61046927SAndroid Build Coastguard Worker 
512*61046927SAndroid Build Coastguard Worker /**
513*61046927SAndroid Build Coastguard Worker  * "Pipeline bind" RGP SQTT instrumentation marker (Table 12)
514*61046927SAndroid Build Coastguard Worker  */
515*61046927SAndroid Build Coastguard Worker struct rgp_sqtt_marker_pipeline_bind {
516*61046927SAndroid Build Coastguard Worker    union {
517*61046927SAndroid Build Coastguard Worker       struct {
518*61046927SAndroid Build Coastguard Worker          uint32_t identifier : 4;
519*61046927SAndroid Build Coastguard Worker          uint32_t ext_dwords : 3;
520*61046927SAndroid Build Coastguard Worker          uint32_t bind_point : 1;
521*61046927SAndroid Build Coastguard Worker          uint32_t cb_id : 20;
522*61046927SAndroid Build Coastguard Worker          uint32_t reserved : 4;
523*61046927SAndroid Build Coastguard Worker       };
524*61046927SAndroid Build Coastguard Worker       uint32_t dword01;
525*61046927SAndroid Build Coastguard Worker    };
526*61046927SAndroid Build Coastguard Worker    union {
527*61046927SAndroid Build Coastguard Worker       uint32_t api_pso_hash[2];
528*61046927SAndroid Build Coastguard Worker       struct {
529*61046927SAndroid Build Coastguard Worker          uint32_t dword02;
530*61046927SAndroid Build Coastguard Worker          uint32_t dword03;
531*61046927SAndroid Build Coastguard Worker       };
532*61046927SAndroid Build Coastguard Worker    };
533*61046927SAndroid Build Coastguard Worker };
534*61046927SAndroid Build Coastguard Worker 
535*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct rgp_sqtt_marker_pipeline_bind) == 12,
536*61046927SAndroid Build Coastguard Worker               "rgp_sqtt_marker_pipeline_bind doesn't match RGP spec");
537*61046927SAndroid Build Coastguard Worker 
538*61046927SAndroid Build Coastguard Worker bool ac_sqtt_add_pso_correlation(struct ac_sqtt *sqtt, uint64_t pipeline_hash, uint64_t api_hash);
539*61046927SAndroid Build Coastguard Worker 
540*61046927SAndroid Build Coastguard Worker bool ac_sqtt_add_code_object_loader_event(struct ac_sqtt *sqtt, uint64_t pipeline_hash,
541*61046927SAndroid Build Coastguard Worker                                           uint64_t base_address);
542*61046927SAndroid Build Coastguard Worker 
543*61046927SAndroid Build Coastguard Worker bool ac_sqtt_add_clock_calibration(struct ac_sqtt *sqtt, uint64_t cpu_timestamp,
544*61046927SAndroid Build Coastguard Worker                                    uint64_t gpu_timestamp);
545*61046927SAndroid Build Coastguard Worker 
546*61046927SAndroid Build Coastguard Worker bool ac_check_profile_state(const struct radeon_info *info);
547*61046927SAndroid Build Coastguard Worker 
548*61046927SAndroid Build Coastguard Worker union rgp_sqtt_marker_cb_id ac_sqtt_get_next_cmdbuf_id(struct ac_sqtt *sqtt,
549*61046927SAndroid Build Coastguard Worker                                                        enum amd_ip_type ip_type);
550*61046927SAndroid Build Coastguard Worker 
551*61046927SAndroid Build Coastguard Worker bool ac_sqtt_get_trace(struct ac_sqtt *sqtt, const struct radeon_info *info,
552*61046927SAndroid Build Coastguard Worker                        struct ac_sqtt_trace *sqtt_trace);
553*61046927SAndroid Build Coastguard Worker 
554*61046927SAndroid Build Coastguard Worker uint32_t ac_sqtt_get_ctrl(const struct radeon_info *info, bool enable);
555*61046927SAndroid Build Coastguard Worker 
556*61046927SAndroid Build Coastguard Worker uint32_t ac_sqtt_get_shader_mask(const struct radeon_info *info);
557*61046927SAndroid Build Coastguard Worker 
558*61046927SAndroid Build Coastguard Worker void ac_sqtt_emit_start(const struct radeon_info *info, struct ac_pm4_state *pm4,
559*61046927SAndroid Build Coastguard Worker                         const struct ac_sqtt *sqtt, bool is_compute_queue);
560*61046927SAndroid Build Coastguard Worker 
561*61046927SAndroid Build Coastguard Worker void ac_sqtt_emit_stop(const struct radeon_info *info, struct ac_pm4_state *pm4,
562*61046927SAndroid Build Coastguard Worker                        bool is_compute_queue);
563*61046927SAndroid Build Coastguard Worker 
564*61046927SAndroid Build Coastguard Worker void ac_sqtt_emit_wait(const struct radeon_info *info, struct ac_pm4_state *pm4,
565*61046927SAndroid Build Coastguard Worker                        const struct ac_sqtt *sqtt, bool is_compute_queue);
566*61046927SAndroid Build Coastguard Worker 
567*61046927SAndroid Build Coastguard Worker #endif
568