Commit 1cbc1f0d authored by Jani Nikula's avatar Jani Nikula

drm/edid: fix AVI infoframe aspect ratio handling

We try to avoid sending VICs defined in the later specs in AVI
infoframes to sinks that conform to the earlier specs, to not upset
them, and use 0 for the VIC instead. However, we do this detection and
conversion to 0 too early, as we'll need the actual VIC to figure out
the aspect ratio.

In particular, for a mode with 64:27 aspect ratio, 0 for VIC fails the
AVI infoframe generation altogether with -EINVAL.

Separate the VIC lookup from the "filtering", and postpone the
filtering, to use the proper VIC for aspect ratio handling, and the 0
VIC for the infoframe video code as needed.
Reported-by: default avatarWilliam Tseng <william.tseng@intel.com>
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/6153
References: https://lore.kernel.org/r/20220920062316.43162-1-william.tseng@intel.com
Cc: <stable@vger.kernel.org>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/c3e78cc6d01ed237f71ad0038826b08d83d75eef.1672826282.git.jani.nikula@intel.com
parent 065ff1dc
...@@ -6885,8 +6885,6 @@ static u8 drm_mode_hdmi_vic(const struct drm_connector *connector, ...@@ -6885,8 +6885,6 @@ static u8 drm_mode_hdmi_vic(const struct drm_connector *connector,
static u8 drm_mode_cea_vic(const struct drm_connector *connector, static u8 drm_mode_cea_vic(const struct drm_connector *connector,
const struct drm_display_mode *mode) const struct drm_display_mode *mode)
{ {
u8 vic;
/* /*
* HDMI spec says if a mode is found in HDMI 1.4b 4K modes * HDMI spec says if a mode is found in HDMI 1.4b 4K modes
* we should send its VIC in vendor infoframes, else send the * we should send its VIC in vendor infoframes, else send the
...@@ -6896,13 +6894,18 @@ static u8 drm_mode_cea_vic(const struct drm_connector *connector, ...@@ -6896,13 +6894,18 @@ static u8 drm_mode_cea_vic(const struct drm_connector *connector,
if (drm_mode_hdmi_vic(connector, mode)) if (drm_mode_hdmi_vic(connector, mode))
return 0; return 0;
vic = drm_match_cea_mode(mode); return drm_match_cea_mode(mode);
}
/* /*
* HDMI 1.4 VIC range: 1 <= VIC <= 64 (CEA-861-D) but * Avoid sending VICs defined in HDMI 2.0 in AVI infoframes to sinks that
* HDMI 2.0 VIC range: 1 <= VIC <= 107 (CEA-861-F). So we * conform to HDMI 1.4.
* have to make sure we dont break HDMI 1.4 sinks. *
*/ * HDMI 1.4 (CTA-861-D) VIC range: [1..64]
* HDMI 2.0 (CTA-861-F) VIC range: [1..107]
*/
static u8 vic_for_avi_infoframe(const struct drm_connector *connector, u8 vic)
{
if (!is_hdmi2_sink(connector) && vic > 64) if (!is_hdmi2_sink(connector) && vic > 64)
return 0; return 0;
...@@ -6978,7 +6981,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, ...@@ -6978,7 +6981,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
picture_aspect = HDMI_PICTURE_ASPECT_NONE; picture_aspect = HDMI_PICTURE_ASPECT_NONE;
} }
frame->video_code = vic; frame->video_code = vic_for_avi_infoframe(connector, vic);
frame->picture_aspect = picture_aspect; frame->picture_aspect = picture_aspect;
frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE; frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN; frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment