[Intel-gfx] [PATCH] drm/i915: Fix cursor updates on some platforms

Daniel Vetter daniel at ffwll.ch
Tue Jul 18 10:08:06 UTC 2017


On Mon, Jul 17, 2017 at 12:42:18PM +0200, Paul Menzel wrote:
> Dear Ville,
> 
> 
> On 07/14/17 17:52, ville.syrjala at linux.intel.com wrote:
> > From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > 
> > Turns out that just writing CURPOS isn't sufficient to move the cursor
> > on some platforms. My 830 works just fine, but eg. 945 and PNV don't.
> > On those platforms we need to arm even the CURPOS update with a
> > CURBASE write.
> > 
> > Even worse, a write to any of the cursor register apart from CURBASE
> > will cancel an already pending cursor update. So if we have armed a
> > CURCNTR/CURBASE update, a subsequent CURPOS write prior to vblank
> > would cancel that armed update. Thus we're left with a cursor that
> > doesn't appear to move, or even change shape.
> > 
> > Fix the problem by always performing the CURBASE write after a
> > CURPOS write. Bspec is somewhat unclear which platforms actually
> > require this CURBASE write and which don't. So to keep it simple
> > and to make sure we really fix the problem across all supported
> > devices, let's just perform the CURBASE write unconditionally.
> > 
> > Cc: Paul Menzel <pmenzel at molgen.mpg.de>
> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101790
> > Fixes: 75343a44c901 ("drm/i915: Drop useless posting reads from cursor commit")
> > Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > ---
> >   drivers/gpu/drm/i915/intel_display.c | 12 +++++++++++-
> >   1 file changed, 11 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index 2144adc5b1d5..460bd942fcb7 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -9555,7 +9555,16 @@ static void i9xx_update_cursor(struct intel_plane *plane,
> >   	 * On some platforms writing CURCNTR first will also
> >   	 * cause CURPOS to be armed by the CURBASE write.
> >   	 * Without the CURCNTR write the CURPOS write would
> > -	 * arm itself.
> > +	 * arm itself. Thus we always start the full update
> > +	 * with a CURCNTR write.
> > +	 *
> > +	 * On other platforms CURPOS always requires the
> > +	 * CURBASE write to arm the update. Additonally
> > +	 * a write to any of the cursor register will cancel
> > +	 * an already armed cursor update. Thus leaving out
> > +	 * the CURBASE write after CURPOS could lead to a
> > +	 * cursor that doesn't appear to move, or even change
> > +	 * shape. Thus we always write CURBASE.
> >   	 *
> >   	 * CURCNTR and CUR_FBC_CTL are always
> >   	 * armed by the CURBASE write only.
> > @@ -9574,6 +9583,7 @@ static void i9xx_update_cursor(struct intel_plane *plane,
> >   		plane->cursor.cntl = cntl;
> >   	} else {
> >   		I915_WRITE_FW(CURPOS(pipe), pos);
> > +		I915_WRITE_FW(CURBASE(pipe), base);
> >   	}
> >   	POSTING_READ_FW(CURBASE(pipe));
> 
> Tested-by: Paul Menzel <paulepanter at users.sourceforge.net>

Since Ville is on vacation I applied this.
-Daniel

> 
> I created two more bugs for an issue with pasting text with the middle mouse
> button [1], and failing *kms_cursor_crc* tests [2].
> 
> 
> Kind regards,
> 
> Paul Menzel
> 
> 
> [1] https://bugs.freedesktop.org/show_bug.cgi?id=101819
> [2] https://bugs.freedesktop.org/show_bug.cgi?id=101817
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the Intel-gfx mailing list