1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2018 Rob Clark <[email protected]> 3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*61046927SAndroid Build Coastguard Worker * 5*61046927SAndroid Build Coastguard Worker * Authors: 6*61046927SAndroid Build Coastguard Worker * Rob Clark <[email protected]> 7*61046927SAndroid Build Coastguard Worker */ 8*61046927SAndroid Build Coastguard Worker 9*61046927SAndroid Build Coastguard Worker #ifndef FREEDRENO_PERFCNTR_H_ 10*61046927SAndroid Build Coastguard Worker #define FREEDRENO_PERFCNTR_H_ 11*61046927SAndroid Build Coastguard Worker 12*61046927SAndroid Build Coastguard Worker #include "util/macros.h" 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Worker #include "freedreno_dev_info.h" 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 17*61046927SAndroid Build Coastguard Worker extern "C" { 18*61046927SAndroid Build Coastguard Worker #endif 19*61046927SAndroid Build Coastguard Worker 20*61046927SAndroid Build Coastguard Worker /* 21*61046927SAndroid Build Coastguard Worker * Mapping very closely to the AMD_performance_monitor extension, adreno has 22*61046927SAndroid Build Coastguard Worker * groups of performance counters where each group has N counters, which can 23*61046927SAndroid Build Coastguard Worker * select from M different countables (things that can be counted), where 24*61046927SAndroid Build Coastguard Worker * generally M > N. 25*61046927SAndroid Build Coastguard Worker */ 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker /* Describes a single counter: */ 28*61046927SAndroid Build Coastguard Worker struct fd_perfcntr_counter { 29*61046927SAndroid Build Coastguard Worker /* offset of the select register to choose what to count: */ 30*61046927SAndroid Build Coastguard Worker unsigned select_reg; 31*61046927SAndroid Build Coastguard Worker /* offset of the lo/hi 32b to read current counter value: */ 32*61046927SAndroid Build Coastguard Worker unsigned counter_reg_lo; 33*61046927SAndroid Build Coastguard Worker unsigned counter_reg_hi; 34*61046927SAndroid Build Coastguard Worker /* Optional, most counters don't have enable/clear registers: */ 35*61046927SAndroid Build Coastguard Worker unsigned enable; 36*61046927SAndroid Build Coastguard Worker unsigned clear; 37*61046927SAndroid Build Coastguard Worker }; 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker enum fd_perfcntr_type { 40*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_UINT64, 41*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_UINT, 42*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_FLOAT, 43*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_PERCENTAGE, 44*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_BYTES, 45*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_MICROSECONDS, 46*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_HZ, 47*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_DBM, 48*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_TEMPERATURE, 49*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_VOLTS, 50*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_AMPS, 51*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_TYPE_WATTS, 52*61046927SAndroid Build Coastguard Worker }; 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker /* Whether an average value per frame or a cumulative value should be 55*61046927SAndroid Build Coastguard Worker * displayed. 56*61046927SAndroid Build Coastguard Worker */ 57*61046927SAndroid Build Coastguard Worker enum fd_perfcntr_result_type { 58*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_RESULT_TYPE_AVERAGE, 59*61046927SAndroid Build Coastguard Worker FD_PERFCNTR_RESULT_TYPE_CUMULATIVE, 60*61046927SAndroid Build Coastguard Worker }; 61*61046927SAndroid Build Coastguard Worker 62*61046927SAndroid Build Coastguard Worker /* Describes a single countable: */ 63*61046927SAndroid Build Coastguard Worker struct fd_perfcntr_countable { 64*61046927SAndroid Build Coastguard Worker const char *name; 65*61046927SAndroid Build Coastguard Worker /* selector register enum value to select this countable: */ 66*61046927SAndroid Build Coastguard Worker unsigned selector; 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker /* description of the countable: */ 69*61046927SAndroid Build Coastguard Worker enum fd_perfcntr_type query_type; 70*61046927SAndroid Build Coastguard Worker enum fd_perfcntr_result_type result_type; 71*61046927SAndroid Build Coastguard Worker }; 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker /* Describes an entire counter group: */ 74*61046927SAndroid Build Coastguard Worker struct fd_perfcntr_group { 75*61046927SAndroid Build Coastguard Worker const char *name; 76*61046927SAndroid Build Coastguard Worker unsigned num_counters; 77*61046927SAndroid Build Coastguard Worker const struct fd_perfcntr_counter *counters; 78*61046927SAndroid Build Coastguard Worker unsigned num_countables; 79*61046927SAndroid Build Coastguard Worker const struct fd_perfcntr_countable *countables; 80*61046927SAndroid Build Coastguard Worker }; 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker const struct fd_perfcntr_group *fd_perfcntrs(const struct fd_dev_id *id, unsigned *count); 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker #define COUNTER_BASE(_sel, _lo, _hi) { \ 85*61046927SAndroid Build Coastguard Worker .select_reg = _sel, .counter_reg_lo = _lo, .counter_reg_hi = _hi, \ 86*61046927SAndroid Build Coastguard Worker } 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker #define COUNTER(_sel, _lo, _hi) COUNTER_BASE(REG(_sel), REG(_lo), REG(_hi)) 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Worker #define COUNTER2(_sel, _lo, _hi, _en, _clr) { \ 91*61046927SAndroid Build Coastguard Worker .select_reg = REG(_sel), .counter_reg_lo = REG(_lo), \ 92*61046927SAndroid Build Coastguard Worker .counter_reg_hi = REG(_hi), .enable = REG(_en), .clear = REG(_clr), \ 93*61046927SAndroid Build Coastguard Worker } 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker #define COUNTABLE_BASE(_sel_name, _sel, _query_type, _result_type ) { \ 96*61046927SAndroid Build Coastguard Worker .name = _sel_name, .selector = _sel, \ 97*61046927SAndroid Build Coastguard Worker .query_type = FD_PERFCNTR_TYPE_##_query_type, \ 98*61046927SAndroid Build Coastguard Worker .result_type = FD_PERFCNTR_RESULT_TYPE_##_result_type, \ 99*61046927SAndroid Build Coastguard Worker } 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Worker #define COUNTABLE(_selector, _query_type, _result_type) \ 102*61046927SAndroid Build Coastguard Worker COUNTABLE_BASE(#_selector, _selector, _query_type, _result_type) 103*61046927SAndroid Build Coastguard Worker 104*61046927SAndroid Build Coastguard Worker #define GROUP(_name, _counters, _countables) { \ 105*61046927SAndroid Build Coastguard Worker .name = _name, .num_counters = ARRAY_SIZE(_counters), \ 106*61046927SAndroid Build Coastguard Worker .counters = _counters, .num_countables = ARRAY_SIZE(_countables), \ 107*61046927SAndroid Build Coastguard Worker .countables = _countables, \ 108*61046927SAndroid Build Coastguard Worker } 109*61046927SAndroid Build Coastguard Worker 110*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 111*61046927SAndroid Build Coastguard Worker } /* end of extern "C" */ 112*61046927SAndroid Build Coastguard Worker #endif 113*61046927SAndroid Build Coastguard Worker 114*61046927SAndroid Build Coastguard Worker #endif /* FREEDRENO_PERFCNTR_H_ */ 115