diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2489-drm-amd-display-isolate-global-double-buffer-lock-pr.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2489-drm-amd-display-isolate-global-double-buffer-lock-pr.patch | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2489-drm-amd-display-isolate-global-double-buffer-lock-pr.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2489-drm-amd-display-isolate-global-double-buffer-lock-pr.patch new file mode 100644 index 00000000..4570ba07 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2489-drm-amd-display-isolate-global-double-buffer-lock-pr.patch @@ -0,0 +1,199 @@ +From 63633b58753b5c585e7bbbaa429d1867a09f39fe Mon Sep 17 00:00:00 2001 +From: Wenjing Liu <Wenjing.Liu@amd.com> +Date: Thu, 28 Mar 2019 11:27:05 -0400 +Subject: [PATCH 2489/2940] drm/amd/display: isolate global double buffer lock + programming + +[why] +Global optic double buffer lock is currently disabled due to +incorrect programming sequence that affects non global lock. + +[how] +Isolate global lock programming sequence out of non global lock +programming sequence, so it can be enabled without affecting +non global lock. + +Signed-off-by: Wenjing Liu <Wenjing.Liu@amd.com> +Reviewed-by: Jun Lei <Jun.Lei@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../drm/amd/display/dc/dcn20/dcn20_hwseq.c | 19 +++--- + .../gpu/drm/amd/display/dc/dcn20/dcn20_optc.c | 60 ++++++------------- + .../gpu/drm/amd/display/dc/dcn20/dcn20_optc.h | 5 +- + .../amd/display/dc/inc/hw/timing_generator.h | 4 +- + 4 files changed, 35 insertions(+), 53 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +index 0cad51ece06e..542f144f807f 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +@@ -727,10 +727,6 @@ enum dc_status dcn20_enable_stream_timing( + pipe_ctx->stream->signal, + true); + +- if (pipe_ctx->stream_res.tg->funcs->setup_global_lock) +- pipe_ctx->stream_res.tg->funcs->setup_global_lock( +- pipe_ctx->stream_res.tg); +- + /* program otg blank color */ + color_space = stream->output_color_space; + color_space_to_black_color(dc, color_space, &black_color); +@@ -1227,10 +1223,19 @@ static void dcn20_pipe_control_lock_global( + struct pipe_ctx *pipe, + bool lock) + { +- if (lock) +- pipe->stream_res.tg->funcs->lock_global(pipe->stream_res.tg); +- else ++ if (lock) { ++ pipe->stream_res.tg->funcs->lock_doublebuffer_enable( ++ pipe->stream_res.tg); ++ pipe->stream_res.tg->funcs->lock(pipe->stream_res.tg); ++ } else { + pipe->stream_res.tg->funcs->unlock(pipe->stream_res.tg); ++ pipe->stream_res.tg->funcs->wait_for_state(pipe->stream_res.tg, ++ CRTC_STATE_VACTIVE); ++ pipe->stream_res.tg->funcs->wait_for_state(pipe->stream_res.tg, ++ CRTC_STATE_VBLANK); ++ pipe->stream_res.tg->funcs->lock_doublebuffer_disable( ++ pipe->stream_res.tg); ++ } + } + + static void dcn20_pipe_control_lock( +diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c +index 34f5a7d671b2..43e71b4ab5e8 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c +@@ -330,64 +330,42 @@ void optc2_triplebuffer_unlock(struct timing_generator *optc) + + } + +-void optc2_setup_global_lock(struct timing_generator *optc) ++void optc2_lock_doublebuffer_enable(struct timing_generator *optc) + { + struct optc *optc1 = DCN10TG_FROM_TG(optc); + uint32_t v_blank_start = 0; +- uint32_t h_blank_start = 0, h_total = 0; ++ uint32_t h_blank_start = 0; + +- REG_SET(OTG_GLOBAL_CONTROL2, 0, DIG_UPDATE_LOCATION, 20); ++ REG_UPDATE(OTG_GLOBAL_CONTROL1, MASTER_UPDATE_LOCK_DB_EN, 1); ++ ++ REG_UPDATE_2(OTG_GLOBAL_CONTROL2, GLOBAL_UPDATE_LOCK_EN, 1, ++ DIG_UPDATE_LOCATION, 20); + + REG_GET(OTG_V_BLANK_START_END, OTG_V_BLANK_START, &v_blank_start); + + REG_GET(OTG_H_BLANK_START_END, OTG_H_BLANK_START, &h_blank_start); + +- REG_GET(OTG_H_TOTAL, OTG_H_TOTAL, &h_total); + REG_UPDATE_2(OTG_GLOBAL_CONTROL1, + MASTER_UPDATE_LOCK_DB_X, +- 0, ++ h_blank_start - 200 - 1, + MASTER_UPDATE_LOCK_DB_Y, + v_blank_start - 1); + } + +-void optc2_lock_global(struct timing_generator *optc) ++void optc2_lock_doublebuffer_disable(struct timing_generator *optc) + { + struct optc *optc1 = DCN10TG_FROM_TG(optc); + +- REG_SET(OTG_GLOBAL_CONTROL1, 0, MASTER_UPDATE_LOCK_DB_EN, 1); +- +- REG_UPDATE(OTG_GLOBAL_CONTROL2, GLOBAL_UPDATE_LOCK_EN, 1); +- +- REG_SET(OTG_GLOBAL_CONTROL0, 0, +- OTG_MASTER_UPDATE_LOCK_SEL, optc->inst); +- REG_SET(OTG_MASTER_UPDATE_LOCK, 0, +- OTG_MASTER_UPDATE_LOCK, 1); +- +- /* Should be fast, status does not update on maximus */ +- if (optc->ctx->dce_environment != DCE_ENV_FPGA_MAXIMUS) +- REG_WAIT(OTG_MASTER_UPDATE_LOCK, +- UPDATE_LOCK_STATUS, 1, +- 1, 10); +-} +- +-void optc2_lock(struct timing_generator *optc) +-{ +- struct optc *optc1 = DCN10TG_FROM_TG(optc); +- +- REG_SET(OTG_GLOBAL_CONTROL1, 0, MASTER_UPDATE_LOCK_DB_EN, 0); ++ REG_UPDATE_2(OTG_GLOBAL_CONTROL1, ++ MASTER_UPDATE_LOCK_DB_X, ++ 0, ++ MASTER_UPDATE_LOCK_DB_Y, ++ 0); + +- REG_UPDATE(OTG_GLOBAL_CONTROL2, GLOBAL_UPDATE_LOCK_EN, 0); ++ REG_UPDATE_2(OTG_GLOBAL_CONTROL2, GLOBAL_UPDATE_LOCK_EN, 0, ++ DIG_UPDATE_LOCATION, 0); + +- REG_SET(OTG_GLOBAL_CONTROL0, 0, +- OTG_MASTER_UPDATE_LOCK_SEL, optc->inst); +- REG_SET(OTG_MASTER_UPDATE_LOCK, 0, +- OTG_MASTER_UPDATE_LOCK, 1); +- +- /* Should be fast, status does not update on maximus */ +- if (optc->ctx->dce_environment != DCE_ENV_FPGA_MAXIMUS) +- REG_WAIT(OTG_MASTER_UPDATE_LOCK, +- UPDATE_LOCK_STATUS, 1, +- 1, 10); ++ REG_UPDATE(OTG_GLOBAL_CONTROL1, MASTER_UPDATE_LOCK_DB_EN, 0); + } + + void optc2_setup_manual_trigger(struct timing_generator *optc) +@@ -446,10 +424,10 @@ static struct timing_generator_funcs dcn20_tg_funcs = { + .triplebuffer_lock = optc2_triplebuffer_lock, + .triplebuffer_unlock = optc2_triplebuffer_unlock, + .disable_reset_trigger = optc1_disable_reset_trigger, +- .lock = optc2_lock, ++ .lock = optc1_lock, + .unlock = optc1_unlock, +- .lock_global = optc2_lock_global, +- .setup_global_lock = optc2_setup_global_lock, ++ .lock_doublebuffer_enable = optc2_lock_doublebuffer_enable, ++ .lock_doublebuffer_disable = optc2_lock_doublebuffer_disable, + .enable_optc_clock = optc1_enable_optc_clock, + .set_drr = optc1_set_drr, + .set_static_screen_control = optc1_set_static_screen_control, +diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.h +index a00bb0d92a49..d2651d846424 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.h ++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.h +@@ -104,9 +104,8 @@ void optc2_get_optc_source(struct timing_generator *optc, + + void optc2_triplebuffer_lock(struct timing_generator *optc); + void optc2_triplebuffer_unlock(struct timing_generator *optc); +-void optc2_lock(struct timing_generator *optc); +-void optc2_lock_global(struct timing_generator *optc); +-void optc2_setup_global_lock(struct timing_generator *optc); ++void optc2_lock_doublebuffer_disable(struct timing_generator *optc); ++void optc2_lock_doublebuffer_enable(struct timing_generator *optc); + void optc2_program_manual_trigger(struct timing_generator *optc); + + #endif /* __DC_OPTC_DCN20_H__ */ +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h b/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h +index 251baebe5386..75314de83b3e 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h +@@ -184,10 +184,10 @@ struct timing_generator_funcs { + bool (*did_triggered_reset_occur)(struct timing_generator *tg); + void (*setup_global_swap_lock)(struct timing_generator *tg, + const struct dcp_gsl_params *gsl_params); +- void (*setup_global_lock)(struct timing_generator *tg); + void (*unlock)(struct timing_generator *tg); + void (*lock)(struct timing_generator *tg); +- void (*lock_global)(struct timing_generator *tg); ++ void (*lock_doublebuffer_disable)(struct timing_generator *tg); ++ void (*lock_doublebuffer_enable)(struct timing_generator *tg); + #if defined(CONFIG_DRM_AMD_DC_DCN2_0) + void(*triplebuffer_unlock)(struct timing_generator *tg); + void(*triplebuffer_lock)(struct timing_generator *tg); +-- +2.17.1 + |