[PATCH 3/7] drm/vc4: Mimic drm_atomic_helper_commit() behavior
Eric Anholt
eric at anholt.net
Tue Jun 6 20:27:09 UTC 2017
Boris Brezillon <boris.brezillon at free-electrons.com> writes:
> The VC4 KMS driver is implementing its own ->atomic_commit() but there
> are a few generic helpers we can use instead of open-coding the logic.
>
> Signed-off-by: Boris Brezillon <boris.brezillon at free-electrons.com>
> ---
> drivers/gpu/drm/vc4/vc4_kms.c | 38 ++++++++++++--------------------------
> 1 file changed, 12 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
> index ad7925a9e0ea..f229abc0991b 100644
> --- a/drivers/gpu/drm/vc4/vc4_kms.c
> +++ b/drivers/gpu/drm/vc4/vc4_kms.c
> @@ -42,6 +42,10 @@ vc4_atomic_complete_commit(struct vc4_commit *c)
> struct drm_device *dev = state->dev;
> struct vc4_dev *vc4 = to_vc4_dev(dev);
>
> + drm_atomic_helper_wait_for_fences(dev, state, false);
> +
> + drm_atomic_helper_wait_for_dependencies(state);
With this wait_for_fences() addition and the reservation stuff that
landed, I think we can rip out the "seqno cb" in vc4, and just use
drm_atomic_helper_commit() and drm_atomic_hepler_commit_tail(). Do you
see anything missing, with that?
> +
> drm_atomic_helper_commit_modeset_disables(dev, state);
>
> drm_atomic_helper_commit_planes(dev, state, 0);
> @@ -57,10 +61,14 @@ vc4_atomic_complete_commit(struct vc4_commit *c)
> */
> state->legacy_cursor_update = false;
>
> + drm_atomic_helper_commit_hw_done(state);
> +
> drm_atomic_helper_wait_for_vblanks(dev, state);
>
> drm_atomic_helper_cleanup_planes(dev, state);
>
> + drm_atomic_helper_commit_cleanup_done(state);
> +
> drm_atomic_state_put(state);
>
> up(&vc4->async_modeset);
> @@ -117,32 +125,10 @@ static int vc4_atomic_commit(struct drm_device *dev,
> if (!c)
> return -ENOMEM;
>
> - /* Make sure that any outstanding modesets have finished. */
> - if (nonblock) {
> - struct drm_crtc *crtc;
> - struct drm_crtc_state *crtc_state;
> - unsigned long flags;
> - bool busy = false;
> -
> - /*
> - * If there's an undispatched event to send then we're
> - * obviously still busy. If there isn't, then we can
> - * unconditionally wait for the semaphore because it
> - * shouldn't be contended (for long).
> - *
> - * This is to prevent a race where queuing a new flip
> - * from userspace immediately on receipt of an event
> - * beats our clean-up and returns EBUSY.
> - */
> - spin_lock_irqsave(&dev->event_lock, flags);
> - for_each_crtc_in_state(state, crtc, crtc_state, i)
> - busy |= vc4_event_pending(crtc);
> - spin_unlock_irqrestore(&dev->event_lock, flags);
> - if (busy) {
> - kfree(c);
> - return -EBUSY;
> - }
> - }
> + ret = drm_atomic_helper_setup_commit(state, nonblock);
> + if (ret)
> + return ret;
> +
Looks like vc4_event_pending() should be garbage-collected with this
commit.
> ret = down_interruptible(&vc4->async_modeset);
> if (ret) {
> kfree(c);
> --
> 2.7.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20170606/5b4e8ce5/attachment.sig>
More information about the dri-devel
mailing list