]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/xe: Add a helper function to set recovery method
authorRiana Tauro <riana.tauro@intel.com>
Tue, 26 Aug 2025 06:34:11 +0000 (12:04 +0530)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 26 Aug 2025 14:11:34 +0000 (10:11 -0400)
Add a helper function to set recovery method. The recovery
method can be set before declaring the device wedged and sending the
drm wedged uevent. If no method is set, default unbind/re-bind method
will be set.

v2: fix documentation (Raag)

Signed-off-by: Riana Tauro <riana.tauro@intel.com>
Reviewed-by: Raag Jadav <raag.jadav@intel.com>
Link: https://lore.kernel.org/r/20250826063419.3022216-5-riana.tauro@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_device.h
drivers/gpu/drm/xe/xe_device_types.h

index bc8be6fbd2e8d8cc61815038fe45da38ee963308..ab9f3a57dcd9a7e6cf4f7c267e2d2275b8a6b3f8 100644 (file)
@@ -1176,13 +1176,26 @@ static void xe_device_wedged_fini(struct drm_device *drm, void *arg)
  * is rebind/bus-reset.
  */
 
+/**
+ * xe_device_set_wedged_method - Set wedged recovery method
+ * @xe: xe device instance
+ * @method: recovery method to set
+ *
+ * Set wedged recovery method to be sent in drm wedged uevent.
+ */
+void xe_device_set_wedged_method(struct xe_device *xe, unsigned long method)
+{
+       xe->wedged.method = method;
+}
+
 /**
  * xe_device_declare_wedged - Declare device wedged
  * @xe: xe device instance
  *
  * This is a final state that can only be cleared with the recovery method
- * specified in the drm wedged uevent. The default recovery method is
- * re-probe (unbind + bind).
+ * specified in the drm wedged uevent. The method can be set using
+ * xe_device_set_wedged_method before declaring the device as wedged. If no method
+ * is set, reprobe (unbind/re-bind) will be sent by default.
  *
  * In this state every IOCTL will be blocked so the GT cannot be used.
  * In general it will be called upon any critical error such as gt reset
@@ -1223,9 +1236,12 @@ void xe_device_declare_wedged(struct xe_device *xe)
                xe_gt_declare_wedged(gt);
 
        if (xe_device_wedged(xe)) {
+               /* If no wedge recovery method is set, use default */
+               if (!xe->wedged.method)
+                       xe_device_set_wedged_method(xe, DRM_WEDGE_RECOVERY_REBIND |
+                                                   DRM_WEDGE_RECOVERY_BUS_RESET);
+
                /* Notify userspace of wedged device */
-               drm_dev_wedged_event(&xe->drm,
-                                    DRM_WEDGE_RECOVERY_REBIND | DRM_WEDGE_RECOVERY_BUS_RESET,
-                                    NULL);
+               drm_dev_wedged_event(&xe->drm, xe->wedged.method, NULL);
        }
 }
index bc802e066a7dd0b7801acfec996effe65eac21a9..32cc6323b7f64eb6444a2d4296bf0e56563d6d88 100644 (file)
@@ -187,6 +187,7 @@ static inline bool xe_device_wedged(struct xe_device *xe)
        return atomic_read(&xe->wedged.flag);
 }
 
+void xe_device_set_wedged_method(struct xe_device *xe, unsigned long method);
 void xe_device_declare_wedged(struct xe_device *xe);
 
 struct xe_file *xe_file_get(struct xe_file *xef);
index 86506cdfc8013040f505ccd2a9f0b6cf900458e7..333c7aa6bbb3b4eba4ff808a8aedf5f1469d5af4 100644 (file)
@@ -541,6 +541,8 @@ struct xe_device {
                atomic_t flag;
                /** @wedged.mode: Mode controlled by kernel parameter and debugfs */
                int mode;
+               /** @wedged.method: Recovery method to be sent in the drm device wedged uevent */
+               unsigned long method;
        } wedged;
 
        /** @bo_device: Struct to control async free of BOs */