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