drm/amd/display: fix seamless boot stream adding algorithm
authorRaymond Yang <rayyang@amd.com>
Thu, 17 Dec 2020 01:24:30 +0000 (09:24 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 14 Jan 2021 04:44:06 +0000 (23:44 -0500)
[Why]
Seamless boot stream has hw resource assigned, already.  'add' is
actually rebuild the assignment.

[How]
Swap seamless boot stream to pipe 0 (if needed) to ensure pipe_ctx
matches

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Raymond Yang <rayyang@amd.com>
Reviewed-by: Martin Leung <Martin.Leung@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_resource.c

index 07c2255..3e9ab04 100644 (file)
@@ -2075,6 +2075,20 @@ static int acquire_resource_from_hw_enabled_state(
        return -1;
 }
 
+static void mark_seamless_boot_stream(
+               const struct dc  *dc,
+               struct dc_stream_state *stream)
+{
+       struct dc_bios *dcb = dc->ctx->dc_bios;
+
+       /* TODO: Check Linux */
+       if (dc->config.allow_seamless_boot_optimization &&
+                       !dcb->funcs->is_accelerated_mode(dcb)) {
+               if (dc_validate_seamless_boot_timing(dc, stream->sink, &stream->timing))
+                       stream->apply_seamless_boot_optimization = true;
+       }
+}
+
 enum dc_status resource_map_pool_resources(
                const struct dc  *dc,
                struct dc_state *context,
@@ -2085,22 +2099,20 @@ enum dc_status resource_map_pool_resources(
        struct dc_context *dc_ctx = dc->ctx;
        struct pipe_ctx *pipe_ctx = NULL;
        int pipe_idx = -1;
-       struct dc_bios *dcb = dc->ctx->dc_bios;
 
        calculate_phy_pix_clks(stream);
 
-       /* TODO: Check Linux */
-       if (dc->config.allow_seamless_boot_optimization &&
-                       !dcb->funcs->is_accelerated_mode(dcb)) {
-               if (dc_validate_seamless_boot_timing(dc, stream->sink, &stream->timing))
-                       stream->apply_seamless_boot_optimization = true;
-       }
+       mark_seamless_boot_stream(dc, stream);
 
-       if (stream->apply_seamless_boot_optimization)
+       if (stream->apply_seamless_boot_optimization) {
                pipe_idx = acquire_resource_from_hw_enabled_state(
                                &context->res_ctx,
                                pool,
                                stream);
+               if (pipe_idx < 0)
+                       /* hw resource was assigned to other stream */
+                       stream->apply_seamless_boot_optimization = false;
+       }
 
        if (pipe_idx < 0)
                /* acquire new resources */