From: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: Lionel G Landwerlin <lionel.g.landwerlin@linux.intel.com>
Subject: [igt-dev] [PATCH i-g-t 13/31] i915/perf: Add support for oa perf groups
Date: Tue, 14 Feb 2023 16:46:30 -0800 [thread overview]
Message-ID: <20230215004648.2100655-14-umesh.nerlige.ramappa@intel.com> (raw)
In-Reply-To: <20230215004648.2100655-1-umesh.nerlige.ramappa@intel.com>
With multiple OA buffers, we need a way to group engines per OA buffer.
Add support for oa perf groups for tests
Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
---
tests/i915/perf.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 169 insertions(+)
diff --git a/tests/i915/perf.c b/tests/i915/perf.c
index 90c78929..727eaf4e 100644
--- a/tests/i915/perf.c
+++ b/tests/i915/perf.c
@@ -39,6 +39,7 @@
#include <math.h>
#include "i915/gem.h"
+#include "i915/gem_engine_topology.h"
#include "i915/perf.h"
#include "igt.h"
#include "igt_perf.h"
@@ -238,6 +239,8 @@ static int pm_fd = -1;
static int stream_fd = -1;
static uint32_t devid;
static struct intel_execution_engine2 default_e2;
+static struct perf_engine_group *perf_oa_groups;
+static uint32_t num_perf_oa_groups;
static uint64_t gt_max_freq_mhz = 0;
static struct intel_perf *intel_perf = NULL;
@@ -5312,6 +5315,167 @@ test_sysctl_defaults(void)
if (e__->class == I915_ENGINE_CLASS_RENDER) \
igt_dynamic_f("%s", e__->name)
+struct perf_engine_group {
+ /* exclusive perf fd per engine group */
+ int perf_fd;
+
+ /* gem context id passed to perf */
+ uint32_t ctx_id;
+ uint32_t oa_unit_id;
+
+ /* perf engines in a group */
+ int num_engines;
+ struct i915_engine_class_instance *ci;
+};
+
+static struct drm_i915_query_engine_info *query_engine_info(int i915)
+{
+ struct drm_i915_query_engine_info *qinfo;
+
+#define QUERY_SIZE (0x4000)
+ qinfo = malloc(QUERY_SIZE);
+ igt_assert(qinfo);
+ memset(qinfo, 0, QUERY_SIZE);
+ igt_assert(!__gem_query_engines(i915, qinfo, QUERY_SIZE));
+#undef QUERY_SIZE
+
+ return qinfo;
+}
+
+static int compare_engine_oa_unit_id(const void *e1, const void *e2)
+{
+ const struct drm_i915_engine_info *_e1 = e1;
+ const struct drm_i915_engine_info *_e2 = e2;
+
+ return (int)_e1->rsvd0 - (int)_e2->rsvd0;
+}
+
+static struct perf_engine_group *default_engine_group(uint32_t *num_groups)
+{
+ struct perf_engine_group *groups = malloc(sizeof(*groups));
+
+ igt_debug("using default engine group\n");
+
+ groups->perf_fd = -1,
+ groups->ctx_id = 0xffffffff,
+ groups->oa_unit_id = 0,
+ groups->num_engines = 1,
+
+ groups->ci = malloc(sizeof(*groups->ci));
+ groups->ci->engine_class = default_e2.class;
+ groups->ci->engine_instance = default_e2.instance;
+
+ *num_groups = 1;
+
+ return groups;
+}
+
+/* Until oa_unit_id is exposed from uapi, work around it */
+static void populate_mtl_oa_unit_ids(struct drm_i915_query_engine_info *qinfo)
+{
+ struct i915_engine_class_instance ci;
+ int i;
+
+ for (i = 0; i < qinfo->num_engines; i++) {
+ ci = qinfo->engines[i].engine;
+
+ switch (ci.engine_class) {
+ case I915_ENGINE_CLASS_RENDER:
+ qinfo->engines[i].rsvd0 = 0;
+ break;
+
+ case I915_ENGINE_CLASS_VIDEO:
+ case I915_ENGINE_CLASS_VIDEO_ENHANCE:
+ qinfo->engines[i].rsvd0 = 1;
+ break;
+
+ default:
+ qinfo->engines[i].rsvd0 = UINT32_MAX;
+ break;
+ }
+
+ igt_debug("class:instance = %d:%d, id = %d\n",
+ ci.engine_class, ci.engine_instance,
+ qinfo->engines[i].rsvd0);
+ }
+}
+
+static struct perf_engine_group *get_engine_groups(int i915, uint32_t *num_groups)
+{
+ struct drm_i915_query_engine_info *qinfo;
+ struct perf_engine_group *groups = NULL;
+ uint32_t id = UINT32_MAX, num_grps = 0, i = 0, j;
+
+ qinfo = query_engine_info(i915);
+ if (!qinfo)
+ return default_engine_group(num_groups);
+ igt_assert(qinfo->num_engines);
+
+ /* Currently only meteorlake is supported with engine groups */
+ if (IS_METEORLAKE(devid)) {
+ populate_mtl_oa_unit_ids(qinfo);
+ } else {
+ free(qinfo);
+ return default_engine_group(num_groups);
+ }
+
+ /* sort so that engines with same oa id are together */
+ qsort(qinfo->engines, qinfo->num_engines, sizeof(qinfo->engines[0]),
+ compare_engine_oa_unit_id);
+
+ /* create groups */
+ for (i = 0; i < qinfo->num_engines; i++) {
+ struct i915_engine_class_instance ci = qinfo->engines[i].engine;
+
+ igt_debug("class:instance = %d:%d, id = %d\n",
+ ci.engine_class, ci.engine_instance,
+ qinfo->engines[i].rsvd0);
+
+ if (qinfo->engines[i].rsvd0 == UINT32_MAX)
+ continue;
+
+ if (qinfo->engines[i].rsvd0 != id) {
+ id = qinfo->engines[i].rsvd0;
+ groups = realloc(groups, ++num_grps * sizeof(*groups));
+ j = num_grps - 1;
+ groups[j].perf_fd = -1;
+ groups[j].ctx_id = 0xffffffff;
+ groups[j].oa_unit_id = id;
+ groups[j].num_engines = 0;
+ /* alloc max engines, trim later */
+ groups[j].ci = malloc(qinfo->num_engines * sizeof(ci));
+ }
+ groups[j].ci[groups[j].num_engines++] = ci;
+ }
+
+ igt_assert(num_grps);
+
+ /* trim engines */
+ for (i = 0; i < num_grps; i++) {
+ struct i915_engine_class_instance *ci = groups[i].ci;
+
+ ci = realloc(ci, groups[i].num_engines * sizeof(*ci));
+ groups[i].ci = ci;
+ }
+
+ *num_groups = num_grps;
+
+ free(qinfo);
+
+ return groups;
+}
+
+static void put_engine_groups(struct perf_engine_group *groups,
+ unsigned int num_groups)
+{
+ int i;
+
+ for (i = 0; i < num_groups; i++)
+ free(groups[i].ci);
+
+ free(groups);
+}
+
static bool has_class_instance(int i915, uint16_t class, uint16_t instance)
{
int fd;
@@ -5382,6 +5546,8 @@ igt_main
write_u64_file("/proc/sys/dev/i915/oa_max_sample_rate", 100000);
gt_max_freq_mhz = sysfs_read(RPS_RP0_FREQ_MHZ);
+ perf_oa_groups = get_engine_groups(drm_fd, &num_perf_oa_groups);
+ igt_assert(perf_oa_groups && num_perf_oa_groups);
if (has_class_instance(drm_fd, I915_ENGINE_CLASS_RENDER, 0))
render_copy = igt_get_render_copyfunc(devid);
@@ -5604,6 +5770,9 @@ igt_main
if (intel_perf)
intel_perf_free(intel_perf);
+ if (perf_oa_groups)
+ put_engine_groups(perf_oa_groups, num_perf_oa_groups);
+
intel_ctx_destroy(drm_fd, ctx);
close(drm_fd);
}
--
2.36.1
next prev parent reply other threads:[~2023-02-15 0:46 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-15 0:46 [igt-dev] [PATCH i-g-t 00/31] Enable OAM support in IGT and GPUvis Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 01/31] i915/perf: Add support for 64-bit OA formats Umesh Nerlige Ramappa
2023-03-04 2:55 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 02/31] i915/perf: Define a default engine for OA Umesh Nerlige Ramappa
2023-03-04 3:05 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 03/31] i915/perf: Use default engine for sseu tests Umesh Nerlige Ramappa
2023-03-04 3:08 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 04/31] i915/perf: Ensure rcs0 is present for gen12-mi-rpc Umesh Nerlige Ramappa
2023-03-04 3:26 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 05/31] i915/perf: Use ARRAY_SIZE for buffer-fill test Umesh Nerlige Ramappa
2023-03-04 3:28 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 06/31] i915/perf: Add class:instance support to OA tests Umesh Nerlige Ramappa
2023-03-04 3:38 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 07/31] i915/perf: Enable tests to run on specific engines Umesh Nerlige Ramappa
2023-03-06 22:19 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 08/31] i915/perf: Treat ticks as 64 bit Umesh Nerlige Ramappa
2023-03-06 23:13 ` Dixit, Ashutosh
2023-03-09 22:55 ` Umesh Nerlige Ramappa
2023-03-09 23:00 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 09/31] i915/perf: Treat timestamp as 64 bit value Umesh Nerlige Ramappa
2023-03-07 12:53 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 10/31] i915/perf: Add OAM format type Umesh Nerlige Ramappa
2023-03-07 13:45 ` Kamil Konieczny
2023-03-09 22:39 ` Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 11/31] i915/perf: Move OA format array from stack to heap Umesh Nerlige Ramappa
2023-03-07 13:32 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 12/31] i915/perf: Use a helper for OA format Umesh Nerlige Ramappa
2023-03-07 13:49 ` Kamil Konieczny
2023-02-15 0:46 ` Umesh Nerlige Ramappa [this message]
2023-03-07 14:09 ` [igt-dev] [PATCH i-g-t 13/31] i915/perf: Add support for oa perf groups Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 14/31] i915/perf: Test concurrent access to OA in different groups Umesh Nerlige Ramappa
2023-03-13 15:04 ` Kamil Konieczny
2023-03-14 23:17 ` Dixit, Ashutosh
2023-03-15 20:40 ` Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 15/31] i915/perf: Add OAM support Umesh Nerlige Ramappa
2023-03-13 15:21 ` Kamil Konieczny
2023-03-15 0:38 ` Dixit, Ashutosh
2023-03-15 20:37 ` Umesh Nerlige Ramappa
2023-03-15 21:52 ` Dixit, Ashutosh
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 16/31] lib/perf: Make chipsets aware of oa formats Umesh Nerlige Ramappa
2023-03-13 15:49 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 17/31] i915/perf: Choose OAM format for media metrics Umesh Nerlige Ramappa
2023-03-13 15:52 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 18/31] lib/perf" Set missing metric unit for some counters Umesh Nerlige Ramappa
2023-02-24 13:22 ` Kamil Konieczny
2023-03-15 4:44 ` Dixit, Ashutosh
2023-03-15 19:58 ` Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 19/31] lib/perf: Add MTL to supprted HW in oa guid registry Umesh Nerlige Ramappa
2023-03-13 15:55 ` Kamil Konieczny
2023-03-13 15:57 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 20/31] lib/perf: Add support for OAM format in codegen Umesh Nerlige Ramappa
2023-03-13 16:04 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 21/31] lib/perf: Update MTL GT2 metrics for OAM Umesh Nerlige Ramappa
2023-03-13 16:09 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 22/31] lib/perf: Update MTL GT3 " Umesh Nerlige Ramappa
2023-03-13 16:15 ` Kamil Konieczny
2023-03-16 18:38 ` Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 23/31] i915/perf: Add support for engine specific metrics Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 24/31] i915/perf: Run non-zero-reason on media engines as well Umesh Nerlige Ramappa
2023-03-15 16:50 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 25/31] i915/perf: Make sanity check failures descriptive Umesh Nerlige Ramappa
2023-03-15 16:47 ` Kamil Konieczny
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 26/31] lib/perf: Enable multi-tile support for perf library Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 27/31] lib/perf: Update MTL OA timestamp and EU thread config Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 28/31] lib/perf: Add support for MPEC format Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 29/31] lib/perf: Adjust the GPU timestamp for new OA formats Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 30/31] tools/perf: Choose the right card Umesh Nerlige Ramappa
2023-02-16 19:39 ` Kamil Konieczny
2023-02-16 21:27 ` Umesh Nerlige Ramappa
2023-03-03 1:17 ` Umesh Nerlige Ramappa
2023-02-15 0:46 ` [igt-dev] [PATCH i-g-t 31/31] lib/perf: Apply shift to raw timestamp as well Umesh Nerlige Ramappa
2023-02-15 1:26 ` [igt-dev] ✓ Fi.CI.BAT: success for Enable OAM support in IGT and GPUvis (rev2) Patchwork
2023-02-15 14:12 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230215004648.2100655-14-umesh.nerlige.ramappa@intel.com \
--to=umesh.nerlige.ramappa@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=lionel.g.landwerlin@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox