diff options
author | Anthony Koo <Anthony.Koo@amd.com> | 2017-07-18 10:21:43 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 18:15:16 -0400 |
commit | 2233ec72b350fb8480f67b83f6a71ea422af60a3 (patch) | |
tree | 8c73da632fc96376a9282fa66df50bc8884c9e69 /drivers/gpu/drm/amd/display/modules/freesync/freesync.c | |
parent | d65359d571aa33dee9ddae659e92d1cb09ffbb2a (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.c | 74 |
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 | |||
46 | struct gradual_static_ramp { | 50 | struct 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 | ||
116 | struct freesync_registry_options { | 120 | struct freesync_registry_options { |
117 | unsigned int min_refresh_from_edid; | 121 | bool drr_external_supported; |
122 | bool drr_internal_supported; | ||
118 | }; | 123 | }; |
119 | 124 | ||
120 | struct core_freesync { | 125 | struct 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: |