lkml.org 
[lkml]   [2019]   [Jun]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.1 107/121] drm/i915: Dont clobber M/N values during fastset check
    Date
    From: Ville Syrjälä <ville.syrjala@linux.intel.com>

    commit 475df5d0f3eb2d031e4505f84d8fba75baaf2e80 upstream.

    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
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/gpu/drm/i915/intel_display.c | 38 ++++++++++++++++++++++++++---------
    1 file changed, 29 insertions(+), 9 deletions(-)

    --- a/drivers/gpu/drm/i915/intel_display.c
    +++ b/drivers/gpu/drm/i915/intel_display.c
    @@ -11820,9 +11820,6 @@ intel_compare_link_m_n(const struct inte
    m2_n2->gmch_m, m2_n2->gmch_n, !adjust) &&
    intel_compare_m_n(m_n->link_m, m_n->link_n,
    m2_n2->link_m, m2_n2->link_n, !adjust)) {
    - if (adjust)
    - *m2_n2 = *m_n;
    -
    return true;
    }

    @@ -12855,6 +12852,33 @@ static int calc_watermark_data(struct in
    return 0;
    }

    +static void intel_crtc_check_fastset(struct intel_crtc_state *old_crtc_state,
    + struct intel_crtc_state *new_crtc_state)
    +{
    + struct drm_i915_private *dev_priv =
    + to_i915(new_crtc_state->base.crtc->dev);
    +
    + if (!intel_pipe_config_compare(dev_priv, old_crtc_state,
    + new_crtc_state, true))
    + return;
    +
    + new_crtc_state->base.mode_changed = false;
    + new_crtc_state->update_pipe = true;
    +
    + /*
    + * If we're not doing the full modeset we want to
    + * keep the current M/N values as they may be
    + * sufficiently different to the computed values
    + * to cause problems.
    + *
    + * FIXME: should really copy more fuzzy state here
    + */
    + new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
    + new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
    + new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
    + new_crtc_state->has_drrs = old_crtc_state->has_drrs;
    +}
    +
    /**
    * intel_atomic_check - validate state object
    * @dev: drm device
    @@ -12903,12 +12927,8 @@ static int intel_atomic_check(struct drm
    return ret;
    }

    - if (intel_pipe_config_compare(dev_priv,
    - to_intel_crtc_state(old_crtc_state),
    - pipe_config, true)) {
    - crtc_state->mode_changed = false;
    - pipe_config->update_pipe = true;
    - }
    + intel_crtc_check_fastset(to_intel_crtc_state(old_crtc_state),
    + pipe_config);

    if (needs_modeset(crtc_state))
    any_ms = true;

    \
     
     \ /
      Last update: 2019-06-24 12:22    [W:2.219 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site