From: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>

[Why]
Dynamic link encoder assignment expects that it can modify DC
current_state and the links associated with the incoming state when
performing full validation.

This does not align with our actual synchronization constraints
in DM's atomic_check.

[How]
Since link encoder assignment only happens as part of full validation
we can just use fast validation as part of atomic_check instead.

This satisfy's DC interface requirements and skips the DML calculations
needed for pipe programming - hopefully speeding up things a little bit
to offset the cost of double validation during stream modification.

We already do this as part of dc_commit_updates_for_stream()
with validate_bandwidth(), so extend this to dc_commit_state() as
well.

Fixes: 019f278036a2 ("drm/amd/display: Fix concurrent dynamic encoder 
assignment")

Reviewed-by: Harry Wentland <harry.wentl...@amd.com>
Acked-by: Qingqing Zhuo <qingqing.z...@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 19 +------------------
 drivers/gpu/drm/amd/display/dc/core/dc.c      | 13 +++++++++++++
 2 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index c88054f8c583..729ab647f691 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2304,14 +2304,6 @@ static enum dc_status 
amdgpu_dm_commit_zero_streams(struct dc *dc)
                        goto fail;
        }
 
-
-       res = dc_validate_global_state(dc, context, false);
-
-       if (res != DC_OK) {
-               DRM_ERROR("%s:resource validation failed, dc_status:%d\n", 
__func__, res);
-               goto fail;
-       }
-
        res = dc_commit_state(dc, context);
 
 fail:
@@ -2580,15 +2572,6 @@ static int dm_resume(void *handle)
                                        = 0xffffffff;
                        }
                }
-#if defined(CONFIG_DRM_AMD_DC_DCN)
-               /*
-                * Resource allocation happens for link encoders for newer ASIC 
in
-                * dc_validate_global_state, so we need to revalidate it.
-                *
-                * This shouldn't fail (it passed once before), so warn if it 
does.
-                */
-               WARN_ON(dc_validate_global_state(dm->dc, dc_state, false) != 
DC_OK);
-#endif
 
                WARN_ON(!dc_commit_state(dm->dc, dc_state));
 
@@ -11126,7 +11109,7 @@ static int amdgpu_dm_atomic_check(struct drm_device 
*dev,
                        DRM_DEBUG_DRIVER("drm_dp_mst_atomic_check() failed\n");
                        goto fail;
                }
-               status = dc_validate_global_state(dc, dm_state->context, false);
+               status = dc_validate_global_state(dc, dm_state->context, true);
                if (status != DC_OK) {
                        DRM_DEBUG_DRIVER("DC global validation failure: %s 
(%d)",
                                       dc_status_to_str(status), status);
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 39ad3854bfe4..dd4ea98749b7 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1827,6 +1827,19 @@ bool dc_commit_state(struct dc *dc, struct dc_state 
*context)
                dc_stream_log(dc, stream);
        }
 
+       /*
+        * Previous validation was perfomred with fast_validation = true and
+        * the full DML state required for hardware programming was skipped.
+        *
+        * Re-validate here to calculate these parameters / watermarks.
+        */
+       result = dc_validate_global_state(dc, context, false);
+       if (result != DC_OK) {
+               DC_LOG_ERROR("DC commit global validation failure: %s (%d)",
+                            dc_status_to_str(result), result);
+               return result;
+       }
+
        result = dc_commit_state_no_check(dc, context);
 
        return (result == DC_OK);
-- 
2.25.1

Reply via email to