18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright © 2016 Intel Corporation 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice (including the next 128c2ecf20Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the 138c2ecf20Sopenharmony_ci * Software. 148c2ecf20Sopenharmony_ci * 158c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 168c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 178c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 188c2ecf20Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 198c2ecf20Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 208c2ecf20Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 218c2ecf20Sopenharmony_ci * IN THE SOFTWARE. 228c2ecf20Sopenharmony_ci */ 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#include <linux/random.h> 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include "gt/intel_gt_pm.h" 278c2ecf20Sopenharmony_ci#include "i915_drv.h" 288c2ecf20Sopenharmony_ci#include "i915_selftest.h" 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#include "igt_flush_test.h" 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistruct i915_selftest i915_selftest __read_mostly = { 338c2ecf20Sopenharmony_ci .timeout_ms = 500, 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ciint i915_mock_sanitycheck(void) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci pr_info(DRIVER_NAME ": %s() - ok!\n", __func__); 398c2ecf20Sopenharmony_ci return 0; 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ciint i915_live_sanitycheck(struct drm_i915_private *i915) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci pr_info("%s: %s() - ok!\n", i915->drm.driver->name, __func__); 458c2ecf20Sopenharmony_ci return 0; 468c2ecf20Sopenharmony_ci} 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cienum { 498c2ecf20Sopenharmony_ci#define selftest(name, func) mock_##name, 508c2ecf20Sopenharmony_ci#include "i915_mock_selftests.h" 518c2ecf20Sopenharmony_ci#undef selftest 528c2ecf20Sopenharmony_ci}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cienum { 558c2ecf20Sopenharmony_ci#define selftest(name, func) live_##name, 568c2ecf20Sopenharmony_ci#include "i915_live_selftests.h" 578c2ecf20Sopenharmony_ci#undef selftest 588c2ecf20Sopenharmony_ci}; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cienum { 618c2ecf20Sopenharmony_ci#define selftest(name, func) perf_##name, 628c2ecf20Sopenharmony_ci#include "i915_perf_selftests.h" 638c2ecf20Sopenharmony_ci#undef selftest 648c2ecf20Sopenharmony_ci}; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cistruct selftest { 678c2ecf20Sopenharmony_ci bool enabled; 688c2ecf20Sopenharmony_ci const char *name; 698c2ecf20Sopenharmony_ci union { 708c2ecf20Sopenharmony_ci int (*mock)(void); 718c2ecf20Sopenharmony_ci int (*live)(struct drm_i915_private *); 728c2ecf20Sopenharmony_ci }; 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci#define selftest(n, f) [mock_##n] = { .name = #n, { .mock = f } }, 768c2ecf20Sopenharmony_cistatic struct selftest mock_selftests[] = { 778c2ecf20Sopenharmony_ci#include "i915_mock_selftests.h" 788c2ecf20Sopenharmony_ci}; 798c2ecf20Sopenharmony_ci#undef selftest 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#define selftest(n, f) [live_##n] = { .name = #n, { .live = f } }, 828c2ecf20Sopenharmony_cistatic struct selftest live_selftests[] = { 838c2ecf20Sopenharmony_ci#include "i915_live_selftests.h" 848c2ecf20Sopenharmony_ci}; 858c2ecf20Sopenharmony_ci#undef selftest 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci#define selftest(n, f) [perf_##n] = { .name = #n, { .live = f } }, 888c2ecf20Sopenharmony_cistatic struct selftest perf_selftests[] = { 898c2ecf20Sopenharmony_ci#include "i915_perf_selftests.h" 908c2ecf20Sopenharmony_ci}; 918c2ecf20Sopenharmony_ci#undef selftest 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci/* Embed the line number into the parameter name so that we can order tests */ 948c2ecf20Sopenharmony_ci#define selftest(n, func) selftest_0(n, func, param(n)) 958c2ecf20Sopenharmony_ci#define param(n) __PASTE(igt__, __PASTE(__LINE__, __mock_##n)) 968c2ecf20Sopenharmony_ci#define selftest_0(n, func, id) \ 978c2ecf20Sopenharmony_cimodule_param_named(id, mock_selftests[mock_##n].enabled, bool, 0400); 988c2ecf20Sopenharmony_ci#include "i915_mock_selftests.h" 998c2ecf20Sopenharmony_ci#undef selftest_0 1008c2ecf20Sopenharmony_ci#undef param 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci#define param(n) __PASTE(igt__, __PASTE(__LINE__, __live_##n)) 1038c2ecf20Sopenharmony_ci#define selftest_0(n, func, id) \ 1048c2ecf20Sopenharmony_cimodule_param_named(id, live_selftests[live_##n].enabled, bool, 0400); 1058c2ecf20Sopenharmony_ci#include "i915_live_selftests.h" 1068c2ecf20Sopenharmony_ci#undef selftest_0 1078c2ecf20Sopenharmony_ci#undef param 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci#define param(n) __PASTE(igt__, __PASTE(__LINE__, __perf_##n)) 1108c2ecf20Sopenharmony_ci#define selftest_0(n, func, id) \ 1118c2ecf20Sopenharmony_cimodule_param_named(id, perf_selftests[perf_##n].enabled, bool, 0400); 1128c2ecf20Sopenharmony_ci#include "i915_perf_selftests.h" 1138c2ecf20Sopenharmony_ci#undef selftest_0 1148c2ecf20Sopenharmony_ci#undef param 1158c2ecf20Sopenharmony_ci#undef selftest 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic void set_default_test_all(struct selftest *st, unsigned int count) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci unsigned int i; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci for (i = 0; i < count; i++) 1228c2ecf20Sopenharmony_ci if (st[i].enabled) 1238c2ecf20Sopenharmony_ci return; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci for (i = 0; i < count; i++) 1268c2ecf20Sopenharmony_ci st[i].enabled = true; 1278c2ecf20Sopenharmony_ci} 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cistatic int __run_selftests(const char *name, 1308c2ecf20Sopenharmony_ci struct selftest *st, 1318c2ecf20Sopenharmony_ci unsigned int count, 1328c2ecf20Sopenharmony_ci void *data) 1338c2ecf20Sopenharmony_ci{ 1348c2ecf20Sopenharmony_ci int err = 0; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci while (!i915_selftest.random_seed) 1378c2ecf20Sopenharmony_ci i915_selftest.random_seed = get_random_int(); 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci i915_selftest.timeout_jiffies = 1408c2ecf20Sopenharmony_ci i915_selftest.timeout_ms ? 1418c2ecf20Sopenharmony_ci msecs_to_jiffies_timeout(i915_selftest.timeout_ms) : 1428c2ecf20Sopenharmony_ci MAX_SCHEDULE_TIMEOUT; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci set_default_test_all(st, count); 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci pr_info(DRIVER_NAME ": Performing %s selftests with st_random_seed=0x%x st_timeout=%u\n", 1478c2ecf20Sopenharmony_ci name, i915_selftest.random_seed, i915_selftest.timeout_ms); 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci /* Tests are listed in order in i915_*_selftests.h */ 1508c2ecf20Sopenharmony_ci for (; count--; st++) { 1518c2ecf20Sopenharmony_ci if (!st->enabled) 1528c2ecf20Sopenharmony_ci continue; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci cond_resched(); 1558c2ecf20Sopenharmony_ci if (signal_pending(current)) 1568c2ecf20Sopenharmony_ci return -EINTR; 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci pr_info(DRIVER_NAME ": Running %s\n", st->name); 1598c2ecf20Sopenharmony_ci if (data) 1608c2ecf20Sopenharmony_ci err = st->live(data); 1618c2ecf20Sopenharmony_ci else 1628c2ecf20Sopenharmony_ci err = st->mock(); 1638c2ecf20Sopenharmony_ci if (err == -EINTR && !signal_pending(current)) 1648c2ecf20Sopenharmony_ci err = 0; 1658c2ecf20Sopenharmony_ci if (err) 1668c2ecf20Sopenharmony_ci break; 1678c2ecf20Sopenharmony_ci } 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci if (WARN(err > 0 || err == -ENOTTY, 1708c2ecf20Sopenharmony_ci "%s returned %d, conflicting with selftest's magic values!\n", 1718c2ecf20Sopenharmony_ci st->name, err)) 1728c2ecf20Sopenharmony_ci err = -1; 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci return err; 1758c2ecf20Sopenharmony_ci} 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci#define run_selftests(x, data) \ 1788c2ecf20Sopenharmony_ci __run_selftests(#x, x##_selftests, ARRAY_SIZE(x##_selftests), data) 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ciint i915_mock_selftests(void) 1818c2ecf20Sopenharmony_ci{ 1828c2ecf20Sopenharmony_ci int err; 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci if (!i915_selftest.mock) 1858c2ecf20Sopenharmony_ci return 0; 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci err = run_selftests(mock, NULL); 1888c2ecf20Sopenharmony_ci if (err) { 1898c2ecf20Sopenharmony_ci i915_selftest.mock = err; 1908c2ecf20Sopenharmony_ci return err; 1918c2ecf20Sopenharmony_ci } 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci if (i915_selftest.mock < 0) { 1948c2ecf20Sopenharmony_ci i915_selftest.mock = -ENOTTY; 1958c2ecf20Sopenharmony_ci return 1; 1968c2ecf20Sopenharmony_ci } 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci return 0; 1998c2ecf20Sopenharmony_ci} 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ciint i915_live_selftests(struct pci_dev *pdev) 2028c2ecf20Sopenharmony_ci{ 2038c2ecf20Sopenharmony_ci int err; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci if (!i915_selftest.live) 2068c2ecf20Sopenharmony_ci return 0; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci err = run_selftests(live, pdev_to_i915(pdev)); 2098c2ecf20Sopenharmony_ci if (err) { 2108c2ecf20Sopenharmony_ci i915_selftest.live = err; 2118c2ecf20Sopenharmony_ci return err; 2128c2ecf20Sopenharmony_ci } 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci if (i915_selftest.live < 0) { 2158c2ecf20Sopenharmony_ci i915_selftest.live = -ENOTTY; 2168c2ecf20Sopenharmony_ci return 1; 2178c2ecf20Sopenharmony_ci } 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci return 0; 2208c2ecf20Sopenharmony_ci} 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ciint i915_perf_selftests(struct pci_dev *pdev) 2238c2ecf20Sopenharmony_ci{ 2248c2ecf20Sopenharmony_ci int err; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci if (!i915_selftest.perf) 2278c2ecf20Sopenharmony_ci return 0; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci err = run_selftests(perf, pdev_to_i915(pdev)); 2308c2ecf20Sopenharmony_ci if (err) { 2318c2ecf20Sopenharmony_ci i915_selftest.perf = err; 2328c2ecf20Sopenharmony_ci return err; 2338c2ecf20Sopenharmony_ci } 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci if (i915_selftest.perf < 0) { 2368c2ecf20Sopenharmony_ci i915_selftest.perf = -ENOTTY; 2378c2ecf20Sopenharmony_ci return 1; 2388c2ecf20Sopenharmony_ci } 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci return 0; 2418c2ecf20Sopenharmony_ci} 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_cistatic bool apply_subtest_filter(const char *caller, const char *name) 2448c2ecf20Sopenharmony_ci{ 2458c2ecf20Sopenharmony_ci char *filter, *sep, *tok; 2468c2ecf20Sopenharmony_ci bool result = true; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci filter = kstrdup(i915_selftest.filter, GFP_KERNEL); 2498c2ecf20Sopenharmony_ci for (sep = filter; (tok = strsep(&sep, ","));) { 2508c2ecf20Sopenharmony_ci bool allow = true; 2518c2ecf20Sopenharmony_ci char *sl; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci if (*tok == '!') { 2548c2ecf20Sopenharmony_ci allow = false; 2558c2ecf20Sopenharmony_ci tok++; 2568c2ecf20Sopenharmony_ci } 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci if (*tok == '\0') 2598c2ecf20Sopenharmony_ci continue; 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci sl = strchr(tok, '/'); 2628c2ecf20Sopenharmony_ci if (sl) { 2638c2ecf20Sopenharmony_ci *sl++ = '\0'; 2648c2ecf20Sopenharmony_ci if (strcmp(tok, caller)) { 2658c2ecf20Sopenharmony_ci if (allow) 2668c2ecf20Sopenharmony_ci result = false; 2678c2ecf20Sopenharmony_ci continue; 2688c2ecf20Sopenharmony_ci } 2698c2ecf20Sopenharmony_ci tok = sl; 2708c2ecf20Sopenharmony_ci } 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci if (strcmp(tok, name)) { 2738c2ecf20Sopenharmony_ci if (allow) 2748c2ecf20Sopenharmony_ci result = false; 2758c2ecf20Sopenharmony_ci continue; 2768c2ecf20Sopenharmony_ci } 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci result = allow; 2798c2ecf20Sopenharmony_ci break; 2808c2ecf20Sopenharmony_ci } 2818c2ecf20Sopenharmony_ci kfree(filter); 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci return result; 2848c2ecf20Sopenharmony_ci} 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ciint __i915_nop_setup(void *data) 2878c2ecf20Sopenharmony_ci{ 2888c2ecf20Sopenharmony_ci return 0; 2898c2ecf20Sopenharmony_ci} 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ciint __i915_nop_teardown(int err, void *data) 2928c2ecf20Sopenharmony_ci{ 2938c2ecf20Sopenharmony_ci return err; 2948c2ecf20Sopenharmony_ci} 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ciint __i915_live_setup(void *data) 2978c2ecf20Sopenharmony_ci{ 2988c2ecf20Sopenharmony_ci struct drm_i915_private *i915 = data; 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci /* The selftests expect an idle system */ 3018c2ecf20Sopenharmony_ci if (intel_gt_pm_wait_for_idle(&i915->gt)) 3028c2ecf20Sopenharmony_ci return -EIO; 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci return intel_gt_terminally_wedged(&i915->gt); 3058c2ecf20Sopenharmony_ci} 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ciint __i915_live_teardown(int err, void *data) 3088c2ecf20Sopenharmony_ci{ 3098c2ecf20Sopenharmony_ci struct drm_i915_private *i915 = data; 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci if (igt_flush_test(i915)) 3128c2ecf20Sopenharmony_ci err = -EIO; 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci i915_gem_drain_freed_objects(i915); 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci return err; 3178c2ecf20Sopenharmony_ci} 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ciint __intel_gt_live_setup(void *data) 3208c2ecf20Sopenharmony_ci{ 3218c2ecf20Sopenharmony_ci struct intel_gt *gt = data; 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci /* The selftests expect an idle system */ 3248c2ecf20Sopenharmony_ci if (intel_gt_pm_wait_for_idle(gt)) 3258c2ecf20Sopenharmony_ci return -EIO; 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci return intel_gt_terminally_wedged(gt); 3288c2ecf20Sopenharmony_ci} 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ciint __intel_gt_live_teardown(int err, void *data) 3318c2ecf20Sopenharmony_ci{ 3328c2ecf20Sopenharmony_ci struct intel_gt *gt = data; 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci if (igt_flush_test(gt->i915)) 3358c2ecf20Sopenharmony_ci err = -EIO; 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_ci i915_gem_drain_freed_objects(gt->i915); 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci return err; 3408c2ecf20Sopenharmony_ci} 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ciint __i915_subtests(const char *caller, 3438c2ecf20Sopenharmony_ci int (*setup)(void *data), 3448c2ecf20Sopenharmony_ci int (*teardown)(int err, void *data), 3458c2ecf20Sopenharmony_ci const struct i915_subtest *st, 3468c2ecf20Sopenharmony_ci unsigned int count, 3478c2ecf20Sopenharmony_ci void *data) 3488c2ecf20Sopenharmony_ci{ 3498c2ecf20Sopenharmony_ci int err; 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci for (; count--; st++) { 3528c2ecf20Sopenharmony_ci cond_resched(); 3538c2ecf20Sopenharmony_ci if (signal_pending(current)) 3548c2ecf20Sopenharmony_ci return -EINTR; 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci if (!apply_subtest_filter(caller, st->name)) 3578c2ecf20Sopenharmony_ci continue; 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci err = setup(data); 3608c2ecf20Sopenharmony_ci if (err) { 3618c2ecf20Sopenharmony_ci pr_err(DRIVER_NAME "/%s: setup failed for %s\n", 3628c2ecf20Sopenharmony_ci caller, st->name); 3638c2ecf20Sopenharmony_ci return err; 3648c2ecf20Sopenharmony_ci } 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci pr_info(DRIVER_NAME ": Running %s/%s\n", caller, st->name); 3678c2ecf20Sopenharmony_ci GEM_TRACE("Running %s/%s\n", caller, st->name); 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci err = teardown(st->func(data), data); 3708c2ecf20Sopenharmony_ci if (err && err != -EINTR) { 3718c2ecf20Sopenharmony_ci pr_err(DRIVER_NAME "/%s: %s failed with error %d\n", 3728c2ecf20Sopenharmony_ci caller, st->name, err); 3738c2ecf20Sopenharmony_ci return err; 3748c2ecf20Sopenharmony_ci } 3758c2ecf20Sopenharmony_ci } 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci return 0; 3788c2ecf20Sopenharmony_ci} 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_cibool __igt_timeout(unsigned long timeout, const char *fmt, ...) 3818c2ecf20Sopenharmony_ci{ 3828c2ecf20Sopenharmony_ci va_list va; 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci if (!signal_pending(current)) { 3858c2ecf20Sopenharmony_ci cond_resched(); 3868c2ecf20Sopenharmony_ci if (time_before(jiffies, timeout)) 3878c2ecf20Sopenharmony_ci return false; 3888c2ecf20Sopenharmony_ci } 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci if (fmt) { 3918c2ecf20Sopenharmony_ci va_start(va, fmt); 3928c2ecf20Sopenharmony_ci vprintk(fmt, va); 3938c2ecf20Sopenharmony_ci va_end(va); 3948c2ecf20Sopenharmony_ci } 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ci return true; 3978c2ecf20Sopenharmony_ci} 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_civoid igt_hexdump(const void *buf, size_t len) 4008c2ecf20Sopenharmony_ci{ 4018c2ecf20Sopenharmony_ci const size_t rowsize = 8 * sizeof(u32); 4028c2ecf20Sopenharmony_ci const void *prev = NULL; 4038c2ecf20Sopenharmony_ci bool skip = false; 4048c2ecf20Sopenharmony_ci size_t pos; 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_ci for (pos = 0; pos < len; pos += rowsize) { 4078c2ecf20Sopenharmony_ci char line[128]; 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci if (prev && !memcmp(prev, buf + pos, rowsize)) { 4108c2ecf20Sopenharmony_ci if (!skip) { 4118c2ecf20Sopenharmony_ci pr_info("*\n"); 4128c2ecf20Sopenharmony_ci skip = true; 4138c2ecf20Sopenharmony_ci } 4148c2ecf20Sopenharmony_ci continue; 4158c2ecf20Sopenharmony_ci } 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_ci WARN_ON_ONCE(hex_dump_to_buffer(buf + pos, len - pos, 4188c2ecf20Sopenharmony_ci rowsize, sizeof(u32), 4198c2ecf20Sopenharmony_ci line, sizeof(line), 4208c2ecf20Sopenharmony_ci false) >= sizeof(line)); 4218c2ecf20Sopenharmony_ci pr_info("[%04zx] %s\n", pos, line); 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_ci prev = buf + pos; 4248c2ecf20Sopenharmony_ci skip = false; 4258c2ecf20Sopenharmony_ci } 4268c2ecf20Sopenharmony_ci} 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_cimodule_param_named(st_random_seed, i915_selftest.random_seed, uint, 0400); 4298c2ecf20Sopenharmony_cimodule_param_named(st_timeout, i915_selftest.timeout_ms, uint, 0400); 4308c2ecf20Sopenharmony_cimodule_param_named(st_filter, i915_selftest.filter, charp, 0400); 4318c2ecf20Sopenharmony_ci 4328c2ecf20Sopenharmony_cimodule_param_named_unsafe(mock_selftests, i915_selftest.mock, int, 0400); 4338c2ecf20Sopenharmony_ciMODULE_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)"); 4348c2ecf20Sopenharmony_ci 4358c2ecf20Sopenharmony_cimodule_param_named_unsafe(live_selftests, i915_selftest.live, int, 0400); 4368c2ecf20Sopenharmony_ciMODULE_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)"); 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_cimodule_param_named_unsafe(perf_selftests, i915_selftest.perf, int, 0400); 4398c2ecf20Sopenharmony_ciMODULE_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)"); 440