static void vlv_steal_power_sequencer(struct drm_device *dev,
                                      enum pipe pipe);
 
-int
-intel_dp_max_link_bw(struct intel_dp *intel_dp)
+static int
+intel_dp_max_link_bw(struct intel_dp  *intel_dp)
 {
        int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE];
 
        return rates[rate_to_index(0, rates) - 1];
 }
 
+int intel_dp_rate_select(struct intel_dp *intel_dp, int rate)
+{
+       return rate_to_index(rate, intel_dp->supported_rates);
+}
+
 bool
 intel_dp_compute_config(struct intel_encoder *encoder,
                        struct intel_crtc_state *pipe_config)
        if (intel_dp->num_supported_rates) {
                intel_dp->link_bw = 0;
                intel_dp->rate_select =
-                       rate_to_index(supported_rates[clock],
-                                     intel_dp->supported_rates);
+                       intel_dp_rate_select(intel_dp, supported_rates[clock]);
        } else {
                intel_dp->link_bw =
                        drm_dp_link_rate_to_bw_code(supported_rates[clock]);
 
        struct intel_dp *intel_dp = &intel_dig_port->dp;
        struct drm_device *dev = encoder->base.dev;
        int bpp;
-       int lane_count, slots;
+       int lane_count, slots, rate;
        struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
        struct intel_connector *found = NULL, *intel_connector;
        int mst_pbn;
         * seem to suggest we should do otherwise.
         */
        lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
-       intel_dp->link_bw = intel_dp_max_link_bw(intel_dp);
+
+       rate = intel_dp_max_link_rate(intel_dp);
+
+       if (intel_dp->num_supported_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->pipe_bpp = 24;
-       pipe_config->port_clock = drm_dp_bw_code_to_link_rate(intel_dp->link_bw);
+       pipe_config->port_clock = rate;
 
        for_each_intel_connector(dev, intel_connector) {
                if (intel_connector->new_encoder == encoder) {
 
 void intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector);
 void intel_dp_mst_suspend(struct drm_device *dev);
 void intel_dp_mst_resume(struct drm_device *dev);
-int intel_dp_max_link_bw(struct intel_dp *intel_dp);
 int intel_dp_max_link_rate(struct intel_dp *intel_dp);
+int intel_dp_rate_select(struct intel_dp *intel_dp, int rate);
 void intel_dp_hot_plug(struct intel_encoder *intel_encoder);
 void vlv_power_sequencer_reset(struct drm_i915_private *dev_priv);
 uint32_t intel_dp_pack_aux(const uint8_t *src, int src_bytes);