[Intel-gfx] [PATCH 2/2] drm/i915: Simplify some icl pll calculations

Ville Syrjala ville.syrjala at linux.intel.com
Mon Apr 8 15:27:02 UTC 2019


From: Ville Syrjälä <ville.syrjala at linux.intel.com>

Write some icl pll calculations in a more straightforward way.
We have just enough bits for the full divisor.

Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 drivers/gpu/drm/i915/intel_ddi.c      | 15 ++++-----------
 drivers/gpu/drm/i915/intel_dpll_mgr.c |  2 +-
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 720de7a3f5e6..0a24608ce49b 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1386,8 +1386,7 @@ static int icl_calc_tbt_pll_link(struct drm_i915_private *dev_priv,
 static int icl_calc_mg_pll_link(struct drm_i915_private *dev_priv,
 				const struct intel_dpll_hw_state *pll_state)
 {
-	u32 m1, m2_int, m2_frac, div1, div2, ref_clock;
-	u64 tmp;
+	u32 m1, m2, m2_int, m2_frac, div1, div2, ref_clock;
 
 	ref_clock = dev_priv->cdclk.hw.ref;
 
@@ -1396,6 +1395,7 @@ static int icl_calc_mg_pll_link(struct drm_i915_private *dev_priv,
 	m2_frac = (pll_state->mg_pll_div0 & MG_PLL_DIV0_FRACNEN_H) ?
 		(pll_state->mg_pll_div0 & MG_PLL_DIV0_FBDIV_FRAC_MASK) >>
 		MG_PLL_DIV0_FBDIV_FRAC_SHIFT : 0;
+	m2 = (m2_int << 22) | m2_frac;
 
 	switch (pll_state->mg_clktop2_hsclkctl &
 		MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK) {
@@ -1424,15 +1424,8 @@ static int icl_calc_mg_pll_link(struct drm_i915_private *dev_priv,
 	if (div2 == 0)
 		div2 = 1;
 
-	/*
-	 * Adjust the original formula to delay the division by 2^22 in order to
-	 * minimize possible rounding errors.
-	 */
-	tmp = (u64)m1 * m2_int * ref_clock +
-	      (((u64)m1 * m2_frac * ref_clock) >> 22);
-	tmp = div_u64(tmp, 5 * div1 * div2);
-
-	return tmp;
+	return div_u64(mul_u32_u32(ref_clock * m1, m2),
+		       (5 * div1 * div2) << 22);
 }
 
 static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c
index 29edc369920b..3098c783a615 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c
@@ -2682,7 +2682,7 @@ static bool icl_calc_mg_pll_state(struct intel_crtc_state *crtc_state)
 	}
 	m2div_rem = dco_khz % (refclk_khz * m1div);
 
-	tmp = (u64)m2div_rem * (1 << 22);
+	tmp = (u64)m2div_rem << 22;
 	do_div(tmp, refclk_khz * m1div);
 	m2div_frac = tmp;
 
-- 
2.21.0



More information about the Intel-gfx mailing list