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
|