diff options
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.patch | 107 |
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 + |