summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2020-05-07 22:09:42 +0300
committerJuha-Pekka Heikkila <juhapekka.heikkila@gmail.com>2020-05-08 15:21:50 +0300
commit75d260956011f397e7595393ac053712f09a8019 (patch)
treed350a3d9013a33097ca5fff69ada490e80ece218 /lib
parent840981d169d2ea73d16e1efeff7dabe351f71392 (diff)
igt/params: add generic saving module parameter set
Add functionality to save original value to be restored by exit handler and setting new value. Signed-off-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> Reviewed-by: Petri Latvala <petri.latvala@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/igt_params.c62
-rw-r--r--lib/igt_params.h3
2 files changed, 56 insertions, 9 deletions
diff --git a/lib/igt_params.c b/lib/igt_params.c
index fe4b1df3a..bc1f6af75 100644
--- a/lib/igt_params.c
+++ b/lib/igt_params.c
@@ -153,6 +153,29 @@ int igt_params_open(int device)
return __igt_params_open(device, NULL);
}
+__attribute__((format(printf, 3, 0)))
+static bool __igt_params_set(int device, const char *parameter,
+ const char *fmt, va_list ap, bool save)
+{
+ char *path = NULL;
+ int dir;
+ int ret;
+
+ dir = __igt_params_open(device, save ? &path : NULL);
+ if (dir < 0)
+ return false;
+
+ if (save)
+ igt_params_save(dir, path, parameter);
+
+ ret = igt_sysfs_vprintf(dir, parameter, fmt, ap);
+
+ close(dir);
+ free(path);
+
+ return ret > 0;
+}
+
/**
* igt_params_set:
* @device: fd of the device
@@ -164,20 +187,41 @@ int igt_params_open(int device)
bool igt_params_set(int device, const char *parameter, const char *fmt, ...)
{
va_list ap;
- int dir;
- int ret;
-
- dir = igt_params_open(device);
- if (dir < 0)
- return false;
+ bool ret;
va_start(ap, fmt);
- ret = igt_sysfs_vprintf(dir, parameter, fmt, ap);
+ ret = __igt_params_set(device, parameter, fmt, ap, false);
va_end(ap);
- close(dir);
+ return ret;
+}
- return ret > 0;
+/**
+ * igt_params_save_and_set:
+ * @device: fd of the device or -1 to default.
+ * @parameter: the name of the parameter to set
+ * @fmt: printf-esque format string
+ *
+ * Save original value to be restored by exit handler. Parameter is first
+ * searched at debugfs/dri/N/<device>_params and if not found will look for
+ * parameter at /sys/module/<device>/parameters.
+ *
+ * Giving -1 here for default device will search for matching device from
+ * debugfs/dri/N where N go from 0 to 63. First device found from debugfs
+ * which exist also at /sys/module/<device> will be 'default'.
+ *
+ * Returns true on success
+ */
+bool igt_params_save_and_set(int device, const char *parameter, const char *fmt, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start(ap, fmt);
+ ret = __igt_params_set(device, parameter, fmt, ap, true);
+ va_end(ap);
+
+ return ret;
}
/**
diff --git a/lib/igt_params.h b/lib/igt_params.h
index 52eed77f9..ed17f34a5 100644
--- a/lib/igt_params.h
+++ b/lib/igt_params.h
@@ -31,6 +31,9 @@ int igt_params_open(int device);
__attribute__((format(printf, 3, 4)))
bool igt_params_set(int device, const char *parameter, const char *fmt, ...);
+__attribute__((format(printf, 3, 4)))
+bool igt_params_save_and_set(int device, const char *parameter, const char *fmt, ...);
+
void igt_set_module_param(const char *name, const char *val);
void igt_set_module_param_int(const char *name, int val);