diff options
author | Marius Vlad <marius.c.vlad@intel.com> | 2016-12-01 21:45:47 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-01 21:45:47 +0000 |
commit | 0268d73b0b267c6f5acdd4bf40ae917b3afff96c (patch) | |
tree | cc5f3c23378db20553bb2087cf5c7f0b1fe1cd49 /lib/igt_sysfs.c | |
parent | 4d8f3b2c8034f1bdf64d65d484e5d5cd18410fb7 (diff) |
lib/igt_kmod: New library to support driver loading/unloading and additional helpers.
lib/igt_aux: Added igt_pkill and igt_lsof helper.
lib/igt_kmod: Added load/unload kmod helpers.
v7:
- document the case where leaving stray fd from drm_open_driver()
might fail reloading the driver.
- list also current opened files from /dev/dri in case we could not
unload the driver.
- convert igt_info to igt_warn (Chris Wilson)
- added KMOD_|PROCPS CFLAGS (Chris Wilson)
v6:
- include latest modifications from tests/drv_module_reload:
display all loaded modules and list information about opened
files by processes (Petri Latvala)
v5:
- added igt_i915_driver_{load/unload}.
- added kick_snd_hda_intel() to match current
tests/drv_module_reload_basic and integrated into
igt_i915_driver_load/unload.
- added gtk-doc section for lib/igt_kmod
v4:
- decided to split libkmod helpers into their own file as there's
another user lib/igt_gvt or tests/gvt_basic.
- fixed some gtk-doc documentation.
v3:
- return -errno (igt_pkill()) in case of failure (Cris Wilson)
- return bool for igt_kmod_is_loaded(), replaced strncasecmp with strncmp
(Chris Wilson)
v2:
- Renamed libkmod helpers (Chris Wilson)
- Removed SIGTERM/SIGKILL case where we repeatedly tried to terminate the
process: just call kill(2) once (Chris Wilson)
- Removed redundant check in igt_kmod_unload(), igt_module_in_use() (Chris
Wilson)
- Pass flags to igt_kmod_unload() from the caller (Chris Wilson)
- Removed useless function igt_kill() which acts just as kill(2) (Chris
Wilson)
Signed-off-by: Marius Vlad <marius.c.vlad@intel.com>
Diffstat (limited to 'lib/igt_sysfs.c')
-rw-r--r-- | lib/igt_sysfs.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/lib/igt_sysfs.c b/lib/igt_sysfs.c index c19821da..570329d0 100644 --- a/lib/igt_sysfs.c +++ b/lib/igt_sysfs.c @@ -34,7 +34,11 @@ #include <fcntl.h> #include <unistd.h> #include <i915_drm.h> +#include <dirent.h> +#include <unistd.h> +#include <fcntl.h> +#include "igt_core.h" #include "igt_sysfs.h" /** @@ -392,3 +396,105 @@ bool igt_sysfs_set_boolean(int dir, const char *attr, bool value) { return igt_sysfs_printf(dir, attr, "%d", value) == 1; } + +/** + * kick_fbcon: + * @enable: boolean value + * + * This functions enables/disables the text console running on top of the + * framebuffer device. + */ +void kick_fbcon(bool enable) +{ + char buf[128]; + const char *path = "/sys/class/vtconsole"; + DIR *dir; + struct dirent *vtcon; + + dir = opendir(path); + if (!dir) + return; + + while ((vtcon = readdir(dir))) { + int fd, len; + + if (strncmp(vtcon->d_name, "vtcon", 5)) + continue; + + sprintf(buf, "%s/%s/name", path, vtcon->d_name); + fd = open(buf, O_RDONLY); + if (fd < 0) + continue; + + len = read(fd, buf, sizeof(buf) - 1); + close(fd); + if (len >= 0) + buf[len] = '\0'; + + if (strstr(buf, "frame buffer device")) { + sprintf(buf, "%s/%s/bind", path, vtcon->d_name); + fd = open(buf, O_WRONLY); + if (fd != -1) { + if (enable) + igt_ignore_warn(write(fd, "1\n", 2)); + else + igt_ignore_warn(write(fd, "0\n", 2)); + close(fd); + } + break; + } + } + closedir(dir); +} + +/** + * kick_snd_hda_intel: + * + * This functions unbinds the snd_hda_intel driver so the module cand be + * unloaded. + * + */ +void kick_snd_hda_intel(void) +{ + DIR *dir; + struct dirent *snd_hda; + int fd; size_t len; + + const char *dpath = "/sys/bus/pci/drivers/snd_hda_intel"; + const char *path = "/sys/bus/pci/drivers/snd_hda_intel/unbind"; + const char *devid = "0000:"; + + fd = open(path, O_WRONLY); + if (fd < 0) { + return; + } + + dir = opendir(dpath); + if (!dir) + goto out; + + len = strlen(devid); + while ((snd_hda = readdir(dir))) { + struct stat st; + char fpath[PATH_MAX]; + + if (*snd_hda->d_name == '.') + continue; + + snprintf(fpath, sizeof(fpath), "%s/%s", dpath, snd_hda->d_name); + if (lstat(fpath, &st)) + continue; + + if (!S_ISLNK(st.st_mode)) + continue; + + if (!strncmp(devid, snd_hda->d_name, len)) { + igt_ignore_warn(write(fd, snd_hda->d_name, + strlen(snd_hda->d_name))); + } + } + + closedir(dir); +out: + close(fd); +} |