]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amdgpu/display: use blanked rather than plane state for sync groups
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 2 Jun 2020 21:22:48 +0000 (17:22 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Jun 2020 15:49:18 +0000 (17:49 +0200)
commit b7f839d292948142eaab77cedd031aad0bfec872 upstream.

We may end up with no planes set yet, depending on the ordering, but we
should have the proper blanking state which is either handled by either
DPG or TG depending on the hardware generation.  Check both to determine
the proper blanked state.

Bug: https://gitlab.freedesktop.org/drm/amd/issues/781
Fixes: 5fc0cbfad45648 ("drm/amd/display: determine if a pipe is synced by plane state")
Cc: nicholas.kazlauskas@amd.com
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/amd/display/dc/core/dc.c

index 4a619328101ce478a96b10407c2fe2ea6aa63cc6..4acaf4be8a81eb2c43ddcbcadbe26f354da6bda8 100644 (file)
@@ -1011,9 +1011,17 @@ static void program_timing_sync(
                        }
                }
 
-               /* set first pipe with plane as master */
+               /* set first unblanked pipe as master */
                for (j = 0; j < group_size; j++) {
-                       if (pipe_set[j]->plane_state) {
+                       bool is_blanked;
+
+                       if (pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked)
+                               is_blanked =
+                                       pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked(pipe_set[j]->stream_res.opp);
+                       else
+                               is_blanked =
+                                       pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg);
+                       if (!is_blanked) {
                                if (j == 0)
                                        break;
 
@@ -1034,9 +1042,17 @@ static void program_timing_sync(
                                status->timing_sync_info.master = false;
 
                }
-               /* remove any other pipes with plane as they have already been synced */
+               /* remove any other unblanked pipes as they have already been synced */
                for (j = j + 1; j < group_size; j++) {
-                       if (pipe_set[j]->plane_state) {
+                       bool is_blanked;
+
+                       if (pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked)
+                               is_blanked =
+                                       pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked(pipe_set[j]->stream_res.opp);
+                       else
+                               is_blanked =
+                                       pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg);
+                       if (!is_blanked) {
                                group_size--;
                                pipe_set[j] = pipe_set[group_size];
                                j--;