[PATCH v3 12/20] drm: omapdrm: Prevent processing the same event multiple times
Tomi Valkeinen
tomi.valkeinen at ti.com
Tue Sep 27 12:24:47 UTC 2016
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?
Tomi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20160927/8c4ac296/attachment.sig>
More information about the dri-devel
mailing list