drm/i915/gt: Ignore incomplete engines after init failure
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 26 Dec 2019 19:12:37 +0000 (19:12 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 26 Dec 2019 19:51:42 +0000 (19:51 +0000)
Do not expose incomplete engines to the user after we fail to setup the
GT.

Fixes: e6ba76480299 ("drm/i915: Remove i915->kernel_context")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Andi Shyti <andi.shyti@intel.com>
Acked-by: Andi Shyti <andi.shyti@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191226191237.2654510-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_engine_user.c
drivers/gpu/drm/i915/gt/intel_gt.h
drivers/gpu/drm/i915/gt/intel_reset.c

index 7f7150a..9e7f12b 100644 (file)
@@ -11,6 +11,7 @@
 #include "i915_drv.h"
 #include "intel_engine.h"
 #include "intel_engine_user.h"
+#include "intel_gt.h"
 
 struct intel_engine_cs *
 intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance)
@@ -200,6 +201,9 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
                                     uabi_node);
                char old[sizeof(engine->name)];
 
+               if (intel_gt_has_init_error(engine->gt))
+                       continue; /* ignore incomplete engines */
+
                GEM_BUG_ON(engine->class >= ARRAY_SIZE(uabi_classes));
                engine->uabi_class = uabi_classes[engine->class];
 
index 2355cf1..1dac441 100644 (file)
@@ -58,9 +58,14 @@ static inline u32 intel_gt_scratch_offset(const struct intel_gt *gt,
        return i915_ggtt_offset(gt->scratch) + field;
 }
 
-static inline bool intel_gt_is_wedged(struct intel_gt *gt)
+static inline bool intel_gt_is_wedged(const struct intel_gt *gt)
 {
        return __intel_reset_failed(&gt->reset);
 }
 
+static inline bool intel_gt_has_init_error(const struct intel_gt *gt)
+{
+       return test_bit(I915_WEDGED_ON_INIT, &gt->reset.flags);
+}
+
 #endif /* __INTEL_GT_H__ */
index 1c51296..2b7f757 100644 (file)
@@ -1329,10 +1329,10 @@ int intel_gt_terminally_wedged(struct intel_gt *gt)
        if (!intel_gt_is_wedged(gt))
                return 0;
 
-       /* Reset still in progress? Maybe we will recover? */
-       if (!test_bit(I915_RESET_BACKOFF, &gt->reset.flags))
+       if (intel_gt_has_init_error(gt))
                return -EIO;
 
+       /* Reset still in progress? Maybe we will recover? */
        if (wait_event_interruptible(gt->reset.queue,
                                     !test_bit(I915_RESET_BACKOFF,
                                               &gt->reset.flags)))