drm/amd/display: fix odm stream release
authorDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Tue, 6 Aug 2019 20:09:07 +0000 (16:09 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 23 Aug 2019 16:42:44 +0000 (11:42 -0500)
Need to memset all odm pipes when calling dc_remove_stream_from_ctx

Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_resource.c

index ac908141b3950a44f9c6d641836b7a381f4b5d10..f7d8edc9cd021ac8af446d43aa478a4d1304f58a 100644 (file)
@@ -1114,13 +1114,12 @@ struct pipe_ctx *resource_get_head_pipe_for_stream(
                struct dc_stream_state *stream)
 {
        int i;
+
        for (i = 0; i < MAX_PIPES; i++) {
                if (res_ctx->pipe_ctx[i].stream == stream
                                && !res_ctx->pipe_ctx[i].top_pipe
-                               && !res_ctx->pipe_ctx[i].prev_odm_pipe) {
+                               && !res_ctx->pipe_ctx[i].prev_odm_pipe)
                        return &res_ctx->pipe_ctx[i];
-                       break;
-               }
        }
        return NULL;
 }
@@ -1697,45 +1696,45 @@ enum dc_status dc_remove_stream_from_ctx(
 {
        int i;
        struct dc_context *dc_ctx = dc->ctx;
-       struct pipe_ctx *del_pipe = NULL;
+       struct pipe_ctx *del_pipe = resource_get_head_pipe_for_stream(&new_ctx->res_ctx, stream);
+       struct pipe_ctx *odm_pipe;
 
-       /* Release primary pipe */
-       for (i = 0; i < MAX_PIPES; i++) {
-               if (new_ctx->res_ctx.pipe_ctx[i].stream == stream &&
-                               !new_ctx->res_ctx.pipe_ctx[i].top_pipe) {
-                       del_pipe = &new_ctx->res_ctx.pipe_ctx[i];
+       if (!del_pipe) {
+               DC_ERROR("Pipe not found for stream %p !\n", stream);
+               return DC_ERROR_UNEXPECTED;
+       }
 
-                       ASSERT(del_pipe->stream_res.stream_enc);
-                       update_stream_engine_usage(
-                                       &new_ctx->res_ctx,
-                                               dc->res_pool,
-                                       del_pipe->stream_res.stream_enc,
-                                       false);
+       odm_pipe = del_pipe->next_odm_pipe;
 
-                       if (del_pipe->stream_res.audio)
-                               update_audio_usage(
-                                       &new_ctx->res_ctx,
-                                       dc->res_pool,
-                                       del_pipe->stream_res.audio,
-                                       false);
+       /* Release primary pipe */
+       ASSERT(del_pipe->stream_res.stream_enc);
+       update_stream_engine_usage(
+                       &new_ctx->res_ctx,
+                               dc->res_pool,
+                       del_pipe->stream_res.stream_enc,
+                       false);
 
-                       resource_unreference_clock_source(&new_ctx->res_ctx,
-                                                         dc->res_pool,
-                                                         del_pipe->clock_source);
+       if (del_pipe->stream_res.audio)
+               update_audio_usage(
+                       &new_ctx->res_ctx,
+                       dc->res_pool,
+                       del_pipe->stream_res.audio,
+                       false);
 
-                       if (dc->res_pool->funcs->remove_stream_from_ctx)
-                               dc->res_pool->funcs->remove_stream_from_ctx(dc, new_ctx, stream);
+       resource_unreference_clock_source(&new_ctx->res_ctx,
+                                         dc->res_pool,
+                                         del_pipe->clock_source);
 
-                       memset(del_pipe, 0, sizeof(*del_pipe));
+       if (dc->res_pool->funcs->remove_stream_from_ctx)
+               dc->res_pool->funcs->remove_stream_from_ctx(dc, new_ctx, stream);
 
-                       break;
-               }
-       }
+       while (odm_pipe) {
+               struct pipe_ctx *next_odm_pipe = odm_pipe->next_odm_pipe;
 
-       if (!del_pipe) {
-               DC_ERROR("Pipe not found for stream %p !\n", stream);
-               return DC_ERROR_UNEXPECTED;
+               memset(odm_pipe, 0, sizeof(*odm_pipe));
+               odm_pipe = next_odm_pipe;
        }
+       memset(del_pipe, 0, sizeof(*del_pipe));
 
        for (i = 0; i < new_ctx->stream_count; i++)
                if (new_ctx->streams[i] == stream)