| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include <linux/compiler.h> |
| |
| #define selftest(name, func) __idx_##name, |
| enum { |
| #include TESTS |
| }; |
| #undef selftest |
| |
| #define selftest(n, f) [__idx_##n] = { .name = #n, .func = f }, |
| static struct drm_selftest { |
| <------>bool enabled; |
| <------>const char *name; |
| <------>int (*func)(void *); |
| } selftests[] = { |
| #include TESTS |
| }; |
| #undef selftest |
| |
| |
| #define param(n) __PASTE(igt__, __PASTE(__PASTE(__LINE__, __), n)) |
| #define selftest_0(n, func, id) \ |
| module_param_named(id, selftests[__idx_##n].enabled, bool, 0400); |
| #define selftest(n, func) selftest_0(n, func, param(n)) |
| #include TESTS |
| #undef selftest |
| |
| static void set_default_test_all(struct drm_selftest *st, unsigned long count) |
| { |
| <------>unsigned long i; |
| |
| <------>for (i = 0; i < count; i++) |
| <------><------>if (st[i].enabled) |
| <------><------><------>return; |
| |
| <------>for (i = 0; i < count; i++) |
| <------><------>st[i].enabled = true; |
| } |
| |
| static int run_selftests(struct drm_selftest *st, |
| <------><------><------> unsigned long count, |
| <------><------><------> void *data) |
| { |
| <------>int err = 0; |
| |
| <------>set_default_test_all(st, count); |
| |
| <------> |
| <------>for (; count--; st++) { |
| <------><------>if (!st->enabled) |
| <------><------><------>continue; |
| |
| <------><------>pr_debug("drm: Running %s\n", st->name); |
| <------><------>err = st->func(data); |
| <------><------>if (err) |
| <------><------><------>break; |
| <------>} |
| |
| <------>if (WARN(err > 0 || err == -ENOTTY, |
| <------><------> "%s returned %d, conflicting with selftest's magic values!\n", |
| <------><------> st->name, err)) |
| <------><------>err = -1; |
| |
| <------>rcu_barrier(); |
| <------>return err; |
| } |
| |
| static int __maybe_unused |
| __drm_subtests(const char *caller, |
| <------> const struct drm_subtest *st, |
| <------> int count, |
| <------> void *data) |
| { |
| <------>int err; |
| |
| <------>for (; count--; st++) { |
| <------><------>pr_debug("Running %s/%s\n", caller, st->name); |
| <------><------>err = st->func(data); |
| <------><------>if (err) { |
| <------><------><------>pr_err("%s: %s failed with error %d\n", |
| <------><------><------> caller, st->name, err); |
| <------><------><------>return err; |
| <------><------>} |
| <------>} |
| |
| <------>return 0; |
| } |
| |