xref: /aosp_15_r20/external/mesa3d/src/amd/common/ac_spm.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2021 Valve Corporation
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_SPM_H
8*61046927SAndroid Build Coastguard Worker #define AC_SPM_H
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include <stdint.h>
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include "ac_perfcounter.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #define AC_SPM_MAX_COUNTER_PER_BLOCK 16
15*61046927SAndroid Build Coastguard Worker #define AC_SPM_GLOBAL_TIMESTAMP_COUNTERS 4 /* in unit of 16-bit counters*/
16*61046927SAndroid Build Coastguard Worker #define AC_SPM_NUM_COUNTER_PER_MUXSEL 16 /* 16 16-bit counters per muxsel */
17*61046927SAndroid Build Coastguard Worker #define AC_SPM_MUXSEL_LINE_SIZE ((AC_SPM_NUM_COUNTER_PER_MUXSEL * 2) / 4) /* in dwords */
18*61046927SAndroid Build Coastguard Worker #define AC_SPM_NUM_PERF_SEL 4
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker /* GFX10+ */
21*61046927SAndroid Build Coastguard Worker enum ac_spm_global_block {
22*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_CPG,
23*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_CPC,
24*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_CPF,
25*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GDS,
26*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GCR,
27*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_PH,
28*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GE,
29*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GE1 = AC_SPM_GLOBAL_BLOCK_GE,
30*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GL2A,
31*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GL2C,
32*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_SDMA,
33*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GUS,
34*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_EA,
35*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_CHA,
36*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_CHC,
37*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_CHCG,
38*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GPUVMATTCL2,
39*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GPUVMVML2,
40*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GE2SE, /* Per-SE counters */
41*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_GE2DIST,
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker     /* GFX11+ */
44*61046927SAndroid Build Coastguard Worker     /* gap */
45*61046927SAndroid Build Coastguard Worker     AC_SPM_GLOBAL_BLOCK_RSPM = 31,
46*61046927SAndroid Build Coastguard Worker };
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker enum ac_spm_se_block {
49*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_CB,
50*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_DB,
51*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_PA,
52*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_SX,
53*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_SC,
54*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_TA,
55*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_TD,
56*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_TCP,
57*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_SPI,
58*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_SQG,
59*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_GL1A,
60*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_RMI,
61*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_GL1C,
62*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_GL1CG,
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker     /* GFX11+ */
65*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_CBR,
66*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_DBR,
67*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_GL1H,
68*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_SQC,
69*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_PC,
70*61046927SAndroid Build Coastguard Worker     /* gap */
71*61046927SAndroid Build Coastguard Worker     AC_SPM_SE_BLOCK_SE_RPM = 31,
72*61046927SAndroid Build Coastguard Worker };
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker enum ac_spm_segment_type {
75*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_SE0,
76*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_SE1,
77*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_SE2,
78*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_SE3,
79*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_SE4,
80*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_SE5,
81*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_GLOBAL,
82*61046927SAndroid Build Coastguard Worker    AC_SPM_SEGMENT_TYPE_COUNT,
83*61046927SAndroid Build Coastguard Worker };
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker struct ac_spm_counter_descr {
86*61046927SAndroid Build Coastguard Worker    enum ac_pc_gpu_block gpu_block;
87*61046927SAndroid Build Coastguard Worker    uint32_t event_id;
88*61046927SAndroid Build Coastguard Worker };
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker struct ac_spm_counter_create_info {
91*61046927SAndroid Build Coastguard Worker    struct ac_spm_counter_descr *b;
92*61046927SAndroid Build Coastguard Worker    uint32_t instance;
93*61046927SAndroid Build Coastguard Worker };
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker union ac_spm_muxsel {
96*61046927SAndroid Build Coastguard Worker    struct {
97*61046927SAndroid Build Coastguard Worker       uint16_t counter      : 6;
98*61046927SAndroid Build Coastguard Worker       uint16_t block        : 4;
99*61046927SAndroid Build Coastguard Worker       uint16_t shader_array : 1; /* 0: SA0, 1: SA1 */
100*61046927SAndroid Build Coastguard Worker       uint16_t instance     : 5;
101*61046927SAndroid Build Coastguard Worker    } gfx10;
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    struct {
104*61046927SAndroid Build Coastguard Worker       uint16_t counter      : 5;
105*61046927SAndroid Build Coastguard Worker       uint16_t instance     : 5;
106*61046927SAndroid Build Coastguard Worker       uint16_t shader_array : 1;
107*61046927SAndroid Build Coastguard Worker       uint16_t block        : 5;
108*61046927SAndroid Build Coastguard Worker    } gfx11;
109*61046927SAndroid Build Coastguard Worker    uint16_t value;
110*61046927SAndroid Build Coastguard Worker };
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker struct ac_spm_muxsel_line {
113*61046927SAndroid Build Coastguard Worker    union ac_spm_muxsel muxsel[AC_SPM_NUM_COUNTER_PER_MUXSEL];
114*61046927SAndroid Build Coastguard Worker };
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker struct ac_spm_counter_info {
117*61046927SAndroid Build Coastguard Worker    /* General info. */
118*61046927SAndroid Build Coastguard Worker    enum ac_pc_gpu_block gpu_block;
119*61046927SAndroid Build Coastguard Worker    uint32_t instance;
120*61046927SAndroid Build Coastguard Worker    uint32_t event_id;
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker    /* Muxsel info. */
123*61046927SAndroid Build Coastguard Worker    enum ac_spm_segment_type segment_type;
124*61046927SAndroid Build Coastguard Worker    bool is_even;
125*61046927SAndroid Build Coastguard Worker    union ac_spm_muxsel muxsel;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    /* Output info. */
128*61046927SAndroid Build Coastguard Worker    uint64_t offset;
129*61046927SAndroid Build Coastguard Worker };
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker struct ac_spm_counter_select {
132*61046927SAndroid Build Coastguard Worker    uint8_t active; /* mask of used 16-bit counters. */
133*61046927SAndroid Build Coastguard Worker    uint32_t sel0;
134*61046927SAndroid Build Coastguard Worker    uint32_t sel1;
135*61046927SAndroid Build Coastguard Worker };
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker struct ac_spm_block_instance {
138*61046927SAndroid Build Coastguard Worker    uint32_t grbm_gfx_index;
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker    uint32_t num_counters;
141*61046927SAndroid Build Coastguard Worker    struct ac_spm_counter_select counters[AC_SPM_MAX_COUNTER_PER_BLOCK];
142*61046927SAndroid Build Coastguard Worker };
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker struct ac_spm_block_select {
145*61046927SAndroid Build Coastguard Worker    const struct ac_pc_block *b;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    uint32_t num_instances;
148*61046927SAndroid Build Coastguard Worker    struct ac_spm_block_instance *instances;
149*61046927SAndroid Build Coastguard Worker };
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker struct ac_spm {
152*61046927SAndroid Build Coastguard Worker    /* struct radeon_winsys_bo or struct pb_buffer */
153*61046927SAndroid Build Coastguard Worker    void *bo;
154*61046927SAndroid Build Coastguard Worker    void *ptr;
155*61046927SAndroid Build Coastguard Worker    uint8_t ptr_granularity;
156*61046927SAndroid Build Coastguard Worker    uint32_t buffer_size;
157*61046927SAndroid Build Coastguard Worker    uint16_t sample_interval;
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    /* Enabled counters. */
160*61046927SAndroid Build Coastguard Worker    unsigned num_counters;
161*61046927SAndroid Build Coastguard Worker    struct ac_spm_counter_info *counters;
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker    /* Block/counters selection. */
164*61046927SAndroid Build Coastguard Worker    uint32_t num_block_sel;
165*61046927SAndroid Build Coastguard Worker    struct ac_spm_block_select *block_sel;
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker    struct {
168*61046927SAndroid Build Coastguard Worker       uint32_t num_counters;
169*61046927SAndroid Build Coastguard Worker       struct ac_spm_counter_select counters[16];
170*61046927SAndroid Build Coastguard Worker    } sqg[AC_SPM_SEGMENT_TYPE_GLOBAL];
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    struct {
173*61046927SAndroid Build Coastguard Worker       uint32_t grbm_gfx_index;
174*61046927SAndroid Build Coastguard Worker       uint32_t num_counters;
175*61046927SAndroid Build Coastguard Worker       struct ac_spm_counter_select counters[16];
176*61046927SAndroid Build Coastguard Worker    } sq_wgp[AMD_MAX_WGP];
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker    /* Muxsel lines. */
179*61046927SAndroid Build Coastguard Worker    unsigned num_muxsel_lines[AC_SPM_SEGMENT_TYPE_COUNT];
180*61046927SAndroid Build Coastguard Worker    struct ac_spm_muxsel_line *muxsel_lines[AC_SPM_SEGMENT_TYPE_COUNT];
181*61046927SAndroid Build Coastguard Worker    unsigned max_se_muxsel_lines;
182*61046927SAndroid Build Coastguard Worker };
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker struct ac_spm_trace {
185*61046927SAndroid Build Coastguard Worker    void *ptr;
186*61046927SAndroid Build Coastguard Worker    uint16_t sample_interval;
187*61046927SAndroid Build Coastguard Worker    unsigned num_counters;
188*61046927SAndroid Build Coastguard Worker    struct ac_spm_counter_info *counters;
189*61046927SAndroid Build Coastguard Worker    uint32_t sample_size_in_bytes;
190*61046927SAndroid Build Coastguard Worker    uint32_t num_samples;
191*61046927SAndroid Build Coastguard Worker };
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker bool ac_init_spm(const struct radeon_info *info,
194*61046927SAndroid Build Coastguard Worker                  const struct ac_perfcounters *pc,
195*61046927SAndroid Build Coastguard Worker                  struct ac_spm *spm);
196*61046927SAndroid Build Coastguard Worker void ac_destroy_spm(struct ac_spm *spm);
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker void ac_spm_get_trace(const struct ac_spm *spm, struct ac_spm_trace *trace);
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker #endif
201