aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
diff options
context:
space:
mode:
authorEmily Deng <Emily.Deng@amd.com>2016-08-07 23:33:11 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-08 14:04:37 -0400
commit83c9b0253b1136b1312fd2a0bfd173f625c65091 (patch)
treef876ef61fd5c8728c5328763f13fe4d31c7342b4 /drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
parent0bad1619ff5cce53964785a9faedcfb1d4810223 (diff)
drm/amdgpu: Disable VGA render and crtc when init GMC.
For virtual display feature, when the GPU has DCE engine, need to disable the VGA render and CRTC, or it will hang when initialize GMC. Signed-off-by: Emily Deng <Emily.Deng@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
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;