mirror of https://gitee.com/openkylin/linux.git
drm/amd/display: Mode change with same timing causing long display blank
[Why] What a mode change is requested for the same timing a full stream reset can occur in some cases which causes monitor to blank for a few seconds. [How] Do not consider infoframe updates as needing a full stream reset as they will be handled on the first flip after a modeset when surface information is available. Signed-off-by: Aric Cyr <aric.cyr@amd.com> Reviewed-by: Anthony Koo <Anthony.Koo@amd.com> Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
e9a135a969
commit
8c076bc8d7
|
@ -1547,35 +1547,6 @@ bool dc_add_all_planes_for_stream(
|
|||
return add_all_planes_for_stream(dc, stream, &set, 1, context);
|
||||
}
|
||||
|
||||
|
||||
static bool is_hdr_static_meta_changed(struct dc_stream_state *cur_stream,
|
||||
struct dc_stream_state *new_stream)
|
||||
{
|
||||
if (cur_stream == NULL)
|
||||
return true;
|
||||
|
||||
if (memcmp(&cur_stream->hdr_static_metadata,
|
||||
&new_stream->hdr_static_metadata,
|
||||
sizeof(struct dc_info_packet)) != 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_vsc_info_packet_changed(struct dc_stream_state *cur_stream,
|
||||
struct dc_stream_state *new_stream)
|
||||
{
|
||||
if (cur_stream == NULL)
|
||||
return true;
|
||||
|
||||
if (memcmp(&cur_stream->vsc_infopacket,
|
||||
&new_stream->vsc_infopacket,
|
||||
sizeof(struct dc_info_packet)) != 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_timing_changed(struct dc_stream_state *cur_stream,
|
||||
struct dc_stream_state *new_stream)
|
||||
{
|
||||
|
@ -1610,15 +1581,9 @@ static bool are_stream_backends_same(
|
|||
if (is_timing_changed(stream_a, stream_b))
|
||||
return false;
|
||||
|
||||
if (is_hdr_static_meta_changed(stream_a, stream_b))
|
||||
return false;
|
||||
|
||||
if (stream_a->dpms_off != stream_b->dpms_off)
|
||||
return false;
|
||||
|
||||
if (is_vsc_info_packet_changed(stream_a, stream_b))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1758,21 +1723,6 @@ static struct audio *find_first_free_audio(
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool resource_is_stream_unchanged(
|
||||
struct dc_state *old_context, struct dc_stream_state *stream)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < old_context->stream_count; i++) {
|
||||
struct dc_stream_state *old_stream = old_context->streams[i];
|
||||
|
||||
if (are_stream_backends_same(old_stream, stream))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* dc_add_stream_to_ctx() - Add a new dc_stream_state to a dc_state.
|
||||
*/
|
||||
|
@ -2027,17 +1977,6 @@ enum dc_status resource_map_pool_resources(
|
|||
int pipe_idx = -1;
|
||||
struct dc_bios *dcb = dc->ctx->dc_bios;
|
||||
|
||||
/* TODO Check if this is needed */
|
||||
/*if (!resource_is_stream_unchanged(old_context, stream)) {
|
||||
if (stream != NULL && old_context->streams[i] != NULL) {
|
||||
stream->bit_depth_params =
|
||||
old_context->streams[i]->bit_depth_params;
|
||||
stream->clamping = old_context->streams[i]->clamping;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
calculate_phy_pix_clks(stream);
|
||||
|
||||
/* TODO: Check Linux */
|
||||
|
@ -2720,15 +2659,9 @@ bool pipe_need_reprogram(
|
|||
if (is_timing_changed(pipe_ctx_old->stream, pipe_ctx->stream))
|
||||
return true;
|
||||
|
||||
if (is_hdr_static_meta_changed(pipe_ctx_old->stream, pipe_ctx->stream))
|
||||
return true;
|
||||
|
||||
if (pipe_ctx_old->stream->dpms_off != pipe_ctx->stream->dpms_off)
|
||||
return true;
|
||||
|
||||
if (is_vsc_info_packet_changed(pipe_ctx_old->stream, pipe_ctx->stream))
|
||||
return true;
|
||||
|
||||
if (false == pipe_ctx_old->stream->link->link_state_valid &&
|
||||
false == pipe_ctx_old->stream->dpms_off)
|
||||
return true;
|
||||
|
|
|
@ -1121,24 +1121,6 @@ static enum dc_status build_mapped_resource(
|
|||
{
|
||||
struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
|
||||
|
||||
/*TODO Seems unneeded anymore */
|
||||
/* if (old_context && resource_is_stream_unchanged(old_context, stream)) {
|
||||
if (stream != NULL && old_context->streams[i] != NULL) {
|
||||
todo: shouldn't have to copy missing parameter here
|
||||
resource_build_bit_depth_reduction_params(stream,
|
||||
&stream->bit_depth_params);
|
||||
stream->clamping.pixel_encoding =
|
||||
stream->timing.pixel_encoding;
|
||||
|
||||
resource_build_bit_depth_reduction_params(stream,
|
||||
&stream->bit_depth_params);
|
||||
build_clamping_params(stream);
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if (!pipe_ctx)
|
||||
return DC_ERROR_UNEXPECTED;
|
||||
|
||||
|
|
|
@ -1653,24 +1653,6 @@ enum dc_status dcn20_build_mapped_resource(const struct dc *dc, struct dc_state
|
|||
enum dc_status status = DC_OK;
|
||||
struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
|
||||
|
||||
/*TODO Seems unneeded anymore */
|
||||
/* if (old_context && resource_is_stream_unchanged(old_context, stream)) {
|
||||
if (stream != NULL && old_context->streams[i] != NULL) {
|
||||
todo: shouldn't have to copy missing parameter here
|
||||
resource_build_bit_depth_reduction_params(stream,
|
||||
&stream->bit_depth_params);
|
||||
stream->clamping.pixel_encoding =
|
||||
stream->timing.pixel_encoding;
|
||||
|
||||
resource_build_bit_depth_reduction_params(stream,
|
||||
&stream->bit_depth_params);
|
||||
build_clamping_params(stream);
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if (!pipe_ctx)
|
||||
return DC_ERROR_UNEXPECTED;
|
||||
|
||||
|
|
|
@ -138,9 +138,6 @@ struct pipe_ctx *find_idle_secondary_pipe(
|
|||
const struct resource_pool *pool,
|
||||
const struct pipe_ctx *primary_pipe);
|
||||
|
||||
bool resource_is_stream_unchanged(
|
||||
struct dc_state *old_context, struct dc_stream_state *stream);
|
||||
|
||||
bool resource_validate_attach_surfaces(
|
||||
const struct dc_validation_set set[],
|
||||
int set_count,
|
||||
|
|
Loading…
Reference in New Issue