Home | History | Annotate | Line # | Download | only in selftests
      1  1.1  riastrad /*	$NetBSD: drm_selftest.c,v 1.2 2021/12/18 23:45:44 riastradh Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad /*
      4  1.1  riastrad  * Copyright  2016 Intel Corporation
      5  1.1  riastrad  *
      6  1.1  riastrad  * Permission is hereby granted, free of charge, to any person obtaining a
      7  1.1  riastrad  * copy of this software and associated documentation files (the "Software"),
      8  1.1  riastrad  * to deal in the Software without restriction, including without limitation
      9  1.1  riastrad  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  1.1  riastrad  * and/or sell copies of the Software, and to permit persons to whom the
     11  1.1  riastrad  * Software is furnished to do so, subject to the following conditions:
     12  1.1  riastrad  *
     13  1.1  riastrad  * The above copyright notice and this permission notice (including the next
     14  1.1  riastrad  * paragraph) shall be included in all copies or substantial portions of the
     15  1.1  riastrad  * Software.
     16  1.1  riastrad  *
     17  1.1  riastrad  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  1.1  riastrad  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  1.1  riastrad  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  1.1  riastrad  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  1.1  riastrad  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     22  1.1  riastrad  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     23  1.1  riastrad  * IN THE SOFTWARE.
     24  1.1  riastrad  */
     25  1.1  riastrad 
     26  1.1  riastrad #include <sys/cdefs.h>
     27  1.1  riastrad __KERNEL_RCSID(0, "$NetBSD: drm_selftest.c,v 1.2 2021/12/18 23:45:44 riastradh Exp $");
     28  1.1  riastrad 
     29  1.1  riastrad #include <linux/compiler.h>
     30  1.1  riastrad 
     31  1.1  riastrad #define selftest(name, func) __idx_##name,
     32  1.1  riastrad enum {
     33  1.1  riastrad #include TESTS
     34  1.1  riastrad };
     35  1.1  riastrad #undef selftest
     36  1.1  riastrad 
     37  1.1  riastrad #define selftest(n, f) [__idx_##n] = { .name = #n, .func = f },
     38  1.1  riastrad static struct drm_selftest {
     39  1.1  riastrad 	bool enabled;
     40  1.1  riastrad 	const char *name;
     41  1.1  riastrad 	int (*func)(void *);
     42  1.1  riastrad } selftests[] = {
     43  1.1  riastrad #include TESTS
     44  1.1  riastrad };
     45  1.1  riastrad #undef selftest
     46  1.1  riastrad 
     47  1.1  riastrad /* Embed the line number into the parameter name so that we can order tests */
     48  1.1  riastrad #define param(n) __PASTE(igt__, __PASTE(__PASTE(__LINE__, __), n))
     49  1.1  riastrad #define selftest_0(n, func, id) \
     50  1.1  riastrad module_param_named(id, selftests[__idx_##n].enabled, bool, 0400);
     51  1.1  riastrad #define selftest(n, func) selftest_0(n, func, param(n))
     52  1.1  riastrad #include TESTS
     53  1.1  riastrad #undef selftest
     54  1.1  riastrad 
     55  1.1  riastrad static void set_default_test_all(struct drm_selftest *st, unsigned long count)
     56  1.1  riastrad {
     57  1.1  riastrad 	unsigned long i;
     58  1.1  riastrad 
     59  1.1  riastrad 	for (i = 0; i < count; i++)
     60  1.1  riastrad 		if (st[i].enabled)
     61  1.1  riastrad 			return;
     62  1.1  riastrad 
     63  1.1  riastrad 	for (i = 0; i < count; i++)
     64  1.1  riastrad 		st[i].enabled = true;
     65  1.1  riastrad }
     66  1.1  riastrad 
     67  1.1  riastrad static int run_selftests(struct drm_selftest *st,
     68  1.1  riastrad 			 unsigned long count,
     69  1.1  riastrad 			 void *data)
     70  1.1  riastrad {
     71  1.1  riastrad 	int err = 0;
     72  1.1  riastrad 
     73  1.1  riastrad 	set_default_test_all(st, count);
     74  1.1  riastrad 
     75  1.1  riastrad 	/* Tests are listed in natural order in drm_*_selftests.h */
     76  1.1  riastrad 	for (; count--; st++) {
     77  1.1  riastrad 		if (!st->enabled)
     78  1.1  riastrad 			continue;
     79  1.1  riastrad 
     80  1.1  riastrad 		pr_debug("drm: Running %s\n", st->name);
     81  1.1  riastrad 		err = st->func(data);
     82  1.1  riastrad 		if (err)
     83  1.1  riastrad 			break;
     84  1.1  riastrad 	}
     85  1.1  riastrad 
     86  1.1  riastrad 	if (WARN(err > 0 || err == -ENOTTY,
     87  1.1  riastrad 		 "%s returned %d, conflicting with selftest's magic values!\n",
     88  1.1  riastrad 		 st->name, err))
     89  1.1  riastrad 		err = -1;
     90  1.1  riastrad 
     91  1.1  riastrad 	rcu_barrier();
     92  1.1  riastrad 	return err;
     93  1.1  riastrad }
     94  1.1  riastrad 
     95  1.1  riastrad static int __maybe_unused
     96  1.1  riastrad __drm_subtests(const char *caller,
     97  1.1  riastrad 	       const struct drm_subtest *st,
     98  1.1  riastrad 	       int count,
     99  1.1  riastrad 	       void *data)
    100  1.1  riastrad {
    101  1.1  riastrad 	int err;
    102  1.1  riastrad 
    103  1.1  riastrad 	for (; count--; st++) {
    104  1.1  riastrad 		pr_debug("Running %s/%s\n", caller, st->name);
    105  1.1  riastrad 		err = st->func(data);
    106  1.1  riastrad 		if (err) {
    107  1.1  riastrad 			pr_err("%s: %s failed with error %d\n",
    108  1.1  riastrad 			       caller, st->name, err);
    109  1.1  riastrad 			return err;
    110  1.1  riastrad 		}
    111  1.1  riastrad 	}
    112  1.1  riastrad 
    113  1.1  riastrad 	return 0;
    114  1.1  riastrad }
    115