]> Git Repo - linux.git/commitdiff
Merge remote-tracking branch 'airlied/drm-next' into topic/drm-misc
authorDaniel Vetter <[email protected]>
Tue, 25 Oct 2016 08:06:04 +0000 (10:06 +0200)
committerDaniel Vetter <[email protected]>
Tue, 25 Oct 2016 08:06:04 +0000 (10:06 +0200)
Backmerge latest drm-next to have a baseline for the
s/fence/dma_fence/ patch from Chris.

Signed-off-by: Daniel Vetter <[email protected]>
1  2 
drivers/gpu/drm/i915/intel_dp.c

index 01bc67194dba6335e16f26639afaec7efc3852d0,f30db8f2425e43e8b23f6b6912de400ce2fd0a6c..3c2293bd24bf216e3a5929af2f4591d41abb5518
@@@ -344,7 -344,7 +344,7 @@@ vlv_power_sequencer_kick(struct intel_d
        DP |= DP_PORT_WIDTH(1);
        DP |= DP_LINK_TRAIN_PAT_1;
  
-       if (IS_CHERRYVIEW(dev))
+       if (IS_CHERRYVIEW(dev_priv))
                DP |= DP_PIPE_SELECT_CHV(pipe);
        else if (pipe == PIPE_B)
                DP |= DP_PIPEB_SELECT;
         * So enable temporarily it if it's not already enabled.
         */
        if (!pll_enabled) {
-               release_cl_override = IS_CHERRYVIEW(dev) &&
+               release_cl_override = IS_CHERRYVIEW(dev_priv) &&
                        !chv_phy_powergate_ch(dev_priv, phy, ch, true);
  
-               if (vlv_force_pll_on(dev, pipe, IS_CHERRYVIEW(dev) ?
+               if (vlv_force_pll_on(dev, pipe, IS_CHERRYVIEW(dev_priv) ?
                                     &chv_dpll[0].dpll : &vlv_dpll[0].dpll)) {
                        DRM_ERROR("Failed to force on pll for pipe %c!\n",
                                  pipe_name(pipe));
@@@ -570,8 -570,8 +570,8 @@@ void intel_power_sequencer_reset(struc
        struct drm_device *dev = &dev_priv->drm;
        struct intel_encoder *encoder;
  
-       if (WARN_ON(!IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev) &&
-                   !IS_BROXTON(dev)))
+       if (WARN_ON(!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
+                   !IS_BROXTON(dev_priv)))
                return;
  
        /*
                        continue;
  
                intel_dp = enc_to_intel_dp(&encoder->base);
-               if (IS_BROXTON(dev))
+               if (IS_BROXTON(dev_priv))
                        intel_dp->pps_reset = true;
                else
                        intel_dp->pps_pipe = INVALID_PIPE;
@@@ -664,7 -664,7 +664,7 @@@ static int edp_notify_handler(struct no
  
        pps_lock(intel_dp);
  
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
                i915_reg_t pp_ctrl_reg, pp_div_reg;
                u32 pp_div;
@@@ -692,7 -692,7 +692,7 @@@ static bool edp_have_panel_power(struc
  
        lockdep_assert_held(&dev_priv->pps_mutex);
  
-       if ((IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) &&
+       if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
            intel_dp->pps_pipe == INVALID_PIPE)
                return false;
  
@@@ -706,7 -706,7 +706,7 @@@ static bool edp_have_panel_vdd(struct i
  
        lockdep_assert_held(&dev_priv->pps_mutex);
  
-       if ((IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) &&
+       if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
            intel_dp->pps_pipe == INVALID_PIPE)
                return false;
  
@@@ -821,15 -821,16 +821,16 @@@ static uint32_t g4x_get_aux_send_ctl(st
                                     uint32_t aux_clock_divider)
  {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv =
+                       to_i915(intel_dig_port->base.base.dev);
        uint32_t precharge, timeout;
  
-       if (IS_GEN6(dev))
+       if (IS_GEN6(dev_priv))
                precharge = 3;
        else
                precharge = 5;
  
-       if (IS_BROADWELL(dev) && intel_dig_port->port == PORT_A)
+       if (IS_BROADWELL(dev_priv) && intel_dig_port->port == PORT_A)
                timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
        else
                timeout = DP_AUX_CH_CTL_TIME_OUT_400us;
@@@ -1108,8 -1109,46 +1109,46 @@@ intel_dp_aux_transfer(struct drm_dp_au
        return ret;
  }
  
+ static enum port intel_aux_port(struct drm_i915_private *dev_priv,
+                               enum port port)
+ {
+       const struct ddi_vbt_port_info *info =
+               &dev_priv->vbt.ddi_port_info[port];
+       enum port aux_port;
+       if (!info->alternate_aux_channel) {
+               DRM_DEBUG_KMS("using AUX %c for port %c (platform default)\n",
+                             port_name(port), port_name(port));
+               return port;
+       }
+       switch (info->alternate_aux_channel) {
+       case DP_AUX_A:
+               aux_port = PORT_A;
+               break;
+       case DP_AUX_B:
+               aux_port = PORT_B;
+               break;
+       case DP_AUX_C:
+               aux_port = PORT_C;
+               break;
+       case DP_AUX_D:
+               aux_port = PORT_D;
+               break;
+       default:
+               MISSING_CASE(info->alternate_aux_channel);
+               aux_port = PORT_A;
+               break;
+       }
+       DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n",
+                     port_name(aux_port), port_name(port));
+       return aux_port;
+ }
  static i915_reg_t g4x_aux_ctl_reg(struct drm_i915_private *dev_priv,
-                                      enum port port)
+                                 enum port port)
  {
        switch (port) {
        case PORT_B:
  }
  
  static i915_reg_t g4x_aux_data_reg(struct drm_i915_private *dev_priv,
-                                       enum port port, int index)
+                                  enum port port, int index)
  {
        switch (port) {
        case PORT_B:
  }
  
  static i915_reg_t ilk_aux_ctl_reg(struct drm_i915_private *dev_priv,
-                                      enum port port)
+                                 enum port port)
  {
        switch (port) {
        case PORT_A:
  }
  
  static i915_reg_t ilk_aux_data_reg(struct drm_i915_private *dev_priv,
-                                       enum port port, int index)
+                                  enum port port, int index)
  {
        switch (port) {
        case PORT_A:
        }
  }
  
- /*
-  * On SKL we don't have Aux for port E so we rely
-  * on VBT to set a proper alternate aux channel.
-  */
- static enum port skl_porte_aux_port(struct drm_i915_private *dev_priv)
- {
-       const struct ddi_vbt_port_info *info =
-               &dev_priv->vbt.ddi_port_info[PORT_E];
-       switch (info->alternate_aux_channel) {
-       case DP_AUX_A:
-               return PORT_A;
-       case DP_AUX_B:
-               return PORT_B;
-       case DP_AUX_C:
-               return PORT_C;
-       case DP_AUX_D:
-               return PORT_D;
-       default:
-               MISSING_CASE(info->alternate_aux_channel);
-               return PORT_A;
-       }
- }
  static i915_reg_t skl_aux_ctl_reg(struct drm_i915_private *dev_priv,
-                                      enum port port)
+                                 enum port port)
  {
-       if (port == PORT_E)
-               port = skl_porte_aux_port(dev_priv);
        switch (port) {
        case PORT_A:
        case PORT_B:
  }
  
  static i915_reg_t skl_aux_data_reg(struct drm_i915_private *dev_priv,
-                                       enum port port, int index)
+                                  enum port port, int index)
  {
-       if (port == PORT_E)
-               port = skl_porte_aux_port(dev_priv);
        switch (port) {
        case PORT_A:
        case PORT_B:
  }
  
  static i915_reg_t intel_aux_ctl_reg(struct drm_i915_private *dev_priv,
-                                        enum port port)
+                                   enum port port)
  {
        if (INTEL_INFO(dev_priv)->gen >= 9)
                return skl_aux_ctl_reg(dev_priv, port);
  }
  
  static i915_reg_t intel_aux_data_reg(struct drm_i915_private *dev_priv,
-                                         enum port port, int index)
+                                    enum port port, int index)
  {
        if (INTEL_INFO(dev_priv)->gen >= 9)
                return skl_aux_data_reg(dev_priv, port, index);
  static void intel_aux_reg_init(struct intel_dp *intel_dp)
  {
        struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
-       enum port port = dp_to_dig_port(intel_dp)->port;
+       enum port port = intel_aux_port(dev_priv,
+                                       dp_to_dig_port(intel_dp)->port);
        int i;
  
        intel_dp->aux_ch_ctl_reg = intel_aux_ctl_reg(dev_priv, port);
@@@ -1297,14 -1307,10 +1307,10 @@@ intel_dp_sink_rates(struct intel_dp *in
  bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp)
  {
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = dig_port->base.base.dev;
-       /* WaDisableHBR2:skl */
-       if (IS_SKL_REVID(dev, 0, SKL_REVID_B0))
-               return false;
+       struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
  
-       if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) ||
-           (INTEL_INFO(dev)->gen >= 9))
+       if ((IS_HASWELL(dev_priv) && !IS_HSW_ULX(dev_priv)) ||
+           IS_BROADWELL(dev_priv) || (INTEL_GEN(dev_priv) >= 9))
                return true;
        else
                return false;
@@@ -1314,13 -1320,13 +1320,13 @@@ static in
  intel_dp_source_rates(struct intel_dp *intel_dp, const int **source_rates)
  {
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
        int size;
  
-       if (IS_BROXTON(dev)) {
+       if (IS_BROXTON(dev_priv)) {
                *source_rates = bxt_rates;
                size = ARRAY_SIZE(bxt_rates);
-       } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
+       } else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
                *source_rates = skl_rates;
                size = ARRAY_SIZE(skl_rates);
        } else {
@@@ -1340,19 -1346,20 +1346,20 @@@ intel_dp_set_clock(struct intel_encode
                   struct intel_crtc_state *pipe_config)
  {
        struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
        const struct dp_link_dpll *divisor = NULL;
        int i, count = 0;
  
-       if (IS_G4X(dev)) {
+       if (IS_G4X(dev_priv)) {
                divisor = gen4_dpll;
                count = ARRAY_SIZE(gen4_dpll);
-       } else if (HAS_PCH_SPLIT(dev)) {
+       } else if (HAS_PCH_SPLIT(dev_priv)) {
                divisor = pch_dpll;
                count = ARRAY_SIZE(pch_dpll);
-       } else if (IS_CHERRYVIEW(dev)) {
+       } else if (IS_CHERRYVIEW(dev_priv)) {
                divisor = chv_dpll;
                count = ARRAY_SIZE(chv_dpll);
-       } else if (IS_VALLEYVIEW(dev)) {
+       } else if (IS_VALLEYVIEW(dev_priv)) {
                divisor = vlv_dpll;
                count = ARRAY_SIZE(vlv_dpll);
        }
@@@ -1452,7 -1459,8 +1459,7 @@@ static void intel_dp_print_hw_revision(
        if ((drm_debug & DRM_UT_KMS) == 0)
                return;
  
 -      if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
 -            DP_DWN_STRM_PORT_PRESENT))
 +      if (!drm_dp_is_branch(intel_dp->dpcd))
                return;
  
        len = drm_dp_dpcd_read(&intel_dp->aux, DP_BRANCH_HW_REV, &rev, 1);
@@@ -1470,7 -1478,8 +1477,7 @@@ static void intel_dp_print_sw_revision(
        if ((drm_debug & DRM_UT_KMS) == 0)
                return;
  
 -      if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
 -            DP_DWN_STRM_PORT_PRESENT))
 +      if (!drm_dp_is_branch(intel_dp->dpcd))
                return;
  
        len = drm_dp_dpcd_read(&intel_dp->aux, DP_BRANCH_SW_REV, &rev, 2);
@@@ -1567,7 -1576,7 +1574,7 @@@ intel_dp_compute_config(struct intel_en
  
        max_clock = common_len - 1;
  
-       if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A)
+       if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && port != PORT_A)
                pipe_config->has_pch_encoder = true;
  
        pipe_config->has_drrs = false;
                                return ret;
                }
  
-               if (HAS_GMCH_DISPLAY(dev))
+               if (HAS_GMCH_DISPLAY(dev_priv))
                        intel_gmch_panel_fitting(intel_crtc, pipe_config,
                                                 intel_connector->panel.fitting_mode);
                else
@@@ -1709,7 -1718,7 +1716,7 @@@ found
                to_intel_atomic_state(pipe_config->base.state)->cdclk_pll_vco = vco;
        }
  
-       if (!HAS_DDI(dev))
+       if (!HAS_DDI(dev_priv))
                intel_dp_set_clock(encoder, pipe_config);
  
        return true;
@@@ -1767,7 -1776,7 +1774,7 @@@ static void intel_dp_prepare(struct int
  
        /* Split out the IBX/CPU vs CPT settings */
  
-       if (IS_GEN7(dev) && port == PORT_A) {
+       if (IS_GEN7(dev_priv) && port == PORT_A) {
                if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
                        intel_dp->DP |= DP_SYNC_HS_HIGH;
                if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
                        intel_dp->DP |= DP_ENHANCED_FRAMING;
  
                intel_dp->DP |= crtc->pipe << 29;
-       } else if (HAS_PCH_CPT(dev) && port != PORT_A) {
+       } else if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
                u32 trans_dp;
  
                intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
                        trans_dp &= ~TRANS_DP_ENH_FRAMING;
                I915_WRITE(TRANS_DP_CTL(crtc->pipe), trans_dp);
        } else {
-               if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
-                   !IS_CHERRYVIEW(dev) && pipe_config->limited_color_range)
+               if (!HAS_PCH_SPLIT(dev_priv) && !IS_VALLEYVIEW(dev_priv) &&
+                   !IS_CHERRYVIEW(dev_priv) &&
+                   pipe_config->limited_color_range)
                        intel_dp->DP |= DP_COLOR_RANGE_16_235;
  
                if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
                if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
                        intel_dp->DP |= DP_ENHANCED_FRAMING;
  
-               if (IS_CHERRYVIEW(dev))
+               if (IS_CHERRYVIEW(dev_priv))
                        intel_dp->DP |= DP_PIPE_SELECT_CHV(crtc->pipe);
                else if (crtc->pipe == PIPE_B)
                        intel_dp->DP |= DP_PIPEB_SELECT;
@@@ -2112,7 -2122,7 +2120,7 @@@ static void edp_panel_on(struct intel_d
  
        pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
        pp = ironlake_get_pp_control(intel_dp);
-       if (IS_GEN5(dev)) {
+       if (IS_GEN5(dev_priv)) {
                /* ILK workaround: disable reset around power sequence */
                pp &= ~PANEL_POWER_RESET;
                I915_WRITE(pp_ctrl_reg, pp);
        }
  
        pp |= PANEL_POWER_ON;
-       if (!IS_GEN5(dev))
+       if (!IS_GEN5(dev_priv))
                pp |= PANEL_POWER_RESET;
  
        I915_WRITE(pp_ctrl_reg, pp);
        wait_panel_on(intel_dp);
        intel_dp->last_power_on = jiffies;
  
-       if (IS_GEN5(dev)) {
+       if (IS_GEN5(dev_priv)) {
                pp |= PANEL_POWER_RESET; /* restore panel reset bit */
                I915_WRITE(pp_ctrl_reg, pp);
                POSTING_READ(pp_ctrl_reg);
@@@ -2442,9 -2452,9 +2450,9 @@@ static bool intel_dp_get_hw_state(struc
        if (!(tmp & DP_PORT_EN))
                goto out;
  
-       if (IS_GEN7(dev) && port == PORT_A) {
+       if (IS_GEN7(dev_priv) && port == PORT_A) {
                *pipe = PORT_TO_PIPE_CPT(tmp);
-       } else if (HAS_PCH_CPT(dev) && port != PORT_A) {
+       } else if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
                enum pipe p;
  
                for_each_pipe(dev_priv, p) {
  
                DRM_DEBUG_KMS("No pipe for dp port 0x%x found\n",
                              i915_mmio_reg_offset(intel_dp->output_reg));
-       } else if (IS_CHERRYVIEW(dev)) {
+       } else if (IS_CHERRYVIEW(dev_priv)) {
                *pipe = DP_PORT_TO_PIPE_CHV(tmp);
        } else {
                *pipe = PORT_TO_PIPE(tmp);
@@@ -2487,7 -2497,7 +2495,7 @@@ static void intel_dp_get_config(struct 
  
        pipe_config->has_audio = tmp & DP_AUDIO_OUTPUT_ENABLE && port != PORT_A;
  
-       if (HAS_PCH_CPT(dev) && port != PORT_A) {
+       if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
                u32 trans_dp = I915_READ(TRANS_DP_CTL(crtc->pipe));
  
                if (trans_dp & TRANS_DP_HSYNC_ACTIVE_HIGH)
  
        pipe_config->base.adjusted_mode.flags |= flags;
  
-       if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
-           !IS_CHERRYVIEW(dev) && tmp & DP_COLOR_RANGE_16_235)
+       if (!HAS_PCH_SPLIT(dev_priv) && !IS_VALLEYVIEW(dev_priv) &&
+           !IS_CHERRYVIEW(dev_priv) && tmp & DP_COLOR_RANGE_16_235)
                pipe_config->limited_color_range = true;
  
        pipe_config->lane_count =
@@@ -2634,7 -2644,7 +2642,7 @@@ _intel_dp_set_link_train(struct intel_d
                DRM_DEBUG_KMS("Using DP training pattern TPS%d\n",
                              dp_train_pat & DP_TRAINING_PATTERN_MASK);
  
-       if (HAS_DDI(dev)) {
+       if (HAS_DDI(dev_priv)) {
                uint32_t temp = I915_READ(DP_TP_CTL(port));
  
                if (dp_train_pat & DP_LINK_SCRAMBLING_DISABLE)
                }
                I915_WRITE(DP_TP_CTL(port), temp);
  
-       } else if ((IS_GEN7(dev) && port == PORT_A) ||
-                  (HAS_PCH_CPT(dev) && port != PORT_A)) {
+       } else if ((IS_GEN7(dev_priv) && port == PORT_A) ||
+                  (HAS_PCH_CPT(dev_priv) && port != PORT_A)) {
                *DP &= ~DP_LINK_TRAIN_MASK_CPT;
  
                switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
                }
  
        } else {
-               if (IS_CHERRYVIEW(dev))
+               if (IS_CHERRYVIEW(dev_priv))
                        *DP &= ~DP_LINK_TRAIN_MASK_CHV;
                else
                        *DP &= ~DP_LINK_TRAIN_MASK;
                        *DP |= DP_LINK_TRAIN_PAT_2;
                        break;
                case DP_TRAINING_PATTERN_3:
-                       if (IS_CHERRYVIEW(dev)) {
+                       if (IS_CHERRYVIEW(dev_priv)) {
                                *DP |= DP_LINK_TRAIN_PAT_3_CHV;
                        } else {
                                DRM_DEBUG_KMS("TPS3 not supported, using TPS2 instead\n");
@@@ -2747,7 -2757,7 +2755,7 @@@ static void intel_enable_dp(struct inte
  
        pps_lock(intel_dp);
  
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
+       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
                vlv_init_panel_power_sequencer(intel_dp);
  
        intel_dp_enable_port(intel_dp, pipe_config);
  
        pps_unlock(intel_dp);
  
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                unsigned int lane_mask = 0x0;
  
-               if (IS_CHERRYVIEW(dev))
+               if (IS_CHERRYVIEW(dev_priv))
                        lane_mask = intel_dp_unused_lane_mask(pipe_config->lane_count);
  
                vlv_wait_port_ready(dev_priv, dp_to_dig_port(intel_dp),
@@@ -2981,17 -2991,17 +2989,17 @@@ intel_dp_voltage_max(struct intel_dp *i
        struct drm_i915_private *dev_priv = to_i915(dev);
        enum port port = dp_to_dig_port(intel_dp)->port;
  
-       if (IS_BROXTON(dev))
+       if (IS_BROXTON(dev_priv))
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
        else if (INTEL_INFO(dev)->gen >= 9) {
                if (dev_priv->vbt.edp.low_vswing && port == PORT_A)
                        return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
-       } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
+       } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
-       else if (IS_GEN7(dev) && port == PORT_A)
+       else if (IS_GEN7(dev_priv) && port == PORT_A)
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
-       else if (HAS_PCH_CPT(dev) && port != PORT_A)
+       else if (HAS_PCH_CPT(dev_priv) && port != PORT_A)
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
        else
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
  uint8_t
  intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
  {
-       struct drm_device *dev = intel_dp_to_dev(intel_dp);
+       struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
        enum port port = dp_to_dig_port(intel_dp)->port;
  
-       if (INTEL_INFO(dev)->gen >= 9) {
+       if (INTEL_GEN(dev_priv) >= 9) {
                switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
                case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
                        return DP_TRAIN_PRE_EMPH_LEVEL_3;
                default:
                        return DP_TRAIN_PRE_EMPH_LEVEL_0;
                }
-       } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
+       } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
                switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
                case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
                        return DP_TRAIN_PRE_EMPH_LEVEL_3;
                default:
                        return DP_TRAIN_PRE_EMPH_LEVEL_0;
                }
-       } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
                case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
                        return DP_TRAIN_PRE_EMPH_LEVEL_3;
                default:
                        return DP_TRAIN_PRE_EMPH_LEVEL_0;
                }
-       } else if (IS_GEN7(dev) && port == PORT_A) {
+       } else if (IS_GEN7(dev_priv) && port == PORT_A) {
                switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
                case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
                        return DP_TRAIN_PRE_EMPH_LEVEL_2;
@@@ -3341,21 -3351,21 +3349,21 @@@ intel_dp_set_signal_levels(struct intel
        uint32_t signal_levels, mask = 0;
        uint8_t train_set = intel_dp->train_set[0];
  
-       if (HAS_DDI(dev)) {
+       if (HAS_DDI(dev_priv)) {
                signal_levels = ddi_signal_levels(intel_dp);
  
-               if (IS_BROXTON(dev))
+               if (IS_BROXTON(dev_priv))
                        signal_levels = 0;
                else
                        mask = DDI_BUF_EMP_MASK;
-       } else if (IS_CHERRYVIEW(dev)) {
+       } else if (IS_CHERRYVIEW(dev_priv)) {
                signal_levels = chv_signal_levels(intel_dp);
-       } else if (IS_VALLEYVIEW(dev)) {
+       } else if (IS_VALLEYVIEW(dev_priv)) {
                signal_levels = vlv_signal_levels(intel_dp);
-       } else if (IS_GEN7(dev) && port == PORT_A) {
+       } else if (IS_GEN7(dev_priv) && port == PORT_A) {
                signal_levels = gen7_edp_signal_levels(train_set);
                mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
-       } else if (IS_GEN6(dev) && port == PORT_A) {
+       } else if (IS_GEN6(dev_priv) && port == PORT_A) {
                signal_levels = gen6_edp_signal_levels(train_set);
                mask = EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
        } else {
@@@ -3400,7 -3410,7 +3408,7 @@@ void intel_dp_set_idle_link_train(struc
        enum port port = intel_dig_port->port;
        uint32_t val;
  
-       if (!HAS_DDI(dev))
+       if (!HAS_DDI(dev_priv))
                return;
  
        val = I915_READ(DP_TP_CTL(port));
@@@ -3435,7 -3445,7 +3443,7 @@@ intel_dp_link_down(struct intel_dp *int
        struct drm_i915_private *dev_priv = to_i915(dev);
        uint32_t DP = intel_dp->DP;
  
-       if (WARN_ON(HAS_DDI(dev)))
+       if (WARN_ON(HAS_DDI(dev_priv)))
                return;
  
        if (WARN_ON((I915_READ(intel_dp->output_reg) & DP_PORT_EN) == 0))
  
        DRM_DEBUG_KMS("\n");
  
-       if ((IS_GEN7(dev) && port == PORT_A) ||
-           (HAS_PCH_CPT(dev) && port != PORT_A)) {
+       if ((IS_GEN7(dev_priv) && port == PORT_A) ||
+           (HAS_PCH_CPT(dev_priv) && port != PORT_A)) {
                DP &= ~DP_LINK_TRAIN_MASK_CPT;
                DP |= DP_LINK_TRAIN_PAT_IDLE_CPT;
        } else {
-               if (IS_CHERRYVIEW(dev))
+               if (IS_CHERRYVIEW(dev_priv))
                        DP &= ~DP_LINK_TRAIN_MASK_CHV;
                else
                        DP &= ~DP_LINK_TRAIN_MASK;
         * to transcoder A after disabling it to allow the
         * matching HDMI port to be enabled on transcoder A.
         */
-       if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B && port != PORT_A) {
+       if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B && port != PORT_A) {
                /*
                 * We get CPU/PCH FIFO underruns on the other pipe when
                 * doing the workaround. Sweep them under the rug.
@@@ -3549,8 -3559,8 +3557,8 @@@ intel_edp_init_dpcd(struct intel_dp *in
        /* Read the eDP Display control capabilities registers */
        if ((intel_dp->dpcd[DP_EDP_CONFIGURATION_CAP] & DP_DPCD_DISPLAY_CONTROL_CAPABLE) &&
            drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV,
-                            intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd) ==
-                            sizeof(intel_dp->edp_dpcd)))
+                            intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) ==
+                            sizeof(intel_dp->edp_dpcd))
                DRM_DEBUG_KMS("EDP DPCD : %*ph\n", (int) sizeof(intel_dp->edp_dpcd),
                              intel_dp->edp_dpcd);
  
@@@ -3605,7 -3615,8 +3613,7 @@@ intel_dp_get_dpcd(struct intel_dp *inte
        if (!is_edp(intel_dp) && !intel_dp->sink_count)
                return false;
  
 -      if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
 -            DP_DWN_STRM_PORT_PRESENT))
 +      if (!drm_dp_is_branch(intel_dp->dpcd))
                return true; /* native DP sink */
  
        if (intel_dp->dpcd[DP_DPCD_REV] == 0x10)
@@@ -3985,6 -3996,31 +3993,31 @@@ go_again
        return -EINVAL;
  }
  
+ static void
+ intel_dp_retrain_link(struct intel_dp *intel_dp)
+ {
+       struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+       struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
+       /* Suppress underruns caused by re-training */
+       intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
+       if (crtc->config->has_pch_encoder)
+               intel_set_pch_fifo_underrun_reporting(dev_priv,
+                                                     intel_crtc_pch_transcoder(crtc), false);
+       intel_dp_start_link_train(intel_dp);
+       intel_dp_stop_link_train(intel_dp);
+       /* Keep underrun reporting disabled until things are stable */
+       intel_wait_for_vblank(&dev_priv->drm, crtc->pipe);
+       intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
+       if (crtc->config->has_pch_encoder)
+               intel_set_pch_fifo_underrun_reporting(dev_priv,
+                                                     intel_crtc_pch_transcoder(crtc), true);
+ }
  static void
  intel_dp_check_link_status(struct intel_dp *intel_dp)
  {
        if (!to_intel_crtc(intel_encoder->base.crtc)->active)
                return;
  
+       /* FIXME: we need to synchronize this sort of stuff with hardware
+        * readout */
+       if (WARN_ON_ONCE(!intel_dp->lane_count))
+               return;
        /* if link training is requested we should perform it always */
        if ((intel_dp->compliance_test_type == DP_TEST_LINK_TRAINING) ||
            (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count))) {
                DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
                              intel_encoder->base.name);
-               intel_dp_start_link_train(intel_dp);
-               intel_dp_stop_link_train(intel_dp);
+               intel_dp_retrain_link(intel_dp);
        }
  }
  
@@@ -4093,7 -4134,7 +4131,7 @@@ intel_dp_detect_dpcd(struct intel_dp *i
                return connector_status_connected;
  
        /* if there's no downstream port, we're done */
 -      if (!(dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT))
 +      if (!drm_dp_is_branch(dpcd))
                return connector_status_connected;
  
        /* If we're HPD-aware, SINK_COUNT changes dynamically */
@@@ -4334,7 -4375,7 +4372,7 @@@ intel_dp_unset_edid(struct intel_dp *in
        intel_dp->has_audio = false;
  }
  
- static void
+ static enum drm_connector_status
  intel_dp_long_pulse(struct intel_connector *intel_connector)
  {
        struct drm_connector *connector = &intel_connector->base;
        else
                status = connector_status_disconnected;
  
-       if (status != connector_status_connected) {
+       if (status == connector_status_disconnected) {
                intel_dp->compliance_test_active = 0;
                intel_dp->compliance_test_type = 0;
                intel_dp->compliance_test_data = 0;
        intel_dp->aux.i2c_defer_count = 0;
  
        intel_dp_set_edid(intel_dp);
-       status = connector_status_connected;
+       if (is_edp(intel_dp) || intel_connector->detect_edid)
+               status = connector_status_connected;
        intel_dp->detect_done = true;
  
        /* Try to read the source of the interrupt */
        }
  
  out:
-       if ((status != connector_status_connected) &&
-           (intel_dp->is_mst == false))
+       if (status != connector_status_connected && !intel_dp->is_mst)
                intel_dp_unset_edid(intel_dp);
  
        intel_display_power_put(to_i915(dev), power_domain);
-       return;
+       return status;
  }
  
  static enum drm_connector_status
@@@ -4454,7 -4494,7 +4491,7 @@@ intel_dp_detect(struct drm_connector *c
        struct intel_dp *intel_dp = intel_attached_dp(connector);
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        struct intel_encoder *intel_encoder = &intel_dig_port->base;
-       struct intel_connector *intel_connector = to_intel_connector(connector);
+       enum drm_connector_status status = connector->status;
  
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
                      connector->base.id, connector->name);
  
        /* If full detect is not performed yet, do a full detect */
        if (!intel_dp->detect_done)
-               intel_dp_long_pulse(intel_dp->attached_connector);
+               status = intel_dp_long_pulse(intel_dp->attached_connector);
  
        intel_dp->detect_done = false;
  
-       if (is_edp(intel_dp) || intel_connector->detect_edid)
-               return connector_status_connected;
-       else
-               return connector_status_disconnected;
+       return status;
  }
  
  static void
@@@ -4757,11 -4794,16 +4791,16 @@@ static void intel_edp_panel_vdd_sanitiz
  void intel_dp_encoder_reset(struct drm_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->dev);
-       struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+       struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
+       struct intel_lspcon *lspcon = &intel_dig_port->lspcon;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
  
        if (!HAS_DDI(dev_priv))
                intel_dp->DP = I915_READ(intel_dp->output_reg);
  
+       if (IS_GEN9(dev_priv) && lspcon->active)
+               lspcon_resume(lspcon);
        if (to_intel_encoder(encoder)->type != INTEL_OUTPUT_EDP)
                return;
  
@@@ -4828,36 -4870,34 +4867,34 @@@ intel_dp_hpd_pulse(struct intel_digital
                      port_name(intel_dig_port->port),
                      long_hpd ? "long" : "short");
  
+       if (long_hpd) {
+               intel_dp->detect_done = false;
+               return IRQ_NONE;
+       }
        power_domain = intel_display_port_aux_power_domain(intel_encoder);
        intel_display_power_get(dev_priv, power_domain);
  
-       if (long_hpd) {
-               intel_dp_long_pulse(intel_dp->attached_connector);
-               if (intel_dp->is_mst)
-                       ret = IRQ_HANDLED;
-               goto put_power;
-       } else {
-               if (intel_dp->is_mst) {
-                       if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
-                               /*
-                                * If we were in MST mode, and device is not
-                                * there, get out of MST mode
-                                */
-                               DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
-                                             intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
-                               intel_dp->is_mst = false;
-                               drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
-                                                               intel_dp->is_mst);
-                               goto put_power;
-                       }
+       if (intel_dp->is_mst) {
+               if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
+                       /*
+                        * If we were in MST mode, and device is not
+                        * there, get out of MST mode
+                        */
+                       DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
+                                     intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
+                       intel_dp->is_mst = false;
+                       drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
+                                                       intel_dp->is_mst);
+                       intel_dp->detect_done = false;
+                       goto put_power;
                }
+       }
  
-               if (!intel_dp->is_mst) {
-                       if (!intel_dp_short_pulse(intel_dp)) {
-                               intel_dp_long_pulse(intel_dp->attached_connector);
-                               goto put_power;
-                       }
+       if (!intel_dp->is_mst) {
+               if (!intel_dp_short_pulse(intel_dp)) {
+                       intel_dp->detect_done = false;
+                       goto put_power;
                }
        }
  
@@@ -5077,7 -5117,7 +5114,7 @@@ intel_dp_init_panel_power_sequencer_reg
                 (seq->t10 << PANEL_POWER_DOWN_DELAY_SHIFT);
        /* Compute the divisor for the pp clock, simply match the Bspec
         * formula. */
-       if (IS_BROXTON(dev)) {
+       if (IS_BROXTON(dev_priv)) {
                pp_div = I915_READ(regs.pp_ctrl);
                pp_div &= ~BXT_POWER_CYCLE_DELAY_MASK;
                pp_div |= (DIV_ROUND_UP((seq->t11_t12 + 1), 1000)
  
        /* Haswell doesn't have any port selection bits for the panel
         * power sequencer any more. */
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                port_sel = PANEL_PORT_SELECT_VLV(port);
-       } else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) {
+       } else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)) {
                if (port == PORT_A)
                        port_sel = PANEL_PORT_SELECT_DPA;
                else
  
        I915_WRITE(regs.pp_on, pp_on);
        I915_WRITE(regs.pp_off, pp_off);
-       if (IS_BROXTON(dev))
+       if (IS_BROXTON(dev_priv))
                I915_WRITE(regs.pp_ctrl, pp_div);
        else
                I915_WRITE(regs.pp_div, pp_div);
        DRM_DEBUG_KMS("panel power sequencer register settings: PP_ON %#x, PP_OFF %#x, PP_DIV %#x\n",
                      I915_READ(regs.pp_on),
                      I915_READ(regs.pp_off),
-                     IS_BROXTON(dev) ?
+                     IS_BROXTON(dev_priv) ?
                      (I915_READ(regs.pp_ctrl) & BXT_POWER_CYCLE_DELAY_MASK) :
                      I915_READ(regs.pp_div));
  }
  static void intel_dp_pps_init(struct drm_device *dev,
                              struct intel_dp *intel_dp)
  {
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                vlv_initial_power_sequencer_setup(intel_dp);
        } else {
                intel_dp_init_panel_power_sequencer(dev, intel_dp);
@@@ -5589,7 -5631,7 +5628,7 @@@ static bool intel_edp_init_connector(st
        }
        mutex_unlock(&dev->mode_config.mutex);
  
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                intel_dp->edp_notifier.notifier_call = edp_notify_handler;
                register_reboot_notifier(&intel_dp->edp_notifier);
  
                 * If the current pipe isn't valid, try the PPS pipe, and if that
                 * fails just assume pipe A.
                 */
-               if (IS_CHERRYVIEW(dev))
+               if (IS_CHERRYVIEW(dev_priv))
                        pipe = DP_PORT_TO_PIPE_CHV(intel_dp->DP);
                else
                        pipe = PORT_TO_PIPE(intel_dp->DP);
@@@ -5654,9 -5696,9 +5693,9 @@@ intel_dp_init_connector(struct intel_di
        /* intel_dp vfuncs */
        if (INTEL_INFO(dev)->gen >= 9)
                intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider;
-       else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
+       else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
                intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider;
-       else if (HAS_PCH_SPLIT(dev))
+       else if (HAS_PCH_SPLIT(dev_priv))
                intel_dp->get_aux_clock_divider = ilk_get_aux_clock_divider;
        else
                intel_dp->get_aux_clock_divider = g4x_get_aux_clock_divider;
        else
                intel_dp->get_aux_send_ctl = g4x_get_aux_send_ctl;
  
-       if (HAS_DDI(dev))
+       if (HAS_DDI(dev_priv))
                intel_dp->prepare_link_retrain = intel_ddi_prepare_link_retrain;
  
        /* Preserve the current hw state. */
                intel_encoder->type = INTEL_OUTPUT_EDP;
  
        /* eDP only on port B and/or C on vlv/chv */
-       if (WARN_ON((IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) &&
+       if (WARN_ON((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
                    is_edp(intel_dp) && port != PORT_B && port != PORT_C))
                return false;
  
  
        intel_connector_attach_encoder(intel_connector, intel_encoder);
  
-       if (HAS_DDI(dev))
+       if (HAS_DDI(dev_priv))
                intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
        else
                intel_connector->get_hw_state = intel_connector_get_hw_state;
                break;
        case PORT_B:
                intel_encoder->hpd_pin = HPD_PORT_B;
-               if (IS_BXT_REVID(dev, 0, BXT_REVID_A1))
+               if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1))
                        intel_encoder->hpd_pin = HPD_PORT_A;
                break;
        case PORT_C:
         * 0xd.  Failure to do so will result in spurious interrupts being
         * generated on the port when a cable is not attached.
         */
-       if (IS_G4X(dev) && !IS_GM45(dev)) {
+       if (IS_G4X(dev_priv) && !IS_GM45(dev_priv)) {
                u32 temp = I915_READ(PEG_BAND_GAP_DATA);
                I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
        }
@@@ -5797,13 -5839,13 +5836,13 @@@ bool intel_dp_init(struct drm_device *d
        intel_encoder->get_hw_state = intel_dp_get_hw_state;
        intel_encoder->get_config = intel_dp_get_config;
        intel_encoder->suspend = intel_dp_encoder_suspend;
-       if (IS_CHERRYVIEW(dev)) {
+       if (IS_CHERRYVIEW(dev_priv)) {
                intel_encoder->pre_pll_enable = chv_dp_pre_pll_enable;
                intel_encoder->pre_enable = chv_pre_enable_dp;
                intel_encoder->enable = vlv_enable_dp;
                intel_encoder->post_disable = chv_post_disable_dp;
                intel_encoder->post_pll_disable = chv_dp_post_pll_disable;
-       } else if (IS_VALLEYVIEW(dev)) {
+       } else if (IS_VALLEYVIEW(dev_priv)) {
                intel_encoder->pre_pll_enable = vlv_dp_pre_pll_enable;
                intel_encoder->pre_enable = vlv_pre_enable_dp;
                intel_encoder->enable = vlv_enable_dp;
        intel_dig_port->max_lanes = 4;
  
        intel_encoder->type = INTEL_OUTPUT_DP;
-       if (IS_CHERRYVIEW(dev)) {
+       if (IS_CHERRYVIEW(dev_priv)) {
                if (port == PORT_D)
                        intel_encoder->crtc_mask = 1 << 2;
                else
                intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
        }
        intel_encoder->cloneable = 0;
+       intel_encoder->port = port;
  
        intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
        dev_priv->hotplug.irq_port[port] = intel_dig_port;
This page took 0.118778 seconds and 4 git commands to generate.