1 
2 /*
3  * SPDX-License-Identifier: MIT
4  *
5  * Copyright © 2019 Intel Corporation
6  */
7 
8 #include "selftest_llc.h"
9 
10 static int live_gt_resume(void *arg)
11 {
12 	struct intel_gt *gt = arg;
13 	IGT_TIMEOUT(end_time);
14 	int err;
15 
16 	/* Do several suspend/resume cycles to check we don't explode! */
17 	do {
18 		intel_gt_suspend(gt);
19 
20 		if (gt->rc6.enabled) {
21 			pr_err("rc6 still enabled after suspend!\n");
22 			intel_gt_set_wedged_on_init(gt);
23 			err = -EINVAL;
24 			break;
25 		}
26 
27 		err = intel_gt_resume(gt);
28 		if (err)
29 			break;
30 
31 		if (gt->rc6.supported && !gt->rc6.enabled) {
32 			pr_err("rc6 not enabled upon resume!\n");
33 			intel_gt_set_wedged_on_init(gt);
34 			err = -EINVAL;
35 			break;
36 		}
37 
38 		err = st_llc_verify(&gt->llc);
39 		if (err) {
40 			pr_err("llc state not restored upon resume!\n");
41 			intel_gt_set_wedged_on_init(gt);
42 			break;
43 		}
44 	} while (!__igt_timeout(end_time, NULL));
45 
46 	return err;
47 }
48 
49 int intel_gt_pm_live_selftests(struct drm_i915_private *i915)
50 {
51 	static const struct i915_subtest tests[] = {
52 		SUBTEST(live_gt_resume),
53 	};
54 
55 	if (intel_gt_is_wedged(&i915->gt))
56 		return 0;
57 
58 	return intel_gt_live_subtests(tests, &i915->gt);
59 }
60