Merge tag 'topic/phy-compliance-2020-04-08' of git://anongit.freedesktop.org/drm...
authorJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Thu, 16 Apr 2020 11:36:38 +0000 (14:36 +0300)
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Thu, 16 Apr 2020 11:52:59 +0000 (14:52 +0300)
Topic pull request for topic/phy-compliance:
- Standardize DP_PHY_TEST_PATTERN name.
- Add support for setting/getting test pattern from sink.
- Implement DP PHY compliance to i915.

From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/efb3d0d9-2cf7-046b-3a9b-2548d086258e@linux.intel.com
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
1  2 
drivers/gpu/drm/drm_dp_helper.c
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp.h
drivers/gpu/drm/i915/i915_reg.h
include/drm/drm_dp_helper.h

@@@ -1238,8 -1238,6 +1238,8 @@@ static const struct dpcd_quirk dpcd_qui
        { OUI(0x00, 0x00, 0x00), DEVICE_ID('C', 'H', '7', '5', '1', '1'), false, BIT(DP_DPCD_QUIRK_NO_SINK_COUNT) },
        /* Synaptics DP1.4 MST hubs can support DSC without virtual DPCD */
        { OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true, BIT(DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) },
 +      /* Apple MacBookPro 2017 15 inch eDP Retina panel reports too low DP_MAX_LINK_RATE */
 +      { OUI(0x00, 0x10, 0xfa), DEVICE_ID(101, 68, 21, 101, 98, 97), false, BIT(DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS) },
  };
  
  #undef OUI
@@@ -1535,3 -1533,97 +1535,97 @@@ int drm_dp_dsc_sink_supported_input_bpc
        return num_bpc;
  }
  EXPORT_SYMBOL(drm_dp_dsc_sink_supported_input_bpcs);
+ /**
+  * drm_dp_get_phy_test_pattern() - get the requested pattern from the sink.
+  * @aux: DisplayPort AUX channel
+  * @data: DP phy compliance test parameters.
+  *
+  * Returns 0 on success or a negative error code on failure.
+  */
+ int drm_dp_get_phy_test_pattern(struct drm_dp_aux *aux,
+                               struct drm_dp_phy_test_params *data)
+ {
+       int err;
+       u8 rate, lanes;
+       err = drm_dp_dpcd_readb(aux, DP_TEST_LINK_RATE, &rate);
+       if (err < 0)
+               return err;
+       data->link_rate = drm_dp_bw_code_to_link_rate(rate);
+       err = drm_dp_dpcd_readb(aux, DP_TEST_LANE_COUNT, &lanes);
+       if (err < 0)
+               return err;
+       data->num_lanes = lanes & DP_MAX_LANE_COUNT_MASK;
+       if (lanes & DP_ENHANCED_FRAME_CAP)
+               data->enhanced_frame_cap = true;
+       err = drm_dp_dpcd_readb(aux, DP_PHY_TEST_PATTERN, &data->phy_pattern);
+       if (err < 0)
+               return err;
+       switch (data->phy_pattern) {
+       case DP_PHY_TEST_PATTERN_80BIT_CUSTOM:
+               err = drm_dp_dpcd_read(aux, DP_TEST_80BIT_CUSTOM_PATTERN_7_0,
+                                      &data->custom80, sizeof(data->custom80));
+               if (err < 0)
+                       return err;
+               break;
+       case DP_PHY_TEST_PATTERN_CP2520:
+               err = drm_dp_dpcd_read(aux, DP_TEST_HBR2_SCRAMBLER_RESET,
+                                      &data->hbr2_reset,
+                                      sizeof(data->hbr2_reset));
+               if (err < 0)
+                       return err;
+       }
+       return 0;
+ }
+ EXPORT_SYMBOL(drm_dp_get_phy_test_pattern);
+ /**
+  * drm_dp_set_phy_test_pattern() - set the pattern to the sink.
+  * @aux: DisplayPort AUX channel
+  * @data: DP phy compliance test parameters.
+  *
+  * Returns 0 on success or a negative error code on failure.
+  */
+ int drm_dp_set_phy_test_pattern(struct drm_dp_aux *aux,
+                               struct drm_dp_phy_test_params *data, u8 dp_rev)
+ {
+       int err, i;
+       u8 link_config[2];
+       u8 test_pattern;
+       link_config[0] = drm_dp_link_rate_to_bw_code(data->link_rate);
+       link_config[1] = data->num_lanes;
+       if (data->enhanced_frame_cap)
+               link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
+       err = drm_dp_dpcd_write(aux, DP_LINK_BW_SET, link_config, 2);
+       if (err < 0)
+               return err;
+       test_pattern = data->phy_pattern;
+       if (dp_rev < 0x12) {
+               test_pattern = (test_pattern << 2) &
+                              DP_LINK_QUAL_PATTERN_11_MASK;
+               err = drm_dp_dpcd_writeb(aux, DP_TRAINING_PATTERN_SET,
+                                        test_pattern);
+               if (err < 0)
+                       return err;
+       } else {
+               for (i = 0; i < data->num_lanes; i++) {
+                       err = drm_dp_dpcd_writeb(aux,
+                                                DP_LINK_QUAL_LANE0_SET + i,
+                                                test_pattern);
+                       if (err < 0)
+                               return err;
+               }
+       }
+       return 0;
+ }
+ EXPORT_SYMBOL(drm_dp_set_phy_test_pattern);
@@@ -132,7 -132,8 +132,7 @@@ struct intel_encoder 
        u16 cloneable;
        u8 pipe_mask;
        enum intel_hotplug_state (*hotplug)(struct intel_encoder *encoder,
 -                                          struct intel_connector *connector,
 -                                          bool irq_received);
 +                                          struct intel_connector *connector);
        enum intel_output_type (*compute_output_type)(struct intel_encoder *,
                                                      struct intel_crtc_state *,
                                                      struct drm_connector_state *);
        void (*update_prepare)(struct intel_atomic_state *,
                               struct intel_encoder *,
                               struct intel_crtc *);
 -      void (*pre_pll_enable)(struct intel_encoder *,
 +      void (*pre_pll_enable)(struct intel_atomic_state *,
 +                             struct intel_encoder *,
                               const struct intel_crtc_state *,
                               const struct drm_connector_state *);
 -      void (*pre_enable)(struct intel_encoder *,
 +      void (*pre_enable)(struct intel_atomic_state *,
 +                         struct intel_encoder *,
                           const struct intel_crtc_state *,
                           const struct drm_connector_state *);
 -      void (*enable)(struct intel_encoder *,
 +      void (*enable)(struct intel_atomic_state *,
 +                     struct intel_encoder *,
                       const struct intel_crtc_state *,
                       const struct drm_connector_state *);
        void (*update_complete)(struct intel_atomic_state *,
                                struct intel_encoder *,
                                struct intel_crtc *);
 -      void (*disable)(struct intel_encoder *,
 +      void (*disable)(struct intel_atomic_state *,
 +                      struct intel_encoder *,
                        const struct intel_crtc_state *,
                        const struct drm_connector_state *);
 -      void (*post_disable)(struct intel_encoder *,
 +      void (*post_disable)(struct intel_atomic_state *,
 +                           struct intel_encoder *,
                             const struct intel_crtc_state *,
                             const struct drm_connector_state *);
 -      void (*post_pll_disable)(struct intel_encoder *,
 +      void (*post_pll_disable)(struct intel_atomic_state *,
 +                               struct intel_encoder *,
                                 const struct intel_crtc_state *,
                                 const struct drm_connector_state *);
 -      void (*update_pipe)(struct intel_encoder *,
 +      void (*update_pipe)(struct intel_atomic_state *,
 +                          struct intel_encoder *,
                            const struct intel_crtc_state *,
                            const struct drm_connector_state *);
        /* Read out the current hw state of this connector, returning true if
@@@ -431,9 -425,6 +431,9 @@@ struct intel_connector 
        struct edid *edid;
        struct edid *detect_edid;
  
 +      /* Number of times hotplug detection was tried after an HPD interrupt */
 +      int hotplug_retries;
 +
        /* since POLL and HPD connectors may use the same HPD line keep the native
           state of connector->polled in case hotplug storm detection changes it */
        u8 polled;
@@@ -649,16 -640,6 +649,16 @@@ struct intel_crtc_scaler_state 
  #define I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP (1<<1)
  /* Flag to use the scanline counter instead of the pixel counter */
  #define I915_MODE_FLAG_USE_SCANLINE_COUNTER (1<<2)
 +/*
 + * TE0 or TE1 flag is set if the crtc has a DSI encoder which
 + * is operating in command mode.
 + * Flag to use TE from DSI0 instead of VBI in command mode
 + */
 +#define I915_MODE_FLAG_DSI_USE_TE0 (1<<3)
 +/* Flag to use TE from DSI1 instead of VBI in command mode */
 +#define I915_MODE_FLAG_DSI_USE_TE1 (1<<4)
 +/* Flag to indicate mipi dsi periodic command mode where we do not get TE */
 +#define I915_MODE_FLAG_DSI_PERIODIC_CMD_MODE (1<<5)
  
  struct intel_wm_level {
        bool enable;
@@@ -1034,7 -1015,6 +1034,7 @@@ struct intel_crtc_state 
                union hdmi_infoframe spd;
                union hdmi_infoframe hdmi;
                union hdmi_infoframe drm;
 +              struct drm_dp_vsc_sdp vsc;
        } infoframes;
  
        /* HDMI scrambling status */
@@@ -1258,6 -1238,7 +1258,7 @@@ struct intel_dp_compliance_data 
        u8 video_pattern;
        u16 hdisplay, vdisplay;
        u8 bpc;
+       struct drm_dp_phy_test_params phytest;
  };
  
  struct intel_dp_compliance {
@@@ -164,17 -164,6 +164,17 @@@ static void intel_dp_set_sink_rates(str
        };
        int i, max_rate;
  
 +      if (drm_dp_has_quirk(&intel_dp->desc, 0,
 +                           DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS)) {
 +              /* Needed, e.g., for Apple MBP 2017, 15 inch eDP Retina panel */
 +              static const int quirk_rates[] = { 162000, 270000, 324000 };
 +
 +              memcpy(intel_dp->sink_rates, quirk_rates, sizeof(quirk_rates));
 +              intel_dp->num_sink_rates = ARRAY_SIZE(quirk_rates);
 +
 +              return;
 +      }
 +
        max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]);
  
        for (i = 0; i < ARRAY_SIZE(dp_rates); i++) {
@@@ -463,7 -452,6 +463,7 @@@ static bool intel_dp_can_link_train_fal
  int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
                                            int link_rate, u8 lane_count)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int index;
  
        index = intel_dp_rate_index(intel_dp->common_rates,
                    !intel_dp_can_link_train_fallback_for_edp(intel_dp,
                                                              intel_dp->common_rates[index - 1],
                                                              lane_count)) {
 -                      DRM_DEBUG_KMS("Retrying Link training for eDP with same parameters\n");
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Retrying Link training for eDP with same parameters\n");
                        return 0;
                }
                intel_dp->max_link_rate = intel_dp->common_rates[index - 1];
                    !intel_dp_can_link_train_fallback_for_edp(intel_dp,
                                                              intel_dp_max_common_rate(intel_dp),
                                                              lane_count >> 1)) {
 -                      DRM_DEBUG_KMS("Retrying Link training for eDP with same parameters\n");
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Retrying Link training for eDP with same parameters\n");
                        return 0;
                }
                intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
                intel_dp->max_link_lane_count = lane_count >> 1;
        } else {
 -              DRM_ERROR("Link Training Unsuccessful\n");
 +              drm_err(&i915->drm, "Link Training Unsuccessful\n");
                return -1;
        }
  
@@@ -567,7 -553,6 +567,7 @@@ static u16 intel_dp_dsc_get_output_bpp(
  static u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
                                       int mode_clock, int mode_hdisplay)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 min_slice_count, i;
        int max_slice_width;
  
  
        max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
        if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
 -              DRM_DEBUG_KMS("Unsupported slice width %d by DP DSC Sink device\n",
 -                            max_slice_width);
 +              drm_dbg_kms(&i915->drm,
 +                          "Unsupported slice width %d by DP DSC Sink device\n",
 +                          max_slice_width);
                return 0;
        }
        /* Also take into account max slice width */
                        return valid_dsc_slicecount[i];
        }
  
 -      DRM_DEBUG_KMS("Unsupported Slice Count %d\n", min_slice_count);
 +      drm_dbg_kms(&i915->drm, "Unsupported Slice Count %d\n",
 +                  min_slice_count);
        return 0;
  }
  
@@@ -1391,7 -1374,7 +1391,7 @@@ intel_dp_aux_xfer(struct intel_dp *inte
         * lowest possible wakeup latency and so prevent the cpu from going into
         * deep sleep states.
         */
 -      pm_qos_update_request(&i915->pm_qos, 0);
 +      cpu_latency_qos_update_request(&i915->pm_qos, 0);
  
        intel_dp_check_edp(intel_dp);
  
@@@ -1524,7 -1507,7 +1524,7 @@@ done
  
        ret = recv_bytes;
  out:
 -      pm_qos_update_request(&i915->pm_qos, PM_QOS_DEFAULT_VALUE);
 +      cpu_latency_qos_update_request(&i915->pm_qos, PM_QOS_DEFAULT_VALUE);
  
        if (vdd)
                edp_panel_vdd_off(intel_dp, false);
@@@ -1849,7 -1832,6 +1849,7 @@@ static void snprintf_int_array(char *st
  
  static void intel_dp_print_rates(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        char str[128]; /* FIXME: too big for stack? */
  
        if (!drm_debug_enabled(DRM_UT_KMS))
  
        snprintf_int_array(str, sizeof(str),
                           intel_dp->source_rates, intel_dp->num_source_rates);
 -      DRM_DEBUG_KMS("source rates: %s\n", str);
 +      drm_dbg_kms(&i915->drm, "source rates: %s\n", str);
  
        snprintf_int_array(str, sizeof(str),
                           intel_dp->sink_rates, intel_dp->num_sink_rates);
 -      DRM_DEBUG_KMS("sink rates: %s\n", str);
 +      drm_dbg_kms(&i915->drm, "sink rates: %s\n", str);
  
        snprintf_int_array(str, sizeof(str),
                           intel_dp->common_rates, intel_dp->num_common_rates);
 -      DRM_DEBUG_KMS("common rates: %s\n", str);
 +      drm_dbg_kms(&i915->drm, "common rates: %s\n", str);
  }
  
  int
@@@ -1972,8 -1954,6 +1972,8 @@@ intel_dp_adjust_compliance_config(struc
                                  struct intel_crtc_state *pipe_config,
                                  struct link_config_limits *limits)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
        /* For DP Compliance we override the computed bpp for the pipe */
        if (intel_dp->compliance.test_data.bpc != 0) {
                int bpp = 3 * intel_dp->compliance.test_data.bpc;
                limits->min_bpp = limits->max_bpp = bpp;
                pipe_config->dither_force_disable = bpp == 6 * 3;
  
 -              DRM_DEBUG_KMS("Setting pipe_bpp to %d\n", bpp);
 +              drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n", bpp);
        }
  
        /* Use values requested by Compliance Test Request */
@@@ -2075,7 -2055,6 +2075,7 @@@ static int intel_dp_dsc_compute_bpp(str
  static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
                                       struct intel_crtc_state *crtc_state)
  {
 +      struct drm_i915_private *i915 = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
        u8 line_buf_depth;
  
        line_buf_depth = drm_dp_dsc_sink_line_buf_depth(intel_dp->dsc_dpcd);
        if (!line_buf_depth) {
 -              DRM_DEBUG_KMS("DSC Sink Line Buffer Depth invalid\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "DSC Sink Line Buffer Depth invalid\n");
                return -EINVAL;
        }
  
@@@ -2136,8 -2114,7 +2136,8 @@@ static int intel_dp_dsc_compute_config(
  {
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
        struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
 -      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
 +      const struct drm_display_mode *adjusted_mode =
 +              &pipe_config->hw.adjusted_mode;
        u8 dsc_max_bpc;
        int pipe_bpp;
        int ret;
@@@ -2252,9 -2229,7 +2252,9 @@@ intel_dp_compute_link_config(struct int
                             struct intel_crtc_state *pipe_config,
                             struct drm_connector_state *conn_state)
  {
 -      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
 +      struct drm_i915_private *i915 = to_i915(encoder->base.dev);
 +      const struct drm_display_mode *adjusted_mode =
 +              &pipe_config->hw.adjusted_mode;
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct link_config_limits limits;
        int common_len;
  
        intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits);
  
 -      DRM_DEBUG_KMS("DP link computation with max lane count %i "
 -                    "max rate %d max bpp %d pixel clock %iKHz\n",
 -                    limits.max_lane_count,
 -                    intel_dp->common_rates[limits.max_clock],
 -                    limits.max_bpp, adjusted_mode->crtc_clock);
 +      drm_dbg_kms(&i915->drm, "DP link computation with max lane count %i "
 +                  "max rate %d max bpp %d pixel clock %iKHz\n",
 +                  limits.max_lane_count,
 +                  intel_dp->common_rates[limits.max_clock],
 +                  limits.max_bpp, adjusted_mode->crtc_clock);
  
        /*
         * Optimize for slow and wide. This is the place to add alternative
        ret = intel_dp_compute_link_config_wide(intel_dp, pipe_config, &limits);
  
        /* enable compression if the mode doesn't fit available BW */
 -      DRM_DEBUG_KMS("Force DSC en = %d\n", intel_dp->force_dsc_en);
 +      drm_dbg_kms(&i915->drm, "Force DSC en = %d\n", intel_dp->force_dsc_en);
        if (ret || intel_dp->force_dsc_en) {
                ret = intel_dp_dsc_compute_config(intel_dp, pipe_config,
                                                  conn_state, &limits);
        }
  
        if (pipe_config->dsc.compression_enable) {
 -              DRM_DEBUG_KMS("DP lane count %d clock %d Input bpp %d Compressed bpp %d\n",
 -                            pipe_config->lane_count, pipe_config->port_clock,
 -                            pipe_config->pipe_bpp,
 -                            pipe_config->dsc.compressed_bpp);
 -
 -              DRM_DEBUG_KMS("DP link rate required %i available %i\n",
 -                            intel_dp_link_required(adjusted_mode->crtc_clock,
 -                                                   pipe_config->dsc.compressed_bpp),
 -                            intel_dp_max_data_rate(pipe_config->port_clock,
 -                                                   pipe_config->lane_count));
 +              drm_dbg_kms(&i915->drm,
 +                          "DP lane count %d clock %d Input bpp %d Compressed bpp %d\n",
 +                          pipe_config->lane_count, pipe_config->port_clock,
 +                          pipe_config->pipe_bpp,
 +                          pipe_config->dsc.compressed_bpp);
 +
 +              drm_dbg_kms(&i915->drm,
 +                          "DP link rate required %i available %i\n",
 +                          intel_dp_link_required(adjusted_mode->crtc_clock,
 +                                                 pipe_config->dsc.compressed_bpp),
 +                          intel_dp_max_data_rate(pipe_config->port_clock,
 +                                                 pipe_config->lane_count));
        } else {
 -              DRM_DEBUG_KMS("DP lane count %d clock %d bpp %d\n",
 -                            pipe_config->lane_count, pipe_config->port_clock,
 -                            pipe_config->pipe_bpp);
 +              drm_dbg_kms(&i915->drm, "DP lane count %d clock %d bpp %d\n",
 +                          pipe_config->lane_count, pipe_config->port_clock,
 +                          pipe_config->pipe_bpp);
  
 -              DRM_DEBUG_KMS("DP link rate required %i available %i\n",
 -                            intel_dp_link_required(adjusted_mode->crtc_clock,
 -                                                   pipe_config->pipe_bpp),
 -                            intel_dp_max_data_rate(pipe_config->port_clock,
 -                                                   pipe_config->lane_count));
 +              drm_dbg_kms(&i915->drm,
 +                          "DP link rate required %i available %i\n",
 +                          intel_dp_link_required(adjusted_mode->crtc_clock,
 +                                                 pipe_config->pipe_bpp),
 +                          intel_dp_max_data_rate(pipe_config->port_clock,
 +                                                 pipe_config->lane_count));
        }
        return 0;
  }
@@@ -2343,7 -2315,6 +2343,7 @@@ intel_dp_ycbcr420_config(struct intel_d
                         struct drm_connector *connector,
                         struct intel_crtc_state *crtc_state)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        const struct drm_display_info *info = &connector->display_info;
        const struct drm_display_mode *adjusted_mode =
                &crtc_state->hw.adjusted_mode;
        /* YCBCR 420 output conversion needs a scaler */
        ret = skl_update_scaler_crtc(crtc_state);
        if (ret) {
 -              DRM_DEBUG_KMS("Scaler allocation for output failed\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "Scaler allocation for output failed\n");
                return ret;
        }
  
@@@ -2414,128 -2384,6 +2414,128 @@@ static bool intel_dp_port_has_audio(str
        return true;
  }
  
 +static void intel_dp_compute_vsc_colorimetry(const struct intel_crtc_state *crtc_state,
 +                                           const struct drm_connector_state *conn_state,
 +                                           struct drm_dp_vsc_sdp *vsc)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +
 +      /*
 +       * Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118
 +       * VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/
 +       * Colorimetry Format indication.
 +       */
 +      vsc->revision = 0x5;
 +      vsc->length = 0x13;
 +
 +      /* DP 1.4a spec, Table 2-120 */
 +      switch (crtc_state->output_format) {
 +      case INTEL_OUTPUT_FORMAT_YCBCR444:
 +              vsc->pixelformat = DP_PIXELFORMAT_YUV444;
 +              break;
 +      case INTEL_OUTPUT_FORMAT_YCBCR420:
 +              vsc->pixelformat = DP_PIXELFORMAT_YUV420;
 +              break;
 +      case INTEL_OUTPUT_FORMAT_RGB:
 +      default:
 +              vsc->pixelformat = DP_PIXELFORMAT_RGB;
 +      }
 +
 +      switch (conn_state->colorspace) {
 +      case DRM_MODE_COLORIMETRY_BT709_YCC:
 +              vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
 +              break;
 +      case DRM_MODE_COLORIMETRY_XVYCC_601:
 +              vsc->colorimetry = DP_COLORIMETRY_XVYCC_601;
 +              break;
 +      case DRM_MODE_COLORIMETRY_XVYCC_709:
 +              vsc->colorimetry = DP_COLORIMETRY_XVYCC_709;
 +              break;
 +      case DRM_MODE_COLORIMETRY_SYCC_601:
 +              vsc->colorimetry = DP_COLORIMETRY_SYCC_601;
 +              break;
 +      case DRM_MODE_COLORIMETRY_OPYCC_601:
 +              vsc->colorimetry = DP_COLORIMETRY_OPYCC_601;
 +              break;
 +      case DRM_MODE_COLORIMETRY_BT2020_CYCC:
 +              vsc->colorimetry = DP_COLORIMETRY_BT2020_CYCC;
 +              break;
 +      case DRM_MODE_COLORIMETRY_BT2020_RGB:
 +              vsc->colorimetry = DP_COLORIMETRY_BT2020_RGB;
 +              break;
 +      case DRM_MODE_COLORIMETRY_BT2020_YCC:
 +              vsc->colorimetry = DP_COLORIMETRY_BT2020_YCC;
 +              break;
 +      case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
 +      case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
 +              vsc->colorimetry = DP_COLORIMETRY_DCI_P3_RGB;
 +              break;
 +      default:
 +              /*
 +               * RGB->YCBCR color conversion uses the BT.709
 +               * color space.
 +               */
 +              if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
 +                      vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
 +              else
 +                      vsc->colorimetry = DP_COLORIMETRY_DEFAULT;
 +              break;
 +      }
 +
 +      vsc->bpc = crtc_state->pipe_bpp / 3;
 +
 +      /* only RGB pixelformat supports 6 bpc */
 +      drm_WARN_ON(&dev_priv->drm,
 +                  vsc->bpc == 6 && vsc->pixelformat != DP_PIXELFORMAT_RGB);
 +
 +      /* all YCbCr are always limited range */
 +      vsc->dynamic_range = DP_DYNAMIC_RANGE_CTA;
 +      vsc->content_type = DP_CONTENT_TYPE_NOT_DEFINED;
 +}
 +
 +static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp,
 +                                   struct intel_crtc_state *crtc_state,
 +                                   const struct drm_connector_state *conn_state)
 +{
 +      struct drm_dp_vsc_sdp *vsc = &crtc_state->infoframes.vsc;
 +
 +      /* When PSR is enabled, VSC SDP is handled by PSR routine */
 +      if (intel_psr_enabled(intel_dp))
 +              return;
 +
 +      if (!intel_dp_needs_vsc_sdp(crtc_state, conn_state))
 +              return;
 +
 +      crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC);
 +      vsc->sdp_type = DP_SDP_VSC;
 +      intel_dp_compute_vsc_colorimetry(crtc_state, conn_state,
 +                                       &crtc_state->infoframes.vsc);
 +}
 +
 +static void
 +intel_dp_compute_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp,
 +                                          struct intel_crtc_state *crtc_state,
 +                                          const struct drm_connector_state *conn_state)
 +{
 +      int ret;
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +      struct hdmi_drm_infoframe *drm_infoframe = &crtc_state->infoframes.drm.drm;
 +
 +      if (!conn_state->hdr_output_metadata)
 +              return;
 +
 +      ret = drm_hdmi_infoframe_set_hdr_metadata(drm_infoframe, conn_state);
 +
 +      if (ret) {
 +              drm_dbg_kms(&dev_priv->drm, "couldn't set HDR metadata in infoframe\n");
 +              return;
 +      }
 +
 +      crtc_state->infoframes.enable |=
 +              intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA);
 +}
 +
  int
  intel_dp_compute_config(struct intel_encoder *encoder,
                        struct intel_crtc_state *pipe_config,
                intel_dp_set_clock(encoder, pipe_config);
  
        intel_psr_compute_config(intel_dp, pipe_config);
 +      intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state);
 +      intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, conn_state);
  
        return 0;
  }
@@@ -2787,27 -2633,22 +2787,27 @@@ static void wait_panel_status(struct in
  
  static void wait_panel_on(struct intel_dp *intel_dp)
  {
 -      DRM_DEBUG_KMS("Wait for panel power on\n");
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
 +      drm_dbg_kms(&i915->drm, "Wait for panel power on\n");
        wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE);
  }
  
  static void wait_panel_off(struct intel_dp *intel_dp)
  {
 -      DRM_DEBUG_KMS("Wait for panel power off time\n");
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
 +      drm_dbg_kms(&i915->drm, "Wait for panel power off time\n");
        wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE);
  }
  
  static void wait_panel_power_cycle(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        ktime_t panel_power_on_time;
        s64 panel_power_off_duration;
  
 -      DRM_DEBUG_KMS("Wait for panel power cycle\n");
 +      drm_dbg_kms(&i915->drm, "Wait for panel power cycle\n");
  
        /* take the difference of currrent time and panel power off time
         * and then make panel wait for t11_t12 if needed. */
@@@ -3171,12 -3012,11 +3171,12 @@@ void intel_edp_backlight_on(const struc
                            const struct drm_connector_state *conn_state)
  {
        struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(conn_state->best_encoder));
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
  
        if (!intel_dp_is_edp(intel_dp))
                return;
  
 -      DRM_DEBUG_KMS("\n");
 +      drm_dbg_kms(&i915->drm, "\n");
  
        intel_panel_enable_backlight(crtc_state, conn_state);
        _intel_edp_backlight_on(intel_dp);
@@@ -3210,12 -3050,11 +3210,12 @@@ static void _intel_edp_backlight_off(st
  void intel_edp_backlight_off(const struct drm_connector_state *old_conn_state)
  {
        struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder));
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
  
        if (!intel_dp_is_edp(intel_dp))
                return;
  
 -      DRM_DEBUG_KMS("\n");
 +      drm_dbg_kms(&i915->drm, "\n");
  
        _intel_edp_backlight_off(intel_dp);
        intel_panel_disable_backlight(old_conn_state);
  static void intel_edp_backlight_power(struct intel_connector *connector,
                                      bool enable)
  {
 +      struct drm_i915_private *i915 = to_i915(connector->base.dev);
        struct intel_dp *intel_dp = intel_attached_dp(connector);
        intel_wakeref_t wakeref;
        bool is_enabled;
        if (is_enabled == enable)
                return;
  
 -      DRM_DEBUG_KMS("panel power control backlight %s\n",
 -                    enable ? "enable" : "disable");
 +      drm_dbg_kms(&i915->drm, "panel power control backlight %s\n",
 +                  enable ? "enable" : "disable");
  
        if (enable)
                _intel_edp_backlight_on(intel_dp);
@@@ -3350,7 -3188,6 +3350,7 @@@ void intel_dp_sink_set_decompression_st
                                           const struct intel_crtc_state *crtc_state,
                                           bool enable)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int ret;
  
        if (!crtc_state->dsc.compression_enable)
        ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_DSC_ENABLE,
                                 enable ? DP_DECOMPRESSION_EN : 0);
        if (ret < 0)
 -              DRM_DEBUG_KMS("Failed to %s sink decompression state\n",
 -                            enable ? "enable" : "disable");
 +              drm_dbg_kms(&i915->drm,
 +                          "Failed to %s sink decompression state\n",
 +                          enable ? "enable" : "disable");
  }
  
  /* If the sink supports it, try to set the power state appropriately */
  void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int ret, i;
  
        /* Should have a valid DPCD by this point */
        }
  
        if (ret != 1)
 -              DRM_DEBUG_KMS("failed to %s sink power state\n",
 -                            mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
 +              drm_dbg_kms(&i915->drm, "failed to %s sink power state\n",
 +                          mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
  }
  
  static bool cpt_dp_port_selected(struct drm_i915_private *dev_priv,
@@@ -3558,8 -3393,7 +3558,8 @@@ static void intel_dp_get_config(struct 
        }
  }
  
 -static void intel_disable_dp(struct intel_encoder *encoder,
 +static void intel_disable_dp(struct intel_atomic_state *state,
 +                           struct intel_encoder *encoder,
                             const struct intel_crtc_state *old_crtc_state,
                             const struct drm_connector_state *old_conn_state)
  {
        intel_edp_panel_off(intel_dp);
  }
  
 -static void g4x_disable_dp(struct intel_encoder *encoder,
 +static void g4x_disable_dp(struct intel_atomic_state *state,
 +                         struct intel_encoder *encoder,
                           const struct intel_crtc_state *old_crtc_state,
                           const struct drm_connector_state *old_conn_state)
  {
 -      intel_disable_dp(encoder, old_crtc_state, old_conn_state);
 +      intel_disable_dp(state, encoder, old_crtc_state, old_conn_state);
  }
  
 -static void vlv_disable_dp(struct intel_encoder *encoder,
 +static void vlv_disable_dp(struct intel_atomic_state *state,
 +                         struct intel_encoder *encoder,
                           const struct intel_crtc_state *old_crtc_state,
                           const struct drm_connector_state *old_conn_state)
  {
 -      intel_disable_dp(encoder, old_crtc_state, old_conn_state);
 +      intel_disable_dp(state, encoder, old_crtc_state, old_conn_state);
  }
  
 -static void g4x_post_disable_dp(struct intel_encoder *encoder,
 +static void g4x_post_disable_dp(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state *old_conn_state)
  {
                ilk_edp_pll_off(intel_dp, old_crtc_state);
  }
  
 -static void vlv_post_disable_dp(struct intel_encoder *encoder,
 +static void vlv_post_disable_dp(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state *old_conn_state)
  {
        intel_dp_link_down(encoder, old_crtc_state);
  }
  
 -static void chv_post_disable_dp(struct intel_encoder *encoder,
 +static void chv_post_disable_dp(struct intel_atomic_state *state,
 +                              struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state *old_conn_state)
  {
@@@ -3751,8 -3580,7 +3751,8 @@@ static void intel_dp_enable_port(struc
        intel_de_posting_read(dev_priv, intel_dp->output_reg);
  }
  
 -static void intel_enable_dp(struct intel_encoder *encoder,
 +static void intel_enable_dp(struct intel_atomic_state *state,
 +                          struct intel_encoder *encoder,
                            const struct intel_crtc_state *pipe_config,
                            const struct drm_connector_state *conn_state)
  {
        }
  }
  
 -static void g4x_enable_dp(struct intel_encoder *encoder,
 +static void g4x_enable_dp(struct intel_atomic_state *state,
 +                        struct intel_encoder *encoder,
                          const struct intel_crtc_state *pipe_config,
                          const struct drm_connector_state *conn_state)
  {
 -      intel_enable_dp(encoder, pipe_config, conn_state);
 +      intel_enable_dp(state, encoder, pipe_config, conn_state);
        intel_edp_backlight_on(pipe_config, conn_state);
  }
  
 -static void vlv_enable_dp(struct intel_encoder *encoder,
 +static void vlv_enable_dp(struct intel_atomic_state *state,
 +                        struct intel_encoder *encoder,
                          const struct intel_crtc_state *pipe_config,
                          const struct drm_connector_state *conn_state)
  {
        intel_edp_backlight_on(pipe_config, conn_state);
  }
  
 -static void g4x_pre_enable_dp(struct intel_encoder *encoder,
 +static void g4x_pre_enable_dp(struct intel_atomic_state *state,
 +                            struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
  {
@@@ -3936,18 -3761,16 +3936,18 @@@ static void vlv_init_panel_power_sequen
        intel_dp_init_panel_power_sequencer_registers(intel_dp, true);
  }
  
 -static void vlv_pre_enable_dp(struct intel_encoder *encoder,
 +static void vlv_pre_enable_dp(struct intel_atomic_state *state,
 +                            struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
  {
        vlv_phy_pre_encoder_enable(encoder, pipe_config);
  
 -      intel_enable_dp(encoder, pipe_config, conn_state);
 +      intel_enable_dp(state, encoder, pipe_config, conn_state);
  }
  
 -static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder,
 +static void vlv_dp_pre_pll_enable(struct intel_atomic_state *state,
 +                                struct intel_encoder *encoder,
                                  const struct intel_crtc_state *pipe_config,
                                  const struct drm_connector_state *conn_state)
  {
        vlv_phy_pre_pll_enable(encoder, pipe_config);
  }
  
 -static void chv_pre_enable_dp(struct intel_encoder *encoder,
 +static void chv_pre_enable_dp(struct intel_atomic_state *state,
 +                            struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
  {
        chv_phy_pre_encoder_enable(encoder, pipe_config);
  
 -      intel_enable_dp(encoder, pipe_config, conn_state);
 +      intel_enable_dp(state, encoder, pipe_config, conn_state);
  
        /* Second common lane will stay alive on its own now */
        chv_phy_release_cl2_override(encoder);
  }
  
 -static void chv_dp_pre_pll_enable(struct intel_encoder *encoder,
 +static void chv_dp_pre_pll_enable(struct intel_atomic_state *state,
 +                                struct intel_encoder *encoder,
                                  const struct intel_crtc_state *pipe_config,
                                  const struct drm_connector_state *conn_state)
  {
        chv_phy_pre_pll_enable(encoder, pipe_config);
  }
  
 -static void chv_dp_post_pll_disable(struct intel_encoder *encoder,
 +static void chv_dp_post_pll_disable(struct intel_atomic_state *state,
 +                                  struct intel_encoder *encoder,
                                    const struct intel_crtc_state *old_crtc_state,
                                    const struct drm_connector_state *old_conn_state)
  {
@@@ -4499,7 -4319,6 +4499,7 @@@ intel_dp_link_down(struct intel_encode
  static void
  intel_dp_extended_receiver_capabilities(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 dpcd_ext[6];
  
        /*
  
        if (drm_dp_dpcd_read(&intel_dp->aux, DP_DP13_DPCD_REV,
                             &dpcd_ext, sizeof(dpcd_ext)) != sizeof(dpcd_ext)) {
 -              DRM_ERROR("DPCD failed read at extended capabilities\n");
 +              drm_err(&i915->drm,
 +                      "DPCD failed read at extended capabilities\n");
                return;
        }
  
        if (intel_dp->dpcd[DP_DPCD_REV] > dpcd_ext[DP_DPCD_REV]) {
 -              DRM_DEBUG_KMS("DPCD extended DPCD rev less than base DPCD rev\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "DPCD extended DPCD rev less than base DPCD rev\n");
                return;
        }
  
        if (!memcmp(intel_dp->dpcd, dpcd_ext, sizeof(dpcd_ext)))
                return;
  
 -      DRM_DEBUG_KMS("Base DPCD: %*ph\n",
 -                    (int)sizeof(intel_dp->dpcd), intel_dp->dpcd);
 +      drm_dbg_kms(&i915->drm, "Base DPCD: %*ph\n",
 +                  (int)sizeof(intel_dp->dpcd), intel_dp->dpcd);
  
        memcpy(intel_dp->dpcd, dpcd_ext, sizeof(dpcd_ext));
  }
  bool
  intel_dp_read_dpcd(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
        if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd,
                             sizeof(intel_dp->dpcd)) < 0)
                return false; /* aux transfer failed */
  
        intel_dp_extended_receiver_capabilities(intel_dp);
  
 -      DRM_DEBUG_KMS("DPCD: %*ph\n", (int) sizeof(intel_dp->dpcd), intel_dp->dpcd);
 +      drm_dbg_kms(&i915->drm, "DPCD: %*ph\n", (int)sizeof(intel_dp->dpcd),
 +                  intel_dp->dpcd);
  
        return intel_dp->dpcd[DP_DPCD_REV] != 0;
  }
@@@ -4564,8 -4378,6 +4564,8 @@@ bool intel_dp_get_colorimetry_status(st
  
  static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
        /*
         * Clear the cached register set to avoid using stale values
         * for the sinks that do not support DSC.
                if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT,
                                     intel_dp->dsc_dpcd,
                                     sizeof(intel_dp->dsc_dpcd)) < 0)
 -                      DRM_ERROR("Failed to read DPCD register 0x%x\n",
 -                                DP_DSC_SUPPORT);
 +                      drm_err(&i915->drm,
 +                              "Failed to read DPCD register 0x%x\n",
 +                              DP_DSC_SUPPORT);
  
 -              DRM_DEBUG_KMS("DSC DPCD: %*ph\n",
 -                            (int)sizeof(intel_dp->dsc_dpcd),
 -                            intel_dp->dsc_dpcd);
 +              drm_dbg_kms(&i915->drm, "DSC DPCD: %*ph\n",
 +                          (int)sizeof(intel_dp->dsc_dpcd),
 +                          intel_dp->dsc_dpcd);
  
                /* FEC is supported only on DP 1.4 */
                if (!intel_dp_is_edp(intel_dp) &&
                    drm_dp_dpcd_readb(&intel_dp->aux, DP_FEC_CAPABILITY,
                                      &intel_dp->fec_capable) < 0)
 -                      DRM_ERROR("Failed to read FEC DPCD register\n");
 +                      drm_err(&i915->drm,
 +                              "Failed to read FEC DPCD register\n");
  
 -              DRM_DEBUG_KMS("FEC CAPABILITY: %x\n", intel_dp->fec_capable);
 +              drm_dbg_kms(&i915->drm, "FEC CAPABILITY: %x\n",
 +                          intel_dp->fec_capable);
        }
  }
  
@@@ -4771,16 -4580,14 +4771,16 @@@ intel_dp_can_mst(struct intel_dp *intel
  static void
  intel_dp_configure_mst(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        struct intel_encoder *encoder =
                &dp_to_dig_port(intel_dp)->base;
        bool sink_can_mst = intel_dp_sink_can_mst(intel_dp);
  
 -      DRM_DEBUG_KMS("[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s\n",
 -                    encoder->base.base.id, encoder->base.name,
 -                    yesno(intel_dp->can_mst), yesno(sink_can_mst),
 -                    yesno(i915_modparams.enable_dp_mst));
 +      drm_dbg_kms(&i915->drm,
 +                  "[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s\n",
 +                  encoder->base.base.id, encoder->base.name,
 +                  yesno(intel_dp->can_mst), yesno(sink_can_mst),
 +                  yesno(i915_modparams.enable_dp_mst));
  
        if (!intel_dp->can_mst)
                return;
@@@ -4826,205 -4633,6 +4826,205 @@@ intel_dp_needs_vsc_sdp(const struct int
        return false;
  }
  
 +static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
 +                                   struct dp_sdp *sdp, size_t size)
 +{
 +      size_t length = sizeof(struct dp_sdp);
 +
 +      if (size < length)
 +              return -ENOSPC;
 +
 +      memset(sdp, 0, size);
 +
 +      /*
 +       * Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119
 +       * VSC SDP Header Bytes
 +       */
 +      sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */
 +      sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */
 +      sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */
 +      sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */
 +
 +      /* VSC SDP Payload for DB16 through DB18 */
 +      /* Pixel Encoding and Colorimetry Formats  */
 +      sdp->db[16] = (vsc->pixelformat & 0xf) << 4; /* DB16[7:4] */
 +      sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */
 +
 +      switch (vsc->bpc) {
 +      case 6:
 +              /* 6bpc: 0x0 */
 +              break;
 +      case 8:
 +              sdp->db[17] = 0x1; /* DB17[3:0] */
 +              break;
 +      case 10:
 +              sdp->db[17] = 0x2;
 +              break;
 +      case 12:
 +              sdp->db[17] = 0x3;
 +              break;
 +      case 16:
 +              sdp->db[17] = 0x4;
 +              break;
 +      default:
 +              MISSING_CASE(vsc->bpc);
 +              break;
 +      }
 +      /* Dynamic Range and Component Bit Depth */
 +      if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA)
 +              sdp->db[17] |= 0x80;  /* DB17[7] */
 +
 +      /* Content Type */
 +      sdp->db[18] = vsc->content_type & 0x7;
 +
 +      return length;
 +}
 +
 +static ssize_t
 +intel_dp_hdr_metadata_infoframe_sdp_pack(const struct hdmi_drm_infoframe *drm_infoframe,
 +                                       struct dp_sdp *sdp,
 +                                       size_t size)
 +{
 +      size_t length = sizeof(struct dp_sdp);
 +      const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE;
 +      unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE];
 +      ssize_t len;
 +
 +      if (size < length)
 +              return -ENOSPC;
 +
 +      memset(sdp, 0, size);
 +
 +      len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf));
 +      if (len < 0) {
 +              DRM_DEBUG_KMS("buffer size is smaller than hdr metadata infoframe\n");
 +              return -ENOSPC;
 +      }
 +
 +      if (len != infoframe_size) {
 +              DRM_DEBUG_KMS("wrong static hdr metadata size\n");
 +              return -ENOSPC;
 +      }
 +
 +      /*
 +       * Set up the infoframe sdp packet for HDR static metadata.
 +       * Prepare VSC Header for SU as per DP 1.4a spec,
 +       * Table 2-100 and Table 2-101
 +       */
 +
 +      /* Secondary-Data Packet ID, 00h for non-Audio INFOFRAME */
 +      sdp->sdp_header.HB0 = 0;
 +      /*
 +       * Packet Type 80h + Non-audio INFOFRAME Type value
 +       * HDMI_INFOFRAME_TYPE_DRM: 0x87
 +       * - 80h + Non-audio INFOFRAME Type value
 +       * - InfoFrame Type: 0x07
 +       *    [CTA-861-G Table-42 Dynamic Range and Mastering InfoFrame]
 +       */
 +      sdp->sdp_header.HB1 = drm_infoframe->type;
 +      /*
 +       * Least Significant Eight Bits of (Data Byte Count â€“ 1)
 +       * infoframe_size - 1
 +       */
 +      sdp->sdp_header.HB2 = 0x1D;
 +      /* INFOFRAME SDP Version Number */
 +      sdp->sdp_header.HB3 = (0x13 << 2);
 +      /* CTA Header Byte 2 (INFOFRAME Version Number) */
 +      sdp->db[0] = drm_infoframe->version;
 +      /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
 +      sdp->db[1] = drm_infoframe->length;
 +      /*
 +       * Copy HDMI_DRM_INFOFRAME_SIZE size from a buffer after
 +       * HDMI_INFOFRAME_HEADER_SIZE
 +       */
 +      BUILD_BUG_ON(sizeof(sdp->db) < HDMI_DRM_INFOFRAME_SIZE + 2);
 +      memcpy(&sdp->db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE],
 +             HDMI_DRM_INFOFRAME_SIZE);
 +
 +      /*
 +       * Size of DP infoframe sdp packet for HDR static metadata consists of
 +       * - DP SDP Header(struct dp_sdp_header): 4 bytes
 +       * - Two Data Blocks: 2 bytes
 +       *    CTA Header Byte2 (INFOFRAME Version Number)
 +       *    CTA Header Byte3 (Length of INFOFRAME)
 +       * - HDMI_DRM_INFOFRAME_SIZE: 26 bytes
 +       *
 +       * Prior to GEN11's GMP register size is identical to DP HDR static metadata
 +       * infoframe size. But GEN11+ has larger than that size, write_infoframe
 +       * will pad rest of the size.
 +       */
 +      return sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE;
 +}
 +
 +static void intel_write_dp_sdp(struct intel_encoder *encoder,
 +                             const struct intel_crtc_state *crtc_state,
 +                             unsigned int type)
 +{
 +      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      struct dp_sdp sdp = {};
 +      ssize_t len;
 +
 +      if ((crtc_state->infoframes.enable &
 +           intel_hdmi_infoframe_enable(type)) == 0)
 +              return;
 +
 +      switch (type) {
 +      case DP_SDP_VSC:
 +              len = intel_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp,
 +                                          sizeof(sdp));
 +              break;
 +      case HDMI_PACKET_TYPE_GAMUT_METADATA:
 +              len = intel_dp_hdr_metadata_infoframe_sdp_pack(&crtc_state->infoframes.drm.drm,
 +                                                             &sdp, sizeof(sdp));
 +              break;
 +      default:
 +              MISSING_CASE(type);
 +              return;
 +      }
 +
 +      if (drm_WARN_ON(&dev_priv->drm, len < 0))
 +              return;
 +
 +      intel_dig_port->write_infoframe(encoder, crtc_state, type, &sdp, len);
 +}
 +
 +void intel_dp_set_infoframes(struct intel_encoder *encoder,
 +                           bool enable,
 +                           const struct intel_crtc_state *crtc_state,
 +                           const struct drm_connector_state *conn_state)
 +{
 +      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 +      struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
 +      i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
 +      u32 dip_enable = VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
 +                       VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW |
 +                       VIDEO_DIP_ENABLE_SPD_HSW | VIDEO_DIP_ENABLE_DRM_GLK;
 +      u32 val = intel_de_read(dev_priv, reg);
 +
 +      /* TODO: Add DSC case (DIP_ENABLE_PPS) */
 +      /* When PSR is enabled, this routine doesn't disable VSC DIP */
 +      if (intel_psr_enabled(intel_dp))
 +              val &= ~dip_enable;
 +      else
 +              val &= ~(dip_enable | VIDEO_DIP_ENABLE_VSC_HSW);
 +
 +      if (!enable) {
 +              intel_de_write(dev_priv, reg, val);
 +              intel_de_posting_read(dev_priv, reg);
 +              return;
 +      }
 +
 +      intel_de_write(dev_priv, reg, val);
 +      intel_de_posting_read(dev_priv, reg);
 +
 +      /* When PSR is enabled, VSC SDP is handled by PSR routine */
 +      if (!intel_psr_enabled(intel_dp))
 +              intel_write_dp_sdp(encoder, crtc_state, DP_SDP_VSC);
 +
 +      intel_write_dp_sdp(encoder, crtc_state, HDMI_PACKET_TYPE_GAMUT_METADATA);
 +}
 +
  static void
  intel_dp_setup_vsc_sdp(struct intel_dp *intel_dp,
                       const struct intel_crtc_state *crtc_state,
@@@ -5154,7 -4762,6 +5154,7 @@@ intel_dp_setup_hdr_metadata_infoframe_s
                                          const struct intel_crtc_state *crtc_state,
                                          const struct drm_connector_state *conn_state)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        struct dp_sdp infoframe_sdp = {};
        struct hdmi_drm_infoframe drm_infoframe = {};
  
        ret = drm_hdmi_infoframe_set_hdr_metadata(&drm_infoframe, conn_state);
        if (ret) {
 -              DRM_DEBUG_KMS("couldn't set HDR metadata in infoframe\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "couldn't set HDR metadata in infoframe\n");
                return;
        }
  
        len = hdmi_drm_infoframe_pack_only(&drm_infoframe, buf, sizeof(buf));
        if (len < 0) {
 -              DRM_DEBUG_KMS("buffer size is smaller than hdr metadata infoframe\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "buffer size is smaller than hdr metadata infoframe\n");
                return;
        }
  
        if (len != infoframe_size) {
 -              DRM_DEBUG_KMS("wrong static hdr metadata size\n");
 +              drm_dbg_kms(&i915->drm, "wrong static hdr metadata size\n");
                return;
        }
  
@@@ -5256,7 -4861,6 +5256,7 @@@ void intel_dp_hdr_metadata_enable(struc
  
  static u8 intel_dp_autotest_link_training(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        int status = 0;
        int test_link_rate;
        u8 test_lane_count, test_link_bw;
                                   &test_lane_count);
  
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Lane count read failed\n");
 +              drm_dbg_kms(&i915->drm, "Lane count read failed\n");
                return DP_TEST_NAK;
        }
        test_lane_count &= DP_MAX_LANE_COUNT_MASK;
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LINK_RATE,
                                   &test_link_bw);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Link Rate read failed\n");
 +              drm_dbg_kms(&i915->drm, "Link Rate read failed\n");
                return DP_TEST_NAK;
        }
        test_link_rate = drm_dp_bw_code_to_link_rate(test_link_bw);
  
  static u8 intel_dp_autotest_video_pattern(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 test_pattern;
        u8 test_misc;
        __be16 h_width, v_height;
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_PATTERN,
                                   &test_pattern);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Test pattern read failed\n");
 +              drm_dbg_kms(&i915->drm, "Test pattern read failed\n");
                return DP_TEST_NAK;
        }
        if (test_pattern != DP_COLOR_RAMP)
        status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_H_WIDTH_HI,
                                  &h_width, 2);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("H Width read failed\n");
 +              drm_dbg_kms(&i915->drm, "H Width read failed\n");
                return DP_TEST_NAK;
        }
  
        status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_V_HEIGHT_HI,
                                  &v_height, 2);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("V Height read failed\n");
 +              drm_dbg_kms(&i915->drm, "V Height read failed\n");
                return DP_TEST_NAK;
        }
  
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_MISC0,
                                   &test_misc);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("TEST MISC read failed\n");
 +              drm_dbg_kms(&i915->drm, "TEST MISC read failed\n");
                return DP_TEST_NAK;
        }
        if ((test_misc & DP_TEST_COLOR_FORMAT_MASK) != DP_COLOR_FORMAT_RGB)
  
  static u8 intel_dp_autotest_edid(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 test_result = DP_TEST_ACK;
        struct intel_connector *intel_connector = intel_dp->attached_connector;
        struct drm_connector *connector = &intel_connector->base;
                 */
                if (intel_dp->aux.i2c_nack_count > 0 ||
                        intel_dp->aux.i2c_defer_count > 0)
 -                      DRM_DEBUG_KMS("EDID read had %d NACKs, %d DEFERs\n",
 -                                    intel_dp->aux.i2c_nack_count,
 -                                    intel_dp->aux.i2c_defer_count);
 +                      drm_dbg_kms(&i915->drm,
 +                                  "EDID read had %d NACKs, %d DEFERs\n",
 +                                  intel_dp->aux.i2c_nack_count,
 +                                  intel_dp->aux.i2c_defer_count);
                intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE;
        } else {
                struct edid *block = intel_connector->detect_edid;
  
                if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM,
                                       block->checksum) <= 0)
 -                      DRM_DEBUG_KMS("Failed to write EDID checksum\n");
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Failed to write EDID checksum\n");
  
                test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE;
                intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_PREFERRED;
        return test_result;
  }
  
+ static u8 intel_dp_prepare_phytest(struct intel_dp *intel_dp)
+ {
+       struct drm_dp_phy_test_params *data =
+               &intel_dp->compliance.test_data.phytest;
+       if (drm_dp_get_phy_test_pattern(&intel_dp->aux, data)) {
+               DRM_DEBUG_KMS("DP Phy Test pattern AUX read failure\n");
+               return DP_TEST_NAK;
+       }
+       /*
+        * link_mst is set to false to avoid executing mst related code
+        * during compliance testing.
+        */
+       intel_dp->link_mst = false;
+       return DP_TEST_ACK;
+ }
+ static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp)
+ {
+       struct drm_i915_private *dev_priv =
+                       to_i915(dp_to_dig_port(intel_dp)->base.base.dev);
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct drm_dp_phy_test_params *data =
+                       &intel_dp->compliance.test_data.phytest;
+       struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
+       enum pipe pipe = crtc->pipe;
+       u32 pattern_val;
+       switch (data->phy_pattern) {
+       case DP_PHY_TEST_PATTERN_NONE:
+               DRM_DEBUG_KMS("Disable Phy Test Pattern\n");
+               intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 0x0);
+               break;
+       case DP_PHY_TEST_PATTERN_D10_2:
+               DRM_DEBUG_KMS("Set D10.2 Phy Test Pattern\n");
+               intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
+                              DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_D10_2);
+               break;
+       case DP_PHY_TEST_PATTERN_ERROR_COUNT:
+               DRM_DEBUG_KMS("Set Error Count Phy Test Pattern\n");
+               intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
+                              DDI_DP_COMP_CTL_ENABLE |
+                              DDI_DP_COMP_CTL_SCRAMBLED_0);
+               break;
+       case DP_PHY_TEST_PATTERN_PRBS7:
+               DRM_DEBUG_KMS("Set PRBS7 Phy Test Pattern\n");
+               intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
+                              DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_PRBS7);
+               break;
+       case DP_PHY_TEST_PATTERN_80BIT_CUSTOM:
+               /*
+                * FIXME: Ideally pattern should come from DPCD 0x250. As
+                * current firmware of DPR-100 could not set it, so hardcoding
+                * now for complaince test.
+                */
+               DRM_DEBUG_KMS("Set 80Bit Custom Phy Test Pattern 0x3e0f83e0 0x0f83e0f8 0x0000f83e\n");
+               pattern_val = 0x3e0f83e0;
+               intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 0), pattern_val);
+               pattern_val = 0x0f83e0f8;
+               intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 1), pattern_val);
+               pattern_val = 0x0000f83e;
+               intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 2), pattern_val);
+               intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
+                              DDI_DP_COMP_CTL_ENABLE |
+                              DDI_DP_COMP_CTL_CUSTOM80);
+               break;
+       case DP_PHY_TEST_PATTERN_CP2520:
+               /*
+                * FIXME: Ideally pattern should come from DPCD 0x24A. As
+                * current firmware of DPR-100 could not set it, so hardcoding
+                * now for complaince test.
+                */
+               DRM_DEBUG_KMS("Set HBR2 compliance Phy Test Pattern\n");
+               pattern_val = 0xFB;
+               intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe),
+                              DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_HBR2 |
+                              pattern_val);
+               break;
+       default:
+               WARN(1, "Invalid Phy Test Pattern\n");
+       }
+ }
+ static void
+ intel_dp_autotest_phy_ddi_disable(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;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
+       enum pipe pipe = crtc->pipe;
+       u32 trans_ddi_func_ctl_value, trans_conf_value, dp_tp_ctl_value;
+       trans_ddi_func_ctl_value = intel_de_read(dev_priv,
+                                                TRANS_DDI_FUNC_CTL(pipe));
+       trans_conf_value = intel_de_read(dev_priv, PIPECONF(pipe));
+       dp_tp_ctl_value = intel_de_read(dev_priv, TGL_DP_TP_CTL(pipe));
+       trans_ddi_func_ctl_value &= ~(TRANS_DDI_FUNC_ENABLE |
+                                     TGL_TRANS_DDI_PORT_MASK);
+       trans_conf_value &= ~PIPECONF_ENABLE;
+       dp_tp_ctl_value &= ~DP_TP_CTL_ENABLE;
+       intel_de_write(dev_priv, PIPECONF(pipe), trans_conf_value);
+       intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(pipe),
+                      trans_ddi_func_ctl_value);
+       intel_de_write(dev_priv, TGL_DP_TP_CTL(pipe), dp_tp_ctl_value);
+ }
+ static void
+ intel_dp_autotest_phy_ddi_enable(struct intel_dp *intel_dp, uint8_t lane_cnt)
+ {
+       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(dev);
+       enum port port = intel_dig_port->base.port;
+       struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
+       enum pipe pipe = crtc->pipe;
+       u32 trans_ddi_func_ctl_value, trans_conf_value, dp_tp_ctl_value;
+       trans_ddi_func_ctl_value = intel_de_read(dev_priv,
+                                                TRANS_DDI_FUNC_CTL(pipe));
+       trans_conf_value = intel_de_read(dev_priv, PIPECONF(pipe));
+       dp_tp_ctl_value = intel_de_read(dev_priv, TGL_DP_TP_CTL(pipe));
+       trans_ddi_func_ctl_value |= TRANS_DDI_FUNC_ENABLE |
+                                   TGL_TRANS_DDI_SELECT_PORT(port);
+       trans_conf_value |= PIPECONF_ENABLE;
+       dp_tp_ctl_value |= DP_TP_CTL_ENABLE;
+       intel_de_write(dev_priv, PIPECONF(pipe), trans_conf_value);
+       intel_de_write(dev_priv, TGL_DP_TP_CTL(pipe), dp_tp_ctl_value);
+       intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(pipe),
+                      trans_ddi_func_ctl_value);
+ }
+ void intel_dp_process_phy_request(struct intel_dp *intel_dp)
+ {
+       struct drm_dp_phy_test_params *data =
+               &intel_dp->compliance.test_data.phytest;
+       u8 link_status[DP_LINK_STATUS_SIZE];
+       if (!intel_dp_get_link_status(intel_dp, link_status)) {
+               DRM_DEBUG_KMS("failed to get link status\n");
+               return;
+       }
+       /* retrieve vswing & pre-emphasis setting */
+       intel_dp_get_adjust_train(intel_dp, link_status);
+       intel_dp_autotest_phy_ddi_disable(intel_dp);
+       intel_dp_set_signal_levels(intel_dp);
+       intel_dp_phy_pattern_update(intel_dp);
+       intel_dp_autotest_phy_ddi_enable(intel_dp, data->num_lanes);
+       drm_dp_set_phy_test_pattern(&intel_dp->aux, data,
+                                   link_status[DP_DPCD_REV]);
+ }
  static u8 intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp)
  {
        u8 test_result = DP_TEST_NAK;
+       test_result = intel_dp_prepare_phytest(intel_dp);
+       if (test_result != DP_TEST_ACK)
+               DRM_ERROR("Phy test preparation failed\n");
+       intel_dp_process_phy_request(intel_dp);
        return test_result;
  }
  
  static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 response = DP_TEST_NAK;
        u8 request = 0;
        int status;
  
        status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_REQUEST, &request);
        if (status <= 0) {
 -              DRM_DEBUG_KMS("Could not read test request from sink\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "Could not read test request from sink\n");
                goto update_status;
        }
  
        switch (request) {
        case DP_TEST_LINK_TRAINING:
 -              DRM_DEBUG_KMS("LINK_TRAINING test requested\n");
 +              drm_dbg_kms(&i915->drm, "LINK_TRAINING test requested\n");
                response = intel_dp_autotest_link_training(intel_dp);
                break;
        case DP_TEST_LINK_VIDEO_PATTERN:
 -              DRM_DEBUG_KMS("TEST_PATTERN test requested\n");
 +              drm_dbg_kms(&i915->drm, "TEST_PATTERN test requested\n");
                response = intel_dp_autotest_video_pattern(intel_dp);
                break;
        case DP_TEST_LINK_EDID_READ:
 -              DRM_DEBUG_KMS("EDID test requested\n");
 +              drm_dbg_kms(&i915->drm, "EDID test requested\n");
                response = intel_dp_autotest_edid(intel_dp);
                break;
        case DP_TEST_LINK_PHY_TEST_PATTERN:
 -              DRM_DEBUG_KMS("PHY_PATTERN test requested\n");
 +              drm_dbg_kms(&i915->drm, "PHY_PATTERN test requested\n");
                response = intel_dp_autotest_phy_pattern(intel_dp);
                break;
        default:
 -              DRM_DEBUG_KMS("Invalid test request '%02x'\n", request);
 +              drm_dbg_kms(&i915->drm, "Invalid test request '%02x'\n",
 +                          request);
                break;
        }
  
  update_status:
        status = drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, response);
        if (status <= 0)
 -              DRM_DEBUG_KMS("Could not write test response to sink\n");
 +              drm_dbg_kms(&i915->drm,
 +                          "Could not write test response to sink\n");
  }
  
  static int
  intel_dp_check_mst_status(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        bool bret;
  
        if (intel_dp->is_mst) {
@@@ -5474,13 -5240,12 +5645,13 @@@ go_again
                        /* check link status - esi[10] = 0x200c */
                        if (intel_dp->active_mst_links > 0 &&
                            !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
 -                              DRM_DEBUG_KMS("channel EQ not ok, retraining\n");
 +                              drm_dbg_kms(&i915->drm,
 +                                          "channel EQ not ok, retraining\n");
                                intel_dp_start_link_train(intel_dp);
                                intel_dp_stop_link_train(intel_dp);
                        }
  
 -                      DRM_DEBUG_KMS("got esi %3ph\n", esi);
 +                      drm_dbg_kms(&i915->drm, "got esi %3ph\n", esi);
                        ret = drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
  
                        if (handled) {
  
                                bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
                                if (bret == true) {
 -                                      DRM_DEBUG_KMS("got esi2 %3ph\n", esi);
 +                                      drm_dbg_kms(&i915->drm,
 +                                                  "got esi2 %3ph\n", esi);
                                        goto go_again;
                                }
                        } else
  
                        return ret;
                } else {
 -                      DRM_DEBUG_KMS("failed to get ESI - device may have failed\n");
 +                      drm_dbg_kms(&i915->drm,
 +                                  "failed to get ESI - device may have failed\n");
                        intel_dp->is_mst = false;
                        drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
                                                        intel_dp->is_mst);
@@@ -5628,13 -5391,14 +5799,13 @@@ int intel_dp_retrain_link(struct intel_
   */
  static enum intel_hotplug_state
  intel_dp_hotplug(struct intel_encoder *encoder,
 -               struct intel_connector *connector,
 -               bool irq_received)
 +               struct intel_connector *connector)
  {
        struct drm_modeset_acquire_ctx ctx;
        enum intel_hotplug_state state;
        int ret;
  
 -      state = intel_encoder_hotplug(encoder, connector, irq_received);
 +      state = intel_encoder_hotplug(encoder, connector);
  
        drm_modeset_acquire_init(&ctx, 0);
  
         * Keeping it consistent with intel_ddi_hotplug() and
         * intel_hdmi_hotplug().
         */
 -      if (state == INTEL_HOTPLUG_UNCHANGED && irq_received)
 +      if (state == INTEL_HOTPLUG_UNCHANGED && !connector->hotplug_retries)
                state = INTEL_HOTPLUG_RETRY;
  
        return state;
  
  static void intel_dp_check_service_irq(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 val;
  
        if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
                intel_hdcp_handle_cp_irq(intel_dp->attached_connector);
  
        if (val & DP_SINK_SPECIFIC_IRQ)
 -              DRM_DEBUG_DRIVER("Sink specific irq unhandled\n");
 +              drm_dbg_kms(&i915->drm, "Sink specific irq unhandled\n");
  }
  
  /*
@@@ -5752,7 -5515,6 +5923,7 @@@ intel_dp_short_pulse(struct intel_dp *i
  static enum drm_connector_status
  intel_dp_detect_dpcd(struct intel_dp *intel_dp)
  {
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
        u8 *dpcd = intel_dp->dpcd;
        u8 type;
        }
  
        /* Anything else is out of spec, warn and ignore */
 -      DRM_DEBUG_KMS("Broken DP branch device, ignoring\n");
 +      drm_dbg_kms(&i915->drm, "Broken DP branch device, ignoring\n");
        return connector_status_disconnected;
  }
  
@@@ -6272,7 -6034,6 +6443,7 @@@ static int intel_dp_get_modes(struct dr
  static int
  intel_dp_connector_register(struct drm_connector *connector)
  {
 +      struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
        int ret;
  
  
        intel_connector_debugfs_add(connector);
  
 -      DRM_DEBUG_KMS("registering %s bus for %s\n",
 -                    intel_dp->aux.name, connector->kdev->kobj.name);
 +      drm_dbg_kms(&i915->drm, "registering %s bus for %s\n",
 +                  intel_dp->aux.name, connector->kdev->kobj.name);
  
        intel_dp->aux.dev = connector->kdev;
        ret = drm_dp_aux_register(&intel_dp->aux);
@@@ -6369,7 -6130,6 +6540,7 @@@ stati
  int intel_dp_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
                                u8 *an)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(&intel_dig_port->base.base));
        static const struct drm_dp_aux_msg msg = {
                .request = DP_AUX_NATIVE_WRITE,
        dpcd_ret = drm_dp_dpcd_write(&intel_dig_port->dp.aux, DP_AUX_HDCP_AN,
                                     an, DRM_HDCP_AN_LEN);
        if (dpcd_ret != DRM_HDCP_AN_LEN) {
 -              DRM_DEBUG_KMS("Failed to write An over DP/AUX (%zd)\n",
 -                            dpcd_ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Failed to write An over DP/AUX (%zd)\n",
 +                          dpcd_ret);
                return dpcd_ret >= 0 ? -EIO : dpcd_ret;
        }
  
                                rxbuf, sizeof(rxbuf),
                                DP_AUX_CH_CTL_AUX_AKSV_SELECT);
        if (ret < 0) {
 -              DRM_DEBUG_KMS("Write Aksv over DP/AUX failed (%d)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Write Aksv over DP/AUX failed (%d)\n", ret);
                return ret;
        } else if (ret == 0) {
 -              DRM_DEBUG_KMS("Aksv write over DP/AUX was empty\n");
 +              drm_dbg_kms(&i915->drm, "Aksv write over DP/AUX was empty\n");
                return -EIO;
        }
  
        reply = (rxbuf[0] >> 4) & DP_AUX_NATIVE_REPLY_MASK;
        if (reply != DP_AUX_NATIVE_REPLY_ACK) {
 -              DRM_DEBUG_KMS("Aksv write: no DP_AUX_NATIVE_REPLY_ACK %x\n",
 -                            reply);
 +              drm_dbg_kms(&i915->drm,
 +                          "Aksv write: no DP_AUX_NATIVE_REPLY_ACK %x\n",
 +                          reply);
                return -EIO;
        }
        return 0;
  static int intel_dp_hdcp_read_bksv(struct intel_digital_port *intel_dig_port,
                                   u8 *bksv)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
 +
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BKSV, bksv,
                               DRM_HDCP_KSV_LEN);
        if (ret != DRM_HDCP_KSV_LEN) {
 -              DRM_DEBUG_KMS("Read Bksv from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read Bksv from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
  static int intel_dp_hdcp_read_bstatus(struct intel_digital_port *intel_dig_port,
                                      u8 *bstatus)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
 +
        /*
         * For some reason the HDMI and DP HDCP specs call this register
         * definition by different names. In the HDMI spec, it's called BSTATUS,
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BINFO,
                               bstatus, DRM_HDCP_BSTATUS_LEN);
        if (ret != DRM_HDCP_BSTATUS_LEN) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
@@@ -6461,14 -6212,12 +6632,14 @@@ stati
  int intel_dp_hdcp_read_bcaps(struct intel_digital_port *intel_dig_port,
                             u8 *bcaps)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
  
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BCAPS,
                               bcaps, 1);
        if (ret != 1) {
 -              DRM_DEBUG_KMS("Read bcaps from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bcaps from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
  
@@@ -6494,14 -6243,11 +6665,14 @@@ stati
  int intel_dp_hdcp_read_ri_prime(struct intel_digital_port *intel_dig_port,
                                u8 *ri_prime)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
 +
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_RI_PRIME,
                               ri_prime, DRM_HDCP_RI_LEN);
        if (ret != DRM_HDCP_RI_LEN) {
 -              DRM_DEBUG_KMS("Read Ri' from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm, "Read Ri' from DP/AUX failed (%zd)\n",
 +                          ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
@@@ -6511,15 -6257,12 +6682,15 @@@ stati
  int intel_dp_hdcp_read_ksv_ready(struct intel_digital_port *intel_dig_port,
                                 bool *ksv_ready)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
        u8 bstatus;
 +
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS,
                               &bstatus, 1);
        if (ret != 1) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
        *ksv_ready = bstatus & DP_BSTATUS_READY;
@@@ -6530,7 -6273,6 +6701,7 @@@ stati
  int intel_dp_hdcp_read_ksv_fifo(struct intel_digital_port *intel_dig_port,
                                int num_downstream, u8 *ksv_fifo)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
        int i;
  
                                       ksv_fifo + i * DRM_HDCP_KSV_LEN,
                                       len);
                if (ret != len) {
 -                      DRM_DEBUG_KMS("Read ksv[%d] from DP/AUX failed (%zd)\n",
 -                                    i, ret);
 +                      drm_dbg_kms(&i915->drm,
 +                                  "Read ksv[%d] from DP/AUX failed (%zd)\n",
 +                                  i, ret);
                        return ret >= 0 ? -EIO : ret;
                }
        }
@@@ -6555,7 -6296,6 +6726,7 @@@ stati
  int intel_dp_hdcp_read_v_prime_part(struct intel_digital_port *intel_dig_port,
                                    int i, u32 *part)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
  
        if (i >= DRM_HDCP_V_PRIME_NUM_PARTS)
                               DP_AUX_HDCP_V_PRIME(i), part,
                               DRM_HDCP_V_PRIME_PART_LEN);
        if (ret != DRM_HDCP_V_PRIME_PART_LEN) {
 -              DRM_DEBUG_KMS("Read v'[%d] from DP/AUX failed (%zd)\n", i, ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read v'[%d] from DP/AUX failed (%zd)\n", i, ret);
                return ret >= 0 ? -EIO : ret;
        }
        return 0;
@@@ -6583,15 -6322,13 +6754,15 @@@ int intel_dp_hdcp_toggle_signalling(str
  static
  bool intel_dp_hdcp_check_link(struct intel_digital_port *intel_dig_port)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
        u8 bstatus;
  
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS,
                               &bstatus, 1);
        if (ret != 1) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return false;
        }
  
@@@ -6666,15 -6403,13 +6837,15 @@@ static inlin
  int intel_dp_hdcp2_read_rx_status(struct intel_digital_port *intel_dig_port,
                                  u8 *rx_status)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        ssize_t ret;
  
        ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux,
                               DP_HDCP_2_2_REG_RXSTATUS_OFFSET, rx_status,
                               HDCP_2_2_DP_RXSTATUS_LEN);
        if (ret != HDCP_2_2_DP_RXSTATUS_LEN) {
 -              DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
 +              drm_dbg_kms(&i915->drm,
 +                          "Read bstatus from DP/AUX failed (%zd)\n", ret);
                return ret >= 0 ? -EIO : ret;
        }
  
@@@ -6718,7 -6453,6 +6889,7 @@@ static ssize_
  intel_dp_hdcp2_wait_for_msg(struct intel_digital_port *intel_dig_port,
                            const struct hdcp2_dp_msg_data *hdcp2_msg_data)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        struct intel_dp *dp = &intel_dig_port->dp;
        struct intel_hdcp *hdcp = &dp->attached_connector->hdcp;
        u8 msg_id = hdcp2_msg_data->msg_id;
        }
  
        if (ret)
 -              DRM_DEBUG_KMS("msg_id %d, ret %d, timeout(mSec): %d\n",
 -                            hdcp2_msg_data->msg_id, ret, timeout);
 +              drm_dbg_kms(&i915->drm,
 +                          "msg_id %d, ret %d, timeout(mSec): %d\n",
 +                          hdcp2_msg_data->msg_id, ret, timeout);
  
        return ret;
  }
@@@ -6838,7 -6571,6 +7009,7 @@@ stati
  int intel_dp_hdcp2_read_msg(struct intel_digital_port *intel_dig_port,
                            u8 msg_id, void *buf, size_t size)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        unsigned int offset;
        u8 *byte = buf;
        ssize_t ret, bytes_to_recv, len;
                ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, offset,
                                       (void *)byte, len);
                if (ret < 0) {
 -                      DRM_DEBUG_KMS("msg_id %d, ret %zd\n", msg_id, ret);
 +                      drm_dbg_kms(&i915->drm, "msg_id %d, ret %zd\n",
 +                                  msg_id, ret);
                        return ret;
                }
  
@@@ -7164,11 -6895,7 +7335,11 @@@ static int intel_dp_connector_atomic_ch
        if (ret)
                return ret;
  
 -      if (INTEL_GEN(dev_priv) < 11)
 +      /*
 +       * We don't enable port sync on BDW due to missing w/as and
 +       * due to not having adjusted the modeset sequence appropriately.
 +       */
 +      if (INTEL_GEN(dev_priv) < 9)
                return 0;
  
        if (!intel_connector_needs_modeset(state, conn))
@@@ -7207,45 -6934,28 +7378,45 @@@ static const struct drm_encoder_funcs i
        .destroy = intel_dp_encoder_destroy,
  };
  
 +static bool intel_edp_have_power(struct intel_dp *intel_dp)
 +{
 +      intel_wakeref_t wakeref;
 +      bool have_power = false;
 +
 +      with_pps_lock(intel_dp, wakeref) {
 +              have_power = edp_have_panel_power(intel_dp) &&
 +                                                edp_have_panel_vdd(intel_dp);
 +      }
 +
 +      return have_power;
 +}
 +
  enum irqreturn
  intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
  {
 +      struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        struct intel_dp *intel_dp = &intel_dig_port->dp;
  
 -      if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
 +      if (intel_dig_port->base.type == INTEL_OUTPUT_EDP &&
 +          (long_hpd || !intel_edp_have_power(intel_dp))) {
                /*
 -               * vdd off can generate a long pulse on eDP which
 +               * vdd off can generate a long/short pulse on eDP which
                 * would require vdd on to handle it, and thus we
                 * would end up in an endless cycle of
 -               * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..."
 +               * "vdd off -> long/short hpd -> vdd on -> detect -> vdd off -> ..."
                 */
 -              DRM_DEBUG_KMS("ignoring long hpd on eDP [ENCODER:%d:%s]\n",
 -                            intel_dig_port->base.base.base.id,
 -                            intel_dig_port->base.base.name);
 +              drm_dbg_kms(&i915->drm,
 +                          "ignoring %s hpd on eDP [ENCODER:%d:%s]\n",
 +                          long_hpd ? "long" : "short",
 +                          intel_dig_port->base.base.base.id,
 +                          intel_dig_port->base.base.name);
                return IRQ_HANDLED;
        }
  
 -      DRM_DEBUG_KMS("got hpd irq on [ENCODER:%d:%s] - %s\n",
 -                    intel_dig_port->base.base.base.id,
 -                    intel_dig_port->base.base.name,
 -                    long_hpd ? "long" : "short");
 +      drm_dbg_kms(&i915->drm, "got hpd irq on [ENCODER:%d:%s] - %s\n",
 +                  intel_dig_port->base.base.base.id,
 +                  intel_dig_port->base.base.name,
 +                  long_hpd ? "long" : "short");
  
        if (long_hpd) {
                intel_dp->reset_link_params = true;
                         * 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);
 +                      drm_dbg_kms(&i915->drm,
 +                                  "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);
@@@ -114,10 -114,8 +114,11 @@@ void intel_dp_vsc_enable(struct intel_d
  void intel_dp_hdr_metadata_enable(struct intel_dp *intel_dp,
                                  const struct intel_crtc_state *crtc_state,
                                  const struct drm_connector_state *conn_state);
 +void intel_dp_set_infoframes(struct intel_encoder *encoder, bool enable,
 +                           const struct intel_crtc_state *crtc_state,
 +                           const struct drm_connector_state *conn_state);
  bool intel_digital_port_connected(struct intel_encoder *encoder);
+ void intel_dp_process_phy_request(struct intel_dp *intel_dp);
  
  static inline unsigned int intel_dp_unused_lane_mask(int lane_count)
  {
@@@ -3094,7 -3094,6 +3094,7 @@@ static inline bool i915_mmio_reg_valid(
  #define GT_BSD_CS_ERROR_INTERRUPT             (1 << 15)
  #define GT_BSD_USER_INTERRUPT                 (1 << 12)
  #define GT_RENDER_L3_PARITY_ERROR_INTERRUPT_S1        (1 << 11) /* hsw+; rsvd on snb, ivb, vlv */
 +#define GT_WAIT_SEMAPHORE_INTERRUPT           REG_BIT(11) /* bdw+ */
  #define GT_CONTEXT_SWITCH_INTERRUPT           (1 <<  8)
  #define GT_RENDER_L3_PARITY_ERROR_INTERRUPT   (1 <<  5) /* !snb */
  #define GT_RENDER_PIPECTL_NOTIFY_INTERRUPT    (1 <<  4)
@@@ -4325,96 -4324,6 +4325,96 @@@ enum 
  #define   EXITLINE_MASK               REG_GENMASK(12, 0)
  #define   EXITLINE_SHIFT      0
  
 +/* VRR registers */
 +#define _TRANS_VRR_CTL_A              0x60420
 +#define _TRANS_VRR_CTL_B              0x61420
 +#define _TRANS_VRR_CTL_C              0x62420
 +#define _TRANS_VRR_CTL_D              0x63420
 +#define TRANS_VRR_CTL(trans)          _MMIO_TRANS2(trans, _TRANS_VRR_CTL_A)
 +#define   VRR_CTL_VRR_ENABLE          REG_BIT(31)
 +#define   VRR_CTL_IGN_MAX_SHIFT               REG_BIT(30)
 +#define   VRR_CTL_FLIP_LINE_EN                REG_BIT(29)
 +#define   VRR_CTL_LINE_COUNT_MASK     REG_GENMASK(10, 3)
 +#define   VRR_CTL_SW_FULLLINE_COUNT   REG_BIT(0)
 +
 +#define _TRANS_VRR_VMAX_A             0x60424
 +#define _TRANS_VRR_VMAX_B             0x61424
 +#define _TRANS_VRR_VMAX_C             0x62424
 +#define _TRANS_VRR_VMAX_D             0x63424
 +#define TRANS_VRR_VMAX(trans)         _MMIO_TRANS2(trans, _TRANS_VRR_VMAX_A)
 +#define   VRR_VMAX_MASK                       REG_GENMASK(19, 0)
 +
 +#define _TRANS_VRR_VMIN_A             0x60434
 +#define _TRANS_VRR_VMIN_B             0x61434
 +#define _TRANS_VRR_VMIN_C             0x62434
 +#define _TRANS_VRR_VMIN_D             0x63434
 +#define TRANS_VRR_VMIN(trans)         _MMIO_TRANS2(trans, _TRANS_VRR_VMIN_A)
 +#define   VRR_VMIN_MASK                       REG_GENMASK(15, 0)
 +
 +#define _TRANS_VRR_VMAXSHIFT_A                0x60428
 +#define _TRANS_VRR_VMAXSHIFT_B                0x61428
 +#define _TRANS_VRR_VMAXSHIFT_C                0x62428
 +#define _TRANS_VRR_VMAXSHIFT_D                0x63428
 +#define TRANS_VRR_VMAXSHIFT(trans)    _MMIO_TRANS2(trans, \
 +                                      _TRANS_VRR_VMAXSHIFT_A)
 +#define   VRR_VMAXSHIFT_DEC_MASK      REG_GENMASK(29, 16)
 +#define   VRR_VMAXSHIFT_DEC           REG_BIT(16)
 +#define   VRR_VMAXSHIFT_INC_MASK      REG_GENMASK(12, 0)
 +
 +#define _TRANS_VRR_STATUS_A           0x6042C
 +#define _TRANS_VRR_STATUS_B           0x6142C
 +#define _TRANS_VRR_STATUS_C           0x6242C
 +#define _TRANS_VRR_STATUS_D           0x6342C
 +#define TRANS_VRR_STATUS(trans)               _MMIO_TRANS2(trans, _TRANS_VRR_STATUS_A)
 +#define   VRR_STATUS_VMAX_REACHED     REG_BIT(31)
 +#define   VRR_STATUS_NOFLIP_TILL_BNDR REG_BIT(30)
 +#define   VRR_STATUS_FLIP_BEF_BNDR    REG_BIT(29)
 +#define   VRR_STATUS_NO_FLIP_FRAME    REG_BIT(28)
 +#define   VRR_STATUS_VRR_EN_LIVE      REG_BIT(27)
 +#define   VRR_STATUS_FLIPS_SERVICED   REG_BIT(26)
 +#define   VRR_STATUS_VBLANK_MASK      REG_GENMASK(22, 20)
 +#define   STATUS_FSM_IDLE             REG_FIELD_PREP(VRR_STATUS_VBLANK_MASK, 0)
 +#define   STATUS_FSM_WAIT_TILL_FDB    REG_FIELD_PREP(VRR_STATUS_VBLANK_MASK, 1)
 +#define   STATUS_FSM_WAIT_TILL_FS     REG_FIELD_PREP(VRR_STATUS_VBLANK_MASK, 2)
 +#define   STATUS_FSM_WAIT_TILL_FLIP   REG_FIELD_PREP(VRR_STATUS_VBLANK_MASK, 3)
 +#define   STATUS_FSM_PIPELINE_FILL    REG_FIELD_PREP(VRR_STATUS_VBLANK_MASK, 4)
 +#define   STATUS_FSM_ACTIVE           REG_FIELD_PREP(VRR_STATUS_VBLANK_MASK, 5)
 +#define   STATUS_FSM_LEGACY_VBLANK    REG_FIELD_PREP(VRR_STATUS_VBLANK_MASK, 6)
 +
 +#define _TRANS_VRR_VTOTAL_PREV_A      0x60480
 +#define _TRANS_VRR_VTOTAL_PREV_B      0x61480
 +#define _TRANS_VRR_VTOTAL_PREV_C      0x62480
 +#define _TRANS_VRR_VTOTAL_PREV_D      0x63480
 +#define TRANS_VRR_VTOTAL_PREV(trans)  _MMIO_TRANS2(trans, \
 +                                      _TRANS_VRR_VTOTAL_PREV_A)
 +#define   VRR_VTOTAL_FLIP_BEFR_BNDR   REG_BIT(31)
 +#define   VRR_VTOTAL_FLIP_AFTER_BNDR  REG_BIT(30)
 +#define   VRR_VTOTAL_FLIP_AFTER_DBLBUF        REG_BIT(29)
 +#define   VRR_VTOTAL_PREV_FRAME_MASK  REG_GENMASK(19, 0)
 +
 +#define _TRANS_VRR_FLIPLINE_A         0x60438
 +#define _TRANS_VRR_FLIPLINE_B         0x61438
 +#define _TRANS_VRR_FLIPLINE_C         0x62438
 +#define _TRANS_VRR_FLIPLINE_D         0x63438
 +#define TRANS_VRR_FLIPLINE(trans)     _MMIO_TRANS2(trans, \
 +                                      _TRANS_VRR_FLIPLINE_A)
 +#define   VRR_FLIPLINE_MASK           REG_GENMASK(19, 0)
 +
 +#define _TRANS_VRR_STATUS2_A          0x6043C
 +#define _TRANS_VRR_STATUS2_B          0x6143C
 +#define _TRANS_VRR_STATUS2_C          0x6243C
 +#define _TRANS_VRR_STATUS2_D          0x6343C
 +#define TRANS_VRR_STATUS2(trans)      _MMIO_TRANS2(trans, _TRANS_VRR_STATUS2_A)
 +#define   VRR_STATUS2_VERT_LN_CNT_MASK        REG_GENMASK(19, 0)
 +
 +#define _TRANS_PUSH_A                 0x60A70
 +#define _TRANS_PUSH_B                 0x61A70
 +#define _TRANS_PUSH_C                 0x62A70
 +#define _TRANS_PUSH_D                 0x63A70
 +#define TRANS_PUSH(trans)             _MMIO_TRANS2(trans, _TRANS_PUSH_A)
 +#define   TRANS_PUSH_EN                       REG_BIT(31)
 +#define   TRANS_PUSH_SEND             REG_BIT(30)
 +
  /*
   * HSW+ eDP PSR registers
   *
  #define   PLANE_CTL_FORMAT_P012                       (5 << 24)
  #define   PLANE_CTL_FORMAT_XRGB_16161616F     (6 << 24)
  #define   PLANE_CTL_FORMAT_P016                       (7 << 24)
 -#define   PLANE_CTL_FORMAT_AYUV                       (8 << 24)
 +#define   PLANE_CTL_FORMAT_XYUV                       (8 << 24)
  #define   PLANE_CTL_FORMAT_INDEXED            (12 << 24)
  #define   PLANE_CTL_FORMAT_RGB_565            (14 << 24)
  #define   ICL_PLANE_CTL_FORMAT_MASK           (0x1f << 23)
@@@ -9791,11 -9700,8 +9791,11 @@@ enum skl_power_gate 
  #define  TRANS_DDI_BPC_10             (1 << 20)
  #define  TRANS_DDI_BPC_6              (2 << 20)
  #define  TRANS_DDI_BPC_12             (3 << 20)
 +#define  TRANS_DDI_PORT_SYNC_MASTER_SELECT_MASK       REG_GENMASK(19, 18) /* bdw-cnl */
 +#define  TRANS_DDI_PORT_SYNC_MASTER_SELECT(x) REG_FIELD_PREP(TRANS_DDI_PORT_SYNC_MASTER_SELECT_MASK, (x))
  #define  TRANS_DDI_PVSYNC             (1 << 17)
  #define  TRANS_DDI_PHSYNC             (1 << 16)
 +#define  TRANS_DDI_PORT_SYNC_ENABLE   REG_BIT(15) /* bdw-cnl */
  #define  TRANS_DDI_EDP_INPUT_MASK     (7 << 12)
  #define  TRANS_DDI_EDP_INPUT_A_ON     (0 << 12)
  #define  TRANS_DDI_EDP_INPUT_A_ONOFF  (4 << 12)
  #define _TRANS_DDI_FUNC_CTL2_EDP      0x6f404
  #define _TRANS_DDI_FUNC_CTL2_DSI0     0x6b404
  #define _TRANS_DDI_FUNC_CTL2_DSI1     0x6bc04
 -#define TRANS_DDI_FUNC_CTL2(tran)     _MMIO_TRANS2(tran, \
 -                                                   _TRANS_DDI_FUNC_CTL2_A)
 -#define  PORT_SYNC_MODE_ENABLE                        (1 << 4)
 -#define  PORT_SYNC_MODE_MASTER_SELECT(x)      ((x) << 0)
 -#define  PORT_SYNC_MODE_MASTER_SELECT_MASK    (0x7 << 0)
 -#define  PORT_SYNC_MODE_MASTER_SELECT_SHIFT   0
 +#define TRANS_DDI_FUNC_CTL2(tran)     _MMIO_TRANS2(tran, _TRANS_DDI_FUNC_CTL2_A)
 +#define  PORT_SYNC_MODE_ENABLE                        REG_BIT(4)
 +#define  PORT_SYNC_MODE_MASTER_SELECT_MASK    REG_GENMASK(2, 0)
 +#define  PORT_SYNC_MODE_MASTER_SELECT(x)      REG_FIELD_PREP(PORT_SYNC_MODE_MASTER_SELECT_MASK, (x))
  
  /* DisplayPort Transport Control */
  #define _DP_TP_CTL_A                  0x64040
  #define  DDI_BUF_BALANCE_LEG_ENABLE   (1 << 31)
  #define DDI_BUF_TRANS_HI(port, i)     _MMIO(_PORT(port, _DDI_BUF_TRANS_A, _DDI_BUF_TRANS_B) + (i) * 8 + 4)
  
+ /* DDI DP Compliance Control */
+ #define _DDI_DP_COMP_CTL_A                    0x605F0
+ #define _DDI_DP_COMP_CTL_B                    0x615F0
+ #define DDI_DP_COMP_CTL(pipe)                 _MMIO_PIPE(pipe, _DDI_DP_COMP_CTL_A, _DDI_DP_COMP_CTL_B)
+ #define   DDI_DP_COMP_CTL_ENABLE              (1 << 31)
+ #define   DDI_DP_COMP_CTL_D10_2                       (0 << 28)
+ #define   DDI_DP_COMP_CTL_SCRAMBLED_0         (1 << 28)
+ #define   DDI_DP_COMP_CTL_PRBS7                       (2 << 28)
+ #define   DDI_DP_COMP_CTL_CUSTOM80            (3 << 28)
+ #define   DDI_DP_COMP_CTL_HBR2                        (4 << 28)
+ #define   DDI_DP_COMP_CTL_SCRAMBLED_1         (5 << 28)
+ #define   DDI_DP_COMP_CTL_HBR2_RESET          (0xFC << 0)
+ /* DDI DP Compliance Pattern */
+ #define _DDI_DP_COMP_PAT_A                    0x605F4
+ #define _DDI_DP_COMP_PAT_B                    0x615F4
+ #define DDI_DP_COMP_PAT(pipe, i)              _MMIO(_PIPE(pipe, _DDI_DP_COMP_PAT_A, _DDI_DP_COMP_PAT_B) + (i) * 4)
  /* Sideband Interface (SBI) is programmed indirectly, via
   * SBI_ADDR, which contains the register offset; and SBI_DATA,
   * which contains the payload */
  
  #define _PAL_PREC_MULTI_SEG_DATA_A    0x4A40C
  #define _PAL_PREC_MULTI_SEG_DATA_B    0x4AC0C
 +#define  PAL_PREC_MULTI_SEG_RED_LDW_MASK   REG_GENMASK(29, 24)
 +#define  PAL_PREC_MULTI_SEG_RED_UDW_MASK   REG_GENMASK(29, 20)
 +#define  PAL_PREC_MULTI_SEG_GREEN_LDW_MASK REG_GENMASK(19, 14)
 +#define  PAL_PREC_MULTI_SEG_GREEN_UDW_MASK REG_GENMASK(19, 10)
 +#define  PAL_PREC_MULTI_SEG_BLUE_LDW_MASK  REG_GENMASK(9, 4)
 +#define  PAL_PREC_MULTI_SEG_BLUE_UDW_MASK  REG_GENMASK(9, 0)
  
  #define PREC_PAL_MULTI_SEG_INDEX(pipe)        _MMIO_PIPE(pipe, \
                                        _PAL_PREC_MULTI_SEG_INDEX_A, \
  # define DP_TEST_CRC_SUPPORTED                    (1 << 5)
  # define DP_TEST_COUNT_MASK               0xf
  
- #define DP_TEST_PHY_PATTERN                 0x248
+ #define DP_PHY_TEST_PATTERN                 0x248
+ # define DP_PHY_TEST_PATTERN_SEL_MASK       0x7
+ # define DP_PHY_TEST_PATTERN_NONE           0x0
+ # define DP_PHY_TEST_PATTERN_D10_2          0x1
+ # define DP_PHY_TEST_PATTERN_ERROR_COUNT    0x2
+ # define DP_PHY_TEST_PATTERN_PRBS7          0x3
+ # define DP_PHY_TEST_PATTERN_80BIT_CUSTOM   0x4
+ # define DP_PHY_TEST_PATTERN_CP2520         0x5
+ #define DP_TEST_HBR2_SCRAMBLER_RESET        0x24A
  #define DP_TEST_80BIT_CUSTOM_PATTERN_7_0    0x250
  #define       DP_TEST_80BIT_CUSTOM_PATTERN_15_8   0x251
  #define       DP_TEST_80BIT_CUSTOM_PATTERN_23_16  0x252
@@@ -1209,136 -1218,6 +1218,136 @@@ struct dp_sdp 
  #define EDP_VSC_PSR_UPDATE_RFB                (1<<1)
  #define EDP_VSC_PSR_CRC_VALUES_VALID  (1<<2)
  
 +/**
 + * enum dp_pixelformat - drm DP Pixel encoding formats
 + *
 + * This enum is used to indicate DP VSC SDP Pixel encoding formats.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18]
 + *
 + * @DP_PIXELFORMAT_RGB: RGB pixel encoding format
 + * @DP_PIXELFORMAT_YUV444: YCbCr 4:4:4 pixel encoding format
 + * @DP_PIXELFORMAT_YUV422: YCbCr 4:2:2 pixel encoding format
 + * @DP_PIXELFORMAT_YUV420: YCbCr 4:2:0 pixel encoding format
 + * @DP_PIXELFORMAT_Y_ONLY: Y Only pixel encoding format
 + * @DP_PIXELFORMAT_RAW: RAW pixel encoding format
 + * @DP_PIXELFORMAT_RESERVED: Reserved pixel encoding format
 + */
 +enum dp_pixelformat {
 +      DP_PIXELFORMAT_RGB = 0,
 +      DP_PIXELFORMAT_YUV444 = 0x1,
 +      DP_PIXELFORMAT_YUV422 = 0x2,
 +      DP_PIXELFORMAT_YUV420 = 0x3,
 +      DP_PIXELFORMAT_Y_ONLY = 0x4,
 +      DP_PIXELFORMAT_RAW = 0x5,
 +      DP_PIXELFORMAT_RESERVED = 0x6,
 +};
 +
 +/**
 + * enum dp_colorimetry - drm DP Colorimetry formats
 + *
 + * This enum is used to indicate DP VSC SDP Colorimetry formats.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18] and a name of enum member follows DRM_MODE_COLORIMETRY definition.
 + *
 + * @DP_COLORIMETRY_DEFAULT: sRGB (IEC 61966-2-1) or
 + *                          ITU-R BT.601 colorimetry format
 + * @DP_COLORIMETRY_RGB_WIDE_FIXED: RGB wide gamut fixed point colorimetry format
 + * @DP_COLORIMETRY_BT709_YCC: ITU-R BT.709 colorimetry format
 + * @DP_COLORIMETRY_RGB_WIDE_FLOAT: RGB wide gamut floating point
 + *                                 (scRGB (IEC 61966-2-2)) colorimetry format
 + * @DP_COLORIMETRY_XVYCC_601: xvYCC601 colorimetry format
 + * @DP_COLORIMETRY_OPRGB: OpRGB colorimetry format
 + * @DP_COLORIMETRY_XVYCC_709: xvYCC709 colorimetry format
 + * @DP_COLORIMETRY_DCI_P3_RGB: DCI-P3 (SMPTE RP 431-2) colorimetry format
 + * @DP_COLORIMETRY_SYCC_601: sYCC601 colorimetry format
 + * @DP_COLORIMETRY_RGB_CUSTOM: RGB Custom Color Profile colorimetry format
 + * @DP_COLORIMETRY_OPYCC_601: opYCC601 colorimetry format
 + * @DP_COLORIMETRY_BT2020_RGB: ITU-R BT.2020 R' G' B' colorimetry format
 + * @DP_COLORIMETRY_BT2020_CYCC: ITU-R BT.2020 Y'c C'bc C'rc colorimetry format
 + * @DP_COLORIMETRY_BT2020_YCC: ITU-R BT.2020 Y' C'b C'r colorimetry format
 + */
 +enum dp_colorimetry {
 +      DP_COLORIMETRY_DEFAULT = 0,
 +      DP_COLORIMETRY_RGB_WIDE_FIXED = 0x1,
 +      DP_COLORIMETRY_BT709_YCC = 0x1,
 +      DP_COLORIMETRY_RGB_WIDE_FLOAT = 0x2,
 +      DP_COLORIMETRY_XVYCC_601 = 0x2,
 +      DP_COLORIMETRY_OPRGB = 0x3,
 +      DP_COLORIMETRY_XVYCC_709 = 0x3,
 +      DP_COLORIMETRY_DCI_P3_RGB = 0x4,
 +      DP_COLORIMETRY_SYCC_601 = 0x4,
 +      DP_COLORIMETRY_RGB_CUSTOM = 0x5,
 +      DP_COLORIMETRY_OPYCC_601 = 0x5,
 +      DP_COLORIMETRY_BT2020_RGB = 0x6,
 +      DP_COLORIMETRY_BT2020_CYCC = 0x6,
 +      DP_COLORIMETRY_BT2020_YCC = 0x7,
 +};
 +
 +/**
 + * enum dp_dynamic_range - drm DP Dynamic Range
 + *
 + * This enum is used to indicate DP VSC SDP Dynamic Range.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18]
 + *
 + * @DP_DYNAMIC_RANGE_VESA: VESA range
 + * @DP_DYNAMIC_RANGE_CTA: CTA range
 + */
 +enum dp_dynamic_range {
 +      DP_DYNAMIC_RANGE_VESA = 0,
 +      DP_DYNAMIC_RANGE_CTA = 1,
 +};
 +
 +/**
 + * enum dp_content_type - drm DP Content Type
 + *
 + * This enum is used to indicate DP VSC SDP Content Types.
 + * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
 + * DB18]
 + * CTA-861-G defines content types and expected processing by a sink device
 + *
 + * @DP_CONTENT_TYPE_NOT_DEFINED: Not defined type
 + * @DP_CONTENT_TYPE_GRAPHICS: Graphics type
 + * @DP_CONTENT_TYPE_PHOTO: Photo type
 + * @DP_CONTENT_TYPE_VIDEO: Video type
 + * @DP_CONTENT_TYPE_GAME: Game type
 + */
 +enum dp_content_type {
 +      DP_CONTENT_TYPE_NOT_DEFINED = 0x00,
 +      DP_CONTENT_TYPE_GRAPHICS = 0x01,
 +      DP_CONTENT_TYPE_PHOTO = 0x02,
 +      DP_CONTENT_TYPE_VIDEO = 0x03,
 +      DP_CONTENT_TYPE_GAME = 0x04,
 +};
 +
 +/**
 + * struct drm_dp_vsc_sdp - drm DP VSC SDP
 + *
 + * This structure represents a DP VSC SDP of drm
 + * It is based on DP 1.4 spec [Table 2-116: VSC SDP Header Bytes] and
 + * [Table 2-117: VSC SDP Payload for DB16 through DB18]
 + *
 + * @sdp_type: secondary-data packet type
 + * @revision: revision number
 + * @length: number of valid data bytes
 + * @pixelformat: pixel encoding format
 + * @colorimetry: colorimetry format
 + * @bpc: bit per color
 + * @dynamic_range: dynamic range information
 + * @content_type: CTA-861-G defines content types and expected processing by a sink device
 + */
 +struct drm_dp_vsc_sdp {
 +      unsigned char sdp_type;
 +      unsigned char revision;
 +      unsigned char length;
 +      enum dp_pixelformat pixelformat;
 +      enum dp_colorimetry colorimetry;
 +      int bpc;
 +      enum dp_dynamic_range dynamic_range;
 +      enum dp_content_type content_type;
 +};
 +
  int drm_dp_psr_setup_time(const u8 psr_cap[EDP_PSR_RECEIVER_CAP_SIZE]);
  
  static inline int
@@@ -1678,13 -1557,6 +1687,13 @@@ enum drm_dp_quirk 
         * capabilities advertised.
         */
        DP_QUIRK_FORCE_DPCD_BACKLIGHT,
 +      /**
 +       * @DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS:
 +       *
 +       * The device supports a link rate of 3.24 Gbps (multiplier 0xc) despite
 +       * the DP_MAX_LINK_RATE register reporting a lower max multiplier.
 +       */
 +      DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS,
  };
  
  /**
@@@ -1735,4 -1607,26 +1744,26 @@@ static inline void drm_dp_cec_unset_edi
  
  #endif
  
+ /**
+  * struct drm_dp_phy_test_params - DP Phy Compliance parameters
+  * @link_rate: Requested Link rate from DPCD 0x219
+  * @num_lanes: Number of lanes requested by sing through DPCD 0x220
+  * @phy_pattern: DP Phy test pattern from DPCD 0x248
+  * @hb2_reset: DP HBR2_COMPLIANCE_SCRAMBLER_RESET from DCPD 0x24A and 0x24B
+  * @custom80: DP Test_80BIT_CUSTOM_PATTERN from DPCDs 0x250 through 0x259
+  * @enhanced_frame_cap: flag for enhanced frame capability.
+  */
+ struct drm_dp_phy_test_params {
+       int link_rate;
+       u8 num_lanes;
+       u8 phy_pattern;
+       u8 hbr2_reset[2];
+       u8 custom80[10];
+       bool enhanced_frame_cap;
+ };
+ int drm_dp_get_phy_test_pattern(struct drm_dp_aux *aux,
+                               struct drm_dp_phy_test_params *data);
+ int drm_dp_set_phy_test_pattern(struct drm_dp_aux *aux,
+                               struct drm_dp_phy_test_params *data, u8 dp_rev);
  #endif /* _DRM_DP_HELPER_H_ */