1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright (c) 2017 Etnaviv Project 3bf215546Sopenharmony_ci * Copyright (C) 2017 Zodiac Inflight Innovations 4bf215546Sopenharmony_ci * 5bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 6bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 7bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 8bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sub license, 9bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 10bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 11bf215546Sopenharmony_ci * 12bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the 13bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions 14bf215546Sopenharmony_ci * of the Software. 15bf215546Sopenharmony_ci * 16bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21bf215546Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22bf215546Sopenharmony_ci * DEALINGS IN THE SOFTWARE. 23bf215546Sopenharmony_ci * 24bf215546Sopenharmony_ci * Authors: 25bf215546Sopenharmony_ci * Christian Gmeiner <christian.gmeiner@gmail.com> 26bf215546Sopenharmony_ci */ 27bf215546Sopenharmony_ci 28bf215546Sopenharmony_ci#include "etnaviv_context.h" 29bf215546Sopenharmony_ci#include "etnaviv_perfmon.h" 30bf215546Sopenharmony_ci#include "etnaviv_screen.h" 31bf215546Sopenharmony_ci 32bf215546Sopenharmony_cistatic const char *group_names[] = { 33bf215546Sopenharmony_ci [ETNA_QUERY_HI_GROUP_ID] = "HI", 34bf215546Sopenharmony_ci [ETNA_QUERY_PE_GROUP_ID] = "PE", 35bf215546Sopenharmony_ci [ETNA_QUERY_SH_GROUP_ID] = "SH", 36bf215546Sopenharmony_ci [ETNA_QUERY_PA_GROUP_ID] = "PA", 37bf215546Sopenharmony_ci [ETNA_QUERY_SE_GROUP_ID] = "SE", 38bf215546Sopenharmony_ci [ETNA_QUERY_RA_GROUP_ID] = "RA", 39bf215546Sopenharmony_ci [ETNA_QUERY_TX_GROUP_ID] = "TX", 40bf215546Sopenharmony_ci [ETNA_QUERY_MC_GROUP_ID] = "MC", 41bf215546Sopenharmony_ci}; 42bf215546Sopenharmony_ci 43bf215546Sopenharmony_cistatic const struct etna_perfmon_config query_config[] = { 44bf215546Sopenharmony_ci { 45bf215546Sopenharmony_ci .name = "hi-total-read-bytes", 46bf215546Sopenharmony_ci .type = ETNA_QUERY_HI_TOTAL_READ_BYTES8, 47bf215546Sopenharmony_ci .group_id = ETNA_QUERY_HI_GROUP_ID, 48bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 49bf215546Sopenharmony_ci { "HI", "TOTAL_READ_BYTES8" } 50bf215546Sopenharmony_ci }, 51bf215546Sopenharmony_ci .multiply_with_8 = true 52bf215546Sopenharmony_ci }, 53bf215546Sopenharmony_ci { 54bf215546Sopenharmony_ci .name = "hi-total-write-bytes", 55bf215546Sopenharmony_ci .type = ETNA_QUERY_HI_TOTAL_WRITE_BYTES8, 56bf215546Sopenharmony_ci .group_id = ETNA_QUERY_HI_GROUP_ID, 57bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 58bf215546Sopenharmony_ci { "HI", "TOTAL_WRITE_BYTES8" } 59bf215546Sopenharmony_ci }, 60bf215546Sopenharmony_ci .multiply_with_8 = true 61bf215546Sopenharmony_ci }, 62bf215546Sopenharmony_ci { 63bf215546Sopenharmony_ci .name = "hi-total-cycles", 64bf215546Sopenharmony_ci .type = ETNA_QUERY_HI_TOTAL_CYCLES, 65bf215546Sopenharmony_ci .group_id = ETNA_QUERY_HI_GROUP_ID, 66bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 67bf215546Sopenharmony_ci { "HI", "TOTAL_CYCLES" } 68bf215546Sopenharmony_ci } 69bf215546Sopenharmony_ci }, 70bf215546Sopenharmony_ci { 71bf215546Sopenharmony_ci .name = "hi-idle-cycles", 72bf215546Sopenharmony_ci .type = ETNA_QUERY_HI_IDLE_CYCLES, 73bf215546Sopenharmony_ci .group_id = ETNA_QUERY_HI_GROUP_ID, 74bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 75bf215546Sopenharmony_ci { "HI", "IDLE_CYCLES" } 76bf215546Sopenharmony_ci } 77bf215546Sopenharmony_ci }, 78bf215546Sopenharmony_ci { 79bf215546Sopenharmony_ci .name = "hi-axi-cycles-read-request-stalled", 80bf215546Sopenharmony_ci .type = ETNA_QUERY_HI_AXI_CYCLES_READ_REQUEST_STALLED, 81bf215546Sopenharmony_ci .group_id = ETNA_QUERY_HI_GROUP_ID, 82bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 83bf215546Sopenharmony_ci { "HI", "AXI_CYCLES_READ_REQUEST_STALLED" } 84bf215546Sopenharmony_ci } 85bf215546Sopenharmony_ci }, 86bf215546Sopenharmony_ci { 87bf215546Sopenharmony_ci .name = "hi-axi-cycles-write-request-stalled", 88bf215546Sopenharmony_ci .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_REQUEST_STALLED, 89bf215546Sopenharmony_ci .group_id = ETNA_QUERY_HI_GROUP_ID, 90bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 91bf215546Sopenharmony_ci { "HI", "AXI_CYCLES_WRITE_REQUEST_STALLED" } 92bf215546Sopenharmony_ci } 93bf215546Sopenharmony_ci }, 94bf215546Sopenharmony_ci { 95bf215546Sopenharmony_ci .name = "hi-axi-cycles-write-data-stalled", 96bf215546Sopenharmony_ci .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_DATA_STALLED, 97bf215546Sopenharmony_ci .group_id = ETNA_QUERY_HI_GROUP_ID, 98bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 99bf215546Sopenharmony_ci { "HI", "AXI_CYCLES_WRITE_DATA_STALLED" } 100bf215546Sopenharmony_ci } 101bf215546Sopenharmony_ci }, 102bf215546Sopenharmony_ci { 103bf215546Sopenharmony_ci .name = "pe-pixel-count-killed-by-color-pipe", 104bf215546Sopenharmony_ci .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_COLOR_PIPE, 105bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PE_GROUP_ID, 106bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 107bf215546Sopenharmony_ci { "PE", "PIXEL_COUNT_KILLED_BY_COLOR_PIPE" } 108bf215546Sopenharmony_ci } 109bf215546Sopenharmony_ci }, 110bf215546Sopenharmony_ci { 111bf215546Sopenharmony_ci .name = "pe-pixel-count-killed-by-depth-pipe", 112bf215546Sopenharmony_ci .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_DEPTH_PIPE, 113bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PE_GROUP_ID, 114bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 115bf215546Sopenharmony_ci { "PE", "PIXEL_COUNT_KILLED_BY_DEPTH_PIPE" } 116bf215546Sopenharmony_ci } 117bf215546Sopenharmony_ci }, 118bf215546Sopenharmony_ci { 119bf215546Sopenharmony_ci .name = "pe-pixel-count-drawn-by-color-pipe", 120bf215546Sopenharmony_ci .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_COLOR_PIPE, 121bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PE_GROUP_ID, 122bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 123bf215546Sopenharmony_ci { "PE", "PIXEL_COUNT_DRAWN_BY_COLOR_PIPE" } 124bf215546Sopenharmony_ci } 125bf215546Sopenharmony_ci }, 126bf215546Sopenharmony_ci { 127bf215546Sopenharmony_ci .name = "pe-pixel-count-drawn-by-depth-pipe", 128bf215546Sopenharmony_ci .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE, 129bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PE_GROUP_ID, 130bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 131bf215546Sopenharmony_ci { "PE", "PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE" } 132bf215546Sopenharmony_ci } 133bf215546Sopenharmony_ci }, 134bf215546Sopenharmony_ci { 135bf215546Sopenharmony_ci .name = "sh-shader-cycles", 136bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_SHADER_CYCLES, 137bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 138bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 139bf215546Sopenharmony_ci { "SH", "SHADER_CYCLES" } 140bf215546Sopenharmony_ci } 141bf215546Sopenharmony_ci }, 142bf215546Sopenharmony_ci { 143bf215546Sopenharmony_ci .name = "sh-ps-inst-counter", 144bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_PS_INST_COUNTER, 145bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 146bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 147bf215546Sopenharmony_ci { "SH", "PS_INST_COUNTER" } 148bf215546Sopenharmony_ci } 149bf215546Sopenharmony_ci }, 150bf215546Sopenharmony_ci { 151bf215546Sopenharmony_ci .name = "sh-rendered-pixel-counter", 152bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_RENDERED_PIXEL_COUNTER, 153bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 154bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 155bf215546Sopenharmony_ci { "SH", "RENDERED_PIXEL_COUNTER" } 156bf215546Sopenharmony_ci } 157bf215546Sopenharmony_ci }, 158bf215546Sopenharmony_ci { 159bf215546Sopenharmony_ci .name = "sh-vs-inst-counter", 160bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_VS_INST_COUNTER, 161bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 162bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 163bf215546Sopenharmony_ci { "SH", "VS_INST_COUNTER" } 164bf215546Sopenharmony_ci } 165bf215546Sopenharmony_ci }, 166bf215546Sopenharmony_ci { 167bf215546Sopenharmony_ci .name = "sh-rendered-vertice-counter", 168bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER, 169bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 170bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 171bf215546Sopenharmony_ci { "SH", "RENDERED_VERTICE_COUNTER" } 172bf215546Sopenharmony_ci } 173bf215546Sopenharmony_ci }, 174bf215546Sopenharmony_ci { 175bf215546Sopenharmony_ci .name = "sh-vtx-branch-inst-counter", 176bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER, 177bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 178bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 179bf215546Sopenharmony_ci { "SH", "VTX_BRANCH_INST_COUNTER" } 180bf215546Sopenharmony_ci } 181bf215546Sopenharmony_ci }, 182bf215546Sopenharmony_ci { 183bf215546Sopenharmony_ci .name = "sh-vtx-texld-inst-counter", 184bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER, 185bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 186bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 187bf215546Sopenharmony_ci { "SH", "VTX_TEXLD_INST_COUNTER" } 188bf215546Sopenharmony_ci } 189bf215546Sopenharmony_ci }, 190bf215546Sopenharmony_ci { 191bf215546Sopenharmony_ci .name = "sh-plx-branch-inst-counter", 192bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER, 193bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 194bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 195bf215546Sopenharmony_ci { "SH", "PXL_BRANCH_INST_COUNTER" } 196bf215546Sopenharmony_ci } 197bf215546Sopenharmony_ci }, 198bf215546Sopenharmony_ci { 199bf215546Sopenharmony_ci .name = "sh-plx-texld-inst-counter", 200bf215546Sopenharmony_ci .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER, 201bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SH_GROUP_ID, 202bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 203bf215546Sopenharmony_ci { "SH", "PXL_TEXLD_INST_COUNTER" } 204bf215546Sopenharmony_ci } 205bf215546Sopenharmony_ci }, 206bf215546Sopenharmony_ci { 207bf215546Sopenharmony_ci .name = "pa-input-vtx-counter", 208bf215546Sopenharmony_ci .type = ETNA_QUERY_PA_INPUT_VTX_COUNTER, 209bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PA_GROUP_ID, 210bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 211bf215546Sopenharmony_ci { "PA", "INPUT_VTX_COUNTER" } 212bf215546Sopenharmony_ci } 213bf215546Sopenharmony_ci }, 214bf215546Sopenharmony_ci { 215bf215546Sopenharmony_ci .name = "pa-input-prim-counter", 216bf215546Sopenharmony_ci .type = ETNA_QUERY_PA_INPUT_PRIM_COUNTER, 217bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PA_GROUP_ID, 218bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 219bf215546Sopenharmony_ci { "PA", "INPUT_PRIM_COUNTER" } 220bf215546Sopenharmony_ci } 221bf215546Sopenharmony_ci }, 222bf215546Sopenharmony_ci { 223bf215546Sopenharmony_ci .name = "pa-output-prim-counter", 224bf215546Sopenharmony_ci .type = ETNA_QUERY_PA_OUTPUT_PRIM_COUNTER, 225bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PA_GROUP_ID, 226bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 227bf215546Sopenharmony_ci { "PA", "OUTPUT_PRIM_COUNTER" } 228bf215546Sopenharmony_ci } 229bf215546Sopenharmony_ci }, 230bf215546Sopenharmony_ci { 231bf215546Sopenharmony_ci .name = "pa-depth-clipped-counter", 232bf215546Sopenharmony_ci .type = ETNA_QUERY_PA_DEPTH_CLIPPED_COUNTER, 233bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PA_GROUP_ID, 234bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 235bf215546Sopenharmony_ci { "PA", "DEPTH_CLIPPED_COUNTER" } 236bf215546Sopenharmony_ci } 237bf215546Sopenharmony_ci }, 238bf215546Sopenharmony_ci { 239bf215546Sopenharmony_ci .name = "pa-trivial-rejected-counter", 240bf215546Sopenharmony_ci .type = ETNA_QUERY_PA_TRIVIAL_REJECTED_COUNTER, 241bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PA_GROUP_ID, 242bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 243bf215546Sopenharmony_ci { "PA", "TRIVIAL_REJECTED_COUNTER" } 244bf215546Sopenharmony_ci } 245bf215546Sopenharmony_ci }, 246bf215546Sopenharmony_ci { 247bf215546Sopenharmony_ci .name = "pa-culled-counter", 248bf215546Sopenharmony_ci .type = ETNA_QUERY_PA_CULLED_COUNTER, 249bf215546Sopenharmony_ci .group_id = ETNA_QUERY_PA_GROUP_ID, 250bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 251bf215546Sopenharmony_ci { "PA", "CULLED_COUNTER" } 252bf215546Sopenharmony_ci } 253bf215546Sopenharmony_ci }, 254bf215546Sopenharmony_ci { 255bf215546Sopenharmony_ci .name = "se-culled-triangle-count", 256bf215546Sopenharmony_ci .type = ETNA_QUERY_SE_CULLED_TRIANGLE_COUNT, 257bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SE_GROUP_ID, 258bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 259bf215546Sopenharmony_ci { "SE", "CULLED_TRIANGLE_COUNT" } 260bf215546Sopenharmony_ci } 261bf215546Sopenharmony_ci }, 262bf215546Sopenharmony_ci { 263bf215546Sopenharmony_ci .name = "se-culled-lines-count", 264bf215546Sopenharmony_ci .type = ETNA_QUERY_SE_CULLED_LINES_COUNT, 265bf215546Sopenharmony_ci .group_id = ETNA_QUERY_SE_GROUP_ID, 266bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 267bf215546Sopenharmony_ci { "SE", "CULLED_LINES_COUNT" } 268bf215546Sopenharmony_ci } 269bf215546Sopenharmony_ci }, 270bf215546Sopenharmony_ci { 271bf215546Sopenharmony_ci .name = "ra-valid-pixel-count", 272bf215546Sopenharmony_ci .type = ETNA_QUERY_RA_VALID_PIXEL_COUNT, 273bf215546Sopenharmony_ci .group_id = ETNA_QUERY_RA_GROUP_ID, 274bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 275bf215546Sopenharmony_ci { "RA", "VALID_PIXEL_COUNT" } 276bf215546Sopenharmony_ci } 277bf215546Sopenharmony_ci }, 278bf215546Sopenharmony_ci { 279bf215546Sopenharmony_ci .name = "ra-total-quad-count", 280bf215546Sopenharmony_ci .type = ETNA_QUERY_RA_TOTAL_QUAD_COUNT, 281bf215546Sopenharmony_ci .group_id = ETNA_QUERY_RA_GROUP_ID, 282bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 283bf215546Sopenharmony_ci { "RA", "TOTAL_QUAD_COUNT" } 284bf215546Sopenharmony_ci } 285bf215546Sopenharmony_ci }, 286bf215546Sopenharmony_ci { 287bf215546Sopenharmony_ci .name = "ra-valid-quad-count-after-early-z", 288bf215546Sopenharmony_ci .type = ETNA_QUERY_RA_VALID_QUAD_COUNT_AFTER_EARLY_Z, 289bf215546Sopenharmony_ci .group_id = ETNA_QUERY_RA_GROUP_ID, 290bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 291bf215546Sopenharmony_ci { "RA", "VALID_QUAD_COUNT_AFTER_EARLY_Z" } 292bf215546Sopenharmony_ci } 293bf215546Sopenharmony_ci }, 294bf215546Sopenharmony_ci { 295bf215546Sopenharmony_ci .name = "ra-total-primitive-count", 296bf215546Sopenharmony_ci .type = ETNA_QUERY_RA_TOTAL_PRIMITIVE_COUNT, 297bf215546Sopenharmony_ci .group_id = ETNA_QUERY_RA_GROUP_ID, 298bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 299bf215546Sopenharmony_ci { "RA", "TOTAL_PRIMITIVE_COUNT" } 300bf215546Sopenharmony_ci } 301bf215546Sopenharmony_ci }, 302bf215546Sopenharmony_ci { 303bf215546Sopenharmony_ci .name = "ra-pipe-cache-miss-counter", 304bf215546Sopenharmony_ci .type = ETNA_QUERY_RA_PIPE_CACHE_MISS_COUNTER, 305bf215546Sopenharmony_ci .group_id = ETNA_QUERY_RA_GROUP_ID, 306bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 307bf215546Sopenharmony_ci { "RA", "PIPE_CACHE_MISS_COUNTER" } 308bf215546Sopenharmony_ci } 309bf215546Sopenharmony_ci }, 310bf215546Sopenharmony_ci { 311bf215546Sopenharmony_ci .name = "ra-prefetch-cache-miss-counter", 312bf215546Sopenharmony_ci .type = ETNA_QUERY_RA_PREFETCH_CACHE_MISS_COUNTER, 313bf215546Sopenharmony_ci .group_id = ETNA_QUERY_RA_GROUP_ID, 314bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 315bf215546Sopenharmony_ci { "RA", "PREFETCH_CACHE_MISS_COUNTER" } 316bf215546Sopenharmony_ci } 317bf215546Sopenharmony_ci }, 318bf215546Sopenharmony_ci { 319bf215546Sopenharmony_ci .name = "ra-pculled-quad-count", 320bf215546Sopenharmony_ci .type = ETNA_QUERY_RA_CULLED_QUAD_COUNT, 321bf215546Sopenharmony_ci .group_id = ETNA_QUERY_RA_GROUP_ID, 322bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 323bf215546Sopenharmony_ci { "RA", "CULLED_QUAD_COUNT" } 324bf215546Sopenharmony_ci } 325bf215546Sopenharmony_ci }, 326bf215546Sopenharmony_ci { 327bf215546Sopenharmony_ci .name = "tx-total-bilinear-requests", 328bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_TOTAL_BILINEAR_REQUESTS, 329bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 330bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 331bf215546Sopenharmony_ci { "TX", "TOTAL_BILINEAR_REQUESTS" } 332bf215546Sopenharmony_ci } 333bf215546Sopenharmony_ci }, 334bf215546Sopenharmony_ci { 335bf215546Sopenharmony_ci .name = "tx-total-trilinear-requests", 336bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_TOTAL_TRILINEAR_REQUESTS, 337bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 338bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 339bf215546Sopenharmony_ci { "TX", "TOTAL_TRILINEAR_REQUESTS" } 340bf215546Sopenharmony_ci } 341bf215546Sopenharmony_ci }, 342bf215546Sopenharmony_ci { 343bf215546Sopenharmony_ci .name = "tx-total-discarded-texture-requests", 344bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_TOTAL_DISCARDED_TEXTURE_REQUESTS, 345bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 346bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 347bf215546Sopenharmony_ci { "TX", "TOTAL_DISCARDED_TEXTURE_REQUESTS" } 348bf215546Sopenharmony_ci } 349bf215546Sopenharmony_ci }, 350bf215546Sopenharmony_ci { 351bf215546Sopenharmony_ci .name = "tx-total-texture-requests", 352bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_TOTAL_TEXTURE_REQUESTS, 353bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 354bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 355bf215546Sopenharmony_ci { "TX", "TOTAL_TEXTURE_REQUESTS" } 356bf215546Sopenharmony_ci } 357bf215546Sopenharmony_ci }, 358bf215546Sopenharmony_ci { 359bf215546Sopenharmony_ci .name = "tx-mem-read-count", 360bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_MEM_READ_COUNT, 361bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 362bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 363bf215546Sopenharmony_ci { "TX", "MEM_READ_COUNT" } 364bf215546Sopenharmony_ci } 365bf215546Sopenharmony_ci }, 366bf215546Sopenharmony_ci { 367bf215546Sopenharmony_ci .name = "tx-mem-read-bytes", 368bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_MEM_READ_IN_8B_COUNT, 369bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 370bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 371bf215546Sopenharmony_ci { "TX", "MEM_READ_IN_8B_COUNT" } 372bf215546Sopenharmony_ci }, 373bf215546Sopenharmony_ci .multiply_with_8 = true 374bf215546Sopenharmony_ci }, 375bf215546Sopenharmony_ci { 376bf215546Sopenharmony_ci .name = "tx-cache-miss-count", 377bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_CACHE_MISS_COUNT, 378bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 379bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 380bf215546Sopenharmony_ci { "TX", "CACHE_MISS_COUNT" } 381bf215546Sopenharmony_ci } 382bf215546Sopenharmony_ci }, 383bf215546Sopenharmony_ci { 384bf215546Sopenharmony_ci .name = "tx-cache-hit-texel-count", 385bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_CACHE_HIT_TEXEL_COUNT, 386bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 387bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 388bf215546Sopenharmony_ci { "TX", "CACHE_HIT_TEXEL_COUNT" } 389bf215546Sopenharmony_ci } 390bf215546Sopenharmony_ci }, 391bf215546Sopenharmony_ci { 392bf215546Sopenharmony_ci .name = "tx-cache-miss-texel-count", 393bf215546Sopenharmony_ci .type = ETNA_QUERY_TX_CACHE_MISS_TEXEL_COUNT, 394bf215546Sopenharmony_ci .group_id = ETNA_QUERY_TX_GROUP_ID, 395bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 396bf215546Sopenharmony_ci { "TX", "CACHE_MISS_TEXEL_COUNT" } 397bf215546Sopenharmony_ci } 398bf215546Sopenharmony_ci }, 399bf215546Sopenharmony_ci { 400bf215546Sopenharmony_ci .name = "mc-total-read-req-8b-from-pipeline", 401bf215546Sopenharmony_ci .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_PIPELINE, 402bf215546Sopenharmony_ci .group_id = ETNA_QUERY_MC_GROUP_ID, 403bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 404bf215546Sopenharmony_ci { "MC", "TOTAL_READ_REQ_8B_FROM_PIPELINE" } 405bf215546Sopenharmony_ci } 406bf215546Sopenharmony_ci }, 407bf215546Sopenharmony_ci { 408bf215546Sopenharmony_ci .name = "mc-total-read-req-8b-from-ip", 409bf215546Sopenharmony_ci .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_IP, 410bf215546Sopenharmony_ci .group_id = ETNA_QUERY_MC_GROUP_ID, 411bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 412bf215546Sopenharmony_ci { "MC", "TOTAL_READ_REQ_8B_FROM_IP" } 413bf215546Sopenharmony_ci } 414bf215546Sopenharmony_ci }, 415bf215546Sopenharmony_ci { 416bf215546Sopenharmony_ci .name = "mc-total-write-req-8b-from-pipeline", 417bf215546Sopenharmony_ci .type = ETNA_QUERY_MC_TOTAL_WRITE_REQ_8B_FROM_PIPELINE, 418bf215546Sopenharmony_ci .group_id = ETNA_QUERY_MC_GROUP_ID, 419bf215546Sopenharmony_ci .source = (const struct etna_perfmon_source[]) { 420bf215546Sopenharmony_ci { "MC", "TOTAL_WRITE_REQ_8B_FROM_PIPELINE" } 421bf215546Sopenharmony_ci } 422bf215546Sopenharmony_ci } 423bf215546Sopenharmony_ci}; 424bf215546Sopenharmony_ci 425bf215546Sopenharmony_cistruct etna_perfmon_signal * 426bf215546Sopenharmony_cietna_pm_query_signal(struct etna_perfmon *perfmon, 427bf215546Sopenharmony_ci const struct etna_perfmon_source *source) 428bf215546Sopenharmony_ci{ 429bf215546Sopenharmony_ci struct etna_perfmon_domain *domain; 430bf215546Sopenharmony_ci 431bf215546Sopenharmony_ci domain = etna_perfmon_get_dom_by_name(perfmon, source->domain); 432bf215546Sopenharmony_ci if (!domain) 433bf215546Sopenharmony_ci return NULL; 434bf215546Sopenharmony_ci 435bf215546Sopenharmony_ci return etna_perfmon_get_sig_by_name(domain, source->signal); 436bf215546Sopenharmony_ci} 437bf215546Sopenharmony_ci 438bf215546Sopenharmony_civoid 439bf215546Sopenharmony_cietna_pm_query_setup(struct etna_screen *screen) 440bf215546Sopenharmony_ci{ 441bf215546Sopenharmony_ci screen->perfmon = etna_perfmon_create(screen->pipe); 442bf215546Sopenharmony_ci 443bf215546Sopenharmony_ci if (!screen->perfmon) 444bf215546Sopenharmony_ci return; 445bf215546Sopenharmony_ci 446bf215546Sopenharmony_ci for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++) { 447bf215546Sopenharmony_ci const struct etna_perfmon_config *cfg = &query_config[i]; 448bf215546Sopenharmony_ci 449bf215546Sopenharmony_ci if (!etna_pm_cfg_supported(screen->perfmon, cfg)) 450bf215546Sopenharmony_ci continue; 451bf215546Sopenharmony_ci 452bf215546Sopenharmony_ci util_dynarray_append(&screen->supported_pm_queries, unsigned, i); 453bf215546Sopenharmony_ci } 454bf215546Sopenharmony_ci} 455bf215546Sopenharmony_ci 456bf215546Sopenharmony_ciconst struct etna_perfmon_config * 457bf215546Sopenharmony_cietna_pm_query_config(unsigned type) 458bf215546Sopenharmony_ci{ 459bf215546Sopenharmony_ci for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++) 460bf215546Sopenharmony_ci if (query_config[i].type == type) 461bf215546Sopenharmony_ci return &query_config[i]; 462bf215546Sopenharmony_ci 463bf215546Sopenharmony_ci return NULL; 464bf215546Sopenharmony_ci} 465bf215546Sopenharmony_ci 466bf215546Sopenharmony_ciint 467bf215546Sopenharmony_cietna_pm_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, 468bf215546Sopenharmony_ci struct pipe_driver_query_info *info) 469bf215546Sopenharmony_ci{ 470bf215546Sopenharmony_ci const struct etna_screen *screen = etna_screen(pscreen); 471bf215546Sopenharmony_ci const unsigned num = screen->supported_pm_queries.size / sizeof(unsigned); 472bf215546Sopenharmony_ci unsigned i; 473bf215546Sopenharmony_ci 474bf215546Sopenharmony_ci if (!info) 475bf215546Sopenharmony_ci return num; 476bf215546Sopenharmony_ci 477bf215546Sopenharmony_ci if (index >= num) 478bf215546Sopenharmony_ci return 0; 479bf215546Sopenharmony_ci 480bf215546Sopenharmony_ci i = *util_dynarray_element(&screen->supported_pm_queries, unsigned, index); 481bf215546Sopenharmony_ci assert(i < ARRAY_SIZE(query_config)); 482bf215546Sopenharmony_ci 483bf215546Sopenharmony_ci info->name = query_config[i].name; 484bf215546Sopenharmony_ci info->query_type = query_config[i].type; 485bf215546Sopenharmony_ci info->group_id = query_config[i].group_id; 486bf215546Sopenharmony_ci 487bf215546Sopenharmony_ci return 1; 488bf215546Sopenharmony_ci} 489bf215546Sopenharmony_ci 490bf215546Sopenharmony_cistatic 491bf215546Sopenharmony_ciunsigned query_count(unsigned group) 492bf215546Sopenharmony_ci{ 493bf215546Sopenharmony_ci unsigned count = 0; 494bf215546Sopenharmony_ci 495bf215546Sopenharmony_ci for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++) 496bf215546Sopenharmony_ci if (query_config[i].group_id == group) 497bf215546Sopenharmony_ci count++; 498bf215546Sopenharmony_ci 499bf215546Sopenharmony_ci assert(count); 500bf215546Sopenharmony_ci 501bf215546Sopenharmony_ci return count; 502bf215546Sopenharmony_ci} 503bf215546Sopenharmony_ci 504bf215546Sopenharmony_ciint 505bf215546Sopenharmony_cietna_pm_get_driver_query_group_info(struct pipe_screen *pscreen, 506bf215546Sopenharmony_ci unsigned index, 507bf215546Sopenharmony_ci struct pipe_driver_query_group_info *info) 508bf215546Sopenharmony_ci{ 509bf215546Sopenharmony_ci if (!info) 510bf215546Sopenharmony_ci return ARRAY_SIZE(group_names); 511bf215546Sopenharmony_ci 512bf215546Sopenharmony_ci if (index >= ARRAY_SIZE(group_names)) 513bf215546Sopenharmony_ci return 0; 514bf215546Sopenharmony_ci 515bf215546Sopenharmony_ci unsigned count = query_count(index); 516bf215546Sopenharmony_ci 517bf215546Sopenharmony_ci info->name = group_names[index]; 518bf215546Sopenharmony_ci info->max_active_queries = count; 519bf215546Sopenharmony_ci info->num_queries = count; 520bf215546Sopenharmony_ci 521bf215546Sopenharmony_ci return 1; 522bf215546Sopenharmony_ci} 523