aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2017-10-27 09:43:48 -0400
committerVille Syrjälä <ville.syrjala@linux.intel.com>2017-10-27 15:14:37 -0400
commit5161d058dff4d53c78a046350d64beff54e9a9f7 (patch)
treec07321569a956dcbff1f64944a72cfa0f2c03b8e /drivers/gpu/drm
parent742745f1ee4f5a36e5cc5e8b360b519df45efa89 (diff)
drm/i915: Fix BXT lane latency optimal setting with MST
Call the DDI .pre_pll_enable() hook from the MST code so that BXT gets the correct lane latency optimal setting applied. And we obviously need to compute the correct value, and read it out to keep the state checker happy. While at it drop the useless 'encoder' parameter to bxt_ddi_phy_calc_lane_lat_optim_mask() Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Imre Deak <imre.deak@intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171027134348.31190-1-ville.syrjala@linux.intel.com Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c3
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c23
-rw-r--r--drivers/gpu/drm/i915/intel_dpio_phy.c3
4 files changed, 26 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 61c155cbf9d7..c0a716e596ba 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -4179,8 +4179,7 @@ bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv,
4179 enum dpio_phy phy); 4179 enum dpio_phy phy);
4180bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv, 4180bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
4181 enum dpio_phy phy); 4181 enum dpio_phy phy);
4182uint8_t bxt_ddi_phy_calc_lane_lat_optim_mask(struct intel_encoder *encoder, 4182uint8_t bxt_ddi_phy_calc_lane_lat_optim_mask(uint8_t lane_count);
4183 uint8_t lane_count);
4184void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder, 4183void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
4185 uint8_t lane_lat_optim_mask); 4184 uint8_t lane_lat_optim_mask);
4186uint8_t bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder); 4185uint8_t bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder);
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index c721775687e7..9c118e5305f7 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2662,8 +2662,7 @@ static bool intel_ddi_compute_config(struct intel_encoder *encoder,
2662 2662
2663 if (IS_GEN9_LP(dev_priv) && ret) 2663 if (IS_GEN9_LP(dev_priv) && ret)
2664 pipe_config->lane_lat_optim_mask = 2664 pipe_config->lane_lat_optim_mask =
2665 bxt_ddi_phy_calc_lane_lat_optim_mask(encoder, 2665 bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
2666 pipe_config->lane_count);
2667 2666
2668 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config); 2667 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
2669 2668
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 3d62c63c0763..c34ffa959e90 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -88,6 +88,10 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
88 88
89 pipe_config->dp_m_n.tu = slots; 89 pipe_config->dp_m_n.tu = slots;
90 90
91 if (IS_GEN9_LP(dev_priv))
92 pipe_config->lane_lat_optim_mask =
93 bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
94
91 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config); 95 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
92 96
93 return true; 97 return true;
@@ -182,6 +186,20 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
182 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links); 186 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
183} 187}
184 188
189static void intel_mst_pre_pll_enable_dp(struct intel_encoder *encoder,
190 const struct intel_crtc_state *pipe_config,
191 const struct drm_connector_state *conn_state)
192{
193 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
194 struct intel_digital_port *intel_dig_port = intel_mst->primary;
195 struct intel_dp *intel_dp = &intel_dig_port->dp;
196
197 if (intel_dp->active_mst_links == 0 &&
198 intel_dig_port->base.pre_pll_enable)
199 intel_dig_port->base.pre_pll_enable(&intel_dig_port->base,
200 pipe_config, NULL);
201}
202
185static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, 203static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
186 const struct intel_crtc_state *pipe_config, 204 const struct intel_crtc_state *pipe_config,
187 const struct drm_connector_state *conn_state) 205 const struct drm_connector_state *conn_state)
@@ -311,6 +329,10 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
311 329
312 intel_ddi_clock_get(&intel_dig_port->base, pipe_config); 330 intel_ddi_clock_get(&intel_dig_port->base, pipe_config);
313 331
332 if (IS_GEN9_LP(dev_priv))
333 pipe_config->lane_lat_optim_mask =
334 bxt_ddi_phy_get_lane_lat_optim_mask(encoder);
335
314 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config); 336 intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
315} 337}
316 338
@@ -582,6 +604,7 @@ intel_dp_create_fake_mst_encoder(struct intel_digital_port *intel_dig_port, enum
582 intel_encoder->compute_config = intel_dp_mst_compute_config; 604 intel_encoder->compute_config = intel_dp_mst_compute_config;
583 intel_encoder->disable = intel_mst_disable_dp; 605 intel_encoder->disable = intel_mst_disable_dp;
584 intel_encoder->post_disable = intel_mst_post_disable_dp; 606 intel_encoder->post_disable = intel_mst_post_disable_dp;
607 intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp;
585 intel_encoder->pre_enable = intel_mst_pre_enable_dp; 608 intel_encoder->pre_enable = intel_mst_pre_enable_dp;
586 intel_encoder->enable = intel_mst_enable_dp; 609 intel_encoder->enable = intel_mst_enable_dp;
587 intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state; 610 intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
diff --git a/drivers/gpu/drm/i915/intel_dpio_phy.c b/drivers/gpu/drm/i915/intel_dpio_phy.c
index de38d014ed39..63b76eac018f 100644
--- a/drivers/gpu/drm/i915/intel_dpio_phy.c
+++ b/drivers/gpu/drm/i915/intel_dpio_phy.c
@@ -567,8 +567,7 @@ bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
567} 567}
568 568
569uint8_t 569uint8_t
570bxt_ddi_phy_calc_lane_lat_optim_mask(struct intel_encoder *encoder, 570bxt_ddi_phy_calc_lane_lat_optim_mask(uint8_t lane_count)
571 uint8_t lane_count)
572{ 571{
573 switch (lane_count) { 572 switch (lane_count) {
574 case 1: 573 case 1: