LGTM Reviewed-by: Ankit Nautiyal On 10/15/2021 7:09 PM, Ville Syrjala wrote: > From: Ville Syrjälä > > Just loop over the possible bpc values instead of > using an ugly if construct. > > A slight change in behaviour is that we now call > intel_hdmi_{source,sink}_bpc_possible() even for 8bpc, > but that is fine since 8bpc is always supported. > > Signed-off-by: Ville Syrjälä > --- > drivers/gpu/drm/i915/display/intel_hdmi.c | 37 +++++++++++++---------- > 1 file changed, 21 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c > index b5af986b2778..c6586d10a9d0 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdmi.c > +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c > @@ -1934,25 +1934,30 @@ intel_hdmi_mode_clock_valid(struct drm_connector *connector, int clock, > { > struct drm_i915_private *i915 = to_i915(connector->dev); > struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector)); > - enum drm_mode_status status; > + enum drm_mode_status status = MODE_OK; > + int bpc; > > - /* check if we can do 8bpc */ > - status = hdmi_port_clock_valid(hdmi, intel_hdmi_tmds_clock(clock, 8, ycbcr420_output), > - true, has_hdmi_sink); > + /* > + * Try all color depths since valid port clock range > + * can have holes. Any mode that can be used with at > + * least one color depth is accepted. > + */ > + for (bpc = 12; bpc >= 8; bpc -= 2) { > + int tmds_clock = intel_hdmi_tmds_clock(clock, bpc, ycbcr420_output); > > - /* if we can't do 8bpc we may still be able to do 12bpc */ > - if (status != MODE_OK && > - intel_hdmi_source_bpc_possible(i915, 12) && > - intel_hdmi_sink_bpc_possible(connector, 12, has_hdmi_sink, ycbcr420_output)) > - status = hdmi_port_clock_valid(hdmi, intel_hdmi_tmds_clock(clock, 12, ycbcr420_output), > - true, has_hdmi_sink); > + if (!intel_hdmi_source_bpc_possible(i915, bpc)) > + continue; > > - /* if we can't do 8,12bpc we may still be able to do 10bpc */ > - if (status != MODE_OK && > - intel_hdmi_source_bpc_possible(i915, 10) && > - intel_hdmi_sink_bpc_possible(connector, 10, has_hdmi_sink, ycbcr420_output)) > - status = hdmi_port_clock_valid(hdmi, intel_hdmi_tmds_clock(clock, 10, ycbcr420_output), > - true, has_hdmi_sink); > + if (!intel_hdmi_sink_bpc_possible(connector, bpc, has_hdmi_sink, ycbcr420_output)) > + continue; > + > + status = hdmi_port_clock_valid(hdmi, tmds_clock, true, has_hdmi_sink); > + if (status == MODE_OK) > + return MODE_OK; > + } > + > + /* can never happen */ > + drm_WARN_ON(&i915->drm, status == MODE_OK); > > return status; > }