aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc.c136
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_stream.h18
-rw-r--r--drivers/gpu/drm/amd/display/modules/freesync/freesync.c84
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
167static bool stream_adjust_vmin_vmax(struct dc *dc, 167bool 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
192static bool stream_get_crtc_position(struct dc *dc, 192bool 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
217static bool set_gamut_remap(struct dc *dc, const struct dc_stream_state *stream) 217void 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
234static 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
255static 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
346static 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(&params, 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 &params);
372 stream->bit_depth_params = params;
373 pipes->stream_res.opp->funcs->
374 opp_program_bit_depth_reduction(pipes->stream_res.opp, &params);
375}
376
377void 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
415static void allocate_dc_stream_funcs(struct dc *dc) 308static 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
272bool 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
278bool 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
284void 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
135static 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
143struct mod_freesync *mod_freesync_create(struct dc *dc) 135struct 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