Skip to content

Commit 8f43965

Browse files
Nicholas Kazlauskasalexdeucher
authored andcommitted
drm/amd/display: Use double buffered DRR timing update by default
[Why] For some monitors extreme flickering can occur while using LFC for if we're not doing the DRR timing update for V_TOTAL_MIN / V_TOTAL_MAX at the DP start of frame. Hardware can default to any time in the frame which isn't the behavior we want. [How] Add a new function for setting the double buffering mode for DRR timing. Default to DP start of frame double buffering on timing generator init. Signed-off-by: Nicholas Kazlauskas <[email protected]> Reviewed-by: Aric Cyr <[email protected]> Acked-by: Rodrigo Siqueira <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent cbec647 commit 8f43965

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,23 @@ void optc1_set_blank_data_double_buffer(struct timing_generator *optc, bool enab
342342
OTG_BLANK_DATA_DOUBLE_BUFFER_EN, blank_data_double_buffer_enable);
343343
}
344344

345+
/**
346+
* optc1_set_timing_double_buffer() - DRR double buffering control
347+
*
348+
* Sets double buffer point for V_TOTAL, H_TOTAL, VTOTAL_MIN,
349+
* VTOTAL_MAX, VTOTAL_MIN_SEL and VTOTAL_MAX_SEL registers.
350+
*
351+
* Options: any time, start of frame, dp start of frame (range timing)
352+
*/
353+
void optc1_set_timing_double_buffer(struct timing_generator *optc, bool enable)
354+
{
355+
struct optc *optc1 = DCN10TG_FROM_TG(optc);
356+
uint32_t mode = enable ? 2 : 0;
357+
358+
REG_UPDATE(OTG_DOUBLE_BUFFER_CONTROL,
359+
OTG_RANGE_TIMING_DBUF_UPDATE_MODE, mode);
360+
}
361+
345362
/**
346363
* unblank_crtc
347364
* Call ASIC Control Object to UnBlank CRTC.
@@ -1353,6 +1370,7 @@ void optc1_clear_optc_underflow(struct timing_generator *optc)
13531370
void optc1_tg_init(struct timing_generator *optc)
13541371
{
13551372
optc1_set_blank_data_double_buffer(optc, true);
1373+
optc1_set_timing_double_buffer(optc, true);
13561374
optc1_clear_optc_underflow(optc);
13571375
}
13581376

drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ struct dcn_optc_registers {
185185
SF(OTG0_OTG_GLOBAL_CONTROL0, OTG_MASTER_UPDATE_LOCK_SEL, mask_sh),\
186186
SF(OTG0_OTG_DOUBLE_BUFFER_CONTROL, OTG_UPDATE_PENDING, mask_sh),\
187187
SF(OTG0_OTG_DOUBLE_BUFFER_CONTROL, OTG_BLANK_DATA_DOUBLE_BUFFER_EN, mask_sh),\
188+
SF(OTG0_OTG_DOUBLE_BUFFER_CONTROL, OTG_RANGE_TIMING_DBUF_UPDATE_MODE, mask_sh),\
188189
SF(OTG0_OTG_H_TOTAL, OTG_H_TOTAL, mask_sh),\
189190
SF(OTG0_OTG_H_BLANK_START_END, OTG_H_BLANK_START, mask_sh),\
190191
SF(OTG0_OTG_H_BLANK_START_END, OTG_H_BLANK_END, mask_sh),\
@@ -643,6 +644,8 @@ bool optc1_is_optc_underflow_occurred(struct timing_generator *optc);
643644

644645
void optc1_set_blank_data_double_buffer(struct timing_generator *optc, bool enable);
645646

647+
void optc1_set_timing_double_buffer(struct timing_generator *optc, bool enable);
648+
646649
bool optc1_get_otg_active_size(struct timing_generator *optc,
647650
uint32_t *otg_active_width,
648651
uint32_t *otg_active_height);

0 commit comments

Comments
 (0)