| From 4395f23a2af9250ec17528c7fbccdf7b3a16badc Mon Sep 17 00:00:00 2001 |
| From: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Date: Fri, 3 May 2013 17:23:42 -0300 |
| Subject: drm/i915: make intel_ddi_get_cdclk_freq return values in KHz |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| With this, that 338 can finally become the correct 337500. |
| |
| Due to the change we need to adjust the intel_dp_aux_ch function to |
| set the correct value, so adjust the division and also use |
| DIV_ROUND_CLOSEST instead of the old "round down" behavior because the |
| spec says the value "should be programmed to get as close as possible |
| to the ideal rate of 2MHz". |
| |
| Quoting Paulo's follow-up to a question from Chris Wilson to explain |
| what exactly will change: |
| |
| I use the 337500 value on the next patch, when setting the |
| ips_linetime value. The correct frequency is 337500, not 338000. |
| |
| ips_linetime = DIV_ROUND_CLOSEST(mode->htotal * 1000 * 8, |
| intel_ddi_get_cdclk_freq); |
| For a mode with htotal of 2640 [0] we'll have: (i) (2640 * 1000 * 8) / |
| 338000 = 62.48, resulting in 62 and (ii) (2640 * 1000 * 8) / 337500 = |
| 62.57 resulting in 63. |
| |
| For the case inside intel_dp.c: |
| Previously we were using 338. So with the old formula we were writing |
| 338/2 = 169 to the register. And 337500 / 169 = 1997.04 (we use 337500 |
| here because it's the real clock value). With the new value of |
| 337500/2000 we'll have 168.75, which is 168 on the round-down case and |
| 169 on the round-closest case. If we write 168 to the register, 337500 |
| / 168 = 2008.92, and 2008.92 is more distant from 2000 than 1997.04. |
| So with this patch we're changing the formula but still writing the |
| same correct value to the DP AUX register. |
| |
| [0]: That's 1920x1080@50Hz on my DP monitor. |
| |
| Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| [danvet: Pimp the commit message with Paulo's follow-up.] |
| Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| (cherry picked from commit b2b877ffe37d699f77f45e993590b66010491c52) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_ddi.c | 10 +++++----- |
| drivers/gpu/drm/i915/intel_dp.c | 3 ++- |
| 2 files changed, 7 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/intel_ddi.c |
| +++ b/drivers/gpu/drm/i915/intel_ddi.c |
| @@ -1160,14 +1160,14 @@ static void intel_disable_ddi(struct int |
| int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv) |
| { |
| if (I915_READ(HSW_FUSE_STRAP) & HSW_CDCLK_LIMIT) |
| - return 450; |
| + return 450000; |
| else if ((I915_READ(LCPLL_CTL) & LCPLL_CLK_FREQ_MASK) == |
| LCPLL_CLK_FREQ_450) |
| - return 450; |
| + return 450000; |
| else if (IS_ULT(dev_priv->dev)) |
| - return 338; |
| + return 337500; |
| else |
| - return 540; |
| + return 540000; |
| } |
| |
| void intel_ddi_pll_init(struct drm_device *dev) |
| @@ -1180,7 +1180,7 @@ void intel_ddi_pll_init(struct drm_devic |
| * Don't even try to turn it on. |
| */ |
| |
| - DRM_DEBUG_KMS("CDCLK running at %dMHz\n", |
| + DRM_DEBUG_KMS("CDCLK running at %dKHz\n", |
| intel_ddi_get_cdclk_freq(dev_priv)); |
| |
| if (val & LCPLL_CD_SOURCE_FCLK) |
| --- a/drivers/gpu/drm/i915/intel_dp.c |
| +++ b/drivers/gpu/drm/i915/intel_dp.c |
| @@ -319,7 +319,8 @@ intel_dp_aux_ch(struct intel_dp *intel_d |
| */ |
| if (is_cpu_edp(intel_dp)) { |
| if (HAS_DDI(dev)) |
| - aux_clock_divider = intel_ddi_get_cdclk_freq(dev_priv) >> 1; |
| + aux_clock_divider = DIV_ROUND_CLOSEST( |
| + intel_ddi_get_cdclk_freq(dev_priv), 2000); |
| else if (IS_VALLEYVIEW(dev)) |
| aux_clock_divider = 100; |
| else if (IS_GEN6(dev) || IS_GEN7(dev)) |