diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 088b638a9dfd..761314033f0e 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -2000,6 +2000,10 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, { struct hdmi_avi_infoframe frame; u8 val; + bool is_hdmi2; + const struct drm_display_info *info = &connector->display_info; + + is_hdmi2 = info->hdmi.scdc.supported || (info->color_formats & DRM_COLOR_FORMAT_YCRCB420); /* Initialise info frame from DRM mode */ drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); @@ -2062,10 +2066,22 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; break; } + frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED; } else { - frame.colorimetry = HDMI_COLORIMETRY_NONE; - frame.extended_colorimetry = - HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + if (hdmi->hdmi_data.enc_out_encoding == V4L2_YCBCR_ENC_BT2020) { + frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; + frame.extended_colorimetry = + HDMI_EXTENDED_COLORIMETRY_BT2020; + } else { + frame.colorimetry = HDMI_COLORIMETRY_NONE; + frame.extended_colorimetry = + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + } + + if (is_hdmi2 && frame.quantization_range == HDMI_QUANTIZATION_RANGE_FULL) + frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_FULL; + else + frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED; } /*