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

drm/amd/display: correct static_screen_event_mask

[why]
HW register bit define changed.

Reviewed-by: Zhan Liu <Zhan.Liu@amd.com>
Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: Stylon Wang <stylon.wang@amd.com>
Signed-off-by: Charlene Liu <Charlene.Liu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Charlene Liu and committed by
Alex Deucher
c800d9ff a2741665

+81 -7
+40
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
··· 623 623 if (hws->ctx->dc->debug.hpo_optimization) 624 624 REG_UPDATE(HPO_TOP_HW_CONTROL, HPO_IO_EN, !!enable); 625 625 } 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 + }
+4
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.h
··· 56 56 void dcn31_init_pipes(struct dc *dc, struct dc_state *context); 57 57 void dcn31_setup_hpo_hw_control(const struct dce_hwseq *hws, bool enable); 58 58 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); 59 63 #endif /* __DC_HWSS_DCN31_H__ */
+2 -2
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c
··· 64 64 .prepare_bandwidth = dcn20_prepare_bandwidth, 65 65 .optimize_bandwidth = dcn20_optimize_bandwidth, 66 66 .update_bandwidth = dcn20_update_bandwidth, 67 - .set_drr = dcn10_set_drr, 67 + .set_drr = dcn31_set_drr, 68 68 .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, 70 70 .setup_stereo = dcn10_setup_stereo, 71 71 .set_avmute = dcn30_set_avmute, 72 72 .log_hw_state = dcn10_log_hw_state,
+28 -1
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_optc.c
··· 40 40 #define FN(reg_name, field_name) \ 41 41 optc1->tg_shift->field_name, optc1->tg_mask->field_name 42 42 43 + #define STATIC_SCREEN_EVENT_MASK_DRR_DOUBLE_BUFFER_UPDATE_EN 0x2000 /*bit 13*/ 43 44 static void optc31_set_odm_combine(struct timing_generator *optc, int *opp_id, int opp_cnt, 44 45 struct dc_crtc_timing *timing) 45 46 { ··· 232 231 OPTC_MEM_SEL, 0); 233 232 optc1->opp_count = 1; 234 233 } 234 + void optc31_set_static_screen_control( 235 + struct timing_generator *optc, 236 + uint32_t event_triggers, 237 + uint32_t num_frames) 238 + { 239 + struct optc *optc1 = DCN10TG_FROM_TG(optc); 240 + uint32_t framecount; 241 + uint32_t events; 242 + 243 + if (num_frames > 0xFF) 244 + num_frames = 0xFF; 245 + REG_GET_2(OTG_STATIC_SCREEN_CONTROL, 246 + OTG_STATIC_SCREEN_EVENT_MASK, &events, 247 + OTG_STATIC_SCREEN_FRAME_COUNT, &framecount); 248 + 249 + if (events == event_triggers && num_frames == framecount) 250 + return; 251 + if ((event_triggers & STATIC_SCREEN_EVENT_MASK_DRR_DOUBLE_BUFFER_UPDATE_EN) 252 + != 0) 253 + event_triggers = event_triggers & 254 + ~STATIC_SCREEN_EVENT_MASK_DRR_DOUBLE_BUFFER_UPDATE_EN; 255 + 256 + REG_UPDATE_2(OTG_STATIC_SCREEN_CONTROL, 257 + OTG_STATIC_SCREEN_EVENT_MASK, event_triggers, 258 + OTG_STATIC_SCREEN_FRAME_COUNT, num_frames); 259 + } 235 260 236 261 static struct timing_generator_funcs dcn31_tg_funcs = { 237 262 .validate_timing = optc1_validate_timing, ··· 293 266 .set_drr = optc31_set_drr, 294 267 .get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal, 295 268 .set_vtotal_min_max = optc1_set_vtotal_min_max, 296 - .set_static_screen_control = optc1_set_static_screen_control, 269 + .set_static_screen_control = optc31_set_static_screen_control, 297 270 .program_stereo = optc1_program_stereo, 298 271 .is_stereo_left_eye = optc1_is_stereo_left_eye, 299 272 .tg_init = optc3_tg_init,
+4 -1
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_optc.h
··· 263 263 void optc31_set_drr(struct timing_generator *optc, const struct drr_params *params); 264 264 265 265 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); 267 270 #endif /* __DC_OPTC_DCN31_H__ */
+2 -2
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
··· 66 66 .prepare_bandwidth = dcn20_prepare_bandwidth, 67 67 .optimize_bandwidth = dcn20_optimize_bandwidth, 68 68 .update_bandwidth = dcn20_update_bandwidth, 69 - .set_drr = dcn10_set_drr, 69 + .set_drr = dcn31_set_drr, 70 70 .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, 72 72 .setup_stereo = dcn10_setup_stereo, 73 73 .set_avmute = dcn30_set_avmute, 74 74 .log_hw_state = dcn10_log_hw_state,
+1 -1
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_optc.c
··· 228 228 .set_drr = optc31_set_drr, 229 229 .get_last_used_drr_vtotal = optc2_get_last_used_drr_vtotal, 230 230 .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, 232 232 .program_stereo = optc1_program_stereo, 233 233 .is_stereo_left_eye = optc1_is_stereo_left_eye, 234 234 .tg_init = optc3_tg_init,