[Intel-gfx] [PATCH] drm/i915/fbc: Don't nuke manually around flips
Souza, Jose
jose.souza at intel.com
Wed May 19 23:34:02 UTC 2021
On Thu, 2021-05-06 at 00:01 +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Apparently we have discovered another way to hit the dreaded
> top of screen FBC corruption on GLK. Previously we thought it
> was limited to some combination of FBC nuke+disable+plane update
> during the same frame, for which we have the extra vblank wait
> as a workaround. But looks like it can somehow be hit even
> without the FBC disable.
>
> Skipping the extra manual nuke immediately after page flips seems
> to cure this. The manual nuke shouldn't be needed anyway since the
> flip itself will already cause a nuke. I suppose this means it might
> still be possible to hit this if you mix page flips and frontbuffer
> rendering in clever ways, but at least it's a bit less likely now.
makes sense, Reviewed-by: José Roberto de Souza <jose.souza at intel.com>
You missed your Signed-off-by here.
> ---
> drivers/gpu/drm/i915/display/intel_fbc.c | 18 +++++++++++-------
> 1 file changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c
> index b2f3ac846f5b..3251403b521f 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbc.c
> +++ b/drivers/gpu/drm/i915/display/intel_fbc.c
> @@ -233,7 +233,8 @@ static void intel_fbc_recompress(struct drm_i915_private *dev_priv)
>
> static void ilk_fbc_activate(struct drm_i915_private *dev_priv)
> {
> - struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
> + struct intel_fbc *fbc = &dev_priv->fbc;
> + struct intel_fbc_reg_params *params = &fbc->params;
> u32 dpfc_ctl;
> int threshold = dev_priv->fbc.threshold;
>
> @@ -276,7 +277,8 @@ static void ilk_fbc_activate(struct drm_i915_private *dev_priv)
> /* enable it... */
> intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
>
> - intel_fbc_recompress(dev_priv);
> + if (!fbc->active)
> + intel_fbc_recompress(dev_priv);
> }
>
> static void ilk_fbc_deactivate(struct drm_i915_private *dev_priv)
> @@ -298,7 +300,8 @@ static bool ilk_fbc_is_active(struct drm_i915_private *dev_priv)
>
> static void gen7_fbc_activate(struct drm_i915_private *dev_priv)
> {
> - struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
> + struct intel_fbc *fbc = &dev_priv->fbc;
> + struct intel_fbc_reg_params *params = &fbc->params;
> u32 dpfc_ctl;
> int threshold = dev_priv->fbc.threshold;
>
> @@ -350,7 +353,8 @@ static void gen7_fbc_activate(struct drm_i915_private *dev_priv)
>
> intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
>
> - intel_fbc_recompress(dev_priv);
> + if (!fbc->active)
> + intel_fbc_recompress(dev_priv);
> }
>
> static bool intel_fbc_hw_is_active(struct drm_i915_private *dev_priv)
> @@ -369,9 +373,6 @@ static void intel_fbc_hw_activate(struct drm_i915_private *dev_priv)
>
> trace_intel_fbc_activate(fbc->crtc);
>
> - fbc->active = true;
> - fbc->activated = true;
> -
> if (DISPLAY_VER(dev_priv) >= 7)
> gen7_fbc_activate(dev_priv);
> else if (DISPLAY_VER(dev_priv) >= 5)
> @@ -380,6 +381,9 @@ static void intel_fbc_hw_activate(struct drm_i915_private *dev_priv)
> g4x_fbc_activate(dev_priv);
> else
> i8xx_fbc_activate(dev_priv);
> +
> + fbc->active = true;
> + fbc->activated = true;
> }
>
> static void intel_fbc_hw_deactivate(struct drm_i915_private *dev_priv)
More information about the Intel-gfx
mailing list