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
