Home | History | Annotate | Line # | Download | only in gt
      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 
     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 
     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 
     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