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