OSDN Git Service

drm/amd/display: Mode change with same timing causing long display blank
authorAric Cyr <aric.cyr@amd.com>
Wed, 22 Apr 2020 01:41:25 +0000 (21:41 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 5 May 2020 17:11:06 +0000 (13:11 -0400)
[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>
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
drivers/gpu/drm/amd/display/dc/inc/resource.h

index 1a01c03..cb5d11f 100644 (file)
@@ -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;
index bacf865..17d5cb4 100644 (file)
@@ -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;
 
index 4dea550..2ad1087 100644 (file)
@@ -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;
 
index ca4c36c..109c589 100644 (file)
@@ -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,