MLK-17703-3: drm: imx: hdp: send the right colorimetry to the sink
authorLaurentiu Palcu <laurentiu.palcu@nxp.com>
Thu, 22 Mar 2018 23:10:28 +0000 (18:10 -0500)
committerHaibo Chen <haibo.chen@nxp.com>
Thu, 12 Apr 2018 10:45:59 +0000 (18:45 +0800)
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 <laurentiu.palcu@nxp.com>
CC: Sandor Yu <sandor.yu@nxp.com>
drivers/gpu/drm/imx/hdp/imx-hdmi.c
drivers/mxc/hdp/API_AVI.c
drivers/mxc/hdp/API_AVI.h

index 8cc35c2..0cd06f0 100644 (file)
@@ -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_ADOBE_RGB))
+#define YCC_ALLOWED_COLORIMETRY (BIT(HDMI_EXTENDED_COLORIMETRY_BT2020) |\
+                                BIT(HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM) |\
+                                BIT(HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_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_ADOBE_RGB))
+               *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB;
+       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_ADOBE_YCC_601))
+               *ext_colorimetry = HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_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;
index a2b1a3a..433cddd 100644 (file)
@@ -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;
index c67ee8a..65cbf7c 100644 (file)
@@ -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_