diff mbox series

[v4,3/3] drm/i915: Attach colorspace property and enable modeset

Message ID 1543336843-22193-4-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. 27, 2018, 4:40 p.m. UTC
This patch attaches the colorspace connector property to the
hdmi connector. Based on colorspace change, modeset will be
triggered to switch to new colorspace.

Based on colorspace property value create an infoframe
with appropriate colorspace. This can be used to send an
infoframe packet with proper colorspace value set which
will help to enable wider color gamut like BT2020 on sink.

This patch attaches and enables HDMI colorspace, DP will be
taken care separately.

v2: Merged the changes of creating infoframe as well to this
patch as per Maarten's suggestion.

v3: Addressed review comments from Shashank. Separated HDMI
and DP colorspaces as suggested by Ville and Maarten.

v4: Addressed Chris and Ville's review comments, and created a
common colorspace property for DP and HDMI, filtered the list
based on the colorspaces supported by the respective protocol
standard. Handle the default case properly.

Signed-off-by: Uma Shankar <uma.shankar@intel.com>
---
 drivers/gpu/drm/i915/intel_atomic.c    |  1 +
 drivers/gpu/drm/i915/intel_connector.c |  8 ++++++++
 drivers/gpu/drm/i915/intel_drv.h       |  1 +
 drivers/gpu/drm/i915/intel_hdmi.c      | 18 ++++++++++++++++++
 4 files changed, 28 insertions(+)

Comments

kernel test robot Nov. 28, 2018, 8:49 p.m. UTC | #1
Hi Uma,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm-intel/for-linux-next]
[also build test WARNING on next-20181128]
[cannot apply to v4.20-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Uma-Shankar/Add-Colorspace-connector-property-interface/20181128-083317
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: x86_64-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/i915/intel_hdmi.c:493:51: warning: mixing different enum types
   drivers/gpu/drm/i915/intel_hdmi.c:493:51:     unsigned int enum absolute_colorimetry_list  versus
   drivers/gpu/drm/i915/intel_hdmi.c:493:51:     unsigned int enum hdmi_colorimetry 
   include/linux/slab.h:332:43: warning: dubious: x & !y
   include/linux/slab.h:332:43: warning: dubious: x & !y

vim +493 drivers/gpu/drm/i915/intel_hdmi.c

   460	
   461	static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder,
   462						 const struct intel_crtc_state *crtc_state,
   463						 const struct drm_connector_state *conn_state)
   464	{
   465		struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
   466		const struct drm_display_mode *adjusted_mode =
   467			&crtc_state->base.adjusted_mode;
   468		struct drm_connector *connector = &intel_hdmi->attached_connector->base;
   469		bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported ||
   470		   connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420;
   471		union hdmi_infoframe frame;
   472		int ret;
   473	
   474		ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
   475							       adjusted_mode,
   476							       is_hdmi2_sink);
   477		if (ret < 0) {
   478			DRM_ERROR("couldn't fill AVI infoframe\n");
   479			return;
   480		}
   481	
   482		if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
   483			frame.avi.colorspace = HDMI_COLORSPACE_YUV420;
   484		else if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
   485			frame.avi.colorspace = HDMI_COLORSPACE_YUV444;
   486		else
   487			frame.avi.colorspace = HDMI_COLORSPACE_RGB;
   488	
   489		if (conn_state->colorspace == COLORIMETRY_DEFAULT) {
   490			/* Set ITU 709 as default for HDMI */
   491			frame.avi.colorimetry = COLORIMETRY_ITU_709;
   492		} else if (conn_state->colorspace < COLORIMETRY_XV_YCC_601) {
 > 493			frame.avi.colorimetry = conn_state->colorspace;
   494		} else {
   495			frame.avi.colorimetry = HDMI_COLORIMETRY_EXTENDED;
   496			/*
   497			 * Starting from extended list where COLORIMETRY_XV_YCC_601
   498			 * is the first extended mode and its value is 0 as per HDMI
   499			 * specification.
   500			 */
   501			frame.avi.extended_colorimetry = conn_state->colorspace -
   502								COLORIMETRY_XV_YCC_601;
   503		}
   504	
   505		drm_hdmi_avi_infoframe_quant_range(&frame.avi, adjusted_mode,
   506						   crtc_state->limited_color_range ?
   507						   HDMI_QUANTIZATION_RANGE_LIMITED :
   508						   HDMI_QUANTIZATION_RANGE_FULL,
   509						   intel_hdmi->rgb_quant_range_selectable,
   510						   is_hdmi2_sink);
   511	
   512		drm_hdmi_avi_infoframe_content_type(&frame.avi,
   513						    conn_state);
   514	
   515		/* TODO: handle pixel repetition for YCBCR420 outputs */
   516		intel_write_infoframe(encoder, crtc_state,
   517				      &frame);
   518	}
   519	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
