From 222416869a08ca4284f87823a938284ecfc7b297 Mon Sep 17 00:00:00 2001 From: Dom Cobley Date: Mon, 26 Jul 2021 18:02:11 +0100 Subject: [PATCH] Revert "drm/vc4: kms: Remove async modeset semaphore" This reverts commit a28f2f0df6da70dec509b965635f0d5f71f9a9f7. --- drivers/gpu/drm/vc4/vc4_crtc.c | 13 +++++++++++++ drivers/gpu/drm/vc4/vc4_drv.h | 2 ++ drivers/gpu/drm/vc4/vc4_kms.c | 24 ++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c index 0771fd9..008d264 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c @@ -766,6 +766,7 @@ vc4_async_page_flip_complete(struct vc4_seqno_cb *cb) container_of(cb, struct vc4_async_flip_state, cb); struct drm_crtc *crtc = flip_state->crtc; struct drm_device *dev = crtc->dev; + struct vc4_dev *vc4 = to_vc4_dev(dev); struct drm_plane *plane = crtc->primary; vc4_plane_async_set_fb(plane, flip_state->fb); @@ -797,6 +798,8 @@ vc4_async_page_flip_complete(struct vc4_seqno_cb *cb) } kfree(flip_state); + + up(&vc4->async_modeset); } /* Implements async (non-vblank-synced) page flips. @@ -811,6 +814,7 @@ static int vc4_async_page_flip(struct drm_crtc *crtc, uint32_t flags) { struct drm_device *dev = crtc->dev; + struct vc4_dev *vc4 = to_vc4_dev(dev); struct drm_plane *plane = crtc->primary; int ret = 0; struct vc4_async_flip_state *flip_state; @@ -839,6 +843,15 @@ static int vc4_async_page_flip(struct drm_crtc *crtc, flip_state->crtc = crtc; flip_state->event = event; + /* Make sure all other async modesetes have landed. */ + ret = down_interruptible(&vc4->async_modeset); + if (ret) { + drm_framebuffer_put(fb); + vc4_bo_dec_usecnt(bo); + kfree(flip_state); + return ret; + } + /* Save the current FB before it's replaced by the new one in * drm_atomic_set_fb_for_plane(). We'll need the old FB in * vc4_async_page_flip_complete() to decrement the BO usecnt and keep diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index 9d7e0ee..f73f0a6 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -216,6 +216,8 @@ struct vc4_dev { struct work_struct reset_work; } hangcheck; + struct semaphore async_modeset; + struct drm_modeset_lock ctm_state_lock; struct drm_private_obj ctm_manager; struct drm_private_obj hvs_channels; diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c index 24dea3a..7b02bff 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c @@ -424,6 +424,8 @@ vc4_atomic_complete_commit(struct drm_atomic_state *state) clk_request_done(core_req); drm_atomic_state_put(state); + + up(&vc4->async_modeset); } static void commit_work(struct work_struct *work) @@ -481,17 +483,26 @@ static int vc4_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state, bool nonblock) { + struct vc4_dev *vc4 = to_vc4_dev(dev); int ret; if (state->async_update) { - ret = drm_atomic_helper_prepare_planes(dev, state); + ret = down_interruptible(&vc4->async_modeset); if (ret) return ret; + ret = drm_atomic_helper_prepare_planes(dev, state); + if (ret) { + up(&vc4->async_modeset); + return ret; + } + drm_atomic_helper_async_commit(dev, state); drm_atomic_helper_cleanup_planes(dev, state); + up(&vc4->async_modeset); + return 0; } @@ -508,14 +519,21 @@ static int vc4_atomic_commit(struct drm_device *dev, INIT_WORK(&state->commit_work, commit_work); - ret = drm_atomic_helper_prepare_planes(dev, state); + ret = down_interruptible(&vc4->async_modeset); if (ret) return ret; + ret = drm_atomic_helper_prepare_planes(dev, state); + if (ret) { + up(&vc4->async_modeset); + return ret; + } + if (!nonblock) { ret = drm_atomic_helper_wait_for_fences(dev, state, true); if (ret) { drm_atomic_helper_cleanup_planes(dev, state); + up(&vc4->async_modeset); return ret; } } @@ -995,6 +1013,8 @@ int vc4_kms_load(struct drm_device *dev) vc4->load_tracker_enabled = true; } + sema_init(&vc4->async_modeset, 1); + /* Set support for vblank irq fast disable, before drm_vblank_init() */ dev->vblank_disable_immediate = true; -- 2.7.4