Re: [PATCH 12/21] drm: mxsfb: Move vblank event arm to CRTC .atomic_flush()

2020-03-23 Thread Stefan Agner
On 2020-03-09 20:52, Laurent Pinchart wrote:
> The vblank event is armed in the plane .atomic_update(). This works fine
> as we have a single plane, but will break as soon as multiple planes are
> supported (not to mention it's logically the wrong place to perform the
> operation). Move it to CRTC .atomic_flush().

The comment in the bracket make it sound as if there was something wrong
with the code before, but from what I understand that was just fine and
the only option we had with drm_simple_kms_helper, correct? Can you
maybe make that a bit clearer? (e.g. by stating that now that we no
longer use the simple display pipeline we can and should use the flush
callback).

Otherwise looks good.

Reviewed-by: Stefan Agner 

--
Stefan

> 
> Signed-off-by: Laurent Pinchart 
> ---
>  drivers/gpu/drm/mxsfb/mxsfb_kms.c | 35 ++-
>  1 file changed, 20 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> index 8f339adb8d04..ebe0785694cb 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> @@ -295,6 +295,25 @@ static int mxsfb_crtc_atomic_check(struct drm_crtc *crtc,
>   return drm_atomic_add_affected_planes(state->state, crtc);
>  }
>  
> +static void mxsfb_crtc_atomic_flush(struct drm_crtc *crtc,
> + struct drm_crtc_state *old_state)
> +{
> + struct drm_pending_vblank_event *event;
> +
> + event = crtc->state->event;
> + crtc->state->event = NULL;
> +
> + if (!event)
> + return;
> +
> + spin_lock_irq(>dev->event_lock);
> + if (drm_crtc_vblank_get(crtc) == 0)
> + drm_crtc_arm_vblank_event(crtc, event);
> + else
> + drm_crtc_send_vblank_event(crtc, event);
> + spin_unlock_irq(>dev->event_lock);
> +}
> +
>  static void mxsfb_crtc_atomic_enable(struct drm_crtc *crtc,
>struct drm_crtc_state *old_state)
>  {
> @@ -364,6 +383,7 @@ static void mxsfb_crtc_disable_vblank(struct drm_crtc 
> *crtc)
>  
>  static const struct drm_crtc_helper_funcs mxsfb_crtc_helper_funcs = {
>   .atomic_check = mxsfb_crtc_atomic_check,
> + .atomic_flush = mxsfb_crtc_atomic_flush,
>   .atomic_enable = mxsfb_crtc_atomic_enable,
>   .atomic_disable = mxsfb_crtc_atomic_disable,
>  };
> @@ -410,23 +430,8 @@ static void mxsfb_plane_atomic_update(struct
> drm_plane *plane,
> struct drm_plane_state *old_pstate)
>  {
>   struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev);
> - struct drm_crtc *crtc = >crtc;
> - struct drm_pending_vblank_event *event;
>   dma_addr_t paddr;
>  
> - spin_lock_irq(>dev->event_lock);
> - event = crtc->state->event;
> - if (event) {
> - crtc->state->event = NULL;
> -
> - if (drm_crtc_vblank_get(crtc) == 0) {
> - drm_crtc_arm_vblank_event(crtc, event);
> - } else {
> - drm_crtc_send_vblank_event(crtc, event);
> - }
> - }
> - spin_unlock_irq(>dev->event_lock);
> -
>   paddr = mxsfb_get_fb_paddr(mxsfb);
>   if (paddr) {
>   mxsfb_enable_axi_clk(mxsfb);
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 12/21] drm: mxsfb: Move vblank event arm to CRTC .atomic_flush()

2020-03-09 Thread Laurent Pinchart
The vblank event is armed in the plane .atomic_update(). This works fine
as we have a single plane, but will break as soon as multiple planes are
supported (not to mention it's logically the wrong place to perform the
operation). Move it to CRTC .atomic_flush().

Signed-off-by: Laurent Pinchart 
---
 drivers/gpu/drm/mxsfb/mxsfb_kms.c | 35 ++-
 1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c 
b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
index 8f339adb8d04..ebe0785694cb 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
@@ -295,6 +295,25 @@ static int mxsfb_crtc_atomic_check(struct drm_crtc *crtc,
return drm_atomic_add_affected_planes(state->state, crtc);
 }
 
+static void mxsfb_crtc_atomic_flush(struct drm_crtc *crtc,
+   struct drm_crtc_state *old_state)
+{
+   struct drm_pending_vblank_event *event;
+
+   event = crtc->state->event;
+   crtc->state->event = NULL;
+
+   if (!event)
+   return;
+
+   spin_lock_irq(>dev->event_lock);
+   if (drm_crtc_vblank_get(crtc) == 0)
+   drm_crtc_arm_vblank_event(crtc, event);
+   else
+   drm_crtc_send_vblank_event(crtc, event);
+   spin_unlock_irq(>dev->event_lock);
+}
+
 static void mxsfb_crtc_atomic_enable(struct drm_crtc *crtc,
 struct drm_crtc_state *old_state)
 {
@@ -364,6 +383,7 @@ static void mxsfb_crtc_disable_vblank(struct drm_crtc *crtc)
 
 static const struct drm_crtc_helper_funcs mxsfb_crtc_helper_funcs = {
.atomic_check = mxsfb_crtc_atomic_check,
+   .atomic_flush = mxsfb_crtc_atomic_flush,
.atomic_enable = mxsfb_crtc_atomic_enable,
.atomic_disable = mxsfb_crtc_atomic_disable,
 };
@@ -410,23 +430,8 @@ static void mxsfb_plane_atomic_update(struct drm_plane 
*plane,
  struct drm_plane_state *old_pstate)
 {
struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(plane->dev);
-   struct drm_crtc *crtc = >crtc;
-   struct drm_pending_vblank_event *event;
dma_addr_t paddr;
 
-   spin_lock_irq(>dev->event_lock);
-   event = crtc->state->event;
-   if (event) {
-   crtc->state->event = NULL;
-
-   if (drm_crtc_vblank_get(crtc) == 0) {
-   drm_crtc_arm_vblank_event(crtc, event);
-   } else {
-   drm_crtc_send_vblank_event(crtc, event);
-   }
-   }
-   spin_unlock_irq(>dev->event_lock);
-
paddr = mxsfb_get_fb_paddr(mxsfb);
if (paddr) {
mxsfb_enable_axi_clk(mxsfb);
-- 
Regards,

Laurent Pinchart

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