@@ -1055,64 +1055,70 @@ static const struct drm_prop_enum_list drm_dp_subconnector_enum_list[] = {
10551055DRM_ENUM_NAME_FN (drm_get_dp_subconnector_name ,
10561056 drm_dp_subconnector_enum_list )
10571057
1058- static const struct drm_prop_enum_list hdmi_colorspaces [] = {
1058+
1059+ static const char * const colorspace_names [] = {
10591060 /* For Default case, driver will set the colorspace */
1060- { DRM_MODE_COLORIMETRY_DEFAULT , "Default" } ,
1061+ [ DRM_MODE_COLORIMETRY_DEFAULT ] = "Default" ,
10611062 /* Standard Definition Colorimetry based on CEA 861 */
1062- { DRM_MODE_COLORIMETRY_SMPTE_170M_YCC , "SMPTE_170M_YCC" } ,
1063- { DRM_MODE_COLORIMETRY_BT709_YCC , "BT709_YCC" } ,
1063+ [ DRM_MODE_COLORIMETRY_SMPTE_170M_YCC ] = "SMPTE_170M_YCC" ,
1064+ [ DRM_MODE_COLORIMETRY_BT709_YCC ] = "BT709_YCC" ,
10641065 /* Standard Definition Colorimetry based on IEC 61966-2-4 */
1065- { DRM_MODE_COLORIMETRY_XVYCC_601 , "XVYCC_601" } ,
1066+ [ DRM_MODE_COLORIMETRY_XVYCC_601 ] = "XVYCC_601" ,
10661067 /* High Definition Colorimetry based on IEC 61966-2-4 */
1067- { DRM_MODE_COLORIMETRY_XVYCC_709 , "XVYCC_709" } ,
1068+ [ DRM_MODE_COLORIMETRY_XVYCC_709 ] = "XVYCC_709" ,
10681069 /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
1069- { DRM_MODE_COLORIMETRY_SYCC_601 , "SYCC_601" } ,
1070+ [ DRM_MODE_COLORIMETRY_SYCC_601 ] = "SYCC_601" ,
10701071 /* Colorimetry based on IEC 61966-2-5 [33] */
1071- { DRM_MODE_COLORIMETRY_OPYCC_601 , "opYCC_601" } ,
1072+ [ DRM_MODE_COLORIMETRY_OPYCC_601 ] = "opYCC_601" ,
10721073 /* Colorimetry based on IEC 61966-2-5 */
1073- { DRM_MODE_COLORIMETRY_OPRGB , "opRGB" } ,
1074+ [ DRM_MODE_COLORIMETRY_OPRGB ] = "opRGB" ,
10741075 /* Colorimetry based on ITU-R BT.2020 */
1075- { DRM_MODE_COLORIMETRY_BT2020_CYCC , "BT2020_CYCC" } ,
1076+ [ DRM_MODE_COLORIMETRY_BT2020_CYCC ] = "BT2020_CYCC" ,
10761077 /* Colorimetry based on ITU-R BT.2020 */
1077- { DRM_MODE_COLORIMETRY_BT2020_RGB , "BT2020_RGB" } ,
1078+ [ DRM_MODE_COLORIMETRY_BT2020_RGB ] = "BT2020_RGB" ,
10781079 /* Colorimetry based on ITU-R BT.2020 */
1079- { DRM_MODE_COLORIMETRY_BT2020_YCC , "BT2020_YCC" } ,
1080+ [ DRM_MODE_COLORIMETRY_BT2020_YCC ] = "BT2020_YCC" ,
10801081 /* Added as part of Additional Colorimetry Extension in 861.G */
1081- { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 , "DCI-P3_RGB_D65" },
1082- { DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER , "DCI-P3_RGB_Theater" },
1082+ [DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 ] = "DCI-P3_RGB_D65" ,
1083+ [DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER ] = "DCI-P3_RGB_Theater" ,
1084+ [DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED ] = "RGB_WIDE_FIXED" ,
1085+ /* Colorimetry based on scRGB (IEC 61966-2-2) */
1086+ [DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT ] = "RGB_WIDE_FLOAT" ,
1087+ [DRM_MODE_COLORIMETRY_BT601_YCC ] = "BT601_YCC" ,
10831088};
10841089
1090+ static const u32 hdmi_colorspaces =
1091+ BIT (DRM_MODE_COLORIMETRY_SMPTE_170M_YCC ) |
1092+ BIT (DRM_MODE_COLORIMETRY_BT709_YCC ) |
1093+ BIT (DRM_MODE_COLORIMETRY_XVYCC_601 ) |
1094+ BIT (DRM_MODE_COLORIMETRY_XVYCC_709 ) |
1095+ BIT (DRM_MODE_COLORIMETRY_SYCC_601 ) |
1096+ BIT (DRM_MODE_COLORIMETRY_OPYCC_601 ) |
1097+ BIT (DRM_MODE_COLORIMETRY_OPRGB ) |
1098+ BIT (DRM_MODE_COLORIMETRY_BT2020_CYCC ) |
1099+ BIT (DRM_MODE_COLORIMETRY_BT2020_RGB ) |
1100+ BIT (DRM_MODE_COLORIMETRY_BT2020_YCC ) |
1101+ BIT (DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 ) |
1102+ BIT (DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER );
1103+
10851104/*
10861105 * As per DP 1.4a spec, 2.2.5.7.5 VSC SDP Payload for Pixel Encoding/Colorimetry
10871106 * Format Table 2-120
10881107 */
1089- static const struct drm_prop_enum_list dp_colorspaces [] = {
1090- /* For Default case, driver will set the colorspace */
1091- { DRM_MODE_COLORIMETRY_DEFAULT , "Default" },
1092- { DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED , "RGB_Wide_Gamut_Fixed_Point" },
1093- /* Colorimetry based on scRGB (IEC 61966-2-2) */
1094- { DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT , "RGB_Wide_Gamut_Floating_Point" },
1095- /* Colorimetry based on IEC 61966-2-5 */
1096- { DRM_MODE_COLORIMETRY_OPRGB , "opRGB" },
1097- /* Colorimetry based on SMPTE RP 431-2 */
1098- { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 , "DCI-P3_RGB_D65" },
1099- /* Colorimetry based on ITU-R BT.2020 */
1100- { DRM_MODE_COLORIMETRY_BT2020_RGB , "BT2020_RGB" },
1101- { DRM_MODE_COLORIMETRY_BT601_YCC , "BT601_YCC" },
1102- { DRM_MODE_COLORIMETRY_BT709_YCC , "BT709_YCC" },
1103- /* Standard Definition Colorimetry based on IEC 61966-2-4 */
1104- { DRM_MODE_COLORIMETRY_XVYCC_601 , "XVYCC_601" },
1105- /* High Definition Colorimetry based on IEC 61966-2-4 */
1106- { DRM_MODE_COLORIMETRY_XVYCC_709 , "XVYCC_709" },
1107- /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
1108- { DRM_MODE_COLORIMETRY_SYCC_601 , "SYCC_601" },
1109- /* Colorimetry based on IEC 61966-2-5 [33] */
1110- { DRM_MODE_COLORIMETRY_OPYCC_601 , "opYCC_601" },
1111- /* Colorimetry based on ITU-R BT.2020 */
1112- { DRM_MODE_COLORIMETRY_BT2020_CYCC , "BT2020_CYCC" },
1113- /* Colorimetry based on ITU-R BT.2020 */
1114- { DRM_MODE_COLORIMETRY_BT2020_YCC , "BT2020_YCC" },
1115- };
1108+ static const u32 dp_colorspaces =
1109+ BIT (DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED ) |
1110+ BIT (DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT ) |
1111+ BIT (DRM_MODE_COLORIMETRY_OPRGB ) |
1112+ BIT (DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 ) |
1113+ BIT (DRM_MODE_COLORIMETRY_BT2020_RGB ) |
1114+ BIT (DRM_MODE_COLORIMETRY_BT601_YCC ) |
1115+ BIT (DRM_MODE_COLORIMETRY_BT709_YCC ) |
1116+ BIT (DRM_MODE_COLORIMETRY_XVYCC_601 ) |
1117+ BIT (DRM_MODE_COLORIMETRY_XVYCC_709 ) |
1118+ BIT (DRM_MODE_COLORIMETRY_SYCC_601 ) |
1119+ BIT (DRM_MODE_COLORIMETRY_OPYCC_601 ) |
1120+ BIT (DRM_MODE_COLORIMETRY_BT2020_CYCC ) |
1121+ BIT (DRM_MODE_COLORIMETRY_BT2020_YCC );
11161122
11171123/**
11181124 * DOC: standard connector properties
@@ -2136,27 +2142,49 @@ EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
21362142 */
21372143
21382144static int drm_mode_create_colorspace_property (struct drm_connector * connector ,
2139- const struct drm_prop_enum_list * colorspaces ,
2140- int size )
2145+ u32 supported_colorspaces )
21412146{
21422147 struct drm_device * dev = connector -> dev ;
2148+ u32 colorspaces = supported_colorspaces | BIT (DRM_MODE_COLORIMETRY_DEFAULT );
2149+ struct drm_prop_enum_list enum_list [DRM_MODE_COLORIMETRY_COUNT ];
2150+ int i , len ;
21432151
21442152 if (connector -> colorspace_property )
21452153 return 0 ;
21462154
2147- if (!colorspaces )
2148- return 0 ;
2155+ if (!supported_colorspaces ) {
2156+ drm_err (dev , "No supported colorspaces provded on [CONNECTOR:%d:%s]\n" ,
2157+ connector -> base .id , connector -> name );
2158+ return - EINVAL ;
2159+ }
2160+
2161+ if ((supported_colorspaces & - BIT (DRM_MODE_COLORIMETRY_COUNT )) != 0 ) {
2162+ drm_err (dev , "Unknown colorspace provded on [CONNECTOR:%d:%s]\n" ,
2163+ connector -> base .id , connector -> name );
2164+ return - EINVAL ;
2165+ }
2166+
2167+ len = 0 ;
2168+ for (i = 0 ; i < DRM_MODE_COLORIMETRY_COUNT ; i ++ ) {
2169+ if ((colorspaces & BIT (i )) == 0 )
2170+ continue ;
2171+
2172+ enum_list [len ].type = i ;
2173+ enum_list [len ].name = colorspace_names [i ];
2174+ len ++ ;
2175+ }
21492176
21502177 connector -> colorspace_property =
21512178 drm_property_create_enum (dev , DRM_MODE_PROP_ENUM , "Colorspace" ,
2152- colorspaces ,
2153- size );
2179+ enum_list ,
2180+ len );
21542181
21552182 if (!connector -> colorspace_property )
21562183 return - ENOMEM ;
21572184
21582185 return 0 ;
21592186}
2187+
21602188/**
21612189 * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
21622190 * @connector: connector to create the Colorspace property on.
@@ -2169,9 +2197,7 @@ static int drm_mode_create_colorspace_property(struct drm_connector *connector,
21692197 */
21702198int drm_mode_create_hdmi_colorspace_property (struct drm_connector * connector )
21712199{
2172- return drm_mode_create_colorspace_property (connector ,
2173- hdmi_colorspaces ,
2174- ARRAY_SIZE (hdmi_colorspaces ));
2200+ return drm_mode_create_colorspace_property (connector , hdmi_colorspaces );
21752201}
21762202EXPORT_SYMBOL (drm_mode_create_hdmi_colorspace_property );
21772203
@@ -2187,9 +2213,7 @@ EXPORT_SYMBOL(drm_mode_create_hdmi_colorspace_property);
21872213 */
21882214int drm_mode_create_dp_colorspace_property (struct drm_connector * connector )
21892215{
2190- return drm_mode_create_colorspace_property (connector ,
2191- dp_colorspaces ,
2192- ARRAY_SIZE (dp_colorspaces ));
2216+ return drm_mode_create_colorspace_property (connector , dp_colorspaces );
21932217}
21942218EXPORT_SYMBOL (drm_mode_create_dp_colorspace_property );
21952219
0 commit comments