]> www.infradead.org Git - nvme.git/commitdiff
drm/amd/display: treat plane clip size change as MED update type
authorWenjing Liu <wenjing.liu@amd.com>
Tue, 30 Jan 2024 19:29:08 +0000 (14:29 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 14 Feb 2024 22:12:48 +0000 (17:12 -0500)
[why]
When clip size is changed recout and viewport size would require an
update. When the update is clip size only current driver fails to
program the update into hardware.

[how]
Set a new clip_size_change flag when it is detected and set MED update
type and reprogram scaling params in next program pipe.

Reviewed-by: Aric Cyr <aric.cyr@amd.com>
Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c

index 72512903f88f76c126bc958f9982591255d9952f..1d0fd69cc7bd1bf5cf5d37434743398b943195e0 100644 (file)
@@ -2454,6 +2454,10 @@ static enum surface_update_type get_scaling_info_update_type(
                 /* Changing clip size of a large surface may result in MPC slice count change */
                update_flags->bits.bandwidth_change = 1;
 
+       if (u->scaling_info->clip_rect.width != u->surface->clip_rect.width ||
+                       u->scaling_info->clip_rect.height != u->surface->clip_rect.height)
+               update_flags->bits.clip_size_change = 1;
+
        if (u->scaling_info->src_rect.x != u->surface->src_rect.x
                        || u->scaling_info->src_rect.y != u->surface->src_rect.y
                        || u->scaling_info->clip_rect.x != u->surface->clip_rect.x
@@ -2467,7 +2471,8 @@ static enum surface_update_type get_scaling_info_update_type(
                        || update_flags->bits.scaling_change)
                return UPDATE_TYPE_FULL;
 
-       if (update_flags->bits.position_change)
+       if (update_flags->bits.position_change ||
+                       update_flags->bits.clip_size_change)
                return UPDATE_TYPE_MED;
 
        return UPDATE_TYPE_FAST;
index c789cc2e216de7e74b99d08e37417ba347051bd0..f2c27964ec1cb832fb3ea8d7793760760c6669ab 100644 (file)
@@ -1252,6 +1252,7 @@ union surface_update_flags {
                uint32_t rotation_change:1;
                uint32_t swizzle_change:1;
                uint32_t scaling_change:1;
+               uint32_t clip_size_change: 1;
                uint32_t position_change:1;
                uint32_t in_transfer_func_change:1;
                uint32_t input_csc_change:1;
index bc0a21957e33f97930df9b16582c8bb500026fde..f15ba7335336a79bebfd4de7210c8f6b28b6a5f3 100644 (file)
@@ -1740,6 +1740,7 @@ static void dcn20_update_dchubp_dpp(
        if (pipe_ctx->update_flags.bits.scaler ||
                        plane_state->update_flags.bits.scaling_change ||
                        plane_state->update_flags.bits.position_change ||
+                       plane_state->update_flags.bits.clip_size_change ||
                        plane_state->update_flags.bits.per_pixel_alpha_change ||
                        pipe_ctx->stream->update_flags.bits.scaling) {
                pipe_ctx->plane_res.scl_data.lb_params.alpha_en = pipe_ctx->plane_state->per_pixel_alpha;
@@ -1752,6 +1753,7 @@ static void dcn20_update_dchubp_dpp(
        if (pipe_ctx->update_flags.bits.viewport ||
                        (context == dc->current_state && plane_state->update_flags.bits.position_change) ||
                        (context == dc->current_state && plane_state->update_flags.bits.scaling_change) ||
+                       (context == dc->current_state && plane_state->update_flags.bits.clip_size_change) ||
                        (context == dc->current_state && pipe_ctx->stream->update_flags.bits.scaling)) {
 
                hubp->funcs->mem_program_viewport(