diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v10_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index 7f642b57223e..b888d7223e8e 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | |||
@@ -712,6 +712,45 @@ static void dce_v10_0_set_vga_render_state(struct amdgpu_device *adev, | |||
712 | WREG32(mmVGA_RENDER_CONTROL, tmp); | 712 | WREG32(mmVGA_RENDER_CONTROL, tmp); |
713 | } | 713 | } |
714 | 714 | ||
715 | static int dce_v10_0_get_num_crtc(struct amdgpu_device *adev) | ||
716 | { | ||
717 | int num_crtc = 0; | ||
718 | |||
719 | switch (adev->asic_type) { | ||
720 | case CHIP_FIJI: | ||
721 | case CHIP_TONGA: | ||
722 | num_crtc = 6; | ||
723 | break; | ||
724 | default: | ||
725 | num_crtc = 0; | ||
726 | } | ||
727 | return num_crtc; | ||
728 | } | ||
729 | |||
730 | void dce_v10_0_disable_dce(struct amdgpu_device *adev) | ||
731 | { | ||
732 | /*Disable VGA render and enabled crtc, if has DCE engine*/ | ||
733 | if (amdgpu_atombios_has_dce_engine_info(adev)) { | ||
734 | u32 tmp; | ||
735 | int crtc_enabled, i; | ||
736 | |||
737 | dce_v10_0_set_vga_render_state(adev, false); | ||
738 | |||
739 | /*Disable crtc*/ | ||
740 | for (i = 0; i < dce_v10_0_get_num_crtc(adev); i++) { | ||
741 | crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]), | ||
742 | CRTC_CONTROL, CRTC_MASTER_EN); | ||
743 | if (crtc_enabled) { | ||
744 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1); | ||
745 | tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]); | ||
746 | tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0); | ||
747 | WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp); | ||
748 | WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
749 | } | ||
750 | } | ||
751 | } | ||
752 | } | ||
753 | |||
715 | static void dce_v10_0_program_fmt(struct drm_encoder *encoder) | 754 | static void dce_v10_0_program_fmt(struct drm_encoder *encoder) |
716 | { | 755 | { |
717 | struct drm_device *dev = encoder->dev; | 756 | struct drm_device *dev = encoder->dev; |
@@ -2962,10 +3001,11 @@ static int dce_v10_0_early_init(void *handle) | |||
2962 | dce_v10_0_set_display_funcs(adev); | 3001 | dce_v10_0_set_display_funcs(adev); |
2963 | dce_v10_0_set_irq_funcs(adev); | 3002 | dce_v10_0_set_irq_funcs(adev); |
2964 | 3003 | ||
3004 | adev->mode_info.num_crtc = dce_v10_0_get_num_crtc(adev); | ||
3005 | |||
2965 | switch (adev->asic_type) { | 3006 | switch (adev->asic_type) { |
2966 | case CHIP_FIJI: | 3007 | case CHIP_FIJI: |
2967 | case CHIP_TONGA: | 3008 | case CHIP_TONGA: |
2968 | adev->mode_info.num_crtc = 6; /* XXX 7??? */ | ||
2969 | adev->mode_info.num_hpd = 6; | 3009 | adev->mode_info.num_hpd = 6; |
2970 | adev->mode_info.num_dig = 7; | 3010 | adev->mode_info.num_dig = 7; |
2971 | break; | 3011 | break; |