From: Ville Syrjälä <[email protected]>

Currently we use two booleans (use_dsb and use_flipq)
to track how we are going to perform the actual commit.
That is rarher awkward, and potentially fragile as the
'use_dsb && use_flipq' combination isn't even legal.
Switch over to an enum instead.

Signed-off-by: Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_atomic.c   |   3 +-
 drivers/gpu/drm/i915/display/intel_color.c    |   6 +-
 drivers/gpu/drm/i915/display/intel_crtc.c     |   4 +-
 drivers/gpu/drm/i915/display/intel_display.c  | 101 ++++++++++--------
 .../drm/i915/display/intel_display_types.h    |   8 +-
 5 files changed, 71 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c 
b/drivers/gpu/drm/i915/display/intel_atomic.c
index edf32b7fb5f7..e30a53136796 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic.c
+++ b/drivers/gpu/drm/i915/display/intel_atomic.c
@@ -276,8 +276,7 @@ intel_crtc_duplicate_state(struct drm_crtc *crtc)
        crtc_state->update_planes = 0;
        crtc_state->dsb_color = NULL;
        crtc_state->dsb_commit = NULL;
-       crtc_state->use_flipq = false;
-       crtc_state->use_dsb = false;
+       crtc_state->commit_type = INTEL_COMMIT_MMIO;
 
        return &crtc_state->uapi;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_color.c 
