aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0609-drm-amd-dal-split-selection-of-connector-in-commit.patch
diff options
context:
space:
mode:
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.patch131
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
+