@@ -652,6 +652,10 @@ static int vc4_hdmi_connector_init(struct drm_device *dev,
652
652
if (ret )
653
653
return ret ;
654
654
655
+ ret = drm_mode_create_hdmi_color_formats_property (connector );
656
+ if (ret )
657
+ return ret ;
658
+
655
659
drm_connector_attach_tv_margin_properties (connector );
656
660
drm_connector_attach_max_bpc_property (connector , 8 , 12 );
657
661
@@ -769,6 +773,13 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
769
773
770
774
drm_hdmi_avi_infoframe_bars (& frame .avi , cstate );
771
775
776
+ if (cstate -> hdmi_color_format == DRM_COLOR_FORMAT_YCRCB422 )
777
+ frame .avi .colorspace = HDMI_COLORSPACE_YUV422 ;
778
+ else if (cstate -> hdmi_color_format == DRM_COLOR_FORMAT_YCRCB444 )
779
+ frame .avi .colorspace = HDMI_COLORSPACE_YUV444 ;
780
+ else
781
+ frame .avi .colorspace = HDMI_COLORSPACE_RGB ;
782
+
772
783
vc4_hdmi_write_infoframe (encoder , & frame );
773
784
}
774
785
@@ -951,6 +962,38 @@ static const u16 vc5_hdmi_csc_full_rgb_to_limited_rgb[3][4] = {
951
962
{ 0x0000 , 0x0000 , 0x1b80 , 0x0400 },
952
963
};
953
964
965
+ /*
966
+ * Conversion between Full Range RGB and Full Range YUV422 using the
967
+ * BT.709 Colorspace
968
+ *
969
+ * [ 0.212639 0.715169 0.072192 0 ]
970
+ * [ -0.117208 -0.394207 0.511416 128 ]
971
+ * [ 0.511416 -0.464524 -0.046891 128 ]
972
+ *
973
+ * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
974
+ */
975
+ static const u16 vc5_hdmi_csc_full_rgb_to_full_yuv422_bt709 [3 ][4 ] = {
976
+ { 0x06ce , 0x16e3 , 0x024f , 0x0000 },
977
+ { 0xfc41 , 0xf364 , 0x105e , 0x2000 },
978
+ { 0x105e , 0xf124 , 0xfe81 , 0x2000 },
979
+ };
980
+
981
+ /*
982
+ * Conversion between Full Range RGB and Full Range YUV444 using the
983
+ * BT.709 Colorspace
984
+ *
985
+ * [ -0.117208 -0.394207 0.511416 128 ]
986
+ * [ 0.511416 -0.464524 -0.046891 128 ]
987
+ * [ 0.212639 0.715169 0.072192 0 ]
988
+ *
989
+ * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
990
+ */
991
+ static const u16 vc5_hdmi_csc_full_rgb_to_full_yuv444_bt709 [3 ][4 ] = {
992
+ { 0xfc41 , 0xf364 , 0x105e , 0x2000 },
993
+ { 0x105e , 0xf124 , 0xfe81 , 0x2000 },
994
+ { 0x06ce , 0x16e3 , 0x024f , 0x0000 },
995
+ };
996
+
954
997
static void vc5_hdmi_set_csc_coeffs (struct vc4_hdmi * vc4_hdmi ,
955
998
const u16 coeffs [3 ][4 ])
956
999
{
@@ -966,16 +1009,39 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi,
966
1009
struct drm_connector_state * state ,
967
1010
const struct drm_display_mode * mode )
968
1011
{
1012
+ u32 if_cfg = 0 ;
1013
+ u32 if_xbar = 0x543210 ;
1014
+ u32 csc_chan_ctl = 0 ;
969
1015
u32 csc_ctl = VC5_MT_CP_CSC_CTL_ENABLE | VC4_SET_FIELD (VC4_HD_CSC_CTL_MODE_CUSTOM ,
970
1016
VC5_MT_CP_CSC_CTL_MODE );
971
1017
972
- HDMI_WRITE (HDMI_VEC_INTERFACE_XBAR , 0x354021 );
1018
+ if (state -> hdmi_color_format == DRM_COLOR_FORMAT_YCRCB422 ) {
1019
+ csc_ctl |= VC4_SET_FIELD (VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422_STANDARD ,
1020
+ VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422 ) |
1021
+ VC5_MT_CP_CSC_CTL_USE_444_TO_422 |
1022
+ VC5_MT_CP_CSC_CTL_USE_RNG_SUPPRESSION ;
973
1023
974
- if (vc4_hdmi_is_full_range_rgb (vc4_hdmi , mode ))
975
- vc5_hdmi_set_csc_coeffs (vc4_hdmi , & vc5_hdmi_csc_full_rgb_unity );
976
- else
977
- vc5_hdmi_set_csc_coeffs (vc4_hdmi , & vc5_hdmi_csc_full_rgb_to_limited_rgb );
1024
+ csc_chan_ctl |= VC4_SET_FIELD (VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP_LEGACY_STYLE ,
1025
+ VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP );
1026
+
1027
+ if_cfg |= VC4_SET_FIELD (VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422_FORMAT_422_LEGACY ,
1028
+ VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422 );
1029
+
1030
+ vc5_hdmi_set_csc_coeffs (vc4_hdmi , vc5_hdmi_csc_full_rgb_to_full_yuv422_bt709 );
1031
+ } else if (state -> hdmi_color_format == DRM_COLOR_FORMAT_YCRCB444 ) {
1032
+ vc5_hdmi_set_csc_coeffs (vc4_hdmi , vc5_hdmi_csc_full_rgb_to_full_yuv444_bt709 );
1033
+ } else if (state -> hdmi_color_format == DRM_COLOR_FORMAT_RGB444 ) {
1034
+ if_xbar = 0x354021 ;
1035
+
1036
+ if (vc4_hdmi_is_full_range_rgb (vc4_hdmi , mode ))
1037
+ vc5_hdmi_set_csc_coeffs (vc4_hdmi , vc5_hdmi_csc_full_rgb_unity );
1038
+ else
1039
+ vc5_hdmi_set_csc_coeffs (vc4_hdmi , vc5_hdmi_csc_full_rgb_to_limited_rgb );
1040
+ }
978
1041
1042
+ HDMI_WRITE (HDMI_VEC_INTERFACE_CFG , if_cfg );
1043
+ HDMI_WRITE (HDMI_VEC_INTERFACE_XBAR , if_xbar );
1044
+ HDMI_WRITE (HDMI_CSC_CHANNEL_CTL , csc_chan_ctl );
979
1045
HDMI_WRITE (HDMI_CSC_CTL , csc_ctl );
980
1046
}
981
1047
0 commit comments