drm/i915: Skip SINK_COUNT read on CH7511
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 28 May 2019 14:06:50 +0000 (17:06 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 12 Jul 2019 15:59:13 +0000 (18:59 +0300)
CH7511 doesn't update SINK_COUNT properly so in order to detect
the device as connected we have to ignore SINK_COUNT.

In order to have access to the quirk list early enough we
must move the drm_dp_read_desc() call to happen earlier.
We can also skip re-reading this on eDP since we know it
won't change.

Cc: David S. <david@majinbuu.com>
Cc: Peteris Rudzusiks <peteris.rudzusiks@gmail.com>
Tested-by: Peteris Rudzusiks <peteris.rudzusiks@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105406
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190528140650.19230-2-ville.syrjala@linux.intel.com
Acked-by: Jani Nikula <jani.nikula@intel.com> #irc
drivers/gpu/drm/i915/display/intel_dp.c

index 24592d985bcb5ffedc9a6485671d0f61161b24cd..ca333b3c7415277c57c627b0f3493efdeb611eea 100644 (file)
@@ -4221,8 +4221,14 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
        if (!intel_dp_read_dpcd(intel_dp))
                return false;
 
-       /* Don't clobber cached eDP rates. */
+       /*
+        * Don't clobber cached eDP rates. Also skip re-reading
+        * the OUI/ID since we know it won't change.
+        */
        if (!intel_dp_is_edp(intel_dp)) {
+               drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
+                                drm_dp_is_branch(intel_dp->dpcd));
+
                intel_dp_set_sink_rates(intel_dp);
                intel_dp_set_common_rates(intel_dp);
        }
@@ -4231,7 +4237,8 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
         * Some eDP panels do not set a valid value for sink count, that is why
         * it don't care about read it here and in intel_edp_init_dpcd().
         */
-       if (!intel_dp_is_edp(intel_dp)) {
+       if (!intel_dp_is_edp(intel_dp) &&
+           !drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_NO_SINK_COUNT)) {
                u8 count;
                ssize_t r;
 
@@ -5377,9 +5384,6 @@ intel_dp_detect(struct drm_connector *connector,
        if (INTEL_GEN(dev_priv) >= 11)
                intel_dp_get_dsc_sink_cap(intel_dp);
 
-       drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
-                        drm_dp_is_branch(intel_dp->dpcd));
-
        intel_dp_configure_mst(intel_dp);
 
        if (intel_dp->is_mst) {