]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Re-check seamless boot can be enabled or not
authorPaul Hsieh <Paul.Hsieh@amd.com>
Thu, 30 Oct 2025 04:17:53 +0000 (12:17 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 18 Nov 2025 15:50:18 +0000 (10:50 -0500)
[Why]
If the seamless boot feature has already been enabled, and
dc_commit_streams is called again before receiving a flip, the
driver will adjust the engine clock without turning off the screen,
which will cause garbage to occur. However, in reality, the Pixel
Clock from the first dc_commit_streams and the second dc_commit_streams
are different.

[How]
If the apply seamless boot flag in the previous stream has not been
cleared, and dc_commit_streams is received again, we need to recheck
whether seamless boot should be disabled

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Paul Hsieh <Paul.Hsieh@amd.com>
Signed-off-by: Ivan Lipski <ivan.lipski@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c

index 0da36b5f555683fa9478fe1595a0b6204898a1e8..5b8b55c1dc68bfe464b7d7f069c2c4f88fb02e55 100644 (file)
@@ -2147,6 +2147,14 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
        if (!dcb->funcs->is_accelerated_mode(dcb)) {
                disable_vbios_mode_if_required(dc, context);
                dc->hwss.enable_accelerated_mode(dc, context);
+       } else if (get_seamless_boot_stream_count(dc->current_state) > 0) {
+               /* If the previous Stream still retains the apply seamless boot flag,
+                * it means the OS has not actually performed a flip yet.
+                * At this point, if we receive dc_commit_streams again, we should
+                * once more check whether the actual HW timing matches what the OS
+                * has provided
+                */
+               disable_vbios_mode_if_required(dc, context);
        }
 
        if (dc->hwseq->funcs.wait_for_pipe_update_if_needed) {