aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0948-drm-amd-dal-do-not-clean-dc_link-on-MST-disconnect.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0948-drm-amd-dal-do-not-clean-dc_link-on-MST-disconnect.patch')
-rw-r--r--common/recipes-kernel/linux/files/0948-drm-amd-dal-do-not-clean-dc_link-on-MST-disconnect.patch120
1 files changed, 120 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0948-drm-amd-dal-do-not-clean-dc_link-on-MST-disconnect.patch b/common/recipes-kernel/linux/files/0948-drm-amd-dal-do-not-clean-dc_link-on-MST-disconnect.patch
new file mode 100644
index 00000000..c1def607
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0948-drm-amd-dal-do-not-clean-dc_link-on-MST-disconnect.patch
@@ -0,0 +1,120 @@
+From b6e77dda0b4b7dfb819d5e47e2ffd2e52144e625 Mon Sep 17 00:00:00 2001
+From: Mykola Lysenko <Mykola.Lysenko@amd.com>
+Date: Fri, 11 Dec 2015 20:28:48 +0800
+Subject: [PATCH 0948/1050] drm/amd/dal: do not clean dc_link on MST disconnect
+
+This change restores previous behaviour, because mapping between
+stream and connector is needed till reset mode, where it is accessed
+for payload allocation.
+
+We currently have the following references to dc_sink:
+
+1. Hard reference in stream. Cleaned-up when target destroyed on reset mode;
+2. Hard reference in link. Clean-up on HPD disconnect event;
+3. Weak reference in aconnector. Weak means it does not controlled by counter.
+
+Change-Id: I166eb1f383701f91c524d9d1254821044cf95639
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Harry Wentland<harry.wentland@amd.com>
+---
+ .../drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c | 37 ++++++++++++----------
+ drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 19 ++---------
+ 2 files changed, 23 insertions(+), 33 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
+index 3ca0b31..ef3a835 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
+@@ -75,8 +75,7 @@ dm_dp_mst_detect(struct drm_connector *connector, bool force)
+ aconnector->port);
+
+ if (status == connector_status_disconnected && aconnector->dc_sink) {
+- dc_link_remove_sink(aconnector->dc_link, aconnector->dc_sink);
+- aconnector->dc_sink = NULL;
++ aconnector->edid = NULL;
+ }
+
+ return status;
+@@ -170,25 +169,31 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
+
+ flush_work(&master->mst_mgr.work);
+
+- edid = drm_dp_mst_get_edid(connector, &master->mst_mgr, aconnector->port);
++ if (!aconnector->edid) {
++ edid = drm_dp_mst_get_edid(connector, &master->mst_mgr, aconnector->port);
+
+- if (!edid) {
+- drm_mode_connector_update_edid_property(
+- &aconnector->base,
+- NULL);
++ if (!edid) {
++ drm_mode_connector_update_edid_property(
++ &aconnector->base,
++ NULL);
+
+- return ret;
+- }
++ return ret;
++ }
+
+- aconnector->edid = edid;
++ aconnector->edid = edid;
+
+- if (!aconnector->dc_sink) {
+- sink = dm_dp_mst_add_mst_sink(
++ if (aconnector->dc_sink)
++ dc_link_remove_sink(
+ aconnector->dc_link,
+- (uint8_t *)edid,
+- (edid->extensions + 1) * EDID_LENGTH);
+- aconnector->dc_sink = sink;
+- }
++ aconnector->dc_sink);
++
++ sink = dm_dp_mst_add_mst_sink(
++ aconnector->dc_link,
++ (uint8_t *)edid,
++ (edid->extensions + 1) * EDID_LENGTH);
++ aconnector->dc_sink = sink;
++ } else
++ edid = aconnector->edid;
+
+ DRM_DEBUG_KMS("edid retrieved %p\n", edid);
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+index 5890555..add76ca 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+@@ -639,27 +639,12 @@ void dc_link_detect(const struct dc_link *dc_link)
+ switch (link->public.connector_signal) {
+ case SIGNAL_TYPE_DISPLAY_PORT:
+ dc_helpers_dp_mst_stop_top_mgr(link->ctx, &link->public);
+- /*
+- * in this case sinks would be removed in outer level
+- */
+-
+- /*
+- * TODO: this is the only way to understand that link
+- * was in mst mode. Proposal for future to add
+- * additional field to link that will show actual state.
+- *
+- * For the change: for mst we create sink outside, and
+- * should remove them in the same place
+- */
+- if (link->public.sink_count == 1 &&
+- link->public.sink[0]->sink_signal !=
+- SIGNAL_TYPE_DISPLAY_PORT_MST)
+- link_disconnect_all_sinks(link);
+ break;
+ default:
+- link_disconnect_all_sinks(link);
+ break;
+ }
++
++ link_disconnect_all_sinks(link);
+ }
+
+ LINK_INFO("link=%d, dc_sink_in=%p is now %s\n",
+--
+1.9.1
+