aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4685-drm-amd-display-skip-multisync-redo-for-already-enab.patch
blob: c2cb68689c06225cc59785e62a09b8459d317eea (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
From 311c7aebbfb9fd57240286b9e6f9b16f62c1a77f Mon Sep 17 00:00:00 2001
From: Yogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
Date: Wed, 26 Sep 2018 14:41:00 +0530
Subject: [PATCH 4685/5725] drm/amd/display: skip multisync redo for already
 enabled displays

[Why]
During boot/hotplug Xorg calls modeset ioctl for the new displays being enabled
ony by one. As of now even for already enabled displays multi sync is getting
re-enabled. This is not required.

[how]
In enable_timing_multisync() function skip displays if it is already enabled.
Also if there is a new master stream enumerated, then in
enable_timing_multisync() function, redo multisync for already
enabled displays.

Signed-off-by: Yogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 18 +++++++++++++-----
 drivers/gpu/drm/amd/display/dc/core/dc.c          |  4 ++++
 drivers/gpu/drm/amd/display/dc/inc/core_types.h   |  1 +
 3 files changed, 18 insertions(+), 5 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 913e6c1..3448aa0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2570,10 +2570,12 @@ static void set_multisync_trigger_params(
 	}
 }
 
-static void set_master_stream(struct dc_stream_state *stream_set[],
+static void set_master_stream(struct dc_state *context,
+			      struct dc_stream_state *stream_set[],
 			      int stream_count)
 {
-	int j, highest_rfr = 0, master_stream = 0;
+	int j, highest_rfr = 0;
+	struct dc_stream_state *new_master_stream = NULL, *old_master_stream = NULL;
 
 	for (j = 0;  j < stream_count; j++) {
 		if (stream_set[j] && stream_set[j]->triggered_crtc_reset.enabled) {
@@ -2583,14 +2585,20 @@ static void set_master_stream(struct dc_stream_state *stream_set[],
 				(stream_set[j]->timing.h_total*stream_set[j]->timing.v_total);
 			if (refresh_rate > highest_rfr) {
 				highest_rfr = refresh_rate;
-				master_stream = j;
+				new_master_stream = stream_set[j];
 			}
+
+			if (stream_set[j]->triggered_crtc_reset.event_source)
+				old_master_stream = stream_set[j]->triggered_crtc_reset.event_source;
 		}
 	}
 	for (j = 0;  j < stream_count; j++) {
 		if (stream_set[j])
-			stream_set[j]->triggered_crtc_reset.event_source = stream_set[master_stream];
+			stream_set[j]->triggered_crtc_reset.event_source = new_master_stream;
 	}
+
+	if (old_master_stream != new_master_stream)
+		context->mdvsync_master_changed = true;
 }
 
 bool dm_helpers_parse_amd_vsdb(struct edid *edid)
@@ -2672,7 +2680,7 @@ static void dm_enable_per_frame_crtc_master_sync(struct dc_state *context)
 		*/
 		set_multisync_trigger_params(context->streams[i]);
 	}
-	set_master_stream(context->streams, context->stream_count);
+	set_master_stream(context, context->streams, context->stream_count);
 }
 
 static struct dc_stream_state *
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 1f8f6446..7da1e88 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -675,6 +675,10 @@ static void enable_timing_multisync(
 			    ctx->res_ctx.pipe_ctx[i].stream,
 			    ctx->res_ctx.pipe_ctx[i].stream->triggered_crtc_reset.event_source))
 			continue;
+		if ((ctx->mdvsync_master_changed == false) &&
+		    ctx->res_ctx.pipe_ctx[i].stream_res.tg->funcs->is_blanked &&
+		    !ctx->res_ctx.pipe_ctx[i].stream_res.tg->funcs->is_blanked(ctx->res_ctx.pipe_ctx[i].stream_res.tg))
+			continue;
 
 		multisync_pipes[multisync_count] = &ctx->res_ctx.pipe_ctx[i];
 		multisync_count++;
diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
index 4beddca0..a4640e4a 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
@@ -270,6 +270,7 @@ struct dc_state {
 	struct dc_stream_state *streams[MAX_PIPES];
 	struct dc_stream_status stream_status[MAX_PIPES];
 	uint8_t stream_count;
+	uint8_t mdvsync_master_changed;
 
 	struct resource_context res_ctx;
 
-- 
2.7.4