From: Nicholas Kazlauskas <[email protected]>

[WHY]
We're checking surface and stream updates after they've been applied to
their respective states within `update_planes_and_stream_state`.

Medium updates under the HWSS V3 fast path that are not supported or
tested are getting implicitly if they don't trigger a DML validation
and getting updated in place on the dc->current_state context.

[HOW]
Fix this issue by moving up the fast path determination check prior
to `update_planes_and_stream_state`. This is how the V2 path works
and how the V3 path used to work prior to the refactors in this area.

Reviewed-by: Dillon Varone <[email protected]>
Signed-off-by: Nicholas Kazlauskas <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 38 +++++++++++-------------
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index c17f065a88d4..fc94c002bd6a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -7296,6 +7296,23 @@ static bool update_planes_and_stream_prepare_v3(
        ASSERT(scratch->flow == UPDATE_V3_FLOW_INVALID);
        dc_exit_ips_for_hw_access(scratch->dc);
 
+       /* HWSS path determination needs to be done prior to updating the 
surface and stream states. */
+       struct dc_fast_update fast_update[MAX_SURFACES] = { 0 };
+
+       populate_fast_updates(fast_update,
+                             scratch->surface_updates,
+                             scratch->surface_count,
+                             scratch->stream_update);
+
+       const bool is_hwss_fast_path_only =
+               fast_update_only(scratch->dc,
+                                fast_update,
+                                scratch->surface_updates,
+                                scratch->surface_count,
+                                scratch->stream_update,
+                                scratch->stream) &&
+               !scratch->dc->check_config.enable_legacy_fast_update;
+
        if (!update_planes_and_stream_state(
                        scratch->dc,
                        scratch->surface_updates,
@@ -7311,26 +7328,7 @@ static bool update_planes_and_stream_prepare_v3(
        if (scratch->new_context == scratch->dc->current_state) {
                ASSERT(scratch->update_type < UPDATE_TYPE_FULL);
 
-               // TODO: Do we need this to be alive in execute?
-               struct dc_fast_update fast_update[MAX_SURFACES] = { 0 };
-
-               populate_fast_updates(
-                               fast_update,
-                               scratch->surface_updates,
-                               scratch->surface_count,
-                               scratch->stream_update
-               );
-               const bool fast = fast_update_only(
-                               scratch->dc,
-                               fast_update,
-                               scratch->surface_updates,
-                               scratch->surface_count,
-                               scratch->stream_update,
-                               scratch->stream
-               )
-               // TODO: Can this be used to skip `populate_fast_updates`?
-                               && 
!scratch->dc->check_config.enable_legacy_fast_update;
-               scratch->flow = fast
+               scratch->flow = is_hwss_fast_path_only
                                ? UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FAST
                                : UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FULL;
                return true;
-- 
2.43.0

Reply via email to