diff mbox

[1/2] drm/i915: Extract intel_wm_plane_visible()

Message ID 20170314151050.12194-1-ville.syrjala@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ville Syrjälä March 14, 2017, 3:10 p.m. UTC
From: Ville Syrjälä <ville.syrjala@linux.intel.com>

All platforms that lack double buffered watermarks will need to
handle the legacy cursor updates in the same way. So let's extract the
logic to determine the plane visibility into a small helper. For
simplicity we'll make the function DTRT for any plane, but only apply
the special sauce for cursor planes.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_pm.c | 39 +++++++++++++++++++++++++++------------
 1 file changed, 27 insertions(+), 12 deletions(-)

Comments

Dorota Czaplejewicz March 21, 2017, 9:58 a.m. UTC | #1
I have tested this patch series (with [2/2] drm/i915: Fix SKL cursor watermarks, X-Patchwork-Id: 143965, 143966) and I can confirm it fixes https://bugs.freedesktop.org/show_bug.cgi?id=100195

Tested-by: Dorota Czaplejewicz <dorota.czaplejewicz@collabora.co.uk>

On Tue, 14 Mar 2017 17:10:49 +0200
ville.syrjala@linux.intel.com wrote:

> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> All platforms that lack double buffered watermarks will need to
> handle the legacy cursor updates in the same way. So let's extract the
> logic to determine the plane visibility into a small helper. For
> simplicity we'll make the function DTRT for any plane, but only apply
> the special sauce for cursor planes.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/intel_pm.c | 39 +++++++++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 2ca38ae4421e..3b0d379b6f38 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -655,6 +655,29 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
>  	return wm_size;
>  }
>  
> +static bool intel_wm_plane_visible(const struct intel_crtc_state *crtc_state,
> +				   const struct intel_plane_state *plane_state)
> +{
> +	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
> +
> +	/* FIXME check the 'enable' instead */
> +	if (!crtc_state->base.active)
> +		return false;
> +
> +	/*
> +	 * Treat cursor with fb as always visible since cursor updates
> +	 * can happen faster than the vrefresh rate, and the current
> +	 * watermark code doesn't handle that correctly. Cursor updates
> +	 * which set/clear the fb or change the cursor size are going
> +	 * to get throttled by intel_legacy_cursor_update() to work
> +	 * around this problem with the watermark code.
> +	 */
> +	if (plane->id == PLANE_CURSOR)
> +		return plane_state->base.fb != NULL;
> +	else
> +		return plane_state->base.visible;
> +}
> +
>  static struct intel_crtc *single_enabled_crtc(struct drm_i915_private *dev_priv)
>  {
>  	struct intel_crtc *crtc, *enabled = NULL;
> @@ -1961,7 +1984,7 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
>  	uint32_t method1, method2;
>  	int cpp;
>  
> -	if (!cstate->base.active || !pstate->base.visible)
> +	if (!intel_wm_plane_visible(cstate, pstate))
>  		return 0;
>  
>  	cpp = pstate->base.fb->format->cpp[0];
> @@ -1990,7 +2013,7 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
>  	uint32_t method1, method2;
>  	int cpp;
>  
> -	if (!cstate->base.active || !pstate->base.visible)
> +	if (!intel_wm_plane_visible(cstate, pstate))
>  		return 0;
>  
>  	cpp = pstate->base.fb->format->cpp[0];
> @@ -2013,15 +2036,7 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
>  {
>  	int cpp;
>  
> -	/*
> -	 * Treat cursor with fb as always visible since cursor updates
> -	 * can happen faster than the vrefresh rate, and the current
> -	 * watermark code doesn't handle that correctly. Cursor updates
> -	 * which set/clear the fb or change the cursor size are going
> -	 * to get throttled by intel_legacy_cursor_update() to work
> -	 * around this problem with the watermark code.
> -	 */
> -	if (!cstate->base.active || !pstate->base.fb)
> +	if (!intel_wm_plane_visible(cstate, pstate))
>  		return 0;
>  
>  	cpp = pstate->base.fb->format->cpp[0];
> @@ -2038,7 +2053,7 @@ static uint32_t ilk_compute_fbc_wm(const struct intel_crtc_state *cstate,
>  {
>  	int cpp;
>  
> -	if (!cstate->base.active || !pstate->base.visible)
> +	if (!intel_wm_plane_visible(cstate, pstate))
>  		return 0;
>  
>  	cpp = pstate->base.fb->format->cpp[0];
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2ca38ae4421e..3b0d379b6f38 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -655,6 +655,29 @@  static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
 	return wm_size;
 }
 
+static bool intel_wm_plane_visible(const struct intel_crtc_state *crtc_state,
+				   const struct intel_plane_state *plane_state)
+{
+	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
+
+	/* FIXME check the 'enable' instead */
+	if (!crtc_state->base.active)
+		return false;
+
+	/*
+	 * Treat cursor with fb as always visible since cursor updates
+	 * can happen faster than the vrefresh rate, and the current
+	 * watermark code doesn't handle that correctly. Cursor updates
+	 * which set/clear the fb or change the cursor size are going
+	 * to get throttled by intel_legacy_cursor_update() to work
+	 * around this problem with the watermark code.
+	 */
+	if (plane->id == PLANE_CURSOR)
+		return plane_state->base.fb != NULL;
+	else
+		return plane_state->base.visible;
+}
+
 static struct intel_crtc *single_enabled_crtc(struct drm_i915_private *dev_priv)
 {
 	struct intel_crtc *crtc, *enabled = NULL;
@@ -1961,7 +1984,7 @@  static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
 	uint32_t method1, method2;
 	int cpp;
 
-	if (!cstate->base.active || !pstate->base.visible)
+	if (!intel_wm_plane_visible(cstate, pstate))
 		return 0;
 
 	cpp = pstate->base.fb->format->cpp[0];
@@ -1990,7 +2013,7 @@  static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
 	uint32_t method1, method2;
 	int cpp;
 
-	if (!cstate->base.active || !pstate->base.visible)
+	if (!intel_wm_plane_visible(cstate, pstate))
 		return 0;
 
 	cpp = pstate->base.fb->format->cpp[0];
@@ -2013,15 +2036,7 @@  static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
 {
 	int cpp;
 
-	/*
-	 * Treat cursor with fb as always visible since cursor updates
-	 * can happen faster than the vrefresh rate, and the current
-	 * watermark code doesn't handle that correctly. Cursor updates
-	 * which set/clear the fb or change the cursor size are going
-	 * to get throttled by intel_legacy_cursor_update() to work
-	 * around this problem with the watermark code.
-	 */
-	if (!cstate->base.active || !pstate->base.fb)
+	if (!intel_wm_plane_visible(cstate, pstate))
 		return 0;
 
 	cpp = pstate->base.fb->format->cpp[0];
@@ -2038,7 +2053,7 @@  static uint32_t ilk_compute_fbc_wm(const struct intel_crtc_state *cstate,
 {
 	int cpp;
 
-	if (!cstate->base.active || !pstate->base.visible)
+	if (!intel_wm_plane_visible(cstate, pstate))
 		return 0;
 
 	cpp = pstate->base.fb->format->cpp[0];