| From f25e76f02a3b94c9b80506c6345fd1d9f78ade3a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 7 Jul 2021 13:19:14 -0400 |
| Subject: drm/amd/display: Fix max vstartup calculation for modes with borders |
| |
| From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| |
| [ Upstream commit d7940911fc0754d99b208f0e3098762d39f403a0 ] |
| |
| [Why] |
| Vertical and horizontal borders in timings are treated as increasing the |
| active area - vblank and hblank actually shrink. |
| |
| Our input into DML does not include these borders so it incorrectly |
| assumes it has more time than available for vstartup and tmdl |
| calculations for some modes with borders. |
| |
| An example of such a timing would be 640x480@72Hz: |
| |
| h_total: 832 |
| h_border_left: 8 |
| h_addressable: 640 |
| h_border_right: 8 |
| h_front_porch: 16 |
| h_sync_width: 40 |
| v_total: 520 |
| v_border_top: 8 |
| v_addressable: 480 |
| v_border_bottom: 8 |
| v_front_porch: 1 |
| v_sync_width: 3 |
| pix_clk_100hz: 315000 |
| |
| [How] |
| Include borders as part of destination vactive/hactive. |
| |
| This change DCN20+ so it has wide impact, but the destination vactive |
| and hactive are only really used for vstartup calculation anyway. |
| |
| Most modes do not have vertical or horizontal borders. |
| |
| Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> |
| Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> |
| Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 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 1812ec7ee11b..cfe85ba1018e 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c |
| +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c |
| @@ -2077,8 +2077,10 @@ int dcn20_populate_dml_pipes_from_context( |
| - timing->v_border_bottom; |
| pipes[pipe_cnt].pipe.dest.htotal = timing->h_total; |
| pipes[pipe_cnt].pipe.dest.vtotal = v_total; |
| - pipes[pipe_cnt].pipe.dest.hactive = timing->h_addressable; |
| - pipes[pipe_cnt].pipe.dest.vactive = timing->v_addressable; |
| + pipes[pipe_cnt].pipe.dest.hactive = |
| + timing->h_addressable + timing->h_border_left + timing->h_border_right; |
| + pipes[pipe_cnt].pipe.dest.vactive = |
| + timing->v_addressable + timing->v_border_top + timing->v_border_bottom; |
| pipes[pipe_cnt].pipe.dest.interlaced = timing->flags.INTERLACE; |
| pipes[pipe_cnt].pipe.dest.pixel_rate_mhz = timing->pix_clk_100hz/10000.0; |
| if (timing->timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING) |
| -- |
| 2.30.2 |
| |