Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/reset: add modeset_stuck callback to intel_display_reset_prepare()

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>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/d322e20927326afa47c0df8a4d4776ee77010e6d.1741001054.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>

+15 -5
+3 -3
drivers/gpu/drm/i915/display/intel_display_reset.c
··· 20 20 } 21 21 22 22 /* returns true if intel_display_reset_finish() needs to be called */ 23 - bool intel_display_reset_prepare(struct intel_display *display) 23 + bool intel_display_reset_prepare(struct intel_display *display, 24 + modeset_stuck_fn modeset_stuck, void *context) 24 25 { 25 - struct drm_i915_private *dev_priv = to_i915(display->drm); 26 26 struct drm_modeset_acquire_ctx *ctx = &display->restore.reset_ctx; 27 27 struct drm_atomic_state *state; 28 28 int ret; ··· 33 33 if (atomic_read(&display->restore.pending_fb_pin)) { 34 34 drm_dbg_kms(display->drm, 35 35 "Modeset potentially stuck, unbreaking through wedging\n"); 36 - intel_gt_set_wedged(to_gt(dev_priv)); 36 + modeset_stuck(context); 37 37 } 38 38 39 39 /*
+4 -1
drivers/gpu/drm/i915/display/intel_display_reset.h
··· 10 10 11 11 struct intel_display; 12 12 13 + typedef void modeset_stuck_fn(void *context); 14 + 13 15 bool intel_display_reset_test(struct intel_display *display); 14 - bool intel_display_reset_prepare(struct intel_display *display); 16 + bool intel_display_reset_prepare(struct intel_display *display, 17 + modeset_stuck_fn modeset_stuck, void *context); 15 18 void intel_display_reset_finish(struct intel_display *display, bool test_only); 16 19 17 20 #endif /* __INTEL_RESET_H__ */
+8 -1
drivers/gpu/drm/i915/gt/intel_reset.c
··· 1403 1403 return err; 1404 1404 } 1405 1405 1406 + static void display_reset_modeset_stuck(void *gt) 1407 + { 1408 + intel_gt_set_wedged(gt); 1409 + } 1410 + 1406 1411 static void intel_gt_reset_global(struct intel_gt *gt, 1407 1412 u32 engine_mask, 1408 1413 const char *reason) ··· 1437 1432 need_display_reset; 1438 1433 1439 1434 if (reset_display) 1440 - reset_display = intel_display_reset_prepare(display); 1435 + reset_display = intel_display_reset_prepare(display, 1436 + display_reset_modeset_stuck, 1437 + gt); 1441 1438 1442 1439 intel_gt_reset(gt, engine_mask, reason); 1443 1440