Skip to content

Commit

Permalink
drm/i915/gt: Avoid using the GPU before initialisation
Browse files Browse the repository at this point in the history
Mark the GT as wedged so that we are not tempted to use it prior to
initialisation.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Andi Shyti <andi.shyti@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191229183153.3719869-3-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Dec 30, 2019
1 parent 7b02b23 commit 45b152f
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 5 deletions.
8 changes: 4 additions & 4 deletions drivers/gpu/drm/i915/gt/intel_engine_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,16 +123,16 @@ static bool switch_to_kernel_context(struct intel_engine_cs *engine)
unsigned long flags;
bool result = true;

/* GPU is pointing to the void, as good as in the kernel context. */
if (intel_gt_is_wedged(engine->gt))
return true;

GEM_BUG_ON(!intel_context_is_barrier(ce));

/* Already inside the kernel context, safe to power down. */
if (engine->wakeref_serial == engine->serial)
return true;

/* GPU is pointing to the void, as good as in the kernel context. */
if (intel_gt_is_wedged(engine->gt))
return true;

/*
* Note, we do this without taking the timeline->mutex. We cannot
* as we may be called while retiring the kernel context and so
Expand Down
6 changes: 5 additions & 1 deletion drivers/gpu/drm/i915/gt/intel_gt_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ int intel_gt_resume(struct intel_gt *gt)
enum intel_engine_id id;
int err;

err = intel_gt_terminally_wedged(gt);
err = intel_gt_has_init_error(gt);
if (err)
return err;

Expand All @@ -196,6 +196,10 @@ int intel_gt_resume(struct intel_gt *gt)
intel_uncore_forcewake_get(gt->uncore, FORCEWAKE_ALL);
intel_rc6_sanitize(&gt->rc6);
gt_sanitize(gt, true);
if (intel_gt_is_wedged(gt)) {
err = -EIO;
goto out_fw;
}

/* Only when the HW is re-initialised, can we replay the requests */
err = intel_gt_init_hw(gt);
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/i915/gt/intel_reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -1353,6 +1353,9 @@ void intel_gt_init_reset(struct intel_gt *gt)
init_waitqueue_head(&gt->reset.queue);
mutex_init(&gt->reset.mutex);
init_srcu_struct(&gt->reset.backoff_srcu);

/* no GPU until we are ready! */
__set_bit(I915_WEDGED, &gt->reset.flags);
}

void intel_gt_fini_reset(struct intel_gt *gt)
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/selftests/mock_gem_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ struct drm_i915_private *mock_gem_device(void)
if (mock_engine_init(i915->engine[RCS0]))
goto err_context;

__clear_bit(I915_WEDGED, &i915->gt.reset.flags);
intel_engines_driver_register(i915);

return i915;
Expand Down

0 comments on commit 45b152f

Please sign in to comment.