diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-11-26 16:13:13 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-11-27 11:39:08 +0000 |
commit | 2021ef63be41a4b68d11ffa111508055182c40e1 (patch) | |
tree | d223cda17c949c567825aa693a6284b76b380e94 /tests/drm_mm.c | |
parent | eaa1c907e9abf8350273f6dbfd2d3115b52ba272 (diff) |
igt: Add kselftest runner for drm_mm
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests/drm_mm.c')
-rw-r--r-- | tests/drm_mm.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/tests/drm_mm.c b/tests/drm_mm.c new file mode 100644 index 00000000..b95fcb34 --- /dev/null +++ b/tests/drm_mm.c @@ -0,0 +1,127 @@ +/* + * 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 <libkmod.h> + +IGT_TEST_DESCRIPTION("Basic sanity check of DRM's range manager (struct drm_mm)"); + +static void squelch(void *data, int priority, + const char *file, int line, const char *fn, + const char *format, va_list args) +{ +} + +static void kmsg_dump(int fd) +{ + FILE *file; + + file = NULL; + if (fd != -1) + file = fdopen(fd, "r"); + if (file) { + size_t len = 0; + char *line = NULL; + + while (getline(&line, &len, file) != -1) { + char *start = strchr(line, ':'); + if (start) + igt_warn("%s", start + 2); + } + + free(line); + fclose(file); + } else { + igt_warn("Unable to retrieve kernel log (from /dev/kmsg)\n"); + } +} + +static void igt_kselftests(const char *module_name) +{ + struct kmod_ctx *ctx; + struct kmod_module *kmod; + struct kmod_list *d, *pre; + int err, kmsg = -1; + + ctx = kmod_new(NULL, NULL); + igt_assert(ctx != NULL); + + kmod_set_log_fn(ctx, squelch, NULL); + + igt_require(kmod_module_new_from_name(ctx, module_name, &kmod) == 0); + igt_fixture { + err = kmod_module_remove_module(kmod, KMOD_REMOVE_FORCE); + igt_require(err == 0 || err == -ENOENT); + + kmsg = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + } + + pre = NULL; + if (kmod_module_get_info(kmod, &pre)) { + kmod_list_foreach(d, pre) { + const char *key, *val; + char *option, *colon; + + key = kmod_module_info_get_key(d); + if (strcmp(key, "parmtype")) + continue; + + val = kmod_module_info_get_value(d); + if (!val || strncmp(val, "subtest__", 9)) + continue; + + option = strdup(val); + colon = strchr(option, ':'); + *colon = '\0'; + + igt_subtest_f("%s", option + 9) { + lseek(kmsg, 0, SEEK_END); + strcpy(colon, "=1"); + + err = 0; + if (kmod_module_insert_module(kmod, 0, option)) + err = -errno; + kmod_module_remove_module(kmod, 0); + if (err) + kmsg_dump(kmsg); + + errno = 0; + igt_assert_f(err == 0, + "kselftest \"%s %s\" failed: %s [%d]\n", + module_name, option, + strerror(-err), -err); + } + } + kmod_module_info_free_list(pre); + } + + igt_fixture { + close(kmsg); + kmod_module_remove_module(kmod, KMOD_REMOVE_FORCE); + } +} + +igt_main +{ + igt_kselftests("test-drm_mm"); +} |