diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2013-12-09 11:54:16 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-12-11 17:52:15 -0500 |
commit | e91e941bd566ae94ed576424c9e8b31bdfc55512 (patch) | |
tree | ba681ae911ea1a075961a72f19dd27f35a3df109 | |
parent | c7721d3266c71b122f7a6c2b40b0800985b53ce0 (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.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 13 |
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)) |