]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/amd/display: Fix DML failures caused by doubled stereo viewport
authorNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Thu, 4 Jun 2020 15:07:46 +0000 (11:07 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 1 Jul 2020 05:59:25 +0000 (01:59 -0400)
[Why]
Side-by-side and Top-and-bottom stereo configurations fail DML mode
validation due to Viewport exceeded.

This is because we consider the planes as being pipe split in pipe
population so we end up doubling the viewport width, eg. from 4k to 8k.

[How]
These pipes technically aren't hsplit, so add a check for determining
whether is_hsplit should be set.

Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@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/calcs/dcn_calcs.c
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c

index 555af29565aa2690ab7e82af6f1842465e1a2277..51397b565ddff2c12da2116fce6994ab918717a6 100644 (file)
@@ -302,10 +302,17 @@ static void pipe_ctx_to_e2e_pipe_params (
                struct _vcs_dpi_display_pipe_params_st *input)
 {
        input->src.is_hsplit = false;
-       if (pipe->top_pipe != NULL && pipe->top_pipe->plane_state == pipe->plane_state)
+
+       /* stereo can never be split */
+       if (pipe->plane_state->stereo_format == PLANE_STEREO_FORMAT_SIDE_BY_SIDE ||
+           pipe->plane_state->stereo_format == PLANE_STEREO_FORMAT_TOP_AND_BOTTOM) {
+               /* reset the split group if it was already considered split. */
+               input->src.hsplit_grp = pipe->pipe_idx;
+       } else if (pipe->top_pipe != NULL && pipe->top_pipe->plane_state == pipe->plane_state) {
                input->src.is_hsplit = true;
-       else if (pipe->bottom_pipe != NULL && pipe->bottom_pipe->plane_state == pipe->plane_state)
+       } else if (pipe->bottom_pipe != NULL && pipe->bottom_pipe->plane_state == pipe->plane_state) {
                input->src.is_hsplit = true;
+       }
 
        if (pipe->plane_res.dpp->ctx->dc->debug.optimized_watermark) {
                /*
index 8f51f9cbe32a9cb42cbce09665194fee9fb66ec2..d3be19b1d0abc6d080584172390ad046ba7d9b2f 100644 (file)
@@ -2257,6 +2257,14 @@ int dcn20_populate_dml_pipes_from_context(
                        pipes[pipe_cnt].pipe.src.is_hsplit = (res_ctx->pipe_ctx[i].bottom_pipe && res_ctx->pipe_ctx[i].bottom_pipe->plane_state == pln)
                                        || (res_ctx->pipe_ctx[i].top_pipe && res_ctx->pipe_ctx[i].top_pipe->plane_state == pln)
                                        || pipes[pipe_cnt].pipe.dest.odm_combine != dm_odm_combine_mode_disabled;
+
+                       /* stereo is never split, nor odm combine */
+                       if (pln->stereo_format == PLANE_STEREO_FORMAT_SIDE_BY_SIDE ||
+                           pln->stereo_format == PLANE_STEREO_FORMAT_TOP_AND_BOTTOM) {
+                               pipes[pipe_cnt].pipe.src.is_hsplit = false;
+                               pipes[pipe_cnt].pipe.src.hsplit_grp = res_ctx->pipe_ctx[i].pipe_idx;
+                       }
+
                        pipes[pipe_cnt].pipe.src.source_scan = pln->rotation == ROTATION_ANGLE_90
                                        || pln->rotation == ROTATION_ANGLE_270 ? dm_vert : dm_horz;
                        pipes[pipe_cnt].pipe.src.viewport_y_y = scl->viewport_unadjusted.y;