[PATCH 3/3] [VPG HSW-A] drm/i915: Populate all fields of AVI infoframe

vandana.kannan at intel.com vandana.kannan at intel.com
Wed Aug 14 21:59:03 PDT 2013


From: vkannan <vandana.kannan at intel.com>

Populate bar information, colorimetry, IT content, quantization range fields
of AVI infoframe based on CEA 861-D spec.

Signed-off-by: Vandana Kannan <vandana.kannan at intel.com>
---
 drivers/gpu/drm/i915/intel_drv.h  |    4 ++++
 drivers/gpu/drm/i915/intel_hdmi.c |   39 +++++++++++++++++++++++++++++++++++--
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 97df85d..e02c442 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -412,6 +412,10 @@ struct cxsr_latency {
 #define DIP_AVI_RGB_QUANT_RANGE_DEFAULT	(0 << 2)
 #define DIP_AVI_RGB_QUANT_RANGE_LIMITED	(1 << 2)
 #define DIP_AVI_RGB_QUANT_RANGE_FULL	(2 << 2)
+#define DIP_AVI_IT_CONTENT     (1 << 7)
+#define DIP_AVI_BAR_BOTH       (3 << 2)
+#define DIP_AVI_COLOR_ITU601   (1 << 6)
+#define DIP_AVI_COLOR_ITU709   (2 << 6)
 
 #define DIP_TYPE_SPD	0x83
 #define DIP_VERSION_SPD	0x1
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 7cf6fc5..dbbc02b 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -340,9 +340,22 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
 		.type = DIP_TYPE_AVI,
 		.ver = DIP_VERSION_AVI,
 		.len = DIP_LEN_AVI,
+		.body.avi.Y_A_B_S = 0,
 		.body.avi.C_M_R = 8,
+		.body.avi.ITC_EC_Q_SC = 0,
+		.body.avi.VIC = 0,
+		.body.avi.YQ_CN_PR = 0,
+		.body.avi.top_bar_end = 0,
+		.body.avi.bottom_bar_start = 0,
+		.body.avi.left_bar_end = 0,
+		.body.avi.right_bar_start = 0,
 	};
 
+	/* Bar information */
+	avi_if.body.avi.Y_A_B_S |= DIP_AVI_BAR_BOTH;
+
+	avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
+
 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
 		avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;
 
@@ -351,10 +364,17 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
 			avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED;
 		else
 			avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL;
+	} else {
+		/* Set full range quantization for non-CEA modes
+		and 640x480 */
+		if ((avi_if.body.avi.VIC == 0) || (avi_if.body.avi.VIC == 1))
+			avi_if.body.avi.ITC_EC_Q_SC |=
+				DIP_AVI_RGB_QUANT_RANGE_FULL;
+		else
+			avi_if.body.avi.ITC_EC_Q_SC |=
+				DIP_AVI_RGB_QUANT_RANGE_LIMITED;
 	}
 
-	avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
-
 	/*If picture aspect ratio (PAR) is set to custom value, then use that,
 	else if VIC > 1, then get PAR from CEA mode list, else, calculate
 	PAR based on resolution */
@@ -377,6 +397,21 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
 			avi_if.body.avi.C_M_R |= HDMI_PICTURE_ASPECT_16_9 << 4;
 	}
 
+	if (avi_if.body.avi.VIC) {
+		/* colorimetry: Sections 5.1 and 5.2 of CEA 861-D spec */
+		if ((adjusted_mode->vdisplay == 480) ||
+			(adjusted_mode->vdisplay == 576) ||
+			(adjusted_mode->vdisplay == 240) ||
+			(adjusted_mode->vdisplay == 288)) {
+			avi_if.body.avi.C_M_R |= DIP_AVI_COLOR_ITU601;
+		} else if ((adjusted_mode->vdisplay == 720) ||
+			(adjusted_mode->vdisplay == 1080)) {
+			avi_if.body.avi.C_M_R |= DIP_AVI_COLOR_ITU709;
+		}
+	}
+
+	avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_IT_CONTENT;
+
 	intel_set_infoframe(encoder, &avi_if);
 }
 
-- 
1.7.9.5



More information about the dri-devel mailing list