[PATCH 21/22] power well fixes

José Roberto de Souza jose.souza at intel.com
Tue Jul 31 00:07:44 UTC 2018


---
 drivers/gpu/drm/i915/i915_drv.c         | 28 ++++---------------------
 drivers/gpu/drm/i915/intel_runtime_pm.c | 27 +++++++++++-------------
 2 files changed, 16 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index d159d8f4a0ed..43530ff6e79c 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1408,16 +1408,6 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
 			goto cleanup_gem;
 	}
 
-	if (INTEL_INFO(dev_priv)->num_pipes) {
-		intel_display_set_init_power(dev_priv, false);
-		/* only checking power domains when num_pipe > 0 because BIOS
-		 * could be the one holding power wells enabled causing error
-		 * messages.
-		 */
-		intel_power_domains_verify_state(dev_priv);
-	} else
-		intel_runtime_pm_put(dev_priv);
-
 	i915_driver_register(dev_priv);
 
 	intel_runtime_pm_enable(dev_priv);
@@ -1634,10 +1624,7 @@ static int i915_drm_suspend(struct drm_device *dev)
 
 	/* We do a lot of poking in a lot of registers, make sure they work
 	 * properly. */
-	if (INTEL_INFO(dev_priv)->num_pipes)
-		intel_display_set_init_power(dev_priv, true);
-	else
-		intel_runtime_pm_get(dev_priv);
+	intel_display_set_init_power(dev_priv, true);
 
 	if (INTEL_INFO(dev_priv)->num_pipes)
 		drm_kms_helper_poll_disable(dev);
@@ -1692,10 +1679,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
 
 	i915_gem_suspend_late(dev_priv);
 
-	if (INTEL_INFO(dev_priv)->num_pipes)
-		intel_display_set_init_power(dev_priv, false);
-	else
-		intel_runtime_pm_put(dev_priv);
+	intel_display_set_init_power(dev_priv, false);
 	intel_uncore_suspend(dev_priv);
 
 	/*
@@ -1926,12 +1910,8 @@ static int i915_drm_resume_early(struct drm_device *dev)
 
 	if (dev_priv->power_domains_suspended)
 		intel_power_domains_init_hw(dev_priv, true);
-	else {
-		if (INTEL_INFO(dev_priv)->num_pipes)
-			intel_display_set_init_power(dev_priv, true);
-		else
-			intel_runtime_pm_get(dev_priv);
-	}
+	else
+		intel_display_set_init_power(dev_priv, true);
 
 	intel_engines_sanitize(dev_priv);
 
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index f8e73fba647a..665d02a3b3cb 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -273,6 +273,14 @@ void intel_display_set_init_power(struct drm_i915_private *dev_priv,
 	if (dev_priv->power_domains.init_power_on == enable)
 		return;
 
+	if (!INTEL_INFO(dev_priv)->num_pipes) {
+		if (enable)
+			intel_runtime_pm_get(dev_priv);
+		else
+			intel_runtime_pm_put(dev_priv);
+		return;
+	}
+
 	if (enable)
 		intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
 	else
@@ -2929,14 +2937,10 @@ void intel_power_domains_fini(struct drm_i915_private *dev_priv)
 	 * intel_runtime_pm_enable(). We have to hand back the control of the
 	 * device to the core with this reference held.
 	 */
-	if (INTEL_INFO(dev_priv)->num_pipes)
-		intel_display_set_init_power(dev_priv, true);
-	else
-		intel_runtime_pm_get(dev_priv);
+	intel_display_set_init_power(dev_priv, true);
 
 	/* Remove the refcount we took to keep power well support disabled. */
-	// TODO understand and handle disabe_power_well
-	if (!i915_modparams.disable_power_well)
+	if (!i915_modparams.disable_power_well && INTEL_INFO(dev_priv)->num_pipes)
 		intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
 
 	/*
@@ -3604,18 +3608,11 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
 		mutex_unlock(&power_domains->lock);
 	}
 
-	if (!INTEL_INFO(dev_priv)->num_pipes) {
-		intel_runtime_pm_get(dev_priv);
-		goto end;
-	}
-
 	/* For now, we need the power well to be always enabled. */
 	intel_display_set_init_power(dev_priv, true);
 	/* Disable power support if the user asked so. */
-	if (!i915_modparams.disable_power_well)
+	if (!i915_modparams.disable_power_well && INTEL_INFO(dev_priv)->num_pipes)
 		intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
-
-end:
 	intel_power_domains_sync_hw(dev_priv);
 	power_domains->initializing = false;
 }
@@ -3633,7 +3630,7 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv)
 	 * Even if power well support was disabled we still want to disable
 	 * power wells while we are system suspended.
 	 */
-	if (!i915_modparams.disable_power_well)
+	if (!i915_modparams.disable_power_well && INTEL_INFO(dev_priv)->num_pipes)
 		intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
 
 	if (IS_ICELAKE(dev_priv))
-- 
2.18.0



More information about the Intel-gfx-trybot mailing list