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