diff options
author | Jani Nikula <jani.nikula@intel.com> | 2020-05-07 22:09:42 +0300 |
---|---|---|
committer | Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> | 2020-05-08 15:21:50 +0300 |
commit | 75d260956011f397e7595393ac053712f09a8019 (patch) | |
tree | d350a3d9013a33097ca5fff69ada490e80ece218 /lib | |
parent | 840981d169d2ea73d16e1efeff7dabe351f71392 (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.c | 62 | ||||
-rw-r--r-- | lib/igt_params.h | 3 |
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); |