All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH] drm/i915/mtl: Extend Wa_14017073508 in suspend/resume flow
@ 2023-03-04 16:17 Badal Nilawar
  2023-03-04 16:30 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for " Patchwork
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Badal Nilawar @ 2023-03-04 16:17 UTC (permalink / raw)
  To: intel-gfx; +Cc: rodrigo.vivi

During suspend resume flow it was seen that lots forcewakes
are taken and released for media. So to avoid HANG due to MC6
entry/exit while accessing media applied Wa_14017073508 in
suspend/resume flow.

Signed-off-by: Badal Nilawar <badal.nilawar@intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_pm.c   |  6 ++++-
 drivers/gpu/drm/i915/gt/intel_gt_pm.c    | 32 ++++++++++++++++--------
 drivers/gpu/drm/i915/gt/intel_gt_pm.h    |  3 +++
 drivers/gpu/drm/i915/gt/intel_gt_types.h |  1 +
 drivers/gpu/drm/i915/i915_driver.c       | 32 ++++++++++++++++++++++++
 5 files changed, 62 insertions(+), 12 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..60deac41104d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pm.c
@@ -160,8 +160,12 @@ void i915_gem_suspend_late(struct drm_i915_private *i915)
 	 * machine in an unusable condition.
 	 */
 
-	for_each_gt(gt, i915, i)
+	for_each_gt(gt, i915, i) {
+		/* Wa_14017073508: mtl */
+		mtl_media_busy(gt);
 		intel_gt_suspend_late(gt);
+		mtl_media_idle(gt);
+	}
 
 	spin_lock_irqsave(&i915->mm.obj_lock, flags);
 	for (phase = phases; *phase; phase++) {
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.c b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
index cef3d6f5c34e..1f3bf1cf0421 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_pm.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.c
@@ -26,24 +26,34 @@
 
 #define I915_GT_SUSPEND_IDLE_TIMEOUT (HZ / 2)
 
-static void mtl_media_busy(struct intel_gt *gt)
+void mtl_media_busy(struct intel_gt *gt)
 {
 	/* Wa_14017073508: mtl */
-	if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
+	if (gt && IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
 	    gt->type == GT_MEDIA)
-		snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
-				  PCODE_MBOX_GT_STATE_MEDIA_BUSY,
-				  PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
+		if (!atomic_inc_not_zero(&gt->media_wakeref)) {
+			drm_err(&gt->i915->drm, "Media busy\n");
+			snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
+					  PCODE_MBOX_GT_STATE_MEDIA_BUSY,
+					  PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
+			atomic_inc(&gt->media_wakeref);
+		}
 }
 
-static void mtl_media_idle(struct intel_gt *gt)
+void mtl_media_idle(struct intel_gt *gt)
 {
 	/* Wa_14017073508: mtl */
-	if (IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
-	    gt->type == GT_MEDIA)
-		snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
-				  PCODE_MBOX_GT_STATE_MEDIA_NOT_BUSY,
-				  PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
+	if (gt && IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
+	    gt->type == GT_MEDIA) {
+		WARN_ON(atomic_read(&gt->media_wakeref) <= 0);
+		if (!atomic_add_unless(&gt->media_wakeref, -1, 1)) {
+			drm_err(&gt->i915->drm, "Media idle\n");
+			snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
+					  PCODE_MBOX_GT_STATE_MEDIA_NOT_BUSY,
+					  PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
+			atomic_dec(&gt->media_wakeref);
+		}
+	}
 }
 
 static void user_forcewake(struct intel_gt *gt, bool suspend)
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.h b/drivers/gpu/drm/i915/gt/intel_gt_pm.h
index 6c9a46452364..43ffabf9babe 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_pm.h
+++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.h
@@ -89,4 +89,7 @@ static inline bool is_mock_gt(const struct intel_gt *gt)
 	return I915_SELFTEST_ONLY(gt->awake == -ENODEV);
 }
 
