[PATCH 03/11] drm/i915: Enable wakeref tracking for ref held for disabling runtime PM

Imre Deak imre.deak at intel.com
Wed May 1 08:12:27 UTC 2019


After the previous patch, to disable runtime PM we can take a permanent
RPM ref that keeps the device-powered wakeref checks still enabled but
also has wakeref owner tracking for this reference enabled.

While at it fix a comment in intel_runtime_pm_enable().

Signed-off-by: Imre Deak <imre.deak at intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 18 ++++++++----------
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index cd420791b1aa..cf581beb1e89 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1178,6 +1178,7 @@ struct skl_wm_params {
 struct i915_runtime_pm {
 	atomic_t wakeref_count;
 	atomic_t wakeref_track_count;
+	intel_wakeref_t rpm_disable_wakeref;
 	bool suspended;
 	bool irqs_enabled;
 
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 1f4f9e69fa1d..583873701172 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -4380,7 +4380,6 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915)
 	return track_intel_runtime_pm_wakeref(i915);
 }
 
-__attribute__((__used__))
 static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915)
 {
 	__intel_runtime_pm_get(i915);
@@ -4487,7 +4486,6 @@ void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref)
 	intel_runtime_pm_put_unchecked(i915);
 }
 
-__attribute__((__used__))
 static void intel_runtime_pm_put_raw(struct drm_i915_private *i915,
 				     intel_wakeref_t wref)
 {
@@ -4495,7 +4493,6 @@ static void intel_runtime_pm_put_raw(struct drm_i915_private *i915,
 	intel_runtime_pm_put_unchecked_raw(i915);
 }
 #else
-__attribute__((__used__))
 static void intel_runtime_pm_put_raw(struct drm_i915_private *i915,
 				     intel_wakeref_t wref)
 {
@@ -4538,11 +4535,9 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915)
 	 * platforms without RPM support.
 	 */
 	if (!HAS_RUNTIME_PM(i915)) {
-		int ret;
-
 		pm_runtime_dont_use_autosuspend(kdev);
-		ret = pm_runtime_get_sync(kdev);
-		WARN(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret);
+		i915->runtime_pm.rpm_disable_wakeref =
+			intel_runtime_pm_get_raw(i915);
 	} else {
 		pm_runtime_use_autosuspend(kdev);
 	}
@@ -4550,7 +4545,7 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915)
 	/*
 	 * The core calls the driver load handler with an RPM reference held.
 	 * We drop that here and will reacquire it during unloading in
-	 * intel_power_domains_fini().
+	 * intel_runtime_pm_disable().
 	 */
 	pm_runtime_put_autosuspend(kdev);
 }
@@ -4559,6 +4554,8 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915)
 {
 	struct pci_dev *pdev = i915->drm.pdev;
 	struct device *kdev = &pdev->dev;
+	intel_wakeref_t rpm_disable_wakeref =
+		fetch_and_zero(&i915->runtime_pm.rpm_disable_wakeref);
 
 	/* Transfer rpm ownership back to core */
 	WARN(pm_runtime_get_sync(kdev) < 0,
@@ -4566,8 +4563,9 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915)
 
 	pm_runtime_dont_use_autosuspend(kdev);
 
-	if (!HAS_RUNTIME_PM(i915))
-		pm_runtime_put(kdev);
+	WARN_ON(HAS_RUNTIME_PM(i915) == rpm_disable_wakeref);
+	if (rpm_disable_wakeref)
+		intel_runtime_pm_put_raw(i915, rpm_disable_wakeref);
 }
 
 void intel_runtime_pm_cleanup(struct drm_i915_private *i915)
-- 
2.17.1



More information about the Intel-gfx-trybot mailing list