Commit d4a23930 authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Stanislav Lisovskiy

drm/i915: Allow cdclk squasher to be reconfigured live

Supposedly we should be able to change the cdclk squasher waveform
even when many pipes are active. Make it so.
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarMika Kahola <mika.kahola@intel.com>
Signed-off-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211119131348.725220-6-mika.kahola@intel.com
parent 77ab3a1e
...@@ -1951,6 +1951,25 @@ static bool intel_cdclk_can_crawl(struct drm_i915_private *dev_priv, ...@@ -1951,6 +1951,25 @@ static bool intel_cdclk_can_crawl(struct drm_i915_private *dev_priv,
a->ref == b->ref; a->ref == b->ref;
} }
static bool intel_cdclk_can_squash(struct drm_i915_private *dev_priv,
const struct intel_cdclk_config *a,
const struct intel_cdclk_config *b)
{
/*
* FIXME should store a bit more state in intel_cdclk_config
* to differentiate squasher vs. cd2x divider properly. For
* the moment all platforms with squasher use a fixed cd2x
* divider.
*/
if (!has_cdclk_squasher(dev_priv))
return false;
return a->cdclk != b->cdclk &&
a->vco != 0 &&
a->vco == b->vco &&
a->ref == b->ref;
}
/** /**
* intel_cdclk_needs_modeset - Determine if changong between the CDCLK * intel_cdclk_needs_modeset - Determine if changong between the CDCLK
* configurations requires a modeset on all pipes * configurations requires a modeset on all pipes
...@@ -1988,7 +2007,17 @@ static bool intel_cdclk_can_cd2x_update(struct drm_i915_private *dev_priv, ...@@ -1988,7 +2007,17 @@ static bool intel_cdclk_can_cd2x_update(struct drm_i915_private *dev_priv,
if (DISPLAY_VER(dev_priv) < 10 && !IS_BROXTON(dev_priv)) if (DISPLAY_VER(dev_priv) < 10 && !IS_BROXTON(dev_priv))
return false; return false;
/*
* FIXME should store a bit more state in intel_cdclk_config
* to differentiate squasher vs. cd2x divider properly. For
* the moment all platforms with squasher use a fixed cd2x
* divider.
*/
if (has_cdclk_squasher(dev_priv))
return false;
return a->cdclk != b->cdclk && return a->cdclk != b->cdclk &&
a->vco != 0 &&
a->vco == b->vco && a->vco == b->vco &&
a->ref == b->ref; a->ref == b->ref;
} }
...@@ -2672,9 +2701,14 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state) ...@@ -2672,9 +2701,14 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
pipe = INVALID_PIPE; pipe = INVALID_PIPE;
} }
if (intel_cdclk_can_crawl(dev_priv, if (intel_cdclk_can_squash(dev_priv,
&old_cdclk_state->actual, &old_cdclk_state->actual,
&new_cdclk_state->actual)) { &new_cdclk_state->actual)) {
drm_dbg_kms(&dev_priv->drm,
"Can change cdclk via squasher\n");
} else if (intel_cdclk_can_crawl(dev_priv,
&old_cdclk_state->actual,
&new_cdclk_state->actual)) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"Can change cdclk via crawl\n"); "Can change cdclk via crawl\n");
} else if (pipe != INVALID_PIPE) { } else if (pipe != INVALID_PIPE) {
......
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