Commit d209124d authored by Bhawanpreet Lakha's avatar Bhawanpreet Lakha Committed by Alex Deucher

drm/amd/display: enable HUBP blank behaviour

- 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: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: default avatarNicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 985faf2c
...@@ -659,6 +659,16 @@ void optc1_unlock(struct timing_generator *optc) ...@@ -659,6 +659,16 @@ void optc1_unlock(struct timing_generator *optc)
OTG_MASTER_UPDATE_LOCK, 0); 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, void optc1_get_position(struct timing_generator *optc,
struct crtc_position *position) struct crtc_position *position)
{ {
...@@ -1513,6 +1523,7 @@ static const struct timing_generator_funcs dcn10_tg_funcs = { ...@@ -1513,6 +1523,7 @@ static const struct timing_generator_funcs dcn10_tg_funcs = {
.enable_crtc_reset = optc1_enable_crtc_reset, .enable_crtc_reset = optc1_enable_crtc_reset,
.disable_reset_trigger = optc1_disable_reset_trigger, .disable_reset_trigger = optc1_disable_reset_trigger,
.lock = optc1_lock, .lock = optc1_lock,
.is_locked = optc1_is_locked,
.unlock = optc1_unlock, .unlock = optc1_unlock,
.enable_optc_clock = optc1_enable_optc_clock, .enable_optc_clock = optc1_enable_optc_clock,
.set_drr = optc1_set_drr, .set_drr = optc1_set_drr,
......
...@@ -638,6 +638,7 @@ void optc1_set_blank(struct timing_generator *optc, ...@@ -638,6 +638,7 @@ void optc1_set_blank(struct timing_generator *optc,
bool enable_blanking); bool enable_blanking);
bool optc1_is_blanked(struct timing_generator *optc); bool optc1_is_blanked(struct timing_generator *optc);
bool optc1_is_locked(struct timing_generator *optc);
void optc1_program_blank_color( void optc1_program_blank_color(
struct timing_generator *optc, struct timing_generator *optc,
......
...@@ -1765,6 +1765,14 @@ void dcn20_post_unlock_program_front_end( ...@@ -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*/ /* WA to apply WM setting*/
if (hwseq->wa.DEGVIDCN21) if (hwseq->wa.DEGVIDCN21)
dc->res_pool->hubbub->funcs->apply_DEDCN21_147_wa(dc->res_pool->hubbub); dc->res_pool->hubbub->funcs->apply_DEDCN21_147_wa(dc->res_pool->hubbub);
......
...@@ -891,6 +891,25 @@ void dcn30_set_disp_pattern_generator(const struct dc *dc, ...@@ -891,6 +891,25 @@ void dcn30_set_disp_pattern_generator(const struct dc *dc,
const struct tg_color *solid_color, const struct tg_color *solid_color,
int width, int height, int offset) int width, int height, int offset)
{ {
pipe_ctx->stream_res.opp->funcs->opp_set_disp_pattern_generator(pipe_ctx->stream_res.opp, test_pattern, struct stream_resource *stream_res = &pipe_ctx->stream_res;
color_space, color_depth, solid_color, width, height, offset);
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);
}
} }
...@@ -309,6 +309,7 @@ static struct timing_generator_funcs dcn30_tg_funcs = { ...@@ -309,6 +309,7 @@ static struct timing_generator_funcs dcn30_tg_funcs = {
.enable_crtc_reset = optc1_enable_crtc_reset, .enable_crtc_reset = optc1_enable_crtc_reset,
.disable_reset_trigger = optc1_disable_reset_trigger, .disable_reset_trigger = optc1_disable_reset_trigger,
.lock = optc3_lock, .lock = optc3_lock,
.is_locked = optc1_is_locked,
.unlock = optc1_unlock, .unlock = optc1_unlock,
.lock_doublebuffer_enable = optc3_lock_doublebuffer_enable, .lock_doublebuffer_enable = optc3_lock_doublebuffer_enable,
.lock_doublebuffer_disable = optc3_lock_doublebuffer_disable, .lock_doublebuffer_disable = optc3_lock_doublebuffer_disable,
......
...@@ -5558,7 +5558,7 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport( ...@@ -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; *DRAMClockChangeSupport = dm_dram_clock_change_vactive;
} else if (((mode_lib->vba.SynchronizedVBlank == true || mode_lib->vba.TotalNumberOfActiveOTG == 1 || SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank > 0) && PrefetchMode == 0)) { } else if (((mode_lib->vba.SynchronizedVBlank == true || mode_lib->vba.TotalNumberOfActiveOTG == 1 || SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank > 0) && PrefetchMode == 0)) {
*DRAMClockChangeSupport = dm_dram_clock_change_vblank; *DRAMClockChangeSupport = dm_dram_clock_change_vblank;
......
...@@ -333,6 +333,7 @@ struct pipe_ctx { ...@@ -333,6 +333,7 @@ struct pipe_ctx {
union pipe_update_flags update_flags; union pipe_update_flags update_flags;
struct dwbc *dwbc; struct dwbc *dwbc;
struct mcif_wb *mcif_wb; struct mcif_wb *mcif_wb;
bool vtp_locked;
}; };
struct resource_context { struct resource_context {
......
...@@ -190,6 +190,7 @@ struct timing_generator_funcs { ...@@ -190,6 +190,7 @@ struct timing_generator_funcs {
void (*set_blank)(struct timing_generator *tg, void (*set_blank)(struct timing_generator *tg,
bool enable_blanking); bool enable_blanking);
bool (*is_blanked)(struct timing_generator *tg); 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_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_blank_color)(struct timing_generator *tg, const struct tg_color *color);
void (*set_colors)(struct timing_generator *tg, void (*set_colors)(struct timing_generator *tg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment