Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / gpu / drm / i915 / selftests / igt_live_test.c
1 /*
2  * SPDX-License-Identifier: MIT
3  *
4  * Copyright © 2018 Intel Corporation
5  */
6
7 #include "../i915_drv.h"
8
9 #include "../i915_selftest.h"
10 #include "igt_flush_test.h"
11 #include "igt_live_test.h"
12
13 int igt_live_test_begin(struct igt_live_test *t,
14                         struct drm_i915_private *i915,
15                         const char *func,
16                         const char *name)
17 {
18         struct intel_engine_cs *engine;
19         enum intel_engine_id id;
20         int err;
21
22         lockdep_assert_held(&i915->drm.struct_mutex);
23
24         t->i915 = i915;
25         t->func = func;
26         t->name = name;
27
28         err = i915_gem_wait_for_idle(i915,
29                                      I915_WAIT_INTERRUPTIBLE |
30                                      I915_WAIT_LOCKED,
31                                      MAX_SCHEDULE_TIMEOUT);
32         if (err) {
33                 pr_err("%s(%s): failed to idle before, with err=%d!",
34                        func, name, err);
35                 return err;
36         }
37
38         t->reset_global = i915_reset_count(&i915->gpu_error);
39
40         for_each_engine(engine, i915, id)
41                 t->reset_engine[id] =
42                         i915_reset_engine_count(&i915->gpu_error, engine);
43
44         return 0;
45 }
46
47 int igt_live_test_end(struct igt_live_test *t)
48 {
49         struct drm_i915_private *i915 = t->i915;
50         struct intel_engine_cs *engine;
51         enum intel_engine_id id;
52
53         lockdep_assert_held(&i915->drm.struct_mutex);
54
55         if (igt_flush_test(i915, I915_WAIT_LOCKED))
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, 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 }