drm/vc4: Hook up plane prepare_fb to lookup dma-buf reservations.
Subsystems (3)
PATCH 1/4 drm/vc4: Hook up plane prepare_fb to lookup dma-buf reservations.
This way drm_atomic_helper_wait_for_fences() will actually do something. The vc4_seqno_cb has been doing the fence waits on V3D manually, so far.
--- drivers/gpu/drm/vc4/vc4_plane.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/gpu/drm/vc4/vc4_plane.c +17 -0
@@ -759,9 +759,26 @@ void vc4_plane_async_set_fb(struct drm_plane *plane, struct drm_framebuffer *fb) vc4_state->dlist[vc4_state->ptr0_offset] = addr; } +static int vc4_prepare_fb (struct drm_plane *plane, +struct drm_plane_state *state) +{ +struct vc4_bo *bo; +struct dma_fence *fence; + +if ((plane->state->fb == state->fb) || !state->fb) +return 0 ; + + bo =to_vc4_bo (&drm_fb_cma_get_gem_obj (state->fb,0 )->base); + fence =reservation_object_get_excl_rcu (bo->resv); +drm_atomic_set_fence_for_plane (state, fence); + +return 0 ; +} +static const struct drm_plane_helper_funcs vc4_plane_helper_funcs = { .atomic_check = vc4_plane_atomic_check, .atomic_update = vc4_plane_atomic_update, + .prepare_fb = vc4_prepare_fb, };static void vc4_plane_destroy (struct drm_plane *plane)
Signature · 1 line
2.11.0
PATCH 2/4 drm/vc4: Wait for fences interruptibly in blocking mode.
We should allow SIGIO and things to interrupt us before we get to the no-error stage of the commit process. This code is effectively copied from drm_atomic_helper_commit().
--- drivers/gpu/drm/vc4/vc4_kms.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/gpu/drm/vc4/vc4_kms.c +10 -0
@@ -142,6 +142,16 @@ static int vc4_atomic_commit(struct drm_device *dev,return ret; } +if (!nonblock) { + ret =drm_atomic_helper_wait_for_fences (dev, state, true); +if (ret) { +drm_atomic_helper_cleanup_planes (dev, state); +kfree (c); +up (&vc4->async_modeset); +return ret; + } + } +for_each_plane_in_state (state, plane, new_state, i) {if ((plane->state->fb != new_state->fb) && new_state->fb) { struct drm_gem_cma_object *cma_bo =
Signature · 6 lines
2.11.0 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 2/4] drm/vc4: Wait for fences interruptibly in blocking mode.
Quoted 5 lines · On Wed, 21 Jun 2017 11:50:00 -0700 Eric Anholt <[email protected]> wrote:
We should allow SIGIO and things to interrupt us before we get to the no-error stage of the commit process. This code is effectively copied from
drm_atomic_helper_commit().Signed-off-by Eric Anholt <[email protected]>
Quoted 15 lines
--- drivers/gpu/drm/vc4/vc4_kms.c | 10 ++++++++++ 1 file changed, 10 insertions(+)drivers/gpu/drm/vc4/vc4_kms.c +3
-0@@ -142,6 +142,16 @@ static int vc4_atomic_commit(struct drm_device *dev,return ret; } +if (!nonblock) { + ret =drm_atomic_helper_wait_for_fences (dev, state, true); +if (ret) {
drivers/gpu/drm/vc4/vc4_kms.c static int vc4_atomic_commit(struct drm_device *dev, · line 157
Quoted 10 lines
drivers/gpu/drm/vc4/vc4_kms.c +7
-0+drm_atomic_helper_cleanup_planes (dev, state); +kfree (c); +up (&vc4->async_modeset); +return ret; + } + } +for_each_plane_in_state (state, plane, new_state, i) {if ((plane->state->fb != new_state->fb) && new_state->fb) { struct drm_gem_cma_object *cma_bo =
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 3/4 drm/vc4: Use the atomic state's commit workqueue.
In reply to Eric AnholtNow that we're using the atomic helpers for fence waits, we can use the same codepath as drm_atomic_helper_commit() does for async, getting rid of our custom vc4_commit struct.
--- drivers/gpu/drm/vc4/vc4_kms.c | 71 ++++++++----------------------------------- 1 file changed, 13 insertions(+), 58 deletions(-)
drivers/gpu/drm/vc4/vc4_kms.c +13 -58
@@ -29,16 +29,9 @@ static void vc4_output_poll_changed(struct drm_device *dev)drm_fbdev_cma_hotplug_event (vc4->fbdev); } -struct vc4_commit { -struct drm_device *dev; -struct drm_atomic_state *state; -struct vc4_seqno_cb cb; -}; -static void -vc4_atomic_complete_commit (struct vc4_commit *c) +vc4_atomic_complete_commit (struct drm_atomic_state *state) { -struct drm_atomic_state *state = c->state;struct drm_device *dev = state->dev;struct vc4_dev *vc4 =to_vc4_dev (dev);
@@ -72,28 +65,14 @@ vc4_atomic_complete_commit(struct vc4_commit *c)drm_atomic_state_put (state);up (&vc4->async_modeset); - -kfree (c); -} - -static void -vc4_atomic_complete_commit_seqno_cb (struct vc4_seqno_cb *cb) -{ - struct vc4_commit *c = container_of(cb, struct vc4_commit, cb); - -vc4_atomic_complete_commit (c); } -static struct vc4_commit *commit_init (struct drm_atomic_state *state) +static void commit_work (struct work_struct *work) { -struct vc4_commit *c =kzalloc (sizeof (*c),GFP_KERNEL ); - -if (!c) -return NULL ; - c->dev = state->dev; - c->state = state; - -return c; +struct drm_atomic_state *state =container_of (work, + struct drm_atomic_state, + commit_work); +vc4_atomic_complete_commit (state); }/**
@@ -115,29 +94,19 @@ static int vc4_atomic_commit(struct drm_device *dev, {struct vc4_dev *vc4 =to_vc4_dev (dev);int ret; -int i; -uint64_t wait_seqno =0 ; -struct vc4_commit *c; -struct drm_plane *plane; -struct drm_plane_state *new_state; - - c =commit_init (state); -if (!c) -return -ENOMEM ; ret =drm_atomic_helper_setup_commit (state, nonblock);if (ret)return ret; +INIT_WORK (&state->commit_work, commit_work); + ret =down_interruptible (&vc4->async_modeset); -if (ret) { -kfree (c); +if (ret)return ret; - } ret =drm_atomic_helper_prepare_planes (dev, state);if (ret) { -kfree (c);up (&vc4->async_modeset);return ret; }
@@ -146,22 +115,11 @@ static int vc4_atomic_commit(struct drm_device *dev, ret =drm_atomic_helper_wait_for_fences (dev, state, true);if (ret) {drm_atomic_helper_cleanup_planes (dev, state); -kfree (c);up (&vc4->async_modeset);return ret; } } -for_each_plane_in_state (state, plane, new_state, i) { -if ((plane->state->fb != new_state->fb) && new_state->fb) { -struct drm_gem_cma_object *cma_bo = -drm_fb_cma_get_gem_obj (new_state->fb,0 ); -struct vc4_bo *bo =to_vc4_bo (&cma_bo->base); - - wait_seqno =max (bo->seqno, wait_seqno); - } - } -/* * This is the point of no return - everything below never fails except * when the hw goes bonghits. Which means we can commit the new state on
@@ -187,13 +145,10 @@ static int vc4_atomic_commit(struct drm_device *dev,*/ drm_atomic_state_get (state); -if (nonblock) { -vc4_queue_seqno_cb (dev, &c->cb, wait_seqno, - vc4_atomic_complete_commit_seqno_cb); - }else { -vc4_wait_for_seqno (dev, wait_seqno, ~0ull , false); -vc4_atomic_complete_commit (c); - } +if (nonblock) +queue_work (system_unbound_wq, &state->commit_work); +else +vc4_atomic_complete_commit (state);return 0 ; }
Signature · 6 lines
2.11.0 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/4] drm/vc4: Use the atomic state's commit workqueue.
Quoted 3 lines · Eric Anholt
Now that we're using the atomic helpers for fence waits, we can use the same codepath as
drm_atomic_helper_commit()does for async, getting rid of our customvc4_commitstruct.
\o/
On the series: Acked-by: Daniel Vetter <[email protected]>
Quoted 143 lines
Signed-off-by Eric Anholt <[email protected]>--- drivers/gpu/drm/vc4/vc4_kms.c | 71 ++++++++----------------------------------- 1 file changed, 13 insertions(+), 58 deletions(-)drivers/gpu/drm/vc4/vc4_kms.c +13
-58@@ -29,16 +29,9 @@ static void vc4_output_poll_changed(struct drm_device *dev)drm_fbdev_cma_hotplug_event (vc4->fbdev); } -struct vc4_commit { -struct drm_device *dev; -struct drm_atomic_state *state; -struct vc4_seqno_cb cb; -}; -static void -vc4_atomic_complete_commit (struct vc4_commit *c) +vc4_atomic_complete_commit (struct drm_atomic_state *state) { -struct drm_atomic_state *state = c->state;struct drm_device *dev = state->dev;struct vc4_dev *vc4 =to_vc4_dev (dev);@@ -72,28 +65,14 @@ vc4_atomic_complete_commit(struct vc4_commit *c)drm_atomic_state_put (state);up (&vc4->async_modeset); - -kfree (c); -} - -static void -vc4_atomic_complete_commit_seqno_cb (struct vc4_seqno_cb *cb) -{ - struct vc4_commit *c = container_of(cb, struct vc4_commit, cb); - -vc4_atomic_complete_commit (c); } -static struct vc4_commit *commit_init (struct drm_atomic_state *state) +static void commit_work (struct work_struct *work) { -struct vc4_commit *c =kzalloc (sizeof (*c),GFP_KERNEL ); - -if (!c) -return NULL ; - c->dev = state->dev; - c->state = state; - -return c; +struct drm_atomic_state *state =container_of (work, + struct drm_atomic_state, + commit_work); +vc4_atomic_complete_commit (state); }/** @@ -115,29 +94,19 @@ static int vc4_atomic_commit(struct drm_device *dev, {struct vc4_dev *vc4 =to_vc4_dev (dev);int ret; -int i; -uint64_t wait_seqno =0 ; -struct vc4_commit *c; -struct drm_plane *plane; -struct drm_plane_state *new_state; - - c =commit_init (state); -if (!c) -return -ENOMEM ; ret =drm_atomic_helper_setup_commit (state, nonblock);if (ret)return ret; +INIT_WORK (&state->commit_work, commit_work); + ret =down_interruptible (&vc4->async_modeset); -if (ret) { -kfree (c); +if (ret)return ret; - } ret =drm_atomic_helper_prepare_planes (dev, state);if (ret) { -kfree (c);up (&vc4->async_modeset);return ret; }@@ -146,22 +115,11 @@ static int vc4_atomic_commit(struct drm_device *dev, ret =drm_atomic_helper_wait_for_fences (dev, state, true);if (ret) {drm_atomic_helper_cleanup_planes (dev, state); -kfree (c);up (&vc4->async_modeset);return ret; } } -for_each_plane_in_state (state, plane, new_state, i) { -if ((plane->state->fb != new_state->fb) && new_state->fb) { -struct drm_gem_cma_object *cma_bo = -drm_fb_cma_get_gem_obj (new_state->fb,0 ); -struct vc4_bo *bo =to_vc4_bo (&cma_bo->base); - - wait_seqno =max (bo->seqno, wait_seqno); - } - } -/* * This is the point of no return - everything below never fails except * when the hw goes bonghits. Which means we can commit the new state on @@ -187,13 +145,10 @@ static int vc4_atomic_commit(struct drm_device *dev,*/ drm_atomic_state_get (state); -if (nonblock) { -vc4_queue_seqno_cb (dev, &c->cb, wait_seqno, - vc4_atomic_complete_commit_seqno_cb); - }else { -vc4_wait_for_seqno (dev, wait_seqno, ~0ull , false); -vc4_atomic_complete_commit (c); - } +if (nonblock) +queue_work (system_unbound_wq, &state->commit_work); +else +vc4_atomic_complete_commit (state);return 0 ; }Signature · 6 lines
2.11.0 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Signature · 7 lines
Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/4] drm/vc4: Use the atomic state's commit workqueue.
Quoted 8 lines · Daniel Vetter
Quoted 3 lines · Eric Anholt
Now that we're using the atomic helpers for fence waits, we can use the same codepath as
drm_atomic_helper_commit()does for async, getting rid of our customvc4_commitstruct.\o/
On the series: Acked-by: Daniel Vetter <[email protected]>
Applied the reviews and acks and pushed.
Next, what would it take to get rid of the async_modeset semaphore so we can use the core helpers even more?
Re: [PATCH 3/4] drm/vc4: Use the atomic state's commit workqueue.
In reply to Eric AnholtQuoted 5 lines · On Wed, 21 Jun 2017 11:50:01 -0700 Eric Anholt <[email protected]> wrote:
Now that we're using the atomic helpers for fence waits, we can use the same codepath as
drm_atomic_helper_commit()does for async, getting rid of our customvc4_commitstruct.Signed-off-by Eric Anholt <[email protected]>
And with this rework, you also fix the leak I introduced in commit 34c8ea400ff6 ("drm/vc4: Mimic drm_atomic_helper_commit() behavior").
Quoted 124 lines
--- drivers/gpu/drm/vc4/vc4_kms.c | 71 ++++++++----------------------------------- 1 file changed, 13 insertions(+), 58 deletions(-)drivers/gpu/drm/vc4/vc4_kms.c +9
-55@@ -29,16 +29,9 @@ static void vc4_output_poll_changed(struct drm_device *dev)drm_fbdev_cma_hotplug_event (vc4->fbdev); } -struct vc4_commit { -struct drm_device *dev; -struct drm_atomic_state *state; -struct vc4_seqno_cb cb; -}; -static void -vc4_atomic_complete_commit (struct vc4_commit *c) +vc4_atomic_complete_commit (struct drm_atomic_state *state) { -struct drm_atomic_state *state = c->state;struct drm_device *dev = state->dev;struct vc4_dev *vc4 =to_vc4_dev (dev);@@ -72,28 +65,14 @@ vc4_atomic_complete_commit(struct vc4_commit *c)drm_atomic_state_put (state);up (&vc4->async_modeset); - -kfree (c); -} - -static void -vc4_atomic_complete_commit_seqno_cb (struct vc4_seqno_cb *cb) -{ - struct vc4_commit *c = container_of(cb, struct vc4_commit, cb); - -vc4_atomic_complete_commit (c); } -static struct vc4_commit *commit_init (struct drm_atomic_state *state) +static void commit_work (struct work_struct *work) { -struct vc4_commit *c =kzalloc (sizeof (*c),GFP_KERNEL ); - -if (!c) -return NULL ; - c->dev = state->dev; - c->state = state; - -return c; +struct drm_atomic_state *state =container_of (work, + struct drm_atomic_state, + commit_work); +vc4_atomic_complete_commit (state); }/** @@ -115,29 +94,19 @@ static int vc4_atomic_commit(struct drm_device *dev, {struct vc4_dev *vc4 =to_vc4_dev (dev);int ret; -int i; -uint64_t wait_seqno =0 ; -struct vc4_commit *c; -struct drm_plane *plane; -struct drm_plane_state *new_state; - - c =commit_init (state); -if (!c) -return -ENOMEM ; ret =drm_atomic_helper_setup_commit (state, nonblock);if (ret)return ret; +INIT_WORK (&state->commit_work, commit_work); + ret =down_interruptible (&vc4->async_modeset); -if (ret) { -kfree (c); +if (ret)return ret; - } ret =drm_atomic_helper_prepare_planes (dev, state);if (ret) { -kfree (c);up (&vc4->async_modeset);return ret; }@@ -146,22 +115,11 @@ static int vc4_atomic_commit(struct drm_device *dev, ret =drm_atomic_helper_wait_for_fences (dev, state, true);if (ret) {drm_atomic_helper_cleanup_planes (dev, state); -kfree (c);up (&vc4->async_modeset);return ret; } } -for_each_plane_in_state (state, plane, new_state, i) { -if ((plane->state->fb != new_state->fb) && new_state->fb) { -struct drm_gem_cma_object *cma_bo = -drm_fb_cma_get_gem_obj (new_state->fb,0 ); -struct vc4_bo *bo =to_vc4_bo (&cma_bo->base); - - wait_seqno =max (bo->seqno, wait_seqno); - } - } -/* * This is the point of no return - everything below never fails except * when the hw goes bonghits. Which means we can commit the new state on @@ -187,13 +145,10 @@ static int vc4_atomic_commit(struct drm_device *dev,*/ drm_atomic_state_get (state); -if (nonblock) { -vc4_queue_seqno_cb (dev, &c->cb, wait_seqno, - vc4_atomic_complete_commit_seqno_cb); - }else {
drivers/gpu/drm/vc4/vc4_kms.c static int vc4_atomic_commit(struct drm_device *dev, · line 154
Quoted 10 lines
drivers/gpu/drm/vc4/vc4_kms.c +4
-3-vc4_wait_for_seqno (dev, wait_seqno, ~0ull , false); -vc4_atomic_complete_commit (c); - } +if (nonblock) +queue_work (system_unbound_wq, &state->commit_work); +else +vc4_atomic_complete_commit (state);return 0 ; }
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 4/4 drm/vc4: Remove dead vc4_event_pending().
In reply to Eric AnholtIt is no longer used as of commit 34c8ea400ff6 ("drm/vc4: Mimic drm_atomic_helper_commit() behavior")
--- drivers/gpu/drm/vc4/vc4_crtc.c | 8 -------- drivers/gpu/drm/vc4/vc4_drv.h | 1 - 2 files changed, 9 deletions(-)
drivers/gpu/drm/vc4/vc4_crtc.c +0 -8
@@ -674,14 +674,6 @@ static void vc4_disable_vblank(struct drm_crtc *crtc)CRTC_WRITE (PV_INTEN ,0 ); } -/* Must be called with the event lock held */ -bool vc4_event_pending (struct drm_crtc *crtc) -{ -struct vc4_crtc *vc4_crtc =to_vc4_crtc (crtc); - -return !!vc4_crtc->event; -} -static void vc4_crtc_handle_page_flip (struct vc4_crtc *vc4_crtc) {struct drm_crtc *crtc = &vc4_crtc->base;
drivers/gpu/drm/vc4/vc4_drv.h +0 -1
@@ -491,7 +491,6 @@ int vc4_bo_stats_debugfs(struct seq_file *m, void *arg);/* vc4_crtc.c */ extern struct platform_driver vc4_crtc_driver; -bool vc4_event_pending (struct drm_crtc *crtc);int vc4_crtc_debugfs_regs (struct seq_file *m,void *arg); bool vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, bool in_vblank_irq, int *vpos, int *hpos,
Signature · 6 lines
2.11.0 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 4/4] drm/vc4: Remove dead vc4_event_pending().
Quoted 4 lines · Eric Anholt
It is no longer used as of commit
34c8ea400ff6("drm/vc4: Mimicdrm_atomic_helper_commit()behavior")Signed-off-by Eric Anholt <[email protected]>
Quoted 29 lines
--- drivers/gpu/drm/vc4/vc4_crtc.c | 8 -------- drivers/gpu/drm/vc4/vc4_drv.h | 1 - 2 files changed, 9 deletions(-)drivers/gpu/drm/vc4/vc4_crtc.c +0
-8@@ -674,14 +674,6 @@ static void vc4_disable_vblank(struct drm_crtc *crtc)CRTC_WRITE (PV_INTEN ,0 ); } -/* Must be called with the event lock held */ -bool vc4_event_pending (struct drm_crtc *crtc) -{ -struct vc4_crtc *vc4_crtc =to_vc4_crtc (crtc); - -return !!vc4_crtc->event; -} -static void vc4_crtc_handle_page_flip (struct vc4_crtc *vc4_crtc) {struct drm_crtc *crtc = &vc4_crtc->base;drivers/gpu/drm/vc4/vc4_drv.h +0
-0
drivers/gpu/drm/vc4/vc4_drv.h int vc4_bo_stats_debugfs(struct seq_file *m, void *arg); · line 496
Quoted 7 lines
drivers/gpu/drm/vc4/vc4_drv.h +0
-1@@ -491,7 +491,6 @@ int vc4_bo_stats_debugfs(struct seq_file *m, void *arg);/* vc4_crtc.c */ extern struct platform_driver vc4_crtc_driver; -bool vc4_event_pending (struct drm_crtc *crtc);int vc4_crtc_debugfs_regs (struct seq_file *m,void *arg); bool vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, bool in_vblank_irq, int *vpos, int *hpos,
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 5 lines · On Wed, 21 Jun 2017 11:49:59 -0700 Eric Anholt <[email protected]> wrote:
This way
drm_atomic_helper_wait_for_fences()will actually do something. Thevc4_seqno_cbhas been doing the fence waits on V3D manually, so far.Signed-off-by Eric Anholt <[email protected]>
Quoted 25 lines
--- drivers/gpu/drm/vc4/vc4_plane.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)drivers/gpu/drm/vc4/vc4_plane.c +13
-0@@ -759,9 +759,26 @@ void vc4_plane_async_set_fb(struct drm_plane *plane, struct drm_framebuffer *fb) vc4_state->dlist[vc4_state->ptr0_offset] = addr; } +static int vc4_prepare_fb (struct drm_plane *plane, +struct drm_plane_state *state) +{ +struct vc4_bo *bo; +struct dma_fence *fence; + +if ((plane->state->fb == state->fb) || !state->fb) +return 0 ; + + bo =to_vc4_bo (&drm_fb_cma_get_gem_obj (state->fb,0 )->base); + fence =reservation_object_get_excl_rcu (bo->resv); +drm_atomic_set_fence_for_plane (state, fence); +
drivers/gpu/drm/vc4/vc4_plane.c void vc4_plane_async_set_fb(struct drm_plane *plane, struct drm_framebuffer *fb) · line 784
Quoted 10 lines
drivers/gpu/drm/vc4/vc4_plane.c +4
-0+return 0 ; +} +static const struct drm_plane_helper_funcs vc4_plane_helper_funcs = { .atomic_check = vc4_plane_atomic_check, .atomic_update = vc4_plane_atomic_update, + .prepare_fb = vc4_prepare_fb, };static void vc4_plane_destroy (struct drm_plane *plane)
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel