diff mbox series

drm/i915: Take a runtime pm wakeref for atomic commits

Message ID 20190528075354.22341-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series drm/i915: Take a runtime pm wakeref for atomic commits | expand

Commit Message

Chris Wilson May 28, 2019, 7:53 a.m. UTC
Before we start prepping the system for an atomic modeset, wake the
device up. We then keep track of this wakeref until we complete the
atomic commit, so we hold keep the device awake for all potential HW
access, and do not allow the device to sleep with a pending modeset.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110771
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 5 +++++
 drivers/gpu/drm/i915/intel_drv.h     | 2 ++
 2 files changed, 7 insertions(+)

Comments

Ville Syrjälä May 28, 2019, 2:17 p.m. UTC | #1
On Tue, May 28, 2019 at 08:53:54AM +0100, Chris Wilson wrote:
> Before we start prepping the system for an atomic modeset, wake the
> device up. We then keep track of this wakeref until we complete the
> atomic commit, so we hold keep the device awake for all potential HW
> access, and do not allow the device to sleep with a pending modeset.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110771
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>

lgtm
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> ---
>  drivers/gpu/drm/i915/intel_display.c | 5 +++++
>  drivers/gpu/drm/i915/intel_drv.h     | 2 ++
>  2 files changed, 7 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 909171d3ec25..afe7618567c7 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -13811,6 +13811,7 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
>  		intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
>  		intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET, wakeref);
>  	}
> +	intel_runtime_pm_put(dev_priv, intel_state->wakeref);
>  
>  	/*
>  	 * Defer the cleanup of the old state to a separate worker to not
> @@ -13889,6 +13890,8 @@ static int intel_atomic_commit(struct drm_device *dev,
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	int ret = 0;
>  
> +	intel_state->wakeref = intel_runtime_pm_get(dev_priv);
> +
>  	drm_atomic_state_get(state);
>  	i915_sw_fence_init(&intel_state->commit_ready,
>  			   intel_atomic_commit_ready);
> @@ -13925,6 +13928,7 @@ static int intel_atomic_commit(struct drm_device *dev,
>  	if (ret) {
>  		DRM_DEBUG_ATOMIC("Preparing state failed with %i\n", ret);
>  		i915_sw_fence_commit(&intel_state->commit_ready);
> +		intel_runtime_pm_put(dev_priv, intel_state->wakeref);
>  		return ret;
>  	}
>  
> @@ -13936,6 +13940,7 @@ static int intel_atomic_commit(struct drm_device *dev,
>  		i915_sw_fence_commit(&intel_state->commit_ready);
>  
>  		drm_atomic_helper_cleanup_planes(dev, state);
> +		intel_runtime_pm_put(dev_priv, intel_state->wakeref);
>  		return ret;
>  	}
>  	dev_priv->wm.distrust_bios_wm = false;
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index f341042b6c79..70aff1d6f597 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -420,6 +420,8 @@ struct dpll {
>  struct intel_atomic_state {
>  	struct drm_atomic_state base;
>  
> +	intel_wakeref_t wakeref;
> +
>  	struct {
>  		/*
>  		 * Logical state of cdclk (used for all scaling, watermark,
> -- 
> 2.20.1
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 909171d3ec25..afe7618567c7 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -13811,6 +13811,7 @@  static void intel_atomic_commit_tail(struct drm_atomic_state *state)
 		intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
 		intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET, wakeref);
 	}
+	intel_runtime_pm_put(dev_priv, intel_state->wakeref);
 
 	/*
 	 * Defer the cleanup of the old state to a separate worker to not
@@ -13889,6 +13890,8 @@  static int intel_atomic_commit(struct drm_device *dev,
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	int ret = 0;
 
+	intel_state->wakeref = intel_runtime_pm_get(dev_priv);
+
 	drm_atomic_state_get(state);
 	i915_sw_fence_init(&intel_state->commit_ready,
 			   intel_atomic_commit_ready);
@@ -13925,6 +13928,7 @@  static int intel_atomic_commit(struct drm_device *dev,
 	if (ret) {
 		DRM_DEBUG_ATOMIC("Preparing state failed with %i\n", ret);
 		i915_sw_fence_commit(&intel_state->commit_ready);
+		intel_runtime_pm_put(dev_priv, intel_state->wakeref);
 		return ret;
 	}
 
@@ -13936,6 +13940,7 @@  static int intel_atomic_commit(struct drm_device *dev,
 		i915_sw_fence_commit(&intel_state->commit_ready);
 
 		drm_atomic_helper_cleanup_planes(dev, state);
+		intel_runtime_pm_put(dev_priv, intel_state->wakeref);
 		return ret;
 	}
 	dev_priv->wm.distrust_bios_wm = false;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index f341042b6c79..70aff1d6f597 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -420,6 +420,8 @@  struct dpll {
 struct intel_atomic_state {
 	struct drm_atomic_state base;
 
+	intel_wakeref_t wakeref;
+
 	struct {
 		/*
 		 * Logical state of cdclk (used for all scaling, watermark,