aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2019-06-19 08:09:29 -0400
committerJani Nikula <jani.nikula@intel.com>2019-06-19 08:57:09 -0400
commit475df5d0f3eb2d031e4505f84d8fba75baaf2e80 (patch)
treeed740ee37e35d032a6e3737bc7b84fea5c2a318b
parentf5633efcedb43b87b9fa81695335feb7b2e20f3c (diff)
drm/i915: Don't clobber M/N values during fastset check
We're now calling intel_pipe_config_compare(..., true) uncoditionally which means we're always going clobber the calculated M/N values with the old values if the fuzzy M/N check passes. That causes problems because the fuzzy check allows for a huge difference in the values. I'm actually tempted to just make the M/N checks exact, but that might prevent fastboot from kicking in when people want it. So for now let's overwrite the computed values with the old values only if decide to skip the modeset. v2: Copy has_drrs along with M/N M2/N2 values Cc: stable@vger.kernel.org Cc: Blubberbub@protonmail.com Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Hans de Goede <hdegoede@redhat.com> Tested-by: Blubberbub@protonmail.com Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110782 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110675 Fixes: d19f958db23c ("drm/i915: Enable fastset for non-boot modesets.") Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190612172423.25231-1-ville.syrjala@linux.intel.com Reviewed-by: Imre Deak <imre.deak@intel.com> (cherry picked from commit f0521558a2a89d58a08745e225025d338572e60a) Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190619120929.4057-1-ville.syrjala@linux.intel.com
-rw-r--r--drivers/gpu/drm/i915/intel_display.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index b69440cf41ea..75105a2c59ea 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12005,9 +12005,6 @@ intel_compare_link_m_n(const struct intel_link_m_n *m_n,
12005 m2_n2->gmch_m, m2_n2->gmch_n, !adjust) && 12005 m2_n2->gmch_m, m2_n2->gmch_n, !adjust) &&
12006 intel_compare_m_n(m_n->link_m, m_n->link_n, 12006 intel_compare_m_n(m_n->link_m, m_n->link_n,
12007 m2_n2->link_m, m2_n2->link_n, !adjust)) { 12007 m2_n2->link_m, m2_n2->link_n, !adjust)) {
12008 if (adjust)
12009 *m2_n2 = *m_n;
12010
12011 return true; 12008 return true;
12012 } 12009 }
12013 12010
@@ -13149,6 +13146,33 @@ static int calc_watermark_data(struct intel_atomic_state *state)
13149 return 0; 13146 return 0;
13150} 13147}
13151 13148
13149static void intel_crtc_check_fastset(struct intel_crtc_state *old_crtc_state,
13150 struct intel_crtc_state *new_crtc_state)
13151{
13152 struct drm_i915_private *dev_priv =
13153 to_i915(new_crtc_state->base.crtc->dev);
13154
13155 if (!intel_pipe_config_compare(dev_priv, old_crtc_state,
13156 new_crtc_state, true))
13157 return;
13158
13159 new_crtc_state->base.mode_changed = false;
13160 new_crtc_state->update_pipe = true;
13161
13162 /*
13163 * If we're not doing the full modeset we want to
13164 * keep the current M/N values as they may be
13165 * sufficiently different to the computed values
13166 * to cause problems.
13167 *
13168 * FIXME: should really copy more fuzzy state here
13169 */
13170 new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
13171 new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
13172 new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
13173 new_crtc_state->has_drrs = old_crtc_state->has_drrs;
13174}
13175
13152/** 13176/**
13153 * intel_atomic_check - validate state object 13177 * intel_atomic_check - validate state object
13154 * @dev: drm device 13178 * @dev: drm device
@@ -13197,12 +13221,8 @@ static int intel_atomic_check(struct drm_device *dev,
13197 return ret; 13221 return ret;
13198 } 13222 }
13199 13223
13200 if (intel_pipe_config_compare(dev_priv, 13224 intel_crtc_check_fastset(to_intel_crtc_state(old_crtc_state),
13201 to_intel_crtc_state(old_crtc_state), 13225 pipe_config);
13202 pipe_config, true)) {
13203 crtc_state->mode_changed = false;
13204 pipe_config->update_pipe = true;
13205 }
13206 13226
13207 if (needs_modeset(crtc_state)) 13227 if (needs_modeset(crtc_state))
13208 any_ms = true; 13228 any_ms = true;