aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0649-drm-amd-dal-Remove-registration-of-Poll-for-connecto.patch
blob: 4d6514e6095eca5b3d528429d4c4b5d9d3167372 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
From f30dd83168f27183295c41c761935bc41c72073e Mon Sep 17 00:00:00 2001
From: David Rokhvarg <David.Rokhvarg@amd.com>
Date: Tue, 22 Dec 2015 17:57:28 -0500
Subject: [PATCH 0649/1110] drm/amd/dal: Remove registration of Poll for
 connector.

Our display detection is interrupt-driven, no need to register for
Poll from DRM.

Also this results in:
- less notifications from kernel to user mode about hpd events.
- less contention on MST state is triggered from user-mode.

Signed-off-by: David Rokhvarg <David.Rokhvarg@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
---
 .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c  | 29 +++++++++++++++++++---
 drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c      |  7 ++----
 .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c    | 20 +++++----------
 3 files changed, 34 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
index 0a05774..e856f0c 100644
--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
+++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
@@ -471,6 +471,30 @@ void dc_helpers_dp_mst_handle_mst_hpd_rx_irq(void *param)
 	}
 }
 
+/* Depending on Root connector state, update MST state of all connectors
+ * belonging to it. */
+static void set_mst_topology_state(struct drm_device *dev)
+{
+	struct drm_connector *connector;
+	struct amdgpu_connector *aconnector = NULL;
+
+	mutex_lock(&dev->mode_config.mutex);
+
+	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+		mutex_unlock(&dev->mode_config.mutex);
+
+		aconnector = to_amdgpu_connector(connector);
+
+		if (aconnector->is_mst_connector)
+			drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr,
+					aconnector->is_mst_connector);
+
+		mutex_lock(&dev->mode_config.mutex);
+	}
+
+	mutex_unlock(&dev->mode_config.mutex);
+}
+
 bool dc_helpers_dp_mst_start_top_mgr(
 		struct dc_context *ctx,
 		const struct dc_link *link)
@@ -480,7 +504,7 @@ bool dc_helpers_dp_mst_start_top_mgr(
 	struct amdgpu_connector *aconnector = get_connector_for_link(dev, link);
 
 	aconnector->is_mst_connector = true;
-
+	set_mst_topology_state(dev);
 	return true;
 }
 
@@ -492,9 +516,8 @@ void dc_helpers_dp_mst_stop_top_mgr(
 	struct drm_device *dev = adev->ddev;
 	struct amdgpu_connector *aconnector = get_connector_for_link(dev, link);
 
-	drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, false);
-
 	aconnector->is_mst_connector = false;
+	set_mst_topology_state(dev);
 }
 
 bool dc_helper_dp_read_dpcd(
diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c
index b2b7820..62df355 100644
--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c
@@ -793,7 +793,7 @@ static void handle_hpd_irq(void *param)
 
 	dc_link_detect(aconnector->dc_link);
 	amdgpu_dm_update_connector_after_detect(aconnector);
-	drm_helper_hpd_irq_event(dev);
+	drm_kms_helper_hotplug_event(dev);
 }
 
 static void handle_hpd_rx_irq(void *param)
@@ -807,7 +807,7 @@ static void handle_hpd_rx_irq(void *param)
 		/* Downstream Port status changed. */
 		dc_link_detect(aconnector->dc_link);
 		amdgpu_dm_update_connector_after_detect(aconnector);
-		drm_helper_hpd_irq_event(dev);
+		drm_kms_helper_hotplug_event(dev);
 	}
 
 	if (aconnector->is_mst_connector) {
@@ -930,9 +930,6 @@ static int dce110_register_irq_handlers(struct amdgpu_device *adev)
 
 	register_hpd_handlers(adev);
 
-	/* This is a part of HPD initialization. */
-	drm_kms_helper_poll_init(adev->ddev);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
index 33fe1a4..492939e 100644
--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
+++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
@@ -988,23 +988,15 @@ static enum drm_connector_status
 amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
 {
 	bool connected;
-	struct amdgpu_connector *aconnector =
-			to_amdgpu_connector(connector);
-
-	/*
-	 * TODO: check whether we should lock here for mst_mgr.lock
-	 */
-	/* set root connector to disconnected */
-	if (aconnector->is_mst_connector) {
-		if (!aconnector->mst_mgr.mst_state)
-			drm_dp_mst_topology_mgr_set_mst(
-				&aconnector->mst_mgr,
-				true);
+	struct amdgpu_connector *aconnector = to_amdgpu_connector(connector);
 
-		return connector_status_disconnected;
-	}
+	/* Notes:
+	 * 1. This interface is NOT called in context of HPD irq.
+	 * 2. This interface *is called* in context of user-mode ioctl. Which
+	 * makes it a bad place for *any* MST-related activit. */
 
 	connected = (NULL != aconnector->dc_sink);
+
 	return (connected ? connector_status_connected :
 			connector_status_disconnected);
 }
-- 
2.7.4