diff mbox series

[1/2,SRU,J/OEM-5.14/OEM-5.17] drm/dp/mst: Read the extended DPCD capabilities during system resume

Message ID 20220621053401.22009-2-koba.ko@canonical.com
State New
Headers show
Series UBUNTU: SAUCE: Fix WD22TB4 suspend and resume, two external monitor can not output | expand

Commit Message

Koba Ko June 21, 2022, 5:34 a.m. UTC
From: Imre Deak <imre.deak@intel.com>

BugLink: https://bugs.launchpad.net/bugs/1979267

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>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Ref: https://patchwork.freedesktop.org/patch/489424/?series=105101&rev=1
Signed-off-by: Koba Ko <koba.ko@canonical.com>
---
 drivers/gpu/drm/drm_dp_mst_topology.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

Comments

Stefan Bader Aug. 4, 2022, 8:57 a.m. UTC | #1
On 21.06.22 07:34, Koba Ko wrote:
> From: Imre Deak <imre.deak@intel.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1979267
> 
> 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>
> Reviewed-by: Lyude Paul <lyude@redhat.com>
> Ref: https://patchwork.freedesktop.org/patch/489424/?series=105101&rev=1
> Signed-off-by: Koba Ko <koba.ko@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
> ---

Landed upstream now as 7a710a8bc909313951eb9252d8419924c771d7c2

>   drivers/gpu/drm/drm_dp_mst_topology.c | 7 ++-----
>   1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
> index 86d13d6bc4631..e327c14d66cd3 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -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;
>   	}
> @@ -4893,8 +4891,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;
>   		}
Stefan Bader Aug. 4, 2022, 9:19 a.m. UTC | #2
On 21.06.22 07:34, Koba Ko wrote:
> From: Imre Deak <imre.deak@intel.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1979267
> 
> 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>
> Reviewed-by: Lyude Paul <lyude@redhat.com>
> Ref: https://patchwork.freedesktop.org/patch/489424/?series=105101&rev=1
> Signed-off-by: Koba Ko <koba.ko@canonical.com>
> ---

Applied to jammy:linux/master-next. I basically took the upstream change and 
made it a backport which changes the file path. Thanks.

-Stefan
>   drivers/gpu/drm/drm_dp_mst_topology.c | 7 ++-----
>   1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
> index 86d13d6bc4631..e327c14d66cd3 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -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;
>   	}
> @@ -4893,8 +4891,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;
>   		}
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index 86d13d6bc4631..e327c14d66cd3 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -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;
 	}
@@ -4893,8 +4891,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;
 		}