aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4685-drm-amd-display-skip-multisync-redo-for-already-enab.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4685-drm-amd-display-skip-multisync-redo-for-already-enab.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4685-drm-amd-display-skip-multisync-redo-for-already-enab.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4685-drm-amd-display-skip-multisync-redo-for-already-enab.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4685-drm-amd-display-skip-multisync-redo-for-already-enab.patch
new file mode 100644
index 00000000..c2cb6868
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4685-drm-amd-display-skip-multisync-redo-for-already-enab.patch
@@ -0,0 +1,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
+