diff mbox series

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

Message ID 1542723731-20075-3-git-send-email-uma.shankar@intel.com (mailing list archive)
State New, archived
Headers show
Series Add Colorspace connector property interface | expand

Commit Message

Shankar, Uma Nov. 20, 2018, 2:22 p.m. UTC
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@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(+)

Comments

Chris Wilson Nov. 20, 2018, 2:11 p.m. UTC | #1
Quoting Uma Shankar (2018-11-20 14:22:10)
> @@ -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;

Why different names for DP/HDMI?
-Chris
Shankar, Uma Nov. 20, 2018, 2:16 p.m. UTC | #2
>-----Original Message-----
>From: Chris Wilson [mailto:chris@chris-wilson.co.uk]
>Sent: Tuesday, November 20, 2018 7:41 PM
>To: Shankar, Uma <uma.shankar@intel.com>; dri-devel@lists.freedesktop.org;
>intel-gfx@lists.freedesktop.org
>Cc: Syrjala, Ville <ville.syrjala@intel.com>; jonas@kwiboo.se;
>hansverk@cisco.com; Shankar, Uma <uma.shankar@intel.com>; Lankhorst,
>Maarten <maarten.lankhorst@intel.com>
>Subject: Re: [v3 2/3] drm: Add DP colorspace property
>
>Quoting Uma Shankar (2018-11-20 14:22:10)
>> @@ -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;
>
>Why different names for DP/HDMI?
There are some colorspaces specific to HDMI and DP, hence we created separate properties
for these encoders. This is just to expose DP specifc colorspaces on a DP connector and same way
for HDMI. Earlier, we had just one but it was giving DP stuff as well to a HDMI Connector and vice-versa
which was not looking good.

Regards,
Uma Shankar
>-Chris
Ville Syrjala Nov. 20, 2018, 3:25 p.m. UTC | #3
On Tue, Nov 20, 2018 at 02:16:38PM +0000, Shankar, Uma wrote:
> 
> 
> >-----Original Message-----
> >From: Chris Wilson [mailto:chris@chris-wilson.co.uk]
> >Sent: Tuesday, November 20, 2018 7:41 PM
> >To: Shankar, Uma <uma.shankar@intel.com>; dri-devel@lists.freedesktop.org;
> >intel-gfx@lists.freedesktop.org
> >Cc: Syrjala, Ville <ville.syrjala@intel.com>; jonas@kwiboo.se;
> >hansverk@cisco.com; Shankar, Uma <uma.shankar@intel.com>; Lankhorst,
> >Maarten <maarten.lankhorst@intel.com>
> >Subject: Re: [v3 2/3] drm: Add DP colorspace property
> >
> >Quoting Uma Shankar (2018-11-20 14:22:10)
> >> @@ -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;
> >
> >Why different names for DP/HDMI?
> There are some colorspaces specific to HDMI and DP, hence we created separate properties
> for these encoders.

Why does that require different names for the props?

> This is just to expose DP specifc colorspaces on a DP connector and same way
> for HDMI. Earlier, we had just one but it was giving DP stuff as well to a HDMI Connector and vice-versa
> which was not looking good.
> 
> Regards,
> Uma Shankar
> >-Chris
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff mbox series

Patch

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;