aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v11_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v11_0.c53
1 files changed, 49 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index d4bf133908b1..cfadd79d2580 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -673,6 +673,53 @@ static void dce_v11_0_set_vga_render_state(struct amdgpu_device *adev,
673 WREG32(mmVGA_RENDER_CONTROL, tmp); 673 WREG32(mmVGA_RENDER_CONTROL, tmp);
674} 674}
675 675
676static int dce_v11_0_get_num_crtc (struct amdgpu_device *adev)
677{
678 int num_crtc = 0;
679
680 switch (adev->asic_type) {
681 case CHIP_CARRIZO:
682 num_crtc = 3;
683 break;
684 case CHIP_STONEY:
685 num_crtc = 2;
686 break;
687 case CHIP_POLARIS10:
688 num_crtc = 6;
689 break;
690 case CHIP_POLARIS11:
691 num_crtc = 5;
692 break;
693 default:
694 num_crtc = 0;
695 }
696 return num_crtc;
697}
698
699void dce_v11_0_disable_dce(struct amdgpu_device *adev)
700{
701 /*Disable VGA render and enabled crtc, if has DCE engine*/
702 if (amdgpu_atombios_has_dce_engine_info(adev)) {
703 u32 tmp;
704 int crtc_enabled, i;
705
706 dce_v11_0_set_vga_render_state(adev, false);
707
708 /*Disable crtc*/
709 for (i = 0; i < dce_v11_0_get_num_crtc(adev); i++) {
710 crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
711 CRTC_CONTROL, CRTC_MASTER_EN);
712 if (crtc_enabled) {
713 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
714 tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
715 tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
716 WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
717 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
718 }
719 }
720 }
721}
722
676static void dce_v11_0_program_fmt(struct drm_encoder *encoder) 723static void dce_v11_0_program_fmt(struct drm_encoder *encoder)
677{ 724{
678 struct drm_device *dev = encoder->dev; 725 struct drm_device *dev = encoder->dev;
@@ -2999,24 +3046,22 @@ static int dce_v11_0_early_init(void *handle)
2999 dce_v11_0_set_display_funcs(adev); 3046 dce_v11_0_set_display_funcs(adev);
3000 dce_v11_0_set_irq_funcs(adev); 3047 dce_v11_0_set_irq_funcs(adev);
3001 3048
3049 adev->mode_info.num_crtc = dce_v11_0_get_num_crtc(adev);
3050
3002 switch (adev->asic_type) { 3051 switch (adev->asic_type) {
3003 case CHIP_CARRIZO: 3052 case CHIP_CARRIZO:
3004 adev->mode_info.num_crtc = 3;
3005 adev->mode_info.num_hpd = 6; 3053 adev->mode_info.num_hpd = 6;
3006 adev->mode_info.num_dig = 9; 3054 adev->mode_info.num_dig = 9;
3007 break; 3055 break;
3008 case CHIP_STONEY: 3056 case CHIP_STONEY:
3009 adev->mode_info.num_crtc = 2;
3010 adev->mode_info.num_hpd = 6; 3057 adev->mode_info.num_hpd = 6;
3011 adev->mode_info.num_dig = 9; 3058 adev->mode_info.num_dig = 9;
3012 break; 3059 break;
3013 case CHIP_POLARIS10: 3060 case CHIP_POLARIS10:
3014 adev->mode_info.num_crtc = 6;
3015 adev->mode_info.num_hpd = 6; 3061 adev->mode_info.num_hpd = 6;
3016 adev->mode_info.num_dig = 6; 3062 adev->mode_info.num_dig = 6;
3017 break; 3063 break;
3018 case CHIP_POLARIS11: 3064 case CHIP_POLARIS11:
3019 adev->mode_info.num_crtc = 5;
3020 adev->mode_info.num_hpd = 5; 3065 adev->mode_info.num_hpd = 5;
3021 adev->mode_info.num_dig = 5; 3066 adev->mode_info.num_dig = 5;
3022 break; 3067 break;