diff options
author | Dave Airlie <airlied@redhat.com> | 2017-05-25 21:51:55 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-05-25 21:51:55 -0400 |
commit | bc1f0e04da20473d6fea4444b0cd9ac638a348d5 (patch) | |
tree | 0a424db08e1405b109288bef14220a7ab8a3e872 | |
parent | 538fd19ed7e24728b469704f702c2826281578b4 (diff) | |
parent | b62ce397675502325d4282924bf70cfb6a005c3a (diff) |
Merge branch 'drm-fixes-4.12' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
A bunch of bug fixes:
- Fix display flickering on some chips at high refresh rates
- suspend/resume fix
- hotplug fix
- a couple of segfault fixes for certain cases
* 'drm-fixes-4.12' of git://people.freedesktop.org/~agd5f/linux:
drm/amdgpu: fix null point error when rmmod amdgpu.
drm/amd/powerplay: fix a signedness bugs
drm/amdgpu: fix NULL pointer panic of emit_gds_switch
drm/radeon: Unbreak HPD handling for r600+
drm/amd/powerplay/smu7: disable mclk switching for high refresh rates
drm/amd/powerplay/smu7: add vblank check for mclk switching (v2)
drm/radeon/ci: disable mclk switching for high refresh rates (v2)
drm/amdgpu/ci: disable mclk switching for high refresh rates (v2)
drm/amdgpu: fix fundamental suspend/resume issue
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/ci_dpm.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 32 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ci_dpm.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 4 |
15 files changed, 85 insertions, 68 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index 236d9950221b..c0d8c6ff6380 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | |||
@@ -425,10 +425,15 @@ bool amdgpu_fbdev_robj_is_fb(struct amdgpu_device *adev, struct amdgpu_bo *robj) | |||
425 | 425 | ||
426 | void amdgpu_fbdev_restore_mode(struct amdgpu_device *adev) | 426 | void amdgpu_fbdev_restore_mode(struct amdgpu_device *adev) |
427 | { | 427 | { |
428 | struct amdgpu_fbdev *afbdev = adev->mode_info.rfbdev; | 428 | struct amdgpu_fbdev *afbdev; |
429 | struct drm_fb_helper *fb_helper; | 429 | struct drm_fb_helper *fb_helper; |
430 | int ret; | 430 | int ret; |
431 | 431 | ||
432 | if (!adev) | ||
433 | return; | ||
434 | |||
435 | afbdev = adev->mode_info.rfbdev; | ||
436 | |||
432 | if (!afbdev) | 437 | if (!afbdev) |
433 | return; | 438 | return; |
434 | 439 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 07ff3b1514f1..8ecf82c5fe74 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -634,7 +634,7 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job) | |||
634 | mutex_unlock(&id_mgr->lock); | 634 | mutex_unlock(&id_mgr->lock); |
635 | } | 635 | } |
636 | 636 | ||
637 | if (gds_switch_needed) { | 637 | if (ring->funcs->emit_gds_switch && gds_switch_needed) { |
638 | id->gds_base = job->gds_base; | 638 | id->gds_base = job->gds_base; |
639 | id->gds_size = job->gds_size; | 639 | id->gds_size = job->gds_size; |
640 | id->gws_base = job->gws_base; | 640 | id->gws_base = job->gws_base; |
@@ -672,6 +672,7 @@ void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, | |||
672 | struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub]; | 672 | struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub]; |
673 | struct amdgpu_vm_id *id = &id_mgr->ids[vmid]; | 673 | struct amdgpu_vm_id *id = &id_mgr->ids[vmid]; |
674 | 674 | ||
675 | atomic64_set(&id->owner, 0); | ||
675 | id->gds_base = 0; | 676 | id->gds_base = 0; |
676 | id->gds_size = 0; | 677 | id->gds_size = 0; |
677 | id->gws_base = 0; | 678 | id->gws_base = 0; |
@@ -681,6 +682,26 @@ void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, | |||
681 | } | 682 | } |
682 | 683 | ||
683 | /** | 684 | /** |
685 | * amdgpu_vm_reset_all_id - reset VMID to zero | ||
686 | * | ||
687 | * @adev: amdgpu device structure | ||
688 | * | ||
689 | * Reset VMID to force flush on next use | ||
690 | */ | ||
691 | void amdgpu_vm_reset_all_ids(struct amdgpu_device *adev) | ||
692 | { | ||
693 | unsigned i, j; | ||
694 | |||
695 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | ||
696 | struct amdgpu_vm_id_manager *id_mgr = | ||
697 | &adev->vm_manager.id_mgr[i]; | ||
698 | |||
699 | for (j = 1; j < id_mgr->num_ids; ++j) | ||
700 | amdgpu_vm_reset_id(adev, i, j); | ||
701 | } | ||
702 | } | ||
703 | |||
704 | /** | ||
684 | * amdgpu_vm_bo_find - find the bo_va for a specific vm & bo | 705 | * amdgpu_vm_bo_find - find the bo_va for a specific vm & bo |
685 | * | 706 | * |
686 | * @vm: requested vm | 707 | * @vm: requested vm |
@@ -2270,7 +2291,6 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev) | |||
2270 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) | 2291 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) |
2271 | adev->vm_manager.seqno[i] = 0; | 2292 | adev->vm_manager.seqno[i] = 0; |
2272 | 2293 | ||
2273 | |||
2274 | atomic_set(&adev->vm_manager.vm_pte_next_ring, 0); | 2294 | atomic_set(&adev->vm_manager.vm_pte_next_ring, 0); |
2275 | atomic64_set(&adev->vm_manager.client_counter, 0); | 2295 | atomic64_set(&adev->vm_manager.client_counter, 0); |
2276 | spin_lock_init(&adev->vm_manager.prt_lock); | 2296 | spin_lock_init(&adev->vm_manager.prt_lock); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index d97e28b4bdc4..e1d951ece433 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | |||
@@ -204,6 +204,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
204 | int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); | 204 | int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); |
205 | void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, | 205 | void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, |
206 | unsigned vmid); | 206 | unsigned vmid); |
207 | void amdgpu_vm_reset_all_ids(struct amdgpu_device *adev); | ||
207 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, | 208 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, |
208 | struct amdgpu_vm *vm); | 209 | struct amdgpu_vm *vm); |
209 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, | 210 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, |
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c index 6dc1410b380f..ec93714e4524 100644 --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c | |||
@@ -906,6 +906,12 @@ static bool ci_dpm_vblank_too_short(struct amdgpu_device *adev) | |||
906 | u32 vblank_time = amdgpu_dpm_get_vblank_time(adev); | 906 | u32 vblank_time = amdgpu_dpm_get_vblank_time(adev); |
907 | u32 switch_limit = adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5 ? 450 : 300; | 907 | u32 switch_limit = adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5 ? 450 : 300; |
908 | 908 | ||
909 | /* disable mclk switching if the refresh is >120Hz, even if the | ||
910 | * blanking period would allow it | ||
911 | */ | ||
912 | if (amdgpu_dpm_get_vrefresh(adev) > 120) | ||
913 | return true; | ||
914 | |||
909 | if (vblank_time < switch_limit) | 915 | if (vblank_time < switch_limit) |
910 | return true; | 916 | return true; |
911 | else | 917 | else |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index a572979f186c..d860939152df 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | |||
@@ -950,10 +950,6 @@ static int gmc_v6_0_suspend(void *handle) | |||
950 | { | 950 | { |
951 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 951 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
952 | 952 | ||
953 | if (adev->vm_manager.enabled) { | ||
954 | gmc_v6_0_vm_fini(adev); | ||
955 | adev->vm_manager.enabled = false; | ||
956 | } | ||
957 | gmc_v6_0_hw_fini(adev); | 953 | gmc_v6_0_hw_fini(adev); |
958 | 954 | ||
959 | return 0; | 955 | return 0; |
@@ -968,16 +964,9 @@ static int gmc_v6_0_resume(void *handle) | |||
968 | if (r) | 964 | if (r) |
969 | return r; | 965 | return r; |
970 | 966 | ||
971 | if (!adev->vm_manager.enabled) { | 967 | amdgpu_vm_reset_all_ids(adev); |
972 | r = gmc_v6_0_vm_init(adev); | ||
973 | if (r) { | ||
974 | dev_err(adev->dev, "vm manager initialization failed (%d).\n", r); | ||
975 | return r; | ||
976 | } | ||
977 | adev->vm_manager.enabled = true; | ||
978 | } | ||
979 | 968 | ||
980 | return r; | 969 | return 0; |
981 | } | 970 | } |
982 | 971 | ||
983 | static bool gmc_v6_0_is_idle(void *handle) | 972 | static bool gmc_v6_0_is_idle(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index a9083a16a250..2750e5c23813 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | |||
@@ -1117,10 +1117,6 @@ static int gmc_v7_0_suspend(void *handle) | |||
1117 | { | 1117 | { |
1118 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1118 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1119 | 1119 | ||
1120 | if (adev->vm_manager.enabled) { | ||
1121 | gmc_v7_0_vm_fini(adev); | ||
1122 | adev->vm_manager.enabled = false; | ||
1123 | } | ||
1124 | gmc_v7_0_hw_fini(adev); | 1120 | gmc_v7_0_hw_fini(adev); |
1125 | 1121 | ||
1126 | return 0; | 1122 | return 0; |
@@ -1135,16 +1131,9 @@ static int gmc_v7_0_resume(void *handle) | |||
1135 | if (r) | 1131 | if (r) |
1136 | return r; | 1132 | return r; |
1137 | 1133 | ||
1138 | if (!adev->vm_manager.enabled) { | 1134 | amdgpu_vm_reset_all_ids(adev); |
1139 | r = gmc_v7_0_vm_init(adev); | ||
1140 | if (r) { | ||
1141 | dev_err(adev->dev, "vm manager initialization failed (%d).\n", r); | ||
1142 | return r; | ||
1143 | } | ||
1144 | adev->vm_manager.enabled = true; | ||
1145 | } | ||
1146 | 1135 | ||
1147 | return r; | 1136 | return 0; |
1148 | } | 1137 | } |
1149 | 1138 | ||
1150 | static bool gmc_v7_0_is_idle(void *handle) | 1139 | static bool gmc_v7_0_is_idle(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 4ac99784160a..f56b4089ee9f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -1209,10 +1209,6 @@ static int gmc_v8_0_suspend(void *handle) | |||
1209 | { | 1209 | { |
1210 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1210 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1211 | 1211 | ||
1212 | if (adev->vm_manager.enabled) { | ||
1213 | gmc_v8_0_vm_fini(adev); | ||
1214 | adev->vm_manager.enabled = false; | ||
1215 | } | ||
1216 | gmc_v8_0_hw_fini(adev); | 1212 | gmc_v8_0_hw_fini(adev); |
1217 | 1213 | ||
1218 | return 0; | 1214 | return 0; |
@@ -1227,16 +1223,9 @@ static int gmc_v8_0_resume(void *handle) | |||
1227 | if (r) | 1223 | if (r) |
1228 | return r; | 1224 | return r; |
1229 | 1225 | ||
1230 | if (!adev->vm_manager.enabled) { | 1226 | amdgpu_vm_reset_all_ids(adev); |
1231 | r = gmc_v8_0_vm_init(adev); | ||
1232 | if (r) { | ||
1233 | dev_err(adev->dev, "vm manager initialization failed (%d).\n", r); | ||
1234 | return r; | ||
1235 | } | ||
1236 | adev->vm_manager.enabled = true; | ||
1237 | } | ||
1238 | 1227 | ||
1239 | return r; | 1228 | return 0; |
1240 | } | 1229 | } |
1241 | 1230 | ||
1242 | static bool gmc_v8_0_is_idle(void *handle) | 1231 | static bool gmc_v8_0_is_idle(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index dc1e1c1d6b24..f936332a069d 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | |||
@@ -791,10 +791,6 @@ static int gmc_v9_0_suspend(void *handle) | |||
791 | { | 791 | { |
792 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 792 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
793 | 793 | ||
794 | if (adev->vm_manager.enabled) { | ||
795 | gmc_v9_0_vm_fini(adev); | ||
796 | adev->vm_manager.enabled = false; | ||
797 | } | ||
798 | gmc_v9_0_hw_fini(adev); | 794 | gmc_v9_0_hw_fini(adev); |
799 | 795 | ||
800 | return 0; | 796 | return 0; |
@@ -809,17 +805,9 @@ static int gmc_v9_0_resume(void *handle) | |||
809 | if (r) | 805 | if (r) |
810 | return r; | 806 | return r; |
811 | 807 | ||
812 | if (!adev->vm_manager.enabled) { | 808 | amdgpu_vm_reset_all_ids(adev); |
813 | r = gmc_v9_0_vm_init(adev); | ||
814 | if (r) { | ||
815 | dev_err(adev->dev, | ||
816 | "vm manager initialization failed (%d).\n", r); | ||
817 | return r; | ||
818 | } | ||
819 | adev->vm_manager.enabled = true; | ||
820 | } | ||
821 | 809 | ||
822 | return r; | 810 | return 0; |
823 | } | 811 | } |
824 | 812 | ||
825 | static bool gmc_v9_0_is_idle(void *handle) | 813 | static bool gmc_v9_0_is_idle(void *handle) |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index a74a3db3056c..102eb6d029fa 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
@@ -2655,6 +2655,28 @@ static int smu7_get_power_state_size(struct pp_hwmgr *hwmgr) | |||
2655 | return sizeof(struct smu7_power_state); | 2655 | return sizeof(struct smu7_power_state); |
2656 | } | 2656 | } |
2657 | 2657 | ||
2658 | static int smu7_vblank_too_short(struct pp_hwmgr *hwmgr, | ||
2659 | uint32_t vblank_time_us) | ||
2660 | { | ||
2661 | struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); | ||
2662 | uint32_t switch_limit_us; | ||
2663 | |||
2664 | switch (hwmgr->chip_id) { | ||
2665 | case CHIP_POLARIS10: | ||
2666 | case CHIP_POLARIS11: | ||
2667 | case CHIP_POLARIS12: | ||
2668 | switch_limit_us = data->is_memory_gddr5 ? 190 : 150; | ||
2669 | break; | ||
2670 | default: | ||
2671 | switch_limit_us = data->is_memory_gddr5 ? 450 : 150; | ||
2672 | break; | ||
2673 | } | ||
2674 | |||
2675 | if (vblank_time_us < switch_limit_us) | ||
2676 | return true; | ||
2677 | else | ||
2678 | return false; | ||
2679 | } | ||
2658 | 2680 | ||
2659 | static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, | 2681 | static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, |
2660 | struct pp_power_state *request_ps, | 2682 | struct pp_power_state *request_ps, |
@@ -2669,6 +2691,7 @@ static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, | |||
2669 | bool disable_mclk_switching; | 2691 | bool disable_mclk_switching; |
2670 | bool disable_mclk_switching_for_frame_lock; | 2692 | bool disable_mclk_switching_for_frame_lock; |
2671 | struct cgs_display_info info = {0}; | 2693 | struct cgs_display_info info = {0}; |
2694 | struct cgs_mode_info mode_info = {0}; | ||
2672 | const struct phm_clock_and_voltage_limits *max_limits; | 2695 | const struct phm_clock_and_voltage_limits *max_limits; |
2673 | uint32_t i; | 2696 | uint32_t i; |
2674 | struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); | 2697 | struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); |
@@ -2677,6 +2700,7 @@ static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, | |||
2677 | int32_t count; | 2700 | int32_t count; |
2678 | int32_t stable_pstate_sclk = 0, stable_pstate_mclk = 0; | 2701 | int32_t stable_pstate_sclk = 0, stable_pstate_mclk = 0; |
2679 | 2702 | ||
2703 | info.mode_info = &mode_info; | ||
2680 | data->battery_state = (PP_StateUILabel_Battery == | 2704 | data->battery_state = (PP_StateUILabel_Battery == |
2681 | request_ps->classification.ui_label); | 2705 | request_ps->classification.ui_label); |
2682 | 2706 | ||
@@ -2703,8 +2727,6 @@ static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, | |||
2703 | 2727 | ||
2704 | cgs_get_active_displays_info(hwmgr->device, &info); | 2728 | cgs_get_active_displays_info(hwmgr->device, &info); |
2705 | 2729 | ||
2706 | /*TO DO result = PHM_CheckVBlankTime(hwmgr, &vblankTooShort);*/ | ||
2707 | |||
2708 | minimum_clocks.engineClock = hwmgr->display_config.min_core_set_clock; | 2730 | minimum_clocks.engineClock = hwmgr->display_config.min_core_set_clock; |
2709 | minimum_clocks.memoryClock = hwmgr->display_config.min_mem_set_clock; | 2731 | minimum_clocks.memoryClock = hwmgr->display_config.min_mem_set_clock; |
2710 | 2732 | ||
@@ -2769,8 +2791,10 @@ static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, | |||
2769 | PHM_PlatformCaps_DisableMclkSwitchingForFrameLock); | 2791 | PHM_PlatformCaps_DisableMclkSwitchingForFrameLock); |
2770 | 2792 | ||
2771 | 2793 | ||
2772 | disable_mclk_switching = (1 < info.display_count) || | 2794 | disable_mclk_switching = ((1 < info.display_count) || |
2773 | disable_mclk_switching_for_frame_lock; | 2795 | disable_mclk_switching_for_frame_lock || |
2796 | smu7_vblank_too_short(hwmgr, mode_info.vblank_time_us) || | ||
2797 | (mode_info.refresh_rate > 120)); | ||
2774 | 2798 | ||
2775 | sclk = smu7_ps->performance_levels[0].engine_clock; | 2799 | sclk = smu7_ps->performance_levels[0].engine_clock; |
2776 | mclk = smu7_ps->performance_levels[0].memory_clock; | 2800 | mclk = smu7_ps->performance_levels[0].memory_clock; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index ad30f5d3a10d..2614af2f553f 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | |||
@@ -4186,7 +4186,7 @@ static int vega10_force_clock_level(struct pp_hwmgr *hwmgr, | |||
4186 | enum pp_clock_type type, uint32_t mask) | 4186 | enum pp_clock_type type, uint32_t mask) |
4187 | { | 4187 | { |
4188 | struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend); | 4188 | struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend); |
4189 | uint32_t i; | 4189 | int i; |
4190 | 4190 | ||
4191 | if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) | 4191 | if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) |
4192 | return -EINVAL; | 4192 | return -EINVAL; |
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c index 7ba450832e6b..ea36dc4dd5d2 100644 --- a/drivers/gpu/drm/radeon/ci_dpm.c +++ b/drivers/gpu/drm/radeon/ci_dpm.c | |||
@@ -776,6 +776,12 @@ bool ci_dpm_vblank_too_short(struct radeon_device *rdev) | |||
776 | u32 vblank_time = r600_dpm_get_vblank_time(rdev); | 776 | u32 vblank_time = r600_dpm_get_vblank_time(rdev); |
777 | u32 switch_limit = pi->mem_gddr5 ? 450 : 300; | 777 | u32 switch_limit = pi->mem_gddr5 ? 450 : 300; |
778 | 778 | ||
779 | /* disable mclk switching if the refresh is >120Hz, even if the | ||
780 | * blanking period would allow it | ||
781 | */ | ||
782 | if (r600_dpm_get_vrefresh(rdev) > 120) | ||
783 | return true; | ||
784 | |||
779 | if (vblank_time < switch_limit) | 785 | if (vblank_time < switch_limit) |
780 | return true; | 786 | return true; |
781 | else | 787 | else |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index ccebe0f8d2e1..008c145b7f29 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -7401,7 +7401,7 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
7401 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 7401 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
7402 | } | 7402 | } |
7403 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) { | 7403 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
7404 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 7404 | tmp = RREG32(DC_HPD6_INT_CONTROL); |
7405 | tmp |= DC_HPDx_INT_ACK; | 7405 | tmp |= DC_HPDx_INT_ACK; |
7406 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 7406 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
7407 | } | 7407 | } |
@@ -7431,7 +7431,7 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
7431 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 7431 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
7432 | } | 7432 | } |
7433 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | 7433 | if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { |
7434 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 7434 | tmp = RREG32(DC_HPD6_INT_CONTROL); |
7435 | tmp |= DC_HPDx_RX_INT_ACK; | 7435 | tmp |= DC_HPDx_RX_INT_ACK; |
7436 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 7436 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
7437 | } | 7437 | } |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index f130ec41ee4b..0bf103536404 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -4927,7 +4927,7 @@ static void evergreen_irq_ack(struct radeon_device *rdev) | |||
4927 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 4927 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
4928 | } | 4928 | } |
4929 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { | 4929 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
4930 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 4930 | tmp = RREG32(DC_HPD6_INT_CONTROL); |
4931 | tmp |= DC_HPDx_INT_ACK; | 4931 | tmp |= DC_HPDx_INT_ACK; |
4932 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 4932 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
4933 | } | 4933 | } |
@@ -4958,7 +4958,7 @@ static void evergreen_irq_ack(struct radeon_device *rdev) | |||
4958 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 4958 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
4959 | } | 4959 | } |
4960 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | 4960 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { |
4961 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 4961 | tmp = RREG32(DC_HPD6_INT_CONTROL); |
4962 | tmp |= DC_HPDx_RX_INT_ACK; | 4962 | tmp |= DC_HPDx_RX_INT_ACK; |
4963 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 4963 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
4964 | } | 4964 | } |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 0a085176e79b..e06e2d8feab3 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -3988,7 +3988,7 @@ static void r600_irq_ack(struct radeon_device *rdev) | |||
3988 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 3988 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
3989 | } | 3989 | } |
3990 | if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) { | 3990 | if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) { |
3991 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 3991 | tmp = RREG32(DC_HPD6_INT_CONTROL); |
3992 | tmp |= DC_HPDx_INT_ACK; | 3992 | tmp |= DC_HPDx_INT_ACK; |
3993 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 3993 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
3994 | } | 3994 | } |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index ceee87f029d9..76d1888528e6 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -6317,7 +6317,7 @@ static inline void si_irq_ack(struct radeon_device *rdev) | |||
6317 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 6317 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
6318 | } | 6318 | } |
6319 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { | 6319 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
6320 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 6320 | tmp = RREG32(DC_HPD6_INT_CONTROL); |
6321 | tmp |= DC_HPDx_INT_ACK; | 6321 | tmp |= DC_HPDx_INT_ACK; |
6322 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 6322 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
6323 | } | 6323 | } |
@@ -6348,7 +6348,7 @@ static inline void si_irq_ack(struct radeon_device *rdev) | |||
6348 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 6348 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
6349 | } | 6349 | } |
6350 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | 6350 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { |
6351 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 6351 | tmp = RREG32(DC_HPD6_INT_CONTROL); |
6352 | tmp |= DC_HPDx_RX_INT_ACK; | 6352 | tmp |= DC_HPDx_RX_INT_ACK; |
6353 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 6353 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
6354 | } | 6354 | } |