1 1.1 riastrad /* $NetBSD: i915_selftest.c,v 1.2 2021/12/18 23:45:31 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: i915_selftest.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $"); 28 1.1 riastrad 29 1.1 riastrad #include <linux/random.h> 30 1.1 riastrad 31 1.1 riastrad #include "gt/intel_gt_pm.h" 32 1.1 riastrad #include "i915_drv.h" 33 1.1 riastrad #include "i915_selftest.h" 34 1.1 riastrad 35 1.1 riastrad #include "igt_flush_test.h" 36 1.1 riastrad 37 1.1 riastrad struct i915_selftest i915_selftest __read_mostly = { 38 1.1 riastrad .timeout_ms = 500, 39 1.1 riastrad }; 40 1.1 riastrad 41 1.1 riastrad int i915_mock_sanitycheck(void) 42 1.1 riastrad { 43 1.1 riastrad pr_info(DRIVER_NAME ": %s() - ok!\n", __func__); 44 1.1 riastrad return 0; 45 1.1 riastrad } 46 1.1 riastrad 47 1.1 riastrad int i915_live_sanitycheck(struct drm_i915_private *i915) 48 1.1 riastrad { 49 1.1 riastrad pr_info("%s: %s() - ok!\n", i915->drm.driver->name, __func__); 50 1.1 riastrad return 0; 51 1.1 riastrad } 52 1.1 riastrad 53 1.1 riastrad enum { 54 1.1 riastrad #define selftest(name, func) mock_##name, 55 1.1 riastrad #include "i915_mock_selftests.h" 56 1.1 riastrad #undef selftest 57 1.1 riastrad }; 58 1.1 riastrad 59 1.1 riastrad enum { 60 1.1 riastrad #define selftest(name, func) live_##name, 61 1.1 riastrad #include "i915_live_selftests.h" 62 1.1 riastrad #undef selftest 63 1.1 riastrad }; 64 1.1 riastrad 65 1.1 riastrad enum { 66 1.1 riastrad #define selftest(name, func) perf_##name, 67 1.1 riastrad #include "i915_perf_selftests.h" 68 1.1 riastrad #undef selftest 69 1.1 riastrad }; 70 1.1 riastrad 71 1.1 riastrad struct selftest { 72 1.1 riastrad bool enabled; 73 1.1 riastrad const char *name; 74 1.1 riastrad union { 75 1.1 riastrad int (*mock)(void); 76 1.1 riastrad int (*live)(struct drm_i915_private *); 77 1.1 riastrad }; 78 1.1 riastrad }; 79 1.1 riastrad 80 1.1 riastrad #define selftest(n, f) [mock_##n] = { .name = #n, { .mock = f } }, 81 1.1 riastrad static struct selftest mock_selftests[] = { 82 1.1 riastrad #include "i915_mock_selftests.h" 83 1.1 riastrad }; 84 1.1 riastrad #undef selftest 85 1.1 riastrad 86 1.1 riastrad #define selftest(n, f) [live_##n] = { .name = #n, { .live = f } }, 87 1.1 riastrad static struct selftest live_selftests[] = { 88 1.1 riastrad #include "i915_live_selftests.h" 89 1.1 riastrad }; 90 1.1 riastrad #undef selftest 91 1.1 riastrad 92 1.1 riastrad #define selftest(n, f) [perf_##n] = { .name = #n, { .live = f } }, 93 1.1 riastrad static struct selftest perf_selftests[] = { 94 1.1 riastrad #include "i915_perf_selftests.h" 95 1.1 riastrad }; 96 1.1 riastrad #undef selftest 97 1.1 riastrad 98 1.1 riastrad /* Embed the line number into the parameter name so that we can order tests */ 99 1.1 riastrad #define selftest(n, func) selftest_0(n, func, param(n)) 100 1.1 riastrad #define param(n) __PASTE(igt__, __PASTE(__LINE__, __mock_##n)) 101 1.1 riastrad #define selftest_0(n, func, id) \ 102 1.1 riastrad module_param_named(id, mock_selftests[mock_##n].enabled, bool, 0400); 103 1.1 riastrad #include "i915_mock_selftests.h" 104 1.1 riastrad #undef selftest_0 105 1.1 riastrad #undef param 106 1.1 riastrad 107 1.1 riastrad #define param(n) __PASTE(igt__, __PASTE(__LINE__, __live_##n)) 108 1.1 riastrad #define selftest_0(n, func, id) \ 109 1.1 riastrad module_param_named(id, live_selftests[live_##n].enabled, bool, 0400); 110 1.1 riastrad #include "i915_live_selftests.h" 111 1.1 riastrad #undef selftest_0 112 1.1 riastrad #undef param 113 1.1 riastrad 114 1.1 riastrad #define param(n) __PASTE(igt__, __PASTE(__LINE__, __perf_##n)) 115 1.1 riastrad #define selftest_0(n, func, id) \ 116 1.1 riastrad module_param_named(id, perf_selftests[perf_##n].enabled, bool, 0400); 117 1.1 riastrad #include "i915_perf_selftests.h" 118 1.1 riastrad #undef selftest_0 119 1.1 riastrad #undef param 120 1.1 riastrad #undef selftest 121 1.1 riastrad 122 1.1 riastrad static void set_default_test_all(struct selftest *st, unsigned int count) 123 1.1 riastrad { 124 1.1 riastrad unsigned int i; 125 1.1 riastrad 126 1.1 riastrad for (i = 0; i < count; i++) 127 1.1 riastrad if (st[i].enabled) 128 1.1 riastrad return; 129 1.1 riastrad 130 1.1 riastrad for (i = 0; i < count; i++) 131 1.1 riastrad st[i].enabled = true; 132 1.1 riastrad } 133 1.1 riastrad 134 1.1 riastrad static int __run_selftests(const char *name, 135 1.1 riastrad struct selftest *st, 136 1.1 riastrad unsigned int count, 137 1.1 riastrad void *data) 138 1.1 riastrad { 139 1.1 riastrad int err = 0; 140 1.1 riastrad 141 1.1 riastrad while (!i915_selftest.random_seed) 142 1.1 riastrad i915_selftest.random_seed = get_random_int(); 143 1.1 riastrad 144 1.1 riastrad i915_selftest.timeout_jiffies = 145 1.1 riastrad i915_selftest.timeout_ms ? 146 1.1 riastrad msecs_to_jiffies_timeout(i915_selftest.timeout_ms) : 147 1.1 riastrad MAX_SCHEDULE_TIMEOUT; 148 1.1 riastrad 149 1.1 riastrad set_default_test_all(st, count); 150 1.1 riastrad 151 1.1 riastrad pr_info(DRIVER_NAME ": Performing %s selftests with st_random_seed=0x%x st_timeout=%u\n", 152 1.1 riastrad name, i915_selftest.random_seed, i915_selftest.timeout_ms); 153 1.1 riastrad 154 1.1 riastrad /* Tests are listed in order in i915_*_selftests.h */ 155 1.1 riastrad for (; count--; st++) { 156 1.1 riastrad if (!st->enabled) 157 1.1 riastrad continue; 158 1.1 riastrad 159 1.1 riastrad cond_resched(); 160 1.1 riastrad if (signal_pending(current)) 161 1.1 riastrad return -EINTR; 162 1.1 riastrad 163 1.1 riastrad pr_info(DRIVER_NAME ": Running %s\n", st->name); 164 1.1 riastrad if (data) 165 1.1 riastrad err = st->live(data); 166 1.1 riastrad else 167 1.1 riastrad err = st->mock(); 168 1.1 riastrad if (err == -EINTR && !signal_pending(current)) 169 1.1 riastrad err = 0; 170 1.1 riastrad if (err) 171 1.1 riastrad break; 172 1.1 riastrad } 173 1.1 riastrad 174 1.1 riastrad if (WARN(err > 0 || err == -ENOTTY, 175 1.1 riastrad "%s returned %d, conflicting with selftest's magic values!\n", 176 1.1 riastrad st->name, err)) 177 1.1 riastrad err = -1; 178 1.1 riastrad 179 1.1 riastrad return err; 180 1.1 riastrad } 181 1.1 riastrad 182 1.1 riastrad #define run_selftests(x, data) \ 183 1.1 riastrad __run_selftests(#x, x##_selftests, ARRAY_SIZE(x##_selftests), data) 184 1.1 riastrad 185 1.1 riastrad int i915_mock_selftests(void) 186 1.1 riastrad { 187 1.1 riastrad int err; 188 1.1 riastrad 189 1.1 riastrad if (!i915_selftest.mock) 190 1.1 riastrad return 0; 191 1.1 riastrad 192 1.1 riastrad err = run_selftests(mock, NULL); 193 1.1 riastrad if (err) { 194 1.1 riastrad i915_selftest.mock = err; 195 1.1 riastrad return err; 196 1.1 riastrad } 197 1.1 riastrad 198 1.1 riastrad if (i915_selftest.mock < 0) { 199 1.1 riastrad i915_selftest.mock = -ENOTTY; 200 1.1 riastrad return 1; 201 1.1 riastrad } 202 1.1 riastrad 203 1.1 riastrad return 0; 204 1.1 riastrad } 205 1.1 riastrad 206 1.1 riastrad int i915_live_selftests(struct pci_dev *pdev) 207 1.1 riastrad { 208 1.1 riastrad int err; 209 1.1 riastrad 210 1.1 riastrad if (!i915_selftest.live) 211 1.1 riastrad return 0; 212 1.1 riastrad 213 1.1 riastrad err = run_selftests(live, pdev_to_i915(pdev)); 214 1.1 riastrad if (err) { 215 1.1 riastrad i915_selftest.live = err; 216 1.1 riastrad return err; 217 1.1 riastrad } 218 1.1 riastrad 219 1.1 riastrad if (i915_selftest.live < 0) { 220 1.1 riastrad i915_selftest.live = -ENOTTY; 221 1.1 riastrad return 1; 222 1.1 riastrad } 223 1.1 riastrad 224 1.1 riastrad return 0; 225 1.1 riastrad } 226 1.1 riastrad 227 1.1 riastrad int i915_perf_selftests(struct pci_dev *pdev) 228 1.1 riastrad { 229 1.1 riastrad int err; 230 1.1 riastrad 231 1.1 riastrad if (!i915_selftest.perf) 232 1.1 riastrad return 0; 233 1.1 riastrad 234 1.1 riastrad err = run_selftests(perf, pdev_to_i915(pdev)); 235 1.1 riastrad if (err) { 236 1.1 riastrad i915_selftest.perf = err; 237 1.1 riastrad return err; 238 1.1 riastrad } 239 1.1 riastrad 240 1.1 riastrad if (i915_selftest.perf < 0) { 241 1.1 riastrad i915_selftest.perf = -ENOTTY; 242 1.1 riastrad return 1; 243 1.1 riastrad } 244 1.1 riastrad 245 1.1 riastrad return 0; 246 1.1 riastrad } 247 1.1 riastrad 248 1.1 riastrad static bool apply_subtest_filter(const char *caller, const char *name) 249 1.1 riastrad { 250 1.1 riastrad char *filter, *sep, *tok; 251 1.1 riastrad bool result = true; 252 1.1 riastrad 253 1.1 riastrad filter = kstrdup(i915_selftest.filter, GFP_KERNEL); 254 1.1 riastrad for (sep = filter; (tok = strsep(&sep, ","));) { 255 1.1 riastrad bool allow = true; 256 1.1 riastrad char *sl; 257 1.1 riastrad 258 1.1 riastrad if (*tok == '!') { 259 1.1 riastrad allow = false; 260 1.1 riastrad tok++; 261 1.1 riastrad } 262 1.1 riastrad 263 1.1 riastrad if (*tok == '\0') 264 1.1 riastrad continue; 265 1.1 riastrad 266 1.1 riastrad sl = strchr(tok, '/'); 267 1.1 riastrad if (sl) { 268 1.1 riastrad *sl++ = '\0'; 269 1.1 riastrad if (strcmp(tok, caller)) { 270 1.1 riastrad if (allow) 271 1.1 riastrad result = false; 272 1.1 riastrad continue; 273 1.1 riastrad } 274 1.1 riastrad tok = sl; 275 1.1 riastrad } 276 1.1 riastrad 277 1.1 riastrad if (strcmp(tok, name)) { 278 1.1 riastrad if (allow) 279 1.1 riastrad result = false; 280 1.1 riastrad continue; 281 1.1 riastrad } 282 1.1 riastrad 283 1.1 riastrad result = allow; 284 1.1 riastrad break; 285 1.1 riastrad } 286 1.1 riastrad kfree(filter); 287 1.1 riastrad 288 1.1 riastrad return result; 289 1.1 riastrad } 290 1.1 riastrad 291 1.1 riastrad int __i915_nop_setup(void *data) 292 1.1 riastrad { 293 1.1 riastrad return 0; 294 1.1 riastrad } 295 1.1 riastrad 296 1.1 riastrad int __i915_nop_teardown(int err, void *data) 297 1.1 riastrad { 298 1.1 riastrad return err; 299 1.1 riastrad } 300 1.1 riastrad 301 1.1 riastrad int __i915_live_setup(void *data) 302 1.1 riastrad { 303 1.1 riastrad struct drm_i915_private *i915 = data; 304 1.1 riastrad 305 1.1 riastrad /* The selftests expect an idle system */ 306 1.1 riastrad if (intel_gt_pm_wait_for_idle(&i915->gt)) 307 1.1 riastrad return -EIO; 308 1.1 riastrad 309 1.1 riastrad return intel_gt_terminally_wedged(&i915->gt); 310 1.1 riastrad } 311 1.1 riastrad 312 1.1 riastrad int __i915_live_teardown(int err, void *data) 313 1.1 riastrad { 314 1.1 riastrad struct drm_i915_private *i915 = data; 315 1.1 riastrad 316 1.1 riastrad if (igt_flush_test(i915)) 317 1.1 riastrad err = -EIO; 318 1.1 riastrad 319 1.1 riastrad i915_gem_drain_freed_objects(i915); 320 1.1 riastrad 321 1.1 riastrad return err; 322 1.1 riastrad } 323 1.1 riastrad 324 1.1 riastrad int __intel_gt_live_setup(void *data) 325 1.1 riastrad { 326 1.1 riastrad struct intel_gt *gt = data; 327 1.1 riastrad 328 1.1 riastrad /* The selftests expect an idle system */ 329 1.1 riastrad if (intel_gt_pm_wait_for_idle(gt)) 330 1.1 riastrad return -EIO; 331 1.1 riastrad 332 1.1 riastrad return intel_gt_terminally_wedged(gt); 333 1.1 riastrad } 334 1.1 riastrad 335 1.1 riastrad int __intel_gt_live_teardown(int err, void *data) 336 1.1 riastrad { 337 1.1 riastrad struct intel_gt *gt = data; 338 1.1 riastrad 339 1.1 riastrad if (igt_flush_test(gt->i915)) 340 1.1 riastrad err = -EIO; 341 1.1 riastrad 342 1.1 riastrad i915_gem_drain_freed_objects(gt->i915); 343 1.1 riastrad 344 1.1 riastrad return err; 345 1.1 riastrad } 346 1.1 riastrad 347 1.1 riastrad int __i915_subtests(const char *caller, 348 1.1 riastrad int (*setup)(void *data), 349 1.1 riastrad int (*teardown)(int err, void *data), 350 1.1 riastrad const struct i915_subtest *st, 351 1.1 riastrad unsigned int count, 352 1.1 riastrad void *data) 353 1.1 riastrad { 354 1.1 riastrad int err; 355 1.1 riastrad 356 1.1 riastrad for (; count--; st++) { 357 1.1 riastrad cond_resched(); 358 1.1 riastrad if (signal_pending(current)) 359 1.1 riastrad return -EINTR; 360 1.1 riastrad 361 1.1 riastrad if (!apply_subtest_filter(caller, st->name)) 362 1.1 riastrad continue; 363 1.1 riastrad 364 1.1 riastrad err = setup(data); 365 1.1 riastrad if (err) { 366 1.1 riastrad pr_err(DRIVER_NAME "/%s: setup failed for %s\n", 367 1.1 riastrad caller, st->name); 368 1.1 riastrad return err; 369 1.1 riastrad } 370 1.1 riastrad 371 1.1 riastrad pr_info(DRIVER_NAME ": Running %s/%s\n", caller, st->name); 372 1.1 riastrad GEM_TRACE("Running %s/%s\n", caller, st->name); 373 1.1 riastrad 374 1.1 riastrad err = teardown(st->func(data), data); 375 1.1 riastrad if (err && err != -EINTR) { 376 1.1 riastrad pr_err(DRIVER_NAME "/%s: %s failed with error %d\n", 377 1.1 riastrad caller, st->name, err); 378 1.1 riastrad return err; 379 1.1 riastrad } 380 1.1 riastrad } 381 1.1 riastrad 382 1.1 riastrad return 0; 383 1.1 riastrad } 384 1.1 riastrad 385 1.1 riastrad bool __igt_timeout(unsigned long timeout, const char *fmt, ...) 386 1.1 riastrad { 387 1.1 riastrad va_list va; 388 1.1 riastrad 389 1.1 riastrad if (!signal_pending(current)) { 390 1.1 riastrad cond_resched(); 391 1.1 riastrad if (time_before(jiffies, timeout)) 392 1.1 riastrad return false; 393 1.1 riastrad } 394 1.1 riastrad 395 1.1 riastrad if (fmt) { 396 1.1 riastrad va_start(va, fmt); 397 1.1 riastrad vprintk(fmt, va); 398 1.1 riastrad va_end(va); 399 1.1 riastrad } 400 1.1 riastrad 401 1.1 riastrad return true; 402 1.1 riastrad } 403 1.1 riastrad 404 1.1 riastrad module_param_named(st_random_seed, i915_selftest.random_seed, uint, 0400); 405 1.1 riastrad module_param_named(st_timeout, i915_selftest.timeout_ms, uint, 0400); 406 1.1 riastrad module_param_named(st_filter, i915_selftest.filter, charp, 0400); 407 1.1 riastrad 408 1.1 riastrad module_param_named_unsafe(mock_selftests, i915_selftest.mock, int, 0400); 409 1.1 riastrad MODULE_PARM_DESC(mock_selftests, "Run selftests before loading, using mock hardware (0:disabled [default], 1:run tests then load driver, -1:run tests then exit module)"); 410 1.1 riastrad 411 1.1 riastrad module_param_named_unsafe(live_selftests, i915_selftest.live, int, 0400); 412 1.1 riastrad MODULE_PARM_DESC(live_selftests, "Run selftests after driver initialisation on the live system (0:disabled [default], 1:run tests then continue, -1:run tests then exit module)"); 413 1.1 riastrad 414 1.1 riastrad module_param_named_unsafe(perf_selftests, i915_selftest.perf, int, 0400); 415 1.1 riastrad MODULE_PARM_DESC(perf_selftests, "Run performance orientated selftests after driver initialisation on the live system (0:disabled [default], 1:run tests then continue, -1:run tests then exit module)"); 416