diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2016-02-17 14:41:12 -0500 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2016-03-01 06:05:43 -0500 |
commit | 8802e5b6de51ebbedb8a03e816ca847d860e07f5 (patch) | |
tree | d3cb271f5380db637bb7a750fd0219ef9dd4266d /drivers/gpu/drm/i915/intel_display.c | |
parent | 64b46a06313634cf9ce5808ebd63dc82573be34c (diff) |
drm/i915: Read out VGA dotclock properly on LPT
Rather than assume the VGA dotclock is really the FDI based thing,
let's read out the real thing via iclkip, and after readout it'll
get to compare it with the FDI based number to make sure they're
in sync.
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1455738073-14502-6-git-send-email-ville.syrjala@linux.intel.com
Reviewed-by: Imre Deak <imre.deak@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 1f3552397689..44fcff0343f2 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -4105,6 +4105,43 @@ static void lpt_program_iclkip(struct drm_crtc *crtc) | |||
4105 | I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE); | 4105 | I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE); |
4106 | } | 4106 | } |
4107 | 4107 | ||
4108 | int lpt_get_iclkip(struct drm_i915_private *dev_priv) | ||
4109 | { | ||
4110 | u32 divsel, phaseinc, auxdiv; | ||
4111 | u32 iclk_virtual_root_freq = 172800 * 1000; | ||
4112 | u32 iclk_pi_range = 64; | ||
4113 | u32 desired_divisor; | ||
4114 | u32 temp; | ||
4115 | |||
4116 | if ((I915_READ(PIXCLK_GATE) & PIXCLK_GATE_UNGATE) == 0) | ||
4117 | return 0; | ||
4118 | |||
4119 | mutex_lock(&dev_priv->sb_lock); | ||
4120 | |||
4121 | temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK); | ||
4122 | if (temp & SBI_SSCCTL_DISABLE) { | ||
4123 | mutex_unlock(&dev_priv->sb_lock); | ||
4124 | return 0; | ||
4125 | } | ||
4126 | |||
4127 | temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK); | ||
4128 | divsel = (temp & SBI_SSCDIVINTPHASE_DIVSEL_MASK) >> | ||
4129 | SBI_SSCDIVINTPHASE_DIVSEL_SHIFT; | ||
4130 | phaseinc = (temp & SBI_SSCDIVINTPHASE_INCVAL_MASK) >> | ||
4131 | SBI_SSCDIVINTPHASE_INCVAL_SHIFT; | ||
4132 | |||
4133 | temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK); | ||
4134 | auxdiv = (temp & SBI_SSCAUXDIV_FINALDIV2SEL_MASK) >> | ||
4135 | SBI_SSCAUXDIV_FINALDIV2SEL_SHIFT; | ||
4136 | |||
4137 | mutex_unlock(&dev_priv->sb_lock); | ||
4138 | |||
4139 | desired_divisor = (divsel + 2) * iclk_pi_range + phaseinc; | ||
4140 | |||
4141 | return DIV_ROUND_CLOSEST(iclk_virtual_root_freq, | ||
4142 | desired_divisor << auxdiv); | ||
4143 | } | ||
4144 | |||
4108 | static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc, | 4145 | static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc, |
4109 | enum pipe pch_transcoder) | 4146 | enum pipe pch_transcoder) |
4110 | { | 4147 | { |