From: Leo Li <[email protected]>

In preparation for moving the dm_update dance to the crtc atomic helper,
the lock_and_validation_needed flag need to be de-localized.

Move it to dm_*_states, and update it in the corresponding dm_update*
functions. Add a function to determine if DC global locking is needed by
iterating over all the dm_*_states.

Signed-off-by: Leo Li <[email protected]>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 64 +++++++++++++++++------
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  6 +++
 2 files changed, 53 insertions(+), 17 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 3745472..a629544 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3472,8 +3472,7 @@ static int dm_update_crtcs_state(struct 
amdgpu_display_manager *dm,
                                 struct drm_crtc *crtc,
                                 struct drm_crtc_state *old_crtc_state,
                                 struct drm_crtc_state *new_crtc_state,
-                                bool enable,
-                                bool *lock_and_validation_needed)
+                                bool enable)
 {
        struct dm_atomic_state *dm_state = NULL;
        struct dm_crtc_state *dm_old_crtc_state, *dm_new_crtc_state;
@@ -3592,7 +3591,7 @@ static int dm_update_crtcs_state(struct 
amdgpu_display_manager *dm,
 
                reset_freesync_config_for_crtc(dm_new_crtc_state);
 
-               *lock_and_validation_needed = true;
+               dm_new_crtc_state->lock_and_validation_needed = true;
 
        } else {/* Add stream for any updated/enabled CRTC */
                /*
@@ -3630,7 +3629,7 @@ static int dm_update_crtcs_state(struct 
amdgpu_display_manager *dm,
                                goto fail;
                        }
 
-                       *lock_and_validation_needed = true;
+                       dm_new_crtc_state->lock_and_validation_needed = true;
                }
        }
 
@@ -3690,8 +3689,7 @@ static int dm_update_planes_state(struct dc *dc,
                                  struct drm_plane *plane,
                                  struct drm_plane_state *old_plane_state,
                                  struct drm_plane_state *new_plane_state,
-                                 bool enable,
-                                 bool *lock_and_validation_needed)
+                                 bool enable)
 {
 
        struct dm_atomic_state *dm_state = NULL;
@@ -3750,7 +3748,7 @@ static int dm_update_planes_state(struct dc *dc,
                dc_plane_state_release(dm_old_plane_state->dc_state);
                dm_new_plane_state->dc_state = NULL;
 
-               *lock_and_validation_needed = true;
+               dm_new_plane_state->lock_and_validation_needed = true;
 
        } else { /* Add new planes */
                struct dc_plane_state *dc_new_plane_state;
@@ -3819,13 +3817,47 @@ static int dm_update_planes_state(struct dc *dc,
                 */
                dm_new_plane_state->dc_state->update_flags.bits.full_update = 1;
 
-               *lock_and_validation_needed = true;
+               dm_new_plane_state->lock_and_validation_needed = true;
        }
 
 
        return ret;
 }
 
+static bool dm_lock_and_validation_needed(struct drm_atomic_state *state)
+{
+       struct drm_plane *plane;
+       struct drm_plane_state *new_plane_state;
+       struct dm_plane_state *dm_new_plane_state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *new_crtc_state;
+       struct dm_crtc_state *dm_new_crtc_state;
+       struct drm_connector *connector;
+       struct drm_connector_state *new_con_state;
+       struct dm_connector_state *dm_new_con_state;
+       int i = 0;
+
+       for_each_new_plane_in_state(state, plane, new_plane_state, i) {
+               dm_new_plane_state = to_dm_plane_state(new_plane_state);
+               if (dm_new_plane_state->lock_and_validation_needed)
+                       return true;
+       }
+
+       for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
+               dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
+               if (dm_new_crtc_state->lock_and_validation_needed)
+                       return true;
+       }
+
+       for_each_new_connector_in_state(state, connector, new_con_state, i) {
+               dm_new_con_state = to_dm_connector_state(new_con_state);
+               if (dm_new_con_state->lock_and_validation_needed)
+                       return true;
+       }
+
+       return false;
+}
+
 static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
                                       struct drm_crtc_state *state)
 {
@@ -5921,8 +5953,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                ret = dm_update_planes_state(dc, state, plane,
                                             old_plane_state,
                                             new_plane_state,
-                                            false,
-                                            &lock_and_validation_needed);
+                                            false);
                if (ret)
                        goto fail;
        }
@@ -5932,8 +5963,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                ret = dm_update_crtcs_state(&adev->dm, state, crtc,
                                            old_crtc_state,
                                            new_crtc_state,
-                                           false,
-                                           &lock_and_validation_needed);
+                                           false);
                if (ret)
                        goto fail;
        }
@@ -5943,8 +5973,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                ret = dm_update_crtcs_state(&adev->dm, state, crtc,
                                            old_crtc_state,
                                            new_crtc_state,
-                                           true,
-                                           &lock_and_validation_needed);
+                                           true);
                if (ret)
                        goto fail;
        }
@@ -5954,8 +5983,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                ret = dm_update_planes_state(dc, state, plane,
                                             old_plane_state,
                                             new_plane_state,
-                                            true,
-                                            &lock_and_validation_needed);
+                                            true);
                if (ret)
                        goto fail;
        }
@@ -5985,13 +6013,15 @@ static int amdgpu_dm_atomic_check(struct drm_device 
*dev,
                        continue;
 
                overall_update_type = UPDATE_TYPE_FULL;
-               lock_and_validation_needed = true;
+               dm_new_con_state->lock_and_validation_needed = true;
        }
 
        ret = dm_determine_update_type_for_commit(dc, state, &update_type);
        if (ret)
                goto fail;
 
+       lock_and_validation_needed = dm_lock_and_validation_needed(state);
+
        if (overall_update_type < update_type)
                overall_update_type = update_type;
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index fbd161d..0754b3c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -254,6 +254,8 @@ struct dc_plane_state;
 struct dm_plane_state {
        struct drm_plane_state base;
        struct dc_plane_state *dc_state;
+
+       bool lock_and_validation_needed;
 };
 
 struct dm_crtc_state {
@@ -272,6 +274,8 @@ struct dm_crtc_state {
        struct dc_info_packet vrr_infopacket;
 
        int abm_level;
+
+       bool lock_and_validation_needed;
 };
 
 #define to_dm_crtc_state(x) container_of(x, struct dm_crtc_state, base)
@@ -294,6 +298,8 @@ struct dm_connector_state {
        bool underscan_enable;
        bool freesync_capable;
        uint8_t abm_level;
+
+       bool lock_and_validation_needed;
 };
 
 #define to_dm_connector_state(x)\
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to