drm/amd/display: Free phantom plane and stream properly
authorAlvin Lee <Alvin.Lee2@amd.com>
Fri, 12 Aug 2022 03:24:19 +0000 (23:24 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 25 Aug 2022 17:34:40 +0000 (13:34 -0400)
[Description]
Refcount is incremented on allocation and
when adding to the context. Therefore we must
release the phantom plane and stream after
removing from the context.

Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Brian Chang <Brian.Chang@amd.com>
Signed-off-by: Alvin Lee <Alvin.Lee2@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c

index d4fe7e9..ef0a6d4 100644 (file)
@@ -1737,13 +1737,26 @@ bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context)
 {
        int i;
        bool removed_pipe = false;
+       struct dc_plane_state *phantom_plane = NULL;
+       struct dc_stream_state *phantom_stream = NULL;
 
        for (i = 0; i < dc->res_pool->pipe_count; i++) {
                struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
                // build scaling params for phantom pipes
                if (pipe->plane_state && pipe->stream && pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
+                       phantom_plane = pipe->plane_state;
+                       phantom_stream = pipe->stream;
+
                        dc_rem_all_planes_for_stream(dc, pipe->stream, context);
                        dc_remove_stream_from_ctx(dc, context, pipe->stream);
+
+                       /* Ref count is incremented on allocation and also when added to the context.
+                        * Therefore we must call release for the the phantom plane and stream once
+                        * they are removed from the ctx to finally decrement the refcount to 0 to free.
+                        */
+                       dc_plane_state_release(phantom_plane);
+                       dc_stream_release(phantom_stream);
+
                        removed_pipe = true;
                }