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

Nirmoy Das nirmoy.das at intel.com
Wed Feb 8 10:48:07 UTC 2023


TODO

Signed-off-by: Nirmoy Das <nirmoy.das at intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_pm.c     | 17 +++++++++++++++++
 drivers/gpu/drm/i915/gem/i915_gem_pm.h     |  1 +
 drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c | 11 ++++++++---
 drivers/gpu/drm/i915/i915_driver.c         | 14 +++-----------
 4 files changed, 29 insertions(+), 14 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..8b9117a44d1f 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
@@ -87,10 +87,24 @@ 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)
@@ -119,11 +133,13 @@ int i915_gem_backup_suspend(struct drm_i915_private *i915)
 	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 +156,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..ab98ebc6f76d 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,8 @@ static int i915_ttm_backup(struct i915_gem_apply_to_region *apply,
 	struct ttm_operation_ctx ctx = {};
 	unsigned int flags;
 	int err = 0;
-
+	
+	printk("i915_ttm_backup trying to backup %p\n", obj);
 	if (!i915_ttm_cpu_maps_iomem(bo->resource) || obj->ttm.backup)
 		return 0;
 
@@ -60,11 +61,15 @@ 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))) {
+		printk("i915_ttm_backup skipping  %p reason 1\n", obj);
 		return 0;
+	}
 
-	if (obj->flags & I915_BO_ALLOC_PM_VOLATILE)
+	if (obj->flags & I915_BO_ALLOC_PM_VOLATILE) {
+		printk("i915_ttm_backup skipping  %p reason 2\n", obj);
 		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 13bf4fe52f9f..0a74124ace62 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