From: Dmytro Laktyushkin <dmytro.laktyush...@amd.com>

Need to memset all odm pipes when calling dc_remove_stream_from_ctx

Signed-off-by: Dmytro Laktyushkin <dmytro.laktyush...@amd.com>
Reviewed-by: Charlene Liu <charlene....@amd.com>
Acked-by: Bhawanpreet Lakha <bhawanpreet.la...@amd.com>
---
 .../gpu/drm/amd/display/dc/core/dc_resource.c | 65 +++++++++----------
 1 file changed, 32 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 953ba4d02a1e..6e88cb0fffce 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1111,13 +1111,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;
 }
@@ -1694,45 +1693,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)
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to