drm/amd/display: Initialise encoder assignment when initialising dc_state
authorJimmy Kizito <Jimmy.Kizito@amd.com>
Thu, 4 Nov 2021 20:52:14 +0000 (16:52 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 17 Nov 2021 21:58:10 +0000 (16:58 -0500)
[Why]
Link encoder assignment tracking variables need to be (re)initialised
whenever dc_state is (re)initialised. Otherwise variables used for
dynamic encoder assignment (especially the link encoder availability
pool) are out of sync with dc_state and future encoder assignments are
invalid.

[How]
Initialise encoder assignment variables when creating new dc_state
resource.

Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Anson Jacob <Anson.Jacob@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Jimmy Kizito <Jimmy.Kizito@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/core/dc_link_enc_cfg.c
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/inc/link_enc_cfg.h

index e76a2aa65a82c28565f79c3fc69b7d674700daef..39ad3854bfe44398052f6058686b7dcb310e5167 100644 (file)
@@ -1016,8 +1016,6 @@ static bool dc_construct(struct dc *dc,
                goto fail;
        }
 
-       dc_resource_state_construct(dc, dc->current_state);
-
        if (!create_links(dc, init_params->num_virtual_links))
                goto fail;
 
@@ -1027,8 +1025,7 @@ static bool dc_construct(struct dc *dc,
        if (!create_link_encoders(dc))
                goto fail;
 
-       /* Initialise DIG link encoder resource tracking variables. */
-       link_enc_cfg_init(dc, dc->current_state);
+       dc_resource_state_construct(dc, dc->current_state);
 
        return true;
 
index 787aaa661a29d48355e0c723012b773ad4b4d171..d3c789f26a022a6e7727f6f3cbe0858027656e9c 100644 (file)
@@ -242,7 +242,7 @@ 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 *dc, struct dc_state *state)
+static void clear_enc_assignments(const struct dc *dc, struct dc_state *state)
 {
        int i;
 
@@ -261,7 +261,7 @@ static void clear_enc_assignments(struct dc *dc, struct dc_state *state)
 }
 
 void link_enc_cfg_init(
-               struct dc *dc,
+               const struct dc *dc,
                struct dc_state *state)
 {
        clear_enc_assignments(dc, state);
index c32fdccd4d925c96b4f1bda165453d29a0340feb..fabe1b83bd4f39f8f53c6d739a7a7227b8b1029a 100644 (file)
@@ -2224,6 +2224,9 @@ void dc_resource_state_construct(
                struct dc_state *dst_ctx)
 {
        dst_ctx->clk_mgr = dc->clk_mgr;
+
+       /* Initialise DIG link encoder resource tracking variables. */
+       link_enc_cfg_init(dc, dst_ctx);
 }
 
 
index 10dcf6a5e9b15715ebed95702294cfce8bd822e7..a4e43b4826e0e7b9fde11d2c4091bb9f71fe5fbf 100644 (file)
@@ -36,7 +36,7 @@
  * Initialise link encoder resource tracking.
  */
 void link_enc_cfg_init(
-               struct dc *dc,
+               const struct dc *dc,
                struct dc_state *state);
 
 /*