aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v8_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v8_0.c51
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
607static 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
629void 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
607static void dce_v8_0_program_fmt(struct drm_encoder *encoder) 653static 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;