aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/atombios_crtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/atombios_crtc.c')
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index f5987afcd48d..7c489d1b3514 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -574,9 +574,10 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
574 struct radeon_device *rdev = dev->dev_private; 574 struct radeon_device *rdev = dev->dev_private;
575 struct radeon_framebuffer *radeon_fb; 575 struct radeon_framebuffer *radeon_fb;
576 struct drm_gem_object *obj; 576 struct drm_gem_object *obj;
577 struct drm_radeon_gem_object *obj_priv; 577 struct radeon_bo *rbo;
578 uint64_t fb_location; 578 uint64_t fb_location;
579 uint32_t fb_format, fb_pitch_pixels, tiling_flags; 579 uint32_t fb_format, fb_pitch_pixels, tiling_flags;
580 int r;
580 581
581 /* no fb bound */ 582 /* no fb bound */
582 if (!crtc->fb) { 583 if (!crtc->fb) {
@@ -586,12 +587,21 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
586 587
587 radeon_fb = to_radeon_framebuffer(crtc->fb); 588 radeon_fb = to_radeon_framebuffer(crtc->fb);
588 589
590 /* Pin framebuffer & get tilling informations */
589 obj = radeon_fb->obj; 591 obj = radeon_fb->obj;
590 obj_priv = obj->driver_private; 592 rbo = obj->driver_private;
591 593 r = radeon_bo_reserve(rbo, false);
592 if (radeon_gem_object_pin(obj, RADEON_GEM_DOMAIN_VRAM, &fb_location)) { 594 if (unlikely(r != 0))
595 return r;
596 r = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &fb_location);
597 if (unlikely(r != 0)) {
598 radeon_bo_unreserve(rbo);
593 return -EINVAL; 599 return -EINVAL;
594 } 600 }
601 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
602 radeon_bo_unreserve(rbo);
603 if (tiling_flags & RADEON_TILING_MACRO)
604 fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE;
595 605
596 switch (crtc->fb->bits_per_pixel) { 606 switch (crtc->fb->bits_per_pixel) {
597 case 8: 607 case 8:
@@ -621,11 +631,6 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
621 return -EINVAL; 631 return -EINVAL;
622 } 632 }
623 633
624 radeon_object_get_tiling_flags(obj->driver_private,
625 &tiling_flags, NULL);
626 if (tiling_flags & RADEON_TILING_MACRO)
627 fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE;
628
629 if (tiling_flags & RADEON_TILING_MICRO) 634 if (tiling_flags & RADEON_TILING_MICRO)
630 fb_format |= AVIVO_D1GRPH_TILED; 635 fb_format |= AVIVO_D1GRPH_TILED;
631 636
@@ -677,7 +682,12 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
677 682
678 if (old_fb && old_fb != crtc->fb) { 683 if (old_fb && old_fb != crtc->fb) {
679 radeon_fb = to_radeon_framebuffer(old_fb); 684 radeon_fb = to_radeon_framebuffer(old_fb);
680 radeon_gem_object_unpin(radeon_fb->obj); 685 rbo = radeon_fb->obj->driver_private;
686 r = radeon_bo_reserve(rbo, false);
687 if (unlikely(r != 0))
688 return r;
689 radeon_bo_unpin(rbo);
690 radeon_bo_unreserve(rbo);
681 } 691 }
682 692
683 /* Bytes per pixel may have changed */ 693 /* Bytes per pixel may have changed */