Commit 54e8094a authored by Yongqiang Sun's avatar Yongqiang Sun Committed by Alex Deucher

drm/amd/display: Block ABM in case of eDP ODM

[Why]
enable ODM on eDP panel with ABM will result in color difference
on the panel due to only one ABM module to set one pipe.

[How]
Block ABM in case of ODM enabled on eDP.
Signed-off-by: default avatarYongqiang Sun <yongqiang.sun@amd.com>
Reviewed-by: default avatarEric Yang <eric.yang2@amd.com>
Acked-by: default avatarEryk Brol <eryk.brol@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 7c4ed1df
...@@ -45,6 +45,7 @@ struct dc_stream_status { ...@@ -45,6 +45,7 @@ struct dc_stream_status {
int audio_inst; int audio_inst;
struct timing_sync_info timing_sync_info; struct timing_sync_info timing_sync_info;
struct dc_plane_state *plane_states[MAX_SURFACE_NUM]; struct dc_plane_state *plane_states[MAX_SURFACE_NUM];
bool is_abm_supported;
}; };
// TODO: References to this needs to be removed.. // TODO: References to this needs to be removed..
......
...@@ -223,3 +223,18 @@ bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx, ...@@ -223,3 +223,18 @@ bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,
return true; return true;
} }
bool dcn21_is_abm_supported(struct dc *dc,
struct dc_state *context, struct dc_stream_state *stream)
{
int i;
for (i = 0; i < dc->res_pool->pipe_count; i++) {
struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
if (pipe_ctx->stream == stream &&
(pipe_ctx->prev_odm_pipe == NULL && pipe_ctx->next_odm_pipe == NULL))
return true;
}
return false;
}
...@@ -52,5 +52,7 @@ void dcn21_set_abm_immediate_disable(struct pipe_ctx *pipe_ctx); ...@@ -52,5 +52,7 @@ void dcn21_set_abm_immediate_disable(struct pipe_ctx *pipe_ctx);
bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx, bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,
uint32_t backlight_pwm_u16_16, uint32_t backlight_pwm_u16_16,
uint32_t frame_ramp); uint32_t frame_ramp);
bool dcn21_is_abm_supported(struct dc *dc,
struct dc_state *context, struct dc_stream_state *stream);
#endif /* __DC_HWSS_DCN21_H__ */ #endif /* __DC_HWSS_DCN21_H__ */
...@@ -98,6 +98,7 @@ static const struct hw_sequencer_funcs dcn21_funcs = { ...@@ -98,6 +98,7 @@ static const struct hw_sequencer_funcs dcn21_funcs = {
#ifndef TRIM_FSFT #ifndef TRIM_FSFT
.optimize_timing_for_fsft = dcn20_optimize_timing_for_fsft, .optimize_timing_for_fsft = dcn20_optimize_timing_for_fsft,
#endif #endif
.is_abm_supported = dcn21_is_abm_supported,
}; };
static const struct hwseq_private_funcs dcn21_private_funcs = { static const struct hwseq_private_funcs dcn21_private_funcs = {
......
...@@ -617,6 +617,9 @@ void dcn30_init_hw(struct dc *dc) ...@@ -617,6 +617,9 @@ void dcn30_init_hw(struct dc *dc)
if (hws->funcs.enable_power_gating_plane) if (hws->funcs.enable_power_gating_plane)
hws->funcs.enable_power_gating_plane(dc->hwseq, true); hws->funcs.enable_power_gating_plane(dc->hwseq, true);
if (!dcb->funcs->is_accelerated_mode(dcb) && dc->res_pool->hubbub->funcs->init_watermarks)
dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
if (dc->clk_mgr->funcs->notify_wm_ranges) if (dc->clk_mgr->funcs->notify_wm_ranges)
dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr); dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
......
...@@ -223,6 +223,8 @@ struct hw_sequencer_funcs { ...@@ -223,6 +223,8 @@ struct hw_sequencer_funcs {
bool (*apply_idle_power_optimizations)(struct dc *dc, bool enable); bool (*apply_idle_power_optimizations)(struct dc *dc, bool enable);
#endif #endif
bool (*is_abm_supported)(struct dc *dc,
struct dc_state *context, struct dc_stream_state *stream);
}; };
void color_space_to_black_color( void color_space_to_black_color(
......
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