drm/i915: Handle all GTs on driver (un)load paths
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Thu, 15 Sep 2022 23:26:54 +0000 (16:26 -0700)
committerMatt Roper <matthew.d.roper@intel.com>
Fri, 16 Sep 2022 14:58:20 +0000 (07:58 -0700)
This, along with the changes already landed in commit 1c66a12ab431
("drm/i915: Handle each GT on init/release and suspend/resume") makes
engines from all GTs actually known to the driver.

To accomplish this we need to sprinkle a lot of for_each_gt calls around
but is otherwise pretty un-eventuful.

v2:
 - Consolidate adjacent GT loops in a couple places.  (Daniele)

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220915232654.3283095-5-matthew.d.roper@intel.com
drivers/gpu/drm/i915/i915_driver.c
drivers/gpu/drm/i915/i915_gem.c

index 01f4277..d5eb82e 100644 (file)
@@ -1647,7 +1647,8 @@ static int intel_runtime_suspend(struct device *kdev)
 
                intel_runtime_pm_enable_interrupts(dev_priv);
 
-               intel_gt_runtime_resume(to_gt(dev_priv));
+               for_each_gt(gt, dev_priv, i)
+                       intel_gt_runtime_resume(gt);
 
                enable_rpm_wakeref_asserts(rpm);
 
index c8e14ed..be7fede 100644 (file)
@@ -1091,6 +1091,8 @@ out:
 
 int i915_gem_init(struct drm_i915_private *dev_priv)
 {
+       struct intel_gt *gt;
+       unsigned int i;
        int ret;
 
        /* We need to fallback to 4K pages if host doesn't support huge gtt. */
@@ -1122,9 +1124,11 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
         */
        intel_init_clock_gating(dev_priv);
 
-       ret = intel_gt_init(to_gt(dev_priv));
-       if (ret)
-               goto err_unlock;
+       for_each_gt(gt, dev_priv, i) {
+               ret = intel_gt_init(gt);
+               if (ret)
+                       goto err_unlock;
+       }
 
        return 0;
 
@@ -1137,8 +1141,13 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
 err_unlock:
        i915_gem_drain_workqueue(dev_priv);
 
-       if (ret != -EIO)
-               intel_uc_cleanup_firmwares(&to_gt(dev_priv)->uc);
+       if (ret != -EIO) {
+               for_each_gt(gt, dev_priv, i) {
+                       intel_gt_driver_remove(gt);
+                       intel_gt_driver_release(gt);
+                       intel_uc_cleanup_firmwares(&gt->uc);
+               }
+       }
 
        if (ret == -EIO) {
                /*
@@ -1146,10 +1155,12 @@ err_unlock:
                 * as wedged. But we only want to do this when the GPU is angry,
                 * for all other failure, such as an allocation failure, bail.
                 */
-               if (!intel_gt_is_wedged(to_gt(dev_priv))) {
-                       i915_probe_error(dev_priv,
-                                        "Failed to initialize GPU, declaring it wedged!\n");
-                       intel_gt_set_wedged(to_gt(dev_priv));
+               for_each_gt(gt, dev_priv, i) {
+                       if (!intel_gt_is_wedged(gt)) {
+                               i915_probe_error(dev_priv,
+                                                "Failed to initialize GPU, declaring it wedged!\n");
+                               intel_gt_set_wedged(gt);
+                       }
                }
 
                /* Minimal basic recovery for KMS */
@@ -1177,10 +1188,14 @@ void i915_gem_driver_unregister(struct drm_i915_private *i915)
 
 void i915_gem_driver_remove(struct drm_i915_private *dev_priv)
 {
+       struct intel_gt *gt;
+       unsigned int i;
+
        intel_wakeref_auto_fini(&to_gt(dev_priv)->userfault_wakeref);
 
        i915_gem_suspend_late(dev_priv);
-       intel_gt_driver_remove(to_gt(dev_priv));
+       for_each_gt(gt, dev_priv, i)
+               intel_gt_driver_remove(gt);
        dev_priv->uabi_engines = RB_ROOT;
 
        /* Flush any outstanding unpin_work. */
@@ -1191,9 +1206,13 @@ void i915_gem_driver_remove(struct drm_i915_private *dev_priv)
 
 void i915_gem_driver_release(struct drm_i915_private *dev_priv)
 {
-       intel_gt_driver_release(to_gt(dev_priv));
+       struct intel_gt *gt;
+       unsigned int i;
 
-       intel_uc_cleanup_firmwares(&to_gt(dev_priv)->uc);
+       for_each_gt(gt, dev_priv, i) {
+               intel_gt_driver_release(gt);
+               intel_uc_cleanup_firmwares(&gt->uc);
+       }
 
        i915_gem_drain_freed_objects(dev_priv);