[PATCH 3/4] drm/i915/cdclk: Remove the hardcoded divider from cdclk_compute_crawl_and_squash_midpoint()
Gustavo Sousa
gustavo.sousa at intel.com
Fri Feb 16 12:16:41 UTC 2024
Quoting Ville Syrjala (2024-02-06 22:33:33-03:00)
>From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
>cdclk_compute_crawl_and_squash_midpoint() was still assuming
>that cd2x divider == 1 (ie. full divider == 2). Remove that
>assumption by computing the dividers properly.
>
>We'll also toss in a WARN in case the divider someone ends
s/someone/somehow/ ?
>up different between the old and new cdclk configs. That should
>never happen given we have div==2 in all the cdclk table entries
>for the affected platforms.
>
>If in the future we need a config where the divider also needs
>to be changed then we likely need to add an extra step into the
>cdclk programming sequence to make sure things stay within
>legal limits throughout the process.
>
>Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Reviewed-by: Gustavo Sousa <gustavo.sousa at intel.com>
>---
> drivers/gpu/drm/i915/display/intel_cdclk.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
>index a0013e37d53c..ca00586fdbc8 100644
>--- a/drivers/gpu/drm/i915/display/intel_cdclk.c
>+++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
>@@ -1846,7 +1846,7 @@ static bool cdclk_compute_crawl_and_squash_midpoint(struct drm_i915_private *i91
> struct intel_cdclk_config *mid_cdclk_config)
> {
> u16 old_waveform, new_waveform, mid_waveform;
>- int div = 2;
>+ int old_div, new_div, mid_div;
>
> /* Return if PLL is in an unknown state, force a complete disable and re-enable. */
> if (cdclk_pll_is_unknown(old_cdclk_config->vco))
>@@ -1865,6 +1865,18 @@ static bool cdclk_compute_crawl_and_squash_midpoint(struct drm_i915_private *i91
> old_waveform == new_waveform)
> return false;
>
>+ old_div = cdclk_divider(old_cdclk_config->cdclk,
>+ old_cdclk_config->vco, old_waveform);
>+ new_div = cdclk_divider(new_cdclk_config->cdclk,
>+ new_cdclk_config->vco, new_waveform);
>+
>+ /*
>+ * Should not happen currently. We might need more midpoint
>+ * transitions if we need to also change the cd2x divider.
>+ */
>+ if (drm_WARN_ON(&i915->drm, old_div != new_div))
>+ return false;
>+
> *mid_cdclk_config = *new_cdclk_config;
>
> /*
>@@ -1877,15 +1889,17 @@ static bool cdclk_compute_crawl_and_squash_midpoint(struct drm_i915_private *i91
>
> if (cdclk_squash_divider(new_waveform) > cdclk_squash_divider(old_waveform)) {
> mid_cdclk_config->vco = old_cdclk_config->vco;
>+ mid_div = old_div;
> mid_waveform = new_waveform;
> } else {
> mid_cdclk_config->vco = new_cdclk_config->vco;
>+ mid_div = new_div;
> mid_waveform = old_waveform;
> }
>
> mid_cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_squash_divider(mid_waveform) *
> mid_cdclk_config->vco,
>- cdclk_squash_len * div);
>+ cdclk_squash_len * mid_div);
>
> /* make sure the mid clock came out sane */
>
>--
>2.43.0
>
More information about the Intel-gfx
mailing list