[igt-dev] [PATCH i-g-t, v4 4/5] i915/gem_engine_topology: Only use the main copy engines for XY_BLOCK_COPY
From: <hidden>
Date: 2021-12-10 13:00:50
Subsystem:
library code, the rest · Maintainers:
Andrew Morton, Linus Torvalds
From: Chris Wilson <redacted> XY_BLOCK_COPY blt command is used to transfer the ccs data. So, we can only run the tests on those engines which have support for the "block_copy" capability. Signed-off-by: Chris Wilson <redacted> Signed-off-by: Apoorva Singh <redacted> Cc: Zbigniew Kempczyński <redacted> Cc: Melkaveri, Arjun <redacted> --- lib/i915/gem_engine_topology.c | 38 ++++++++++++++++++++++++++++++++++ lib/i915/gem_engine_topology.h | 5 +++++ 2 files changed, 43 insertions(+)
diff --git a/lib/i915/gem_engine_topology.c b/lib/i915/gem_engine_topology.c
index 729f42b0..37b5875e 100644
--- a/lib/i915/gem_engine_topology.c
+++ b/lib/i915/gem_engine_topology.c@@ -488,6 +488,44 @@ int gem_engine_property_printf(int i915, const char *engine, const char *attr, return ret; } +static bool +__gem_engine_has_capability(int i915, const char *engine, + const char *attr, const char *cap) +{ + char buf[4096] = {}; + FILE *file; + + file = __open_attr(igt_sysfs_open(i915), "r", + "engine", engine, attr, NULL); + if (file) { + fread(buf, 1, sizeof(buf) - 1, file); + fclose(file); + } + + return strstr(buf, cap); +} + +bool gem_engine_has_capability(int i915, const char *engine, const char *cap) +{ + return __gem_engine_has_capability(i915, engine, "capabilities", cap); +} + +bool gem_engine_has_known_capability(int i915, const char *engine, const char *cap) +{ + return __gem_engine_has_capability(i915, engine, "known_capabilities", cap); +} + +bool gem_engine_can_block_copy(int i915, const struct intel_execution_engine2 *engine) +{ + if (engine->class != I915_ENGINE_CLASS_COPY) + return false; + + if (!gem_engine_has_known_capability(i915, engine->name, "block_copy")) + return intel_gen(intel_get_drm_devid(i915)) >= 12; + + return gem_engine_has_capability(i915, engine->name, "block_copy"); +} + uint32_t gem_engine_mmio_base(int i915, const char *engine) { unsigned int mmio = 0;
diff --git a/lib/i915/gem_engine_topology.h b/lib/i915/gem_engine_topology.h
index 4cfab560..d24bc9e8 100644
--- a/lib/i915/gem_engine_topology.h
+++ b/lib/i915/gem_engine_topology.h@@ -124,6 +124,11 @@ int gem_engine_property_printf(int i915, const char *engine, const char *attr, uint32_t gem_engine_mmio_base(int i915, const char *engine); +bool gem_engine_has_capability(int i915, const char *engine, const char *cap); +bool gem_engine_has_known_capability(int i915, const char *engine, const char *cap); + +bool gem_engine_can_block_copy(int i915, const struct intel_execution_engine2 *engine); + void dyn_sysfs_engines(int i915, int engines, const char *file, void (*test)(int i915, int engine));
--
2.25.1