diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 65 |
1 files changed, 5 insertions, 60 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index e9ccc6b787f3..89aab0ad3f09 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | |||
@@ -565,35 +565,14 @@ static void dce_v11_0_stop_mc_access(struct amdgpu_device *adev, | |||
565 | crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]), | 565 | crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]), |
566 | CRTC_CONTROL, CRTC_MASTER_EN); | 566 | CRTC_CONTROL, CRTC_MASTER_EN); |
567 | if (crtc_enabled) { | 567 | if (crtc_enabled) { |
568 | #if 0 | 568 | #if 1 |
569 | u32 frame_count; | ||
570 | int j; | ||
571 | |||
572 | save->crtc_enabled[i] = true; | 569 | save->crtc_enabled[i] = true; |
573 | tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]); | 570 | tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]); |
574 | if (REG_GET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN) == 0) { | 571 | if (REG_GET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN) == 0) { |
575 | amdgpu_display_vblank_wait(adev, i); | 572 | /*it is correct only for RGB ; black is 0*/ |
576 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1); | 573 | WREG32(mmCRTC_BLANK_DATA_COLOR + crtc_offsets[i], 0); |
577 | tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 1); | 574 | tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 1); |
578 | WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp); | 575 | WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
579 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
580 | } | ||
581 | /* wait for the next frame */ | ||
582 | frame_count = amdgpu_display_vblank_get_counter(adev, i); | ||
583 | for (j = 0; j < adev->usec_timeout; j++) { | ||
584 | if (amdgpu_display_vblank_get_counter(adev, i) != frame_count) | ||
585 | break; | ||
586 | udelay(1); | ||
587 | } | ||
588 | tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]); | ||
589 | if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK) == 0) { | ||
590 | tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 1); | ||
591 | WREG32(mmGRPH_UPDATE + crtc_offsets[i], tmp); | ||
592 | } | ||
593 | tmp = RREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i]); | ||
594 | if (REG_GET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK) == 0) { | ||
595 | tmp = REG_SET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK, 1); | ||
596 | WREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp); | ||
597 | } | 576 | } |
598 | #else | 577 | #else |
599 | /* XXX this is a hack to avoid strange behavior with EFI on certain systems */ | 578 | /* XXX this is a hack to avoid strange behavior with EFI on certain systems */ |
@@ -614,54 +593,20 @@ static void dce_v11_0_stop_mc_access(struct amdgpu_device *adev, | |||
614 | static void dce_v11_0_resume_mc_access(struct amdgpu_device *adev, | 593 | static void dce_v11_0_resume_mc_access(struct amdgpu_device *adev, |
615 | struct amdgpu_mode_mc_save *save) | 594 | struct amdgpu_mode_mc_save *save) |
616 | { | 595 | { |
617 | u32 tmp, frame_count; | 596 | u32 tmp; |
618 | int i, j; | 597 | int i; |
619 | 598 | ||
620 | /* update crtc base addresses */ | 599 | /* update crtc base addresses */ |
621 | for (i = 0; i < adev->mode_info.num_crtc; i++) { | 600 | for (i = 0; i < adev->mode_info.num_crtc; i++) { |
622 | WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i], | 601 | WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i], |
623 | upper_32_bits(adev->mc.vram_start)); | 602 | upper_32_bits(adev->mc.vram_start)); |
624 | WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i], | ||
625 | upper_32_bits(adev->mc.vram_start)); | ||
626 | WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i], | 603 | WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i], |
627 | (u32)adev->mc.vram_start); | 604 | (u32)adev->mc.vram_start); |
628 | WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i], | ||
629 | (u32)adev->mc.vram_start); | ||
630 | 605 | ||
631 | if (save->crtc_enabled[i]) { | 606 | if (save->crtc_enabled[i]) { |
632 | tmp = RREG32(mmCRTC_MASTER_UPDATE_MODE + crtc_offsets[i]); | ||
633 | if (REG_GET_FIELD(tmp, CRTC_MASTER_UPDATE_MODE, MASTER_UPDATE_MODE) != 3) { | ||
634 | tmp = REG_SET_FIELD(tmp, CRTC_MASTER_UPDATE_MODE, MASTER_UPDATE_MODE, 3); | ||
635 | WREG32(mmCRTC_MASTER_UPDATE_MODE + crtc_offsets[i], tmp); | ||
636 | } | ||
637 | tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]); | ||
638 | if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK)) { | ||
639 | tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 0); | ||
640 | WREG32(mmGRPH_UPDATE + crtc_offsets[i], tmp); | ||
641 | } | ||
642 | tmp = RREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i]); | ||
643 | if (REG_GET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK)) { | ||
644 | tmp = REG_SET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK, 0); | ||
645 | WREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp); | ||
646 | } | ||
647 | for (j = 0; j < adev->usec_timeout; j++) { | ||
648 | tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]); | ||
649 | if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_SURFACE_UPDATE_PENDING) == 0) | ||
650 | break; | ||
651 | udelay(1); | ||
652 | } | ||
653 | tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]); | 607 | tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]); |
654 | tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 0); | 608 | tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 0); |
655 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1); | ||
656 | WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp); | 609 | WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
657 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
658 | /* wait for the next frame */ | ||
659 | frame_count = amdgpu_display_vblank_get_counter(adev, i); | ||
660 | for (j = 0; j < adev->usec_timeout; j++) { | ||
661 | if (amdgpu_display_vblank_get_counter(adev, i) != frame_count) | ||
662 | break; | ||
663 | udelay(1); | ||
664 | } | ||
665 | } | 610 | } |
666 | } | 611 | } |
667 | 612 | ||