diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/atombios_crtc.c')
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 30 |
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 */ |