2 * Copyright (c) 2017 Etnaviv Project
3 * Copyright (C) 2017 Zodiac Inflight Innovations
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
25 * Christian Gmeiner <christian.gmeiner@gmail.com>
28 #include "etnaviv_context.h"
29 #include "etnaviv_perfmon.h"
30 #include "etnaviv_screen.h"
32 static const char *group_names
[] = {
33 [ETNA_QUERY_HI_GROUP_ID
] = "HI",
34 [ETNA_QUERY_PE_GROUP_ID
] = "PE",
35 [ETNA_QUERY_SH_GROUP_ID
] = "SH",
36 [ETNA_QUERY_PA_GROUP_ID
] = "PA",
37 [ETNA_QUERY_SE_GROUP_ID
] = "SE",
38 [ETNA_QUERY_RA_GROUP_ID
] = "RA",
39 [ETNA_QUERY_TX_GROUP_ID
] = "TX",
40 [ETNA_QUERY_MC_GROUP_ID
] = "MC",
43 static const struct etna_perfmon_config query_config
[] = {
45 .name
= "hi-total-cycles",
46 .type
= ETNA_QUERY_HI_TOTAL_CYCLES
,
47 .group_id
= ETNA_QUERY_HI_GROUP_ID
,
48 .source
= (const struct etna_perfmon_source
[]) {
49 { "HI", "TOTAL_CYCLES" }
53 .name
= "hi-idle-cycles",
54 .type
= ETNA_QUERY_HI_IDLE_CYCLES
,
55 .group_id
= ETNA_QUERY_HI_GROUP_ID
,
56 .source
= (const struct etna_perfmon_source
[]) {
57 { "HI", "IDLE_CYCLES" }
61 .name
= "hi-axi-cycles-read-request-stalled",
62 .type
= ETNA_QUERY_HI_AXI_CYCLES_READ_REQUEST_STALLED
,
63 .group_id
= ETNA_QUERY_HI_GROUP_ID
,
64 .source
= (const struct etna_perfmon_source
[]) {
65 { "HI", "AXI_CYCLES_READ_REQUEST_STALLED" }
69 .name
= "hi-axi-cycles-write-request-stalled",
70 .type
= ETNA_QUERY_HI_AXI_CYCLES_WRITE_REQUEST_STALLED
,
71 .group_id
= ETNA_QUERY_HI_GROUP_ID
,
72 .source
= (const struct etna_perfmon_source
[]) {
73 { "HI", "AXI_CYCLES_WRITE_REQUEST_STALLED" }
77 .name
= "hi-axi-cycles-write-data-stalled",
78 .type
= ETNA_QUERY_HI_AXI_CYCLES_WRITE_DATA_STALLED
,
79 .group_id
= ETNA_QUERY_HI_GROUP_ID
,
80 .source
= (const struct etna_perfmon_source
[]) {
81 { "HI", "AXI_CYCLES_WRITE_DATA_STALLED" }
85 .name
= "pe-pixel-count-killed-by-color-pipe",
86 .type
= ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_COLOR_PIPE
,
87 .group_id
= ETNA_QUERY_PE_GROUP_ID
,
88 .source
= (const struct etna_perfmon_source
[]) {
89 { "PE", "PIXEL_COUNT_KILLED_BY_COLOR_PIPE" }
93 .name
= "pe-pixel-count-killed-by-depth-pipe",
94 .type
= ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_DEPTH_PIPE
,
95 .group_id
= ETNA_QUERY_PE_GROUP_ID
,
96 .source
= (const struct etna_perfmon_source
[]) {
97 { "PE", "PIXEL_COUNT_KILLED_BY_DEPTH_PIPE" }
101 .name
= "pe-pixel-count-drawn-by-color-pipe",
102 .type
= ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_COLOR_PIPE
,
103 .group_id
= ETNA_QUERY_PE_GROUP_ID
,
104 .source
= (const struct etna_perfmon_source
[]) {
105 { "PE", "PIXEL_COUNT_DRAWN_BY_COLOR_PIPE" }
109 .name
= "pe-pixel-count-drawn-by-depth-pipe",
110 .type
= ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE
,
111 .group_id
= ETNA_QUERY_PE_GROUP_ID
,
112 .source
= (const struct etna_perfmon_source
[]) {
113 { "PE", "PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE" }
117 .name
= "sh-shader-cycles",
118 .type
= ETNA_QUERY_SH_SHADER_CYCLES
,
119 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
120 .source
= (const struct etna_perfmon_source
[]) {
121 { "SH", "SHADER_CYCLES" }
125 .name
= "sh-ps-inst-counter",
126 .type
= ETNA_QUERY_SH_PS_INST_COUNTER
,
127 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
128 .source
= (const struct etna_perfmon_source
[]) {
129 { "SH", "PS_INST_COUNTER" }
133 .name
= "sh-rendered-pixel-counter",
134 .type
= ETNA_QUERY_SH_RENDERED_PIXEL_COUNTER
,
135 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
136 .source
= (const struct etna_perfmon_source
[]) {
137 { "SH", "RENDERED_PIXEL_COUNTER" }
141 .name
= "sh-vs-inst-counter",
142 .type
= ETNA_QUERY_SH_VS_INST_COUNTER
,
143 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
144 .source
= (const struct etna_perfmon_source
[]) {
145 { "SH", "VS_INST_COUNTER" }
149 .name
= "sh-rendered-vertice-counter",
150 .type
= ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER
,
151 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
152 .source
= (const struct etna_perfmon_source
[]) {
153 { "SH", "RENDERED_VERTICE_COUNTER" }
157 .name
= "sh-vtx-branch-inst-counter",
158 .type
= ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER
,
159 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
160 .source
= (const struct etna_perfmon_source
[]) {
161 { "SH", "VTX_BRANCH_INST_COUNTER" }
165 .name
= "sh-vtx-texld-inst-counter",
166 .type
= ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER
,
167 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
168 .source
= (const struct etna_perfmon_source
[]) {
169 { "SH", "VTX_TEXLD_INST_COUNTER" }
173 .name
= "sh-plx-branch-inst-counter",
174 .type
= ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER
,
175 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
176 .source
= (const struct etna_perfmon_source
[]) {
177 { "SH", "PXL_BRANCH_INST_COUNTER" }
181 .name
= "sh-plx-texld-inst-counter",
182 .type
= ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER
,
183 .group_id
= ETNA_QUERY_SH_GROUP_ID
,
184 .source
= (const struct etna_perfmon_source
[]) {
185 { "SH", "PXL_TEXLD_INST_COUNTER" }
189 .name
= "pa-input-vtx-counter",
190 .type
= ETNA_QUERY_PA_INPUT_VTX_COUNTER
,
191 .group_id
= ETNA_QUERY_PA_GROUP_ID
,
192 .source
= (const struct etna_perfmon_source
[]) {
193 { "PA", "INPUT_VTX_COUNTER" }
197 .name
= "pa-input-prim-counter",
198 .type
= ETNA_QUERY_PA_INPUT_PRIM_COUNTER
,
199 .group_id
= ETNA_QUERY_PA_GROUP_ID
,
200 .source
= (const struct etna_perfmon_source
[]) {
201 { "PA", "INPUT_PRIM_COUNTER" }
205 .name
= "pa-output-prim-counter",
206 .type
= ETNA_QUERY_PA_OUTPUT_PRIM_COUNTER
,
207 .group_id
= ETNA_QUERY_PA_GROUP_ID
,
208 .source
= (const struct etna_perfmon_source
[]) {
209 { "PA", "OUTPUT_PRIM_COUNTER" }
213 .name
= "pa-depth-clipped-counter",
214 .type
= ETNA_QUERY_PA_DEPTH_CLIPPED_COUNTER
,
215 .group_id
= ETNA_QUERY_PA_GROUP_ID
,
216 .source
= (const struct etna_perfmon_source
[]) {
217 { "PA", "DEPTH_CLIPPED_COUNTER" }
221 .name
= "pa-trivial-rejected-counter",
222 .type
= ETNA_QUERY_PA_TRIVIAL_REJECTED_COUNTER
,
223 .group_id
= ETNA_QUERY_PA_GROUP_ID
,
224 .source
= (const struct etna_perfmon_source
[]) {
225 { "PA", "TRIVIAL_REJECTED_COUNTER" }
229 .name
= "pa-culled-counter",
230 .type
= ETNA_QUERY_PA_CULLED_COUNTER
,
231 .group_id
= ETNA_QUERY_PA_GROUP_ID
,
232 .source
= (const struct etna_perfmon_source
[]) {
233 { "PA", "CULLED_COUNTER" }
237 .name
= "se-culled-triangle-count",
238 .type
= ETNA_QUERY_SE_CULLED_TRIANGLE_COUNT
,
239 .group_id
= ETNA_QUERY_SE_GROUP_ID
,
240 .source
= (const struct etna_perfmon_source
[]) {
241 { "SE", "CULLED_TRIANGLE_COUNT" }
245 .name
= "se-culled-lines-count",
246 .type
= ETNA_QUERY_SE_CULLED_LINES_COUNT
,
247 .group_id
= ETNA_QUERY_SE_GROUP_ID
,
248 .source
= (const struct etna_perfmon_source
[]) {
249 { "SE", "CULLED_LINES_COUNT" }
253 .name
= "ra-valid-pixel-count",
254 .type
= ETNA_QUERY_RA_VALID_PIXEL_COUNT
,
255 .group_id
= ETNA_QUERY_RA_GROUP_ID
,
256 .source
= (const struct etna_perfmon_source
[]) {
257 { "RA", "VALID_PIXEL_COUNT" }
261 .name
= "ra-total-quad-count",
262 .type
= ETNA_QUERY_RA_TOTAL_QUAD_COUNT
,
263 .group_id
= ETNA_QUERY_RA_GROUP_ID
,
264 .source
= (const struct etna_perfmon_source
[]) {
265 { "RA", "TOTAL_QUAD_COUNT" }
269 .name
= "ra-valid-quad-count-after-early-z",
270 .type
= ETNA_QUERY_RA_VALID_QUAD_COUNT_AFTER_EARLY_Z
,
271 .group_id
= ETNA_QUERY_RA_GROUP_ID
,
272 .source
= (const struct etna_perfmon_source
[]) {
273 { "RA", "VALID_QUAD_COUNT_AFTER_EARLY_Z" }
277 .name
= "ra-total-primitive-count",
278 .type
= ETNA_QUERY_RA_TOTAL_PRIMITIVE_COUNT
,
279 .group_id
= ETNA_QUERY_RA_GROUP_ID
,
280 .source
= (const struct etna_perfmon_source
[]) {
281 { "RA", "TOTAL_PRIMITIVE_COUNT" }
285 .name
= "ra-pipe-cache-miss-counter",
286 .type
= ETNA_QUERY_RA_PIPE_CACHE_MISS_COUNTER
,
287 .group_id
= ETNA_QUERY_RA_GROUP_ID
,
288 .source
= (const struct etna_perfmon_source
[]) {
289 { "RA", "PIPE_CACHE_MISS_COUNTER" }
293 .name
= "ra-prefetch-cache-miss-counter",
294 .type
= ETNA_QUERY_RA_PREFETCH_CACHE_MISS_COUNTER
,
295 .group_id
= ETNA_QUERY_RA_GROUP_ID
,
296 .source
= (const struct etna_perfmon_source
[]) {
297 { "RA", "PREFETCH_CACHE_MISS_COUNTER" }
301 .name
= "ra-pculled-quad-count",
302 .type
= ETNA_QUERY_RA_CULLED_QUAD_COUNT
,
303 .group_id
= ETNA_QUERY_RA_GROUP_ID
,
304 .source
= (const struct etna_perfmon_source
[]) {
305 { "RA", "CULLED_QUAD_COUNT" }
309 .name
= "tx-total-bilinear-requests",
310 .type
= ETNA_QUERY_TX_TOTAL_BILINEAR_REQUESTS
,
311 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
312 .source
= (const struct etna_perfmon_source
[]) {
313 { "TX", "TOTAL_BILINEAR_REQUESTS" }
317 .name
= "tx-total-trilinear-requests",
318 .type
= ETNA_QUERY_TX_TOTAL_TRILINEAR_REQUESTS
,
319 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
320 .source
= (const struct etna_perfmon_source
[]) {
321 { "TX", "TOTAL_TRILINEAR_REQUESTS" }
325 .name
= "tx-total-discarded-texture-requests",
326 .type
= ETNA_QUERY_TX_TOTAL_DISCARDED_TEXTURE_REQUESTS
,
327 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
328 .source
= (const struct etna_perfmon_source
[]) {
329 { "TX", "TOTAL_DISCARDED_TEXTURE_REQUESTS" }
333 .name
= "tx-total-texture-requests",
334 .type
= ETNA_QUERY_TX_TOTAL_TEXTURE_REQUESTS
,
335 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
336 .source
= (const struct etna_perfmon_source
[]) {
337 { "TX", "TOTAL_TEXTURE_REQUESTS" }
341 .name
= "tx-mem-read-count",
342 .type
= ETNA_QUERY_TX_MEM_READ_COUNT
,
343 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
344 .source
= (const struct etna_perfmon_source
[]) {
345 { "TX", "MEM_READ_COUNT" }
349 .name
= "tx-mem-read-in-8b-count",
350 .type
= ETNA_QUERY_TX_MEM_READ_IN_8B_COUNT
,
351 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
352 .source
= (const struct etna_perfmon_source
[]) {
353 { "TX", "MEM_READ_IN_8B_COUNT" }
357 .name
= "tx-cache-miss-count",
358 .type
= ETNA_QUERY_TX_CACHE_MISS_COUNT
,
359 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
360 .source
= (const struct etna_perfmon_source
[]) {
361 { "TX", "CACHE_MISS_COUNT" }
365 .name
= "tx-cache-hit-texel-count",
366 .type
= ETNA_QUERY_TX_CACHE_HIT_TEXEL_COUNT
,
367 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
368 .source
= (const struct etna_perfmon_source
[]) {
369 { "TX", "CACHE_HIT_TEXEL_COUNT" }
373 .name
= "tx-cache-miss-texel-count",
374 .type
= ETNA_QUERY_TX_CACHE_MISS_TEXEL_COUNT
,
375 .group_id
= ETNA_QUERY_TX_GROUP_ID
,
376 .source
= (const struct etna_perfmon_source
[]) {
377 { "TX", "CACHE_MISS_TEXEL_COUNT" }
381 .name
= "mc-total-read-req-8b-from-pipeline",
382 .type
= ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_PIPELINE
,
383 .group_id
= ETNA_QUERY_MC_GROUP_ID
,
384 .source
= (const struct etna_perfmon_source
[]) {
385 { "MC", "TOTAL_READ_REQ_8B_FROM_PIPELINE" }
389 .name
= "mc-total-read-req-8b-from-ip",
390 .type
= ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_IP
,
391 .group_id
= ETNA_QUERY_MC_GROUP_ID
,
392 .source
= (const struct etna_perfmon_source
[]) {
393 { "MC", "TOTAL_READ_REQ_8B_FROM_IP" }
397 .name
= "mc-total-write-req-8b-from-pipeline",
398 .type
= ETNA_QUERY_MC_TOTAL_WRITE_REQ_8B_FROM_PIPELINE
,
399 .group_id
= ETNA_QUERY_MC_GROUP_ID
,
400 .source
= (const struct etna_perfmon_source
[]) {
401 { "MC", "TOTAL_WRITE_REQ_8B_FROM_PIPELINE" }
406 struct etna_perfmon_signal
*
407 etna_pm_query_signal(struct etna_perfmon
*perfmon
,
408 const struct etna_perfmon_source
*source
)
410 struct etna_perfmon_domain
*domain
;
412 domain
= etna_perfmon_get_dom_by_name(perfmon
, source
->domain
);
416 return etna_perfmon_get_sig_by_name(domain
, source
->signal
);
420 etna_pm_query_setup(struct etna_screen
*screen
)
422 screen
->perfmon
= etna_perfmon_create(screen
->pipe
);
424 if (!screen
->perfmon
)
427 for (unsigned i
= 0; i
< ARRAY_SIZE(query_config
); i
++) {
428 const struct etna_perfmon_config
*cfg
= &query_config
[i
];
430 if (!etna_pm_cfg_supported(screen
->perfmon
, cfg
))
433 util_dynarray_append(&screen
->supported_pm_queries
, unsigned, i
);
437 const struct etna_perfmon_config
*
438 etna_pm_query_config(unsigned type
)
440 for (unsigned i
= 0; i
< ARRAY_SIZE(query_config
); i
++)
441 if (query_config
[i
].type
== type
)
442 return &query_config
[i
];
448 etna_pm_get_driver_query_info(struct pipe_screen
*pscreen
, unsigned index
,
449 struct pipe_driver_query_info
*info
)
451 const struct etna_screen
*screen
= etna_screen(pscreen
);
452 const unsigned num
= screen
->supported_pm_queries
.size
/ sizeof(unsigned);
461 i
= *util_dynarray_element(&screen
->supported_pm_queries
, unsigned, index
);
462 assert(i
< ARRAY_SIZE(query_config
));
464 info
->name
= query_config
[i
].name
;
465 info
->query_type
= query_config
[i
].type
;
466 info
->group_id
= query_config
[i
].group_id
;
472 unsigned query_count(unsigned group
)
476 for (unsigned i
= 0; i
< ARRAY_SIZE(query_config
); i
++)
477 if (query_config
[i
].group_id
== group
)
486 etna_pm_get_driver_query_group_info(struct pipe_screen
*pscreen
,
488 struct pipe_driver_query_group_info
*info
)
491 return ARRAY_SIZE(group_names
);
493 if (index
>= ARRAY_SIZE(group_names
))
496 unsigned count
= query_count(index
);
498 info
->name
= group_names
[index
];
499 info
->max_active_queries
= count
;
500 info
->num_queries
= count
;