]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/amd/display: Block ABM in case of eDP ODM
authorYongqiang Sun <yongqiang.sun@amd.com>
Fri, 18 Sep 2020 20:33:55 +0000 (16:33 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 5 Oct 2020 19:16:43 +0000 (15:16 -0400)
[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: Yongqiang Sun <yongqiang.sun@amd.com>
Reviewed-by: Eric Yang <eric.yang2@amd.com>
Acked-by: Eryk Brol <eryk.brol@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_stream.h
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hwseq.c
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hwseq.h
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h

index c246af7c584b0ff28833cfcfc0af81dbc09417fa..0be1ec1e46cae99ee8abb0c410f479a42a75ca06 100644 (file)
@@ -45,6 +45,7 @@ struct dc_stream_status {
        int audio_inst;
        struct timing_sync_info timing_sync_info;
        struct dc_plane_state *plane_states[MAX_SURFACE_NUM];
+       bool is_abm_supported;
 };
 
 // TODO: References to this needs to be removed..
index 01f1d3d9a639806575e8d8731abf388a88ab947f..1fa1930788030de88ed79e7b7fb4f258ba02a2c1 100644 (file)
@@ -223,3 +223,18 @@ bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,
        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;
+}
+
index 9e97747e57cd5f32a405c0455329bd572c256165..9cee9bdb8de95c1ab2566d4ac512a84c7469e573 100644 (file)
@@ -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,
                uint32_t backlight_pwm_u16_16,
                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__ */
index 2b7396c9fcb480cc9c740701c426f1bcefe7850e..4ab29911508dc16313eb3dc25cbf4dbd3965d7fa 100644 (file)
@@ -98,6 +98,7 @@ static const struct hw_sequencer_funcs dcn21_funcs = {
 #ifndef TRIM_FSFT
        .optimize_timing_for_fsft = dcn20_optimize_timing_for_fsft,
 #endif
+       .is_abm_supported = dcn21_is_abm_supported,
 };
 
 static const struct hwseq_private_funcs dcn21_private_funcs = {
index 2ace13878aaf37a53875543bb796831a25f405a7..8eb8e13e11302ae330c4e6994570389f25258773 100644 (file)
@@ -617,6 +617,9 @@ void dcn30_init_hw(struct dc *dc)
        if (hws->funcs.enable_power_gating_plane)
                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)
                dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
 
index 55c642950e91b4161e8638a713c58da64033a304..e9ef782e63a88adba13008acb8831c463e5757ea 100644 (file)
@@ -223,6 +223,8 @@ struct hw_sequencer_funcs {
        bool (*apply_idle_power_optimizations)(struct dc *dc, bool enable);
 #endif
 
+       bool (*is_abm_supported)(struct dc *dc,
+                       struct dc_state *context, struct dc_stream_state *stream);
 };
 
 void color_space_to_black_color(