summaryrefslogtreecommitdiff
path: root/lib/igt_sysfs.c
diff options
context:
space:
mode:
authorMarius Vlad <marius.c.vlad@intel.com>2016-12-01 21:45:47 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2016-12-01 21:45:47 +0000
commit0268d73b0b267c6f5acdd4bf40ae917b3afff96c (patch)
treecc5f3c23378db20553bb2087cf5c7f0b1fe1cd49 /lib/igt_sysfs.c
parent4d8f3b2c8034f1bdf64d65d484e5d5cd18410fb7 (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.c106
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);
+}