Re: [PATCH v7] drm/vc4: update cursors asynchronously through atomic

2018-04-17 Thread Eric Anholt
Eric Anholt  writes:

> [ Unknown signature status ]
> Boris Brezillon  writes:
>
>> From: Gustavo Padovan 
>>
>> Add support for async updates of cursors by using the new atomic
>> interface for that. Basically what this commit does is do what
>> vc4_update_plane() did but through atomic.
>
> My r-b still applies with your fixes here.  Go ahead and push when
> you're ready.

I've gone ahead and pushed this patch.


signature.asc
Description: PGP signature
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v7] drm/vc4: update cursors asynchronously through atomic

2018-03-30 Thread Eric Anholt
Boris Brezillon  writes:

> From: Gustavo Padovan 
>
> Add support for async updates of cursors by using the new atomic
> interface for that. Basically what this commit does is do what
> vc4_update_plane() did but through atomic.

My r-b still applies with your fixes here.  Go ahead and push when
you're ready.


signature.asc
Description: PGP signature
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v7] drm/vc4: update cursors asynchronously through atomic

2018-03-30 Thread Boris Brezillon
From: Gustavo Padovan 

Add support for async updates of cursors by using the new atomic
interface for that. Basically what this commit does is do what
vc4_update_plane() did but through atomic.

v7: Place the drm_atomic_set_fb_for_plane() call after the new
FB has been applied to the HW to avoid possible use-after-free
issues

v6: add missing drm_atomic_set_fb_for_plane() in
vc4_plane_atomic_async_update() (Boris Brezillon)

v5: add missing call to vc4_plane_atomic_check() (Eric Anholt)

v4: add drm_atomic_helper_async() commit (Eric Anholt)

v3: move size checks back to drivers (Ville Syrjälä)

v2: move fb setting to core and use new state (Eric Anholt)

Cc: Eric Anholt 
Signed-off-by: Gustavo Padovan 
Reviewed-by: Eric Anholt 
Signed-off-by: Eric Anholt 
Signed-off-by: Boris Brezillon 
---
 drivers/gpu/drm/vc4/vc4_kms.c   |  20 ++
 drivers/gpu/drm/vc4/vc4_plane.c | 131 +---
 2 files changed, 74 insertions(+), 77 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index ba60153dddb5..e791e498a3dd 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -90,6 +90,26 @@ static int vc4_atomic_commit(struct drm_device *dev,
struct vc4_dev *vc4 = to_vc4_dev(dev);
int ret;
 
+   if (state->async_update) {
+   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;
+   }
+
ret = drm_atomic_helper_setup_commit(state, nonblock);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index ce39390be389..c3a37a99e601 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -741,6 +741,57 @@ void vc4_plane_async_set_fb(struct drm_plane *plane, 
struct drm_framebuffer *fb)
vc4_state->dlist[vc4_state->ptr0_offset] = addr;
 }
 
+static void vc4_plane_atomic_async_update(struct drm_plane *plane,
+ struct drm_plane_state *state)
+{
+   struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state);
+
+   if (plane->state->fb != state->fb) {
+   vc4_plane_async_set_fb(plane, state->fb);
+   drm_atomic_set_fb_for_plane(plane->state, state->fb);
+   }
+
+   /* Set the cursor's position on the screen.  This is the
+* expected change from the drm_mode_cursor_universal()
+* helper.
+*/
+   plane->state->crtc_x = state->crtc_x;
+   plane->state->crtc_y = state->crtc_y;
+
+   /* Allow changing the start position within the cursor BO, if
+* that matters.
+*/
+   plane->state->src_x = state->src_x;
+   plane->state->src_y = state->src_y;
+
+   /* Update the display list based on the new crtc_x/y. */
+   vc4_plane_atomic_check(plane, plane->state);
+
+   /* Note that we can't just call vc4_plane_write_dlist()
+* because that would smash the context data that the HVS is
+* currently using.
+*/
+   writel(vc4_state->dlist[vc4_state->pos0_offset],
+  &vc4_state->hw_dlist[vc4_state->pos0_offset]);
+   writel(vc4_state->dlist[vc4_state->pos2_offset],
+  &vc4_state->hw_dlist[vc4_state->pos2_offset]);
+   writel(vc4_state->dlist[vc4_state->ptr0_offset],
+  &vc4_state->hw_dlist[vc4_state->ptr0_offset]);
+}
+
+static int vc4_plane_atomic_async_check(struct drm_plane *plane,
+   struct drm_plane_state *state)
+{
+   /* No configuring new scaling in the fast path. */
+   if (plane->state->crtc_w != state->crtc_w ||
+   plane->state->crtc_h != state->crtc_h ||
+   plane->state->src_w != state->src_w ||
+   plane->state->src_h != state->src_h)
+   return -EINVAL;
+
+   return 0;
+}
+
 static int vc4_prepare_fb(struct drm_plane *plane,
  struct drm_plane_state *state)
 {
@@ -780,6 +831,8 @@ static const struct drm_plane_helper_funcs 
vc4_plane_helper_funcs = {
.atomic_update = vc4_plane_atomic_update,
.prepare_fb = vc4_prepare_fb,
.cleanup_fb = vc4_cleanup_fb,
+   .atomic_async_check = vc4_plane_atomic_async_check,
+   .atomic_async_update = vc4_plane_atomic_async_update,
 };
 
 static void vc4_plane_destroy(struct drm_plane *plane)
@@ -788,82 +841,6 @@ static void vc4_plane_destroy(struct drm_plane *plane)
drm_plane_cleanup(plane);
 }
 
-/* Implements immediate (non-vblank-s