summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Wilson <chris.p.wilson@intel.com>2022-03-11 13:13:16 +0100
committerZbigniew Kempczyński <zbigniew.kempczynski@intel.com>2022-03-11 18:00:51 +0100
commit2a557449956ad2519c6d0cd893ef27e9aaf9b32d (patch)
tree1e9f07eaceb7f7d564108890d67c2b0c560cdd0d /lib
parentdbabc151cbfc263e5d5810e96d908216d896b781 (diff)
i915/gem_engine_topology: Add helpers for checking driver capabilities
If driver is able to report capabilities we want to use them in easy way. For example it can support blitter "block_copy" (XY_BLOCK_COPY_BLT command) and reports it in sysfs. We add then capabilities helpers to read these properties. Helpers allows checking does driver knows capability (by checking sysfs "known_capabilities" file) and supports it (by checking sysfs "capabilities" file). Dedicated helper was added to verify "block_copy" capability. Signed-off-by: Chris Wilson <chris.p.wilson@intel.com> Signed-off-by: Apoorva Singh <apoorva1.singh@intel.com> Cc: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com> Cc: Arjun Melkaveri <arjun.melkaveri@intel.com> Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/i915/gem_engine_topology.c39
-rw-r--r--lib/i915/gem_engine_topology.h5
2 files changed, 44 insertions, 0 deletions
diff --git a/lib/i915/gem_engine_topology.c b/lib/i915/gem_engine_topology.c
index bd12d0bc..ca3333c2 100644
--- a/lib/i915/gem_engine_topology.c
+++ b/lib/i915/gem_engine_topology.c
@@ -534,6 +534,45 @@ void gem_engine_properties_restore(int fd, const struct gem_engine_properties *s
}
}
+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)
+ return NULL;
+
+ 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 b413aa8a..987f2bf9 100644
--- a/lib/i915/gem_engine_topology.h
+++ b/lib/i915/gem_engine_topology.h
@@ -133,6 +133,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));