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