Commit d0eed154 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Fix post-fastset modeset check for port sync

The post-fastset "does anyone still need a full modeset?" for
port sync looks busted. The outer loop bails out of a full modeset
is still needed by the current crtc, and then we skip forcing
a full modeset on the related crtcs. That's totally the opposite
of what we want.

The MST path has the logic mostly the other way around so it
looks correct. To fix the port sync case let's follow the MST
logic for both. So, if the current crtc already needs a modeset
we do nothing. otherwise we check if any of the related crtcs
needs a modeset, and if so we force a full modeset for the
current crtc.

And while at let's change the else if to a plain if to so
we don't have needless coupling between the MST and port sync
checks.

Cc: José Roberto de Souza <jose.souza@intel.com>
Cc: Manasi Navare <manasi.d.navare@intel.com>
Fixes: 05a8e451 ("drm/i915/display: Use external dependency loop for port sync")
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200115190813.17971-1-ville.syrjala@linux.intel.comReviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
parent 0b3bd0cd
...@@ -14469,35 +14469,21 @@ static int intel_atomic_check_crtcs(struct intel_atomic_state *state) ...@@ -14469,35 +14469,21 @@ static int intel_atomic_check_crtcs(struct intel_atomic_state *state)
return 0; return 0;
} }
static bool intel_cpu_transcoder_needs_modeset(struct intel_atomic_state *state, static bool intel_cpu_transcoders_need_modeset(struct intel_atomic_state *state,
enum transcoder transcoder)
{
struct intel_crtc_state *new_crtc_state;
struct intel_crtc *crtc;
int i;
for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
if (new_crtc_state->cpu_transcoder == transcoder)
return needs_modeset(new_crtc_state);
return false;
}
static void
intel_modeset_synced_crtcs(struct intel_atomic_state *state,
u8 transcoders) u8 transcoders)
{ {
struct intel_crtc_state *new_crtc_state; const struct intel_crtc_state *new_crtc_state;
struct intel_crtc *crtc; struct intel_crtc *crtc;
int i; int i;
for_each_new_intel_crtc_in_state(state, crtc, for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
new_crtc_state, i) { if (new_crtc_state->hw.enable &&
if (transcoders & BIT(new_crtc_state->cpu_transcoder)) { transcoders & BIT(new_crtc_state->cpu_transcoder) &&
new_crtc_state->uapi.mode_changed = true; needs_modeset(new_crtc_state))
new_crtc_state->update_pipe = false; return true;
}
} }
return false;
} }
static int static int
...@@ -14655,15 +14641,20 @@ static int intel_atomic_check(struct drm_device *dev, ...@@ -14655,15 +14641,20 @@ static int intel_atomic_check(struct drm_device *dev,
if (intel_dp_mst_is_slave_trans(new_crtc_state)) { if (intel_dp_mst_is_slave_trans(new_crtc_state)) {
enum transcoder master = new_crtc_state->mst_master_transcoder; enum transcoder master = new_crtc_state->mst_master_transcoder;
if (intel_cpu_transcoder_needs_modeset(state, master)) { if (intel_cpu_transcoders_need_modeset(state, BIT(master))) {
new_crtc_state->uapi.mode_changed = true; new_crtc_state->uapi.mode_changed = true;
new_crtc_state->update_pipe = false; new_crtc_state->update_pipe = false;
} }
} else if (is_trans_port_sync_mode(new_crtc_state)) { }
if (is_trans_port_sync_mode(new_crtc_state)) {
u8 trans = new_crtc_state->sync_mode_slaves_mask | u8 trans = new_crtc_state->sync_mode_slaves_mask |
BIT(new_crtc_state->master_transcoder); BIT(new_crtc_state->master_transcoder);
intel_modeset_synced_crtcs(state, trans); if (intel_cpu_transcoders_need_modeset(state, trans)) {
new_crtc_state->uapi.mode_changed = true;
new_crtc_state->update_pipe = false;
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment