return hdisplay == 4096 && !HAS_DDI(dev_priv);
 }
 
+static int intel_dp_max_tmds_clock(struct intel_dp *intel_dp)
+{
+       struct intel_connector *connector = intel_dp->attached_connector;
+       const struct drm_display_info *info = &connector->base.display_info;
+       int max_tmds_clock = intel_dp->dfp.max_tmds_clock;
+
+       /* Only consider the sink's max TMDS clock if we know this is a HDMI DFP */
+       if (max_tmds_clock && info->max_tmds_clock)
+               max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock);
+
+       return max_tmds_clock;
+}
+
 static enum drm_mode_status
 intel_dp_tmds_clock_valid(struct intel_dp *intel_dp,
                          int clock, int bpc, bool ycbcr420_output)
 {
-       int tmds_clock;
+       int tmds_clock, min_tmds_clock, max_tmds_clock;
 
        tmds_clock = intel_hdmi_tmds_clock(clock, bpc, ycbcr420_output);
 
-       if (intel_dp->dfp.min_tmds_clock &&
-           tmds_clock < intel_dp->dfp.min_tmds_clock)
+       min_tmds_clock = intel_dp->dfp.min_tmds_clock;
+       max_tmds_clock = intel_dp_max_tmds_clock(intel_dp);
+
+       if (min_tmds_clock && tmds_clock < min_tmds_clock)
                return MODE_CLOCK_LOW;
 
-       if (intel_dp->dfp.max_tmds_clock &&
-           tmds_clock > intel_dp->dfp.max_tmds_clock)
+       if (max_tmds_clock && tmds_clock > max_tmds_clock)
                return MODE_CLOCK_HIGH;
 
        return MODE_OK;