From 838d0775043774e61f3aa3a7d8ea440a71d521c0 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 21 Jun 2016 12:14:14 +0100 Subject: igt: Add basic framework for GVT-g testing We don't do anything yet other than try to load the module. Initial sanity checks to come. Signed-off-by: Chris Wilson Cc: Zhi Wang --- lib/igt_gvt.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 lib/igt_gvt.c (limited to 'lib/igt_gvt.c') diff --git a/lib/igt_gvt.c b/lib/igt_gvt.c new file mode 100644 index 00000000..0f332d1c --- /dev/null +++ b/lib/igt_gvt.c @@ -0,0 +1,117 @@ +/* + * Copyright © 2016 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "igt.h" +#include "igt_gvt.h" + +#include +#include +#include + +static bool is_gvt_enabled(void) +{ + FILE *file; + int value; + bool enabled = false; + + file = fopen("/sys/module/i915/parameters/enable_gvt", "r"); + if (!file) + return false; + + if (fscanf(file, "%d", &value) == 1) + enabled = value; + fclose(file); + + errno = 0; + return enabled; +} + +static void unbind_fbcon(void) +{ + 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) { + igt_ignore_warn(write(fd, "1\n", 2)); + close(fd); + } + break; + } + } + closedir(dir); +} + +static void unload_i915(void) +{ + unbind_fbcon(); + /* pkill alsact */ + + igt_ignore_warn(system("/sbin/modprobe -s -r i915")); +} + +bool igt_gvt_load_module(void) +{ + if (is_gvt_enabled()) + return true; + + unload_i915(); + igt_ignore_warn(system("/sbin/modprobe -s i915 enable_gvt=1")); + + return is_gvt_enabled(); +} + +void igt_gvt_unload_module(void) +{ + if (!is_gvt_enabled()) + return; + + unload_i915(); + igt_ignore_warn(system("/sbin/modprobe -s i915 enable_gvt=0")); + + igt_assert(!is_gvt_enabled()); +} -- cgit v1.2.3