> -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Ville Syrjala > Sent: Tuesday, March 22, 2022 5:30 PM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Subject: [PATCH v2 02/12] drm/i915/dp: Respect the sink's max TMDS > clock when dealing with DP->HDMI DFPs > > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Currently we only look at the DFPs max TMDS clock limit when considering whether > the mode is valid, or whether we can do deep color. The sink's max TMDS clock limit > may be lower than the DFPs, so we need to account for it as well. Looks Good to me. Reviewed-by: Uma Shankar <uma.shankar@xxxxxxxxx> > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/4095 > Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2844 > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_dp.c | 24 +++++++++++++++++++----- > 1 file changed, 19 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > b/drivers/gpu/drm/i915/display/intel_dp.c > index e874d2f78088..3394e4951fef 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -856,20 +856,34 @@ static bool intel_dp_hdisplay_bad(struct drm_i915_private > *dev_priv, > 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; > -- > 2.34.1