drm/exynos: crtc: rework atomic_{begin,flush}
authorMarek Szyprowski <m.szyprowski@samsung.com>
Tue, 5 Jan 2016 12:52:51 +0000 (13:52 +0100)
committerInki Dae <daeinki@gmail.com>
Tue, 12 Jan 2016 15:16:37 +0000 (00:16 +0900)
Some CRTC drivers (like Exynos DRM Mixer) can handle blocking register
updates only on per-device level, not per-plane level. This patch changes
exynos_crts atomic_begin/atomic_flush callbacks to handle the entire crtc,
instead of given planes, so driver can handle both cases on their own.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos5433_drm_decon.c
drivers/gpu/drm/exynos/exynos7_drm_decon.c
drivers/gpu/drm/exynos/exynos_drm_crtc.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_drm_fimd.c

index 77073d8faaa3a378b29b848a6c25af300c9d82d4..1bf6a21130c7cbde6088dbb70e2a2b650f244b06 100644 (file)
@@ -248,15 +248,16 @@ static void decon_shadow_protect_win(struct decon_context *ctx, int win,
                       protect ? ~0 : 0);
 }
 
-static void decon_atomic_begin(struct exynos_drm_crtc *crtc,
-                                       struct exynos_drm_plane *plane)
+static void decon_atomic_begin(struct exynos_drm_crtc *crtc)
 {
        struct decon_context *ctx = crtc->ctx;
+       int i;
 
        if (test_bit(BIT_SUSPENDED, &ctx->flags))
                return;
 
-       decon_shadow_protect_win(ctx, plane->index, true);
+       for (i = ctx->first_win; i < WINDOWS_NR; i++)
+               decon_shadow_protect_win(ctx, i, true);
 }
 
 #define BIT_VAL(x, e, s) (((x) & ((1 << ((e) - (s) + 1)) - 1)) << (s))
@@ -336,15 +337,16 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
        decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
 }
 
