drm/edid: fix AVI infoframe aspect ratio handling
authorjsg <jsg@openbsd.org>
Mon, 27 Mar 2023 04:29:05 +0000 (04:29 +0000)
committerjsg <jsg@openbsd.org>
Mon, 27 Mar 2023 04:29:05 +0000 (04:29 +0000)
From Jani Nikula
26cbe4c63d1ed6b7e47ca196fd59f8a32ed353ca in linux-6.1.y/6.1.16
1cbc1f0d324ba6c4d1b10ac6362b5e0b029f63d5 in mainline linux

sys/dev/pci/drm/drm_edid.c

index 77c6e5a..4179940 100644 (file)
@@ -6735,8 +6735,6 @@ static u8 drm_mode_hdmi_vic(const struct drm_connector *connector,
 static u8 drm_mode_cea_vic(const struct drm_connector *connector,
                           const struct drm_display_mode *mode)
 {
-       u8 vic;
-
        /*
         * 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
@@ -6746,13 +6744,18 @@ static u8 drm_mode_cea_vic(const struct drm_connector *connector,
        if (drm_mode_hdmi_vic(connector, mode))
                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
-        * HDMI 2.0 VIC range: 1 <= VIC <= 107 (CEA-861-F). So we
-        * have to make sure we dont break HDMI 1.4 sinks.
-        */
+/*
+ * Avoid sending VICs defined in HDMI 2.0 in AVI infoframes to sinks that
+ * conform to HDMI 1.4.
+ *
+ * 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)
                return 0;
 
@@ -6828,7 +6831,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
                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->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
        frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;