diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/core/dc.c | 136 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dc_stream.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/modules/freesync/freesync.c | 84 |
3 files changed, 51 insertions, 187 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 63872ce500b8..f9c5ed6310b6 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c | |||
@@ -164,7 +164,7 @@ failed_alloc: | |||
164 | return false; | 164 | return false; |
165 | } | 165 | } |
166 | 166 | ||
167 | static bool stream_adjust_vmin_vmax(struct dc *dc, | 167 | bool dc_stream_adjust_vmin_vmax(struct dc *dc, |
168 | struct dc_stream_state **streams, int num_streams, | 168 | struct dc_stream_state **streams, int num_streams, |
169 | int vmin, int vmax) | 169 | int vmin, int vmax) |
170 | { | 170 | { |
@@ -189,7 +189,7 @@ static bool stream_adjust_vmin_vmax(struct dc *dc, | |||
189 | return ret; | 189 | return ret; |
190 | } | 190 | } |
191 | 191 | ||
192 | static bool stream_get_crtc_position(struct dc *dc, | 192 | bool dc_stream_get_crtc_position(struct dc *dc, |
193 | struct dc_stream_state **streams, int num_streams, | 193 | struct dc_stream_state **streams, int num_streams, |
194 | unsigned int *v_pos, unsigned int *nom_v_pos) | 194 | unsigned int *v_pos, unsigned int *nom_v_pos) |
195 | { | 195 | { |
@@ -214,45 +214,7 @@ static bool stream_get_crtc_position(struct dc *dc, | |||
214 | return ret; | 214 | return ret; |
215 | } | 215 | } |
216 | 216 | ||
217 | static bool set_gamut_remap(struct dc *dc, const struct dc_stream_state *stream) | 217 | void dc_stream_set_static_screen_events(struct dc *dc, |
218 | { | ||
219 | int i = 0; | ||
220 | bool ret = false; | ||
221 | struct pipe_ctx *pipes; | ||
222 | |||
223 | for (i = 0; i < MAX_PIPES; i++) { | ||
224 | if (dc->current_state->res_ctx.pipe_ctx[i].stream == stream) { | ||
225 | pipes = &dc->current_state->res_ctx.pipe_ctx[i]; | ||
226 | dc->hwss.program_gamut_remap(pipes); | ||
227 | ret = true; | ||
228 | } | ||
229 | } | ||
230 | |||
231 | return ret; | ||
232 | } | ||
233 | |||
234 | static bool program_csc_matrix(struct dc *dc, struct dc_stream_state *stream) | ||
235 | { | ||
236 | int i = 0; | ||
237 | bool ret = false; | ||
238 | struct pipe_ctx *pipes; | ||
239 | |||
240 | for (i = 0; i < MAX_PIPES; i++) { | ||
241 | if (dc->current_state->res_ctx.pipe_ctx[i].stream | ||
242 | == stream) { | ||
243 | |||
244 | pipes = &dc->current_state->res_ctx.pipe_ctx[i]; | ||
245 | dc->hwss.program_csc_matrix(pipes, | ||
246 | stream->output_color_space, | ||
247 | stream->csc_color_matrix.matrix); | ||
248 | ret = true; | ||
249 | } | ||
250 | } | ||
251 | |||
252 | return ret; | ||
253 | } | ||
254 | |||
255 | static void set_static_screen_events(struct dc *dc, | ||
256 | struct dc_stream_state **streams, | 218 | struct dc_stream_state **streams, |
257 | int num_streams, | 219 | int num_streams, |
258 | const struct dc_static_screen_events *events) | 220 | const struct dc_static_screen_events *events) |
@@ -343,100 +305,8 @@ static void set_test_pattern( | |||
343 | cust_pattern_size); | 305 | cust_pattern_size); |
344 | } | 306 | } |
345 | 307 | ||
346 | static void set_dither_option(struct dc_stream_state *stream, | ||
347 | enum dc_dither_option option) | ||
348 | { | ||
349 | struct bit_depth_reduction_params params; | ||
350 | struct dc_link *link = stream->status.link; | ||
351 | struct pipe_ctx *pipes = NULL; | ||
352 | int i; | ||
353 | |||
354 | for (i = 0; i < MAX_PIPES; i++) { | ||
355 | if (link->dc->current_state->res_ctx.pipe_ctx[i].stream == | ||
356 | stream) { | ||
357 | pipes = &link->dc->current_state->res_ctx.pipe_ctx[i]; | ||
358 | break; | ||
359 | } | ||
360 | } | ||
361 | |||
362 | memset(¶ms, 0, sizeof(params)); | ||
363 | if (!pipes) | ||
364 | return; | ||
365 | if (option > DITHER_OPTION_MAX) | ||
366 | return; | ||
367 | |||
368 | stream->dither_option = option; | ||
369 | |||
370 | resource_build_bit_depth_reduction_params(stream, | ||
371 | ¶ms); | ||
372 | stream->bit_depth_params = params; | ||
373 | pipes->stream_res.opp->funcs-> | ||
374 | opp_program_bit_depth_reduction(pipes->stream_res.opp, ¶ms); | ||
375 | } | ||
376 | |||
377 | void set_dpms( | ||
378 | struct dc *dc, | ||
379 | struct dc_stream_state *stream, | ||
380 | bool dpms_off) | ||
381 | { | ||
382 | struct pipe_ctx *pipe_ctx = NULL; | ||
383 | int i; | ||
384 | |||
385 | for (i = 0; i < MAX_PIPES; i++) { | ||
386 | if (dc->current_state->res_ctx.pipe_ctx[i].stream == stream) { | ||
387 | pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; | ||
388 | break; | ||
389 | } | ||
390 | } | ||
391 | |||
392 | if (!pipe_ctx) { | ||
393 | ASSERT(0); | ||
394 | return; | ||
395 | } | ||
396 | |||
397 | if (stream->dpms_off != dpms_off) { | ||
398 | stream->dpms_off = dpms_off; | ||
399 | |||
400 | if (dpms_off) { | ||
401 | core_link_disable_stream(pipe_ctx, | ||
402 | KEEP_ACQUIRED_RESOURCE); | ||
403 | |||
404 | dc->hwss.pplib_apply_display_requirements( | ||
405 | dc, dc->current_state); | ||
406 | } else { | ||
407 | dc->hwss.pplib_apply_display_requirements( | ||
408 | dc, dc->current_state); | ||
409 | |||
410 | core_link_enable_stream(dc->current_state, pipe_ctx); | ||
411 | } | ||
412 | } | ||
413 | } | ||
414 | |||
415 | static void allocate_dc_stream_funcs(struct dc *dc) | 308 | static void allocate_dc_stream_funcs(struct dc *dc) |
416 | { | 309 | { |
417 | if (dc->hwss.set_drr != NULL) { | ||
418 | dc->stream_funcs.adjust_vmin_vmax = | ||
419 | stream_adjust_vmin_vmax; | ||
420 | } | ||
421 | |||
422 | dc->stream_funcs.set_static_screen_events = | ||
423 | set_static_screen_events; | ||
424 | |||
425 | dc->stream_funcs.get_crtc_position = | ||
426 | stream_get_crtc_position; | ||
427 | |||
428 | dc->stream_funcs.set_gamut_remap = | ||
429 | set_gamut_remap; | ||
430 | |||
431 | dc->stream_funcs.program_csc_matrix = | ||
432 | program_csc_matrix; | ||
433 | |||
434 | dc->stream_funcs.set_dither_option = | ||
435 | set_dither_option; | ||
436 | |||
437 | dc->stream_funcs.set_dpms = | ||
438 | set_dpms; | ||
439 | |||
440 | dc->link_funcs.set_drive_settings = | 310 | dc->link_funcs.set_drive_settings = |
441 | set_drive_settings; | 311 | set_drive_settings; |
442 | 312 | ||
diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h index bed2a937de71..9a64cf16c798 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_stream.h +++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h | |||
@@ -268,4 +268,22 @@ void dc_stream_set_static_screen_events(struct dc *dc, | |||
268 | int num_streams, | 268 | int num_streams, |
269 | const struct dc_static_screen_events *events); | 269 | const struct dc_static_screen_events *events); |
270 | 270 | ||
271 | |||
272 | bool dc_stream_adjust_vmin_vmax(struct dc *dc, | ||
273 | struct dc_stream_state **stream, | ||
274 | int num_streams, | ||
275 | int vmin, | ||
276 | int vmax); | ||
277 | |||
278 | bool dc_stream_get_crtc_position(struct dc *dc, | ||
279 | struct dc_stream_state **stream, | ||
280 | int num_streams, | ||
281 | unsigned int *v_pos, | ||
282 | unsigned int *nom_v_pos); | ||
283 | |||
284 | void dc_stream_set_static_screen_events(struct dc *dc, | ||
285 | struct dc_stream_state **stream, | ||
286 | int num_streams, | ||
287 | const struct dc_static_screen_events *events); | ||
288 | |||
271 | #endif /* DC_STREAM_H_ */ | 289 | #endif /* DC_STREAM_H_ */ |
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index 4d7db4aa28e0..b4723af368a5 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c | |||
@@ -132,14 +132,6 @@ struct core_freesync { | |||
132 | #define MOD_FREESYNC_TO_CORE(mod_freesync)\ | 132 | #define MOD_FREESYNC_TO_CORE(mod_freesync)\ |
133 | container_of(mod_freesync, struct core_freesync, public) | 133 | container_of(mod_freesync, struct core_freesync, public) |
134 | 134 | ||
135 | static bool check_dc_support(const struct dc *dc) | ||
136 | { | ||
137 | if (dc->stream_funcs.adjust_vmin_vmax == NULL) | ||
138 | return false; | ||
139 | |||
140 | return true; | ||
141 | } | ||
142 | |||
143 | struct mod_freesync *mod_freesync_create(struct dc *dc) | 135 | struct mod_freesync *mod_freesync_create(struct dc *dc) |
144 | { | 136 | { |
145 | struct core_freesync *core_freesync = | 137 | struct core_freesync *core_freesync = |
@@ -169,9 +161,6 @@ struct mod_freesync *mod_freesync_create(struct dc *dc) | |||
169 | 161 | ||
170 | core_freesync->dc = dc; | 162 | core_freesync->dc = dc; |
171 | 163 | ||
172 | if (!check_dc_support(dc)) | ||
173 | goto fail_construct; | ||
174 | |||
175 | /* Create initial module folder in registry for freesync enable data */ | 164 | /* Create initial module folder in registry for freesync enable data */ |
176 | flag.save_per_edid = true; | 165 | flag.save_per_edid = true; |
177 | flag.save_per_link = false; | 166 | flag.save_per_link = false; |
@@ -599,10 +588,9 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync, | |||
599 | update_stream_freesync_context(core_freesync, | 588 | update_stream_freesync_context(core_freesync, |
600 | streams[stream_idx]); | 589 | streams[stream_idx]); |
601 | 590 | ||
602 | core_freesync->dc->stream_funcs. | 591 | dc_stream_adjust_vmin_vmax(core_freesync->dc, streams, |
603 | adjust_vmin_vmax(core_freesync->dc, streams, | 592 | num_streams, v_total_min, |
604 | num_streams, v_total_min, | 593 | v_total_max); |
605 | v_total_max); | ||
606 | 594 | ||
607 | return true; | 595 | return true; |
608 | 596 | ||
@@ -625,8 +613,7 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync, | |||
625 | core_freesync, | 613 | core_freesync, |
626 | streams[stream_idx]); | 614 | streams[stream_idx]); |
627 | 615 | ||
628 | core_freesync->dc->stream_funcs. | 616 | dc_stream_adjust_vmin_vmax( |
629 | adjust_vmin_vmax( | ||
630 | core_freesync->dc, streams, | 617 | core_freesync->dc, streams, |
631 | num_streams, v_total_nominal, | 618 | num_streams, v_total_nominal, |
632 | v_total_nominal); | 619 | v_total_nominal); |
@@ -645,11 +632,9 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync, | |||
645 | core_freesync, | 632 | core_freesync, |
646 | streams[stream_idx]); | 633 | streams[stream_idx]); |
647 | 634 | ||
648 | core_freesync->dc->stream_funcs. | 635 | dc_stream_adjust_vmin_vmax(core_freesync->dc, streams, |
649 | adjust_vmin_vmax( | 636 | num_streams, v_total_nominal, |
650 | core_freesync->dc, streams, | 637 | v_total_nominal); |
651 | num_streams, v_total_nominal, | ||
652 | v_total_nominal); | ||
653 | 638 | ||
654 | /* Reset the cached variables */ | 639 | /* Reset the cached variables */ |
655 | reset_freesync_state_variables(state); | 640 | reset_freesync_state_variables(state); |
@@ -665,11 +650,9 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync, | |||
665 | * not support freesync because a former stream has | 650 | * not support freesync because a former stream has |
666 | * be programmed | 651 | * be programmed |
667 | */ | 652 | */ |
668 | core_freesync->dc->stream_funcs. | 653 | dc_stream_adjust_vmin_vmax(core_freesync->dc, streams, |
669 | adjust_vmin_vmax( | 654 | num_streams, v_total_nominal, |
670 | core_freesync->dc, streams, | 655 | v_total_nominal); |
671 | num_streams, v_total_nominal, | ||
672 | v_total_nominal); | ||
673 | /* Reset the cached variables */ | 656 | /* Reset the cached variables */ |
674 | reset_freesync_state_variables(state); | 657 | reset_freesync_state_variables(state); |
675 | } | 658 | } |
@@ -786,9 +769,8 @@ void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync, | |||
786 | vmin = inserted_frame_v_total; | 769 | vmin = inserted_frame_v_total; |
787 | 770 | ||
788 | /* Program V_TOTAL */ | 771 | /* Program V_TOTAL */ |
789 | core_freesync->dc->stream_funcs.adjust_vmin_vmax( | 772 | dc_stream_adjust_vmin_vmax(core_freesync->dc, streams, |
790 | core_freesync->dc, streams, | 773 | num_streams, vmin, vmax); |
791 | num_streams, vmin, vmax); | ||
792 | } | 774 | } |
793 | 775 | ||
794 | if (state->btr.frame_counter > 0) | 776 | if (state->btr.frame_counter > 0) |
@@ -822,17 +804,15 @@ void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync, | |||
822 | update_stream_freesync_context(core_freesync, streams[0]); | 804 | update_stream_freesync_context(core_freesync, streams[0]); |
823 | 805 | ||
824 | /* Program static screen ramp values */ | 806 | /* Program static screen ramp values */ |
825 | core_freesync->dc->stream_funcs.adjust_vmin_vmax( | 807 | dc_stream_adjust_vmin_vmax(core_freesync->dc, streams, |
826 | core_freesync->dc, streams, | 808 | num_streams, v_total, |
827 | num_streams, v_total, | 809 | v_total); |
828 | v_total); | ||
829 | 810 | ||
830 | triggers.overlay_update = true; | 811 | triggers.overlay_update = true; |
831 | triggers.surface_update = true; | 812 | triggers.surface_update = true; |
832 | 813 | ||
833 | core_freesync->dc->stream_funcs.set_static_screen_events( | 814 | dc_stream_set_static_screen_events(core_freesync->dc, streams, |
834 | core_freesync->dc, streams, num_streams, | 815 | num_streams, &triggers); |
835 | &triggers); | ||
836 | } | 816 | } |
837 | } | 817 | } |
838 | 818 | ||
@@ -916,9 +896,8 @@ void mod_freesync_update_state(struct mod_freesync *mod_freesync, | |||
916 | triggers.overlay_update = true; | 896 | triggers.overlay_update = true; |
917 | triggers.surface_update = true; | 897 | triggers.surface_update = true; |
918 | 898 | ||
919 | core_freesync->dc->stream_funcs.set_static_screen_events( | 899 | dc_stream_set_static_screen_events(core_freesync->dc, streams, |
920 | core_freesync->dc, streams, num_streams, | 900 | num_streams, &triggers); |
921 | &triggers); | ||
922 | 901 | ||
923 | if (freesync_program_required) | 902 | if (freesync_program_required) |
924 | /* Program freesync according to current state*/ | 903 | /* Program freesync according to current state*/ |
@@ -1084,10 +1063,9 @@ bool mod_freesync_override_min_max(struct mod_freesync *mod_freesync, | |||
1084 | max_refresh); | 1063 | max_refresh); |
1085 | 1064 | ||
1086 | /* Program vtotal min/max */ | 1065 | /* Program vtotal min/max */ |
1087 | core_freesync->dc->stream_funcs.adjust_vmin_vmax( | 1066 | dc_stream_adjust_vmin_vmax(core_freesync->dc, &streams, 1, |
1088 | core_freesync->dc, &streams, 1, | 1067 | state->freesync_range.vmin, |
1089 | state->freesync_range.vmin, | 1068 | state->freesync_range.vmax); |
1090 | state->freesync_range.vmax); | ||
1091 | } | 1069 | } |
1092 | 1070 | ||
1093 | if (min_refresh != 0 && | 1071 | if (min_refresh != 0 && |
@@ -1163,9 +1141,9 @@ bool mod_freesync_get_v_position(struct mod_freesync *mod_freesync, | |||
1163 | core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync); | 1141 | core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync); |
1164 | index = map_index_from_stream(core_freesync, stream); | 1142 | index = map_index_from_stream(core_freesync, stream); |
1165 | 1143 | ||
1166 | if (core_freesync->dc->stream_funcs.get_crtc_position( | 1144 | if (dc_stream_get_crtc_position(core_freesync->dc, &stream, 1, |
1167 | core_freesync->dc, &stream, 1, | 1145 | &position.vertical_count, |
1168 | &position.vertical_count, &position.nominal_vcount)) { | 1146 | &position.nominal_vcount)) { |
1169 | 1147 | ||
1170 | *nom_v_pos = position.nominal_vcount; | 1148 | *nom_v_pos = position.nominal_vcount; |
1171 | *v_pos = position.vertical_count; | 1149 | *v_pos = position.vertical_count; |
@@ -1223,9 +1201,9 @@ void mod_freesync_notify_mode_change(struct mod_freesync *mod_freesync, | |||
1223 | triggers.overlay_update = true; | 1201 | triggers.overlay_update = true; |
1224 | triggers.surface_update = true; | 1202 | triggers.surface_update = true; |
1225 | 1203 | ||
1226 | core_freesync->dc->stream_funcs.set_static_screen_events( | 1204 | dc_stream_set_static_screen_events(core_freesync->dc, |
1227 | core_freesync->dc, streams, num_streams, | 1205 | streams, num_streams, |
1228 | &triggers); | 1206 | &triggers); |
1229 | } | 1207 | } |
1230 | } | 1208 | } |
1231 | 1209 | ||
@@ -1424,10 +1402,8 @@ static void apply_fixed_refresh(struct core_freesync *core_freesync, | |||
1424 | 1402 | ||
1425 | vmax = vmin; | 1403 | vmax = vmin; |
1426 | 1404 | ||
1427 | core_freesync->dc->stream_funcs.adjust_vmin_vmax( | 1405 | dc_stream_adjust_vmin_vmax(core_freesync->dc, &stream, |
1428 | core_freesync->dc, &stream, | 1406 | 1, vmin, vmax); |
1429 | 1, vmin, | ||
1430 | vmax); | ||
1431 | } | 1407 | } |
1432 | } | 1408 | } |
1433 | 1409 | ||