17ec681f3Smrg/*
27ec681f3Smrg * Copyright (c) 2017 Etnaviv Project
37ec681f3Smrg * Copyright (C) 2017 Zodiac Inflight Innovations
47ec681f3Smrg *
57ec681f3Smrg * Permission is hereby granted, free of charge, to any person obtaining a
67ec681f3Smrg * copy of this software and associated documentation files (the "Software"),
77ec681f3Smrg * to deal in the Software without restriction, including without limitation
87ec681f3Smrg * the rights to use, copy, modify, merge, publish, distribute, sub license,
97ec681f3Smrg * and/or sell copies of the Software, and to permit persons to whom the
107ec681f3Smrg * Software is furnished to do so, subject to the following conditions:
117ec681f3Smrg *
127ec681f3Smrg * The above copyright notice and this permission notice (including the
137ec681f3Smrg * next paragraph) shall be included in all copies or substantial portions
147ec681f3Smrg * of the Software.
157ec681f3Smrg *
167ec681f3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
177ec681f3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
187ec681f3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
197ec681f3Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
207ec681f3Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
217ec681f3Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
227ec681f3Smrg * DEALINGS IN THE SOFTWARE.
237ec681f3Smrg *
247ec681f3Smrg * Authors:
257ec681f3Smrg *    Christian Gmeiner <christian.gmeiner@gmail.com>
267ec681f3Smrg */
277ec681f3Smrg
287ec681f3Smrg#include "etnaviv_context.h"
297ec681f3Smrg#include "etnaviv_perfmon.h"
307ec681f3Smrg#include "etnaviv_screen.h"
317ec681f3Smrg
327ec681f3Smrgstatic const char *group_names[] = {
337ec681f3Smrg   [ETNA_QUERY_HI_GROUP_ID] = "HI",
347ec681f3Smrg   [ETNA_QUERY_PE_GROUP_ID] = "PE",
357ec681f3Smrg   [ETNA_QUERY_SH_GROUP_ID] = "SH",
367ec681f3Smrg   [ETNA_QUERY_PA_GROUP_ID] = "PA",
377ec681f3Smrg   [ETNA_QUERY_SE_GROUP_ID] = "SE",
387ec681f3Smrg   [ETNA_QUERY_RA_GROUP_ID] = "RA",
397ec681f3Smrg   [ETNA_QUERY_TX_GROUP_ID] = "TX",
407ec681f3Smrg   [ETNA_QUERY_MC_GROUP_ID] = "MC",
417ec681f3Smrg};
427ec681f3Smrg
437ec681f3Smrgstatic const struct etna_perfmon_config query_config[] = {
447ec681f3Smrg   {
457ec681f3Smrg      .name = "hi-total-cycles",
467ec681f3Smrg      .type = ETNA_QUERY_HI_TOTAL_CYCLES,
477ec681f3Smrg      .group_id = ETNA_QUERY_HI_GROUP_ID,
487ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
497ec681f3Smrg         { "HI", "TOTAL_CYCLES" }
507ec681f3Smrg      }
517ec681f3Smrg   },
527ec681f3Smrg   {
537ec681f3Smrg      .name = "hi-idle-cycles",
547ec681f3Smrg      .type = ETNA_QUERY_HI_IDLE_CYCLES,
557ec681f3Smrg      .group_id = ETNA_QUERY_HI_GROUP_ID,
567ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
577ec681f3Smrg         { "HI", "IDLE_CYCLES" }
587ec681f3Smrg      }
597ec681f3Smrg   },
607ec681f3Smrg   {
617ec681f3Smrg      .name = "hi-axi-cycles-read-request-stalled",
627ec681f3Smrg      .type = ETNA_QUERY_HI_AXI_CYCLES_READ_REQUEST_STALLED,
637ec681f3Smrg      .group_id = ETNA_QUERY_HI_GROUP_ID,
647ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
657ec681f3Smrg         { "HI", "AXI_CYCLES_READ_REQUEST_STALLED" }
667ec681f3Smrg      }
677ec681f3Smrg   },
687ec681f3Smrg   {
697ec681f3Smrg      .name = "hi-axi-cycles-write-request-stalled",
707ec681f3Smrg      .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_REQUEST_STALLED,
717ec681f3Smrg      .group_id = ETNA_QUERY_HI_GROUP_ID,
727ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
737ec681f3Smrg         { "HI", "AXI_CYCLES_WRITE_REQUEST_STALLED" }
747ec681f3Smrg      }
757ec681f3Smrg   },
767ec681f3Smrg   {
777ec681f3Smrg      .name = "hi-axi-cycles-write-data-stalled",
787ec681f3Smrg      .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_DATA_STALLED,
797ec681f3Smrg      .group_id = ETNA_QUERY_HI_GROUP_ID,
807ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
817ec681f3Smrg         { "HI", "AXI_CYCLES_WRITE_DATA_STALLED" }
827ec681f3Smrg      }
837ec681f3Smrg   },
847ec681f3Smrg   {
857ec681f3Smrg      .name = "pe-pixel-count-killed-by-color-pipe",
867ec681f3Smrg      .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_COLOR_PIPE,
877ec681f3Smrg      .group_id = ETNA_QUERY_PE_GROUP_ID,
887ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
897ec681f3Smrg         { "PE", "PIXEL_COUNT_KILLED_BY_COLOR_PIPE" }
907ec681f3Smrg      }
917ec681f3Smrg   },
927ec681f3Smrg   {
937ec681f3Smrg      .name = "pe-pixel-count-killed-by-depth-pipe",
947ec681f3Smrg      .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_DEPTH_PIPE,
957ec681f3Smrg      .group_id = ETNA_QUERY_PE_GROUP_ID,
967ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
977ec681f3Smrg         { "PE", "PIXEL_COUNT_KILLED_BY_DEPTH_PIPE" }
987ec681f3Smrg      }
997ec681f3Smrg   },
1007ec681f3Smrg   {
1017ec681f3Smrg      .name = "pe-pixel-count-drawn-by-color-pipe",
1027ec681f3Smrg      .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_COLOR_PIPE,
1037ec681f3Smrg      .group_id = ETNA_QUERY_PE_GROUP_ID,
1047ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1057ec681f3Smrg         { "PE", "PIXEL_COUNT_DRAWN_BY_COLOR_PIPE" }
1067ec681f3Smrg      }
1077ec681f3Smrg   },
1087ec681f3Smrg   {
1097ec681f3Smrg      .name = "pe-pixel-count-drawn-by-depth-pipe",
1107ec681f3Smrg      .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE,
1117ec681f3Smrg      .group_id = ETNA_QUERY_PE_GROUP_ID,
1127ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1137ec681f3Smrg         { "PE", "PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE" }
1147ec681f3Smrg      }
1157ec681f3Smrg   },
1167ec681f3Smrg   {
1177ec681f3Smrg      .name = "sh-shader-cycles",
1187ec681f3Smrg      .type = ETNA_QUERY_SH_SHADER_CYCLES,
1197ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1207ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1217ec681f3Smrg         { "SH", "SHADER_CYCLES" }
1227ec681f3Smrg      }
1237ec681f3Smrg   },
1247ec681f3Smrg   {
1257ec681f3Smrg      .name = "sh-ps-inst-counter",
1267ec681f3Smrg      .type = ETNA_QUERY_SH_PS_INST_COUNTER,
1277ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1287ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1297ec681f3Smrg         { "SH", "PS_INST_COUNTER" }
1307ec681f3Smrg      }
1317ec681f3Smrg   },
1327ec681f3Smrg   {
1337ec681f3Smrg      .name = "sh-rendered-pixel-counter",
1347ec681f3Smrg      .type = ETNA_QUERY_SH_RENDERED_PIXEL_COUNTER,
1357ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1367ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1377ec681f3Smrg         { "SH", "RENDERED_PIXEL_COUNTER" }
1387ec681f3Smrg      }
1397ec681f3Smrg   },
1407ec681f3Smrg   {
1417ec681f3Smrg      .name = "sh-vs-inst-counter",
1427ec681f3Smrg      .type = ETNA_QUERY_SH_VS_INST_COUNTER,
1437ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1447ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1457ec681f3Smrg         { "SH", "VS_INST_COUNTER" }
1467ec681f3Smrg      }
1477ec681f3Smrg   },
1487ec681f3Smrg   {
1497ec681f3Smrg      .name = "sh-rendered-vertice-counter",
1507ec681f3Smrg      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
1517ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1527ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1537ec681f3Smrg         { "SH", "RENDERED_VERTICE_COUNTER" }
1547ec681f3Smrg      }
1557ec681f3Smrg   },
1567ec681f3Smrg   {
1577ec681f3Smrg      .name = "sh-vtx-branch-inst-counter",
1587ec681f3Smrg      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
1597ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1607ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1617ec681f3Smrg         { "SH", "VTX_BRANCH_INST_COUNTER" }
1627ec681f3Smrg      }
1637ec681f3Smrg   },
1647ec681f3Smrg   {
1657ec681f3Smrg      .name = "sh-vtx-texld-inst-counter",
1667ec681f3Smrg      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
1677ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1687ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1697ec681f3Smrg         { "SH", "VTX_TEXLD_INST_COUNTER" }
1707ec681f3Smrg      }
1717ec681f3Smrg   },
1727ec681f3Smrg   {
1737ec681f3Smrg      .name = "sh-plx-branch-inst-counter",
1747ec681f3Smrg      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
1757ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1767ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1777ec681f3Smrg         { "SH", "PXL_BRANCH_INST_COUNTER" }
1787ec681f3Smrg      }
1797ec681f3Smrg   },
1807ec681f3Smrg   {
1817ec681f3Smrg      .name = "sh-plx-texld-inst-counter",
1827ec681f3Smrg      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
1837ec681f3Smrg      .group_id = ETNA_QUERY_SH_GROUP_ID,
1847ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1857ec681f3Smrg         { "SH", "PXL_TEXLD_INST_COUNTER" }
1867ec681f3Smrg      }
1877ec681f3Smrg   },
1887ec681f3Smrg   {
1897ec681f3Smrg      .name = "pa-input-vtx-counter",
1907ec681f3Smrg      .type = ETNA_QUERY_PA_INPUT_VTX_COUNTER,
1917ec681f3Smrg      .group_id = ETNA_QUERY_PA_GROUP_ID,
1927ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
1937ec681f3Smrg         { "PA", "INPUT_VTX_COUNTER" }
1947ec681f3Smrg      }
1957ec681f3Smrg   },
1967ec681f3Smrg   {
1977ec681f3Smrg      .name = "pa-input-prim-counter",
1987ec681f3Smrg      .type = ETNA_QUERY_PA_INPUT_PRIM_COUNTER,
1997ec681f3Smrg      .group_id = ETNA_QUERY_PA_GROUP_ID,
2007ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2017ec681f3Smrg         { "PA", "INPUT_PRIM_COUNTER" }
2027ec681f3Smrg      }
2037ec681f3Smrg   },
2047ec681f3Smrg   {
2057ec681f3Smrg      .name = "pa-output-prim-counter",
2067ec681f3Smrg      .type = ETNA_QUERY_PA_OUTPUT_PRIM_COUNTER,
2077ec681f3Smrg      .group_id = ETNA_QUERY_PA_GROUP_ID,
2087ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2097ec681f3Smrg         { "PA", "OUTPUT_PRIM_COUNTER" }
2107ec681f3Smrg      }
2117ec681f3Smrg   },
2127ec681f3Smrg   {
2137ec681f3Smrg      .name = "pa-depth-clipped-counter",
2147ec681f3Smrg      .type = ETNA_QUERY_PA_DEPTH_CLIPPED_COUNTER,
2157ec681f3Smrg      .group_id = ETNA_QUERY_PA_GROUP_ID,
2167ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2177ec681f3Smrg         { "PA", "DEPTH_CLIPPED_COUNTER" }
2187ec681f3Smrg      }
2197ec681f3Smrg   },
2207ec681f3Smrg   {
2217ec681f3Smrg      .name = "pa-trivial-rejected-counter",
2227ec681f3Smrg      .type = ETNA_QUERY_PA_TRIVIAL_REJECTED_COUNTER,
2237ec681f3Smrg      .group_id = ETNA_QUERY_PA_GROUP_ID,
2247ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2257ec681f3Smrg         { "PA", "TRIVIAL_REJECTED_COUNTER" }
2267ec681f3Smrg      }
2277ec681f3Smrg   },
2287ec681f3Smrg   {
2297ec681f3Smrg      .name = "pa-culled-counter",
2307ec681f3Smrg      .type = ETNA_QUERY_PA_CULLED_COUNTER,
2317ec681f3Smrg      .group_id = ETNA_QUERY_PA_GROUP_ID,
2327ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2337ec681f3Smrg         { "PA", "CULLED_COUNTER" }
2347ec681f3Smrg      }
2357ec681f3Smrg   },
2367ec681f3Smrg   {
2377ec681f3Smrg      .name = "se-culled-triangle-count",
2387ec681f3Smrg      .type = ETNA_QUERY_SE_CULLED_TRIANGLE_COUNT,
2397ec681f3Smrg      .group_id = ETNA_QUERY_SE_GROUP_ID,
2407ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2417ec681f3Smrg         { "SE", "CULLED_TRIANGLE_COUNT" }
2427ec681f3Smrg      }
2437ec681f3Smrg   },
2447ec681f3Smrg   {
2457ec681f3Smrg      .name = "se-culled-lines-count",
2467ec681f3Smrg      .type = ETNA_QUERY_SE_CULLED_LINES_COUNT,
2477ec681f3Smrg      .group_id = ETNA_QUERY_SE_GROUP_ID,
2487ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2497ec681f3Smrg         { "SE", "CULLED_LINES_COUNT" }
2507ec681f3Smrg      }
2517ec681f3Smrg   },
2527ec681f3Smrg   {
2537ec681f3Smrg      .name = "ra-valid-pixel-count",
2547ec681f3Smrg      .type = ETNA_QUERY_RA_VALID_PIXEL_COUNT,
2557ec681f3Smrg      .group_id = ETNA_QUERY_RA_GROUP_ID,
2567ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2577ec681f3Smrg         { "RA", "VALID_PIXEL_COUNT" }
2587ec681f3Smrg      }
2597ec681f3Smrg   },
2607ec681f3Smrg   {
2617ec681f3Smrg      .name = "ra-total-quad-count",
2627ec681f3Smrg      .type = ETNA_QUERY_RA_TOTAL_QUAD_COUNT,
2637ec681f3Smrg      .group_id = ETNA_QUERY_RA_GROUP_ID,
2647ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2657ec681f3Smrg         { "RA", "TOTAL_QUAD_COUNT" }
2667ec681f3Smrg      }
2677ec681f3Smrg   },
2687ec681f3Smrg   {
2697ec681f3Smrg      .name = "ra-valid-quad-count-after-early-z",
2707ec681f3Smrg      .type = ETNA_QUERY_RA_VALID_QUAD_COUNT_AFTER_EARLY_Z,
2717ec681f3Smrg      .group_id = ETNA_QUERY_RA_GROUP_ID,
2727ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2737ec681f3Smrg         { "RA", "VALID_QUAD_COUNT_AFTER_EARLY_Z" }
2747ec681f3Smrg      }
2757ec681f3Smrg   },
2767ec681f3Smrg   {
2777ec681f3Smrg      .name = "ra-total-primitive-count",
2787ec681f3Smrg      .type = ETNA_QUERY_RA_TOTAL_PRIMITIVE_COUNT,
2797ec681f3Smrg      .group_id = ETNA_QUERY_RA_GROUP_ID,
2807ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2817ec681f3Smrg         { "RA", "TOTAL_PRIMITIVE_COUNT" }
2827ec681f3Smrg      }
2837ec681f3Smrg   },
2847ec681f3Smrg   {
2857ec681f3Smrg      .name = "ra-pipe-cache-miss-counter",
2867ec681f3Smrg      .type = ETNA_QUERY_RA_PIPE_CACHE_MISS_COUNTER,
2877ec681f3Smrg      .group_id = ETNA_QUERY_RA_GROUP_ID,
2887ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2897ec681f3Smrg         { "RA", "PIPE_CACHE_MISS_COUNTER" }
2907ec681f3Smrg      }
2917ec681f3Smrg   },
2927ec681f3Smrg   {
2937ec681f3Smrg      .name = "ra-prefetch-cache-miss-counter",
2947ec681f3Smrg      .type = ETNA_QUERY_RA_PREFETCH_CACHE_MISS_COUNTER,
2957ec681f3Smrg      .group_id = ETNA_QUERY_RA_GROUP_ID,
2967ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
2977ec681f3Smrg         { "RA", "PREFETCH_CACHE_MISS_COUNTER" }
2987ec681f3Smrg      }
2997ec681f3Smrg   },
3007ec681f3Smrg   {
3017ec681f3Smrg      .name = "ra-pculled-quad-count",
3027ec681f3Smrg      .type = ETNA_QUERY_RA_CULLED_QUAD_COUNT,
3037ec681f3Smrg      .group_id = ETNA_QUERY_RA_GROUP_ID,
3047ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3057ec681f3Smrg         { "RA", "CULLED_QUAD_COUNT" }
3067ec681f3Smrg      }
3077ec681f3Smrg   },
3087ec681f3Smrg   {
3097ec681f3Smrg      .name = "tx-total-bilinear-requests",
3107ec681f3Smrg      .type = ETNA_QUERY_TX_TOTAL_BILINEAR_REQUESTS,
3117ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3127ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3137ec681f3Smrg         { "TX", "TOTAL_BILINEAR_REQUESTS" }
3147ec681f3Smrg      }
3157ec681f3Smrg   },
3167ec681f3Smrg   {
3177ec681f3Smrg      .name = "tx-total-trilinear-requests",
3187ec681f3Smrg      .type = ETNA_QUERY_TX_TOTAL_TRILINEAR_REQUESTS,
3197ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3207ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3217ec681f3Smrg         { "TX", "TOTAL_TRILINEAR_REQUESTS" }
3227ec681f3Smrg      }
3237ec681f3Smrg   },
3247ec681f3Smrg   {
3257ec681f3Smrg      .name = "tx-total-discarded-texture-requests",
3267ec681f3Smrg      .type = ETNA_QUERY_TX_TOTAL_DISCARDED_TEXTURE_REQUESTS,
3277ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3287ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3297ec681f3Smrg         { "TX", "TOTAL_DISCARDED_TEXTURE_REQUESTS" }
3307ec681f3Smrg      }
3317ec681f3Smrg   },
3327ec681f3Smrg   {
3337ec681f3Smrg      .name = "tx-total-texture-requests",
3347ec681f3Smrg      .type = ETNA_QUERY_TX_TOTAL_TEXTURE_REQUESTS,
3357ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3367ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3377ec681f3Smrg         { "TX", "TOTAL_TEXTURE_REQUESTS" }
3387ec681f3Smrg      }
3397ec681f3Smrg   },
3407ec681f3Smrg   {
3417ec681f3Smrg      .name = "tx-mem-read-count",
3427ec681f3Smrg      .type = ETNA_QUERY_TX_MEM_READ_COUNT,
3437ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3447ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3457ec681f3Smrg         { "TX", "MEM_READ_COUNT" }
3467ec681f3Smrg      }
3477ec681f3Smrg   },
3487ec681f3Smrg   {
3497ec681f3Smrg      .name = "tx-mem-read-in-8b-count",
3507ec681f3Smrg      .type = ETNA_QUERY_TX_MEM_READ_IN_8B_COUNT,
3517ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3527ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3537ec681f3Smrg         { "TX", "MEM_READ_IN_8B_COUNT" }
3547ec681f3Smrg      }
3557ec681f3Smrg   },
3567ec681f3Smrg   {
3577ec681f3Smrg      .name = "tx-cache-miss-count",
3587ec681f3Smrg      .type = ETNA_QUERY_TX_CACHE_MISS_COUNT,
3597ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3607ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3617ec681f3Smrg         { "TX", "CACHE_MISS_COUNT" }
3627ec681f3Smrg      }
3637ec681f3Smrg   },
3647ec681f3Smrg   {
3657ec681f3Smrg      .name = "tx-cache-hit-texel-count",
3667ec681f3Smrg      .type = ETNA_QUERY_TX_CACHE_HIT_TEXEL_COUNT,
3677ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3687ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3697ec681f3Smrg         { "TX", "CACHE_HIT_TEXEL_COUNT" }
3707ec681f3Smrg      }
3717ec681f3Smrg   },
3727ec681f3Smrg   {
3737ec681f3Smrg      .name = "tx-cache-miss-texel-count",
3747ec681f3Smrg      .type = ETNA_QUERY_TX_CACHE_MISS_TEXEL_COUNT,
3757ec681f3Smrg      .group_id = ETNA_QUERY_TX_GROUP_ID,
3767ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3777ec681f3Smrg         { "TX", "CACHE_MISS_TEXEL_COUNT" }
3787ec681f3Smrg      }
3797ec681f3Smrg   },
3807ec681f3Smrg   {
3817ec681f3Smrg      .name = "mc-total-read-req-8b-from-pipeline",
3827ec681f3Smrg      .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_PIPELINE,
3837ec681f3Smrg      .group_id = ETNA_QUERY_MC_GROUP_ID,
3847ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3857ec681f3Smrg         { "MC", "TOTAL_READ_REQ_8B_FROM_PIPELINE" }
3867ec681f3Smrg      }
3877ec681f3Smrg   },
3887ec681f3Smrg   {
3897ec681f3Smrg      .name = "mc-total-read-req-8b-from-ip",
3907ec681f3Smrg      .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_IP,
3917ec681f3Smrg      .group_id = ETNA_QUERY_MC_GROUP_ID,
3927ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
3937ec681f3Smrg         { "MC", "TOTAL_READ_REQ_8B_FROM_IP" }
3947ec681f3Smrg      }
3957ec681f3Smrg   },
3967ec681f3Smrg   {
3977ec681f3Smrg      .name = "mc-total-write-req-8b-from-pipeline",
3987ec681f3Smrg      .type = ETNA_QUERY_MC_TOTAL_WRITE_REQ_8B_FROM_PIPELINE,
3997ec681f3Smrg      .group_id = ETNA_QUERY_MC_GROUP_ID,
4007ec681f3Smrg      .source = (const struct etna_perfmon_source[]) {
4017ec681f3Smrg         { "MC", "TOTAL_WRITE_REQ_8B_FROM_PIPELINE" }
4027ec681f3Smrg      }
4037ec681f3Smrg   }
4047ec681f3Smrg};
4057ec681f3Smrg
4067ec681f3Smrgstruct etna_perfmon_signal *
4077ec681f3Smrgetna_pm_query_signal(struct etna_perfmon *perfmon,
4087ec681f3Smrg                     const struct etna_perfmon_source *source)
4097ec681f3Smrg{
4107ec681f3Smrg   struct etna_perfmon_domain *domain;
4117ec681f3Smrg
4127ec681f3Smrg   domain = etna_perfmon_get_dom_by_name(perfmon, source->domain);
4137ec681f3Smrg   if (!domain)
4147ec681f3Smrg      return NULL;
4157ec681f3Smrg
4167ec681f3Smrg   return etna_perfmon_get_sig_by_name(domain, source->signal);
4177ec681f3Smrg}
4187ec681f3Smrg
4197ec681f3Smrgvoid
4207ec681f3Smrgetna_pm_query_setup(struct etna_screen *screen)
4217ec681f3Smrg{
4227ec681f3Smrg   screen->perfmon = etna_perfmon_create(screen->pipe);
4237ec681f3Smrg
4247ec681f3Smrg   if (!screen->perfmon)
4257ec681f3Smrg      return;
4267ec681f3Smrg
4277ec681f3Smrg   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++) {
4287ec681f3Smrg      const struct etna_perfmon_config *cfg = &query_config[i];
4297ec681f3Smrg
4307ec681f3Smrg      if (!etna_pm_cfg_supported(screen->perfmon, cfg))
4317ec681f3Smrg         continue;
4327ec681f3Smrg
4337ec681f3Smrg      util_dynarray_append(&screen->supported_pm_queries, unsigned, i);
4347ec681f3Smrg   }
4357ec681f3Smrg}
4367ec681f3Smrg
4377ec681f3Smrgconst struct etna_perfmon_config *
4387ec681f3Smrgetna_pm_query_config(unsigned type)
4397ec681f3Smrg{
4407ec681f3Smrg   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++)
4417ec681f3Smrg      if (query_config[i].type == type)
4427ec681f3Smrg         return &query_config[i];
4437ec681f3Smrg
4447ec681f3Smrg   return NULL;
4457ec681f3Smrg}
4467ec681f3Smrg
4477ec681f3Smrgint
4487ec681f3Smrgetna_pm_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
4497ec681f3Smrg                              struct pipe_driver_query_info *info)
4507ec681f3Smrg{
4517ec681f3Smrg   const struct etna_screen *screen = etna_screen(pscreen);
4527ec681f3Smrg   const unsigned num = screen->supported_pm_queries.size / sizeof(unsigned);
4537ec681f3Smrg   unsigned i;
4547ec681f3Smrg
4557ec681f3Smrg   if (!info)
4567ec681f3Smrg      return num;
4577ec681f3Smrg
4587ec681f3Smrg   if (index >= num)
4597ec681f3Smrg      return 0;
4607ec681f3Smrg
4617ec681f3Smrg   i = *util_dynarray_element(&screen->supported_pm_queries, unsigned, index);
4627ec681f3Smrg   assert(i < ARRAY_SIZE(query_config));
4637ec681f3Smrg
4647ec681f3Smrg   info->name = query_config[i].name;
4657ec681f3Smrg   info->query_type = query_config[i].type;
4667ec681f3Smrg   info->group_id = query_config[i].group_id;
4677ec681f3Smrg
4687ec681f3Smrg   return 1;
4697ec681f3Smrg}
4707ec681f3Smrg
4717ec681f3Smrgstatic
4727ec681f3Smrgunsigned query_count(unsigned group)
4737ec681f3Smrg{
4747ec681f3Smrg   unsigned count = 0;
4757ec681f3Smrg
4767ec681f3Smrg   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++)
4777ec681f3Smrg      if (query_config[i].group_id == group)
4787ec681f3Smrg         count++;
4797ec681f3Smrg
4807ec681f3Smrg   assert(count);
4817ec681f3Smrg
4827ec681f3Smrg   return count;
4837ec681f3Smrg}
4847ec681f3Smrg
4857ec681f3Smrgint
4867ec681f3Smrgetna_pm_get_driver_query_group_info(struct pipe_screen *pscreen,
4877ec681f3Smrg                                    unsigned index,
4887ec681f3Smrg                                    struct pipe_driver_query_group_info *info)
4897ec681f3Smrg{
4907ec681f3Smrg   if (!info)
4917ec681f3Smrg      return ARRAY_SIZE(group_names);
4927ec681f3Smrg
4937ec681f3Smrg   if (index >= ARRAY_SIZE(group_names))
4947ec681f3Smrg      return 0;
4957ec681f3Smrg
4967ec681f3Smrg   unsigned count = query_count(index);
4977ec681f3Smrg
4987ec681f3Smrg   info->name = group_names[index];
4997ec681f3Smrg   info->max_active_queries = count;
5007ec681f3Smrg   info->num_queries = count;
5017ec681f3Smrg
5027ec681f3Smrg   return 1;
5037ec681f3Smrg}
504