index a5a2c8f..35ef70a 100644
--- a/drivers/gpu/drm/i915/intel_atomic.c
+++ b/drivers/gpu/drm/i915/intel_atomic.c
@@ -125,6 +125,7 @@  int intel_digital_connector_atomic_check(struct drm_connector *conn,
 	 */
 	if (new_conn_state->force_audio != old_conn_state->force_audio ||
 	    new_conn_state->broadcast_rgb != old_conn_state->broadcast_rgb ||
+	    new_state->colorspace != old_state->colorspace ||
 	    new_conn_state->base.picture_aspect_ratio != old_conn_state->base.picture_aspect_ratio ||
 	    new_conn_state->base.content_type != old_conn_state->base.content_type ||
 	    new_conn_state->base.scaling_mode != old_conn_state->base.scaling_mode)
diff --git a/drivers/gpu/drm/i915/intel_connector.c b/drivers/gpu/drm/i915/intel_connector.c
index 18e370f..65e9152 100644
--- a/drivers/gpu/drm/i915/intel_connector.c
+++ b/drivers/gpu/drm/i915/intel_connector.c
@@ -262,3 +262,11 @@  int intel_ddc_get_modes(struct drm_connector *connector,
 			connector->dev->mode_config.aspect_ratio_property,
 			DRM_MODE_PICTURE_ASPECT_NONE);
 }
+
+void
+intel_attach_colorspace_property(struct drm_connector *connector)
+{
+	if (!drm_mode_create_colorspace_property(connector))
+		drm_object_attach_property(&connector->base,
+		connector->colorspace_property, 0);
+}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index a62d77b..891bc82 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1762,6 +1762,7 @@  int intel_connector_update_modes(struct drm_connector *connector,
 void intel_attach_force_audio_property(struct drm_connector *connector);
 void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
 void intel_attach_aspect_ratio_property(struct drm_connector *connector);
+void intel_attach_colorspace_property(struct drm_connector *connector);
 
 /* intel_csr.c */
 void intel_csr_ucode_init(struct drm_i915_private *);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index e2c6a2b..7ddc723 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -486,6 +486,22 @@  static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder,
 	else
 		frame.avi.colorspace = HDMI_COLORSPACE_RGB;
 
+	if (conn_state->colorspace == COLORIMETRY_DEFAULT) {
+		/* Set ITU 709 as default for HDMI */
+		frame.avi.colorimetry = COLORIMETRY_ITU_709;
+	} else if (conn_state->colorspace < COLORIMETRY_XV_YCC_601) {
+		frame.avi.colorimetry = conn_state->colorspace;
+	} else {
+		frame.avi.colorimetry = HDMI_COLORIMETRY_EXTENDED;
+		/*
+		 * Starting from extended list where COLORIMETRY_XV_YCC_601
+		 * is the first extended mode and its value is 0 as per HDMI
+		 * specification.
+		 */
+		frame.avi.extended_colorimetry = conn_state->colorspace -
+							COLORIMETRY_XV_YCC_601;
+	}
+
 	drm_hdmi_avi_infoframe_quant_range(&frame.avi, adjusted_mode,
 					   crtc_state->limited_color_range ?
 					   HDMI_QUANTIZATION_RANGE_LIMITED :
@@ -2135,6 +2151,8 @@  static void intel_hdmi_destroy(struct drm_connector *connector)
 	intel_attach_force_audio_property(connector);
 	intel_attach_broadcast_rgb_property(connector);
 	intel_attach_aspect_ratio_property(connector);
+	intel_attach_colorspace_property(connector);
+
 	drm_connector_attach_content_type_property(connector);
 	connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;