Commit ae7169a9 authored by Alvin Lee's avatar Alvin Lee Committed by Alex Deucher

drm/amd/display: Add margin on DRR vblank start for subvp

[Description]
- Add margin for HUBP "jitter" for SubVp + DRR case
- Also do a min transition even if MPO is added on a
  non SubVP pipe (i.e. added on DRR pipe for SubVP + DRR)
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarBrian Chang <Brian.Chang@amd.com>
Signed-off-by: default avatarAlvin Lee <Alvin.Lee2@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2aae5944
...@@ -3740,6 +3740,8 @@ static bool could_mpcc_tree_change_for_active_pipes(struct dc *dc, ...@@ -3740,6 +3740,8 @@ static bool could_mpcc_tree_change_for_active_pipes(struct dc *dc,
struct dc_stream_status *cur_stream_status = stream_get_status(dc->current_state, stream); struct dc_stream_status *cur_stream_status = stream_get_status(dc->current_state, stream);
bool force_minimal_pipe_splitting = false; bool force_minimal_pipe_splitting = false;
bool subvp_active = false;
uint32_t i;
*is_plane_addition = false; *is_plane_addition = false;
...@@ -3771,11 +3773,25 @@ static bool could_mpcc_tree_change_for_active_pipes(struct dc *dc, ...@@ -3771,11 +3773,25 @@ static bool could_mpcc_tree_change_for_active_pipes(struct dc *dc,
} }
} }
for (i = 0; i < dc->res_pool->pipe_count; i++) {
struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i];
if (pipe->stream && pipe->stream->mall_stream_config.type != SUBVP_NONE) {
subvp_active = true;
break;
}
}
/* For SubVP when adding or removing planes we need to add a minimal transition /* For SubVP when adding or removing planes we need to add a minimal transition
* (even when disabling all planes). Whenever disabling a phantom pipe, we * (even when disabling all planes). Whenever disabling a phantom pipe, we
* must use the minimal transition path to disable the pipe correctly. * must use the minimal transition path to disable the pipe correctly.
*
* We want to use the minimal transition whenever subvp is active, not only if
* a plane is being added / removed from a subvp stream (MPO plane can be added
* to a DRR pipe of SubVP + DRR config, in which case we still want to run through
* a min transition to disable subvp.
*/ */
if (cur_stream_status && stream->mall_stream_config.type == SUBVP_MAIN) { if (cur_stream_status && subvp_active) {
/* determine if minimal transition is required due to SubVP*/ /* determine if minimal transition is required due to SubVP*/
if (cur_stream_status->plane_count > surface_count) { if (cur_stream_status->plane_count > surface_count) {
force_minimal_pipe_splitting = true; force_minimal_pipe_splitting = true;
......
...@@ -267,6 +267,7 @@ struct dc_caps { ...@@ -267,6 +267,7 @@ struct dc_caps {
uint16_t subvp_pstate_allow_width_us; uint16_t subvp_pstate_allow_width_us;
uint16_t subvp_vertical_int_margin_us; uint16_t subvp_vertical_int_margin_us;
bool seamless_odm; bool seamless_odm;
uint8_t subvp_drr_vblank_start_margin_us;
}; };
struct dc_bug_wa { struct dc_bug_wa {
......
...@@ -493,6 +493,7 @@ static void populate_subvp_cmd_drr_info(struct dc *dc, ...@@ -493,6 +493,7 @@ static void populate_subvp_cmd_drr_info(struct dc *dc,
pipe_data->pipe_config.vblank_data.drr_info.min_vtotal_supported = min_vtotal_supported; 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; pipe_data->pipe_config.vblank_data.drr_info.max_vtotal_supported = max_vtotal_supported;
pipe_data->pipe_config.vblank_data.drr_info.drr_vblank_start_margin = dc->caps.subvp_drr_vblank_start_margin_us;
} }
/** /**
......
...@@ -144,7 +144,7 @@ struct test_pattern { ...@@ -144,7 +144,7 @@ struct test_pattern {
unsigned int cust_pattern_size; unsigned int cust_pattern_size;
}; };
#define SUBVP_DRR_MARGIN_US 500 // 500us for DRR margin (SubVP + DRR) #define SUBVP_DRR_MARGIN_US 600 // 600us for DRR margin (SubVP + DRR)
enum mall_stream_type { enum mall_stream_type {
SUBVP_NONE, // subvp not in use SUBVP_NONE, // subvp not in use
......
...@@ -2124,6 +2124,7 @@ static bool dcn32_resource_construct( ...@@ -2124,6 +2124,7 @@ static bool dcn32_resource_construct(
dc->caps.subvp_swath_height_margin_lines = 16; dc->caps.subvp_swath_height_margin_lines = 16;
dc->caps.subvp_pstate_allow_width_us = 20; dc->caps.subvp_pstate_allow_width_us = 20;
dc->caps.subvp_vertical_int_margin_us = 30; dc->caps.subvp_vertical_int_margin_us = 30;
dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin
dc->caps.max_slave_planes = 2; dc->caps.max_slave_planes = 2;
dc->caps.max_slave_yuv_planes = 2; dc->caps.max_slave_yuv_planes = 2;
......
...@@ -1711,6 +1711,7 @@ static bool dcn321_resource_construct( ...@@ -1711,6 +1711,7 @@ static bool dcn321_resource_construct(
dc->caps.subvp_swath_height_margin_lines = 16; dc->caps.subvp_swath_height_margin_lines = 16;
dc->caps.subvp_pstate_allow_width_us = 20; dc->caps.subvp_pstate_allow_width_us = 20;
dc->caps.subvp_vertical_int_margin_us = 30; dc->caps.subvp_vertical_int_margin_us = 30;
dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin
dc->caps.max_slave_planes = 1; dc->caps.max_slave_planes = 1;
dc->caps.max_slave_yuv_planes = 1; dc->caps.max_slave_yuv_planes = 1;
dc->caps.max_slave_rgb_planes = 1; dc->caps.max_slave_rgb_planes = 1;
......
...@@ -1029,13 +1029,14 @@ struct dmub_cmd_fw_assisted_mclk_switch_pipe_data_v2 { ...@@ -1029,13 +1029,14 @@ struct dmub_cmd_fw_assisted_mclk_switch_pipe_data_v2 {
uint16_t vtotal; uint16_t vtotal;
uint16_t htotal; uint16_t htotal;
uint8_t vblank_pipe_index; uint8_t vblank_pipe_index;
uint8_t padding[2]; uint8_t padding[1];
struct { struct {
uint8_t drr_in_use; uint8_t drr_in_use;
uint8_t drr_window_size_ms; // Indicates largest VMIN/VMAX adjustment per frame uint8_t drr_window_size_ms; // Indicates largest VMIN/VMAX adjustment per frame
uint16_t min_vtotal_supported; // Min VTOTAL that supports switching in VBLANK uint16_t min_vtotal_supported; // Min VTOTAL that supports switching in VBLANK
uint16_t max_vtotal_supported; // Max VTOTAL that can support SubVP static scheduling uint16_t max_vtotal_supported; // Max VTOTAL that can support SubVP static scheduling
uint8_t use_ramping; // Use ramping or not uint8_t use_ramping; // Use ramping or not
uint8_t drr_vblank_start_margin;
} drr_info; // DRR considered as part of SubVP + VBLANK case } drr_info; // DRR considered as part of SubVP + VBLANK case
} vblank_data; } vblank_data;
} pipe_config; } pipe_config;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment