[PATCH] drm/i915: suspend gem at the last part of suspend

Nirmoy Das nirmoy.das at intel.com
Thu Feb 9 11:47:27 UTC 2023


TODO

Signed-off-by: Nirmoy Das <nirmoy.das at intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_pm.c     | 23 +++++++++++++++++++++-
 drivers/gpu/drm/i915/gem/i915_gem_pm.h     |  1 +
 drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c |  8 +++++---
 drivers/gpu/drm/i915/i915_driver.c         | 14 +++----------
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pm.c b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
index 0d812f4d787d..2bddf4815229 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
@@ -87,17 +87,33 @@ static void lmem_recover(struct drm_i915_private *i915)
 			i915_ttm_recover_region(mr);
 }
 
+int i915_gem_backup_suspend_prepare(struct drm_i915_private *i915)
+{
+	int ret;
+	printk("Started i915_gem_backup_suspend_prepare\n");
+	/* Opportunistically try to evict unpinned objects */
+	ret = lmem_suspend(i915, I915_TTM_BACKUP_ALLOW_GPU|I915_TTM_BACKUP_PINNED);
+	if (ret)
+		lmem_recover(i915);
+
+	printk("Finished i915_gem_backup_suspend_prepare %d\n", ret);
+	return ret;
+}
+
 int i915_gem_backup_suspend(struct drm_i915_private *i915)
 {
 	int ret;
 
+	printk("Started i915_gem_backup_suspend\n");
 	/* Opportunistically try to evict unpinned objects */
 	ret = lmem_suspend(i915, I915_TTM_BACKUP_ALLOW_GPU);
 	if (ret)
 		goto out_recover;
 
+	printk("i915_gem_backup_suspend done 1st lmem_suspend()\n");
 	i915_gem_suspend(i915);
-
+	printk("i915_gem_backup_suspend done i915_gem_suspend)\n");
+ 
 	/*
 	 * More objects may have become unpinned as requests were
 	 * retired. Now try to evict again. The gt may be wedged here
@@ -108,6 +124,7 @@ int i915_gem_backup_suspend(struct drm_i915_private *i915)
 	 */
 	ret = lmem_suspend(i915, I915_TTM_BACKUP_ALLOW_GPU |
 			   I915_TTM_BACKUP_PINNED);
+	printk("i915_gem_backup_suspend done 2nd lmem_suspend()\n");
 	if (ret)
 		goto out_recover;
 
@@ -116,14 +133,17 @@ int i915_gem_backup_suspend(struct drm_i915_private *i915)
 	 * using the migrate context.
 	 */
 	ret = lmem_suspend(i915, I915_TTM_BACKUP_PINNED);
+	printk("i915_gem_backup_suspend done 3rd lmem_suspend()\n");
 	if (ret)
 		goto out_recover;
 
+	printk("Finished i915_gem_backup_suspend\n");
 	return 0;
 
 out_recover:
 	lmem_recover(i915);
 
+	printk("Finished i915_gem_backup_suspend with error\n");
 	return ret;
 }
 
@@ -140,6 +160,7 @@ void i915_gem_suspend_late(struct drm_i915_private *i915)
 	unsigned int i;
 	bool flush = false;
 
+	i915_gem_backup_suspend(i915);
 	/*
 	 * Neither the BIOS, ourselves or any other kernel
 	 * expects the system to be in execlists mode on startup,
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pm.h b/drivers/gpu/drm/i915/gem/i915_gem_pm.h
index bedf1e95941a..65896246ff7b 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pm.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.h
@@ -19,6 +19,7 @@ void i915_gem_idle_work_handler(struct work_struct *work);
 void i915_gem_suspend(struct drm_i915_private *i915);
 void i915_gem_suspend_late(struct drm_i915_private *i915);
 int i915_gem_backup_suspend(struct drm_i915_private *i915);
+int i915_gem_backup_suspend_prepare(struct drm_i915_private *i915);
 
 int i915_gem_freeze(struct drm_i915_private *i915);
 int i915_gem_freeze_late(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c
index dfe39c8e74d8..977b6766130d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c
@@ -52,7 +52,7 @@ static int i915_ttm_backup(struct i915_gem_apply_to_region *apply,
 	struct ttm_operation_ctx ctx = {};
 	unsigned int flags;
 	int err = 0;
-
+	
 	if (!i915_ttm_cpu_maps_iomem(bo->resource) || obj->ttm.backup)
 		return 0;
 
@@ -60,11 +60,13 @@ static int i915_ttm_backup(struct i915_gem_apply_to_region *apply,
 		return ttm_bo_validate(bo, i915_ttm_sys_placement(), &ctx);
 
 	if (!pm_apply->backup_pinned ||
-	    (pm_apply->allow_gpu && (obj->flags & I915_BO_ALLOC_PM_EARLY)))
+	    (pm_apply->allow_gpu && (obj->flags & I915_BO_ALLOC_PM_EARLY))) {
 		return 0;
+	}
 
-	if (obj->flags & I915_BO_ALLOC_PM_VOLATILE)
+	if (obj->flags & I915_BO_ALLOC_PM_VOLATILE) {
 		return 0;
+	}
 
 	/*
 	 * It seems that we might have some framebuffers still pinned at this
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 57305bb00dbc..a0a5fd4af8d3 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1041,19 +1041,11 @@ static void i915_drm_complete(struct drm_device *dev)
 	intel_pxp_resume_complete(i915->pxp);
 }
 
-static int i915_drm_prepare(struct drm_device *dev)
+static  int i915_drm_prepare(struct drm_device *dev)
 {
-	struct drm_i915_private *i915 = to_i915(dev);
-
-	intel_pxp_suspend_prepare(i915->pxp);
+	intel_pxp_suspend_prepare(to_i915(dev)->pxp);
 
-	/*
-	 * NB intel_display_suspend() may issue new requests after we've
-	 * ostensibly marked the GPU as ready-to-sleep here. We need to
-	 * split out that work and pull it forward so that after point,
-	 * the GPU is not woken again.
-	 */
-	return i915_gem_backup_suspend(i915);
+	return i915_gem_backup_suspend_prepare(to_i915(dev));
 }
 
 static int i915_drm_suspend(struct drm_device *dev)
-- 
2.39.0



More information about the Intel-gfx-trybot mailing list