| From be2cf4aa4b228854ea43ceb55bb4d205cb2ef1ec Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 25 Apr 2023 14:29:48 -0400 |
| Subject: drm/amd/display: Fix possible underflow for displays with large |
| vblank |
| |
| From: Daniel Miess <daniel.miess@amd.com> |
| |
| [ Upstream commit 1a4bcdbea4319efeb26cc4b05be859a7867e02dc ] |
| |
| [Why] |
| Underflow observed when using a display with a large vblank region |
| and low refresh rate |
| |
| [How] |
| Simplify calculation of vblank_nom |
| |
| Increase value for VBlankNomDefaultUS to 800us |
| |
| Reviewed-by: Jun Lei <jun.lei@amd.com> |
| Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com> |
| Signed-off-by: Daniel Miess <daniel.miess@amd.com> |
| Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Stable-dep-of: 2a9482e55968 ("drm/amd/display: Prevent vtotal from being set to 0") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../amd/display/dc/dml/dcn314/dcn314_fpu.c | 19 +++++++------------ |
| 1 file changed, 7 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c |
| index 395eed9f6b1be..a2a32cb9d5710 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c |
| +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c |
| @@ -32,7 +32,7 @@ |
| #include "dml/display_mode_vba.h" |
| |
| struct _vcs_dpi_ip_params_st dcn3_14_ip = { |
| - .VBlankNomDefaultUS = 668, |
| + .VBlankNomDefaultUS = 800, |
| .gpuvm_enable = 1, |
| .gpuvm_max_page_table_levels = 1, |
| .hostvm_enable = 1, |
| @@ -288,7 +288,7 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c |
| struct resource_context *res_ctx = &context->res_ctx; |
| struct pipe_ctx *pipe; |
| bool upscaled = false; |
| - bool isFreesyncVideo = false; |
| + const unsigned int max_allowed_vblank_nom = 1023; |
| |
| dc_assert_fp_enabled(); |
| |
| @@ -302,16 +302,11 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c |
| pipe = &res_ctx->pipe_ctx[i]; |
| timing = &pipe->stream->timing; |
| |
| - isFreesyncVideo = pipe->stream->adjust.v_total_max == pipe->stream->adjust.v_total_min; |
| - isFreesyncVideo = isFreesyncVideo && pipe->stream->adjust.v_total_min > timing->v_total; |
| - |
| - if (!isFreesyncVideo) { |
| - pipes[pipe_cnt].pipe.dest.vblank_nom = |
| - dcn3_14_ip.VBlankNomDefaultUS / (timing->h_total / (timing->pix_clk_100hz / 10000.0)); |
| - } else { |
| - pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; |
| - pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - pipes[pipe_cnt].pipe.dest.vactive; |
| - } |
| + pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; |
| + pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - pipes[pipe_cnt].pipe.dest.vactive; |
| + pipes[pipe_cnt].pipe.dest.vblank_nom = min(pipes[pipe_cnt].pipe.dest.vblank_nom, dcn3_14_ip.VBlankNomDefaultUS); |
| + pipes[pipe_cnt].pipe.dest.vblank_nom = max(pipes[pipe_cnt].pipe.dest.vblank_nom, timing->v_sync_width); |
| + pipes[pipe_cnt].pipe.dest.vblank_nom = min(pipes[pipe_cnt].pipe.dest.vblank_nom, max_allowed_vblank_nom); |
| |
| if (pipe->plane_state && |
| (pipe->plane_state->src_rect.height < pipe->plane_state->dst_rect.height || |
| -- |
| 2.39.2 |
| |