On Fri, 15 Oct 2021, Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Reorganize the HDMI 4:2:0 handling a bit by introducing > intel_hdmi_output_format(). We already have the DP counterpart > and I want to unify the 4:2:0 handling across both a bit. > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Patches 1-5, Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_hdmi.c | 35 ++++++++++++++--------- > 1 file changed, 22 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c > index 18e7ef125827..7e6af959bf83 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdmi.c > +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c > @@ -2157,34 +2157,43 @@ static bool intel_hdmi_has_audio(struct intel_encoder *encoder, > return intel_conn_state->force_audio == HDMI_AUDIO_ON; > } > > +static enum intel_output_format > +intel_hdmi_output_format(struct intel_connector *connector, > + bool ycbcr_420_output) > +{ > + if (connector->base.ycbcr_420_allowed && ycbcr_420_output) > + return INTEL_OUTPUT_FORMAT_YCBCR420; > + else > + return INTEL_OUTPUT_FORMAT_RGB; > +} > + > static int intel_hdmi_compute_output_format(struct intel_encoder *encoder, > struct intel_crtc_state *crtc_state, > const struct drm_connector_state *conn_state) > { > - struct drm_connector *connector = conn_state->connector; > - struct drm_i915_private *i915 = to_i915(connector->dev); > + struct intel_connector *connector = to_intel_connector(conn_state->connector); > const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; > + const struct drm_display_info *info = &connector->base.display_info; > + struct drm_i915_private *i915 = to_i915(connector->base.dev); > + bool ycbcr_420_only = drm_mode_is_420_only(info, adjusted_mode); > int ret; > - bool ycbcr_420_only; > > - ycbcr_420_only = drm_mode_is_420_only(&connector->display_info, adjusted_mode); > - if (connector->ycbcr_420_allowed && ycbcr_420_only) { > - crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420; > - } else { > - if (!connector->ycbcr_420_allowed && ycbcr_420_only) > - drm_dbg_kms(&i915->drm, > - "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back to RGB.\n"); > + crtc_state->output_format = intel_hdmi_output_format(connector, ycbcr_420_only); > + > + if (ycbcr_420_only && !intel_hdmi_is_ycbcr420(crtc_state)) { > + drm_dbg_kms(&i915->drm, > + "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back to RGB.\n"); > crtc_state->output_format = INTEL_OUTPUT_FORMAT_RGB; > } > > ret = intel_hdmi_compute_clock(encoder, crtc_state); > if (ret) { > if (intel_hdmi_is_ycbcr420(crtc_state) || > - !connector->ycbcr_420_allowed || > - !drm_mode_is_420_also(&connector->display_info, adjusted_mode)) > + !connector->base.ycbcr_420_allowed || > + !drm_mode_is_420_also(info, adjusted_mode)) > return ret; > > - crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420; > + crtc_state->output_format = intel_hdmi_output_format(connector, true); > ret = intel_hdmi_compute_clock(encoder, crtc_state); > } -- Jani Nikula, Intel Open Source Graphics Center