From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755247AbcECHLk (ORCPT ); Tue, 3 May 2016 03:11:40 -0400 Received: from mga03.intel.com ([134.134.136.65]:16006 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751033AbcECHLj (ORCPT ); Tue, 3 May 2016 03:11:39 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,571,1455004800"; d="scan'208";a="96115889" Subject: Re: [PATCH] drm/vc4: Return -EBUSY if there's already a pending flip event. To: robert.foss@collabora.com, daniel.vetter@ffwll.ch, airlied@linux.ie, eric@anholt.net, aniel.vetter@ffwll.ch, fengguang.wu@intel.com, julia.lawall@lip6.fr, alexander.deucher@amd.com, daniels@collabora.com, derekf@osg.samsung.com, varadgautam@gmail.com References: <1462217122-13071-1-git-send-email-robert.foss@collabora.com> <1462217122-13071-2-git-send-email-robert.foss@collabora.com> Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org From: Maarten Lankhorst Message-ID: <927f08b1-e644-86d8-1743-dd2e615c9a2a@linux.intel.com> Date: Tue, 3 May 2016 09:11:34 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <1462217122-13071-2-git-send-email-robert.foss@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Op 02-05-16 om 21:25 schreef robert.foss@collabora.com: > From: Robert Foss > > As per the docs, atomic_commit should return -EBUSY "if an asycnhronous > update is requested and there is an earlier update pending". > > Signed-off-by: Robert Foss > --- > drivers/gpu/drm/vc4/vc4_crtc.c | 6 ++++++ > drivers/gpu/drm/vc4/vc4_drv.h | 1 + > drivers/gpu/drm/vc4/vc4_kms.c | 20 ++++++++++++++++++-- > 3 files changed, 25 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c > index 355ee4b..43193a3 100644 > --- a/drivers/gpu/drm/vc4/vc4_crtc.c > +++ b/drivers/gpu/drm/vc4/vc4_crtc.c > @@ -802,3 +802,9 @@ struct platform_driver vc4_crtc_driver = { > .of_match_table = vc4_crtc_dt_match, > }, > }; > + > +bool vc4_crtc_has_pending_event(struct drm_crtc *crtc) > +{ > + assert_spin_locked(&crtc->dev->event_lock); > + return to_vc4_crtc(crtc)->event; > +} > diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h > index fa2ad15..54c1fb5 100644 > --- a/drivers/gpu/drm/vc4/vc4_drv.h > +++ b/drivers/gpu/drm/vc4/vc4_drv.h > @@ -414,6 +414,7 @@ extern struct platform_driver vc4_crtc_driver; > int vc4_enable_vblank(struct drm_device *dev, unsigned int crtc_id); > void vc4_disable_vblank(struct drm_device *dev, unsigned int crtc_id); > int vc4_crtc_debugfs_regs(struct seq_file *m, void *arg); > +bool vc4_crtc_has_pending_event(struct drm_crtc *crtc); > > /* vc4_debugfs.c */ > int vc4_debugfs_init(struct drm_minor *minor); > diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c > index 4718ae5..dc157a1e 100644 > --- a/drivers/gpu/drm/vc4/vc4_kms.c > +++ b/drivers/gpu/drm/vc4/vc4_kms.c > @@ -107,10 +107,26 @@ static int vc4_atomic_commit(struct drm_device *dev, > bool async) > { > struct vc4_dev *vc4 = to_vc4_dev(dev); > - int ret; > - int i; > uint64_t wait_seqno = 0; > struct vc4_commit *c; > + struct drm_crtc_state *crtc_state; > + struct drm_crtc *crtc; > + unsigned long flags; > + int i, ret; > + > + if (async) { > + for_each_crtc_in_state(state, crtc, crtc_state, i) { > + > + spin_lock_irqsave(&dev->event_lock, flags); > + > + if (crtc->state->event || ^What's this check for? How can this even happen if you remove the event from the crtc state in atomic_flush? ~Maarten