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@xxxxxxxxxxxxxxx> On Tue, 14 Mar 2017 17:10:49 +0200 ville.syrjala@xxxxxxxxxxxxxxx wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxxxx> > --- > 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]; _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx