diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v8_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index 4fdfab1e9200..e4467b8ff40c 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | |||
@@ -604,6 +604,52 @@ static void dce_v8_0_set_vga_render_state(struct amdgpu_device *adev, | |||
604 | WREG32(mmVGA_RENDER_CONTROL, tmp); | 604 | WREG32(mmVGA_RENDER_CONTROL, tmp); |
605 | } | 605 | } |
606 | 606 | ||
607 | static int dce_v8_0_get_num_crtc(struct amdgpu_device *adev) | ||
608 | { | ||
609 | int num_crtc = 0; | ||
610 | |||
611 | switch (adev->asic_type) { | ||
612 | case CHIP_BONAIRE: | ||
613 | case CHIP_HAWAII: | ||
614 | num_crtc = 6; | ||
615 | break; | ||
616 | case CHIP_KAVERI: | ||
617 | num_crtc = 4; | ||
618 | break; | ||
619 | case CHIP_KABINI: | ||
620 | case CHIP_MULLINS: | ||
621 | num_crtc = 2; | ||
622 | break; | ||
623 | default: | ||
624 | num_crtc = 0; | ||
625 | } | ||
626 | return num_crtc; | ||
627 | } | ||
628 | |||
629 | void dce_v8_0_disable_dce(struct amdgpu_device *adev) | ||
630 | { | ||
631 | /*Disable VGA render and enabled crtc, if has DCE engine*/ | ||
632 | if (amdgpu_atombios_has_dce_engine_info(adev)) { | ||
633 | u32 tmp; | ||
634 | int crtc_enabled, i; | ||
635 | |||
636 | dce_v8_0_set_vga_render_state(adev, false); | ||
637 | |||
638 | /*Disable crtc*/ | ||
639 | for (i = 0; i < dce_v8_0_get_num_crtc(adev); i++) { | ||
640 | crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]), | ||
641 | CRTC_CONTROL, CRTC_MASTER_EN); | ||
642 | if (crtc_enabled) { | ||
643 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1); | ||
644 | tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]); | ||
645 | tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0); | ||
646 | WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp); | ||
647 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
648 | } | ||
649 | } | ||
650 | } | ||
651 | } | ||
652 | |||
607 | static void dce_v8_0_program_fmt(struct drm_encoder *encoder) | 653 | static void dce_v8_0_program_fmt(struct drm_encoder *encoder) |
608 | { | 654 | { |
609 | struct drm_device *dev = encoder->dev; | 655 | struct drm_device *dev = encoder->dev; |
@@ -2803,21 +2849,20 @@ static int dce_v8_0_early_init(void *handle) | |||
2803 | dce_v8_0_set_display_funcs(adev); | 2849 | dce_v8_0_set_display_funcs(adev); |
2804 | dce_v8_0_set_irq_funcs(adev); | 2850 | dce_v8_0_set_irq_funcs(adev); |
2805 | 2851 | ||
2852 | adev->mode_info.num_crtc = dce_v8_0_get_num_crtc(adev); | ||
2853 | |||
2806 | switch (adev->asic_type) { | 2854 | switch (adev->asic_type) { |
2807 | case CHIP_BONAIRE: | 2855 | case CHIP_BONAIRE: |
2808 | case CHIP_HAWAII: | 2856 | case CHIP_HAWAII: |
2809 | adev->mode_info.num_crtc = 6; | ||
2810 | adev->mode_info.num_hpd = 6; | 2857 | adev->mode_info.num_hpd = 6; |
2811 | adev->mode_info.num_dig = 6; | 2858 | adev->mode_info.num_dig = 6; |
2812 | break; | 2859 | break; |
2813 | case CHIP_KAVERI: | 2860 | case CHIP_KAVERI: |
2814 | adev->mode_info.num_crtc = 4; | ||
2815 | adev->mode_info.num_hpd = 6; | 2861 | adev->mode_info.num_hpd = 6; |
2816 | adev->mode_info.num_dig = 7; | 2862 | adev->mode_info.num_dig = 7; |
2817 | break; | 2863 | break; |
2818 | case CHIP_KABINI: | 2864 | case CHIP_KABINI: |
2819 | case CHIP_MULLINS: | 2865 | case CHIP_MULLINS: |
2820 | adev->mode_info.num_crtc = 2; | ||
2821 | adev->mode_info.num_hpd = 6; | 2866 | adev->mode_info.num_hpd = 6; |
2822 | adev->mode_info.num_dig = 6; /* ? */ | 2867 | adev->mode_info.num_dig = 6; /* ? */ |
2823 | break; | 2868 | break; |