]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/i915/intel_dp.c
Merge remote-tracking branch 'drm-intel/for-linux-next'
[karo-tx-linux.git] / drivers / gpu / drm / i915 / intel_dp.c
index 796e3d313cb975efc3797a39b15beb8e55ab7f92..a073f04a5330794a3056cfa2fc8152170f1e4500 100644 (file)
@@ -157,14 +157,9 @@ intel_dp_max_link_bw(struct intel_dp  *intel_dp)
 static u8 intel_dp_max_lane_count(struct intel_dp *intel_dp)
 {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = intel_dig_port->base.base.dev;
        u8 source_max, sink_max;
 
-       source_max = 4;
-       if (HAS_DDI(dev) && intel_dig_port->port == PORT_A &&
-           (intel_dig_port->saved_port_bits & DDI_A_4_LANES) == 0)
-               source_max = 2;
-
+       source_max = intel_dig_port->max_lanes;
        sink_max = drm_dp_max_lane_count(intel_dp->dpcd);
 
        return min(source_max, sink_max);
@@ -340,8 +335,12 @@ vlv_power_sequencer_kick(struct intel_dp *intel_dp)
                release_cl_override = IS_CHERRYVIEW(dev) &&
                        !chv_phy_powergate_ch(dev_priv, phy, ch, true);
 
-               vlv_force_pll_on(dev, pipe, IS_CHERRYVIEW(dev) ?
-                                &chv_dpll[0].dpll : &vlv_dpll[0].dpll);
+               if (vlv_force_pll_on(dev, pipe, IS_CHERRYVIEW(dev) ?
+                                    &chv_dpll[0].dpll : &vlv_dpll[0].dpll)) {
+                       DRM_ERROR("Failed to force on pll for pipe %c!\n",
+                                 pipe_name(pipe));
+                       return;
+               }
        }
 
        /*
@@ -980,7 +979,10 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
                if (WARN_ON(txsize > 20))
                        return -E2BIG;
 
-               memcpy(txbuf + HEADER_SIZE, msg->buffer, msg->size);
+               if (msg->buffer)
+                       memcpy(txbuf + HEADER_SIZE, msg->buffer, msg->size);
+               else
+                       WARN_ON(msg->size);
 
                ret = intel_dp_aux_ch(intel_dp, txbuf, txsize, rxbuf, rxsize);
                if (ret > 0) {
@@ -2243,11 +2245,6 @@ static void intel_edp_backlight_power(struct intel_connector *connector,
                _intel_edp_backlight_off(intel_dp);
 }
 
-static const char *state_string(bool enabled)
-{
-       return enabled ? "on" : "off";
-}
-
 static void assert_dp_port(struct intel_dp *intel_dp, bool state)
 {
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
@@ -2257,7 +2254,7 @@ static void assert_dp_port(struct intel_dp *intel_dp, bool state)
        I915_STATE_WARN(cur_state != state,
                        "DP port %c state assertion failure (expected %s, current %s)\n",
                        port_name(dig_port->port),
-                       state_string(state), state_string(cur_state));
+                       onoff(state), onoff(cur_state));
 }
 #define assert_dp_port_disabled(d) assert_dp_port((d), false)
 
@@ -2267,7 +2264,7 @@ static void assert_edp_pll(struct drm_i915_private *dev_priv, bool state)
 
        I915_STATE_WARN(cur_state != state,
                        "eDP PLL state assertion failure (expected %s, current %s)\n",
-                       state_string(state), state_string(cur_state));
+                       onoff(state), onoff(cur_state));
 }
 #define assert_edp_pll_enabled(d) assert_edp_pll((d), true)
 #define assert_edp_pll_disabled(d) assert_edp_pll((d), false)
@@ -4014,7 +4011,7 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp)
        } while (--attempts && count);
 
        if (attempts == 0) {
-               DRM_ERROR("TIMEOUT: Sink CRC counter is not zeroed\n");
+               DRM_DEBUG_KMS("TIMEOUT: Sink CRC counter is not zeroed after calculation is stopped\n");
                ret = -ETIMEDOUT;
        }
 
@@ -5839,6 +5836,11 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
        enum port port = intel_dig_port->port;
        int type, ret;
 
+       if (WARN(intel_dig_port->max_lanes < 1,
+                "Not enough lanes (%d) for DP on port %c\n",
+                intel_dig_port->max_lanes, port_name(port)))
+               return false;
+
        intel_dp->pps_pipe = INVALID_PIPE;
 
        /* intel_dp vfuncs */
@@ -6037,6 +6039,7 @@ intel_dp_init(struct drm_device *dev,
        intel_dig_port->port = port;
        dev_priv->dig_port_map[port] = intel_encoder;
        intel_dig_port->dp.output_reg = output_reg;
+       intel_dig_port->max_lanes = 4;
 
        intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
        if (IS_CHERRYVIEW(dev)) {