From 3b42a1c09568ac6b65bfa40931600c5fe49d31e2 Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Tue, 11 Jul 2017 13:45:57 -0400 Subject: [PATCH] drm/amd/display: Skip DC validation for flips and cursor. Nothing to validate in DC in this case. Skip it. Signed-off-by: Andrey Grodzovsky Reviewed-by: Roman Li Acked-by: Harry Wentland Signed-off-by: Alex Deucher --- .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c index b56150a29502..248b397a6a7d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c @@ -1311,8 +1311,7 @@ int amdgpu_dm_connector_mode_valid( if (context) { result = MODE_OK; - dc_resource_validate_ctx_destruct(context); - dm_free(context); + dc_release_validate_context(context); } dc_stream_release(stream); @@ -2598,8 +2597,8 @@ void amdgpu_dm_atomic_commit_tail( } } - /* DC is optimized not to do anything if 'streams' didn't change. */ - WARN_ON(!dc_commit_context(dm->dc, dm_state->context)); + if (dm_state->context) + WARN_ON(!dc_commit_context(dm->dc, dm_state->context)); list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { @@ -2932,9 +2931,9 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, /* * This bool will be set for true for any modeset/reset - * or surface update which implies non fast surfae update. + * or surface update which implies non fast surface update. */ - bool aquire_global_lock = false; + bool lock_and_validation_needed = false; ret = drm_atomic_helper_check(dev, state); @@ -3022,7 +3021,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, new_acrtc_state->stream, crtc); - aquire_global_lock = true; + lock_and_validation_needed = true; } else if (modereset_required(crtc_state)) { @@ -3036,7 +3035,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, dc_stream_release(new_acrtc_state->stream); new_acrtc_state->stream = NULL; - aquire_global_lock = true; + lock_and_validation_needed = true; } } @@ -3074,7 +3073,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, if (!is_scaling_state_different(con_new_state, con_old_state)) continue; - aquire_global_lock = true; + lock_and_validation_needed = true; } for_each_crtc_in_state(state, crtc, crtc_state, i) { @@ -3124,17 +3123,11 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, new_acrtc_state->stream, surface); - aquire_global_lock = true; + lock_and_validation_needed = true; } } } - dm_state->context = dc_get_validate_context(dc, set, set_count); - if (!dm_state->context) { - ret = -EINVAL; - goto fail_planes; - } - /* * For full updates case when * removing/adding/updating streams on once CRTC while flipping @@ -3144,10 +3137,18 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, * will wait for completion of any outstanding flip using DRMs * synchronization events. */ - if (aquire_global_lock) { + + if (lock_and_validation_needed) { + ret = do_aquire_global_lock(dev, state); if (ret) goto fail_planes; + + dm_state->context = dc_get_validate_context(dc, set, set_count); + if (!dm_state->context) { + ret = -EINVAL; + goto fail_planes; + } } /* Must be success */ -- 2.11.0