diff options
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 74 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 8 |
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 | ||
48 | static void i9xx_crtc_clock_get(struct intel_crtc *crtc, | 48 | static void i9xx_crtc_clock_get(struct intel_crtc *crtc, |
49 | struct intel_crtc_config *pipe_config); | 49 | struct intel_crtc_config *pipe_config); |
50 | static void ironlake_crtc_clock_get(struct intel_crtc *crtc, | 50 | static 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 | ||
53 | static int intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode, | 53 | static 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 | ||
7439 | int intel_dotclock_calculate(int link_freq, | 7448 | int 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 | ||
7458 | static void ironlake_crtc_clock_get(struct intel_crtc *crtc, | 7467 | static 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 | ||
8973 | void 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 | |||
8975 | static int __intel_set_mode(struct drm_crtc *crtc, | 8985 | static 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 | ||
1459 | static bool is_edp_psr(struct intel_dp *intel_dp) | 1468 | static 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); |
806 | extern int intel_dotclock_calculate(int link_freq, | 806 | extern 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); |
808 | extern 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 | ||
158 | static void intel_disable_dvo(struct intel_encoder *encoder) | 160 | static 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 | ||
732 | static void intel_enable_hdmi(struct intel_encoder *encoder) | 743 | static 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)) { |