OSDN Git Service

drm/amdgpu: keep fbdev buffers pinned during suspend
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 21 Jun 2022 14:04:55 +0000 (10:04 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 7 Jul 2022 01:59:52 +0000 (21:59 -0400)
Was dropped when we converted to the generic helpers.

Fixes: 087451f372bf ("drm/amdgpu: use generic fb helpers instead of setting up AMD own's.")
Acked-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c

index 17c9bbe..4dfd672 100644 (file)
@@ -1528,6 +1528,21 @@ bool amdgpu_crtc_get_scanout_position(struct drm_crtc *crtc,
                                                  stime, etime, mode);
 }
 
+static bool
+amdgpu_display_robj_is_fb(struct amdgpu_device *adev, struct amdgpu_bo *robj)
+{
+       struct drm_device *dev = adev_to_drm(adev);
+       struct drm_fb_helper *fb_helper = dev->fb_helper;
+
+       if (!fb_helper || !fb_helper->buffer)
+               return false;
+
+       if (gem_to_amdgpu_bo(fb_helper->buffer->gem) != robj)
+               return false;
+
+       return true;
+}
+
 int amdgpu_display_suspend_helper(struct amdgpu_device *adev)
 {
        struct drm_device *dev = adev_to_drm(adev);
@@ -1563,10 +1578,12 @@ int amdgpu_display_suspend_helper(struct amdgpu_device *adev)
                        continue;
                }
                robj = gem_to_amdgpu_bo(fb->obj[0]);
-               r = amdgpu_bo_reserve(robj, true);
-               if (r == 0) {
-                       amdgpu_bo_unpin(robj);
-                       amdgpu_bo_unreserve(robj);
+               if (!amdgpu_display_robj_is_fb(adev, robj)) {
+                       r = amdgpu_bo_reserve(robj, true);
+                       if (r == 0) {
+                               amdgpu_bo_unpin(robj);
+                               amdgpu_bo_unreserve(robj);
+                       }
                }
        }
        return 0;