+void mtl_media_busy(struct intel_gt *gt);
+void mtl_media_idle(struct intel_gt *gt);
+
 #endif /* INTEL_GT_PM_H */
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_types.h b/drivers/gpu/drm/i915/gt/intel_gt_types.h
index f08c2556aa25..321ccfef4028 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_gt_types.h
@@ -145,6 +145,7 @@ struct intel_gt {
 
 	struct intel_wakeref wakeref;
 	atomic_t user_wakeref;
+	atomic_t media_wakeref;
 
 	struct list_head closed_vma;
 	spinlock_t closed_lock; /* guards the list of closed_vma */
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 8bc76dede332..c7625ea28022 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -327,6 +327,8 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
 	intel_gmch_bar_setup(dev_priv);
 	intel_device_info_runtime_init(dev_priv);
 
+	/* Wa_14017073508: mtl */
+	mtl_media_busy(dev_priv->media_gt);
 	for_each_gt(gt, dev_priv, i) {
 		ret = intel_gt_init_mmio(gt);
 		if (ret)
@@ -335,10 +337,14 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
 
 	/* As early as possible, scrub existing GPU state before clobbering */
 	sanitize_gpu(dev_priv);
+	/* Wa_14017073508: mtl */
+	mtl_media_idle(dev_priv->media_gt);
 
 	return 0;
 
 err_uncore:
+	/* Wa_14017073508: mtl */
+	mtl_media_idle(dev_priv->media_gt);
 	intel_gmch_bar_teardown(dev_priv);
 
 	return ret;
@@ -781,6 +787,12 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret < 0)
 		goto out_tiles_cleanup;
 
+	/* Wa_14017073508: mtl */
+	if (i915->media_gt) {
+		atomic_set(&i915->media_gt->media_wakeref, 0);
+		mtl_media_busy(i915->media_gt);
+	}
+
 	ret = i915_driver_hw_probe(i915);
 	if (ret < 0)
 		goto out_cleanup_mmio;
@@ -838,6 +850,8 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	i915_gem_drain_freed_objects(i915);
 	i915_ggtt_driver_late_release(i915);
 out_cleanup_mmio:
+	/* Wa_14017073508: mtl */
+	mtl_media_idle(i915->media_gt);
 	i915_driver_mmio_release(i915);
 out_tiles_cleanup:
 	intel_gt_release_all(i915);
@@ -1063,6 +1077,9 @@ static int i915_drm_suspend(struct drm_device *dev)
 
 	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
+	/* Wa_14017073508: mtl */
+	mtl_media_busy(dev_priv->media_gt);
+
 	/* We do a lot of poking in a lot of registers, make sure they work
 	 * properly. */
 	intel_power_domains_disable(dev_priv);
@@ -1097,6 +1114,9 @@ static int i915_drm_suspend(struct drm_device *dev)
 
 	intel_dmc_suspend(dev_priv);
 
+	/* Wa_14017073508: mtl */
+	mtl_media_busy(dev_priv->media_gt);
+
 	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
 	i915_gem_drain_freed_objects(dev_priv);
@@ -1197,6 +1217,9 @@ static int i915_drm_resume(struct drm_device *dev)
 
 	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
+	/* Wa_14017073508: mtl */
+	mtl_media_busy(dev_priv->media_gt);
+
 	ret = i915_pcode_init(dev_priv);
 	if (ret)
 		return ret;
@@ -1260,6 +1283,9 @@ static int i915_drm_resume(struct drm_device *dev)
 
 	intel_gvt_resume(dev_priv);
 
+	/* Wa_14017073508: mtl */
+	mtl_media_idle(dev_priv->media_gt);
+
 	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
 	return 0;
@@ -1319,6 +1345,9 @@ static int i915_drm_resume_early(struct drm_device *dev)
 
 	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
+	/* Wa_14017073508: mtl */
+	mtl_media_busy(dev_priv->media_gt);
+
 	ret = vlv_resume_prepare(dev_priv, false);
 	if (ret)
 		drm_err(&dev_priv->drm,
@@ -1333,6 +1362,9 @@ static int i915_drm_resume_early(struct drm_device *dev)
 
 	intel_power_domains_resume(dev_priv);
 
+	/* Wa_14017073508: mtl */
+	mtl_media_idle(dev_priv->media_gt);
+
 	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
 	return ret;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread
* Re: [Intel-gfx] [PATCH] drm/i915/mtl: Extend Wa_14017073508 in suspend/resume flow
@ 2023-03-05 22:37 kernel test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2023-03-05 22:37 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Julia Lawall, Elena Reshetova

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20230304161749.1420224-1-badal.nilawar@intel.com>
References: <20230304161749.1420224-1-badal.nilawar@intel.com>
TO: Badal Nilawar <badal.nilawar@intel.com>
TO: intel-gfx@lists.freedesktop.org
CC: rodrigo.vivi@intel.com

Hi Badal,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-tip/drm-tip]

url:    https://github.com/intel-lab-lkp/linux/commits/Badal-Nilawar/drm-i915-mtl-Extend-Wa_14017073508-in-suspend-resume-flow/20230305-001604
base:   git://anongit.freedesktop.org/drm/drm-tip drm-tip
patch link:    https://lore.kernel.org/r/20230304161749.1420224-1-badal.nilawar%40intel.com
patch subject: [Intel-gfx] [PATCH] drm/i915/mtl: Extend Wa_14017073508 in suspend/resume flow
:::::: branch date: 30 hours ago
:::::: commit date: 30 hours ago
config: x86_64-randconfig-c002 (https://download.01.org/0day-ci/archive/20230306/202303060604.JmbyHTX7-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-8) 11.3.0

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Julia Lawall <julia.lawall@inria.fr>
| Link: https://lore.kernel.org/r/202303060604.JmbyHTX7-lkp@intel.com/

cocci warnings: (new ones prefixed by >>)
>> drivers/gpu/drm/i915/gt/intel_gt_pm.c:49:50-51: atomic_add_unless

vim +49 drivers/gpu/drm/i915/gt/intel_gt_pm.c

8f70f1ec587da0 Badal Nilawar 2022-11-04  42  
e49da7f17006c4 Badal Nilawar 2023-03-04  43  void mtl_media_idle(struct intel_gt *gt)
8f70f1ec587da0 Badal Nilawar 2022-11-04  44  {
8f70f1ec587da0 Badal Nilawar 2022-11-04  45  	/* Wa_14017073508: mtl */
e49da7f17006c4 Badal Nilawar 2023-03-04  46  	if (gt && IS_MTL_GRAPHICS_STEP(gt->i915, P, STEP_A0, STEP_B0) &&
e49da7f17006c4 Badal Nilawar 2023-03-04  47  	    gt->type == GT_MEDIA) {
e49da7f17006c4 Badal Nilawar 2023-03-04  48  		WARN_ON(atomic_read(&gt->media_wakeref) <= 0);
e49da7f17006c4 Badal Nilawar 2023-03-04 @49  		if (!atomic_add_unless(&gt->media_wakeref, -1, 1)) {
e49da7f17006c4 Badal Nilawar 2023-03-04  50  			drm_err(&gt->i915->drm, "Media idle\n");
8f70f1ec587da0 Badal Nilawar 2022-11-04  51  			snb_pcode_write_p(gt->uncore, PCODE_MBOX_GT_STATE,
8f70f1ec587da0 Badal Nilawar 2022-11-04  52  					  PCODE_MBOX_GT_STATE_MEDIA_NOT_BUSY,
8f70f1ec587da0 Badal Nilawar 2022-11-04  53  					  PCODE_MBOX_GT_STATE_DOMAIN_MEDIA, 0);
e49da7f17006c4 Badal Nilawar 2023-03-04  54  			atomic_dec(&gt->media_wakeref);
e49da7f17006c4 Badal Nilawar 2023-03-04  55  		}
e49da7f17006c4 Badal Nilawar 2023-03-04  56  	}
8f70f1ec587da0 Badal Nilawar 2022-11-04  57  }
8f70f1ec587da0 Badal Nilawar 2022-11-04  58  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-03-07 13:44 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-04 16:17 [Intel-gfx] [PATCH] drm/i915/mtl: Extend Wa_14017073508 in suspend/resume flow Badal Nilawar
2023-03-04 16:30 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for " Patchwork
2023-03-04 16:43 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2023-03-06  8:33 ` [Intel-gfx] [PATCH] " Gupta, Anshuman
2023-03-06 20:20   ` Rodrigo Vivi
2023-03-07 13:44     ` Nilawar, Badal
2023-03-06 13:34 ` Jani Nikula
2023-03-06 22:58 ` [Intel-gfx] ✓ Fi.CI.IGT: success for " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2023-03-05 22:37 [Intel-gfx] [PATCH] " kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.