drm/amd/display: enable HUBP blank behaviour
authorBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Wed, 16 Dec 2020 18:52:19 +0000 (13:52 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 14 Jan 2021 04:44:28 +0000 (23:44 -0500)
- Reverts "drm/amd/display: Revert HUBP blank behaviour for now"
- Hubp blank will fail if the pipe is locked (this is the case on
linux), so add a check to make sure pipe isn't locked, if it is then
defer the blank to post_unlock.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.h
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c
drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c
drivers/gpu/drm/amd/display/dc/inc/core_types.h
drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h

index f033397a84e9a2eeb03ef3c320024ee641879e29..6138f4887de7fa597d385059e2801de54370c4bf 100644 (file)
@@ -659,6 +659,16 @@ void optc1_unlock(struct timing_generator *optc)
                        OTG_MASTER_UPDATE_LOCK, 0);
 }
 
+bool optc1_is_locked(struct timing_generator *optc)
+{
+       struct optc *optc1 = DCN10TG_FROM_TG(optc);
+       uint32_t locked;
+
+       REG_GET(OTG_MASTER_UPDATE_LOCK, UPDATE_LOCK_STATUS, &locked);
+
+       return (locked == 1);
+}
+
 void optc1_get_position(struct timing_generator *optc,
                struct crtc_position *position)
 {
@@ -1513,6 +1523,7 @@ static const struct timing_generator_funcs dcn10_tg_funcs = {
                .enable_crtc_reset = optc1_enable_crtc_reset,
                .disable_reset_trigger = optc1_disable_reset_trigger,
                .lock = optc1_lock,
+               .is_locked = optc1_is_locked,
                .unlock = optc1_unlock,
                .enable_optc_clock = optc1_enable_optc_clock,
                .set_drr = optc1_set_drr,
index b12bd9aae52f0159197dbece6f60c47756a95839..b222c67973d469e0c65a56bdee9a2ef743cd3f2c 100644 (file)
@@ -638,6 +638,7 @@ void optc1_set_blank(struct timing_generator *optc,
                bool enable_blanking);
 
 bool optc1_is_blanked(struct timing_generator *optc);
+bool optc1_is_locked(struct timing_generator *optc);
 
 void optc1_program_blank_color(
                struct timing_generator *optc,
index b74f79575cdf0ad049ecfba4ca06c39ccf2d0382..18653c423c967e7a1ff944e8ac2c5791481bdcf8 100644 (file)
@@ -1765,6 +1765,14 @@ void dcn20_post_unlock_program_front_end(
                }
        }
 
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               if (pipe->vtp_locked) {
+                       dc->hwss.set_hubp_blank(dc, pipe, true);
+                       pipe->vtp_locked = false;
+               }
+       }
        /* WA to apply WM setting*/
        if (hwseq->wa.DEGVIDCN21)
                dc->res_pool->hubbub->funcs->apply_DEDCN21_147_wa(dc->res_pool->hubbub);
index 7f26c9444933730ea7258f4d2b43614a05011ae9..e5cc8f8c363f34a9edf544a1ef843789823af7e1 100644 (file)
@@ -891,6 +891,25 @@ void dcn30_set_disp_pattern_generator(const struct dc *dc,
                const struct tg_color *solid_color,
                int width, int height, int offset)
 {
-       pipe_ctx->stream_res.opp->funcs->opp_set_disp_pattern_generator(pipe_ctx->stream_res.opp, test_pattern,
-                       color_space, color_depth, solid_color, width, height, offset);
+       struct stream_resource *stream_res = &pipe_ctx->stream_res;
+
+       if (test_pattern != CONTROLLER_DP_TEST_PATTERN_VIDEOMODE) {
+               pipe_ctx->vtp_locked = false;
+               /* turning on DPG */
+               stream_res->opp->funcs->opp_set_disp_pattern_generator(stream_res->opp, test_pattern, color_space,
+                               color_depth, solid_color, width, height, offset);
+
+               /* Defer hubp blank if tg is locked */
+               if (stream_res->tg->funcs->is_tg_enabled(stream_res->tg)) {
+                       if (stream_res->tg->funcs->is_locked(stream_res->tg))
+                               pipe_ctx->vtp_locked = true;
+                       else
+                               dc->hwss.set_hubp_blank(dc, pipe_ctx, true);
+               }
+       } else {
+               dc->hwss.set_hubp_blank(dc, pipe_ctx, false);
+               /* turning off DPG */
+               stream_res->opp->funcs->opp_set_disp_pattern_generator(stream_res->opp, test_pattern, color_space,
+                               color_depth, solid_color, width, height, offset);
+       }
 }
index 3ba3991ee6128b489eaded6262ab04376c25c915..8980c90b2277a242ea8c59a9481fdddb8927ba7d 100644 (file)
@@ -309,6 +309,7 @@ static struct timing_generator_funcs dcn30_tg_funcs = {
                .enable_crtc_reset = optc1_enable_crtc_reset,
                .disable_reset_trigger = optc1_disable_reset_trigger,
                .lock = optc3_lock,
+               .is_locked = optc1_is_locked,
                .unlock = optc1_unlock,
                .lock_doublebuffer_enable = optc3_lock_doublebuffer_enable,
                .lock_doublebuffer_disable = optc3_lock_doublebuffer_disable,
index 319dec59bcd1e585d82ea351560ee5d7d80a6a9e..1fe3fb14afd4de2ed298fcd65fa77d8958b95865 100644 (file)
@@ -5558,7 +5558,7 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
                }
        }
 
-       if (mode_lib->vba.MinActiveDRAMClockChangeMargin > 0 && PrefetchMode == 0) {
+       if (mode_lib->vba.MinActiveDRAMClockChangeMargin > 0) {
                *DRAMClockChangeSupport = dm_dram_clock_change_vactive;
        } else if (((mode_lib->vba.SynchronizedVBlank == true || mode_lib->vba.TotalNumberOfActiveOTG == 1 || SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank > 0) && PrefetchMode == 0)) {
                *DRAMClockChangeSupport = dm_dram_clock_change_vblank;
index 2d77eac66cb036cfdb85e5ff9cf379f59d7140d9..8efa1b80546deaa03f0a93c7d610a45d6830f3ca 100644 (file)
@@ -333,6 +333,7 @@ struct pipe_ctx {
        union pipe_update_flags update_flags;
        struct dwbc *dwbc;
        struct mcif_wb *mcif_wb;
+       bool vtp_locked;
 };
 
 struct resource_context {
index f7632fe25976d399eb220668c4790432d25b26ab..754832d216fdabbdfa5c65fede5f12e7285964ab 100644 (file)
@@ -190,6 +190,7 @@ struct timing_generator_funcs {
        void (*set_blank)(struct timing_generator *tg,
                                        bool enable_blanking);
        bool (*is_blanked)(struct timing_generator *tg);
+       bool (*is_locked)(struct timing_generator *tg);
        void (*set_overscan_blank_color) (struct timing_generator *tg, const struct tg_color *color);
        void (*set_blank_color)(struct timing_generator *tg, const struct tg_color *color);
        void (*set_colors)(struct timing_generator *tg,