aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c86
1 files changed, 45 insertions, 41 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 36426e66964d..61981d0701b5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2709,44 +2709,46 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
2709 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); 2709 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
2710 } 2710 }
2711 drm_modeset_unlock_all(dev); 2711 drm_modeset_unlock_all(dev);
2712 } 2712 /* unpin the front buffers and cursors */
2713 2713 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2714 amdgpu_amdkfd_suspend(adev); 2714 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2715 2715 struct drm_framebuffer *fb = crtc->primary->fb;
2716 /* unpin the front buffers and cursors */ 2716 struct amdgpu_bo *robj;
2717 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 2717
2718 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2718 if (amdgpu_crtc->cursor_bo) {
2719 struct drm_framebuffer *fb = crtc->primary->fb; 2719 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2720 struct amdgpu_bo *robj; 2720 r = amdgpu_bo_reserve(aobj, true);
2721 2721 if (r == 0) {
2722 if (amdgpu_crtc->cursor_bo) { 2722 amdgpu_bo_unpin(aobj);
2723 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2723 amdgpu_bo_unreserve(aobj);
2724 r = amdgpu_bo_reserve(aobj, true); 2724 }
2725 if (r == 0) {
2726 amdgpu_bo_unpin(aobj);
2727 amdgpu_bo_unreserve(aobj);
2728 } 2725 }
2729 }
2730 2726
2731 if (fb == NULL || fb->obj[0] == NULL) { 2727 if (fb == NULL || fb->obj[0] == NULL) {
2732 continue; 2728 continue;
2733 } 2729 }
2734 robj = gem_to_amdgpu_bo(fb->obj[0]); 2730 robj = gem_to_amdgpu_bo(fb->obj[0]);
2735 /* don't unpin kernel fb objects */ 2731 /* don't unpin kernel fb objects */
2736 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) { 2732 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) {
2737 r = amdgpu_bo_reserve(robj, true); 2733 r = amdgpu_bo_reserve(robj, true);
2738 if (r == 0) { 2734 if (r == 0) {
2739 amdgpu_bo_unpin(robj); 2735 amdgpu_bo_unpin(robj);
2740 amdgpu_bo_unreserve(robj); 2736 amdgpu_bo_unreserve(robj);
2737 }
2741 } 2738 }
2742 } 2739 }
2743 } 2740 }
2741
2742 amdgpu_amdkfd_suspend(adev);
2743
2744 r = amdgpu_device_ip_suspend_phase1(adev);
2745
2744 /* evict vram memory */ 2746 /* evict vram memory */
2745 amdgpu_bo_evict_vram(adev); 2747 amdgpu_bo_evict_vram(adev);
2746 2748
2747 amdgpu_fence_driver_suspend(adev); 2749 amdgpu_fence_driver_suspend(adev);
2748 2750
2749 r = amdgpu_device_ip_suspend(adev); 2751 r = amdgpu_device_ip_suspend_phase2(adev);
2750 2752
2751 /* evict remaining vram memory 2753 /* evict remaining vram memory
2752 * This second call to evict vram is to evict the gart page table 2754 * This second call to evict vram is to evict the gart page table
@@ -2819,19 +2821,21 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2819 if (r) 2821 if (r)
2820 return r; 2822 return r;
2821 2823
2822 /* pin cursors */ 2824 if (!amdgpu_device_has_dc_support(adev)) {
2823 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 2825 /* pin cursors */
2824 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2826 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2825 2827 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2826 if (amdgpu_crtc->cursor_bo) { 2828
2827 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2829 if (amdgpu_crtc->cursor_bo) {
2828 r = amdgpu_bo_reserve(aobj, true); 2830 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2829 if (r == 0) { 2831 r = amdgpu_bo_reserve(aobj, true);
2830 r = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM); 2832 if (r == 0) {
2831 if (r != 0) 2833 r = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM);
2832 DRM_ERROR("Failed to pin cursor BO (%d)\n", r); 2834 if (r != 0)
2833 amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj); 2835 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
2834 amdgpu_bo_unreserve(aobj); 2836 amdgpu_crtc->cursor_addr = amdgpu_bo_gpu_offset(aobj);
2837 amdgpu_bo_unreserve(aobj);
2838 }
2835 } 2839 }
2836 } 2840 }
2837 } 2841 }