Make setting engine tunables easier!

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 lib/i915/gem_engine_topology.c | 49 +++++++++++++++++++++++++++-------
 lib/i915/gem_engine_topology.h |  4 +++
 2 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/lib/i915/gem_engine_topology.c b/lib/i915/gem_engine_topology.c
index 6eca28236..79bc977eb 100644
--- a/lib/i915/gem_engine_topology.c
+++ b/lib/i915/gem_engine_topology.c
@@ -333,13 +333,25 @@ bool gem_engine_is_equal(const struct 
intel_execution_engine2 *e1,
        return e1->class == e2->class && e1->instance == e2->instance;
 }
 
-static FILE *__open_attr(int dir, ...)
+static int reopen(int dir, int mode)
+{
+       char buf[128];
+       int fd;
+
+       snprintf(buf, sizeof(buf), "/proc/self/fd/%d", dir);
+       fd = open(buf, mode);
+       close(dir);
+
+       return fd;
+}
+
+static FILE *__open_attr(int dir, const char *mode, ...)
 {
        const char *path;
        FILE *file;
        va_list ap;
 
-       va_start(ap, dir);
+       va_start(ap, mode);
        while (dir >= 0 && (path = va_arg(ap, const char *))) {
                int fd;
 
@@ -350,7 +362,10 @@ static FILE *__open_attr(int dir, ...)
        }
        va_end(ap);
 
-       file = fdopen(dir, "r");
+       if (*mode != 'r') /* clumsy, but fun */
+               dir = reopen(dir, O_RDWR);
+
+       file = fdopen(dir, mode);
        if (!file) {
                close(dir);
                return NULL;
@@ -365,13 +380,9 @@ int gem_engine_property_scanf(int i915, const char 
*engine, const char *attr,
        FILE *file;
        va_list ap;
        int ret;
-       int fd;
-
-       fd = igt_sysfs_open(i915);
-       if (fd < 0)
-               return fd;
 
-       file = __open_attr(fd, "engine", engine, attr, NULL);
+       file = __open_attr(igt_sysfs_open(i915), "r",
+                          "engine", engine, attr, NULL);
        if (!file)
                return -1;
 
@@ -383,6 +394,26 @@ int gem_engine_property_scanf(int i915, const char 
*engine, const char *attr,
        return ret;
 }
 
+int gem_engine_property_printf(int i915, const char *engine, const char *attr,
+                              const char *fmt, ...)
+{
+       FILE *file;
+       va_list ap;
+       int ret;
+
+       file = __open_attr(igt_sysfs_open(i915), "w",
+                          "engine", engine, attr, NULL);
+       if (!file)
+               return -1;
+
+       va_start(ap, fmt);
+       ret = vfprintf(file, fmt, ap);
+       va_end(ap);
+
+       fclose(file);
+       return ret;
+}
+
 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 219c84b72..5e3440fa8 100644
--- a/lib/i915/gem_engine_topology.h
+++ b/lib/i915/gem_engine_topology.h
@@ -78,6 +78,10 @@ struct intel_execution_engine2 
gem_eb_flags_to_engine(unsigned int flags);
 __attribute__((format(scanf, 4, 5)))
 int gem_engine_property_scanf(int i915, const char *engine, const char *attr,
                              const char *fmt, ...);
+__attribute__((format(printf, 4, 5)))
+int gem_engine_property_printf(int i915, const char *engine, const char *attr,
+                              const char *fmt, ...);
+
 uint32_t gem_engine_mmio_base(int i915, const char *engine);
 
 #endif /* GEM_ENGINE_TOPOLOGY_H */
-- 
2.25.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to