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

Dorota Czaplejewicz dorota.czaplejewicz at collabora.co.uk
Tue Mar 21 09:58:33 UTC 2017


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 at collabora.co.uk>

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

> From: Ville Syrjälä <ville.syrjala at 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 at 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];



More information about the Intel-gfx mailing list