Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/connector: Use common colorspace_names array

We an use bitfields to track the support ones for HDMI
and DP. This allows us to print colorspaces in a consistent
manner without needing to know whether we're dealing with
DP or HDMI.

v4:
- Rename _MAX to _COUNT and leave comment to indicate
it's not a valid value
- Fix misplaced function doc

v6:
- Drop magic in drm_mode_create_colorspace_property for
dealing with "0" supported_colorspaces. Expect the caller
to always provide a non-zero supported_colorspaces.
- Improve error checking and logging

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Reviewed-by: Sebastian Wick <sebastian.wick@redhat.com>
Reviewed-by: Joshua Ashton <joshua@froggi.es>
Reviewed-by: Simon Ser <contact@emersion.fr>

Cc: Pekka Paalanen <ppaalanen@gmail.com>
Cc: Sebastian Wick <sebastian.wick@redhat.com>
Cc: Vitaly.Prosyak@amd.com
Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Joshua Ashton <joshua@froggi.es>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Simon Ser <contact@emersion.fr>
Cc: Melissa Wen <mwen@igalia.com>
Cc: dri-devel@lists.freedesktop.org
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Harry Wentland and committed by
Alex Deucher
c627087c 6120611a

+79 -53
+77 -53
drivers/gpu/drm/drm_connector.c
··· 1055 1055 DRM_ENUM_NAME_FN(drm_get_dp_subconnector_name, 1056 1056 drm_dp_subconnector_enum_list) 1057 1057 1058 - static const struct drm_prop_enum_list hdmi_colorspaces[] = { 1058 + 1059 + static const char * const colorspace_names[] = { 1059 1060 /* For Default case, driver will set the colorspace */ 1060 - { DRM_MODE_COLORIMETRY_DEFAULT, "Default" }, 1061 + [DRM_MODE_COLORIMETRY_DEFAULT] = "Default", 1061 1062 /* 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", 1064 1065 /* 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", 1066 1067 /* 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", 1068 1069 /* 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", 1070 1071 /* Colorimetry based on IEC 61966-2-5 [33] */ 1071 - { DRM_MODE_COLORIMETRY_OPYCC_601, "opYCC_601" }, 1072 + [DRM_MODE_COLORIMETRY_OPYCC_601] = "opYCC_601", 1072 1073 /* Colorimetry based on IEC 61966-2-5 */ 1073 - { DRM_MODE_COLORIMETRY_OPRGB, "opRGB" }, 1074 + [DRM_MODE_COLORIMETRY_OPRGB] = "opRGB", 1074 1075 /* Colorimetry based on ITU-R BT.2020 */ 1075 - { DRM_MODE_COLORIMETRY_BT2020_CYCC, "BT2020_CYCC" }, 1076 + [DRM_MODE_COLORIMETRY_BT2020_CYCC] = "BT2020_CYCC", 1076 1077 /* Colorimetry based on ITU-R BT.2020 */ 1077 - { DRM_MODE_COLORIMETRY_BT2020_RGB, "BT2020_RGB" }, 1078 + [DRM_MODE_COLORIMETRY_BT2020_RGB] = "BT2020_RGB", 1078 1079 /* Colorimetry based on ITU-R BT.2020 */ 1079 - { DRM_MODE_COLORIMETRY_BT2020_YCC, "BT2020_YCC" }, 1080 + [DRM_MODE_COLORIMETRY_BT2020_YCC] = "BT2020_YCC", 1080 1081 /* 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", 1083 1088 }; 1089 + 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); 1084 1103 1085 1104 /* 1086 1105 * As per DP 1.4a spec, 2.2.5.7.5 VSC SDP Payload for Pixel Encoding/Colorimetry 1087 1106 * Format Table 2-120 1088 1107 */ 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); 1116 1122 1117 1123 /** 1118 1124 * DOC: standard connector properties ··· 2142 2136 */ 2143 2137 2144 2138 static int drm_mode_create_colorspace_property(struct drm_connector *connector, 2145 - const struct drm_prop_enum_list *colorspaces, 2146 - int size) 2139 + u32 supported_colorspaces) 2147 2140 { 2148 2141 struct drm_device *dev = connector->dev; 2142 + u32 colorspaces = supported_colorspaces | BIT(DRM_MODE_COLORIMETRY_DEFAULT); 2143 + struct drm_prop_enum_list enum_list[DRM_MODE_COLORIMETRY_COUNT]; 2144 + int i, len; 2149 2145 2150 2146 if (connector->colorspace_property) 2151 2147 return 0; 2152 2148 2153 - if (!colorspaces) 2154 - return 0; 2149 + if (!supported_colorspaces) { 2150 + drm_err(dev, "No supported colorspaces provded on [CONNECTOR:%d:%s]\n", 2151 + connector->base.id, connector->name); 2152 + return -EINVAL; 2153 + } 2154 + 2155 + if ((supported_colorspaces & -BIT(DRM_MODE_COLORIMETRY_COUNT)) != 0) { 2156 + drm_err(dev, "Unknown colorspace provded on [CONNECTOR:%d:%s]\n", 2157 + connector->base.id, connector->name); 2158 + return -EINVAL; 2159 + } 2160 + 2161 + len = 0; 2162 + for (i = 0; i < DRM_MODE_COLORIMETRY_COUNT; i++) { 2163 + if ((colorspaces & BIT(i)) == 0) 2164 + continue; 2165 + 2166 + enum_list[len].type = i; 2167 + enum_list[len].name = colorspace_names[i]; 2168 + len++; 2169 + } 2155 2170 2156 2171 connector->colorspace_property = 2157 2172 drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, "Colorspace", 2158 - colorspaces, 2159 - size); 2173 + enum_list, 2174 + len); 2160 2175 2161 2176 if (!connector->colorspace_property) 2162 2177 return -ENOMEM; 2163 2178 2164 2179 return 0; 2165 2180 } 2181 + 2166 2182 /** 2167 2183 * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property 2168 2184 * @connector: connector to create the Colorspace property on. ··· 2197 2169 */ 2198 2170 int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector) 2199 2171 { 2200 - return drm_mode_create_colorspace_property(connector, 2201 - hdmi_colorspaces, 2202 - ARRAY_SIZE(hdmi_colorspaces)); 2172 + return drm_mode_create_colorspace_property(connector, hdmi_colorspaces); 2203 2173 } 2204 2174 EXPORT_SYMBOL(drm_mode_create_hdmi_colorspace_property); 2205 2175 ··· 2213 2187 */ 2214 2188 int drm_mode_create_dp_colorspace_property(struct drm_connector *connector) 2215 2189 { 2216 - return drm_mode_create_colorspace_property(connector, 2217 - dp_colorspaces, 2218 - ARRAY_SIZE(dp_colorspaces)); 2190 + return drm_mode_create_colorspace_property(connector, dp_colorspaces); 2219 2191 } 2220 2192 EXPORT_SYMBOL(drm_mode_create_dp_colorspace_property); 2221 2193
+2
include/drm/drm_connector.h
··· 516 516 DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED = 13, 517 517 DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT = 14, 518 518 DRM_MODE_COLORIMETRY_BT601_YCC = 15, 519 + /* not a valid value; merely used for counting */ 520 + DRM_MODE_COLORIMETRY_COUNT 519 521 }; 520 522 521 523 /**