aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4523-drm-amd-display-Release-fake-sink.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4523-drm-amd-display-Release-fake-sink.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4523-drm-amd-display-Release-fake-sink.patch107
1 files changed, 107 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4523-drm-amd-display-Release-fake-sink.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4523-drm-amd-display-Release-fake-sink.patch
new file mode 100644
index 00000000..d1478b55
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4523-drm-amd-display-Release-fake-sink.patch
@@ -0,0 +1,107 @@
+From e027a0005137196219e591ac390881922364b335 Mon Sep 17 00:00:00 2001
+From: Mikita Lipski <mikita.lipski@amd.com>
+Date: Tue, 1 May 2018 11:33:25 -0400
+Subject: [PATCH 4523/5725] drm/amd/display: Release fake sink
+
+If connector doesn't have a sink, fake sink is created, but
+never released as it assumed that its destroyed with the
+stream it is used for. But now sink is released before the
+stream maintaing refcount consistency.
+
+This way we also avoid assigning anything to connector keeping
+all the operation local.
+
+Signed-off-by: Mikita Lipski <mikita.lipski@amd.com>
+Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
+---
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 31 ++++++++++++-----------
+ 1 file changed, 16 insertions(+), 15 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 a796d56..3bf451f 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -2409,27 +2409,22 @@ decide_crtc_timing_for_drm_display_mode(struct drm_display_mode *drm_mode,
+ }
+ }
+
+-static int create_fake_sink(struct amdgpu_dm_connector *aconnector)
++static struct dc_sink *
++create_fake_sink(struct amdgpu_dm_connector *aconnector)
+ {
+- struct dc_sink *sink = NULL;
+ struct dc_sink_init_data sink_init_data = { 0 };
+-
++ struct dc_sink *sink = NULL;
+ sink_init_data.link = aconnector->dc_link;
+ sink_init_data.sink_signal = aconnector->dc_link->connector_signal;
+
+ sink = dc_sink_create(&sink_init_data);
+ if (!sink) {
+ DRM_ERROR("Failed to create sink!\n");
+- return -ENOMEM;
++ return NULL;
+ }
+-
+ sink->sink_signal = SIGNAL_TYPE_VIRTUAL;
+- aconnector->fake_enable = true;
+
+- aconnector->dc_sink = sink;
+- aconnector->dc_link->local_sink = sink;
+-
+- return 0;
++ return sink;
+ }
+
+ static void set_multisync_trigger_params(
+@@ -2556,7 +2551,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
+ struct dc_stream_state *stream = NULL;
+ struct drm_display_mode mode = *drm_mode;
+ bool native_mode_found = false;
+-
++ struct dc_sink *sink = NULL;
+ if (aconnector == NULL) {
+ DRM_ERROR("aconnector is NULL!\n");
+ return stream;
+@@ -2574,15 +2569,18 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
+ return stream;
+ }
+
+- if (create_fake_sink(aconnector))
++ sink = create_fake_sink(aconnector);
++ if (!sink)
+ return stream;
++ } else {
++ sink = aconnector->dc_sink;
+ }
+
+- stream = dc_create_stream_for_sink(aconnector->dc_sink);
++ stream = dc_create_stream_for_sink(sink);
+
+ if (stream == NULL) {
+ DRM_ERROR("Failed to create stream for sink!\n");
+- return stream;
++ goto finish;
+ }
+
+ list_for_each_entry(preferred_mode, &aconnector->base.modes, head) {
+@@ -2621,12 +2619,15 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
+ fill_audio_info(
+ &stream->audio_info,
+ drm_connector,
+- aconnector->dc_sink);
++ sink);
+
+ update_stream_signal(stream);
+
+ if (dm_state && dm_state->freesync_capable)
+ stream->ignore_msa_timing_param = true;
++finish:
++ if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL)
++ dc_sink_release(sink);
+
+ return stream;
+ }
+--
+2.7.4
+