From: robert.foss@collabora.com
To: daniel.vetter@ffwll.ch, airlied@linux.ie,
eric@anholt.netaniel.vetter@ffwll.ch, fengguang.wu@intel.com,
maarten.lankhorst@linux.intel.com, julia.lawall@lip6.fr,
alexander.deucher@amd.com, daniels@collabora.com,
derekf@osg.samsung.com, varadgautam@gmail.com
Cc: Robert Foss <robert.foss@collabora.com>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org
Subject: [PATCH] drm/vc4: Return -EBUSY if there's already a pending flip event.
Date: Mon, 2 May 2016 15:25:22 -0400 [thread overview]
Message-ID: <1462217122-13071-2-git-send-email-robert.foss@collabora.com> (raw)
In-Reply-To: <1462217122-13071-1-git-send-email-robert.foss@collabora.com>
From: Robert Foss <robert.foss@collabora.com>
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 <robert.foss@collabora.com>
---
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 ||
+ vc4_crtc_has_pending_event(crtc)) {
+ spin_unlock_irqrestore(&dev->event_lock, flags);
+ return -EBUSY;
+ }
+ spin_unlock_irqrestore(&dev->event_lock, flags);
+ }
+ }
c = commit_init(state);
if (!c)
--
2.5.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
WARNING: multiple messages have this Message-ID (diff)
From: robert.foss@collabora.com
To: daniel.vetter@ffwll.ch, airlied@linux.ie, eric@anholt.net,
aniel.vetter@ffwll.ch, fengguang.wu@intel.com,
maarten.lankhorst@linux.intel.com, julia.lawall@lip6.fr,
alexander.deucher@amd.com, daniels@collabora.com,
derekf@osg.samsung.com, varadgautam@gmail.com
Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Robert Foss <robert.foss@collabora.com>
Subject: [PATCH] drm/vc4: Return -EBUSY if there's already a pending flip event.
Date: Mon, 2 May 2016 15:25:22 -0400 [thread overview]
Message-ID: <1462217122-13071-2-git-send-email-robert.foss@collabora.com> (raw)
In-Reply-To: <1462217122-13071-1-git-send-email-robert.foss@collabora.com>
From: Robert Foss <robert.foss@collabora.com>
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 <robert.foss@collabora.com>
---
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 ||
+ vc4_crtc_has_pending_event(crtc)) {
+ spin_unlock_irqrestore(&dev->event_lock, flags);
+ return -EBUSY;
+ }
+ spin_unlock_irqrestore(&dev->event_lock, flags);
+ }
+ }
c = commit_init(state);
if (!c)
--
2.5.0
next prev parent reply other threads:[~2016-05-02 19:25 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-02 19:25 [PATCH] drm/vc4: Return -EBUSY if there's already a pending flip event robert.foss
2016-05-02 19:25 ` robert.foss
2016-05-02 19:25 ` robert.foss [this message]
2016-05-02 19:25 ` robert.foss
2016-05-03 0:57 ` Eric Anholt
2016-05-03 0:57 ` Eric Anholt
2016-05-03 14:20 ` Robert Foss
2016-05-03 14:20 ` Robert Foss
2016-05-03 17:11 ` Eric Anholt
2016-05-03 17:11 ` Eric Anholt
2016-05-03 7:11 ` Maarten Lankhorst
2016-05-03 7:11 ` Maarten Lankhorst
-- strict thread matches above, loose matches on Subject: below --
2016-04-26 17:47 robert.foss
2016-04-26 17:43 robert.foss
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1462217122-13071-2-git-send-email-robert.foss@collabora.com \
--to=robert.foss@collabora.com \
--cc=airlied@linux.ie \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=eric@anholt.netaniel.vetter \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.