linux/drivers/gpu/drm/i915/selftests/igt_live_test.c
<<
>>
Prefs
   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
  13int 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
  47int 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}
  79