[PATCH v3 12/20] drm: omapdrm: Prevent processing the same event multiple times

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Dec 12 10:29:22 UTC 2016


Hi Tomi,

On Tuesday 27 Sep 2016 15:24:47 Tomi Valkeinen wrote:
> On 19/09/16 15:27, Laurent Pinchart wrote:
> > The vblank interrupt is disabled after one occurrence, preventing the
> > atomic update event from being processed twice. However, this also
> > prevents the software frame counter from being updated correctly that
> > would require vblank interrupts to be kept enabled while the CRTC is
> > active.
> > 
> > In preparation for vblank interrupt fixes, make sure that the atomic
> > update event will be processed once only when the vblank interrupt will
> > be kept enabled.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> > 
> >  drivers/gpu/drm/omapdrm/omap_crtc.c | 22 +++++++++++++++++++---
> >  1 file changed, 19 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c
> > b/drivers/gpu/drm/omapdrm/omap_crtc.c index a0c26592fc69..8fef6558197b
> > 100644
> > --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> > +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> > @@ -43,6 +43,7 @@ struct omap_crtc {
> >  	bool enabled;
> >  	bool pending;
> >  	wait_queue_head_t pending_wait;
> > +	struct drm_pending_vblank_event *event;
> >  };
> >  
> >  /* ----------------------------------------------------------------------
> > @@ -260,11 +261,15 @@ static const struct dss_mgr_ops mgr_ops = {
> > 
> >  static void omap_crtc_complete_page_flip(struct drm_crtc *crtc)
> >  {
> > +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> >  	struct drm_pending_vblank_event *event;
> >  	struct drm_device *dev = crtc->dev;
> >  	unsigned long flags;
> > 
> > -	event = crtc->state->event;
> > +	spin_lock_irqsave(&dev->event_lock, flags);
> > +	event = omap_crtc->event;
> > +	omap_crtc->event = NULL;
> > +	spin_unlock_irqrestore(&dev->event_lock, flags);
> > 
> >  	if (!event)
> >  		return;
> > @@ -384,12 +389,23 @@ static int omap_crtc_atomic_check(struct drm_crtc
> > *crtc,
> >  }
> >  
> >  static void omap_crtc_atomic_begin(struct drm_crtc *crtc,
> > -                                  struct drm_crtc_state *old_crtc_state)
> > +				   struct drm_crtc_state *old_crtc_state)
> >  {
> > +	struct drm_pending_vblank_event *event = crtc->state->event;
> > +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> > +	unsigned long flags;
> > +
> > +	if (event) {
> > +		WARN_ON(drm_crtc_vblank_get(crtc) != 0);
> 
> Where's the matching put?

It's missing, or rather the get shouldn't be added here. The vblank get/put 
calls are added by patch 14/20 in this series. I'll remove the call from here.

-- 
Regards,

Laurent Pinchart



More information about the dri-devel mailing list