Skip to content

Commit 5c69cc5

Browse files
Jayendran Ramanialexdeucher
authored andcommitted
drm/amd/display: Return last used DRR VTOTAL from DC
[How] Add call to get the last used VTOTAL from DC Signed-off-by: Jayendran Ramani <[email protected]> Reviewed-by: Anthony Koo <[email protected]> Acked-by: Stylon Wang <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 593397a commit 5c69cc5

File tree

12 files changed

+75
-6
lines changed

12 files changed

+75
-6
lines changed

drivers/gpu/drm/amd/display/dc/core/dc.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,48 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
325325
return ret;
326326
}
327327

328+
/**
329+
*****************************************************************************
330+
* Function: dc_stream_get_last_vrr_vtotal
331+
*
332+
* @brief
333+
* Looks up the pipe context of dc_stream_state and gets the
334+
* last VTOTAL used by DRR (Dynamic Refresh Rate)
335+
*
336+
* @param [in] dc: dc reference
337+
* @param [in] stream: Initial dc stream state
338+
* @param [in] adjust: Updated parameters for vertical_total_min and
339+
* vertical_total_max
340+
*****************************************************************************
341+
*/
342+
bool dc_stream_get_last_used_drr_vtotal(struct dc *dc,
343+
struct dc_stream_state *stream,
344+
uint32_t *refresh_rate)
345+
{
346+
bool status = false;
347+
348+
int i = 0;
349+
350+
for (i = 0; i < MAX_PIPES; i++) {
351+
struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i];
352+
353+
if (pipe->stream == stream && pipe->stream_res.tg) {
354+
/* Only execute if a function pointer has been defined for
355+
* the DC version in question
356+
*/
357+
if (pipe->stream_res.tg->funcs->get_last_used_drr_vtotal) {
358+
pipe->stream_res.tg->funcs->get_last_used_drr_vtotal(pipe->stream_res.tg, refresh_rate);
359+
360+
status = true;
361+
362+
break;
363+
}
364+
}
365+
}
366+
367+
return status;
368+
}
369+
328370
bool dc_stream_get_crtc_position(struct dc *dc,
329371
struct dc_stream_state **streams, int num_streams,
330372
unsigned int *v_pos, unsigned int *nom_v_pos)

drivers/gpu/drm/amd/display/dc/dc_stream.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,10 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
465465
struct dc_stream_state *stream,
466466
struct dc_crtc_timing_adjust *adjust);
467467

