[igt-dev] [RFC PATCH i-g-t] lib/i915: Generate engine names at runtime

Petri Latvala petri.latvala at intel.com
Fri Nov 15 12:14:45 UTC 2019


The kernel supplies us an engine list with engine class and an
instance id. If the hardcoded engine list doesn't have the
class+instance we get, construct the engine name with printf instead
of calling additional engines "unknown".

Signed-off-by: Petri Latvala <petri.latvala at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Cc: Andi Shyti <andi.shyti at intel.com>
Cc: Katarzyna Dec <katarzyna.dec at intel.com>

---
 lib/i915/gem_engine_topology.c | 27 +++++++++++++++++++--------
 lib/i915/gem_engine_topology.h |  2 +-
 lib/igt_gt.c                   |  8 ++++++++
 lib/igt_gt.h                   |  7 ++++++-
 4 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/lib/i915/gem_engine_topology.c b/lib/i915/gem_engine_topology.c
index 790d455f..0707f237 100644
--- a/lib/i915/gem_engine_topology.c
+++ b/lib/i915/gem_engine_topology.c
@@ -103,6 +103,7 @@ static void init_engine(struct intel_execution_engine2 *e2,
 	const struct intel_execution_engine2 *__e2;
 	static const char *unknown_name = "unknown",
 			  *virtual_name = "virtual";
+	const struct intel_execution_engine_class *cls;
 
 	e2->class    = class;
 	e2->instance = instance;
@@ -111,7 +112,7 @@ static void init_engine(struct intel_execution_engine2 *e2,
 	/* engine is a virtual engine */
 	if (class == I915_ENGINE_CLASS_INVALID &&
 	    instance == I915_ENGINE_CLASS_INVALID_VIRTUAL) {
-		e2->name = virtual_name;
+		strncpy(e2->name, virtual_name, sizeof(e2->name));
 		e2->is_virtual = true;
 		return;
 	}
@@ -120,12 +121,22 @@ static void init_engine(struct intel_execution_engine2 *e2,
 		if (__e2->class == class && __e2->instance == instance)
 			break;
 
-	if (__e2->name) {
-		e2->name = __e2->name;
+	if (__e2->name[0]) {
+		strncpy(e2->name, __e2->name, sizeof(e2->name));
 	} else {
-		igt_warn("found unknown engine (%d, %d)\n", class, instance);
-		e2->name = unknown_name;
-		e2->flags = -1;
+		for (cls = intel_execution_engine_class_map; cls->name; cls++) {
+			if (cls->class == class) {
+				snprintf(e2->name, sizeof(e2->name), "%s%d", cls->name, instance);
+				igt_info("unknown but supported engine %s found\n", e2->name);
+				break;
+			}
+		}
+
+		if (!e2->name[0]) {
+			igt_info("found unknown engine (%d, %d)\n", class, instance);
+			strncpy(e2->name, unknown_name, sizeof(e2->name));
+			e2->flags = -1;
+		}
 	}
 
 	/* just to remark it */
@@ -223,7 +234,7 @@ struct intel_engine_data intel_init_engine_list(int fd, uint32_t ctx_id)
 			struct intel_execution_engine2 *__e2 =
 				&engine_data.engines[engine_data.nengines];
 
-			__e2->name       = e2->name;
+			strncpy(__e2->name, e2->name, sizeof(__e2->name));
 			__e2->instance   = e2->instance;
 			__e2->class      = e2->class;
 			__e2->flags      = e2->flags;
@@ -302,7 +313,7 @@ struct intel_execution_engine2 gem_eb_flags_to_engine(unsigned int flags)
 
 	if (ring == I915_EXEC_DEFAULT) {
 		e2__.flags = I915_EXEC_DEFAULT;
-		e2__.name = "default";
+		strncpy(e2__.name, "default", sizeof(e2__.name));
 	} else {
 		const struct intel_execution_engine2 *e2;
 
diff --git a/lib/i915/gem_engine_topology.h b/lib/i915/gem_engine_topology.h
index d98773e0..525741cc 100644
--- a/lib/i915/gem_engine_topology.h
+++ b/lib/i915/gem_engine_topology.h
@@ -61,7 +61,7 @@ bool gem_engine_is_equal(const struct intel_execution_engine2 *e1,
 struct intel_execution_engine2 gem_eb_flags_to_engine(unsigned int flags);
 
 #define __for_each_static_engine(e__) \
-	for ((e__) = intel_execution_engines2; (e__)->name; (e__)++)
+	for ((e__) = intel_execution_engines2; (e__)->name[0]; (e__)++)
 
 #define for_each_context_engine(fd__, ctx__, e__) \
 	for (struct intel_engine_data i__ = intel_init_engine_list(fd__, ctx__); \
diff --git a/lib/igt_gt.c b/lib/igt_gt.c
index 256c7cbc..25e6c455 100644
--- a/lib/igt_gt.c
+++ b/lib/igt_gt.c
@@ -596,6 +596,14 @@ const struct intel_execution_engine2 intel_execution_engines2[] = {
 	{ }
 };
 
+const struct intel_execution_engine_class intel_execution_engine_class_map[] = {
+	{ "rcs", I915_ENGINE_CLASS_RENDER },
+	{ "bcs", I915_ENGINE_CLASS_COPY },
+	{ "vcs", I915_ENGINE_CLASS_VIDEO },
+	{ "vecs", I915_ENGINE_CLASS_VIDEO_ENHANCE },
+	{ }
+};
+
 int gem_execbuf_flags_to_engine_class(unsigned int flags)
 {
 	switch (flags & 0x3f) {
diff --git a/lib/igt_gt.h b/lib/igt_gt.h
index 66088d39..0268031f 100644
--- a/lib/igt_gt.h
+++ b/lib/igt_gt.h
@@ -95,13 +95,18 @@ bool gem_can_store_dword(int fd, unsigned int engine);
 bool gem_class_can_store_dword(int fd, int class);
 
 extern const struct intel_execution_engine2 {
-	const char *name;
+	char name[10];
 	int class;
 	int instance;
 	uint64_t flags;
 	bool is_virtual;
 } intel_execution_engines2[];
 
+extern const struct intel_execution_engine_class {
+	const char *name;
+	int class;
+} intel_execution_engine_class_map[];
+
 int gem_execbuf_flags_to_engine_class(unsigned int flags);
 
 #endif /* IGT_GT_H */
-- 
2.19.1



More information about the igt-dev mailing list