diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1138-drm-amd-display-Simplify-underscan-and-ABM-commit.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1138-drm-amd-display-Simplify-underscan-and-ABM-commit.patch | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1138-drm-amd-display-Simplify-underscan-and-ABM-commit.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1138-drm-amd-display-Simplify-underscan-and-ABM-commit.patch new file mode 100644 index 00000000..79bfda12 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1138-drm-amd-display-Simplify-underscan-and-ABM-commit.patch @@ -0,0 +1,115 @@ +From 48ec269e7c617a30272b6a8407a94998ba1cbc3a Mon Sep 17 00:00:00 2001 +From: David Francis <David.Francis@amd.com> +Date: Tue, 18 Dec 2018 15:30:19 -0500 +Subject: [PATCH 1138/2940] drm/amd/display: Simplify underscan and ABM commit + +[Why] +Underscan and ABM are connector properties but require updates +to DC stream state. Previously, on updates to these properties +the affected stream and all its planes were committed. +This is unnecessary; only a few fields on the stream need +to be changed. + +[How] +If scaling or ABM have changed, change the stream and +create a stream update with those changes. Call +DC with only those fields. + +Signed-off-by: David Francis <David.Francis@amd.com> +Reviewed-by: Harry Wentland <Harry.Wentland@amd.com> +Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 51 ++++++++++++------- + 1 file changed, 32 insertions(+), 19 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 f7b2db3ac1df..83838469d074 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -5189,11 +5189,13 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) + } + } + +- /* Handle scaling, underscan, and abm changes*/ ++ /* Handle connector state changes */ + for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) { + struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state); + struct dm_connector_state *dm_old_con_state = to_dm_connector_state(old_con_state); + struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc); ++ struct dc_surface_update dummy_updates[MAX_SURFACES] = { 0 }; ++ struct dc_stream_update stream_update = { 0 }; + struct dc_stream_status *status = NULL; + + if (acrtc) { +@@ -5205,37 +5207,48 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) + if (!acrtc || drm_atomic_crtc_needs_modeset(new_crtc_state)) + continue; + +- + dm_new_crtc_state = to_dm_crtc_state(new_crtc_state); + dm_old_crtc_state = to_dm_crtc_state(old_crtc_state); + +- /* Skip anything that is not scaling or underscan changes */ + if (!is_scaling_state_different(dm_new_con_state, dm_old_con_state) && + (dm_new_crtc_state->abm_level == dm_old_crtc_state->abm_level)) + continue; + +- update_stream_scaling_settings(&dm_new_con_state->base.crtc->mode, +- dm_new_con_state, (struct dc_stream_state *)dm_new_crtc_state->stream); ++ if (is_scaling_state_different(dm_new_con_state, dm_old_con_state)) { ++ update_stream_scaling_settings(&dm_new_con_state->base.crtc->mode, ++ dm_new_con_state, (struct dc_stream_state *)dm_new_crtc_state->stream); + +- if (!dm_new_crtc_state->stream) +- continue; ++ stream_update.src = dm_new_crtc_state->stream->src; ++ stream_update.dst = dm_new_crtc_state->stream->dst; ++ } ++ ++ if (dm_new_crtc_state->abm_level != dm_old_crtc_state->abm_level) { ++ dm_new_crtc_state->stream->abm_level = dm_new_crtc_state->abm_level; ++ ++ stream_update.abm_level = &dm_new_crtc_state->abm_level; ++ } + + status = dc_stream_get_status(dm_new_crtc_state->stream); + WARN_ON(!status); + WARN_ON(!status->plane_count); + +- dm_new_crtc_state->stream->abm_level = dm_new_crtc_state->abm_level; +- +- /*TODO How it works with MPO ?*/ +- if (!commit_planes_to_stream( +- dm, +- dm->dc, +- status->plane_states, +- status->plane_count, +- dm_new_crtc_state, +- to_dm_crtc_state(old_crtc_state), +- dc_state)) +- dm_error("%s: Failed to update stream scaling!\n", __func__); ++ /* ++ * TODO: DC refuses to perform stream updates without a dc_surface_update. ++ * Here we create an empty update on each plane. ++ * To fix this, DC should permit updating only stream properties. ++ */ ++ for (j = 0; j < status->plane_count; j++) ++ dummy_updates[j].surface = status->plane_states[0]; ++ ++ ++ mutex_lock(&dm->dc_lock); ++ dc_commit_updates_for_stream(dm->dc, ++ dummy_updates, ++ status->plane_count, ++ dm_new_crtc_state->stream, ++ &stream_update, ++ dc_state); ++ mutex_unlock(&dm->dc_lock); + } + + for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, +-- +2.17.1 + |