In anticipation of userspace being able to explicitly select supported sink formats, add handling of the YCBCR444 sink format. The AUTO path does not choose this format, but with explicit format selection added to the driver, it becomes a possibility.
Check for YCBCR444 support on the sink in sink_bpc_possible, and on the source and sink in sink_format_valid. Acked-by: Daniel Stone <[email protected]> Signed-off-by: Nicolas Frattaroli <[email protected]> --- drivers/gpu/drm/i915/display/intel_hdmi.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c index 9076c2b176ec..6c6a3a0677fe 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -1966,6 +1966,8 @@ static bool intel_hdmi_sink_bpc_possible(struct drm_connector *_connector, if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420) return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_36; + else if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR444) + return info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_36; else return info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36; case 10: @@ -1974,6 +1976,8 @@ static bool intel_hdmi_sink_bpc_possible(struct drm_connector *_connector, if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420) return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_30; + else if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR444) + return info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_30; else return info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30; case 8: @@ -2021,6 +2025,17 @@ intel_hdmi_mode_clock_valid(struct drm_connector *_connector, int clock, return status; } +static bool +intel_hdmi_can_ycbcr444(struct intel_connector *connector) +{ + const struct intel_display *display = to_intel_display(connector); + + if (!HAS_GMCH(display)) + return true; + + return false; +} + static enum drm_mode_status intel_hdmi_sink_format_valid(struct intel_connector *connector, const struct drm_display_mode *mode, @@ -2036,6 +2051,15 @@ intel_hdmi_sink_format_valid(struct intel_connector *connector, !drm_mode_is_420(info, mode)) return MODE_NO_420; + return MODE_OK; + case INTEL_OUTPUT_FORMAT_YCBCR444: + if (!has_hdmi_sink) + return MODE_BAD; + if (!intel_hdmi_can_ycbcr444(connector)) + return MODE_BAD; + if (!(info->color_formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444))) + return MODE_BAD; + return MODE_OK; case INTEL_OUTPUT_FORMAT_RGB: return MODE_OK; -- 2.54.0
