From 61a52ffaaa381c3f529a1366d2b2db66f4f6ed20 Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu Date: Thu, 22 Mar 2018 18:10:28 -0500 Subject: [PATCH] MLK-17703-3: drm: imx: hdp: send the right colorimetry to the sink Currently, the colorimetry was hardcoded to NONE. However, a sink may support different types of colorimetry. This patch will allow for the colorimetry to be set according to what the sink supports. Signed-off-by: Laurentiu Palcu CC: Sandor Yu --- drivers/gpu/drm/imx/hdp/imx-hdmi.c | 58 ++++++++++++++++++++++++++---- drivers/mxc/hdp/API_AVI.c | 15 +++----- drivers/mxc/hdp/API_AVI.h | 3 +- 3 files changed, 57 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/imx/hdp/imx-hdmi.c b/drivers/gpu/drm/imx/hdp/imx-hdmi.c index 8cc35c293e67..449876bdd759 100644 --- a/drivers/gpu/drm/imx/hdp/imx-hdmi.c +++ b/drivers/gpu/drm/imx/hdp/imx-hdmi.c @@ -109,8 +109,6 @@ void hdmi_mode_set(state_struct *state, struct drm_display_mode *mode, int forma { int ret; - /* B/W Balance Type: 0 no data, 1 IT601, 2 ITU709 */ - BT_TYPE bw_type = 0; /* Mode = 0 - DVI, 1 - HDMI1.4, 2 HDMI 2.0 */ HDMI_TX_MAIL_HANDLER_PROTOCOL_TYPE ptype = 1; @@ -130,7 +128,7 @@ void hdmi_mode_set(state_struct *state, struct drm_display_mode *mode, int forma return; } - ret = CDN_API_Set_AVI(state, mode, format, bw_type); + ret = CDN_API_Set_AVI(state, mode, format, 0, 0); if (ret != CDN_OK) { DRM_INFO("CDN_API_Set_AVI ret = %d\n", ret); return; @@ -196,12 +194,55 @@ int hdmi_phy_init_t28hpc(state_struct *state, struct drm_display_mode *mode, int return true; } +#define RGB_ALLOWED_COLORIMETRY (BIT(HDMI_EXTENDED_COLORIMETRY_BT2020) |\ + BIT(HDMI_EXTENDED_COLORIMETRY_OPRGB)) +#define YCC_ALLOWED_COLORIMETRY (BIT(HDMI_EXTENDED_COLORIMETRY_BT2020) |\ + BIT(HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM) |\ + BIT(HDMI_EXTENDED_COLORIMETRY_OPYCC_601) |\ + BIT(HDMI_EXTENDED_COLORIMETRY_S_YCC_601) |\ + BIT(HDMI_EXTENDED_COLORIMETRY_XV_YCC_709) |\ + BIT(HDMI_EXTENDED_COLORIMETRY_XV_YCC_601)) + +static void hdmi_compute_colorimetry(struct drm_display_info *di, + int format, + enum hdmi_colorimetry *colorimetry, + enum hdmi_extended_colorimetry *ext_colorimetry) +{ + u32 sink_colorimetry; + u32 allowed_colorimetry; + + allowed_colorimetry = format == PXL_RGB ? RGB_ALLOWED_COLORIMETRY : + YCC_ALLOWED_COLORIMETRY; + + sink_colorimetry = di->hdmi.colorimetry & allowed_colorimetry; + + if (sink_colorimetry & BIT(HDMI_EXTENDED_COLORIMETRY_BT2020)) + *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_BT2020; + else if (sink_colorimetry & BIT(HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM)) + *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM; + else if (sink_colorimetry & BIT(HDMI_EXTENDED_COLORIMETRY_OPRGB)) + *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_OPRGB; + else if (sink_colorimetry & BIT(HDMI_EXTENDED_COLORIMETRY_XV_YCC_709)) + *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_XV_YCC_709; + else if (sink_colorimetry & BIT(HDMI_EXTENDED_COLORIMETRY_OPYCC_601)) + *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_OPYCC_601; + else if (sink_colorimetry & BIT(HDMI_EXTENDED_COLORIMETRY_S_YCC_601)) + *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_S_YCC_601; + else if (sink_colorimetry & BIT(HDMI_EXTENDED_COLORIMETRY_XV_YCC_601)) + *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + else + *ext_colorimetry = 0; + + *colorimetry = sink_colorimetry ? HDMI_COLORIMETRY_EXTENDED : + HDMI_COLORIMETRY_NONE; +} + void hdmi_mode_set_t28hpc(state_struct *state, struct drm_display_mode *mode, int format, int color_depth, int temp) { + struct imx_hdp *hdp = container_of(state, struct imx_hdp, state); int ret; - - /* B/W Balance Type: 0 no data, 1 IT601, 2 ITU709 */ - BT_TYPE bw_type = 2; + enum hdmi_colorimetry colorimetry; + enum hdmi_extended_colorimetry ext_colorimetry; /* Set HDMI TX Mode */ /* Mode = 0 - DVI, 1 - HDMI1.4, 2 HDMI 2.0 */ @@ -223,7 +264,10 @@ void hdmi_mode_set_t28hpc(state_struct *state, struct drm_display_mode *mode, in return; } - ret = CDN_API_Set_AVI(state, mode, format, bw_type); + hdmi_compute_colorimetry(&hdp->connector.display_info, format, + &colorimetry, &ext_colorimetry); + + ret = CDN_API_Set_AVI(state, mode, format, colorimetry, ext_colorimetry); if (ret != CDN_OK) { DRM_ERROR("CDN_API_Set_AVI ret = %d\n", ret); return; diff --git a/drivers/mxc/hdp/API_AVI.c b/drivers/mxc/hdp/API_AVI.c index a2b1a3a92fcb..433cddd8bce5 100644 --- a/drivers/mxc/hdp/API_AVI.c +++ b/drivers/mxc/hdp/API_AVI.c @@ -49,7 +49,8 @@ CDN_API_STATUS CDN_API_Set_AVI(state_struct *state, struct drm_display_mode *mode, VIC_PXL_ENCODING_FORMAT colorMode, - BT_TYPE ITUver) + enum hdmi_colorimetry colorimetry, + enum hdmi_extended_colorimetry ext_colorimetry) { u32 active_slot = mode->htotal - mode->hdisplay; u32 line_width = mode->htotal; @@ -131,16 +132,8 @@ CDN_API_STATUS CDN_API_Set_AVI(state_struct *state, struct drm_display_mode *mod else if (colorMode == YCBCR_4_2_0) packet_Y = 3; - /* Colorimetry: Nodata=0 IT601=1 ITU709=2 */ - if (ITUver == BT_601) - packet_C = 1; - else if (ITUver == BT_709) - packet_C = 2; - else if (ITUver == 2) { - packet_C = 0; - packet_EC = 0; - } else - packet_C = 0; + packet_C = colorimetry; + packet_EC = ext_colorimetry; packet_HB0 = packet_type; packet_HB1 = packet_version; diff --git a/drivers/mxc/hdp/API_AVI.h b/drivers/mxc/hdp/API_AVI.h index c67ee8ae3653..65cbf7c4101a 100644 --- a/drivers/mxc/hdp/API_AVI.h +++ b/drivers/mxc/hdp/API_AVI.h @@ -51,6 +51,7 @@ CDN_API_STATUS CDN_API_Set_AVI(state_struct *state, struct drm_display_mode *mode, VIC_PXL_ENCODING_FORMAT colorMode, - BT_TYPE ITUver); + enum hdmi_colorimetry colorimetry, + enum hdmi_extended_colorimetry ext_colorimetry); #endif //API_AVI_H_ -- 2.17.1