diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1159-drm-amdgpu-Don-t-ignore-rc-from-drm_dp_mst_topology_.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1159-drm-amdgpu-Don-t-ignore-rc-from-drm_dp_mst_topology_.patch | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1159-drm-amdgpu-Don-t-ignore-rc-from-drm_dp_mst_topology_.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1159-drm-amdgpu-Don-t-ignore-rc-from-drm_dp_mst_topology_.patch new file mode 100644 index 00000000..fca743aa --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1159-drm-amdgpu-Don-t-ignore-rc-from-drm_dp_mst_topology_.patch @@ -0,0 +1,83 @@ +From db1f7721c9422b1c551a95ec55dd5f5ab55ea6fa Mon Sep 17 00:00:00 2001 +From: Lyude Paul <lyude@redhat.com> +Date: Tue, 8 Jan 2019 16:11:27 -0500 +Subject: [PATCH 1159/2940] drm/amdgpu: Don't ignore rc from + drm_dp_mst_topology_mgr_resume() + +drm_dp_mst_topology_mgr_resume() returns whether or not it managed to +find the topology in question after a suspend resume cycle, and the +driver is supposed to check this value and disable MST accordingly if +it's gone-in addition to sending a hotplug in order to notify userspace +that something changed during suspend. + +Currently, amdgpu just makes the mistake of ignoring the return code +from drm_dp_mst_topology_mgr_resume() which means that if a topology was +removed in suspend, amdgpu never notices and assumes it's still +connected which leads to all sorts of problems. + +So, fix this by actually checking the rc from +drm_dp_mst_topology_mgr_resume(). Also, reformat the rest of the +function while we're at it to fix the over-indenting. + +Signed-off-by: Lyude Paul <lyude@redhat.com> +Reviewed-by: Harry Wentland <harry.wentland@amd.com> +Cc: Jerry Zuo <Jerry.Zuo@amd.com> +Cc: <stable@vger.kernel.org> # v4.15+ +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 32 +++++++++++++------ + 1 file changed, 23 insertions(+), 9 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index dca90c2ad22b..6dc502b96408 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -698,22 +698,36 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend) + { + struct amdgpu_dm_connector *aconnector; + struct drm_connector *connector; ++ struct drm_dp_mst_topology_mgr *mgr; ++ int ret; ++ bool need_hotplug = false; + + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); + +- list_for_each_entry(connector, &dev->mode_config.connector_list, head) { +- aconnector = to_amdgpu_dm_connector(connector); +- if (aconnector->dc_link->type == dc_connection_mst_branch && +- !aconnector->mst_port) { ++ list_for_each_entry(connector, &dev->mode_config.connector_list, ++ head) { ++ aconnector = to_amdgpu_dm_connector(connector); ++ if (aconnector->dc_link->type != dc_connection_mst_branch || ++ aconnector->mst_port) ++ continue; ++ ++ mgr = &aconnector->mst_mgr; + +- if (suspend) +- drm_dp_mst_topology_mgr_suspend(&aconnector->mst_mgr); +- else +- drm_dp_mst_topology_mgr_resume(&aconnector->mst_mgr); +- } ++ if (suspend) { ++ drm_dp_mst_topology_mgr_suspend(mgr); ++ } else { ++ ret = drm_dp_mst_topology_mgr_resume(mgr); ++ if (ret < 0) { ++ drm_dp_mst_topology_mgr_set_mst(mgr, false); ++ need_hotplug = true; ++ } ++ } + } + + drm_modeset_unlock(&dev->mode_config.connection_mutex); ++ ++ if (need_hotplug) ++ drm_kms_helper_hotplug_event(dev); + } + + /** +-- +2.17.1 + |