cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm_selftest.c (2923B)


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