Skip to content

Commit c800d9f

Browse files
charliu-AMDENGalexdeucher
authored andcommitted
drm/amd/display: correct static_screen_event_mask
[why] HW register bit define changed. Reviewed-by: Zhan Liu <[email protected]> Reviewed-by: Dmytro Laktyushkin <[email protected]> Acked-by: Stylon Wang <[email protected]> Signed-off-by: Charlene Liu <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent a274166 commit c800d9f

File tree

7 files changed

+81
-7
lines changed

7 files changed

+81
-7
lines changed

drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,3 +623,43 @@ void dcn31_setup_hpo_hw_control(const struct dce_hwseq *hws, bool enable)
623623
if (hws->ctx->dc->debug.hpo_optimization)
624624
REG_UPDATE(HPO_TOP_HW_CONTROL, HPO_IO_EN, !!enable);
625625
}
626+
void dcn31_set_drr(struct pipe_ctx **pipe_ctx,
627+
int num_pipes, struct dc_crtc_timing_adjust adjust)
628+
{
629+
int i = 0;
630+
struct drr_params params = {0};
631+
unsigned int event_triggers = 0x2;/*Bit[1]: OTG_TRIG_A*/
632+
unsigned int num_frames = 2;
633+
params.vertical_total_max = adjust.v_total_max;
634+
params.vertical_total_min = adjust.v_total_min;
635+
params.vertical_total_mid = adjust.v_total_mid;
636+
params.vertical_total_mid_frame_num = adjust.v_total_mid_frame_num;
637+
for (i = 0; i < num_pipes; i++) {
638+
if ((pipe_ctx[i]->stream_res.tg != NULL) && pipe_ctx[i]->stream_res.tg->funcs) {
639+
if (pipe_ctx[i]->stream_res.tg->funcs->set_drr)
640+
pipe_ctx[i]->stream_res.tg->funcs->set_drr(
641+
pipe_ctx[i]->stream_res.tg, &params);
642+
if (adjust.v_total_max != 0 && adjust.v_total_min != 0)
643+
if (pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control)
644+
pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control(
645+
pipe_ctx[i]->stream_res.tg,
646+
event_triggers, num_frames);
647+
}
648+
}
649+
}
650+
void dcn31_set_static_screen_control(struct pipe_ctx **pipe_ctx,
651+
int num_pipes, const struct dc_static_screen_params *params)
652+
{
653+
unsigned int i;
654+
unsigned int triggers = 0;
655+
if (params->triggers.surface_update)
656+
triggers |= 0x600;/*bit 9 and bit10 : 110 0000 0000*/
657+
if (params->triggers.cursor_update)
658+
triggers |= 0x10;/*bit4*/
659+
if (params->triggers.force_trigger)
660+
triggers |= 0x1;
661+
for (i = 0; i < num_pipes; i++)
662+
pipe_ctx[i]->stream_res.tg->funcs->
663+
set_static_screen_control(pipe_ctx[i]->stream_res.tg,
664+
triggers, params->num_frames);
665+
}

drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,8 @@ bool dcn31_is_abm_supported(struct dc *dc,
5656
void dcn31_init_pipes(struct dc *dc, struct dc_state *context);
5757
void dcn31_setup_hpo_hw_control(const struct dce_hwseq *hws, bool enable);
5858

59+
void dcn31_set_static_screen_control(struct pipe_ctx **pipe_ctx,
60+
int num_pipes, const struct dc_static_screen_params *params);
61+
void dcn31_set_drr(struct pipe_ctx **pipe_ctx,
62+
int num_pipes, struct dc_crtc_timing_adjust adjust);
5963
#endif /* __DC_HWSS_DCN31_H__ */

drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ static const struct hw_sequencer_funcs dcn31_funcs = {
6464
.prepare_bandwidth = dcn20_prepare_bandwidth,
6565
.optimize_bandwidth = dcn20_optimize_bandwidth,
6666
.update_bandwidth = dcn20_update_bandwidth,
67-
.set_drr = dcn10_set_drr,
67+
.set_drr = dcn31_set_drr,
6868
.get_position = dcn10_get_position,
69-
.set_static_screen_control = dcn10_set_static_screen_control,
69+
.set_static_screen_control = dcn31_set_static_screen_control,
7070
.setup_stereo = dcn10_setup_stereo,
7171
.set_avmute = dcn30_set_avmute,
7272
.log_hw_state = dcn10_log_hw_state,

drivers/gpu/drm/amd/display/dc/dcn31/dcn31_optc.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#define FN(reg_name, field_name) \
4141
optc1->tg_shift->field_name, optc1->tg_mask->field_name
4242

43+
#define STATIC_SCREEN_EVENT_MASK_DRR_DOUBLE_BUFFER_UPDATE_EN 0x2000 /*bit 13*/
4344
static void optc31_set_odm_combine(struct timing_generator *optc, int *opp_id, int opp_cnt,
4445
struct dc_crtc_timing *timing)
4546
{
@@ -231,6 +232,32 @@ void optc3_init_odm(struct timing_generator *optc)
231232
OPTC_MEM_SEL, 0);
232233
optc1->opp_count = 1;
233234
}
235+
void optc31_set_static_screen_control(
236+
struct timing_generator *optc,
237+
uint32_t event_triggers,
238+
uint32_t num_frames)
239+
{
240+
struct optc *optc1 = DCN10TG_FROM_TG(optc);
241+
uint32_t framecount;
242+
uint32_t events;
243+
244+
if (num_frames > 0xFF)
245+
num_frames = 0xFF;
246+
REG_GET_2(OTG_STATIC_SCREEN_CONTROL,
247+
OTG_STATIC_SCREEN_EVENT_MASK, &events,
248+
OTG_STATIC_SCREEN_FRAME_COUNT, &framecount);
249+
250+
if (events == event_triggers && num_frames == framecount)
251+
return;
252+
if ((event_triggers & STATIC_SCREEN_EVENT_MASK_DRR_DOUBLE_BUFFER_UPDATE_EN)
253+
!= 0)
254+
event_triggers = event_triggers &
255+
~STATIC_SCREEN_EVENT_MASK_DRR_DOUBLE_BUFFER_UPDATE_EN;
256+
257+
REG_UPDATE_2(OTG_STATIC_SCREEN_CONTROL,
258+
OTG_STATIC_SCREEN_EVENT_MASK, event_triggers,
259+
OTG_STATIC_SCREEN_FRAME_COUNT, num_frames);
260+
}
234261

235262
static struct timing_generator_funcs dcn31_tg_funcs = {
236263
.validate_timing = optc1_validate_timing,
@@ -266,7 +293,7 @@ static struct timing_generator_funcs dcn31_tg_funcs = {
266293
.set_drr = optc31_set_drr,
267294
.get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal,
268295
.set_vtotal_min_max = optc1_set_vtotal_min_max,
269-
.set_static_screen_control = optc1_set_static_screen_control,
296+
.set_static_screen_control = optc31_set_static_screen_control,
270297
.program_stereo = optc1_program_stereo,
271298
.is_stereo_left_eye = optc1_is_stereo_left_eye,
272299
.tg_init = optc3_tg_init,

drivers/gpu/drm/amd/display/dc/dcn31/dcn31_optc.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,5 +263,8 @@ bool optc31_immediate_disable_crtc(struct timing_generator *optc);
263263
void optc31_set_drr(struct timing_generator *optc, const struct drr_params *params);
264264

265265
void optc3_init_odm(struct timing_generator *optc);
266-
266+
void optc31_set_static_screen_control(
267+
struct timing_generator *optc,
268+
uint32_t event_triggers,
269+
uint32_t num_frames);
267270
#endif /* __DC_OPTC_DCN31_H__ */

drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ static const struct hw_sequencer_funcs dcn314_funcs = {
6666
.prepare_bandwidth = dcn20_prepare_bandwidth,
6767
.optimize_bandwidth = dcn20_optimize_bandwidth,
6868
.update_bandwidth = dcn20_update_bandwidth,
69-
.set_drr = dcn10_set_drr,
69+
.set_drr = dcn31_set_drr,
7070
.get_position = dcn10_get_position,
71-
.set_static_screen_control = dcn10_set_static_screen_control,
71+
.set_static_screen_control = dcn31_set_static_screen_control,
7272
.setup_stereo = dcn10_setup_stereo,
7373
.set_avmute = dcn30_set_avmute,
7474
.log_hw_state = dcn10_log_hw_state,

drivers/gpu/drm/amd/display/dc/dcn314/dcn314_optc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ static struct timing_generator_funcs dcn314_tg_funcs = {
228228
.set_drr = optc31_set_drr,
229229
.get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal,
230230
.set_vtotal_min_max = optc1_set_vtotal_min_max,
231-
.set_static_screen_control = optc1_set_static_screen_control,
231+
.set_static_screen_control = optc31_set_static_screen_control,
232232
.program_stereo = optc1_program_stereo,
233233
.is_stereo_left_eye = optc1_is_stereo_left_eye,
234234
.tg_init = optc3_tg_init,

0 commit comments

Comments
 (0)