xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/i915/gt/selftest_gt_pm.c (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: selftest_gt_pm.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
2 
3 
4 /*
5  * SPDX-License-Identifier: MIT
6  *
7  * Copyright © 2019 Intel Corporation
8  */
9 
10 #include <sys/cdefs.h>
11 __KERNEL_RCSID(0, "$NetBSD: selftest_gt_pm.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
12 
13 #include "selftest_llc.h"
14 #include "selftest_rc6.h"
15 
live_gt_resume(void * arg)16 static int live_gt_resume(void *arg)
17 {
18 	struct intel_gt *gt = arg;
19 	IGT_TIMEOUT(end_time);
20 	int err;
21 
22 	/* Do several suspend/resume cycles to check we don't explode! */
23 	do {
24 		intel_gt_suspend_prepare(gt);
25 		intel_gt_suspend_late(gt);
26 
27 		if (gt->rc6.enabled) {
28 			pr_err("rc6 still enabled after suspend!\n");
29 			intel_gt_set_wedged_on_init(gt);
30 			err = -EINVAL;
31 			break;
32 		}
33 
34 		err = intel_gt_resume(gt);
35 		if (err)
36 			break;
37 
38 		if (gt->rc6.supported && !gt->rc6.enabled) {
39 			pr_err("rc6 not enabled upon resume!\n");
40 			intel_gt_set_wedged_on_init(gt);
41 			err = -EINVAL;
42 			break;
43 		}
44 
45 		err = st_llc_verify(&gt->llc);
46 		if (err) {
47 			pr_err("llc state not restored upon resume!\n");
48 			intel_gt_set_wedged_on_init(gt);
49 			break;
50 		}
51 	} while (!__igt_timeout(end_time, NULL));
52 
53 	return err;
54 }
55 
intel_gt_pm_live_selftests(struct drm_i915_private * i915)56 int intel_gt_pm_live_selftests(struct drm_i915_private *i915)
57 {
58 	static const struct i915_subtest tests[] = {
59 		SUBTEST(live_rc6_manual),
60 		SUBTEST(live_gt_resume),
61 	};
62 
63 	if (intel_gt_is_wedged(&i915->gt))
64 		return 0;
65 
66 	return intel_gt_live_subtests(tests, &i915->gt);
67 }
68 
intel_gt_pm_late_selftests(struct drm_i915_private * i915)69 int intel_gt_pm_late_selftests(struct drm_i915_private *i915)
70 {
71 	static const struct i915_subtest tests[] = {
72 		/*
73 		 * These tests may leave the system in an undesirable state.
74 		 * They are intended to be run last in CI and the system
75 		 * rebooted afterwards.
76 		 */
77 		SUBTEST(live_rc6_ctx_wa),
78 	};
79 
80 	if (intel_gt_is_wedged(&i915->gt))
81 		return 0;
82 
83 	return intel_gt_live_subtests(tests, &i915->gt);
84 }
85