xref: /aosp_15_r20/external/mesa3d/src/amd/common/ac_perfcounter.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2015 Advanced Micro Devices, Inc.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #ifndef AC_PERFCOUNTER_H
8*61046927SAndroid Build Coastguard Worker #define AC_PERFCOUNTER_H
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include "sid.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #include "ac_gpu_info.h"
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker /* Max counters per HW block */
17*61046927SAndroid Build Coastguard Worker #define AC_QUERY_MAX_COUNTERS 16
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker #define AC_PC_SHADERS_WINDOWING (1u << 31)
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker enum ac_pc_block_flags
22*61046927SAndroid Build Coastguard Worker {
23*61046927SAndroid Build Coastguard Worker    /* This block is part of the shader engine */
24*61046927SAndroid Build Coastguard Worker    AC_PC_BLOCK_SE = (1 << 0),
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker    /* Expose per-instance groups instead of summing all instances (within
27*61046927SAndroid Build Coastguard Worker     * an SE). */
28*61046927SAndroid Build Coastguard Worker    AC_PC_BLOCK_INSTANCE_GROUPS = (1 << 1),
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker    /* Expose per-SE groups instead of summing instances across SEs. */
31*61046927SAndroid Build Coastguard Worker    AC_PC_BLOCK_SE_GROUPS = (1 << 2),
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker    /* Shader block */
34*61046927SAndroid Build Coastguard Worker    AC_PC_BLOCK_SHADER = (1 << 3),
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker    /* Non-shader block with perfcounters windowed by shaders. */
37*61046927SAndroid Build Coastguard Worker    AC_PC_BLOCK_SHADER_WINDOWED = (1 << 4),
38*61046927SAndroid Build Coastguard Worker };
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker enum ac_pc_gpu_block {
41*61046927SAndroid Build Coastguard Worker    CPF     = 0x0,
42*61046927SAndroid Build Coastguard Worker    IA      = 0x1,
43*61046927SAndroid Build Coastguard Worker    VGT     = 0x2,
44*61046927SAndroid Build Coastguard Worker    PA_SU   = 0x3,
45*61046927SAndroid Build Coastguard Worker    PA_SC   = 0x4,
46*61046927SAndroid Build Coastguard Worker    SPI     = 0x5,
47*61046927SAndroid Build Coastguard Worker    SQ      = 0x6,
48*61046927SAndroid Build Coastguard Worker    SX      = 0x7,
49*61046927SAndroid Build Coastguard Worker    TA      = 0x8,
50*61046927SAndroid Build Coastguard Worker    TD      = 0x9,
51*61046927SAndroid Build Coastguard Worker    TCP     = 0xA,
52*61046927SAndroid Build Coastguard Worker    TCC     = 0xB,
53*61046927SAndroid Build Coastguard Worker    TCA     = 0xC,
54*61046927SAndroid Build Coastguard Worker    DB      = 0xD,
55*61046927SAndroid Build Coastguard Worker    CB      = 0xE,
56*61046927SAndroid Build Coastguard Worker    GDS     = 0xF,
57*61046927SAndroid Build Coastguard Worker    SRBM    = 0x10,
58*61046927SAndroid Build Coastguard Worker    GRBM    = 0x11,
59*61046927SAndroid Build Coastguard Worker    GRBMSE  = 0x12,
60*61046927SAndroid Build Coastguard Worker    RLC     = 0x13,
61*61046927SAndroid Build Coastguard Worker    DMA     = 0x14,
62*61046927SAndroid Build Coastguard Worker    MC      = 0x15,
63*61046927SAndroid Build Coastguard Worker    CPG     = 0x16,
64*61046927SAndroid Build Coastguard Worker    CPC     = 0x17,
65*61046927SAndroid Build Coastguard Worker    WD      = 0x18,
66*61046927SAndroid Build Coastguard Worker    TCS     = 0x19,
67*61046927SAndroid Build Coastguard Worker    ATC     = 0x1A,
68*61046927SAndroid Build Coastguard Worker    ATCL2   = 0x1B,
69*61046927SAndroid Build Coastguard Worker    MCVML2  = 0x1C,
70*61046927SAndroid Build Coastguard Worker    EA      = 0x1D,
71*61046927SAndroid Build Coastguard Worker    RPB     = 0x1E,
72*61046927SAndroid Build Coastguard Worker    RMI     = 0x1F,
73*61046927SAndroid Build Coastguard Worker    UMCCH   = 0x20,
74*61046927SAndroid Build Coastguard Worker    GE      = 0x21,
75*61046927SAndroid Build Coastguard Worker    GE1     = GE,
76*61046927SAndroid Build Coastguard Worker    GL1A    = 0x22,
77*61046927SAndroid Build Coastguard Worker    GL1C    = 0x23,
78*61046927SAndroid Build Coastguard Worker    GL1CG   = 0x24,
79*61046927SAndroid Build Coastguard Worker    GL2A    = 0x25,
80*61046927SAndroid Build Coastguard Worker    GL2C    = 0x26,
81*61046927SAndroid Build Coastguard Worker    CHA     = 0x27,
82*61046927SAndroid Build Coastguard Worker    CHC     = 0x28,
83*61046927SAndroid Build Coastguard Worker    CHCG    = 0x29,
84*61046927SAndroid Build Coastguard Worker    GUS     = 0x2A,
85*61046927SAndroid Build Coastguard Worker    GCR     = 0x2B,
86*61046927SAndroid Build Coastguard Worker    PA_PH   = 0x2C,
87*61046927SAndroid Build Coastguard Worker    UTCL1   = 0x2D,
88*61046927SAndroid Build Coastguard Worker    GEDIST  = 0x2E,
89*61046927SAndroid Build Coastguard Worker    GESE    = 0x2F,
90*61046927SAndroid Build Coastguard Worker    DF      = 0x30,
91*61046927SAndroid Build Coastguard Worker    SQ_WGP  = 0x31, /* GFX11+ */
92*61046927SAndroid Build Coastguard Worker    NUM_GPU_BLOCK,
93*61046927SAndroid Build Coastguard Worker };
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker struct ac_pc_block_base {
96*61046927SAndroid Build Coastguard Worker    enum ac_pc_gpu_block gpu_block;
97*61046927SAndroid Build Coastguard Worker    const char *name;
98*61046927SAndroid Build Coastguard Worker    unsigned num_counters;
99*61046927SAndroid Build Coastguard Worker    unsigned flags;
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker    unsigned select_or;
102*61046927SAndroid Build Coastguard Worker    unsigned *select0;
103*61046927SAndroid Build Coastguard Worker    unsigned counter0_lo;
104*61046927SAndroid Build Coastguard Worker    unsigned *counters;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    /* SPM */
107*61046927SAndroid Build Coastguard Worker    unsigned num_spm_counters;
108*61046927SAndroid Build Coastguard Worker    unsigned num_spm_wires;
109*61046927SAndroid Build Coastguard Worker    unsigned *select1;
110*61046927SAndroid Build Coastguard Worker    unsigned spm_block_select;
111*61046927SAndroid Build Coastguard Worker };
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker struct ac_pc_block_gfxdescr {
114*61046927SAndroid Build Coastguard Worker    struct ac_pc_block_base *b;
115*61046927SAndroid Build Coastguard Worker    unsigned selectors;
116*61046927SAndroid Build Coastguard Worker    unsigned instances;
117*61046927SAndroid Build Coastguard Worker };
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker struct ac_pc_block {
120*61046927SAndroid Build Coastguard Worker    const struct ac_pc_block_gfxdescr *b;
121*61046927SAndroid Build Coastguard Worker    unsigned num_instances;
122*61046927SAndroid Build Coastguard Worker    unsigned num_global_instances;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    unsigned num_groups;
125*61046927SAndroid Build Coastguard Worker    char *group_names;
126*61046927SAndroid Build Coastguard Worker    unsigned group_name_stride;
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker    char *selector_names;
129*61046927SAndroid Build Coastguard Worker    unsigned selector_name_stride;
130*61046927SAndroid Build Coastguard Worker };
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker struct ac_perfcounters {
133*61046927SAndroid Build Coastguard Worker    unsigned num_groups;
134*61046927SAndroid Build Coastguard Worker    unsigned num_blocks;
135*61046927SAndroid Build Coastguard Worker    struct ac_pc_block *blocks;
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker    bool separate_se;
138*61046927SAndroid Build Coastguard Worker    bool separate_instance;
139*61046927SAndroid Build Coastguard Worker };
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker /* The order is chosen to be compatible with GPUPerfStudio's hardcoding of
142*61046927SAndroid Build Coastguard Worker  * performance counter group IDs.
143*61046927SAndroid Build Coastguard Worker  */
144*61046927SAndroid Build Coastguard Worker static const char *const ac_pc_shader_type_suffixes[] = {"",    "_ES", "_GS", "_VS",
145*61046927SAndroid Build Coastguard Worker                                                          "_PS", "_LS", "_HS", "_CS"};
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker static const unsigned ac_pc_shader_type_bits[] = {
148*61046927SAndroid Build Coastguard Worker    0x7f,
149*61046927SAndroid Build Coastguard Worker    S_036780_ES_EN(1),
150*61046927SAndroid Build Coastguard Worker    S_036780_GS_EN(1),
151*61046927SAndroid Build Coastguard Worker    S_036780_VS_EN(1),
152*61046927SAndroid Build Coastguard Worker    S_036780_PS_EN(1),
153*61046927SAndroid Build Coastguard Worker    S_036780_LS_EN(1),
154*61046927SAndroid Build Coastguard Worker    S_036780_HS_EN(1),
155*61046927SAndroid Build Coastguard Worker    S_036780_CS_EN(1),
156*61046927SAndroid Build Coastguard Worker };
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker static inline bool
ac_pc_block_has_per_se_groups(const struct ac_perfcounters * pc,const struct ac_pc_block * block)159*61046927SAndroid Build Coastguard Worker ac_pc_block_has_per_se_groups(const struct ac_perfcounters *pc,
160*61046927SAndroid Build Coastguard Worker                               const struct ac_pc_block *block)
161*61046927SAndroid Build Coastguard Worker {
162*61046927SAndroid Build Coastguard Worker    return block->b->b->flags & AC_PC_BLOCK_SE_GROUPS ||
163*61046927SAndroid Build Coastguard Worker           (block->b->b->flags & AC_PC_BLOCK_SE && pc->separate_se);
164*61046927SAndroid Build Coastguard Worker }
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker static inline bool
ac_pc_block_has_per_instance_groups(const struct ac_perfcounters * pc,const struct ac_pc_block * block)167*61046927SAndroid Build Coastguard Worker ac_pc_block_has_per_instance_groups(const struct ac_perfcounters *pc,
168*61046927SAndroid Build Coastguard Worker                                     const struct ac_pc_block *block)
169*61046927SAndroid Build Coastguard Worker {
170*61046927SAndroid Build Coastguard Worker    return block->b->b->flags & AC_PC_BLOCK_INSTANCE_GROUPS ||
171*61046927SAndroid Build Coastguard Worker           (block->num_instances > 1 && pc->separate_instance);
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker struct ac_pc_block *ac_lookup_counter(const struct ac_perfcounters *pc,
175*61046927SAndroid Build Coastguard Worker                                       unsigned index, unsigned *base_gid,
176*61046927SAndroid Build Coastguard Worker                                       unsigned *sub_index);
177*61046927SAndroid Build Coastguard Worker struct ac_pc_block *ac_lookup_group(const struct ac_perfcounters *pc,
178*61046927SAndroid Build Coastguard Worker                                     unsigned *index);
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker struct ac_pc_block *ac_pc_get_block(const struct ac_perfcounters *pc,
181*61046927SAndroid Build Coastguard Worker                                     enum ac_pc_gpu_block gpu_block);
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker bool ac_init_block_names(const struct radeon_info *info,
184*61046927SAndroid Build Coastguard Worker                          const struct ac_perfcounters *pc,
185*61046927SAndroid Build Coastguard Worker                          struct ac_pc_block *block);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker bool ac_init_perfcounters(const struct radeon_info *info,
188*61046927SAndroid Build Coastguard Worker                           bool separate_se,
189*61046927SAndroid Build Coastguard Worker                           bool separate_instance,
190*61046927SAndroid Build Coastguard Worker                           struct ac_perfcounters *pc);
191*61046927SAndroid Build Coastguard Worker void ac_destroy_perfcounters(struct ac_perfcounters *pc);
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker #endif
194