diff options
author | Eric Cook <Eric.Cook@amd.com> | 2017-04-27 12:20:34 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 18:06:44 -0400 |
commit | 9e594f4c3f30c8ba43a1601268e82177fbd737c1 (patch) | |
tree | 249d9fbf487406e4ea10b1fefadda3fcb40a636c /drivers/gpu/drm/amd/display/modules/freesync/freesync.c | |
parent | 529cad0f945c9e60569e902062d2f2741e4fd71a (diff) |
drm/amd/display: Add support for FreeSync on eDP to module
Signed-off-by: Eric <eric.cook@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display/modules/freesync/freesync.c')
-rw-r--r-- | drivers/gpu/drm/amd/display/modules/freesync/freesync.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index 009cb797bcfa..82086a129a3b 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c | |||
@@ -109,11 +109,16 @@ struct freesync_entity { | |||
109 | struct mod_freesync_user_enable user_enable; | 109 | struct mod_freesync_user_enable user_enable; |
110 | }; | 110 | }; |
111 | 111 | ||
112 | struct freesync_registry_options { | ||
113 | unsigned int min_refresh_from_edid; | ||
114 | }; | ||
115 | |||
112 | struct core_freesync { | 116 | struct core_freesync { |
113 | struct mod_freesync public; | 117 | struct mod_freesync public; |
114 | struct dc *dc; | 118 | struct dc *dc; |
115 | struct freesync_entity *map; | 119 | struct freesync_entity *map; |
116 | int num_entities; | 120 | int num_entities; |
121 | struct freesync_registry_options opts; | ||
117 | }; | 122 | }; |
118 | 123 | ||
119 | #define MOD_FREESYNC_TO_CORE(mod_freesync)\ | 124 | #define MOD_FREESYNC_TO_CORE(mod_freesync)\ |
@@ -136,7 +141,7 @@ struct mod_freesync *mod_freesync_create(struct dc *dc) | |||
136 | 141 | ||
137 | struct persistent_data_flag flag; | 142 | struct persistent_data_flag flag; |
138 | 143 | ||
139 | int i = 0; | 144 | int i, data = 0; |
140 | 145 | ||
141 | if (core_freesync == NULL) | 146 | if (core_freesync == NULL) |
142 | goto fail_alloc_context; | 147 | goto fail_alloc_context; |
@@ -165,6 +170,12 @@ struct mod_freesync *mod_freesync_create(struct dc *dc) | |||
165 | flag.save_per_link = false; | 170 | flag.save_per_link = false; |
166 | dm_write_persistent_data(core_dc->ctx, NULL, FREESYNC_REGISTRY_NAME, NULL, NULL, | 171 | dm_write_persistent_data(core_dc->ctx, NULL, FREESYNC_REGISTRY_NAME, NULL, NULL, |
167 | 0, &flag); | 172 | 0, &flag); |
173 | flag.save_per_edid = false; | ||
174 | flag.save_per_link = false; | ||
175 | if (dm_read_persistent_data(core_dc->ctx, NULL, NULL, | ||
176 | "DalDrrSupport", &data, sizeof(data), &flag)) { | ||
177 | core_freesync->opts.min_refresh_from_edid = data; | ||
178 | } | ||
168 | 179 | ||
169 | return &core_freesync->public; | 180 | return &core_freesync->public; |
170 | 181 | ||
@@ -219,7 +230,7 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, | |||
219 | struct core_stream *core_stream = NULL; | 230 | struct core_stream *core_stream = NULL; |
220 | struct core_dc *core_dc = NULL; | 231 | struct core_dc *core_dc = NULL; |
221 | struct core_freesync *core_freesync = NULL; | 232 | struct core_freesync *core_freesync = NULL; |
222 | int persistent_freesync_enable = 0; | 233 | int persistent_freesync_enable, stream_index = 0; |
223 | struct persistent_data_flag flag; | 234 | struct persistent_data_flag flag; |
224 | unsigned int nom_refresh_rate_micro_hz; | 235 | unsigned int nom_refresh_rate_micro_hz; |
225 | unsigned long long temp; | 236 | unsigned long long temp; |
@@ -238,6 +249,26 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, | |||
238 | 249 | ||
239 | dc_stream_retain(stream); | 250 | dc_stream_retain(stream); |
240 | 251 | ||
252 | stream_index = map_index_from_stream(core_freesync, stream); | ||
253 | |||
254 | temp = stream->timing.pix_clk_khz; | ||
255 | temp *= 1000ULL * 1000ULL * 1000ULL; | ||
256 | temp = div_u64(temp, stream->timing.h_total); | ||
257 | temp = div_u64(temp, stream->timing.v_total); | ||
258 | |||
259 | nom_refresh_rate_micro_hz = (unsigned int) temp; | ||
260 | |||
261 | if (core_freesync->opts.min_refresh_from_edid != 0 && | ||
262 | dc_is_embedded_signal( | ||
263 | stream[stream_index].sink->sink_signal)) { | ||
264 | caps->supported = true; | ||
265 | caps->min_refresh_in_micro_hz = | ||
266 | core_freesync->opts.min_refresh_from_edid * | ||
267 | 1000000; | ||
268 | caps->max_refresh_in_micro_hz = | ||
269 | nom_refresh_rate_micro_hz; | ||
270 | } | ||
271 | |||
241 | core_freesync->map[core_freesync->num_entities].stream = stream; | 272 | core_freesync->map[core_freesync->num_entities].stream = stream; |
242 | core_freesync->map[core_freesync->num_entities].caps = caps; | 273 | core_freesync->map[core_freesync->num_entities].caps = caps; |
243 | 274 | ||
@@ -275,13 +306,6 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync, | |||
275 | enable_for_video = false; | 306 | enable_for_video = false; |
276 | } | 307 | } |
277 | 308 | ||
278 | temp = stream->timing.pix_clk_khz; | ||
279 | temp *= 1000ULL * 1000ULL * 1000ULL; | ||
280 | temp = div_u64(temp, stream->timing.h_total); | ||
281 | temp = div_u64(temp, stream->timing.v_total); | ||
282 | |||
283 | nom_refresh_rate_micro_hz = (unsigned int) temp; | ||
284 | |||
285 | if (caps->supported && | 309 | if (caps->supported && |
286 | nom_refresh_rate_micro_hz >= caps->min_refresh_in_micro_hz && | 310 | nom_refresh_rate_micro_hz >= caps->min_refresh_in_micro_hz && |
287 | nom_refresh_rate_micro_hz <= caps->max_refresh_in_micro_hz) | 311 | nom_refresh_rate_micro_hz <= caps->max_refresh_in_micro_hz) |