diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v11_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 53 |
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 | ||
676 | static 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 | |||
699 | void 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 | |||
676 | static void dce_v11_0_program_fmt(struct drm_encoder *encoder) | 723 | static 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; |