From c36933e0818ade16cb9d29b91c7d4f0068f7af39 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 5 Oct 2018 17:31:11 +0100 Subject: [PATCH] intel/perf: add helper to compute metrics from counters The produced array tells use what metric to enable for a given pass. Signed-off-by: Lionel Landwerlin Reviewed-by: Jason Ekstrand Part-of: --- src/intel/perf/gen_perf.c | 24 ++++++++++++++++++++++++ src/intel/perf/gen_perf.h | 10 ++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/intel/perf/gen_perf.c b/src/intel/perf/gen_perf.c index 30b87a02647..8c24344ed04 100644 --- a/src/intel/perf/gen_perf.c +++ b/src/intel/perf/gen_perf.c @@ -821,6 +821,30 @@ gen_perf_get_n_passes(struct gen_perf_config *perf, return __builtin_popcount(queries_mask); } +void +gen_perf_get_counters_passes(struct gen_perf_config *perf, + const uint32_t *counter_indices, + uint32_t counter_indices_count, + struct gen_perf_counter_pass *counter_pass) +{ + uint64_t queries_mask = get_passes_mask(perf, counter_indices, counter_indices_count); + uint32_t n_passes = __builtin_popcount(queries_mask); + + for (uint32_t i = 0; i < counter_indices_count; i++) { + assert(counter_indices[i] < perf->n_counters); + + uint32_t idx = counter_indices[i]; + counter_pass[i].counter = perf->counters[idx]; + + uint32_t query_idx = ffsll(perf->counters[idx]->query_mask & queries_mask) - 1; + counter_pass[i].query = &perf->queries[query_idx]; + + uint32_t clear_bits = 63 - query_idx; + counter_pass[i].pass = __builtin_popcount((queries_mask << clear_bits) >> clear_bits) - 1; + assert(counter_pass[i].pass < n_passes); + } +} + /* Accumulate 32bits OA counters */ static inline void accumulate_uint32(const uint32_t *report0, diff --git a/src/intel/perf/gen_perf.h b/src/intel/perf/gen_perf.h index 70525d06441..6e02702ea00 100644 --- a/src/intel/perf/gen_perf.h +++ b/src/intel/perf/gen_perf.h @@ -289,6 +289,12 @@ struct gen_perf_config { } vtbl; }; +struct gen_perf_counter_pass { + struct gen_perf_query_info *query; + struct gen_perf_query_counter *counter; + uint32_t pass; +}; + void gen_perf_init_metrics(struct gen_perf_config *perf_cfg, const struct gen_device_info *devinfo, int drm_fd, @@ -359,5 +365,9 @@ uint32_t gen_perf_get_n_passes(struct gen_perf_config *perf, const uint32_t *counter_indices, uint32_t counter_indices_count, struct gen_perf_query_info **pass_queries); +void gen_perf_get_counters_passes(struct gen_perf_config *perf, + const uint32_t *counter_indices, + uint32_t counter_indices_count, + struct gen_perf_counter_pass *counter_pass); #endif /* GEN_PERF_H */ -- 2.30.2