Message ID | 5807a95e88bc058752a2d5cdc03edd20c4da5884.1740481927.git.jani.nikula@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | drm/i915: display reset cleanups | expand |
On Tue, Feb 25, 2025 at 01:14:22PM +0200, Jani Nikula wrote: > Drop the dependency on gt by providing a callback for trying to unbreak > stuck modeset. Do intel_gt_set_wedged() via the callback. > > It's by no means pretty, but this is perhaps the most straightforward > alternative. > > Cc: Matt Roper <matthew.d.roper@intel.com> > Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Matt Roper <matthew.d.roper@intel.com> > --- > drivers/gpu/drm/i915/display/intel_display_reset.c | 6 +++--- > drivers/gpu/drm/i915/display/intel_display_reset.h | 5 ++++- > drivers/gpu/drm/i915/gt/intel_reset.c | 7 ++++++- > 3 files changed, 13 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_reset.c b/drivers/gpu/drm/i915/display/intel_display_reset.c > index aafee2df6501..8ef86c896158 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_reset.c > +++ b/drivers/gpu/drm/i915/display/intel_display_reset.c > @@ -19,9 +19,9 @@ bool intel_display_reset_test(struct intel_display *display) > return display->params.force_reset_modeset_test; > } > > -void intel_display_reset_prepare(struct intel_display *display) > +void intel_display_reset_prepare(struct intel_display *display, > + modeset_stuck_fn modeset_stuck, void *context) > { > - struct drm_i915_private *dev_priv = to_i915(display->drm); > struct drm_modeset_acquire_ctx *ctx = &display->restore.reset_ctx; > struct drm_atomic_state *state; > int ret; > @@ -32,7 +32,7 @@ void intel_display_reset_prepare(struct intel_display *display) > if (atomic_read(&display->restore.pending_fb_pin)) { > drm_dbg_kms(display->drm, > "Modeset potentially stuck, unbreaking through wedging\n"); > - intel_gt_set_wedged(to_gt(dev_priv)); > + modeset_stuck(context); > } > > /* > diff --git a/drivers/gpu/drm/i915/display/intel_display_reset.h b/drivers/gpu/drm/i915/display/intel_display_reset.h > index 985766cde001..053c3e90ac77 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_reset.h > +++ b/drivers/gpu/drm/i915/display/intel_display_reset.h > @@ -10,8 +10,11 @@ > > struct intel_display; > > +typedef void modeset_stuck_fn(void *context); > + > bool intel_display_reset_test(struct intel_display *display); > -void intel_display_reset_prepare(struct intel_display *display); > +void intel_display_reset_prepare(struct intel_display *display, > + modeset_stuck_fn modeset_stuck, void *context); > void intel_display_reset_finish(struct intel_display *display, bool test_only); > > #endif /* __INTEL_RESET_H__ */ > diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c b/drivers/gpu/drm/i915/gt/intel_reset.c > index 2ca12bbf168f..84a8ca167a4e 100644 > --- a/drivers/gpu/drm/i915/gt/intel_reset.c > +++ b/drivers/gpu/drm/i915/gt/intel_reset.c > @@ -1405,6 +1405,11 @@ static bool gt_reset_clobbers_display(struct intel_gt *gt) > return intel_gt_gpu_reset_clobbers_display(gt) && intel_has_gpu_reset(gt); > } > > +static void display_reset_modeset_stuck(void *gt) > +{ > + intel_gt_set_wedged(gt); > +} > + > static void display_reset_prepare(struct intel_gt *gt) > { > struct drm_i915_private *i915 = gt->i915; > @@ -1419,7 +1424,7 @@ static void display_reset_prepare(struct intel_gt *gt) > smp_mb__after_atomic(); > wake_up_bit(>->reset.flags, I915_RESET_MODESET); > > - intel_display_reset_prepare(display); > + intel_display_reset_prepare(display, display_reset_modeset_stuck, gt); > } > > static void display_reset_finish(struct intel_gt *gt) > -- > 2.39.5 >
diff --git a/drivers/gpu/drm/i915/display/intel_display_reset.c b/drivers/gpu/drm/i915/display/intel_display_reset.c index aafee2df6501..8ef86c896158 100644 --- a/drivers/gpu/drm/i915/display/intel_display_reset.c +++ b/drivers/gpu/drm/i915/display/intel_display_reset.c @@ -19,9 +19,9 @@ bool intel_display_reset_test(struct intel_display *display) return display->params.force_reset_modeset_test; } -void intel_display_reset_prepare(struct intel_display *display) +void intel_display_reset_prepare(struct intel_display *display, + modeset_stuck_fn modeset_stuck, void *context) { - struct drm_i915_private *dev_priv = to_i915(display->drm); struct drm_modeset_acquire_ctx *ctx = &display->restore.reset_ctx; struct drm_atomic_state *state; int ret; @@ -32,7 +32,7 @@ void intel_display_reset_prepare(struct intel_display *display) if (atomic_read(&display->restore.pending_fb_pin)) { drm_dbg_kms(display->drm, "Modeset potentially stuck, unbreaking through wedging\n"); - intel_gt_set_wedged(to_gt(dev_priv)); + modeset_stuck(context); } /* diff --git a/drivers/gpu/drm/i915/display/intel_display_reset.h b/drivers/gpu/drm/i915/display/intel_display_reset.h index 985766cde001..053c3e90ac77 100644 --- a/drivers/gpu/drm/i915/display/intel_display_reset.h +++ b/drivers/gpu/drm/i915/display/intel_display_reset.h @@ -10,8 +10,11 @@ struct intel_display; +typedef void modeset_stuck_fn(void *context); + bool intel_display_reset_test(struct intel_display *display); -void intel_display_reset_prepare(struct intel_display *display); +void intel_display_reset_prepare(struct intel_display *display, + modeset_stuck_fn modeset_stuck, void *context); void intel_display_reset_finish(struct intel_display *display, bool test_only); #endif /* __INTEL_RESET_H__ */ diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c b/drivers/gpu/drm/i915/gt/intel_reset.c index 2ca12bbf168f..84a8ca167a4e 100644 --- a/drivers/gpu/drm/i915/gt/intel_reset.c +++ b/drivers/gpu/drm/i915/gt/intel_reset.c @@ -1405,6 +1405,11 @@ static bool gt_reset_clobbers_display(struct intel_gt *gt) return intel_gt_gpu_reset_clobbers_display(gt) && intel_has_gpu_reset(gt); } +static void display_reset_modeset_stuck(void *gt) +{ + intel_gt_set_wedged(gt); +} + static void display_reset_prepare(struct intel_gt *gt) { struct drm_i915_private *i915 = gt->i915; @@ -1419,7 +1424,7 @@ static void display_reset_prepare(struct intel_gt *gt) smp_mb__after_atomic(); wake_up_bit(>->reset.flags, I915_RESET_MODESET); - intel_display_reset_prepare(display); + intel_display_reset_prepare(display, display_reset_modeset_stuck, gt); } static void display_reset_finish(struct intel_gt *gt)
Drop the dependency on gt by providing a callback for trying to unbreak stuck modeset. Do intel_gt_set_wedged() via the callback. It's by no means pretty, but this is perhaps the most straightforward alternative. Cc: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/i915/display/intel_display_reset.c | 6 +++--- drivers/gpu/drm/i915/display/intel_display_reset.h | 5 ++++- drivers/gpu/drm/i915/gt/intel_reset.c | 7 ++++++- 3 files changed, 13 insertions(+), 5 deletions(-)