Commit bb115220 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915/hdmi: Introduce intel_hdmi_is_ycbr420()

Introduce a small helper which given the crtc state tells us
whether we're output YCbCr 4:2:0 or not. For native HDMI this
is rather simple as we just look at the output_format. But I
think the helper is beneficial since with DP HDMI DFPs we're
going to need a more complex variant, and I want to unify the
DP and HDMI sides of that as much as possible.
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211015133921.4609-3-ville.syrjala@linux.intel.comReviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 3cf460bd
...@@ -1799,6 +1799,11 @@ static bool intel_has_hdmi_sink(struct intel_hdmi *hdmi, ...@@ -1799,6 +1799,11 @@ static bool intel_has_hdmi_sink(struct intel_hdmi *hdmi,
READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI; READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI;
} }
static bool intel_hdmi_is_ycbcr420(const struct intel_crtc_state *crtc_state)
{
return crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420;
}
static int hdmi_port_clock_limit(struct intel_hdmi *hdmi, static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
bool respect_downstream_limits, bool respect_downstream_limits,
bool has_hdmi_sink) bool has_hdmi_sink)
...@@ -2036,7 +2041,7 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state, ...@@ -2036,7 +2041,7 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
return false; return false;
/* Display Wa_1405510057:icl,ehl */ /* Display Wa_1405510057:icl,ehl */
if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 && if (intel_hdmi_is_ycbcr420(crtc_state) &&
bpc == 10 && DISPLAY_VER(dev_priv) == 11 && bpc == 10 && DISPLAY_VER(dev_priv) == 11 &&
(adjusted_mode->crtc_hblank_end - (adjusted_mode->crtc_hblank_end -
adjusted_mode->crtc_hblank_start) % 8 == 2) adjusted_mode->crtc_hblank_start) % 8 == 2)
...@@ -2044,8 +2049,7 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state, ...@@ -2044,8 +2049,7 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
return intel_hdmi_deep_color_possible(crtc_state, bpc, return intel_hdmi_deep_color_possible(crtc_state, bpc,
crtc_state->has_hdmi_sink, crtc_state->has_hdmi_sink,
crtc_state->output_format == intel_hdmi_is_ycbcr420(crtc_state));
INTEL_OUTPUT_FORMAT_YCBCR420);
} }
static int intel_hdmi_compute_bpc(struct intel_encoder *encoder, static int intel_hdmi_compute_bpc(struct intel_encoder *encoder,
...@@ -2079,7 +2083,7 @@ static int intel_hdmi_compute_clock(struct intel_encoder *encoder, ...@@ -2079,7 +2083,7 @@ static int intel_hdmi_compute_clock(struct intel_encoder *encoder,
clock *= 2; clock *= 2;
/* YCBCR420 TMDS rate requirement is half the pixel clock */ /* YCBCR420 TMDS rate requirement is half the pixel clock */
if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) if (intel_hdmi_is_ycbcr420(crtc_state))
clock /= 2; clock /= 2;
bpc = intel_hdmi_compute_bpc(encoder, crtc_state, clock); bpc = intel_hdmi_compute_bpc(encoder, crtc_state, clock);
...@@ -2176,7 +2180,7 @@ static int intel_hdmi_compute_output_format(struct intel_encoder *encoder, ...@@ -2176,7 +2180,7 @@ static int intel_hdmi_compute_output_format(struct intel_encoder *encoder,
ret = intel_hdmi_compute_clock(encoder, crtc_state); ret = intel_hdmi_compute_clock(encoder, crtc_state);
if (ret) { if (ret) {
if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420 && if (!intel_hdmi_is_ycbcr420(crtc_state) &&
connector->ycbcr_420_allowed && connector->ycbcr_420_allowed &&
drm_mode_is_420_also(&connector->display_info, adjusted_mode)) { drm_mode_is_420_also(&connector->display_info, adjusted_mode)) {
crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420; crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420;
...@@ -2221,7 +2225,7 @@ int intel_hdmi_compute_config(struct intel_encoder *encoder, ...@@ -2221,7 +2225,7 @@ int intel_hdmi_compute_config(struct intel_encoder *encoder,
if (ret) if (ret)
return ret; return ret;
if (pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) { if (intel_hdmi_is_ycbcr420(pipe_config)) {
ret = intel_panel_fitting(pipe_config, conn_state); ret = intel_panel_fitting(pipe_config, conn_state);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment