drm/amd/display: Add margin for max vblank time for SubVP + DRR
[Description] - Incorporate FW delays as port of max VTOTAL calculated for SubVP + DRR cases (since it is part of the microschedule). - Also add margin for the max VTOTAL possible for SubVP + DRR cases. - Due to rounding errors in FW (integer arithmetic), the microschedule calculation can get pushed to the next frame (incorrectly) in cases where we use the max VTOTAL possible to complete the MCLK switch. - When the rounding error occurs, we are only off by 1-2 lines, use 40us margin which is working consistently. Reviewed-by: Jun Lei <Jun.Lei@amd.com> Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> Acked-by: Alan Liu <HaoPing.Liu@amd.com> Signed-off-by: Alvin Lee <Alvin.Lee2@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
52b5432cd7
commit
964d641632
|
@ -261,6 +261,7 @@ struct dc_caps {
|
|||
uint32_t cache_line_size;
|
||||
uint32_t cache_num_ways;
|
||||
uint16_t subvp_fw_processing_delay_us;
|
||||
uint8_t subvp_drr_max_vblank_margin_us;
|
||||
uint16_t subvp_prefetch_end_to_mall_start_us;
|
||||
uint8_t subvp_swath_height_margin_lines; // subvp start line must be aligned to 2 x swath height
|
||||
uint16_t subvp_pstate_allow_width_us;
|
||||
|
|
|
@ -477,12 +477,20 @@ static void populate_subvp_cmd_drr_info(struct dc *dc,
|
|||
(((uint64_t)main_timing->pix_clk_100hz * 100)));
|
||||
drr_active_us = div64_u64(((uint64_t)drr_timing->v_addressable * drr_timing->h_total * 1000000),
|
||||
(((uint64_t)drr_timing->pix_clk_100hz * 100)));
|
||||
max_drr_vblank_us = div64_u64((subvp_active_us - prefetch_us - drr_active_us), 2) + drr_active_us;
|
||||
max_drr_mallregion_us = subvp_active_us - prefetch_us - mall_region_us;
|
||||
max_drr_vblank_us = div64_u64((subvp_active_us - prefetch_us -
|
||||
dc->caps.subvp_fw_processing_delay_us - drr_active_us), 2) + drr_active_us;
|
||||
max_drr_mallregion_us = subvp_active_us - prefetch_us - mall_region_us - dc->caps.subvp_fw_processing_delay_us;
|
||||
max_drr_supported_us = max_drr_vblank_us > max_drr_mallregion_us ? max_drr_vblank_us : max_drr_mallregion_us;
|
||||
max_vtotal_supported = div64_u64(((uint64_t)drr_timing->pix_clk_100hz * 100 * max_drr_supported_us),
|
||||
(((uint64_t)drr_timing->h_total * 1000000)));
|
||||
|
||||
/* When calculating the max vtotal supported for SubVP + DRR cases, add
|
||||
* margin due to possible rounding errors (being off by 1 line in the
|
||||
* FW calculation can incorrectly push the P-State switch to wait 1 frame
|
||||
* longer).
|
||||
*/
|
||||
max_vtotal_supported = max_vtotal_supported - dc->caps.subvp_drr_max_vblank_margin_us;
|
||||
|
||||
pipe_data->pipe_config.vblank_data.drr_info.min_vtotal_supported = min_vtotal_supported;
|
||||
pipe_data->pipe_config.vblank_data.drr_info.max_vtotal_supported = max_vtotal_supported;
|
||||
}
|
||||
|
|
|
@ -2117,6 +2117,7 @@ static bool dcn32_resource_construct(
|
|||
dc->caps.cache_num_ways = 16;
|
||||
dc->caps.max_cab_allocation_bytes = 67108864; // 64MB = 1024 * 1024 * 64
|
||||
dc->caps.subvp_fw_processing_delay_us = 15;
|
||||
dc->caps.subvp_drr_max_vblank_margin_us = 40;
|
||||
dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
|
||||
dc->caps.subvp_swath_height_margin_lines = 16;
|
||||
dc->caps.subvp_pstate_allow_width_us = 20;
|
||||
|
|
|
@ -1704,6 +1704,7 @@ static bool dcn321_resource_construct(
|
|||
dc->caps.cache_num_ways = 16;
|
||||
dc->caps.max_cab_allocation_bytes = 33554432; // 32MB = 1024 * 1024 * 32
|
||||
dc->caps.subvp_fw_processing_delay_us = 15;
|
||||
dc->caps.subvp_drr_max_vblank_margin_us = 40;
|
||||
dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
|
||||
dc->caps.subvp_swath_height_margin_lines = 16;
|
||||
dc->caps.subvp_pstate_allow_width_us = 20;
|
||||
|
|
Loading…
Reference in New Issue