]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/dp/mst: Read the extended DPCD capabilities during system resume
authorImre Deak <imre.deak@intel.com>
Tue, 14 Jun 2022 09:45:37 +0000 (12:45 +0300)
committerImre Deak <imre.deak@intel.com>
Thu, 16 Jun 2022 18:41:02 +0000 (21:41 +0300)
The WD22TB4 Thunderbolt dock at least will revert its DP_MAX_LINK_RATE
from HBR3 to HBR2 after system suspend/resume if the DP_DP13_DPCD_REV
registers are not read subsequently also as required.

Fix this by reading DP_DP13_DPCD_REV registers as well, matching what is
done during connector detection. While at it also fix up the same call
in drm_dp_mst_dump_topology().

Cc: Lyude Paul <lyude@redhat.com>
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5292
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Cc: <stable@vger.kernel.org> # v5.14+
Reviewed-by: Lyude Paul <lyude@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220614094537.885472-1-imre.deak@intel.com
drivers/gpu/drm/display/drm_dp_mst_topology.c

index 9aa2c20904e376c1f138f0c68fd03a31ed06117e..93651bc9a02c4a0c5db6ca129df3bf06b8f6301c 100644 (file)
@@ -3860,9 +3860,7 @@ int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr,
        if (!mgr->mst_primary)
                goto out_fail;
 
-       ret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, mgr->dpcd,
-                              DP_RECEIVER_CAP_SIZE);
-       if (ret != DP_RECEIVER_CAP_SIZE) {
+       if (drm_dp_read_dpcd_caps(mgr->aux, mgr->dpcd) < 0) {
                drm_dbg_kms(mgr->dev, "dpcd read failed - undocked during suspend?\n");
                goto out_fail;
        }
@@ -4910,8 +4908,7 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
                u8 buf[DP_PAYLOAD_TABLE_SIZE];
                int ret;
 
-               ret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, buf, DP_RECEIVER_CAP_SIZE);
-               if (ret) {
+               if (drm_dp_read_dpcd_caps(mgr->aux, buf) < 0) {
                        seq_printf(m, "dpcd read failed\n");
                        goto out;
                }