aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-12-09 11:54:16 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-12-11 17:52:15 -0500
commite91e941bd566ae94ed576424c9e8b31bdfc55512 (patch)
treeba681ae911ea1a075961a72f19dd27f35a3df109
parentc7721d3266c71b122f7a6c2b40b0800985b53ce0 (diff)
drm/i915: Fix 66 MHz LVDS SSC freq for gen2
Store the SSC refclock frequency in kHz to get more accuracy. Currently we're pretending that 66 MHz is ~66000 kHz, when in fact it is actually ~66667 kHz. By storing the less rounded kHz value we get a much better accuracy for out pixel clock calculations. Cc: Bruno Prémont <bonbons@linux-vserver.org> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Tested-by: Bruno Prémont <bonbons@linux-vserver.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c8
-rw-r--r--drivers/gpu/drm/i915/intel_display.c13
2 files changed, 10 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index e4fba39631a5..f88e5079a3f5 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -327,12 +327,12 @@ static int intel_bios_ssc_frequency(struct drm_device *dev,
327{ 327{
328 switch (INTEL_INFO(dev)->gen) { 328 switch (INTEL_INFO(dev)->gen) {
329 case 2: 329 case 2:
330 return alternate ? 66 : 48; 330 return alternate ? 66667 : 48000;
331 case 3: 331 case 3:
332 case 4: 332 case 4:
333 return alternate ? 100 : 96; 333 return alternate ? 100000 : 96000;
334 default: 334 default:
335 return alternate ? 100 : 120; 335 return alternate ? 100000 : 120000;
336 } 336 }
337} 337}
338 338
@@ -796,7 +796,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
796 */ 796 */
797 dev_priv->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(dev, 797 dev_priv->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(dev,
798 !HAS_PCH_SPLIT(dev)); 798 !HAS_PCH_SPLIT(dev));
799 DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->vbt.lvds_ssc_freq); 799 DRM_DEBUG_KMS("Set default to SSC at %d kHz\n", dev_priv->vbt.lvds_ssc_freq);
800 800
801 for (port = PORT_A; port < I915_MAX_PORTS; port++) { 801 for (port = PORT_A; port < I915_MAX_PORTS; port++) {
802 struct ddi_vbt_port_info *info = 802 struct ddi_vbt_port_info *info =
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 14e0b80c5641..9404b50ee8c4 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4761,9 +4761,8 @@ static int i9xx_get_refclk(struct drm_crtc *crtc, int num_connectors)
4761 refclk = 100000; 4761 refclk = 100000;
4762 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && 4762 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) &&
4763 intel_panel_use_ssc(dev_priv) && num_connectors < 2) { 4763 intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
4764 refclk = dev_priv->vbt.lvds_ssc_freq * 1000; 4764 refclk = dev_priv->vbt.lvds_ssc_freq;
4765 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n", 4765 DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
4766 refclk / 1000);
4767 } else if (!IS_GEN2(dev)) { 4766 } else if (!IS_GEN2(dev)) {
4768 refclk = 96000; 4767 refclk = 96000;
4769 } else { 4768 } else {
@@ -5909,9 +5908,9 @@ static int ironlake_get_refclk(struct drm_crtc *crtc)
5909 } 5908 }
5910 5909
5911 if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) { 5910 if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
5912 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n", 5911 DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n",
5913 dev_priv->vbt.lvds_ssc_freq); 5912 dev_priv->vbt.lvds_ssc_freq);
5914 return dev_priv->vbt.lvds_ssc_freq * 1000; 5913 return dev_priv->vbt.lvds_ssc_freq;
5915 } 5914 }
5916 5915
5917 return 120000; 5916 return 120000;
@@ -6173,7 +6172,7 @@ static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc,
6173 factor = 21; 6172 factor = 21;
6174 if (is_lvds) { 6173 if (is_lvds) {
6175 if ((intel_panel_use_ssc(dev_priv) && 6174 if ((intel_panel_use_ssc(dev_priv) &&
6176 dev_priv->vbt.lvds_ssc_freq == 100) || 6175 dev_priv->vbt.lvds_ssc_freq == 100000) ||
6177 (HAS_PCH_IBX(dev) && intel_is_dual_link_lvds(dev))) 6176 (HAS_PCH_IBX(dev) && intel_is_dual_link_lvds(dev)))
6178 factor = 25; 6177 factor = 25;
6179 } else if (intel_crtc->config.sdvo_tv_clock) 6178 } else if (intel_crtc->config.sdvo_tv_clock)
@@ -7888,7 +7887,7 @@ static int i9xx_pll_refclk(struct drm_device *dev,
7888 u32 dpll = pipe_config->dpll_hw_state.dpll; 7887 u32 dpll = pipe_config->dpll_hw_state.dpll;
7889 7888
7890 if ((dpll & PLL_REF_INPUT_MASK) == PLLB_REF_INPUT_SPREADSPECTRUMIN) 7889 if ((dpll & PLL_REF_INPUT_MASK) == PLLB_REF_INPUT_SPREADSPECTRUMIN)
7891 return dev_priv->vbt.lvds_ssc_freq * 1000; 7890 return dev_priv->vbt.lvds_ssc_freq;
7892 else if (HAS_PCH_SPLIT(dev)) 7891 else if (HAS_PCH_SPLIT(dev))
7893 return 120000; 7892 return 120000;
7894 else if (!IS_GEN2(dev)) 7893 else if (!IS_GEN2(dev))