diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0609-drm-amd-dal-split-selection-of-connector-in-commit.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0609-drm-amd-dal-split-selection-of-connector-in-commit.patch | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0609-drm-amd-dal-split-selection-of-connector-in-commit.patch b/common/recipes-kernel/linux/files/0609-drm-amd-dal-split-selection-of-connector-in-commit.patch new file mode 100644 index 00000000..7e7dbd26 --- /dev/null +++ b/common/recipes-kernel/linux/files/0609-drm-amd-dal-split-selection-of-connector-in-commit.patch @@ -0,0 +1,131 @@ +From c9ba7980b34bcfd93743b190c00ea8903122d198 Mon Sep 17 00:00:00 2001 +From: Mykola Lysenko <Mykola.Lysenko@amd.com> +Date: Thu, 10 Dec 2015 20:20:48 +0800 +Subject: [PATCH 0609/1110] drm/amd/dal: split selection of connector in commit + +During commit there could be situation when there are two connectors +in state. For SET mode action new connector should be used. +For RESET mode action old connector should be used. + +In old code there was a situation when OLD connector sink +used for SET mode. + +Also it uses new and old connector to update MST semaphore properly + +Signed-off-by: Harry Wentland <harry.wentland@amd.com> +Acked-by: Harry Wentland<harry.wentland@amd.com> +--- + .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c | 45 +++++++++++++--------- + 1 file changed, 26 insertions(+), 19 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c +index a9ff09d..633f0de 100644 +--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c ++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c +@@ -2118,7 +2118,8 @@ int amdgpu_dm_atomic_commit( + /* update changed items */ + for_each_crtc_in_state(state, crtc, old_crtc_state, i) { + struct amdgpu_crtc *acrtc; +- struct amdgpu_connector *aconnector = NULL; ++ struct amdgpu_connector *aconnector_new = NULL; ++ struct amdgpu_connector *aconnector_old = NULL; + enum dm_commit_action action; + struct drm_crtc_state *new_state = crtc->state; + struct drm_connector *connector; +@@ -2126,20 +2127,30 @@ int amdgpu_dm_atomic_commit( + + acrtc = to_amdgpu_crtc(crtc); + +- for_each_connector_in_state(state, +- connector, old_con_state, j) { ++ for_each_connector_in_state( ++ state, ++ connector, ++ old_con_state, ++ j) { + if (connector->state->crtc == crtc) { +- aconnector = to_amdgpu_connector(connector); ++ aconnector_new = to_amdgpu_connector(connector); + break; + } ++ } + ++ for_each_connector_in_state( ++ state, ++ connector, ++ old_con_state, ++ j) { + /* +- * this is the case when reset occur, connector is +- * removed from new crtc state. We need to update +- * connector state anyway. Access it from old_con_state ++ * this is the case when reset occur, connector ++ * is removed from new crtc state. We need to ++ * update connector state anyway. Access it from ++ * old_con_state + */ + if (old_con_state->crtc == crtc) { +- aconnector = to_amdgpu_connector(connector); ++ aconnector_old = to_amdgpu_connector(connector); + break; + } + } +@@ -2147,24 +2158,20 @@ int amdgpu_dm_atomic_commit( + /* handles headless hotplug case, updating new_state and + * aconnector as needed + */ +- handle_headless_hotplug(acrtc, new_state, &aconnector); ++ handle_headless_hotplug(acrtc, new_state, &aconnector_new); + + action = get_dm_commit_action(new_state); + +- if (!aconnector && action != DM_COMMIT_ACTION_NOTHING) { +- DRM_ERROR("Can't find connector for crtc %d\n", +- acrtc->crtc_id); +- break; +- } +- + switch (action) { + case DM_COMMIT_ACTION_DPMS_ON: + case DM_COMMIT_ACTION_SET: { + struct dc_target *new_target = + create_target_for_sink( +- aconnector, ++ aconnector_new, + &crtc->state->mode); ++ + DRM_DEBUG_KMS("Atomic commit: SET.\n"); ++ + if (!new_target) { + /* + * this could happen because of issues with +@@ -2190,7 +2197,7 @@ int amdgpu_dm_atomic_commit( + /* this is the update mode case */ + dc_target_release(acrtc->target); + acrtc->target = NULL; +- up(&aconnector->mst_sem); ++ up(&aconnector_old->mst_sem); + } + + /* +@@ -2204,7 +2211,7 @@ int amdgpu_dm_atomic_commit( + acrtc->target = new_target; + acrtc->enabled = true; + +- down(&aconnector->mst_sem); ++ down(&aconnector_new->mst_sem); + break; + } + +@@ -2222,7 +2229,7 @@ int amdgpu_dm_atomic_commit( + acrtc->target = NULL; + acrtc->enabled = false; + +- up(&aconnector->mst_sem); ++ up(&aconnector_old->mst_sem); + } + break; + } /* switch() */ +-- +2.7.4 + |