drm/i915: Initialize MMIO access for each GT
authorMatt Roper <matthew.d.roper@intel.com>
Tue, 6 Sep 2022 23:49:28 +0000 (16:49 -0700)
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Mon, 12 Sep 2022 12:23:12 +0000 (15:23 +0300)
In a multi-GT system we need to initialize MMIO access for each GT, not
just the primary GT.

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220906234934.3655440-9-matthew.d.roper@intel.com
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
drivers/gpu/drm/i915/i915_driver.c
drivers/gpu/drm/i915/intel_uncore.c
drivers/gpu/drm/i915/intel_uncore.h

index 16beae1a1ead34e1df35e0edc4b922c4dcc76793..d513ee690dc3aa25a82eed56e9bc84a112146d11 100644 (file)
@@ -431,7 +431,8 @@ static void i915_driver_late_release(struct drm_i915_private *dev_priv)
  */
 static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
 {
-       int ret;
+       struct intel_gt *gt;
+       int ret, i;
 
        if (i915_inject_probe_failure(dev_priv))
                return -ENODEV;
@@ -440,17 +441,27 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
        if (ret < 0)
                return ret;
 
-       ret = intel_uncore_init_mmio(&dev_priv->uncore);
-       if (ret)
-               return ret;
+       for_each_gt(gt, dev_priv, i) {
+               ret = intel_uncore_init_mmio(gt->uncore);
+               if (ret)
+                       return ret;
+
+               ret = drmm_add_action_or_reset(&dev_priv->drm,
+                                              intel_uncore_fini_mmio,
+                                              gt->uncore);
+               if (ret)
+                       return ret;
+       }
 
        /* Try to make sure MCHBAR is enabled before poking at it */
        intel_setup_mchbar(dev_priv);
        intel_device_info_runtime_init(dev_priv);
 
-       ret = intel_gt_init_mmio(to_gt(dev_priv));
-       if (ret)
-               goto err_uncore;
+       for_each_gt(gt, dev_priv, i) {
+               ret = intel_gt_init_mmio(gt);
+               if (ret)
+                       goto err_uncore;
+       }
 
        /* As early as possible, scrub existing GPU state before clobbering */
        sanitize_gpu(dev_priv);
@@ -459,7 +470,6 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
 
 err_uncore:
        intel_teardown_mchbar(dev_priv);
-       intel_uncore_fini_mmio(&dev_priv->uncore);
 
        return ret;
 }
@@ -471,7 +481,6 @@ err_uncore:
 static void i915_driver_mmio_release(struct drm_i915_private *dev_priv)
 {
        intel_teardown_mchbar(dev_priv);
-       intel_uncore_fini_mmio(&dev_priv->uncore);
 }
 
 /**
index c180d9514740897b6af12f04d2cc3ed70955764c..dda82b06914d9a68c509ff91329f552ad745f088 100644 (file)
@@ -2455,8 +2455,11 @@ void intel_uncore_prune_engine_fw_domains(struct intel_uncore *uncore,
        }
 }
 
-void intel_uncore_fini_mmio(struct intel_uncore *uncore)
+/* Called via drm-managed action */
+void intel_uncore_fini_mmio(struct drm_device *dev, void *data)
 {
+       struct intel_uncore *uncore = data;
+
        if (intel_uncore_has_forcewake(uncore)) {
                iosf_mbi_punit_acquire();
                iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
index 6100d0f4498a97b08c0eb4e6dc790dff06f8db16..4acb78a0323328ff5b6f380736d542677ac2ea44 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "i915_reg_defs.h"
 
+struct drm_device;
 struct drm_i915_private;
 struct intel_runtime_pm;
 struct intel_uncore;
@@ -220,7 +221,7 @@ void intel_uncore_prune_engine_fw_domains(struct intel_uncore *uncore,
 bool intel_uncore_unclaimed_mmio(struct intel_uncore *uncore);
 bool intel_uncore_arm_unclaimed_mmio_detection(struct intel_uncore *uncore);
 void intel_uncore_cleanup_mmio(struct intel_uncore *uncore);
-void intel_uncore_fini_mmio(struct intel_uncore *uncore);
+void intel_uncore_fini_mmio(struct drm_device *dev, void *data);
 void intel_uncore_suspend(struct intel_uncore *uncore);
 void intel_uncore_resume_early(struct intel_uncore *uncore);
 void intel_uncore_runtime_resume(struct intel_uncore *uncore);