From 5edbcca82b44a3c6e4938e98e267933ecfd394c0 Mon Sep 17 00:00:00 2001 From: Christoph Pillmayer Date: Thu, 16 Apr 2026 17:21:10 +0200 Subject: [PATCH] pan/perf: Support reading derived counters Also pull out pan_perf_counter_read_raw into the header to help inlining into the generated equation functions added afterwards. --- src/panfrost/perf/pan_perf.c | 17 ++++------------- src/panfrost/perf/pan_perf.h | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/panfrost/perf/pan_perf.c b/src/panfrost/perf/pan_perf.c index 28961ea7eb8..66cd514bed4 100644 --- a/src/panfrost/perf/pan_perf.c +++ b/src/panfrost/perf/pan_perf.c @@ -21,19 +21,10 @@ int64_t pan_perf_counter_read(const struct pan_perf *perf, const struct pan_perf_counter *counter, uint8_t block) { - STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_FRONTEND == (int)PAN_PERF_COUNTER_CAT_FRONTEND); - STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_TILER == (int)PAN_PERF_COUNTER_CAT_TILER); - STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_MEMSYS == (int)PAN_PERF_COUNTER_CAT_MEMSYS); - STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_SHADER == (int)PAN_PERF_COUNTER_CAT_SHADER); - - assert(perf->session->data != NULL); - - const uint32_t offset = perf->mem_layout.category[counter->category].offset + - perf->mem_layout.block_stride * block + - perf->mem_layout.counter_stride * counter->offset; - - uint8_t *val_ptr = ((uint8_t *)perf->session->data) + offset; - return pan_kmod_perf_load_counter(perf->session, val_ptr); + if (counter->derived != NULL) + return counter->derived(perf, perf->derived_configs, block); + else + return pan_perf_counter_read_raw(perf, counter->category, counter->offset, block); } int64_t diff --git a/src/panfrost/perf/pan_perf.h b/src/panfrost/perf/pan_perf.h index 48c2a8ef77f..3c8640789cc 100644 --- a/src/panfrost/perf/pan_perf.h +++ b/src/panfrost/perf/pan_perf.h @@ -98,6 +98,27 @@ struct pan_perf { double derived_configs[PAN_PERF_DERIVED_CONFIG_LAST + 1]; }; +static inline +int64_t pan_perf_counter_read_raw(const struct pan_perf *perf, + enum pan_perf_counter_categories cat, + uint8_t counter_index, + uint8_t block) +{ + STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_FRONTEND == (int)PAN_PERF_COUNTER_CAT_FRONTEND); + STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_TILER == (int)PAN_PERF_COUNTER_CAT_TILER); + STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_MEMSYS == (int)PAN_PERF_COUNTER_CAT_MEMSYS); + STATIC_ASSERT((int)PAN_KMOD_PERF_CAT_SHADER == (int)PAN_PERF_COUNTER_CAT_SHADER); + + assert(perf->session->data != NULL); + + const uint32_t offset = perf->mem_layout.category[cat].offset + + perf->mem_layout.block_stride * block + + perf->mem_layout.counter_stride * counter_index; + + uint8_t *val_ptr = ((uint8_t *)perf->session->data) + offset; + return pan_kmod_perf_load_counter(perf->session, val_ptr); +} + int64_t pan_perf_counter_read(const struct pan_perf *perf, const struct pan_perf_counter *counter, uint8_t block);