468+
bool dc_stream_get_last_used_drr_vtotal(struct dc *dc,
469+
struct dc_stream_state *stream,
470+
uint32_t *refresh_rate);
471+
468472
bool dc_stream_get_crtc_position(struct dc *dc,
469473
struct dc_stream_state **stream,
470474
int num_streams,

drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2231,6 +2231,7 @@ static const struct timing_generator_funcs dce110_tg_funcs = {
22312231
dce110_timing_generator_enable_advanced_request,
22322232
.set_drr =
22332233
dce110_timing_generator_set_drr,
2234+
.get_last_used_drr_vtotal = NULL,
22342235
.set_static_screen_control =
22352236
dce110_timing_generator_set_static_screen_control,
22362237
.set_test_pattern = dce110_timing_generator_set_test_pattern,

drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,7 @@ static const struct timing_generator_funcs dce120_tg_funcs = {
11901190
.tear_down_global_swap_lock = dce120_timing_generator_tear_down_global_swap_lock,
11911191
.enable_advanced_request = dce120_timing_generator_enable_advanced_request,
11921192
.set_drr = dce120_timing_generator_set_drr,
1193+
.get_last_used_drr_vtotal = NULL,
11931194
.set_static_screen_control = dce120_timing_generator_set_static_screen_control,
11941195
.set_test_pattern = dce120_timing_generator_set_test_pattern,
11951196
.arm_vert_intr = dce120_arm_vert_intr,

drivers/gpu/drm/amd/display/dc/dce80/dce80_timing_generator.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ static const struct timing_generator_funcs dce80_tg_funcs = {
209209
.tear_down_global_swap_lock =
210210
dce110_timing_generator_tear_down_global_swap_lock,
211211
.set_drr = dce110_timing_generator_set_drr,
212+
.get_last_used_drr_vtotal = NULL,
212213
.set_static_screen_control =
213214
dce110_timing_generator_set_static_screen_control,
214215
.set_test_pattern = dce110_timing_generator_set_test_pattern,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,6 +1554,7 @@ static const struct timing_generator_funcs dcn10_tg_funcs = {
15541554
.unlock = optc1_unlock,
15551555
.enable_optc_clock = optc1_enable_optc_clock,
15561556
.set_drr = optc1_set_drr,
1557+
.get_last_used_drr_vtotal = NULL,
15571558
.set_static_screen_control = optc1_set_static_screen_control,
15581559
.set_test_pattern = optc1_set_test_pattern,
15591560
.program_stereo = optc1_program_stereo,

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ struct dcn_optc_registers {
171171
uint32_t OPTC_DATA_FORMAT_CONTROL;
172172
uint32_t OPTC_BYTES_PER_PIXEL;
173173
uint32_t OPTC_WIDTH_CONTROL;
174+
uint32_t OTG_DRR_CONTROL;
174175
uint32_t OTG_BLANK_DATA_COLOR;
175176
uint32_t OTG_BLANK_DATA_COLOR_EXT;
176177
uint32_t OTG_DRR_TRIGGER_WINDOW;
@@ -517,7 +518,8 @@ struct dcn_optc_registers {
517518
type OTG_CRC_DSC_MODE;\
518519
type OTG_CRC_DATA_STREAM_COMBINE_MODE;\
519520
type OTG_CRC_DATA_STREAM_SPLIT_MODE;\
520-
type OTG_CRC_DATA_FORMAT;
521+
type OTG_CRC_DATA_FORMAT;\
522+
type OTG_V_TOTAL_LAST_USED_BY_DRR;
521523

522524

523525
struct dcn_optc_shift {

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,14 @@ bool optc2_configure_crc(struct timing_generator *optc,
520520
return optc1_configure_crc(optc, params);
521521
}
522522

523+
524+
void optc2_get_last_used_drr_vtotal(struct timing_generator *optc, uint32_t *refresh_rate)
525+
{
526+
struct optc *optc1 = DCN10TG_FROM_TG(optc);
527+
528+
REG_GET(OTG_DRR_CONTROL, OTG_V_TOTAL_LAST_USED_BY_DRR, refresh_rate);
529+
}
530+
523531
static struct timing_generator_funcs dcn20_tg_funcs = {
524532
.validate_timing = optc1_validate_timing,
525533
.program_timing = optc1_program_timing,
@@ -553,6 +561,7 @@ static struct timing_generator_funcs dcn20_tg_funcs = {
553561
.lock_doublebuffer_disable = optc2_lock_doublebuffer_disable,
554562
.enable_optc_clock = optc1_enable_optc_clock,
555563
.set_drr = optc1_set_drr,
564+
.get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal,
556565
.set_static_screen_control = optc1_set_static_screen_control,
557566
.program_stereo = optc1_program_stereo,
558567
.is_stereo_left_eye = optc1_is_stereo_left_eye,
@@ -591,4 +600,3 @@ void dcn20_timing_generator_init(struct optc *optc1)
591600
optc1->min_h_sync_width = 4;// Minimum HSYNC = 8 pixels asked By HW in the first place for no actual reason. Oculus Rift S will not light up with 8 as it's hsyncWidth is 6. Changing it to 4 to fix that issue.
592601
optc1->min_v_sync_width = 1;
593602
}
594-

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
SRI(OPTC_WIDTH_CONTROL, ODM, inst),\
4343
SRI(OPTC_MEMORY_CONFIG, ODM, inst),\
4444
SR(DWB_SOURCE_SELECT),\
45-
SRI(OTG_MANUAL_FLOW_CONTROL, OTG, inst)
45+
SRI(OTG_MANUAL_FLOW_CONTROL, OTG, inst), \
46+
SRI(OTG_DRR_CONTROL, OTG, inst)
4647

4748
#define TG_COMMON_MASK_SH_LIST_DCN2_0(mask_sh)\
4849
TG_COMMON_MASK_SH_LIST_DCN(mask_sh),\
@@ -75,10 +76,14 @@
7576
SF(ODM0_OPTC_WIDTH_CONTROL, OPTC_SEGMENT_WIDTH, mask_sh),\
7677
SF(DWB_SOURCE_SELECT, OPTC_DWB0_SOURCE_SELECT, mask_sh),\
7778
SF(DWB_SOURCE_SELECT, OPTC_DWB1_SOURCE_SELECT, mask_sh),\
78-
SF(OTG0_OTG_MANUAL_FLOW_CONTROL, MANUAL_FLOW_CONTROL, mask_sh)
79+
SF(OTG0_OTG_MANUAL_FLOW_CONTROL, MANUAL_FLOW_CONTROL, mask_sh), \
80+
SF(OTG0_OTG_DRR_CONTROL, OTG_V_TOTAL_LAST_USED_BY_DRR, mask_sh)
7981

8082
void dcn20_timing_generator_init(struct optc *optc);
8183

84+
void optc2_get_last_used_drr_vtotal(struct timing_generator *optc,
85+
uint32_t *refresh_rate);
86+
8287
bool optc2_enable_crtc(struct timing_generator *optc);
8388

8489
void optc2_set_gsl(struct timing_generator *optc,

drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ static struct timing_generator_funcs dcn30_tg_funcs = {
315315
.lock_doublebuffer_disable = optc3_lock_doublebuffer_disable,
316316
.enable_optc_clock = optc1_enable_optc_clock,
317317
.set_drr = optc1_set_drr,
318+
.get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal,
318319
.set_static_screen_control = optc1_set_static_screen_control,
319320
.program_stereo = optc1_program_stereo,
320321
.is_stereo_left_eye = optc1_is_stereo_left_eye,

0 commit comments

Comments
 (0)