[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