On Mon, Mar 03, 2025 at 01:27:10PM +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@xxxxxxxxx> > Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> Reviewed-by: Matt Roper <matthew.d.roper@xxxxxxxxx> > --- > 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 | 9 ++++++++- > 3 files changed, 15 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 d5ce0ac43377..1f2798404f2c 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_reset.c > +++ b/drivers/gpu/drm/i915/display/intel_display_reset.c > @@ -20,9 +20,9 @@ bool intel_display_reset_test(struct intel_display *display) > } > > /* returns true if intel_display_reset_finish() needs to be called */ > -bool intel_display_reset_prepare(struct intel_display *display) > +bool 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; > @@ -33,7 +33,7 @@ bool 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 f518147199a1..8b3bda134454 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); > -bool intel_display_reset_prepare(struct intel_display *display); > +bool 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 0f12752d0f24..dbdcfe130ad4 100644 > --- a/drivers/gpu/drm/i915/gt/intel_reset.c > +++ b/drivers/gpu/drm/i915/gt/intel_reset.c > @@ -1400,6 +1400,11 @@ int intel_engine_reset(struct intel_engine_cs *engine, const char *msg) > return err; > } > > +static void display_reset_modeset_stuck(void *gt) > +{ > + intel_gt_set_wedged(gt); > +} > + > static void intel_gt_reset_global(struct intel_gt *gt, > u32 engine_mask, > const char *reason) > @@ -1429,7 +1434,9 @@ static void intel_gt_reset_global(struct intel_gt *gt, > need_display_reset; > > if (reset_display) > - reset_display = intel_display_reset_prepare(display); > + reset_display = intel_display_reset_prepare(display, > + display_reset_modeset_stuck, > + gt); > > intel_gt_reset(gt, engine_mask, reason); > > -- > 2.39.5 > -- Matt Roper Graphics Software Engineer Linux GPU Platform Enablement Intel Corporation