Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <Jayendran.Ramani@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Stylon Wang <stylon.wang@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Jayendran Ramani and committed by
Alex Deucher
5c69cc55 593397a1

+75 -6
+42
drivers/gpu/drm/amd/display/dc/core/dc.c
··· 325 325 return ret; 326 326 } 327 327 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 + 328 370 bool dc_stream_get_crtc_position(struct dc *dc, 329 371 struct dc_stream_state **streams, int num_streams, 330 372 unsigned int *v_pos, unsigned int *nom_v_pos)
+4
drivers/gpu/drm/amd/display/dc/dc_stream.h
··· 465 465 struct dc_stream_state *stream, 466 466 struct dc_crtc_timing_adjust *adjust); 467 467 468 + bool dc_stream_get_last_used_drr_vtotal(struct dc *dc, 469 + struct dc_stream_state *stream, 470 + uint32_t *refresh_rate); 471 + 468 472 bool dc_stream_get_crtc_position(struct dc *dc, 469 473 struct dc_stream_state **stream, 470 474 int num_streams,
+1
drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c
··· 2231 2231 dce110_timing_generator_enable_advanced_request, 2232 2232 .set_drr = 2233 2233 dce110_timing_generator_set_drr, 2234 + .get_last_used_drr_vtotal = NULL, 2234 2235 .set_static_screen_control = 2235 2236 dce110_timing_generator_set_static_screen_control, 2236 2237 .set_test_pattern = dce110_timing_generator_set_test_pattern,
+1
drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c
··· 1190 1190 .tear_down_global_swap_lock = dce120_timing_generator_tear_down_global_swap_lock, 1191 1191 .enable_advanced_request = dce120_timing_generator_enable_advanced_request, 1192 1192 .set_drr = dce120_timing_generator_set_drr, 1193 + .get_last_used_drr_vtotal = NULL, 1193 1194 .set_static_screen_control = dce120_timing_generator_set_static_screen_control, 1194 1195 .set_test_pattern = dce120_timing_generator_set_test_pattern, 1195 1196 .arm_vert_intr = dce120_arm_vert_intr,
+1
drivers/gpu/drm/amd/display/dc/dce80/dce80_timing_generator.c
··· 209 209 .tear_down_global_swap_lock = 210 210 dce110_timing_generator_tear_down_global_swap_lock, 211 211 .set_drr = dce110_timing_generator_set_drr, 212 + .get_last_used_drr_vtotal = NULL, 212 213 .set_static_screen_control = 213 214 dce110_timing_generator_set_static_screen_control, 214 215 .set_test_pattern = dce110_timing_generator_set_test_pattern,
+1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
··· 1554 1554 .unlock = optc1_unlock, 1555 1555 .enable_optc_clock = optc1_enable_optc_clock, 1556 1556 .set_drr = optc1_set_drr, 1557 + .get_last_used_drr_vtotal = NULL, 1557 1558 .set_static_screen_control = optc1_set_static_screen_control, 1558 1559 .set_test_pattern = optc1_set_test_pattern, 1559 1560 .program_stereo = optc1_program_stereo,
+3 -1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h
··· 171 171 uint32_t OPTC_DATA_FORMAT_CONTROL; 172 172 uint32_t OPTC_BYTES_PER_PIXEL; 173 173 uint32_t OPTC_WIDTH_CONTROL; 174 + uint32_t OTG_DRR_CONTROL; 174 175 uint32_t OTG_BLANK_DATA_COLOR; 175 176 uint32_t OTG_BLANK_DATA_COLOR_EXT; 176 177 uint32_t OTG_DRR_TRIGGER_WINDOW; ··· 518 517 type OTG_CRC_DSC_MODE;\ 519 518 type OTG_CRC_DATA_STREAM_COMBINE_MODE;\ 520 519 type OTG_CRC_DATA_STREAM_SPLIT_MODE;\ 521 - type OTG_CRC_DATA_FORMAT; 520 + type OTG_CRC_DATA_FORMAT;\ 521 + type OTG_V_TOTAL_LAST_USED_BY_DRR; 522 522 523 523 524 524 struct dcn_optc_shift {
+9 -1
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c
··· 520 520 return optc1_configure_crc(optc, params); 521 521 } 522 522 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 + 523 531 static struct timing_generator_funcs dcn20_tg_funcs = { 524 532 .validate_timing = optc1_validate_timing, 525 533 .program_timing = optc1_program_timing, ··· 561 553 .lock_doublebuffer_disable = optc2_lock_doublebuffer_disable, 562 554 .enable_optc_clock = optc1_enable_optc_clock, 563 555 .set_drr = optc1_set_drr, 556 + .get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal, 564 557 .set_static_screen_control = optc1_set_static_screen_control, 565 558 .program_stereo = optc1_program_stereo, 566 559 .is_stereo_left_eye = optc1_is_stereo_left_eye, ··· 600 591 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. 601 592 optc1->min_v_sync_width = 1; 602 593 } 603 -
+7 -2
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.h
··· 42 42 SRI(OPTC_WIDTH_CONTROL, ODM, inst),\ 43 43 SRI(OPTC_MEMORY_CONFIG, ODM, inst),\ 44 44 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) 46 47 47 48 #define TG_COMMON_MASK_SH_LIST_DCN2_0(mask_sh)\ 48 49 TG_COMMON_MASK_SH_LIST_DCN(mask_sh),\ ··· 76 75 SF(ODM0_OPTC_WIDTH_CONTROL, OPTC_SEGMENT_WIDTH, mask_sh),\ 77 76 SF(DWB_SOURCE_SELECT, OPTC_DWB0_SOURCE_SELECT, mask_sh),\ 78 77 SF(DWB_SOURCE_SELECT, OPTC_DWB1_SOURCE_SELECT, mask_sh),\ 79 - SF(OTG0_OTG_MANUAL_FLOW_CONTROL, MANUAL_FLOW_CONTROL, mask_sh) 78 + SF(OTG0_OTG_MANUAL_FLOW_CONTROL, MANUAL_FLOW_CONTROL, mask_sh), \ 79 + SF(OTG0_OTG_DRR_CONTROL, OTG_V_TOTAL_LAST_USED_BY_DRR, mask_sh) 80 80 81 81 void dcn20_timing_generator_init(struct optc *optc); 82 + 83 + void optc2_get_last_used_drr_vtotal(struct timing_generator *optc, 84 + uint32_t *refresh_rate); 82 85 83 86 bool optc2_enable_crtc(struct timing_generator *optc); 84 87
+1
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c
··· 315 315 .lock_doublebuffer_disable = optc3_lock_doublebuffer_disable, 316 316 .enable_optc_clock = optc1_enable_optc_clock, 317 317 .set_drr = optc1_set_drr, 318 + .get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal, 318 319 .set_static_screen_control = optc1_set_static_screen_control, 319 320 .program_stereo = optc1_program_stereo, 320 321 .is_stereo_left_eye = optc1_is_stereo_left_eye,
+4 -2
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.h
··· 87 87 SRI(OTG_CRC0_WINDOWB_X_CONTROL, OTG, inst),\ 88 88 SRI(OTG_CRC0_WINDOWB_Y_CONTROL, OTG, inst),\ 89 89 SR(GSL_SOURCE_SELECT),\ 90 - SRI(OTG_TRIGA_MANUAL_TRIG, OTG, inst) 90 + SRI(OTG_TRIGA_MANUAL_TRIG, OTG, inst),\ 91 + SRI(OTG_DRR_CONTROL, OTG, inst) 91 92 92 93 93 94 #define OPTC_COMMON_REG_LIST_DCN3_0(inst) \ ··· 234 233 SF(GSL_SOURCE_SELECT, GSL0_READY_SOURCE_SEL, mask_sh),\ 235 234 SF(GSL_SOURCE_SELECT, GSL1_READY_SOURCE_SEL, mask_sh),\ 236 235 SF(GSL_SOURCE_SELECT, GSL2_READY_SOURCE_SEL, mask_sh),\ 237 - SF(OTG0_OTG_GLOBAL_CONTROL2, MANUAL_FLOW_CONTROL_SEL, mask_sh) 236 + SF(OTG0_OTG_GLOBAL_CONTROL2, MANUAL_FLOW_CONTROL_SEL, mask_sh),\ 237 + SF(OTG0_OTG_DRR_CONTROL, OTG_V_TOTAL_LAST_USED_BY_DRR, mask_sh) 238 238 239 239 #define OPTC_COMMON_MASK_SH_LIST_DCN3_0(mask_sh)\ 240 240 OPTC_COMMON_MASK_SH_LIST_DCN3_BASE(mask_sh),\
+1
drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h
··· 227 227 bool enable, const struct dc_crtc_timing *timing); 228 228 void (*set_drr)(struct timing_generator *tg, const struct drr_params *params); 229 229 void (*set_vtotal_min_max)(struct timing_generator *optc, int vtotal_min, int vtotal_max); 230 + void (*get_last_used_drr_vtotal)(struct timing_generator *optc, uint32_t *refresh_rate); 230 231 void (*set_static_screen_control)(struct timing_generator *tg, 231 232 uint32_t event_triggers, 232 233 uint32_t num_frames);