drm/amd/display: Correct unit conversion for vstartup
[Why] vstartup is calculated to be a large number. It works because it is within vertical blank, but it reduces region of blank that can be used for power gating. [How] Calculation needs to convert micro seconds to number of vertical lines. Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Acked-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Reza Amini <reza.amini@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
4012e0917b
commit
dbd29029c7
1 changed files with 24 additions and 1 deletions
|
@ -31,6 +31,7 @@
|
|||
#include "dml/dcn20/dcn20_fpu.h"
|
||||
#include "dml/dcn31/dcn31_fpu.h"
|
||||
#include "dml/display_mode_vba.h"
|
||||
#include "dml/dml_inline_defs.h"
|
||||
|
||||
struct _vcs_dpi_ip_params_st dcn3_14_ip = {
|
||||
.VBlankNomDefaultUS = 668,
|
||||
|
@ -273,6 +274,25 @@ static bool is_dual_plane(enum surface_pixel_format format)
|
|||
return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
|
||||
}
|
||||
|
||||
/*
|
||||
* micro_sec_to_vert_lines () - converts time to number of vertical lines for a given timing
|
||||
*
|
||||
* @param: num_us: number of microseconds
|
||||
* @return: number of vertical lines. If exact number of vertical lines is not found then
|
||||
* it will round up to next number of lines to guarantee num_us
|
||||
*/
|
||||
static unsigned int micro_sec_to_vert_lines(unsigned int num_us, struct dc_crtc_timing *timing)
|
||||
{
|
||||
unsigned int num_lines = 0;
|
||||
unsigned int lines_time_in_ns = 1000.0 *
|
||||
(((float)timing->h_total * 1000.0) /
|
||||
((float)timing->pix_clk_100hz / 10.0));
|
||||
|
||||
num_lines = dml_ceil(1000.0 * num_us / lines_time_in_ns, 1.0);
|
||||
|
||||
return num_lines;
|
||||
}
|
||||
|
||||
int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
|
@ -289,19 +309,22 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c
|
|||
|
||||
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct dc_crtc_timing *timing;
|
||||
unsigned int num_lines = 0;
|
||||
|
||||
if (!res_ctx->pipe_ctx[i].stream)
|
||||
continue;
|
||||
pipe = &res_ctx->pipe_ctx[i];
|
||||
timing = &pipe->stream->timing;
|
||||
|
||||
num_lines = micro_sec_to_vert_lines(dcn3_14_ip.VBlankNomDefaultUS, timing);
|
||||
|
||||
if (pipe->stream->adjust.v_total_min != 0)
|
||||
pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min;
|
||||
else
|
||||
pipes[pipe_cnt].pipe.dest.vtotal = timing->v_total;
|
||||
|
||||
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 = min(pipes[pipe_cnt].pipe.dest.vblank_nom, num_lines);
|
||||
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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue