|
@@ -1657,11 +1657,21 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
|
|
}
|
|
}
|
|
drm_modeset_unlock_all(dev);
|
|
drm_modeset_unlock_all(dev);
|
|
|
|
|
|
- /* unpin the front buffers */
|
|
|
|
|
|
+ /* unpin the front buffers and cursors */
|
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
|
|
|
+ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
|
|
struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
|
|
struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
|
|
struct amdgpu_bo *robj;
|
|
struct amdgpu_bo *robj;
|
|
|
|
|
|
|
|
+ if (amdgpu_crtc->cursor_bo) {
|
|
|
|
+ struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
|
|
|
|
+ r = amdgpu_bo_reserve(aobj, false);
|
|
|
|
+ if (r == 0) {
|
|
|
|
+ amdgpu_bo_unpin(aobj);
|
|
|
|
+ amdgpu_bo_unreserve(aobj);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (rfb == NULL || rfb->obj == NULL) {
|
|
if (rfb == NULL || rfb->obj == NULL) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -1713,6 +1723,7 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
|
|
{
|
|
{
|
|
struct drm_connector *connector;
|
|
struct drm_connector *connector;
|
|
struct amdgpu_device *adev = dev->dev_private;
|
|
struct amdgpu_device *adev = dev->dev_private;
|
|
|
|
+ struct drm_crtc *crtc;
|
|
int r;
|
|
int r;
|
|
|
|
|
|
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
|
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
|
@@ -1746,6 +1757,24 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
|
|
if (r)
|
|
if (r)
|
|
return r;
|
|
return r;
|
|
|
|
|
|
|
|
+ /* pin cursors */
|
|
|
|
+ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
|
|
|
+ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
|
|
|
|
+
|
|
|
|
+ if (amdgpu_crtc->cursor_bo) {
|
|
|
|
+ struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
|
|
|
|
+ r = amdgpu_bo_reserve(aobj, false);
|
|
|
|
+ if (r == 0) {
|
|
|
|
+ r = amdgpu_bo_pin(aobj,
|
|
|
|
+ AMDGPU_GEM_DOMAIN_VRAM,
|
|
|
|
+ &amdgpu_crtc->cursor_addr);
|
|
|
|
+ if (r != 0)
|
|
|
|
+ DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
|
|
|
|
+ amdgpu_bo_unreserve(aobj);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/* blat the mode back in */
|
|
/* blat the mode back in */
|
|
if (fbcon) {
|
|
if (fbcon) {
|
|
drm_helper_resume_force_mode(dev);
|
|
drm_helper_resume_force_mode(dev);
|