drm/i915/hdmi: Ignore DP++ TMDS clock limit for native HDMI ports
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 22 Dec 2021 16:17:38 +0000 (18:17 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 19 Jan 2022 22:07:53 +0000 (00:07 +0200)
Lots of machines these days seem to have a crappy type1 DP dual
mode adaptor chip slapped onto the motherboard. Based on the
DP dual mode spec we currently limit those to 165MHz max TMDS
clock.

Windows OTOH ignores DP dual mode adaptors when the VBT
indicates that the port is not actually DP++, so we can
perhaps assume that the vendors did intend that the 165MHz
clock limit doesn't apply here. Though it would be much
nicer if they actually declared an explicit limit through
VBT, but that doesn't seem to be happening either.

So in order to match Windows behaviour let's ignore the
DP dual mode adaptor's TMDS clock limit for ports that
don't look like DP++ in VBT.

Unfortunately many older VBTs misdelcare their DP++ ports
as just HDMI (eg. ILK Dell Latitude E5410) or DP (eg. SNB
Lenovo ThinkPad X220). So we can't really do this universally
without risking black screens. I suppose a sensible cutoff
is HSW+ since that's when 4k became a thing and one might
assume that the machines have been tested to work with higher
TMDS clock rates.

v2: s/IS_BROADWELL/IS_HASWELL/

Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211222161738.12478-1-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_hdmi.c

index 3b5b9e7..3156dc3 100644 (file)
@@ -2359,6 +2359,14 @@ intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
                    "DP dual mode adaptor (%s) detected (max TMDS clock: %d kHz)\n",
                    drm_dp_get_dual_mode_type_name(type),
                    hdmi->dp_dual_mode.max_tmds_clock);
+
+       /* Older VBTs are often buggy and can't be trusted :( Play it safe. */
+       if ((DISPLAY_VER(dev_priv) >= 8 || IS_HASWELL(dev_priv)) &&
+           !intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
+               drm_dbg_kms(&dev_priv->drm,
+                           "Ignoring DP dual mode adaptor max TMDS clock for native HDMI port\n");
+               hdmi->dp_dual_mode.max_tmds_clock = 0;
+       }
 }
 
 static bool