diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/atombios_crtc.c')
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index c15287a590ff..260fcf59f00c 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -241,6 +241,7 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
241 | { | 241 | { |
242 | struct drm_device *dev = crtc->dev; | 242 | struct drm_device *dev = crtc->dev; |
243 | struct radeon_device *rdev = dev->dev_private; | 243 | struct radeon_device *rdev = dev->dev_private; |
244 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
244 | 245 | ||
245 | switch (mode) { | 246 | switch (mode) { |
246 | case DRM_MODE_DPMS_ON: | 247 | case DRM_MODE_DPMS_ON: |
@@ -248,20 +249,19 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
248 | if (ASIC_IS_DCE3(rdev)) | 249 | if (ASIC_IS_DCE3(rdev)) |
249 | atombios_enable_crtc_memreq(crtc, 1); | 250 | atombios_enable_crtc_memreq(crtc, 1); |
250 | atombios_blank_crtc(crtc, 0); | 251 | atombios_blank_crtc(crtc, 0); |
252 | drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); | ||
253 | radeon_crtc_load_lut(crtc); | ||
251 | break; | 254 | break; |
252 | case DRM_MODE_DPMS_STANDBY: | 255 | case DRM_MODE_DPMS_STANDBY: |
253 | case DRM_MODE_DPMS_SUSPEND: | 256 | case DRM_MODE_DPMS_SUSPEND: |
254 | case DRM_MODE_DPMS_OFF: | 257 | case DRM_MODE_DPMS_OFF: |
258 | drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); | ||
255 | atombios_blank_crtc(crtc, 1); | 259 | atombios_blank_crtc(crtc, 1); |
256 | if (ASIC_IS_DCE3(rdev)) | 260 | if (ASIC_IS_DCE3(rdev)) |
257 | atombios_enable_crtc_memreq(crtc, 0); | 261 | atombios_enable_crtc_memreq(crtc, 0); |
258 | atombios_enable_crtc(crtc, 0); | 262 | atombios_enable_crtc(crtc, 0); |
259 | break; | 263 | break; |
260 | } | 264 | } |
261 | |||
262 | if (mode != DRM_MODE_DPMS_OFF) { | ||
263 | radeon_crtc_load_lut(crtc); | ||
264 | } | ||
265 | } | 265 | } |
266 | 266 | ||
267 | static void | 267 | static void |
@@ -457,9 +457,8 @@ void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode) | |||
457 | if (encoder->encoder_type != | 457 | if (encoder->encoder_type != |
458 | DRM_MODE_ENCODER_DAC) | 458 | DRM_MODE_ENCODER_DAC) |
459 | pll_flags |= RADEON_PLL_NO_ODD_POST_DIV; | 459 | pll_flags |= RADEON_PLL_NO_ODD_POST_DIV; |
460 | if (!ASIC_IS_AVIVO(rdev) | 460 | if (encoder->encoder_type == |
461 | && (encoder->encoder_type == | 461 | DRM_MODE_ENCODER_LVDS) |
462 | DRM_MODE_ENCODER_LVDS)) | ||
463 | pll_flags |= RADEON_PLL_USE_REF_DIV; | 462 | pll_flags |= RADEON_PLL_USE_REF_DIV; |
464 | } | 463 | } |
465 | radeon_encoder = to_radeon_encoder(encoder); | 464 | radeon_encoder = to_radeon_encoder(encoder); |
@@ -500,8 +499,18 @@ void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode) | |||
500 | else | 499 | else |
501 | pll = &rdev->clock.p2pll; | 500 | pll = &rdev->clock.p2pll; |
502 | 501 | ||
503 | radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | 502 | if (ASIC_IS_AVIVO(rdev)) { |
504 | &ref_div, &post_div, pll_flags); | 503 | if (radeon_new_pll) |
504 | radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, | ||
505 | &fb_div, &frac_fb_div, | ||
506 | &ref_div, &post_div, pll_flags); | ||
507 | else | ||
508 | radeon_compute_pll(pll, adjusted_clock, &pll_clock, | ||
509 | &fb_div, &frac_fb_div, | ||
510 | &ref_div, &post_div, pll_flags); | ||
511 | } else | ||
512 | radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | ||
513 | &ref_div, &post_div, pll_flags); | ||
505 | 514 | ||
506 | index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); | 515 | index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); |
507 | atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, | 516 | atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, |
@@ -574,21 +583,32 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, | |||
574 | struct radeon_device *rdev = dev->dev_private; | 583 | struct radeon_device *rdev = dev->dev_private; |
575 | struct radeon_framebuffer *radeon_fb; | 584 | struct radeon_framebuffer *radeon_fb; |
576 | struct drm_gem_object *obj; | 585 | struct drm_gem_object *obj; |
577 | struct drm_radeon_gem_object *obj_priv; | 586 | struct radeon_bo *rbo; |
578 | uint64_t fb_location; | 587 | uint64_t fb_location; |
579 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 588 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
589 | int r; | ||
580 | 590 | ||
581 | if (!crtc->fb) | 591 | /* no fb bound */ |
582 | return -EINVAL; | 592 | if (!crtc->fb) { |
593 | DRM_DEBUG("No FB bound\n"); | ||
594 | return 0; | ||
595 | } | ||
583 | 596 | ||
584 | radeon_fb = to_radeon_framebuffer(crtc->fb); | 597 | radeon_fb = to_radeon_framebuffer(crtc->fb); |
585 | 598 | ||
599 | /* Pin framebuffer & get tilling informations */ | ||
586 | obj = radeon_fb->obj; | 600 | obj = radeon_fb->obj; |
587 | obj_priv = obj->driver_private; | 601 | rbo = obj->driver_private; |
588 | 602 | r = radeon_bo_reserve(rbo, false); | |
589 | if (radeon_gem_object_pin(obj, RADEON_GEM_DOMAIN_VRAM, &fb_location)) { | 603 | if (unlikely(r != 0)) |
604 | return r; | ||
605 | r = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &fb_location); | ||
606 | if (unlikely(r != 0)) { | ||
607 | radeon_bo_unreserve(rbo); | ||
590 | return -EINVAL; | 608 | return -EINVAL; |
591 | } | 609 | } |
610 | radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL); | ||
611 | radeon_bo_unreserve(rbo); | ||
592 | 612 | ||
593 | switch (crtc->fb->bits_per_pixel) { | 613 | switch (crtc->fb->bits_per_pixel) { |
594 | case 8: | 614 | case 8: |
@@ -618,8 +638,6 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, | |||
618 | return -EINVAL; | 638 | return -EINVAL; |
619 | } | 639 | } |
620 | 640 | ||
621 | radeon_object_get_tiling_flags(obj->driver_private, | ||
622 | &tiling_flags, NULL); | ||
623 | if (tiling_flags & RADEON_TILING_MACRO) | 641 | if (tiling_flags & RADEON_TILING_MACRO) |
624 | fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE; | 642 | fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE; |
625 | 643 | ||
@@ -674,7 +692,12 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, | |||
674 | 692 | ||
675 | if (old_fb && old_fb != crtc->fb) { | 693 | if (old_fb && old_fb != crtc->fb) { |
676 | radeon_fb = to_radeon_framebuffer(old_fb); | 694 | radeon_fb = to_radeon_framebuffer(old_fb); |
677 | radeon_gem_object_unpin(radeon_fb->obj); | 695 | rbo = radeon_fb->obj->driver_private; |
696 | r = radeon_bo_reserve(rbo, false); | ||
697 | if (unlikely(r != 0)) | ||
698 | return r; | ||
699 | radeon_bo_unpin(rbo); | ||
700 | radeon_bo_unreserve(rbo); | ||
678 | } | 701 | } |
679 | 702 | ||
680 | /* Bytes per pixel may have changed */ | 703 | /* Bytes per pixel may have changed */ |