aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2608-drm-amd-display-Atomic-freesync-ASSERT-fix.patch
blob: 34b27d81ae0f3c6c6e9fc62f6dca51e1e03885db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
From a67cc565908309ef1b4d107f438aff668946b6ee Mon Sep 17 00:00:00 2001
From: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Date: Mon, 16 Oct 2017 15:51:00 -0400
Subject: [PATCH 2608/4131] drm/amd/display: Atomic freesync ASSERT fix

Changes to atomic set property for freesync.

Now In set property, just set the freesync variables and return 0.
Based on the variables call mod_freesync_set_user_enable() inside
commit_tail

Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 85 +++++++++--------------
 1 file changed, 32 insertions(+), 53 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 d1e3f1d..a593d63 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1679,6 +1679,7 @@ struct dm_connector_state {
 	uint8_t underscan_vborder;
 	uint8_t underscan_hborder;
 	bool underscan_enable;
+	struct mod_freesync_user_enable user_enable;
 };
 
 #define to_dm_connector_state(x)\
@@ -2606,55 +2607,6 @@ amdgpu_freesync_update_property_atomic(struct drm_connector *connector,
 
 }
 
-static int
-amdgpu_freesync_set_property_atomic(struct drm_connector *connector,
-				    struct drm_connector_state *connector_state,
-				    struct drm_property *property, uint64_t val)
-{
-	struct mod_freesync_user_enable user_enable;
-	struct drm_device *dev;
-	struct amdgpu_device *adev;
-	struct amdgpu_crtc *acrtc;
-	int ret;
-	uint64_t val_capable;
-	struct dm_crtc_state *acrtc_state;
-
-	dev  = connector->dev;
-	adev = dev->dev_private;
-	ret  = -EINVAL;
-
-	if (adev->dm.freesync_module && connector_state->crtc) {
-		ret = drm_object_property_get_value(
-				&connector->base,
-				adev->mode_info.freesync_capable_property,
-				&val_capable);
-		/* if user free sync val property is enable, but the capable
-		 * prop is not, then fail the call
-		 */
-		if (ret != 0 || (val_capable == 0 && val != 0)) {
-			ret  = -EINVAL;
-			goto release;
-		}
-
-		user_enable.enable_for_gaming = val ? true : false;
-		user_enable.enable_for_static = user_enable.enable_for_gaming;
-		user_enable.enable_for_video  = user_enable.enable_for_gaming;
-		ret  = -EINVAL;
-		acrtc = to_amdgpu_crtc(connector_state->crtc);
-		acrtc_state = to_dm_crtc_state(connector_state->crtc->state);
-
-
-		if (connector_state->connector == connector && acrtc_state->stream) {
-			mod_freesync_set_user_enable(adev->dm.freesync_module,
-						     &acrtc_state->stream, 1,
-						     &user_enable);
-			ret = 0;
-		}
-	}
-release:
-	return ret;
-}
-
 int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
 					    struct drm_connector_state *connector_state,
 					    struct drm_property *property,
@@ -2703,10 +2655,10 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
 		dm_new_state->underscan_enable = val;
 		ret = 0;
 	} else if (property == adev->mode_info.freesync_property) {
-		ret = amdgpu_freesync_set_property_atomic(connector,
-							  connector_state,
-							  property, val);
-		return ret;
+		dm_new_state->user_enable.enable_for_gaming = val;
+		dm_new_state->user_enable.enable_for_static = val;
+		dm_new_state->user_enable.enable_for_video = val;
+		ret = 0;
 	} else if (property == adev->mode_info.freesync_capable_property) {
 		ret = -EINVAL;
 		return ret;
@@ -4336,6 +4288,33 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 			mod_freesync_add_stream(adev->dm.freesync_module,
 						new_stream, &aconnector->caps);
 		}
+
+		list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
+
+			struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
+			struct amdgpu_dm_connector *aconnector = NULL;
+			struct dm_connector_state *conn_state = NULL;
+			struct dm_crtc_state *acrtc_state = NULL;
+
+			acrtc_state = to_dm_crtc_state(acrtc->base.state);
+
+
+			aconnector =
+				amdgpu_dm_find_first_crtc_matching_connector(
+					state,
+					crtc,
+					false);
+			if (aconnector) {
+				conn_state = to_dm_connector_state(aconnector->base.state);
+
+				if (new_stream) {
+					mod_freesync_set_user_enable(adev->dm.freesync_module,
+								     &acrtc_state->stream,
+								     1,
+								     &conn_state->user_enable);
+				}
+			}
+		}
 	}
 
 	if (dm_state->context)
-- 
2.7.4