0001
0002
0003
0004
0005
0006
0007 #include "i915_drv.h"
0008 #include "gt/intel_gt.h"
0009
0010 #include "../i915_selftest.h"
0011 #include "igt_flush_test.h"
0012 #include "igt_live_test.h"
0013
0014 int igt_live_test_begin(struct igt_live_test *t,
0015 struct drm_i915_private *i915,
0016 const char *func,
0017 const char *name)
0018 {
0019 struct intel_gt *gt = to_gt(i915);
0020 struct intel_engine_cs *engine;
0021 enum intel_engine_id id;
0022 int err;
0023
0024 t->i915 = i915;
0025 t->func = func;
0026 t->name = name;
0027
0028 err = intel_gt_wait_for_idle(gt, MAX_SCHEDULE_TIMEOUT);
0029 if (err) {
0030 pr_err("%s(%s): failed to idle before, with err=%d!",
0031 func, name, err);
0032 return err;
0033 }
0034
0035 t->reset_global = i915_reset_count(&i915->gpu_error);
0036
0037 for_each_engine(engine, gt, id)
0038 t->reset_engine[id] =
0039 i915_reset_engine_count(&i915->gpu_error, engine);
0040
0041 return 0;
0042 }
0043
0044 int igt_live_test_end(struct igt_live_test *t)
0045 {
0046 struct drm_i915_private *i915 = t->i915;
0047 struct intel_engine_cs *engine;
0048 enum intel_engine_id id;
0049
0050 if (igt_flush_test(i915))
0051 return -EIO;
0052
0053 if (t->reset_global != i915_reset_count(&i915->gpu_error)) {
0054 pr_err("%s(%s): GPU was reset %d times!\n",
0055 t->func, t->name,
0056 i915_reset_count(&i915->gpu_error) - t->reset_global);
0057 return -EIO;
0058 }
0059
0060 for_each_engine(engine, to_gt(i915), id) {
0061 if (t->reset_engine[id] ==
0062 i915_reset_engine_count(&i915->gpu_error, engine))
0063 continue;
0064
0065 pr_err("%s(%s): engine '%s' was reset %d times!\n",
0066 t->func, t->name, engine->name,
0067 i915_reset_engine_count(&i915->gpu_error, engine) -
0068 t->reset_engine[id]);
0069 return -EIO;
0070 }
0071
0072 return 0;
0073 }