From: Leo Li <[email protected]>

[Why]

In preparation of implementing deferred vblank work, refactor
amdgpu_dm_crtc_set_vblank to split out the actual enabling/disabling of
vblank interrupts + restoring vblank counts/timestamps from the rest.

[How]

* Move the vblank_control_work init and queueing out into
  amdgpu_dm_crtc_queue_vblank_work()
* Move crtc->enabled check out to parent function
  amdgpu_dm_crtc_enable_vblank()
* Call amdgpu_dm_crtc_queue_vblank_work() from parent functions
  amdgpu_dm_crtc_(enable|disable)_vblank()
* As a drive-by cleanup, make amdgpu_dm_crtc_(enable|disable)_vblank()
  static; they're not called from anywhere else.

No functional changes are intended.

Signed-off-by: Leo Li <[email protected]>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c    | 88 +++++++++++++------
 .../amd/display/amdgpu_dm/amdgpu_dm_crtc.h    |  4 -
 2 files changed, 60 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
index 130190e8a1b29..3df38f3cb7423 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
@@ -293,20 +293,12 @@ static inline int amdgpu_dm_crtc_set_vblank(struct 
drm_crtc *crtc, bool enable)
        struct amdgpu_device *adev = drm_to_adev(crtc->dev);
        struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state);
        struct amdgpu_display_manager *dm = &adev->dm;
-       struct vblank_control_work *work;
        int irq_type;
        int rc = 0;
 
-       if (enable && !acrtc->base.enabled) {
-               drm_dbg_vbl(crtc->dev,
-                               "Reject vblank enable on unconfigured CRTC %d 
(enabled=%d)\n",
-                               acrtc->crtc_id, acrtc->base.enabled);
-               return -EINVAL;
-       }
-
        irq_type = amdgpu_display_crtc_idx_to_irq_type(adev, acrtc->crtc_id);
 
-       if (enable) {
+       if (enable && crtc->enabled) {
                struct dc *dc = adev->dm.dc;
                struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
                struct psr_settings *psr = 
&acrtc_state->stream->link->psr_settings;
@@ -387,39 +379,79 @@ static inline int amdgpu_dm_crtc_set_vblank(struct 
drm_crtc *crtc, bool enable)
                        return rc;
        }
 #endif
+       return 0;
+}
 
-       if (amdgpu_in_reset(adev))
-               return 0;
-
-       if (dm->vblank_control_workqueue) {
-               work = kzalloc_obj(*work, GFP_ATOMIC);
-               if (!work)
-                       return -ENOMEM;
+static int amdgpu_dm_crtc_queue_vblank_work(struct amdgpu_display_manager *dm,
+                                           struct amdgpu_crtc *acrtc,
+                                           struct dm_crtc_state *acrtc_state,
+                                           bool enable)
+{
+       struct vblank_control_work *work;
 
-               INIT_WORK(&work->work, amdgpu_dm_crtc_vblank_control_worker);
-               work->dm = dm;
-               work->acrtc = acrtc;
-               work->enable = enable;
+       work = kzalloc_obj(*work, GFP_ATOMIC);
+       if (!work)
+               return -ENOMEM;
 
-               if (acrtc_state->stream) {
-                       dc_stream_retain(acrtc_state->stream);
-                       work->stream = acrtc_state->stream;
-               }
+       INIT_WORK(&work->work, amdgpu_dm_crtc_vblank_control_worker);
+       work->dm = dm;
+       work->acrtc = acrtc;
+       work->enable = enable;
 
-               queue_work(dm->vblank_control_workqueue, &work->work);
+       if (acrtc_state->stream) {
+               dc_stream_retain(acrtc_state->stream);
+               work->stream = acrtc_state->stream;
        }
 
+       queue_work(dm->vblank_control_workqueue, &work->work);
+
        return 0;
 }
 
-int amdgpu_dm_crtc_enable_vblank(struct drm_crtc *crtc)
+static int amdgpu_dm_crtc_enable_vblank(struct drm_crtc *crtc)
 {
-       return amdgpu_dm_crtc_set_vblank(crtc, true);
+       struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state);
+       struct amdgpu_device *adev = drm_to_adev(crtc->dev);
+       struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
+       struct amdgpu_display_manager *dm = &adev->dm;
+       int ret;
+
+       if (!crtc->enabled) {
+               drm_dbg_vbl(crtc->dev,
+                               "Reject vblank enable on unconfigured CRTC %d 
(enabled=%d)\n",
+                               crtc->index, crtc->enabled);
+               return -EINVAL;
+       }
+
+       ret = amdgpu_dm_crtc_set_vblank(crtc, true);
+       if (ret)
+               return ret;
+
+       if (amdgpu_in_reset(adev))
+               return 0;
+
+       if (dm->vblank_control_workqueue)
+               return amdgpu_dm_crtc_queue_vblank_work(dm, acrtc,
+                                                       acrtc_state, true);
+
+       return 0;
 }
 
-void amdgpu_dm_crtc_disable_vblank(struct drm_crtc *crtc)
+static void amdgpu_dm_crtc_disable_vblank(struct drm_crtc *crtc)
 {
+       struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state);
+       struct amdgpu_device *adev = drm_to_adev(crtc->dev);
+       struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
+       struct amdgpu_display_manager *dm = &adev->dm;
+
        amdgpu_dm_crtc_set_vblank(crtc, false);
+
+       if (amdgpu_in_reset(adev))
+               return;
+
+       if (dm->vblank_control_workqueue)
+               amdgpu_dm_crtc_queue_vblank_work(dm, acrtc,
+                                                acrtc_state, false);
 }
 
 static void amdgpu_dm_crtc_destroy_state(struct drm_crtc *crtc,
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
index c1212947a77b8..655a6c4f83fb8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h
@@ -39,10 +39,6 @@ bool amdgpu_dm_crtc_vrr_active_irq(struct amdgpu_crtc 
*acrtc);
 
 bool amdgpu_dm_crtc_vrr_active(const struct dm_crtc_state *dm_state);
 
-int amdgpu_dm_crtc_enable_vblank(struct drm_crtc *crtc);
-
-void amdgpu_dm_crtc_disable_vblank(struct drm_crtc *crtc);
-
 int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
                        struct drm_plane *plane,
                        uint32_t link_index);
-- 
2.52.0

Reply via email to