Change-Id: I3baae1419cb33a25e4fd84039bb382a347e3a12c Signed-off-by: Jim Qu <Jim.Qu at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 33 ++++++++++++++++-------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 8a5f8cb..cf75f6b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1500,10 +1500,10 @@ struct amdgpu_device { /* link all gtt */ spinlock_t gtt_list_lock; struct list_head gtt_list; - /* record hw reset is performed */ bool has_hw_reset; + struct drm_atomic_state *atomic_state; }; static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index c0679d3..62083a3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2059,7 +2059,20 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon) drm_kms_helper_poll_disable(dev); - if (!amdgpu_device_has_dc_support(adev)) { + if (fbcon) { + console_lock(); + amdgpu_fbdev_set_suspend(adev, 1); + console_unlock(); + } + + if (amdgpu_device_has_dc_support(adev)) { + adev->atomic_state = drm_atomic_helper_suspend(adev->ddev); + if (IS_ERR(adev->atomic_state)) { + amdgpu_fbdev_set_suspend(adev, 0); + drm_kms_helper_poll_enable(adev->ddev); + return PTR_ERR(adev->atomic_state); + } + } else { /* turn off display hw */ drm_modeset_lock_all(dev); list_for_each_entry(connector, &dev->mode_config.connector_list, head) { @@ -2121,11 +2134,6 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon) DRM_ERROR("amdgpu asic reset failed\n"); } - if (fbcon) { - console_lock(); - amdgpu_fbdev_set_suspend(adev, 1); - console_unlock(); - } return 0; } @@ -2209,7 +2217,10 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon) /* blat the mode back in */ if (fbcon) { - if (!amdgpu_device_has_dc_support(adev)) { + if (amdgpu_device_has_dc_support(adev)) { + drm_atomic_helper_resume(adev->ddev, adev->atomic_state); + amdgpu_dm_display_resume(adev); + } else { /* pre DCE11 */ drm_helper_resume_force_mode(dev); @@ -2219,14 +2230,6 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon) drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); } drm_modeset_unlock_all(dev); - } else { - /* - * There is no equivalent atomic helper to turn on - * display, so we defined our own function for this, - * once suspend resume is supported by the atomic - * framework this will be reworked - */ - amdgpu_dm_display_resume(adev); } } -- 1.9.1