Skip to content

Commit

Permalink
drm/i915: Handle all GTs on driver (un)load paths
Browse files Browse the repository at this point in the history
[ Upstream commit f569ae7 ]

This, along with the changes already landed in commit 1c66a12
("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
Stable-dep-of: 1cacd68 ("drm/i915/dgfx: Grab wakeref at i915_ttm_unmap_virtual")
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
tursulin authored and gregkh committed Dec 31, 2022
1 parent 12a9b4c commit ed52edf
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 13 deletions.
3 changes: 2 additions & 1 deletion drivers/gpu/drm/i915/i915_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -1662,7 +1662,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);

Expand Down
43 changes: 31 additions & 12 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1128,6 +1128,8 @@ void i915_gem_drain_workqueue(struct drm_i915_private *i915)

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. */
Expand Down Expand Up @@ -1158,9 +1160,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;

Expand All @@ -1173,19 +1177,26 @@ 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) {
/*
* Allow engines or uC initialisation to fail by marking the GPU
* 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 */
Expand Down Expand Up @@ -1213,10 +1224,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. */
Expand All @@ -1227,9 +1242,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);
}

/* Flush any outstanding work, including i915_gem_context.release_work. */
i915_gem_drain_workqueue(dev_priv);
Expand Down

0 comments on commit ed52edf

Please sign in to comment.