[Intel-gfx] [PATCH] drm/i915: Fix ILK-IVB sprite enable delays
Juha-Pekka Heikkilä
juhapekka.heikkila at gmail.com
Sat Sep 29 20:26:47 UTC 2018
Look ok to me. I will try this on my HSW box to see will this affect
those issues which look really similar as seen on IVB/SNB
Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
Ville Syrjala kirjoitti 28.9.2018 klo 16.24:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Sprite enable on ILK-IVB may take two frames to complete
> when the hardware is in big FIFO mode (LP1+). That is
> not entirely great as it means the sprite enable may
> actually happen one frame after we've already signalled
> flip completion. At the very least crc checks may fail
> due to the sprite not yet being visible when we expect it.
>
> We already have code to deal with big FIFO mode when it
> comes to the sprite scaling on IVB
> (WaCxSRDisabledForSpriteScaling:ivb). Let's extend that
> workaround to kick in whenever the sprite is in the process
> of being enabled. Also ILK/SNB bspec has some notes to
> indicate that we should most likely also do the sprite
> scaling w/a on all three platforms, so let's do that as well.
>
> Pretty easy to reproduce on SNB/IVB. ILK has proved more
> elusive, but let's trust the spec and include it as well.
>
> Cc: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
> Testcase: igt/kms_plane/pixel-format-pipe-*-planes
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107749
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/intel_display.c | 36 +++++++++++++++++++++++++++++++-----
> 1 file changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 4c5c2b39e65c..4710f3aab552 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10696,14 +10696,40 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
> pipe_config->fb_bits |= plane->frontbuffer_bit;
>
> /*
> + * ILK/SNB DVSACNTR/Sprite Enable
> + * IVB SPR_CTL/Sprite Enable
> + * "When in Self Refresh Big FIFO mode, a write to enable the
> + * plane will be internally buffered and delayed while Big FIFO
> + * mode is exiting."
> + *
> + * Which means that enabling the sprite can take an extra frame
> + * when we start in big FIFO mode (LP1+). Thus we need to drop
> + * down to LP0 and wait for vblank in order to make sure the
> + * sprite gets enabled on the next vblank after the register write.
> + * Doing otherwise would risk enabling the sprite one frame after
> + * we've already signalled flip completion. We can resume LP1+
> + * once the sprite has been enabled.
> + *
> + *
> * WaCxSRDisabledForSpriteScaling:ivb
> + * IVB SPR_SCALE/Scaling Enable
> + * "Low Power watermarks must be disabled for at least one
> + * frame before enabling sprite scaling, and kept disabled
> + * until sprite scaling is disabled."
> + *
> + * ILK/SNB DVSASCALE/Scaling Enable
> + * "When in Self Refresh Big FIFO mode, scaling enable will be
> + * masked off while Big FIFO mode is exiting."
> *
> - * cstate->update_wm was already set above, so this flag will
> - * take effect when we commit and program watermarks.
> + * Despite the w/a only being listed for IVB we assume that
> + * the ILK/SNB note has similar ramifications, hence we apply
> + * the w/a on all three platforms.
> */
> - if (plane->id == PLANE_SPRITE0 && IS_IVYBRIDGE(dev_priv) &&
> - needs_scaling(to_intel_plane_state(plane_state)) &&
> - !needs_scaling(old_plane_state))
> + if (plane->id == PLANE_SPRITE0 &&
> + (IS_GEN5(dev_priv) || IS_GEN6(dev_priv) ||
> + IS_IVYBRIDGE(dev_priv)) &&
> + (turn_on || (!needs_scaling(old_plane_state) &&
> + needs_scaling(to_intel_plane_state(plane_state)))))
> pipe_config->disable_lp_wm = true;
>
> return 0;
>
More information about the Intel-gfx
mailing list