b/drivers/gpu/drm/i915/display/intel_color.c
index f2e6b82968d2..8eac13590941 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -2020,14 +2020,14 @@ void intel_color_prepare_commit(struct 
intel_atomic_state *state,
                crtc_state->dsb_color = intel_dsb_prepare(state, crtc, 
INTEL_DSB_1, 1024);
 
        if (!intel_color_uses_dsb(crtc_state)) {
-               crtc_state->use_flipq = false;
-               crtc_state->use_dsb = false;
+               crtc_state->commit_type = INTEL_COMMIT_MMIO;
                return;
        }
 
        display->funcs.color->load_luts(crtc_state);
 
-       if (crtc_state->use_dsb && intel_color_uses_chained_dsb(crtc_state)) {
+       if (crtc_state->commit_type == INTEL_COMMIT_DSB &&
+           intel_color_uses_chained_dsb(crtc_state)) {
                intel_vrr_send_push(crtc_state->dsb_color, crtc_state);
                intel_dsb_wait_for_delayed_vblank(state, crtc_state->dsb_color);
                intel_vrr_check_push_sent(crtc_state->dsb_color, crtc_state);
diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c 
b/drivers/gpu/drm/i915/display/intel_crtc.c
index 6dadffc63988..51741ca44705 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -550,7 +550,7 @@ void intel_pipe_update_start(struct intel_atomic_state 
*state,
        struct intel_vblank_evade_ctx evade;
        int scanline;
 
-       drm_WARN_ON(display->drm, new_crtc_state->use_dsb || 
new_crtc_state->use_flipq);
+       drm_WARN_ON(display->drm, new_crtc_state->commit_type != 
INTEL_COMMIT_MMIO);
 
        intel_psr_lock(new_crtc_state);
 
@@ -689,7 +689,7 @@ void intel_pipe_update_end(struct intel_atomic_state *state,
        u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc);
        ktime_t end_vbl_time = ktime_get();
 
-       drm_WARN_ON(display->drm, new_crtc_state->use_dsb || 
new_crtc_state->use_flipq);
+       drm_WARN_ON(display->drm, new_crtc_state->commit_type != 
INTEL_COMMIT_MMIO);
 
        if (new_crtc_state->do_async_flip)
                goto out;
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 94742083693b..f09a0b3860d7 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -6688,7 +6688,7 @@ static void commit_pipe_pre_planes(struct 
intel_atomic_state *state,
                intel_atomic_get_new_crtc_state(state, crtc);
        bool modeset = intel_crtc_needs_modeset(new_crtc_state);
 
-       drm_WARN_ON(display->drm, new_crtc_state->use_dsb || 
new_crtc_state->use_flipq);
+       drm_WARN_ON(display->drm, new_crtc_state->commit_type != 
INTEL_COMMIT_MMIO);
 
        /*
         * During modesets pipe configuration was programmed as the
@@ -6718,7 +6718,7 @@ static void commit_pipe_post_planes(struct 
intel_atomic_state *state,
                intel_atomic_get_new_crtc_state(state, crtc);
        bool modeset = intel_crtc_needs_modeset(new_crtc_state);
 
-       drm_WARN_ON(display->drm, new_crtc_state->use_dsb || 
new_crtc_state->use_flipq);
+       drm_WARN_ON(display->drm, new_crtc_state->commit_type != 
INTEL_COMMIT_MMIO);
 
        /*
         * Disable the scaler(s) after the plane(s) so that we don't
@@ -6810,13 +6810,13 @@ static void intel_pre_update_crtc(struct 
intel_atomic_state *state,
 
        drm_WARN_ON(display->drm, !intel_display_power_is_enabled(display, 
POWER_DOMAIN_DC_OFF));
 
-       if (!modeset &&
-           intel_crtc_needs_color_update(new_crtc_state) &&
-           !new_crtc_state->use_dsb && !new_crtc_state->use_flipq)
-               intel_color_commit_noarm(NULL, new_crtc_state);
+       if (new_crtc_state->commit_type == INTEL_COMMIT_MMIO) {
+               if (!modeset &&
+                   intel_crtc_needs_color_update(new_crtc_state))
+                       intel_color_commit_noarm(NULL, new_crtc_state);
 
-       if (!new_crtc_state->use_dsb && !new_crtc_state->use_flipq)
                intel_crtc_planes_update_noarm(NULL, state, crtc);
+       }
 }
 
 static void intel_update_crtc(struct intel_atomic_state *state,
@@ -6827,18 +6827,23 @@ static void intel_update_crtc(struct intel_atomic_state 
*state,
        struct intel_crtc_state *new_crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
 
-       if (new_crtc_state->use_flipq) {
+       switch (new_crtc_state->commit_type) {
+       case INTEL_COMMIT_FLIPQ:
                intel_flipq_enable(new_crtc_state);
 
                intel_crtc_prepare_vblank_event(new_crtc_state, 
&crtc->flipq_event);
 
                intel_flipq_add(crtc, INTEL_FLIPQ_PLANE_1, 0, INTEL_DSB_0,
                                new_crtc_state->dsb_commit);
-       } else if (new_crtc_state->use_dsb) {
+               break;
+
+       case INTEL_COMMIT_DSB:
                intel_crtc_prepare_vblank_event(new_crtc_state, 
&crtc->dsb_event);
 
                intel_dsb_commit(new_crtc_state->dsb_commit);
-       } else {
+               break;
+
+       case INTEL_COMMIT_MMIO:
                /* Perform vblank evasion around commit operation */
                intel_pipe_update_start(state, crtc);
 
@@ -6852,6 +6857,7 @@ static void intel_update_crtc(struct intel_atomic_state 
*state,
                commit_pipe_post_planes(state, crtc);
 
                intel_pipe_update_end(state, crtc);
+               break;
        }
 
        /*
@@ -7259,36 +7265,47 @@ static void 
intel_atomic_prepare_plane_clear_colors(struct intel_atomic_state *s
        }
 }
 
-static void intel_atomic_dsb_prepare(struct intel_atomic_state *state,
-                                    struct intel_crtc *crtc)
+static enum intel_commit_type
+intel_atomic_commit_type(struct intel_atomic_state *state,
+                        struct intel_crtc *crtc)
 {
        struct intel_display *display = to_intel_display(state);
        struct intel_crtc_state *new_crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
 
        if (!new_crtc_state->hw.active)
-               return;
+               return INTEL_COMMIT_MMIO;
 
        if (state->base.legacy_cursor_update)
-               return;
+               return INTEL_COMMIT_MMIO;
 
        /* FIXME deal with everything */
-       new_crtc_state->use_flipq =
-               intel_flipq_supported(display) &&
-               !new_crtc_state->do_async_flip &&
-               !new_crtc_state->vrr.enable &&
-               !new_crtc_state->has_psr &&
-               !intel_crtc_needs_modeset(new_crtc_state) &&
-               !intel_crtc_needs_fastset(new_crtc_state) &&
-               !intel_crtc_needs_color_update(new_crtc_state);
-
-       new_crtc_state->use_dsb =
-               intel_dsb_supported(display) &&
-               !new_crtc_state->use_flipq &&
-               !new_crtc_state->do_async_flip &&
-               (DISPLAY_VER(display) >= 20 || !new_crtc_state->has_psr) &&
-               !intel_crtc_needs_modeset(new_crtc_state) &&
-               !intel_crtc_needs_fastset(new_crtc_state);
+       if (intel_flipq_supported(display) &&
+           !new_crtc_state->do_async_flip &&
+           !new_crtc_state->vrr.enable &&
+           !new_crtc_state->has_psr &&
+           !intel_crtc_needs_modeset(new_crtc_state) &&
+           !intel_crtc_needs_fastset(new_crtc_state) &&
+           !intel_crtc_needs_color_update(new_crtc_state))
+               return INTEL_COMMIT_FLIPQ;
+
+       if (intel_dsb_supported(display) &&
+           !new_crtc_state->do_async_flip &&
+           (DISPLAY_VER(display) >= 20 || !new_crtc_state->has_psr) &&
+           !intel_crtc_needs_modeset(new_crtc_state) &&
+           !intel_crtc_needs_fastset(new_crtc_state))
+               return INTEL_COMMIT_DSB;
+
+       return INTEL_COMMIT_MMIO;
+}
+
+static void intel_atomic_dsb_prepare(struct intel_atomic_state *state,
+                                    struct intel_crtc *crtc)
+{
+       struct intel_crtc_state *new_crtc_state =
+               intel_atomic_get_new_crtc_state(state, crtc);
+
+       new_crtc_state->commit_type = intel_atomic_commit_type(state, crtc);
 
        intel_color_prepare_commit(state, crtc);
 }
@@ -7297,7 +7314,7 @@ static unsigned int
 commit_dsb_max_cmds(const struct intel_crtc_state *crtc_state)
 {
        /* just enough to start the chained DSB */
-       if (!crtc_state->use_dsb && !crtc_state->use_flipq)
+       if (crtc_state->commit_type == INTEL_COMMIT_MMIO)
                return 16;
 
        /*
@@ -7320,23 +7337,21 @@ static void intel_atomic_dsb_finish(struct 
intel_atomic_state *state,
        struct intel_crtc_state *new_crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
 
-       if (!new_crtc_state->use_flipq &&
-           !new_crtc_state->use_dsb &&
+       if (new_crtc_state->commit_type == INTEL_COMMIT_MMIO &&
            !new_crtc_state->dsb_color)
                return;
 
        new_crtc_state->dsb_commit = intel_dsb_prepare(state, crtc, INTEL_DSB_0,
                                                       
commit_dsb_max_cmds(new_crtc_state));
        if (!new_crtc_state->dsb_commit) {
-               new_crtc_state->use_flipq = false;
-               new_crtc_state->use_dsb = false;
+               new_crtc_state->commit_type = INTEL_COMMIT_MMIO;
                intel_color_cleanup_commit(new_crtc_state);
                return;
        }
 
-       if (new_crtc_state->use_flipq || new_crtc_state->use_dsb) {
+       if (new_crtc_state->commit_type != INTEL_COMMIT_MMIO) {
                /* Wa_18034343758 */
-               if (new_crtc_state->use_flipq)
+               if (new_crtc_state->commit_type == INTEL_COMMIT_FLIPQ)
                        intel_flipq_wait_dmc_halt(new_crtc_state->dsb_commit, 
crtc);
 
                if (intel_crtc_needs_color_update(new_crtc_state))
@@ -7356,7 +7371,7 @@ static void intel_atomic_dsb_finish(struct 
intel_atomic_state *state,
                intel_psr_wait_for_idle_dsb(new_crtc_state->dsb_commit,
                                            new_crtc_state);
 
-               if (new_crtc_state->use_dsb)
+               if (new_crtc_state->commit_type == INTEL_COMMIT_DSB)
                        intel_dsb_vblank_evade(state, 
new_crtc_state->dsb_commit);
 
                if (intel_crtc_needs_color_update(new_crtc_state))
@@ -7374,7 +7389,7 @@ static void intel_atomic_dsb_finish(struct 
intel_atomic_state *state,
                                           new_crtc_state);
 
                /* Wa_18034343758 */
-               if (new_crtc_state->use_flipq)
+               if (new_crtc_state->commit_type == INTEL_COMMIT_FLIPQ)
                        intel_flipq_unhalt_dmc(new_crtc_state->dsb_commit, 
crtc);
        }
 
@@ -7385,7 +7400,8 @@ static void intel_atomic_dsb_finish(struct 
intel_atomic_state *state,
                intel_dsb_gosub(new_crtc_state->dsb_commit,
                                new_crtc_state->dsb_color);
 
-       if (new_crtc_state->use_dsb && 
!intel_color_uses_chained_dsb(new_crtc_state)) {
+       if (new_crtc_state->commit_type == INTEL_COMMIT_DSB &&
+           !intel_color_uses_chained_dsb(new_crtc_state)) {
                intel_dsb_wait_vblanks(new_crtc_state->dsb_commit, 1);
 
                intel_vrr_send_push(new_crtc_state->dsb_commit, new_crtc_state);
@@ -7538,10 +7554,11 @@ static void intel_atomic_commit_tail(struct 
intel_atomic_state *state)
 
                intel_atomic_dsb_wait_commit(new_crtc_state);
 
-               if (!state->base.legacy_cursor_update && 
!new_crtc_state->use_dsb)
+               if (!state->base.legacy_cursor_update &&
+                   new_crtc_state->commit_type == INTEL_COMMIT_MMIO)
                        intel_vrr_check_push_sent(NULL, new_crtc_state);
 
-               if (new_crtc_state->use_flipq)
+               if (new_crtc_state->commit_type == INTEL_COMMIT_FLIPQ)
                        intel_flipq_disable(new_crtc_state);
        }
 
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 6ff53cd58052..60f770ae70ad 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1369,8 +1369,12 @@ struct intel_crtc_state {
 
        /* For DSB based pipe updates */
        struct intel_dsb *dsb_color, *dsb_commit;
-       bool use_dsb;
-       bool use_flipq;
+
+       enum intel_commit_type {
+               INTEL_COMMIT_MMIO,
+               INTEL_COMMIT_DSB,
+               INTEL_COMMIT_FLIPQ,
+       } commit_type;
 
        u32 psr2_man_track_ctl;
 
-- 
2.51.2

Reply via email to