[Intel-gfx] [PATCH 2/2] drm/i915/tv: Use the scanline counter for timestamps on i965gm TV output

Ville Syrjälä ville.syrjala at linux.intel.com
Mon Jan 28 14:01:48 UTC 2019


On Fri, Jan 25, 2019 at 10:17:04PM +0200, Imre Deak wrote:
> On Fri, Jan 25, 2019 at 08:19:31PM +0200, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > 
> > Just like the frame counter, the pixel counter also reads zero
> > all the time when the TV encoder is used. Fortunately the
> > scanline counter still works sufficiently well so let's use that
> > to correct the vblank timestamps. Otherwise the timestamps may
> > en up out of whack, and since we use them to guesstimate the
> > vblank counter value that may end up incorrect as well.
> > 
> > Cc: Imre Deak <imre.deak at intel.com>
> > Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Reviewed-by: Imre Deak <imre.deak at intel.com>

Thanks. Series pushed to dinq.

> 
> > ---
> >  drivers/gpu/drm/i915/i915_irq.c  |  7 +++++--
> >  drivers/gpu/drm/i915/intel_drv.h |  4 +++-
> >  drivers/gpu/drm/i915/intel_tv.c  | 10 ++++++++++
> >  3 files changed, 18 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> > index fe097725c27a..caade521c174 100644
> > --- a/drivers/gpu/drm/i915/i915_irq.c
> > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > @@ -1014,6 +1014,9 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
> >  	int position;
> >  	int vbl_start, vbl_end, hsync_start, htotal, vtotal;
> >  	unsigned long irqflags;
> > +	bool use_scanline_counter = INTEL_GEN(dev_priv) >= 5 ||
> > +		IS_G4X(dev_priv) || IS_GEN(dev_priv, 2) ||
> > +		mode->private_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER;
> >  
> >  	if (WARN_ON(!mode->crtc_clock)) {
> >  		DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled "
> > @@ -1046,7 +1049,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
> >  	if (stime)
> >  		*stime = ktime_get();
> >  
> > -	if (IS_GEN(dev_priv, 2) || IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) {
> > +	if (use_scanline_counter) {
> >  		/* No obvious pixelcount register. Only query vertical
> >  		 * scanout position from Display scan line register.
> >  		 */
> > @@ -1106,7 +1109,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
> >  	else
> >  		position += vtotal - vbl_end;
> >  
> > -	if (IS_GEN(dev_priv, 2) || IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) {
> > +	if (use_scanline_counter) {
> >  		*vpos = position;
> >  		*hpos = 0;
> >  	} else {
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > index 85b913ea6e80..90ba5436370e 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -630,9 +630,11 @@ struct intel_crtc_scaler_state {
> >  };
> >  
> >  /* drm_mode->private_flags */
> > -#define I915_MODE_FLAG_INHERITED 1
> > +#define I915_MODE_FLAG_INHERITED (1<<0)
> >  /* Flag to get scanline using frame time stamps */
> >  #define I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP (1<<1)
> > +/* Flag to use the scanline counter instead of the pixel counter */
> > +#define I915_MODE_FLAG_USE_SCANLINE_COUNTER (1<<2)
> >  
> >  struct intel_pipe_wm {
> >  	struct intel_wm_level wm[5];
> > diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
> > index 78be08e2971b..751b88dde18e 100644
> > --- a/drivers/gpu/drm/i915/intel_tv.c
> > +++ b/drivers/gpu/drm/i915/intel_tv.c
> > @@ -1150,6 +1150,11 @@ intel_tv_get_config(struct intel_encoder *encoder,
> >  				 ypos, mode.vdisplay - ysize - ypos);
> >  
> >  	adjusted_mode->crtc_clock = mode.clock;
> > +
> > +	/* pixel counter doesn't work on i965gm TV output */
> > +	if (IS_I965GM(dev_priv))
> > +		adjusted_mode->private_flags |=
> > +			I915_MODE_FLAG_USE_SCANLINE_COUNTER;
> >  }
> >  
> >  static int
> > @@ -1295,6 +1300,11 @@ intel_tv_compute_config(struct intel_encoder *encoder,
> >  	drm_mode_set_crtcinfo(adjusted_mode, 0);
> >  	adjusted_mode->name[0] = '\0';
> >  
> > +	/* pixel counter doesn't work on i965gm TV output */
> > +	if (IS_I965GM(dev_priv))
> > +		adjusted_mode->private_flags |=
> > +			I915_MODE_FLAG_USE_SCANLINE_COUNTER;
> > +
> >  	return 0;
> >  }
> >  
> > -- 
> > 2.19.2
> > 

-- 
Ville Syrjälä
Intel


More information about the Intel-gfx mailing list