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.
v2: Rebase due to intel_crtc_needs_vblank_work() keeping
the use_dsb check
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 | 7 +-
drivers/gpu/drm/i915/display/intel_display.c | 101 ++++++++++--------
.../drm/i915/display/intel_display_types.h | 8 +-
5 files changed, 72 insertions(+), 53 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c
b/drivers/gpu/drm/i915/display/intel_atomic.c
index b66c2d4ba2b3..b042c3cc78e1 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic.c
+++ b/drivers/gpu/drm/i915/display/intel_atomic.c
@@ -275,8 +275,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_dsb = false;
- crtc_state->use_flipq = 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 26e92221fa19..aa2f2b22312a 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -2029,14 +2029,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->color.funcs->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 0de24d221e48..829ff2a2c025 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -499,8 +499,7 @@ static bool intel_crtc_needs_vblank_work(const struct
intel_crtc_state *crtc_sta
!crtc_state->preload_luts &&
!intel_crtc_needs_modeset(crtc_state) &&
!intel_color_uses_dsb(crtc_state) &&
- !crtc_state->use_flipq &&
- !crtc_state->use_dsb;
+ crtc_state->commit_type == INTEL_COMMIT_MMIO;
}
static void intel_crtc_vblank_work(struct kthread_work *base)
@@ -598,7 +597,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);
@@ -737,7 +736,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 d7bd1b862aa9..9a24eb16025a 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -6798,7 +6798,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
@@ -6828,7 +6828,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
@@ -6917,13 +6917,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,
@@ -6934,18 +6934,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);
@@ -6959,6 +6964,7 @@ static void intel_update_crtc(struct intel_atomic_state
*state,
commit_pipe_post_planes(state, crtc);
intel_pipe_update_end(state, crtc);
+ break;
}
/*
@@ -7368,36 +7374,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);
}
@@ -7406,7 +7423,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;
/*
@@ -7429,23 +7446,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 (new_crtc_state->vrr.dc_balance.enable) {
@@ -7477,7 +7492,7 @@ static void intel_atomic_dsb_finish(struct
intel_atomic_state *state,
intel_psr_trigger_frame_change_event(new_crtc_state->dsb_commit,
state, crtc);
- 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))
@@ -7495,7 +7510,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);
}
@@ -7506,7 +7521,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)) {
/*
* Dsb wait vblank may or may not skip. Let's remove it for PSR
* trans push case to ensure we are not waiting two vblanks
@@ -7695,10 +7711,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 9016be52c7ea..11d68c951a3a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1389,8 +1389,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.54.0