-static void decon_atomic_flush(struct exynos_drm_crtc *crtc,
-                               struct exynos_drm_plane *plane)
+static void decon_atomic_flush(struct exynos_drm_crtc *crtc)
 {
        struct decon_context *ctx = crtc->ctx;
+       int i;
 
        if (test_bit(BIT_SUSPENDED, &ctx->flags))
                return;
 
-       decon_shadow_protect_win(ctx, plane->index, false);
+       for (i = ctx->first_win; i < WINDOWS_NR; i++)
+               decon_shadow_protect_win(ctx, i, false);
 
        if (ctx->out_type == IFTYPE_I80)
                set_bit(BIT_WIN_UPDATED, &ctx->flags);
index 8911f965b06c85962fafe50a0abe383522b191a2..52bda3b42fe017346266181aa83f3c0141f6b4e3 100644 (file)
@@ -385,15 +385,16 @@ static void decon_shadow_protect_win(struct decon_context *ctx,
        writel(val, ctx->regs + SHADOWCON);
 }
 
-static void decon_atomic_begin(struct exynos_drm_crtc *crtc,
-                                       struct exynos_drm_plane *plane)
+static void decon_atomic_begin(struct exynos_drm_crtc *crtc)
 {
        struct decon_context *ctx = crtc->ctx;
+       int i;
 
        if (ctx->suspended)
                return;
 
-       decon_shadow_protect_win(ctx, plane->index, true);
+       for (i = 0; i < WINDOWS_NR; i++)
+               decon_shadow_protect_win(ctx, i, true);
 }
 
 static void decon_update_plane(struct exynos_drm_crtc *crtc,
@@ -517,15 +518,16 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
        writel(val, ctx->regs + DECON_UPDATE);
 }
 
-static void decon_atomic_flush(struct exynos_drm_crtc *crtc,
-                                       struct exynos_drm_plane *plane)
+static void decon_atomic_flush(struct exynos_drm_crtc *crtc)
 {
        struct decon_context *ctx = crtc->ctx;
+       int i;
 
        if (ctx->suspended)
                return;
 
-       decon_shadow_protect_win(ctx, plane->index, false);
+       for (i = 0; i < WINDOWS_NR; i++)
+               decon_shadow_protect_win(ctx, i, false);
 }
 
 static void decon_init(struct decon_context *ctx)
index 8f5ac535d8098137642afffec532b27d8eecbb57..5acaecba450a263984f42650bc185d02289f2c84 100644 (file)
@@ -68,32 +68,20 @@ static void exynos_crtc_atomic_begin(struct drm_crtc *crtc,
                                     struct drm_crtc_state *old_crtc_state)
 {
        struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
-       struct drm_plane *plane;
 
        exynos_crtc->event = crtc->state->event;
 
-       drm_atomic_crtc_for_each_plane(plane, crtc) {
-               struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
-
-               if (exynos_crtc->ops->atomic_begin)
-                       exynos_crtc->ops->atomic_begin(exynos_crtc,
-                                                       exynos_plane);
-       }
+       if (exynos_crtc->ops->atomic_begin)
+               exynos_crtc->ops->atomic_begin(exynos_crtc);
 }
 
 static void exynos_crtc_atomic_flush(struct drm_crtc *crtc,
                                     struct drm_crtc_state *old_crtc_state)
 {
        struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
-       struct drm_plane *plane;
 
-       drm_atomic_crtc_for_each_plane(plane, crtc) {
-               struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
-
-               if (exynos_crtc->ops->atomic_flush)
-                       exynos_crtc->ops->atomic_flush(exynos_crtc,
-                                                       exynos_plane);
-       }
+       if (exynos_crtc->ops->atomic_flush)
+               exynos_crtc->ops->atomic_flush(exynos_crtc);
 }
 
 static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
index f0827dbebb7ddb6d1a20f8d91fdc58f65cf4f9c1..17b5ded72ff18e33a6dcd9353d9eb278ed56f81a 100644 (file)
@@ -123,8 +123,8 @@ struct exynos_drm_plane_config {
  * @wait_for_vblank: wait for vblank interrupt to make sure that
  *     hardware overlay is updated.
  * @atomic_check: validate state
- * @atomic_begin: prepare a window to receive a update
- * @atomic_flush: mark the end of a window update
+ * @atomic_begin: prepare device to receive an update
+ * @atomic_flush: mark the end of device update
  * @update_plane: apply hardware specific overlay data to registers.
  * @disable_plane: disable hardware specific overlay.
  * @te_handler: trigger to transfer video image at the tearing effect
@@ -144,14 +144,12 @@ struct exynos_drm_crtc_ops {
        void (*wait_for_vblank)(struct exynos_drm_crtc *crtc);
        int (*atomic_check)(struct exynos_drm_crtc *crtc,
                            struct drm_crtc_state *state);
-       void (*atomic_begin)(struct exynos_drm_crtc *crtc,
-                             struct exynos_drm_plane *plane);
+       void (*atomic_begin)(struct exynos_drm_crtc *crtc);
        void (*update_plane)(struct exynos_drm_crtc *crtc,
                             struct exynos_drm_plane *plane);
        void (*disable_plane)(struct exynos_drm_crtc *crtc,
                              struct exynos_drm_plane *plane);
-       void (*atomic_flush)(struct exynos_drm_crtc *crtc,
-                             struct exynos_drm_plane *plane);
+       void (*atomic_flush)(struct exynos_drm_crtc *crtc);
        void (*te_handler)(struct exynos_drm_crtc *crtc);
        void (*clock_enable)(struct exynos_drm_crtc *crtc, bool enable);
 };
index 6ae1b1e557833f7e1428e59b44799a17328f33d4..70194d0e4fe408f75c2e88912560fb9fa059db79 100644 (file)
@@ -622,26 +622,28 @@ static void fimd_shadow_protect_win(struct fimd_context *ctx,
        writel(val, ctx->regs + reg);
 }
 
-static void fimd_atomic_begin(struct exynos_drm_crtc *crtc,
-                              struct exynos_drm_plane *plane)
+static void fimd_atomic_begin(struct exynos_drm_crtc *crtc)
 {
        struct fimd_context *ctx = crtc->ctx;
+       int i;
 
        if (ctx->suspended)
                return;
 
-       fimd_shadow_protect_win(ctx, plane->index, true);
+       for (i = 0; i < WINDOWS_NR; i++)
+               fimd_shadow_protect_win(ctx, i, true);
 }
 
-static void fimd_atomic_flush(struct exynos_drm_crtc *crtc,
-                              struct exynos_drm_plane *plane)
+static void fimd_atomic_flush(struct exynos_drm_crtc *crtc)
 {
        struct fimd_context *ctx = crtc->ctx;
+       int i;
 
        if (ctx->suspended)
                return;
 
-       fimd_shadow_protect_win(ctx, plane->index, false);
+       for (i = 0; i < WINDOWS_NR; i++)
+               fimd_shadow_protect_win(ctx, i, false);
 }
 
 static void fimd_update_plane(struct exynos_drm_crtc *crtc,