2017-02-14 01:15:12 +08:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __I915_SELFTEST_H__
|
|
|
|
#define __I915_SELFTEST_H__
|
|
|
|
|
|
|
|
struct pci_dev;
|
|
|
|
struct drm_i915_private;
|
|
|
|
|
|
|
|
struct i915_selftest {
|
|
|
|
unsigned long timeout_jiffies;
|
|
|
|
unsigned int timeout_ms;
|
|
|
|
unsigned int random_seed;
|
drm/i915/selftests: Apply a subtest filter
In bringup on simulated HW even rudimentary tests are slow, and so many
may fail that we want to be able to filter out the noise to focus on the
specific problem. Even just the tests groups provided for igt is not
specific enough, and we would like to isolate one particular subtest
(and probably subsubtests!). For simplicity, allow the user to provide a
command line parameter such as
i915.st_filter=i915_timeline_mock_selftests/igt_sync
to restrict ourselves to only running on subtest. The exact name to use
is given during a normal run, highlighted as an error if it failed,
debug otherwise. The test group is optional, and then all subtests are
compared for an exact match with the filter (most subtests have unique
names). The filter can be negated, e.g. i915.st_filter=!igt_sync and
then all tests but those that match will be run. More than one match can
be supplied separated by a comma, e.g.
i915.st_filter=igt_vma_create,igt_vma_pin1
to only run those specified, or
i915.st_filter=!igt_vma_create,!igt_vma_pin1
to run all but those named. Mixing a blacklist and whitelist will only
execute those subtests matching the whitelist so long as they are
previously excluded in the blacklist.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190129185452.20989-1-chris@chris-wilson.co.uk
2019-01-30 02:54:49 +08:00
|
|
|
char *filter;
|
2017-02-14 01:15:12 +08:00
|
|
|
int mock;
|
|
|
|
int live;
|
|
|
|
};
|
|
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
|
2017-02-14 01:15:44 +08:00
|
|
|
#include <linux/fault-inject.h>
|
|
|
|
|
2017-02-14 01:15:12 +08:00
|
|
|
extern struct i915_selftest i915_selftest;
|
|
|
|
|
|
|
|
int i915_mock_selftests(void);
|
|
|
|
int i915_live_selftests(struct pci_dev *pdev);
|
|
|
|
|
|
|
|
/* We extract the function declarations from i915_mock_selftests.h and
|
|
|
|
* i915_live_selftests.h Add your unit test declarations there!
|
|
|
|
*
|
|
|
|
* Mock unit tests are run very early upon module load, before the driver
|
|
|
|
* is probed. All hardware interactions, as well as other subsystems, must
|
|
|
|
* be "mocked".
|
|
|
|
*
|
|
|
|
* Live unit tests are run after the driver is loaded - all hardware
|
|
|
|
* interactions are real.
|
|
|
|
*/
|
|
|
|
#define selftest(name, func) int func(void);
|
|
|
|
#include "selftests/i915_mock_selftests.h"
|
|
|
|
#undef selftest
|
|
|
|
#define selftest(name, func) int func(struct drm_i915_private *i915);
|
|
|
|
#include "selftests/i915_live_selftests.h"
|
|
|
|
#undef selftest
|
|
|
|
|
|
|
|
struct i915_subtest {
|
|
|
|
int (*func)(void *data);
|
|
|
|
const char *name;
|
|
|
|
};
|
|
|
|
|
2019-07-03 17:17:12 +08:00
|
|
|
int __i915_nop_setup(void *data);
|
|
|
|
int __i915_nop_teardown(int err, void *data);
|
|
|
|
|
|
|
|
int __i915_live_setup(void *data);
|
|
|
|
int __i915_live_teardown(int err, void *data);
|
|
|
|
|
2019-07-13 03:29:53 +08:00
|
|
|
int __intel_gt_live_setup(void *data);
|
|
|
|
int __intel_gt_live_teardown(int err, void *data);
|
|
|
|
|
2017-02-14 01:15:12 +08:00
|
|
|
int __i915_subtests(const char *caller,
|
2019-07-03 17:17:12 +08:00
|
|
|
int (*setup)(void *data),
|
|
|
|
int (*teardown)(int err, void *data),
|
2017-02-14 01:15:12 +08:00
|
|
|
const struct i915_subtest *st,
|
|
|
|
unsigned int count,
|
|
|
|
void *data);
|
|
|
|
#define i915_subtests(T, data) \
|
2019-07-03 17:17:12 +08:00
|
|
|
__i915_subtests(__func__, \
|
|
|
|
__i915_nop_setup, __i915_nop_teardown, \
|
|
|
|
T, ARRAY_SIZE(T), data)
|
|
|
|
#define i915_live_subtests(T, data) ({ \
|
|
|
|
typecheck(struct drm_i915_private *, data); \
|
|
|
|
__i915_subtests(__func__, \
|
|
|
|
__i915_live_setup, __i915_live_teardown, \
|
|
|
|
T, ARRAY_SIZE(T), data); \
|
|
|
|
})
|
2019-07-13 03:29:53 +08:00
|
|
|
#define intel_gt_live_subtests(T, data) ({ \
|
|
|
|
typecheck(struct intel_gt *, data); \
|
|
|
|
__i915_subtests(__func__, \
|
|
|
|
__intel_gt_live_setup, __intel_gt_live_teardown, \
|
|
|
|
T, ARRAY_SIZE(T), data); \
|
|
|
|
})
|
2017-02-14 01:15:12 +08:00
|
|
|
|
|
|
|
#define SUBTEST(x) { x, #x }
|
|
|
|
|
|
|
|
#define I915_SELFTEST_DECLARE(x) x
|
|
|
|
#define I915_SELFTEST_ONLY(x) unlikely(x)
|
|
|
|
|
|
|
|
#else /* !IS_ENABLED(CONFIG_DRM_I915_SELFTEST) */
|
|
|
|
|
|
|
|
static inline int i915_mock_selftests(void) { return 0; }
|
|
|
|
static inline int i915_live_selftests(struct pci_dev *pdev) { return 0; }
|
|
|
|
|
|
|
|
#define I915_SELFTEST_DECLARE(x)
|
|
|
|
#define I915_SELFTEST_ONLY(x) 0
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Using the i915_selftest_ prefix becomes a little unwieldy with the helpers.
|
|
|
|
* Instead we use the igt_ shorthand, in reference to the intel-gpu-tools
|
|
|
|
* suite of uabi test cases (which includes a test runner for our selftests).
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define IGT_TIMEOUT(name__) \
|
|
|
|
unsigned long name__ = jiffies + i915_selftest.timeout_jiffies
|
|
|
|
|
|
|
|
__printf(2, 3)
|
|
|
|
bool __igt_timeout(unsigned long timeout, const char *fmt, ...);
|
|
|
|
|
|
|
|
#define igt_timeout(t, fmt, ...) \
|
2018-07-16 16:03:32 +08:00
|
|
|
__igt_timeout((t), KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
|
2017-02-14 01:15:12 +08:00
|
|
|
|
|
|
|
#endif /* !__I915_SELFTEST_H__ */
|