On Fri, Mar 17, 2017 at 11:49:32AM +0200, Ville Syrjälä wrote:
> On Thu, Mar 16, 2017 at 11:47:49PM +0000, Chris Wilson wrote:
> > Bypass all the spinlocks and return the last timestamp and counter from
> > the last vblank if the driver delcares that it is accurate (and stable
> > across on/off), and the vblank is currently enabled.
> > 
> > This is dependent upon the both the hardware and driver to provide the
> > proper barriers to facilitate reading our bookkeeping outside of the
> > vblank interrupt and outside of the explicit vblank locks.
> > 
> > Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> > Cc: Ville Syrjälä <ville.syrj...@linux.intel.com>
> > Cc: Daniel Vetter <dan...@ffwll.ch>
> > Cc: Michel Dänzer <mic...@daenzer.net>
> > Cc: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> > Cc: Dave Airlie <airl...@redhat.com>,
> > Cc: Mario Kleiner <mario.kleiner...@gmail.com>
> > ---
> >  drivers/gpu/drm/drm_irq.c | 26 ++++++++++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> > index 4cc9352ab6a8..b4bd361a2bcc 100644
> > --- a/drivers/gpu/drm/drm_irq.c
> > +++ b/drivers/gpu/drm/drm_irq.c
> > @@ -1562,6 +1562,17 @@ static int drm_queue_vblank_event(struct drm_device 
> > *dev, unsigned int pipe,
> >     return ret;
> >  }
> >  
> > +static bool drm_wait_vblank_is_query(union drm_wait_vblank *vblwait)
> > +{
> > +   if (vblwait->request.sequence)
> > +           return false;
> > +
> > +   return _DRM_VBLANK_RELATIVE ==
> > +           (vblwait->request.type & (_DRM_VBLANK_TYPES_MASK |
> > +                                     _DRM_VBLANK_EVENT |
> > +                                     _DRM_VBLANK_NEXTONMISS));
> > +}
> > +
> >  /*
> >   * Wait for VBLANK.
> >   *
> > @@ -1611,6 +1622,21 @@ int drm_wait_vblank(struct drm_device *dev, void 
> > *data,
> >  
> >     vblank = &dev->vblank[pipe];
> >  
> > +   /* If the counter is currently enabled and accurate, short-circuit 
> > queries
> > +    * to return the cached timestamp of the last vblank.
> > +    */
> > +   if (dev->vblank_disable_immediate &&
> > +       drm_wait_vblank_is_query(vblwait) &&
> > +       vblank->enabled) {
> > +           struct timeval now;
> > +
> 
> Do we want a comment here as well stating that the seqlock
> already has the rmb?

I didn't find it enlightening. Added READ_ONCE(vblank->enabled).
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to