Commit cfb0fa42 authored by Matt Roper's avatar Matt Roper Committed by Joonas Lahtinen

drm/i915: Initialize MMIO access for each GT

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: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220906234934.3655440-9-matthew.d.roper@intel.comSigned-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent 6438452d
...@@ -431,7 +431,8 @@ static void i915_driver_late_release(struct drm_i915_private *dev_priv) ...@@ -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) 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)) if (i915_inject_probe_failure(dev_priv))
return -ENODEV; return -ENODEV;
...@@ -440,17 +441,27 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv) ...@@ -440,17 +441,27 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = intel_uncore_init_mmio(&dev_priv->uncore); for_each_gt(gt, dev_priv, i) {
if (ret) ret = intel_uncore_init_mmio(gt->uncore);
return ret; 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 */ /* Try to make sure MCHBAR is enabled before poking at it */
intel_setup_mchbar(dev_priv); intel_setup_mchbar(dev_priv);
intel_device_info_runtime_init(dev_priv); intel_device_info_runtime_init(dev_priv);
ret = intel_gt_init_mmio(to_gt(dev_priv)); for_each_gt(gt, dev_priv, i) {
if (ret) ret = intel_gt_init_mmio(gt);
goto err_uncore; if (ret)
goto err_uncore;
}
/* As early as possible, scrub existing GPU state before clobbering */ /* As early as possible, scrub existing GPU state before clobbering */
sanitize_gpu(dev_priv); sanitize_gpu(dev_priv);
...@@ -459,7 +470,6 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv) ...@@ -459,7 +470,6 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
err_uncore: err_uncore:
intel_teardown_mchbar(dev_priv); intel_teardown_mchbar(dev_priv);
intel_uncore_fini_mmio(&dev_priv->uncore);
return ret; return ret;
} }
...@@ -471,7 +481,6 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv) ...@@ -471,7 +481,6 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
static void i915_driver_mmio_release(struct drm_i915_private *dev_priv) static void i915_driver_mmio_release(struct drm_i915_private *dev_priv)
{ {
intel_teardown_mchbar(dev_priv); intel_teardown_mchbar(dev_priv);
intel_uncore_fini_mmio(&dev_priv->uncore);
} }
/** /**
......
...@@ -2455,8 +2455,11 @@ void intel_uncore_prune_engine_fw_domains(struct intel_uncore *uncore, ...@@ -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)) { if (intel_uncore_has_forcewake(uncore)) {
iosf_mbi_punit_acquire(); iosf_mbi_punit_acquire();
iosf_mbi_unregister_pmic_bus_access_notifier_unlocked( iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "i915_reg_defs.h" #include "i915_reg_defs.h"
struct drm_device;
struct drm_i915_private; struct drm_i915_private;
struct intel_runtime_pm; struct intel_runtime_pm;
struct intel_uncore; struct intel_uncore;
...@@ -220,7 +221,7 @@ void intel_uncore_prune_engine_fw_domains(struct intel_uncore *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_unclaimed_mmio(struct intel_uncore *uncore);
bool intel_uncore_arm_unclaimed_mmio_detection(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_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_suspend(struct intel_uncore *uncore);
void intel_uncore_resume_early(struct intel_uncore *uncore); void intel_uncore_resume_early(struct intel_uncore *uncore);
void intel_uncore_runtime_resume(struct intel_uncore *uncore); void intel_uncore_runtime_resume(struct intel_uncore *uncore);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment