aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c8
-rw-r--r--drivers/gpu/drm/i915/intel_display.c74
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c11
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c2
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c11
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c8
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c8
10 files changed, 86 insertions, 40 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 7caf71d52abe..8b16d47280f9 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -371,7 +371,6 @@ struct drm_i915_display_funcs {
371 * fills out the pipe-config with the hw state. */ 371 * fills out the pipe-config with the hw state. */
372 bool (*get_pipe_config)(struct intel_crtc *, 372 bool (*get_pipe_config)(struct intel_crtc *,
373 struct intel_crtc_config *); 373 struct intel_crtc_config *);
374 void (*get_clock)(struct intel_crtc *, struct intel_crtc_config *);
375 int (*crtc_mode_set)(struct drm_crtc *crtc, 374 int (*crtc_mode_set)(struct drm_crtc *crtc,
376 int x, int y, 375 int x, int y,
377 struct drm_framebuffer *old_fb); 376 struct drm_framebuffer *old_fb);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index bcee89b7c43e..384adfba3983 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2071,6 +2071,7 @@
2071 2071
2072/* Gen 4 SDVO/HDMI bits: */ 2072/* Gen 4 SDVO/HDMI bits: */
2073#define SDVO_COLOR_FORMAT_8bpc (0 << 26) 2073#define SDVO_COLOR_FORMAT_8bpc (0 << 26)
2074#define SDVO_COLOR_FORMAT_MASK (7 << 26)
2074#define SDVO_ENCODING_SDVO (0 << 10) 2075#define SDVO_ENCODING_SDVO (0 << 10)
2075#define SDVO_ENCODING_HDMI (2 << 10) 2076#define SDVO_ENCODING_HDMI (2 << 10)
2076#define HDMI_MODE_SELECT_HDMI (1 << 9) /* HDMI only */ 2077#define HDMI_MODE_SELECT_HDMI (1 << 9) /* HDMI only */
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index f5f89c31d71e..6f101d5620e4 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -89,6 +89,7 @@ static void intel_crt_get_config(struct intel_encoder *encoder,
89 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; 89 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
90 struct intel_crt *crt = intel_encoder_to_crt(encoder); 90 struct intel_crt *crt = intel_encoder_to_crt(encoder);
91 u32 tmp, flags = 0; 91 u32 tmp, flags = 0;
92 int dotclock;
92 93
93 tmp = I915_READ(crt->adpa_reg); 94 tmp = I915_READ(crt->adpa_reg);
94 95
@@ -103,6 +104,13 @@ static void intel_crt_get_config(struct intel_encoder *encoder,
103 flags |= DRM_MODE_FLAG_NVSYNC; 104 flags |= DRM_MODE_FLAG_NVSYNC;
104 105
105 pipe_config->adjusted_mode.flags |= flags; 106 pipe_config->adjusted_mode.flags |= flags;
107
108 dotclock = pipe_config->port_clock;
109
110 if (HAS_PCH_SPLIT(dev_priv->dev))
111 ironlake_check_encoder_dotclock(pipe_config, dotclock);
112
113 pipe_config->adjusted_mode.clock = dotclock;
106} 114}
107 115
108/* Note: The caller is required to filter out dpms modes not supported by the 116/* Note: The caller is required to filter out dpms modes not supported by the
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index e1c6a5547f68..6d4093974297 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -47,8 +47,8 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on);
47 47
48static void i9xx_crtc_clock_get(struct intel_crtc *crtc, 48static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
49 struct intel_crtc_config *pipe_config); 49 struct intel_crtc_config *pipe_config);
50static void ironlake_crtc_clock_get(struct intel_crtc *crtc, 50static void ironlake_pch_clock_get(struct intel_crtc *crtc,
51 struct intel_crtc_config *pipe_config); 51 struct intel_crtc_config *pipe_config);
52 52
53static int intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode, 53static int intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode,
54 int x, int y, struct drm_framebuffer *old_fb); 54 int x, int y, struct drm_framebuffer *old_fb);
@@ -5068,6 +5068,8 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
5068 DPLL_PORTB_READY_MASK); 5068 DPLL_PORTB_READY_MASK);
5069 } 5069 }
5070 5070
5071 i9xx_crtc_clock_get(crtc, pipe_config);
5072
5071 return true; 5073 return true;
5072} 5074}
5073 5075
@@ -6026,6 +6028,8 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
6026 pipe_config->pixel_multiplier = 6028 pipe_config->pixel_multiplier =
6027 ((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK) 6029 ((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK)
6028 >> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1; 6030 >> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1;
6031
6032 ironlake_pch_clock_get(crtc, pipe_config);
6029 } else { 6033 } else {
6030 pipe_config->pixel_multiplier = 1; 6034 pipe_config->pixel_multiplier = 1;
6031 } 6035 }
@@ -7433,7 +7437,12 @@ static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
7433 i9xx_clock(refclk, &clock); 7437 i9xx_clock(refclk, &clock);
7434 } 7438 }
7435 7439
7436 pipe_config->adjusted_mode.clock = clock.dot; 7440 /*
7441 * This value includes pixel_multiplier. We will use
7442 * port_clock to compute adjusted_mode.clock in the
7443 * encoder's get_config() function.
7444 */
7445 pipe_config->port_clock = clock.dot;
7437} 7446}
7438 7447
7439int intel_dotclock_calculate(int link_freq, 7448int intel_dotclock_calculate(int link_freq,
@@ -7455,31 +7464,23 @@ int intel_dotclock_calculate(int link_freq,
7455 return div_u64((u64)m_n->link_m * link_freq, m_n->link_n); 7464 return div_u64((u64)m_n->link_m * link_freq, m_n->link_n);
7456} 7465}
7457 7466
7458static void ironlake_crtc_clock_get(struct intel_crtc *crtc, 7467static void ironlake_pch_clock_get(struct intel_crtc *crtc,
7459 struct intel_crtc_config *pipe_config) 7468 struct intel_crtc_config *pipe_config)
7460{ 7469{
7461 struct drm_device *dev = crtc->base.dev; 7470 struct drm_device *dev = crtc->base.dev;
7462 int link_freq; 7471
7472 /* read out port_clock from the DPLL */
7473 i9xx_crtc_clock_get(crtc, pipe_config);
7463 7474
7464 /* 7475 /*
7465 * We need to get the FDI or DP link clock here to derive 7476 * This value does not include pixel_multiplier.
7466 * the M/N dividers. 7477 * We will check that port_clock and adjusted_mode.clock
7467 * 7478 * agree once we know their relationship in the encoder's
7468 * For FDI, we read it from the BIOS or use a fixed 2.7GHz. 7479 * get_config() function.
7469 * For DP, it's either 1.62GHz or 2.7GHz.
7470 * We do our calculations in 10*MHz since we don't need much precison.
7471 */ 7480 */
7472 if (pipe_config->has_pch_encoder) { 7481 pipe_config->adjusted_mode.clock =
7473 link_freq = intel_fdi_link_freq(dev) * 10000; 7482 intel_dotclock_calculate(intel_fdi_link_freq(dev) * 10000,
7474 7483 &pipe_config->fdi_m_n);
7475 pipe_config->adjusted_mode.clock =
7476 intel_dotclock_calculate(link_freq, &pipe_config->fdi_m_n);
7477 } else {
7478 link_freq = pipe_config->port_clock;
7479
7480 pipe_config->adjusted_mode.clock =
7481 intel_dotclock_calculate(link_freq, &pipe_config->dp_m_n);
7482 }
7483} 7484}
7484 7485
7485/** Returns the currently programmed mode of the given pipe. */ 7486/** Returns the currently programmed mode of the given pipe. */
@@ -8895,9 +8896,6 @@ check_crtc_state(struct drm_device *dev)
8895 encoder->get_config(encoder, &pipe_config); 8896 encoder->get_config(encoder, &pipe_config);
8896 } 8897 }
8897 8898
8898 if (dev_priv->display.get_clock)
8899 dev_priv->display.get_clock(crtc, &pipe_config);
8900
8901 WARN(crtc->active != active, 8899 WARN(crtc->active != active,
8902 "crtc active state doesn't match with hw state " 8900 "crtc active state doesn't match with hw state "
8903 "(expected %i, found %i)\n", crtc->active, active); 8901 "(expected %i, found %i)\n", crtc->active, active);
@@ -8972,6 +8970,18 @@ intel_modeset_check_state(struct drm_device *dev)
8972 check_shared_dpll_state(dev); 8970 check_shared_dpll_state(dev);
8973} 8971}
8974 8972
8973void ironlake_check_encoder_dotclock(const struct intel_crtc_config *pipe_config,
8974 int dotclock)
8975{
8976 /*
8977 * FDI already provided one idea for the dotclock.
8978 * Yell if the encoder disagrees.
8979 */
8980 WARN(!intel_fuzzy_clock_check(pipe_config->adjusted_mode.clock, dotclock),
8981 "FDI dotclock and encoder dotclock mismatch, fdi: %i, encoder: %i\n",
8982 pipe_config->adjusted_mode.clock, dotclock);
8983}
8984
8975static int __intel_set_mode(struct drm_crtc *crtc, 8985static int __intel_set_mode(struct drm_crtc *crtc,
8976 struct drm_display_mode *mode, 8986 struct drm_display_mode *mode,
8977 int x, int y, struct drm_framebuffer *fb) 8987 int x, int y, struct drm_framebuffer *fb)
@@ -9923,7 +9933,6 @@ static void intel_init_display(struct drm_device *dev)
9923 dev_priv->display.update_plane = ironlake_update_plane; 9933 dev_priv->display.update_plane = ironlake_update_plane;
9924 } else if (HAS_PCH_SPLIT(dev)) { 9934 } else if (HAS_PCH_SPLIT(dev)) {
9925 dev_priv->display.get_pipe_config = ironlake_get_pipe_config; 9935 dev_priv->display.get_pipe_config = ironlake_get_pipe_config;
9926 dev_priv->display.get_clock = ironlake_crtc_clock_get;
9927 dev_priv->display.crtc_mode_set = ironlake_crtc_mode_set; 9936 dev_priv->display.crtc_mode_set = ironlake_crtc_mode_set;
9928 dev_priv->display.crtc_enable = ironlake_crtc_enable; 9937 dev_priv->display.crtc_enable = ironlake_crtc_enable;
9929 dev_priv->display.crtc_disable = ironlake_crtc_disable; 9938 dev_priv->display.crtc_disable = ironlake_crtc_disable;
@@ -9931,7 +9940,6 @@ static void intel_init_display(struct drm_device *dev)
9931 dev_priv->display.update_plane = ironlake_update_plane; 9940 dev_priv->display.update_plane = ironlake_update_plane;
9932 } else if (IS_VALLEYVIEW(dev)) { 9941 } else if (IS_VALLEYVIEW(dev)) {
9933 dev_priv->display.get_pipe_config = i9xx_get_pipe_config; 9942 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
9934 dev_priv->display.get_clock = i9xx_crtc_clock_get;
9935 dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set; 9943 dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set;
9936 dev_priv->display.crtc_enable = valleyview_crtc_enable; 9944 dev_priv->display.crtc_enable = valleyview_crtc_enable;
9937 dev_priv->display.crtc_disable = i9xx_crtc_disable; 9945 dev_priv->display.crtc_disable = i9xx_crtc_disable;
@@ -9939,7 +9947,6 @@ static void intel_init_display(struct drm_device *dev)
9939 dev_priv->display.update_plane = i9xx_update_plane; 9947 dev_priv->display.update_plane = i9xx_update_plane;
9940 } else { 9948 } else {
9941 dev_priv->display.get_pipe_config = i9xx_get_pipe_config; 9949 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
9942 dev_priv->display.get_clock = i9xx_crtc_clock_get;
9943 dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set; 9950 dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set;
9944 dev_priv->display.crtc_enable = i9xx_crtc_enable; 9951 dev_priv->display.crtc_enable = i9xx_crtc_enable;
9945 dev_priv->display.crtc_disable = i9xx_crtc_disable; 9952 dev_priv->display.crtc_disable = i9xx_crtc_disable;
@@ -10553,15 +10560,6 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
10553 pipe); 10560 pipe);
10554 } 10561 }
10555 10562
10556 list_for_each_entry(crtc, &dev->mode_config.crtc_list,
10557 base.head) {
10558 if (!crtc->active)
10559 continue;
10560 if (dev_priv->display.get_clock)
10561 dev_priv->display.get_clock(crtc,
10562 &crtc->config);
10563 }
10564
10565 list_for_each_entry(connector, &dev->mode_config.connector_list, 10563 list_for_each_entry(connector, &dev->mode_config.connector_list,
10566 base.head) { 10564 base.head) {
10567 if (connector->get_hw_state(connector)) { 10565 if (connector->get_hw_state(connector)) {
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 9ba697cc1499..a7fa6fd7545e 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1417,6 +1417,7 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
1417 struct drm_i915_private *dev_priv = dev->dev_private; 1417 struct drm_i915_private *dev_priv = dev->dev_private;
1418 enum port port = dp_to_dig_port(intel_dp)->port; 1418 enum port port = dp_to_dig_port(intel_dp)->port;
1419 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 1419 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
1420 int dotclock;
1420 1421
1421 if ((port == PORT_A) || !HAS_PCH_CPT(dev)) { 1422 if ((port == PORT_A) || !HAS_PCH_CPT(dev)) {
1422 tmp = I915_READ(intel_dp->output_reg); 1423 tmp = I915_READ(intel_dp->output_reg);
@@ -1448,12 +1449,20 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
1448 1449
1449 intel_dp_get_m_n(crtc, pipe_config); 1450 intel_dp_get_m_n(crtc, pipe_config);
1450 1451
1451 if (dp_to_dig_port(intel_dp)->port == PORT_A) { 1452 if (port == PORT_A) {
1452 if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_160MHZ) 1453 if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_160MHZ)
1453 pipe_config->port_clock = 162000; 1454 pipe_config->port_clock = 162000;
1454 else 1455 else
1455 pipe_config->port_clock = 270000; 1456 pipe_config->port_clock = 270000;
1456 } 1457 }
1458
1459 dotclock = intel_dotclock_calculate(pipe_config->port_clock,
1460 &pipe_config->dp_m_n);
1461
1462 if (HAS_PCH_SPLIT(dev_priv->dev) && port != PORT_A)
1463 ironlake_check_encoder_dotclock(pipe_config, dotclock);
1464
1465 pipe_config->adjusted_mode.clock = dotclock;
1457} 1466}
1458 1467
1459static bool is_edp_psr(struct intel_dp *intel_dp) 1468static bool is_edp_psr(struct intel_dp *intel_dp)
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 93606949bc91..e87ba822deb8 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -805,5 +805,7 @@ extern void intel_dp_get_m_n(struct intel_crtc *crtc,
805 struct intel_crtc_config *pipe_config); 805 struct intel_crtc_config *pipe_config);
806extern int intel_dotclock_calculate(int link_freq, 806extern int intel_dotclock_calculate(int link_freq,
807 const struct intel_link_m_n *m_n); 807 const struct intel_link_m_n *m_n);
808extern void ironlake_check_encoder_dotclock(const struct intel_crtc_config *pipe_config,
809 int dotclock);
808 810
809#endif /* __INTEL_DRV_H__ */ 811#endif /* __INTEL_DRV_H__ */
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index ef5c12a1deda..fe65c7270f06 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -153,6 +153,8 @@ static void intel_dvo_get_config(struct intel_encoder *encoder,
153 flags |= DRM_MODE_FLAG_NVSYNC; 153 flags |= DRM_MODE_FLAG_NVSYNC;
154 154
155 pipe_config->adjusted_mode.flags |= flags; 155 pipe_config->adjusted_mode.flags |= flags;
156
157 pipe_config->adjusted_mode.clock = pipe_config->port_clock;
156} 158}
157 159
158static void intel_disable_dvo(struct intel_encoder *encoder) 160static void intel_disable_dvo(struct intel_encoder *encoder)
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 70c716ed8350..17b2d7e948b6 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -713,6 +713,7 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder,
713 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); 713 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
714 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; 714 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
715 u32 tmp, flags = 0; 715 u32 tmp, flags = 0;
716 int dotclock;
716 717
717 tmp = I915_READ(intel_hdmi->hdmi_reg); 718 tmp = I915_READ(intel_hdmi->hdmi_reg);
718 719
@@ -727,6 +728,16 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder,
727 flags |= DRM_MODE_FLAG_NVSYNC; 728 flags |= DRM_MODE_FLAG_NVSYNC;
728 729
729 pipe_config->adjusted_mode.flags |= flags; 730 pipe_config->adjusted_mode.flags |= flags;
731
732 if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
733 dotclock = pipe_config->port_clock * 2 / 3;
734 else
735 dotclock = pipe_config->port_clock;
736
737 if (HAS_PCH_SPLIT(dev_priv->dev))
738 ironlake_check_encoder_dotclock(pipe_config, dotclock);
739
740 pipe_config->adjusted_mode.clock = dotclock;
730} 741}
731 742
732static void intel_enable_hdmi(struct intel_encoder *encoder) 743static void intel_enable_hdmi(struct intel_encoder *encoder)
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 831a5c021c4b..05e5485a630f 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -92,6 +92,7 @@ static void intel_lvds_get_config(struct intel_encoder *encoder,
92 struct drm_device *dev = encoder->base.dev; 92 struct drm_device *dev = encoder->base.dev;
93 struct drm_i915_private *dev_priv = dev->dev_private; 93 struct drm_i915_private *dev_priv = dev->dev_private;
94 u32 lvds_reg, tmp, flags = 0; 94 u32 lvds_reg, tmp, flags = 0;
95 int dotclock;
95 96
96 if (HAS_PCH_SPLIT(dev)) 97 if (HAS_PCH_SPLIT(dev))
97 lvds_reg = PCH_LVDS; 98 lvds_reg = PCH_LVDS;
@@ -116,6 +117,13 @@ static void intel_lvds_get_config(struct intel_encoder *encoder,
116 117
117 pipe_config->gmch_pfit.control |= tmp & PANEL_8TO6_DITHER_ENABLE; 118 pipe_config->gmch_pfit.control |= tmp & PANEL_8TO6_DITHER_ENABLE;
118 } 119 }
120
121 dotclock = pipe_config->port_clock;
122
123 if (HAS_PCH_SPLIT(dev_priv->dev))
124 ironlake_check_encoder_dotclock(pipe_config, dotclock);
125
126 pipe_config->adjusted_mode.clock = dotclock;
119} 127}
120 128
121/* The LVDS pin pair needs to be on before the DPLLs are enabled. 129/* The LVDS pin pair needs to be on before the DPLLs are enabled.
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 393b7a502291..8aa7be588f7f 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1316,6 +1316,7 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
1316 struct intel_sdvo *intel_sdvo = to_sdvo(encoder); 1316 struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
1317 struct intel_sdvo_dtd dtd; 1317 struct intel_sdvo_dtd dtd;
1318 int encoder_pixel_multiplier = 0; 1318 int encoder_pixel_multiplier = 0;
1319 int dotclock;
1319 u32 flags = 0, sdvox; 1320 u32 flags = 0, sdvox;
1320 u8 val; 1321 u8 val;
1321 bool ret; 1322 bool ret;
@@ -1354,6 +1355,13 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
1354 >> SDVO_PORT_MULTIPLY_SHIFT) + 1; 1355 >> SDVO_PORT_MULTIPLY_SHIFT) + 1;
1355 } 1356 }
1356 1357
1358 dotclock = pipe_config->port_clock / pipe_config->pixel_multiplier;
1359
1360 if (HAS_PCH_SPLIT(dev))
1361 ironlake_check_encoder_dotclock(pipe_config, dotclock);
1362
1363 pipe_config->adjusted_mode.clock = dotclock;
1364
1357 /* Cross check the port pixel multiplier with the sdvo encoder state. */ 1365 /* Cross check the port pixel multiplier with the sdvo encoder state. */
1358 if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_CLOCK_RATE_MULT, 1366 if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_CLOCK_RATE_MULT,
1359 &val, 1)) { 1367 &val, 1)) {