[v3 2/3] drm: Add DP colorspace property

Uma Shankar uma.shankar at intel.com
Tue Nov 20 14:22:10 UTC 2018


This patch adds a DP colorspace property, enabling
userspace to switch to various supported colorspaces.
This will help enable BT2020 along with other colorspaces.

v2: Addressed Maarten and Ville's review comments. Enhanced
    the colorspace enum to incorporate both HDMI and DP supported
    colorspaces. Also, added a default option for colorspace.

v3: Split the changes to have separate colorspace property for
DP and HDMI.

Signed-off-by: Uma Shankar <uma.shankar at intel.com>
---
 drivers/gpu/drm/drm_atomic_uapi.c |  4 ++++
 drivers/gpu/drm/drm_connector.c   | 35 +++++++++++++++++++++++++++++++++++
 include/drm/drm_connector.h       |  7 +++++++
 include/drm/drm_mode_config.h     |  6 ++++++
 include/uapi/drm/drm_mode.h       | 19 +++++++++++++++++++
 5 files changed, 71 insertions(+)

diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 4e09a38..37d51299b 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -723,6 +723,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
 		state->content_type = val;
 	} else if (property == config->hdmi_colorspace_property) {
 		state->hdmi_colorspace = val;
+	} else if (property == config->dp_colorspace_property) {
+		state->dp_colorspace = val;
 	} else if (property == connector->scaling_mode_property) {
 		state->scaling_mode = val;
 	} else if (property == connector->content_protection_property) {
@@ -801,6 +803,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
 		*val = state->content_type;
 	} else if (property == config->hdmi_colorspace_property) {
 		*val = state->hdmi_colorspace;
+	} else if (property == config->dp_colorspace_property) {
+		*val = state->dp_colorspace;
 	} else if (property == connector->scaling_mode_property) {
 		*val = state->scaling_mode;
 	} else if (property == connector->content_protection_property) {
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 1906e4a..5bb9cb6 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -850,6 +850,29 @@ int drm_display_info_set_bus_formats(struct drm_display_info *info,
 	{ COLORIMETRY_DEFAULT, "Default" },
 };
 
+static const struct drm_prop_enum_list dp_colorspace[] = {
+	/* Standard Definition Colorimetry based on CEA 861 */
+	{ DP_COLORIMETRY_ITU_601, "ITU_601" },
+	{ DP_COLORIMETRY_ITU_709, "ITU_709" },
+	/* Standard Definition Colorimetry based on IEC 61966-2-4 */
+	{ DP_COLORIMETRY_XV_YCC_601, "XV_YCC_601" },
+	/* High Definition Colorimetry based on IEC 61966-2-4 */
+	{ DP_COLORIMETRY_XV_YCC_709, "XV_YCC_709" },
+	/* Colorimetry based on IEC 61966-2-5 */
+	{ DP_COLORIMETRY_OPRGB, "opRGB" },
+	/* DP MSA Colorimetry */
+	{ DP_COLORIMETRY_Y_CBCR_ITU_601, "YCBCR_ITU_601" },
+	{ DP_COLORIMETRY_Y_CBCR_ITU_709, "YCBCR_ITU_709" },
+	{ DP_COLORIMETRY_SRGB, "sRGB" },
+	{ DP_COLORIMETRY_RGB_WIDE_GAMUT, "RGB Wide Gamut" },
+	{ DP_COLORIMETRY_SCRGB, "scRGB" },
+	{ DP_COLORIMETRY_DCI_P3, "DCI-P3" },
+	{ DP_COLORIMETRY_CUSTOM_COLOR_PROFILE, "Custom Profile" },
+	/* For Default case, driver will set the colorspace */
+	{ DP_COLORIMETRY_DEFAULT, "Default" },
+};
+
+
 /**
  * DOC: standard connector properties
  *
@@ -1457,6 +1480,18 @@ int drm_mode_create_colorspace_property(struct drm_connector *connector)
 			return -ENOMEM;
 
 		dev->mode_config.hdmi_colorspace_property = prop;
+	} else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
+		connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
+		if (dev->mode_config.dp_colorspace_property)
+			return 0;
+
+		prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM,
+						"DP_Colorspace", dp_colorspace,
+						ARRAY_SIZE(dp_colorspace));
+		if (!prop)
+			return -ENOMEM;
+
+		dev->mode_config.dp_colorspace_property = prop;
 	}
 
 	return 0;
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 5fda56d..4596e24 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -504,6 +504,13 @@ struct drm_connector_state {
 	enum hdmi_full_colorimetry hdmi_colorspace;
 
 	/**
+	 * @dp_colorspace: Connector property to request colorspace
+	 * change on DP Sink. This is most commonly used to switch to
+	 * wider color gamuts like BT2020.
+	 */
+	enum dp_full_colorimetry dp_colorspace;
+
+	/**
 	 * @writeback_job: Writeback job for writeback connectors
 	 *
 	 * Holds the framebuffer and out-fence for a writeback connector. As
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index ec7cab8..87b0698 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -875,6 +875,12 @@ struct drm_mode_config {
 	struct drm_property *hdmi_colorspace_property;
 
 	/**
+	 * @dp_colorspace_property: Connector property to set the suitable
+	 * colorspace supported by the DP sink.
+	 */
+	struct drm_property *dp_colorspace_property;
+
+	/**
 	 * @suspend_state:
 	 *
 	 * Atomic state when suspended.
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index cc4df26..1cd7346 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -226,6 +226,25 @@ enum hdmi_full_colorimetry {
 	COLORIMETRY_DEFAULT,
 };
 
+enum dp_full_colorimetry {
+	/* CEA 861 Normal Colorimetry options */
+	DP_COLORIMETRY_ITU_601 = 0,
+	DP_COLORIMETRY_ITU_709,
+	/* CEA 861 Extended Colorimetry Options */
+	DP_COLORIMETRY_XV_YCC_601,
+	DP_COLORIMETRY_XV_YCC_709,
+	DP_COLORIMETRY_OPRGB,
+	/* DP MSA Colorimetry Options */
+	DP_COLORIMETRY_Y_CBCR_ITU_601,
+	DP_COLORIMETRY_Y_CBCR_ITU_709,
+	DP_COLORIMETRY_SRGB,
+	DP_COLORIMETRY_RGB_WIDE_GAMUT,
+	DP_COLORIMETRY_SCRGB,
+	DP_COLORIMETRY_DCI_P3,
+	DP_COLORIMETRY_CUSTOM_COLOR_PROFILE,
+	DP_COLORIMETRY_DEFAULT,
+};
+
 struct drm_mode_modeinfo {
 	__u32 clock;
 	__u16 hdisplay;
-- 
1.9.1



More information about the dri-devel mailing list