From d4c8e1052e2944e63bb3855165fbbc1645a2433a Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Wed, 11 May 2016 16:13:06 -0400 Subject: [PATCH 1093/1110] drm/amd/dal: S3 Move vblank_off to before CRTCs are disabled. Signed-off-by: Andrey Grodzovsky Acked-by: Jordan Lazare Signed-off-by: Kalyan Alle --- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c | 20 ++++++++++++++++++-- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c | 15 --------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c index 839ec13..6a002df 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c @@ -461,16 +461,32 @@ static int dm_suspend(void *handle) struct amdgpu_device *adev = handle; struct amdgpu_display_manager *dm = &adev->dm; int ret = 0; + struct drm_crtc *crtc; s3_handle_mst(adev->ddev, true); + /* flash all pending vblank events and turn interrupt off + * before disabling CRTCs. They will be enabled back in + * dm_display_resume + */ + drm_modeset_lock_all(adev->ddev); + drm_for_each_crtc(crtc, adev->ddev) { + struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); + if (acrtc->target) { + drm_crtc_vblank_off(crtc); + dc_target_release(acrtc->target); + acrtc->target = NULL; + } + } + drm_modeset_unlock_all(adev->ddev); + + amdgpu_dm_irq_suspend(adev); + dc_set_power_state( dm->dc, DC_ACPI_CM_POWER_STATE_D3, DC_VIDEO_POWER_SUSPEND); - amdgpu_dm_irq_suspend(adev); - return ret; } diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c index b0ad20e..78ffe88 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_irq.c @@ -499,7 +499,6 @@ int amdgpu_dm_irq_suspend( struct list_head *hnd_list_h; struct list_head *hnd_list_l; unsigned long irq_table_flags; - struct drm_crtc *crtc; DM_IRQ_TABLE_LOCK(adev, irq_table_flags); @@ -519,13 +518,6 @@ int amdgpu_dm_irq_suspend( } DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags); - - - drm_modeset_lock_all(adev->ddev); - drm_for_each_crtc(crtc, adev->ddev) - drm_crtc_vblank_off(crtc); - drm_modeset_unlock_all(adev->ddev); - return 0; } @@ -557,7 +549,6 @@ int amdgpu_dm_irq_resume(struct amdgpu_device *adev) int src; struct list_head *hnd_list_h, *hnd_list_l; unsigned long irq_table_flags; - struct drm_crtc *crtc; DM_IRQ_TABLE_LOCK(adev, irq_table_flags); @@ -572,12 +563,6 @@ int amdgpu_dm_irq_resume(struct amdgpu_device *adev) } DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags); - - drm_modeset_lock_all(adev->ddev); - drm_for_each_crtc(crtc, adev->ddev) - drm_crtc_vblank_on(crtc); - drm_modeset_unlock_all(adev->ddev); - return 0; } -- 2.7.4