17ec681f3Smrg/* 27ec681f3Smrg * Copyright 2020 Advanced Micro Devices, Inc. 37ec681f3Smrg * Copyright 2020 Valve Corporation 47ec681f3Smrg * All Rights Reserved. 57ec681f3Smrg * 67ec681f3Smrg * Permission is hereby granted, free of charge, to any person obtaining a 77ec681f3Smrg * copy of this software and associated documentation files (the "Software"), 87ec681f3Smrg * to deal in the Software without restriction, including without limitation 97ec681f3Smrg * on the rights to use, copy, modify, merge, publish, distribute, sub 107ec681f3Smrg * license, and/or sell copies of the Software, and to permit persons to whom 117ec681f3Smrg * the Software is furnished to do so, subject to the following conditions: 127ec681f3Smrg * 137ec681f3Smrg * The above copyright notice and this permission notice (including the next 147ec681f3Smrg * paragraph) shall be included in all copies or substantial portions of the 157ec681f3Smrg * Software. 167ec681f3Smrg * 177ec681f3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 187ec681f3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 197ec681f3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 207ec681f3Smrg * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 217ec681f3Smrg * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 227ec681f3Smrg * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 237ec681f3Smrg * USE OR OTHER DEALINGS IN THE SOFTWARE. 247ec681f3Smrg */ 257ec681f3Smrg 267ec681f3Smrg#ifndef AC_SQTT_H 277ec681f3Smrg#define AC_SQTT_H 287ec681f3Smrg 297ec681f3Smrg#include <stdint.h> 307ec681f3Smrg#include <stdbool.h> 317ec681f3Smrg 327ec681f3Smrg#include <assert.h> 337ec681f3Smrg#include "c11_compat.h" 347ec681f3Smrg#include "ac_rgp.h" 357ec681f3Smrg 367ec681f3Smrgstruct radeon_cmdbuf; 377ec681f3Smrgstruct radeon_info; 387ec681f3Smrg 397ec681f3Smrgstruct ac_thread_trace_data { 407ec681f3Smrg struct radeon_cmdbuf *start_cs[2]; 417ec681f3Smrg struct radeon_cmdbuf *stop_cs[2]; 427ec681f3Smrg /* struct radeon_winsys_bo or struct pb_buffer */ 437ec681f3Smrg void *bo; 447ec681f3Smrg void *ptr; 457ec681f3Smrg uint32_t buffer_size; 467ec681f3Smrg int start_frame; 477ec681f3Smrg char *trigger_file; 487ec681f3Smrg 497ec681f3Smrg struct rgp_code_object rgp_code_object; 507ec681f3Smrg struct rgp_loader_events rgp_loader_events; 517ec681f3Smrg struct rgp_pso_correlation rgp_pso_correlation; 527ec681f3Smrg}; 537ec681f3Smrg 547ec681f3Smrg#define SQTT_BUFFER_ALIGN_SHIFT 12 557ec681f3Smrg 567ec681f3Smrgstruct ac_thread_trace_info { 577ec681f3Smrg uint32_t cur_offset; 587ec681f3Smrg uint32_t trace_status; 597ec681f3Smrg union { 607ec681f3Smrg uint32_t gfx9_write_counter; 617ec681f3Smrg uint32_t gfx10_dropped_cntr; 627ec681f3Smrg }; 637ec681f3Smrg}; 647ec681f3Smrg 657ec681f3Smrgstruct ac_thread_trace_se { 667ec681f3Smrg struct ac_thread_trace_info info; 677ec681f3Smrg void *data_ptr; 687ec681f3Smrg uint32_t shader_engine; 697ec681f3Smrg uint32_t compute_unit; 707ec681f3Smrg}; 717ec681f3Smrg 727ec681f3Smrgstruct ac_thread_trace { 737ec681f3Smrg struct ac_thread_trace_data *data; 747ec681f3Smrg uint32_t num_traces; 757ec681f3Smrg struct ac_thread_trace_se traces[4]; 767ec681f3Smrg}; 777ec681f3Smrg 787ec681f3Smrguint64_t 797ec681f3Smrgac_thread_trace_get_info_offset(unsigned se); 807ec681f3Smrg 817ec681f3Smrguint64_t 827ec681f3Smrgac_thread_trace_get_data_offset(const struct radeon_info *rad_info, 837ec681f3Smrg const struct ac_thread_trace_data *data, unsigned se); 847ec681f3Smrguint64_t 857ec681f3Smrgac_thread_trace_get_info_va(uint64_t va, unsigned se); 867ec681f3Smrg 877ec681f3Smrguint64_t 887ec681f3Smrgac_thread_trace_get_data_va(const struct radeon_info *rad_info, 897ec681f3Smrg const struct ac_thread_trace_data *data, uint64_t va, unsigned se); 907ec681f3Smrg 917ec681f3Smrgbool 927ec681f3Smrgac_is_thread_trace_complete(struct radeon_info *rad_info, 937ec681f3Smrg const struct ac_thread_trace_data *data, 947ec681f3Smrg const struct ac_thread_trace_info *info); 957ec681f3Smrg 967ec681f3Smrguint32_t 977ec681f3Smrgac_get_expected_buffer_size(struct radeon_info *rad_info, 987ec681f3Smrg const struct ac_thread_trace_info *info); 997ec681f3Smrg 1007ec681f3Smrg/** 1017ec681f3Smrg * Identifiers for RGP SQ thread-tracing markers (Table 1) 1027ec681f3Smrg */ 1037ec681f3Smrgenum rgp_sqtt_marker_identifier 1047ec681f3Smrg{ 1057ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_EVENT = 0x0, 1067ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_CB_START = 0x1, 1077ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_CB_END = 0x2, 1087ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_BARRIER_START = 0x3, 1097ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_BARRIER_END = 0x4, 1107ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT = 0x5, 1117ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API = 0x6, 1127ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_SYNC = 0x7, 1137ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_PRESENT = 0x8, 1147ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_LAYOUT_TRANSITION = 0x9, 1157ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_RENDER_PASS = 0xA, 1167ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_RESERVED2 = 0xB, 1177ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_BIND_PIPELINE = 0xC, 1187ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_RESERVED4 = 0xD, 1197ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_RESERVED5 = 0xE, 1207ec681f3Smrg RGP_SQTT_MARKER_IDENTIFIER_RESERVED6 = 0xF 1217ec681f3Smrg}; 1227ec681f3Smrg 1237ec681f3Smrg/** 1247ec681f3Smrg * RGP SQ thread-tracing marker for the start of a command buffer. (Table 2) 1257ec681f3Smrg */ 1267ec681f3Smrgstruct rgp_sqtt_marker_cb_start { 1277ec681f3Smrg union { 1287ec681f3Smrg struct { 1297ec681f3Smrg uint32_t identifier : 4; 1307ec681f3Smrg uint32_t ext_dwords : 3; 1317ec681f3Smrg uint32_t cb_id : 20; 1327ec681f3Smrg uint32_t queue : 5; 1337ec681f3Smrg }; 1347ec681f3Smrg uint32_t dword01; 1357ec681f3Smrg }; 1367ec681f3Smrg union { 1377ec681f3Smrg uint32_t device_id_low; 1387ec681f3Smrg uint32_t dword02; 1397ec681f3Smrg }; 1407ec681f3Smrg union { 1417ec681f3Smrg uint32_t device_id_high; 1427ec681f3Smrg uint32_t dword03; 1437ec681f3Smrg }; 1447ec681f3Smrg union { 1457ec681f3Smrg uint32_t queue_flags; 1467ec681f3Smrg uint32_t dword04; 1477ec681f3Smrg }; 1487ec681f3Smrg}; 1497ec681f3Smrg 1507ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_cb_start) == 16, 1517ec681f3Smrg "rgp_sqtt_marker_cb_start doesn't match RGP spec"); 1527ec681f3Smrg 1537ec681f3Smrg/** 1547ec681f3Smrg * 1557ec681f3Smrg * RGP SQ thread-tracing marker for the end of a command buffer. (Table 3) 1567ec681f3Smrg */ 1577ec681f3Smrgstruct rgp_sqtt_marker_cb_end { 1587ec681f3Smrg union { 1597ec681f3Smrg struct { 1607ec681f3Smrg uint32_t identifier : 4; 1617ec681f3Smrg uint32_t ext_dwords : 3; 1627ec681f3Smrg uint32_t cb_id : 20; 1637ec681f3Smrg uint32_t reserved : 5; 1647ec681f3Smrg }; 1657ec681f3Smrg uint32_t dword01; 1667ec681f3Smrg }; 1677ec681f3Smrg union { 1687ec681f3Smrg uint32_t device_id_low; 1697ec681f3Smrg uint32_t dword02; 1707ec681f3Smrg }; 1717ec681f3Smrg union { 1727ec681f3Smrg uint32_t device_id_high; 1737ec681f3Smrg uint32_t dword03; 1747ec681f3Smrg }; 1757ec681f3Smrg}; 1767ec681f3Smrg 1777ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_cb_end) == 12, 1787ec681f3Smrg "rgp_sqtt_marker_cb_end doesn't match RGP spec"); 1797ec681f3Smrg 1807ec681f3Smrg/** 1817ec681f3Smrg * API types used in RGP SQ thread-tracing markers for the "General API" 1827ec681f3Smrg * packet. 1837ec681f3Smrg */ 1847ec681f3Smrgenum rgp_sqtt_marker_general_api_type 1857ec681f3Smrg{ 1867ec681f3Smrg ApiCmdBindPipeline = 0, 1877ec681f3Smrg ApiCmdBindDescriptorSets = 1, 1887ec681f3Smrg ApiCmdBindIndexBuffer = 2, 1897ec681f3Smrg ApiCmdBindVertexBuffers = 3, 1907ec681f3Smrg ApiCmdDraw = 4, 1917ec681f3Smrg ApiCmdDrawIndexed = 5, 1927ec681f3Smrg ApiCmdDrawIndirect = 6, 1937ec681f3Smrg ApiCmdDrawIndexedIndirect = 7, 1947ec681f3Smrg ApiCmdDrawIndirectCountAMD = 8, 1957ec681f3Smrg ApiCmdDrawIndexedIndirectCountAMD = 9, 1967ec681f3Smrg ApiCmdDispatch = 10, 1977ec681f3Smrg ApiCmdDispatchIndirect = 11, 1987ec681f3Smrg ApiCmdCopyBuffer = 12, 1997ec681f3Smrg ApiCmdCopyImage = 13, 2007ec681f3Smrg ApiCmdBlitImage = 14, 2017ec681f3Smrg ApiCmdCopyBufferToImage = 15, 2027ec681f3Smrg ApiCmdCopyImageToBuffer = 16, 2037ec681f3Smrg ApiCmdUpdateBuffer = 17, 2047ec681f3Smrg ApiCmdFillBuffer = 18, 2057ec681f3Smrg ApiCmdClearColorImage = 19, 2067ec681f3Smrg ApiCmdClearDepthStencilImage = 20, 2077ec681f3Smrg ApiCmdClearAttachments = 21, 2087ec681f3Smrg ApiCmdResolveImage = 22, 2097ec681f3Smrg ApiCmdWaitEvents = 23, 2107ec681f3Smrg ApiCmdPipelineBarrier = 24, 2117ec681f3Smrg ApiCmdBeginQuery = 25, 2127ec681f3Smrg ApiCmdEndQuery = 26, 2137ec681f3Smrg ApiCmdResetQueryPool = 27, 2147ec681f3Smrg ApiCmdWriteTimestamp = 28, 2157ec681f3Smrg ApiCmdCopyQueryPoolResults = 29, 2167ec681f3Smrg ApiCmdPushConstants = 30, 2177ec681f3Smrg ApiCmdBeginRenderPass = 31, 2187ec681f3Smrg ApiCmdNextSubpass = 32, 2197ec681f3Smrg ApiCmdEndRenderPass = 33, 2207ec681f3Smrg ApiCmdExecuteCommands = 34, 2217ec681f3Smrg ApiCmdSetViewport = 35, 2227ec681f3Smrg ApiCmdSetScissor = 36, 2237ec681f3Smrg ApiCmdSetLineWidth = 37, 2247ec681f3Smrg ApiCmdSetDepthBias = 38, 2257ec681f3Smrg ApiCmdSetBlendConstants = 39, 2267ec681f3Smrg ApiCmdSetDepthBounds = 40, 2277ec681f3Smrg ApiCmdSetStencilCompareMask = 41, 2287ec681f3Smrg ApiCmdSetStencilWriteMask = 42, 2297ec681f3Smrg ApiCmdSetStencilReference = 43, 2307ec681f3Smrg ApiCmdDrawIndirectCount = 44, 2317ec681f3Smrg ApiCmdDrawIndexedIndirectCount = 45, 2327ec681f3Smrg ApiInvalid = 0xffffffff 2337ec681f3Smrg}; 2347ec681f3Smrg 2357ec681f3Smrg/** 2367ec681f3Smrg * RGP SQ thread-tracing marker for a "General API" instrumentation packet. 2377ec681f3Smrg */ 2387ec681f3Smrgstruct rgp_sqtt_marker_general_api { 2397ec681f3Smrg union { 2407ec681f3Smrg struct { 2417ec681f3Smrg uint32_t identifier : 4; 2427ec681f3Smrg uint32_t ext_dwords : 3; 2437ec681f3Smrg uint32_t api_type : 20; 2447ec681f3Smrg uint32_t is_end : 1; 2457ec681f3Smrg uint32_t reserved : 4; 2467ec681f3Smrg }; 2477ec681f3Smrg uint32_t dword01; 2487ec681f3Smrg }; 2497ec681f3Smrg}; 2507ec681f3Smrg 2517ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_general_api) == 4, 2527ec681f3Smrg "rgp_sqtt_marker_general_api doesn't match RGP spec"); 2537ec681f3Smrg 2547ec681f3Smrg/** 2557ec681f3Smrg * API types used in RGP SQ thread-tracing markers (Table 16). 2567ec681f3Smrg */ 2577ec681f3Smrgenum rgp_sqtt_marker_event_type 2587ec681f3Smrg{ 2597ec681f3Smrg EventCmdDraw = 0, 2607ec681f3Smrg EventCmdDrawIndexed = 1, 2617ec681f3Smrg EventCmdDrawIndirect = 2, 2627ec681f3Smrg EventCmdDrawIndexedIndirect = 3, 2637ec681f3Smrg EventCmdDrawIndirectCountAMD = 4, 2647ec681f3Smrg EventCmdDrawIndexedIndirectCountAMD = 5, 2657ec681f3Smrg EventCmdDispatch = 6, 2667ec681f3Smrg EventCmdDispatchIndirect = 7, 2677ec681f3Smrg EventCmdCopyBuffer = 8, 2687ec681f3Smrg EventCmdCopyImage = 9, 2697ec681f3Smrg EventCmdBlitImage = 10, 2707ec681f3Smrg EventCmdCopyBufferToImage = 11, 2717ec681f3Smrg EventCmdCopyImageToBuffer = 12, 2727ec681f3Smrg EventCmdUpdateBuffer = 13, 2737ec681f3Smrg EventCmdFillBuffer = 14, 2747ec681f3Smrg EventCmdClearColorImage = 15, 2757ec681f3Smrg EventCmdClearDepthStencilImage = 16, 2767ec681f3Smrg EventCmdClearAttachments = 17, 2777ec681f3Smrg EventCmdResolveImage = 18, 2787ec681f3Smrg EventCmdWaitEvents = 19, 2797ec681f3Smrg EventCmdPipelineBarrier = 20, 2807ec681f3Smrg EventCmdResetQueryPool = 21, 2817ec681f3Smrg EventCmdCopyQueryPoolResults = 22, 2827ec681f3Smrg EventRenderPassColorClear = 23, 2837ec681f3Smrg EventRenderPassDepthStencilClear = 24, 2847ec681f3Smrg EventRenderPassResolve = 25, 2857ec681f3Smrg EventInternalUnknown = 26, 2867ec681f3Smrg EventCmdDrawIndirectCount = 27, 2877ec681f3Smrg EventCmdDrawIndexedIndirectCount = 28, 2887ec681f3Smrg EventInvalid = 0xffffffff 2897ec681f3Smrg}; 2907ec681f3Smrg 2917ec681f3Smrg/** 2927ec681f3Smrg * "Event (Per-draw/dispatch)" RGP SQ thread-tracing marker. (Table 4) 2937ec681f3Smrg */ 2947ec681f3Smrgstruct rgp_sqtt_marker_event { 2957ec681f3Smrg union { 2967ec681f3Smrg struct { 2977ec681f3Smrg uint32_t identifier : 4; 2987ec681f3Smrg uint32_t ext_dwords : 3; 2997ec681f3Smrg uint32_t api_type : 24; 3007ec681f3Smrg uint32_t has_thread_dims : 1; 3017ec681f3Smrg }; 3027ec681f3Smrg uint32_t dword01; 3037ec681f3Smrg }; 3047ec681f3Smrg union { 3057ec681f3Smrg struct { 3067ec681f3Smrg uint32_t cb_id : 20; 3077ec681f3Smrg uint32_t vertex_offset_reg_idx : 4; 3087ec681f3Smrg uint32_t instance_offset_reg_idx : 4; 3097ec681f3Smrg uint32_t draw_index_reg_idx : 4; 3107ec681f3Smrg }; 3117ec681f3Smrg uint32_t dword02; 3127ec681f3Smrg }; 3137ec681f3Smrg union { 3147ec681f3Smrg uint32_t cmd_id; 3157ec681f3Smrg uint32_t dword03; 3167ec681f3Smrg }; 3177ec681f3Smrg}; 3187ec681f3Smrg 3197ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_event) == 12, 3207ec681f3Smrg "rgp_sqtt_marker_event doesn't match RGP spec"); 3217ec681f3Smrg 3227ec681f3Smrg/** 3237ec681f3Smrg * Per-dispatch specific marker where workgroup dims are included. 3247ec681f3Smrg */ 3257ec681f3Smrgstruct rgp_sqtt_marker_event_with_dims { 3267ec681f3Smrg struct rgp_sqtt_marker_event event; 3277ec681f3Smrg uint32_t thread_x; 3287ec681f3Smrg uint32_t thread_y; 3297ec681f3Smrg uint32_t thread_z; 3307ec681f3Smrg}; 3317ec681f3Smrg 3327ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_event_with_dims) == 24, 3337ec681f3Smrg "rgp_sqtt_marker_event_with_dims doesn't match RGP spec"); 3347ec681f3Smrg 3357ec681f3Smrg/** 3367ec681f3Smrg * "Barrier Start" RGP SQTT instrumentation marker (Table 5) 3377ec681f3Smrg */ 3387ec681f3Smrgstruct rgp_sqtt_marker_barrier_start { 3397ec681f3Smrg union { 3407ec681f3Smrg struct { 3417ec681f3Smrg uint32_t identifier : 4; 3427ec681f3Smrg uint32_t ext_dwords : 3; 3437ec681f3Smrg uint32_t cb_id : 20; 3447ec681f3Smrg uint32_t reserved : 5; 3457ec681f3Smrg }; 3467ec681f3Smrg uint32_t dword01; 3477ec681f3Smrg }; 3487ec681f3Smrg union { 3497ec681f3Smrg struct { 3507ec681f3Smrg uint32_t driver_reason : 31; 3517ec681f3Smrg uint32_t internal : 1; 3527ec681f3Smrg }; 3537ec681f3Smrg uint32_t dword02; 3547ec681f3Smrg }; 3557ec681f3Smrg}; 3567ec681f3Smrg 3577ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_barrier_start) == 8, 3587ec681f3Smrg "rgp_sqtt_marker_barrier_start doesn't match RGP spec"); 3597ec681f3Smrg 3607ec681f3Smrg/** 3617ec681f3Smrg * "Barrier End" RGP SQTT instrumentation marker (Table 6) 3627ec681f3Smrg */ 3637ec681f3Smrgstruct rgp_sqtt_marker_barrier_end { 3647ec681f3Smrg union { 3657ec681f3Smrg struct { 3667ec681f3Smrg uint32_t identifier : 4; 3677ec681f3Smrg uint32_t ext_dwords : 3; 3687ec681f3Smrg uint32_t cb_id : 20; 3697ec681f3Smrg uint32_t wait_on_eop_ts : 1; 3707ec681f3Smrg uint32_t vs_partial_flush : 1; 3717ec681f3Smrg uint32_t ps_partial_flush : 1; 3727ec681f3Smrg uint32_t cs_partial_flush : 1; 3737ec681f3Smrg uint32_t pfp_sync_me : 1; 3747ec681f3Smrg }; 3757ec681f3Smrg uint32_t dword01; 3767ec681f3Smrg }; 3777ec681f3Smrg union { 3787ec681f3Smrg struct { 3797ec681f3Smrg uint32_t sync_cp_dma : 1; 3807ec681f3Smrg uint32_t inval_tcp : 1; 3817ec681f3Smrg uint32_t inval_sqI : 1; 3827ec681f3Smrg uint32_t inval_sqK : 1; 3837ec681f3Smrg uint32_t flush_tcc : 1; 3847ec681f3Smrg uint32_t inval_tcc : 1; 3857ec681f3Smrg uint32_t flush_cb : 1; 3867ec681f3Smrg uint32_t inval_cb : 1; 3877ec681f3Smrg uint32_t flush_db : 1; 3887ec681f3Smrg uint32_t inval_db : 1; 3897ec681f3Smrg uint32_t num_layout_transitions : 16; 3907ec681f3Smrg uint32_t inval_gl1 : 1; 3917ec681f3Smrg uint32_t reserved : 5; 3927ec681f3Smrg }; 3937ec681f3Smrg uint32_t dword02; 3947ec681f3Smrg }; 3957ec681f3Smrg}; 3967ec681f3Smrg 3977ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_barrier_end) == 8, 3987ec681f3Smrg "rgp_sqtt_marker_barrier_end doesn't match RGP spec"); 3997ec681f3Smrg 4007ec681f3Smrg/** 4017ec681f3Smrg * "Layout Transition" RGP SQTT instrumentation marker (Table 7) 4027ec681f3Smrg */ 4037ec681f3Smrgstruct rgp_sqtt_marker_layout_transition { 4047ec681f3Smrg union { 4057ec681f3Smrg struct { 4067ec681f3Smrg uint32_t identifier : 4; 4077ec681f3Smrg uint32_t ext_dwords : 3; 4087ec681f3Smrg uint32_t depth_stencil_expand : 1; 4097ec681f3Smrg uint32_t htile_hiz_range_expand : 1; 4107ec681f3Smrg uint32_t depth_stencil_resummarize : 1; 4117ec681f3Smrg uint32_t dcc_decompress : 1; 4127ec681f3Smrg uint32_t fmask_decompress : 1; 4137ec681f3Smrg uint32_t fast_clear_eliminate : 1; 4147ec681f3Smrg uint32_t fmask_color_expand : 1; 4157ec681f3Smrg uint32_t init_mask_ram : 1; 4167ec681f3Smrg uint32_t reserved1 : 17; 4177ec681f3Smrg }; 4187ec681f3Smrg uint32_t dword01; 4197ec681f3Smrg }; 4207ec681f3Smrg union { 4217ec681f3Smrg struct { 4227ec681f3Smrg uint32_t reserved2 : 32; 4237ec681f3Smrg }; 4247ec681f3Smrg uint32_t dword02; 4257ec681f3Smrg }; 4267ec681f3Smrg}; 4277ec681f3Smrg 4287ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_layout_transition) == 8, 4297ec681f3Smrg "rgp_sqtt_marker_layout_transition doesn't match RGP spec"); 4307ec681f3Smrg 4317ec681f3Smrg 4327ec681f3Smrg/** 4337ec681f3Smrg * "User Event" RGP SQTT instrumentation marker (Table 8) 4347ec681f3Smrg */ 4357ec681f3Smrgstruct rgp_sqtt_marker_user_event { 4367ec681f3Smrg union { 4377ec681f3Smrg struct { 4387ec681f3Smrg uint32_t identifier : 4; 4397ec681f3Smrg uint32_t reserved0 : 8; 4407ec681f3Smrg uint32_t data_type : 8; 4417ec681f3Smrg uint32_t reserved1 : 12; 4427ec681f3Smrg }; 4437ec681f3Smrg uint32_t dword01; 4447ec681f3Smrg }; 4457ec681f3Smrg}; 4467ec681f3Smrgstruct rgp_sqtt_marker_user_event_with_length { 4477ec681f3Smrg struct rgp_sqtt_marker_user_event user_event; 4487ec681f3Smrg uint32_t length; 4497ec681f3Smrg}; 4507ec681f3Smrg 4517ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_user_event) == 4, 4527ec681f3Smrg "rgp_sqtt_marker_user_event doesn't match RGP spec"); 4537ec681f3Smrg 4547ec681f3Smrgenum rgp_sqtt_marker_user_event_type 4557ec681f3Smrg{ 4567ec681f3Smrg UserEventTrigger = 0, 4577ec681f3Smrg UserEventPop, 4587ec681f3Smrg UserEventPush, 4597ec681f3Smrg UserEventObjectName, 4607ec681f3Smrg}; 4617ec681f3Smrg 4627ec681f3Smrg/** 4637ec681f3Smrg * "Pipeline bind" RGP SQTT instrumentation marker (Table 12) 4647ec681f3Smrg */ 4657ec681f3Smrgstruct rgp_sqtt_marker_pipeline_bind { 4667ec681f3Smrg union { 4677ec681f3Smrg struct { 4687ec681f3Smrg uint32_t identifier : 4; 4697ec681f3Smrg uint32_t ext_dwords : 3; 4707ec681f3Smrg uint32_t bind_point : 1; 4717ec681f3Smrg uint32_t cb_id : 20; 4727ec681f3Smrg uint32_t reserved : 4; 4737ec681f3Smrg }; 4747ec681f3Smrg uint32_t dword01; 4757ec681f3Smrg }; 4767ec681f3Smrg union { 4777ec681f3Smrg uint32_t api_pso_hash[2]; 4787ec681f3Smrg struct { 4797ec681f3Smrg uint32_t dword02; 4807ec681f3Smrg uint32_t dword03; 4817ec681f3Smrg }; 4827ec681f3Smrg }; 4837ec681f3Smrg}; 4847ec681f3Smrg 4857ec681f3Smrgstatic_assert(sizeof(struct rgp_sqtt_marker_pipeline_bind) == 12, 4867ec681f3Smrg "rgp_sqtt_marker_pipeline_bind doesn't match RGP spec"); 4877ec681f3Smrg 4887ec681f3Smrg 4897ec681f3Smrgbool ac_sqtt_add_pso_correlation(struct ac_thread_trace_data *thread_trace_data, 4907ec681f3Smrg uint64_t pipeline_hash); 4917ec681f3Smrg 4927ec681f3Smrgbool ac_sqtt_add_code_object_loader_event(struct ac_thread_trace_data *thread_trace_data, 4937ec681f3Smrg uint64_t pipeline_hash, 4947ec681f3Smrg uint64_t base_address); 4957ec681f3Smrg 4967ec681f3Smrg#endif 497