]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/gpu/drm/i915/intel_dp_mst.c
Merge tag 'v4.4-rc2' into drm-intel-next-queued
[mirror_ubuntu-zesty-kernel.git] / drivers / gpu / drm / i915 / intel_dp_mst.c
index 6ade068884328680ffe024dd91eabb9ffe6d9013..8c4e7dfe304c95047cab187499dd971a6e44f0ba 100644 (file)
@@ -39,8 +39,8 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
        struct intel_dp *intel_dp = &intel_dig_port->dp;
        struct drm_atomic_state *state;
        int bpp, i;
-       int lane_count, slots, rate;
-       struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
+       int lane_count, slots;
+       const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
        struct drm_connector *drm_connector;
        struct intel_connector *connector, *found = NULL;
        struct drm_connector_state *connector_state;
@@ -56,20 +56,11 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
         */
        lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
 
-       rate = intel_dp_max_link_rate(intel_dp);
 
-       if (intel_dp->num_sink_rates) {
-               intel_dp->link_bw = 0;
-               intel_dp->rate_select = intel_dp_rate_select(intel_dp, rate);
-       } else {
-               intel_dp->link_bw = drm_dp_link_rate_to_bw_code(rate);
-               intel_dp->rate_select = 0;
-       }
-
-       intel_dp->lane_count = lane_count;
+       pipe_config->lane_count = lane_count;
 
        pipe_config->pipe_bpp = 24;
-       pipe_config->port_clock = rate;
+       pipe_config->port_clock = intel_dp_max_link_rate(intel_dp);
 
        state = pipe_config->base.state;
 
@@ -87,7 +78,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
                return false;
        }
 
-       mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->clock, bpp);
+       mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock, bpp);
 
        pipe_config->pbn = mst_pbn;
        slots = drm_dp_find_vcpi_slots(&intel_dp->mst_mgr, mst_pbn);
@@ -182,20 +173,15 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
        intel_mst->port = found->port;
 
        if (intel_dp->active_mst_links == 0) {
-               enum port port = intel_ddi_get_encoder_port(encoder);
+               intel_ddi_clk_select(encoder, intel_crtc->config);
 
-               /* FIXME: add support for SKL */
-               if (INTEL_INFO(dev)->gen < 9)
-                       I915_WRITE(PORT_CLK_SEL(port),
-                                  intel_crtc->config->ddi_pll_sel);
+               intel_dp_set_link_params(intel_dp, intel_crtc->config);
 
                intel_ddi_init_dp_buf_reg(&intel_dig_port->base);
 
                intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
 
-
                intel_dp_start_link_train(intel_dp);
-               intel_dp_complete_link_train(intel_dp);
                intel_dp_stop_link_train(intel_dp);
        }
 
@@ -286,6 +272,10 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
                break;
        }
        pipe_config->base.adjusted_mode.flags |= flags;
+
+       pipe_config->lane_count =
+               ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
+
        intel_dp_get_m_n(crtc, pipe_config);
 
        intel_ddi_clock_get(&intel_dig_port->base, pipe_config);
@@ -418,7 +408,10 @@ static void intel_connector_add_to_fbdev(struct intel_connector *connector)
 {
 #ifdef CONFIG_DRM_FBDEV_EMULATION
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-       drm_fb_helper_add_one_connector(&dev_priv->fbdev->helper, &connector->base);
+
+       if (dev_priv->fbdev)
+               drm_fb_helper_add_one_connector(&dev_priv->fbdev->helper,
+                                               &connector->base);
 #endif
 }
 
@@ -426,7 +419,10 @@ static void intel_connector_remove_from_fbdev(struct intel_connector *connector)
 {
 #ifdef CONFIG_DRM_FBDEV_EMULATION
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-       drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper, &connector->base);
+
+       if (dev_priv->fbdev)
+               drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper,
+                                                  &connector->base);
 #endif
 }