Home | History | Annotate | Line # | Download | only in selftests
      1 /*	$NetBSD: igt_live_test.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $	*/
      2 
      3 /*
      4  * SPDX-License-Identifier: MIT
      5  *
      6  * Copyright  2018 Intel Corporation
      7  */
      8 
      9 #include <sys/cdefs.h>
     10 __KERNEL_RCSID(0, "$NetBSD: igt_live_test.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $");
     11 
     12 #include "i915_drv.h"
     13 #include "gt/intel_gt_requests.h"
     14 
     15 #include "../i915_selftest.h"
     16 #include "igt_flush_test.h"
     17 #include "igt_live_test.h"
     18 
     19 int igt_live_test_begin(struct igt_live_test *t,
     20 			struct drm_i915_private *i915,
     21 			const char *func,
     22 			const char *name)
     23 {
     24 	struct intel_gt *gt = &i915->gt;
     25 	struct intel_engine_cs *engine;
     26 	enum intel_engine_id id;
     27 	int err;
     28 
     29 	t->i915 = i915;
     30 	t->func = func;
     31 	t->name = name;
     32 
     33 	err = intel_gt_wait_for_idle(gt, MAX_SCHEDULE_TIMEOUT);
     34 	if (err) {
     35 		pr_err("%s(%s): failed to idle before, with err=%d!",
     36 		       func, name, err);
     37 		return err;
     38 	}
     39 
     40 	t->reset_global = i915_reset_count(&i915->gpu_error);
     41 
     42 	for_each_engine(engine, gt, id)
     43 		t->reset_engine[id] =
     44 			i915_reset_engine_count(&i915->gpu_error, engine);
     45 
     46 	return 0;
     47 }
     48 
     49 int igt_live_test_end(struct igt_live_test *t)
     50 {
     51 	struct drm_i915_private *i915 = t->i915;
     52 	struct intel_engine_cs *engine;
     53 	enum intel_engine_id id;
     54 
     55 	if (igt_flush_test(i915))
     56 		return -EIO;
     57 
     58 	if (t->reset_global != i915_reset_count(&i915->gpu_error)) {
     59 		pr_err("%s(%s): GPU was reset %d times!\n",
     60 		       t->func, t->name,
     61 		       i915_reset_count(&i915->gpu_error) - t->reset_global);
     62 		return -EIO;
     63 	}
     64 
     65 	for_each_engine(engine, &i915->gt, id) {
     66 		if (t->reset_engine[id] ==
     67 		    i915_reset_engine_count(&i915->gpu_error, engine))
     68 			continue;
     69 
     70 		pr_err("%s(%s): engine '%s' was reset %d times!\n",
     71 		       t->func, t->name, engine->name,
     72 		       i915_reset_engine_count(&i915->gpu_error, engine) -
     73 		       t->reset_engine[id]);
     74 		return -EIO;
     75 	}
     76 
     77 	return 0;
     78 }
     79