diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3586-drm-amd-display-fix-odm-validation.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3586-drm-amd-display-fix-odm-validation.patch | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3586-drm-amd-display-fix-odm-validation.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3586-drm-amd-display-fix-odm-validation.patch new file mode 100644 index 00000000..2830a6c2 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3586-drm-amd-display-fix-odm-validation.patch @@ -0,0 +1,118 @@ +From bf139b37f2d0b90b5601d03d6cc41fbdefdde746 Mon Sep 17 00:00:00 2001 +From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Date: Tue, 6 Aug 2019 12:17:57 -0400 +Subject: [PATCH 3586/4256] drm/amd/display: fix odm validation + +Update bw validation to use prev and next odm pipe pointers +for populating dml inputs. + +Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Reviewed-by: Charlene Liu <Charlene.Liu@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +--- + .../drm/amd/display/dc/dcn20/dcn20_resource.c | 40 +++++++++---------- + 1 file changed, 19 insertions(+), 21 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +index aa1342ccf8b4..477885816854 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +@@ -1600,12 +1600,8 @@ static bool dcn20_split_stream_for_odm( + struct pipe_ctx *next_odm_pipe) + { + int pipe_idx = next_odm_pipe->pipe_idx; +- struct scaler_data *sd = &prev_odm_pipe->plane_res.scl_data; +- struct pipe_ctx *sec_next_pipe = next_odm_pipe->next_odm_pipe; +- int new_width; + + *next_odm_pipe = *prev_odm_pipe; +- next_odm_pipe->next_odm_pipe = sec_next_pipe; + + next_odm_pipe->pipe_idx = pipe_idx; + next_odm_pipe->plane_res.mi = pool->mis[next_odm_pipe->pipe_idx]; +@@ -1627,11 +1623,11 @@ static bool dcn20_split_stream_for_odm( + ASSERT(next_odm_pipe->top_pipe == NULL); + + if (prev_odm_pipe->plane_state) { ++ struct scaler_data *sd = &prev_odm_pipe->plane_res.scl_data; ++ int new_width; ++ + /* HACTIVE halved for odm combine */ + sd->h_active /= 2; +- /* Copy scl_data to secondary pipe */ +- next_odm_pipe->plane_res.scl_data = *sd; +- + /* Calculate new vp and recout for left pipe */ + /* Need at least 16 pixels width per side */ + if (sd->recout.x + 16 >= sd->h_active) +@@ -1645,10 +1641,12 @@ static bool dcn20_split_stream_for_odm( + + /* Calculate new vp and recout for right pipe */ + sd = &next_odm_pipe->plane_res.scl_data; +- new_width = sd->recout.width + sd->recout.x - sd->h_active; ++ /* HACTIVE halved for odm combine */ ++ sd->h_active /= 2; + /* Need at least 16 pixels width per side */ + if (new_width <= 16) + return false; ++ new_width = sd->recout.width + sd->recout.x - sd->h_active; + sd->viewport.width -= dc_fixpt_floor(dc_fixpt_mul_int( + sd->ratios.horz, sd->recout.width - new_width)); + sd->viewport_c.width -= dc_fixpt_floor(dc_fixpt_mul_int( +@@ -1818,6 +1816,19 @@ int dcn20_populate_dml_pipes_from_context( + pipes[pipe_cnt].dout.dp_lanes = 4; + pipes[pipe_cnt].pipe.dest.vtotal_min = res_ctx->pipe_ctx[i].stream->adjust.v_total_min; + pipes[pipe_cnt].pipe.dest.vtotal_max = res_ctx->pipe_ctx[i].stream->adjust.v_total_max; ++ pipes[pipe_cnt].pipe.dest.odm_combine = res_ctx->pipe_ctx[i].prev_odm_pipe ++ || res_ctx->pipe_ctx[i].next_odm_pipe; ++ pipes[pipe_cnt].pipe.src.hsplit_grp = res_ctx->pipe_ctx[i].pipe_idx; ++ if (res_ctx->pipe_ctx[i].top_pipe && res_ctx->pipe_ctx[i].top_pipe->plane_state ++ == res_ctx->pipe_ctx[i].plane_state) ++ pipes[pipe_cnt].pipe.src.hsplit_grp = res_ctx->pipe_ctx[i].top_pipe->pipe_idx; ++ else if (res_ctx->pipe_ctx[i].prev_odm_pipe) { ++ struct pipe_ctx *first_pipe = res_ctx->pipe_ctx[i].prev_odm_pipe; ++ ++ while (first_pipe->prev_odm_pipe) ++ first_pipe = first_pipe->prev_odm_pipe; ++ pipes[pipe_cnt].pipe.src.hsplit_grp = first_pipe->pipe_idx; ++ } + + switch (res_ctx->pipe_ctx[i].stream->signal) { + case SIGNAL_TYPE_DISPLAY_PORT_MST: +@@ -1870,7 +1881,6 @@ int dcn20_populate_dml_pipes_from_context( + break; + } + +- + switch (res_ctx->pipe_ctx[i].stream->timing.pixel_encoding) { + case PIXEL_ENCODING_RGB: + case PIXEL_ENCODING_YCBCR444: +@@ -1892,10 +1902,6 @@ int dcn20_populate_dml_pipes_from_context( + pipes[pipe_cnt].dout.output_format = dm_444; + pipes[pipe_cnt].dout.output_bpp = output_bpc * 3; + } +- pipes[pipe_cnt].pipe.src.hsplit_grp = res_ctx->pipe_ctx[i].pipe_idx; +- if (res_ctx->pipe_ctx[i].top_pipe && res_ctx->pipe_ctx[i].top_pipe->plane_state +- == res_ctx->pipe_ctx[i].plane_state) +- pipes[pipe_cnt].pipe.src.hsplit_grp = res_ctx->pipe_ctx[i].top_pipe->pipe_idx; + + /* todo: default max for now, until there is logic reflecting this in dc*/ + pipes[pipe_cnt].dout.output_bpc = 12; +@@ -1944,14 +1950,6 @@ int dcn20_populate_dml_pipes_from_context( + && 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 = (res_ctx->pipe_ctx[i].bottom_pipe +- && res_ctx->pipe_ctx[i].bottom_pipe->plane_state == pln +- && res_ctx->pipe_ctx[i].bottom_pipe->stream_res.opp +- != res_ctx->pipe_ctx[i].stream_res.opp) +- || (res_ctx->pipe_ctx[i].top_pipe +- && res_ctx->pipe_ctx[i].top_pipe->plane_state == pln +- && res_ctx->pipe_ctx[i].top_pipe->stream_res.opp +- != res_ctx->pipe_ctx[i].stream_res.opp); + 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.y; +-- +2.17.1 + |