From: vkannan <vandana.kan...@intel.com>

Populate picture aspect ratio field of AVI infoframe.
If there is a custom value to be set for aspect ratio, it takes highest
priority, followed by a check in the CEA mode list. If the mode is not
found in the standard mode list, aspect ratio is calculated based on aspect
ratio.

Priority of PAR value: 1. custom value, 2. based on CEA mode list,
3. calculate from resolution

Signed-off-by: Vandana Kannan <vandana.kan...@intel.com>
---
 drivers/gpu/drm/drm_edid.c        |    7 +++++++
 drivers/gpu/drm/i915/intel_hdmi.c |   25 +++++++++++++++++++++++++
 include/drm/drm_crtc.h            |    1 +
 3 files changed, 33 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 83e2fda..110a56f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2427,6 +2427,13 @@ u8 drm_match_cea_mode(const struct drm_display_mode 
*to_match)
 }
 EXPORT_SYMBOL(drm_match_cea_mode);
 
+enum hdmi_picture_aspect drm_get_cea_aspect_ratio(u8 vic)
+{
+       /*return Aspect Ratio for VIC-1 to access the right array element*/
+       return edid_cea_modes[vic-1].picture_aspect_ratio;
+}
+EXPORT_SYMBOL(drm_get_cea_aspect_ratio);
+
 static int
 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 1e6b5cf..7cf6fc5 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -29,6 +29,7 @@
 #include <linux/i2c.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
+#include <linux/hdmi.h>
 #include <drm/drmP.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_edid.h>
@@ -334,10 +335,12 @@ static void intel_hdmi_set_avi_infoframe(struct 
drm_encoder *encoder,
 {
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
        struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
+       enum hdmi_picture_aspect PAR;
        struct dip_infoframe avi_if = {
                .type = DIP_TYPE_AVI,
                .ver = DIP_VERSION_AVI,
                .len = DIP_LEN_AVI,
+               .body.avi.C_M_R = 8,
        };
 
        if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
@@ -352,6 +355,28 @@ static void intel_hdmi_set_avi_infoframe(struct 
drm_encoder *encoder,
 
        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 */
+       if (adjusted_mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_4_3 ||
+       adjusted_mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_16_9) {
+               avi_if.body.avi.C_M_R |=
+                       adjusted_mode->picture_aspect_ratio << 4;
+               /*PAR is bit 5:4 of data byte 2 of AVI infoframe */
+       } else if (avi_if.body.avi.VIC) {
+               PAR = drm_get_cea_aspect_ratio(avi_if.body.avi.VIC);
+               avi_if.body.avi.C_M_R |= PAR << 4;
+       } else {
+               if (!(adjusted_mode->vdisplay % 3) &&
+                       ((adjusted_mode->vdisplay * 4 / 3) ==
+                       adjusted_mode->hdisplay))
+                       avi_if.body.avi.C_M_R |= HDMI_PICTURE_ASPECT_4_3 << 4;
+               else if (!(adjusted_mode->vdisplay % 9) &&
+                       ((adjusted_mode->vdisplay * 16 / 9) ==
+                       adjusted_mode->hdisplay))
+                       avi_if.body.avi.C_M_R |= HDMI_PICTURE_ASPECT_16_9 << 4;
+       }
+
        intel_set_infoframe(encoder, &avi_if);
 }
 
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 07c0d58..e215bcc 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1048,6 +1048,7 @@ extern int drm_mode_gamma_set_ioctl(struct drm_device 
*dev,
                                    void *data, struct drm_file *file_priv);
 extern u8 *drm_find_cea_extension(struct edid *edid);
 extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
+extern enum hdmi_picture_aspect drm_get_cea_aspect_ratio(u8 vic);
 extern bool drm_detect_hdmi_monitor(struct edid *edid);
 extern bool drm_detect_monitor_audio(struct edid *edid);
 extern bool drm_rgb_quant_range_selectable(struct edid *edid);
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to