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