aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
diff options
context:
space:
mode:
authorAnthony Koo <Anthony.Koo@amd.com>2017-07-18 10:21:43 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 18:15:16 -0400
commit2233ec72b350fb8480f67b83f6a71ea422af60a3 (patch)
tree8c73da632fc96376a9282fa66df50bc8884c9e69 /drivers/gpu/drm/amd/display/modules/freesync/freesync.c
parentd65359d571aa33dee9ddae659e92d1cb09ffbb2a (diff)
drm/amd/display: Add regkey for DRR control for internal panel
Also need to change default to off Signed-off-by: Anthony Koo <anthony.koo@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Acked-by: Harry Wentland <Harry.Wentland@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.c74
1 files changed, 40 insertions, 34 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index 4df79f7147f8..a989d5de9f3c 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -43,6 +43,10 @@
43 43
44#define FREESYNC_REGISTRY_NAME "freesync_v1" 44#define FREESYNC_REGISTRY_NAME "freesync_v1"
45 45
46#define FREESYNC_NO_STATIC_FOR_EXTERNAL_DP_REGKEY "DalFreeSyncNoStaticForExternalDp"
47
48#define FREESYNC_NO_STATIC_FOR_INTERNAL_REGKEY "DalFreeSyncNoStaticForInternal"
49
46struct gradual_static_ramp { 50struct gradual_static_ramp {
47 bool ramp_is_active; 51 bool ramp_is_active;
48 bool ramp_direction_is_up; 52 bool ramp_direction_is_up;
@@ -114,7 +118,8 @@ struct freesync_entity {
114}; 118};
115 119
116struct freesync_registry_options { 120struct freesync_registry_options {
117 unsigned int min_refresh_from_edid; 121 bool drr_external_supported;
122 bool drr_internal_supported;
118}; 123};
119 124
120struct core_freesync { 125struct core_freesync {
@@ -176,9 +181,19 @@ struct mod_freesync *mod_freesync_create(struct dc *dc)
176 NULL, NULL, 0, &flag); 181 NULL, NULL, 0, &flag);
177 flag.save_per_edid = false; 182 flag.save_per_edid = false;
178 flag.save_per_link = false; 183 flag.save_per_link = false;
184
179 if (dm_read_persistent_data(core_dc->ctx, NULL, NULL, 185 if (dm_read_persistent_data(core_dc->ctx, NULL, NULL,
180 "DalDrrSupport", &data, sizeof(data), &flag)) { 186 FREESYNC_NO_STATIC_FOR_INTERNAL_REGKEY,
181 core_freesync->opts.min_refresh_from_edid = data; 187 &data, sizeof(data), &flag)) {
188 core_freesync->opts.drr_internal_supported =
189 (data & 1) ? false : true;
190 }
191
192 if (dm_read_persistent_data(core_dc->ctx, NULL, NULL,
193 FREESYNC_NO_STATIC_FOR_EXTERNAL_DP_REGKEY,
194 &data, sizeof(data), &flag)) {
195 core_freesync->opts.drr_external_supported =
196 (data & 1) ? false : true;
182 } 197 }
183 198
184 return &core_freesync->public; 199 return &core_freesync->public;
@@ -236,7 +251,7 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync,
236 struct core_freesync *core_freesync = NULL; 251 struct core_freesync *core_freesync = NULL;
237 int persistent_freesync_enable = 0; 252 int persistent_freesync_enable = 0;
238 struct persistent_data_flag flag; 253 struct persistent_data_flag flag;
239 unsigned int nom_refresh_rate_micro_hz; 254 unsigned int nom_refresh_rate_uhz;
240 unsigned long long temp; 255 unsigned long long temp;
241 256
242 if (mod_freesync == NULL) 257 if (mod_freesync == NULL)
@@ -258,20 +273,7 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync,
258 temp = div_u64(temp, stream->timing.h_total); 273 temp = div_u64(temp, stream->timing.h_total);
259 temp = div_u64(temp, stream->timing.v_total); 274 temp = div_u64(temp, stream->timing.v_total);
260 275
261 nom_refresh_rate_micro_hz = (unsigned int) temp; 276 nom_refresh_rate_uhz = (unsigned int) temp;
262
263 if (core_freesync->opts.min_refresh_from_edid != 0 &&
264 dc_is_embedded_signal(stream->sink->sink_signal)
265 && (nom_refresh_rate_micro_hz -
266 core_freesync->opts.min_refresh_from_edid *
267 1000000) >= 10000000) {
268 caps->supported = true;
269 caps->min_refresh_in_micro_hz =
270 core_freesync->opts.min_refresh_from_edid *
271 1000000;
272 caps->max_refresh_in_micro_hz =
273 nom_refresh_rate_micro_hz;
274 }
275 277
276 core_freesync->map[core_freesync->num_entities].stream = stream; 278 core_freesync->map[core_freesync->num_entities].stream = stream;
277 core_freesync->map[core_freesync->num_entities].caps = caps; 279 core_freesync->map[core_freesync->num_entities].caps = caps;
@@ -311,8 +313,8 @@ bool mod_freesync_add_stream(struct mod_freesync *mod_freesync,
311 } 313 }
312 314
313 if (caps->supported && 315 if (caps->supported &&
314 nom_refresh_rate_micro_hz >= caps->min_refresh_in_micro_hz && 316 nom_refresh_rate_uhz >= caps->min_refresh_in_micro_hz &&
315 nom_refresh_rate_micro_hz <= caps->max_refresh_in_micro_hz) 317 nom_refresh_rate_uhz <= caps->max_refresh_in_micro_hz)
316 core_stream->public.ignore_msa_timing_param = 1; 318 core_stream->public.ignore_msa_timing_param = 1;
317 319
318 core_freesync->num_entities++; 320 core_freesync->num_entities++;
@@ -865,6 +867,11 @@ void mod_freesync_update_state(struct mod_freesync *mod_freesync,
865 unsigned int map_index = map_index_from_stream(core_freesync, 867 unsigned int map_index = map_index_from_stream(core_freesync,
866 streams[stream_index]); 868 streams[stream_index]);
867 869
870 bool is_embedded = dc_is_embedded_signal(
871 streams[stream_index]->sink->sink_signal);
872
873 struct freesync_registry_options *opts = &core_freesync->opts;
874
868 state = &core_freesync->map[map_index].state; 875 state = &core_freesync->map[map_index].state;
869 876
870 switch (freesync_params->state){ 877 switch (freesync_params->state){
@@ -875,25 +882,24 @@ void mod_freesync_update_state(struct mod_freesync *mod_freesync,
875 freesync_params->windowed_fullscreen; 882 freesync_params->windowed_fullscreen;
876 break; 883 break;
877 case FREESYNC_STATE_STATIC_SCREEN: 884 case FREESYNC_STATE_STATIC_SCREEN:
878 /* Static screen ramp is only enabled for embedded 885 /* Static screen ramp is disabled by default, but can
879 * panels. Also change core variables only if there 886 * be enabled through regkey.
880 * is a change.
881 */ 887 */
882 if ((dc_is_embedded_signal( 888 if ((is_embedded && opts->drr_internal_supported) ||
883 streams[stream_index]->sink->sink_signal) || 889 (!is_embedded && opts->drr_external_supported))
884 core_freesync->map[map_index].caps->
885 no_static_for_external_dp == false) &&
886 state->static_screen !=
887 freesync_params->enable) {
888 890
889 /* Change the state flag */ 891 if (state->static_screen !=
890 state->static_screen = freesync_params->enable; 892 freesync_params->enable) {
891 893
892 /* Change static screen ramp variables */ 894 /* Change the state flag */
893 set_static_ramp_variables(core_freesync, 895 state->static_screen =
896 freesync_params->enable;
897
898 /* Update static screen ramp */
899 set_static_ramp_variables(core_freesync,
894 map_index, 900 map_index,
895 freesync_params->enable); 901 freesync_params->enable);
896 } 902 }
897 /* We program the ramp starting next VUpdate */ 903 /* We program the ramp starting next VUpdate */
898 break; 904 break;
899 case FREESYNC_STATE_VIDEO: 905 case FREESYNC_STATE_VIDEO: