]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/amd/display: Clear encoder assignments when state cleared.
authorJimmy Kizito <Jimmy.Kizito@amd.com>
Tue, 17 May 2022 08:28:00 +0000 (10:28 +0200)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Tue, 31 May 2022 16:30:51 +0000 (18:30 +0200)
BugLink: https://bugs.launchpad.net/bugs/1971417
[Why]
State can be cleared without removing individual streams (by
calling dc_remove_stream_from_ctx()). This can leave the
encoder assignment module in an incoherent state and cause
future assignments to be incorrect.

[How]
Clear encoder assignments when committing 0 streams or
re-initializing hardware.

Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Jimmy Kizito <Jimmy.Kizito@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 589bd2f03f87563d6dc4f480d47e5aabc09e4784)
Signed-off-by: Koba Ko <koba.ko@canonical.com>
Acked-by: Tim Gardner <tim.gardner@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
drivers/gpu/drm/amd/display/dc/core/dc_link_enc_cfg.c

index 4dce25c39b7569c8efee7df0a26dfb5e1fd13d66..95c60c8a038ff5d2db044ac42258365ad3aa8adf 100644 (file)
@@ -223,6 +223,23 @@ static struct link_encoder *get_link_enc_used_by_link(
 
        return link_enc;
 }
+/* Clear all link encoder assignments. */
+static void clear_enc_assignments(struct dc_state *state)
+{
+       int i;
+       enum engine_id eng_id;
+       struct dc_stream_state *stream;
+
+       for (i = 0; i < MAX_PIPES; i++) {
+               state->res_ctx.link_enc_cfg_ctx.link_enc_assignments[i].valid = false;
+               eng_id = state->res_ctx.link_enc_cfg_ctx.link_enc_assignments[i].eng_id;
+               stream = state->res_ctx.link_enc_cfg_ctx.link_enc_assignments[i].stream;
+               if (eng_id != ENGINE_ID_UNKNOWN)
+                       state->res_ctx.link_enc_cfg_ctx.link_enc_avail[eng_id - ENGINE_ID_DIGA] = eng_id;
+               if (stream)
+                       stream->link_enc = NULL;
+       }
+}
 
 void link_enc_cfg_init(
                struct dc *dc,
@@ -237,6 +254,8 @@ void link_enc_cfg_init(
                        state->res_ctx.link_enc_cfg_ctx.link_enc_avail[i] = ENGINE_ID_UNKNOWN;
        }
 
+       clear_enc_assignments(state);
+
        state->res_ctx.link_enc_cfg_ctx.mode = LINK_ENC_CFG_STEADY;
 }
 
@@ -252,6 +271,9 @@ void link_enc_cfg_link_encs_assign(
 
        ASSERT(state->stream_count == stream_count);
 
+       if (stream_count == 0)
+               clear_enc_assignments(state);
+
        /* Release DIG link encoder resources before running assignment algorithm. */
        for (i = 0; i < stream_count; i++)
                dc->res_pool->funcs->link_enc_unassign(state, streams[i]);