xref: /aosp_15_r20/external/mesa3d/src/freedreno/perfcntrs/freedreno_perfcntr.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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