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