aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-03-02 20:37:07 -0500
committerDave Airlie <airlied@redhat.com>2016-03-02 20:37:07 -0500
commitf0511e66114a6414cfca92d7b94118913a0c11ff (patch)
tree540c2120b02dd1717e8ae5e6eddc8520c49e8cf8 /drivers/gpu
parent2d02b8bdba322b527c5f5168ce1ca10c2d982a78 (diff)
parent0b39c531cfa12dad54eac238c2e303b994df1ef7 (diff)
Merge branch 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
Fixes for radeon and amdgpu: - Fix GPUVM flushing on CI and VI - Misc DPM and Powerplay fixes - VCE DPM fixes for CZ/ST - DP hotplug fix * 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux: drm/amdgpu: return from atombios_dp_get_dpcd only when error drm/amdgpu/cz: remove commented out call to enable vce pg drm/amdgpu/powerplay/cz: enable/disable vce dpm independent of vce pg drm/amdgpu/cz: enable/disable vce dpm even if vce pg is disabled drm/amdgpu/gfx8: specify which engine to wait before vm flush drm/amdgpu: apply gfx_v8 fixes to gfx_v7 as well drm/amd/powerplay: send event to notify powerplay all modules are initialized. drm/amd/powerplay: export AMD_PP_EVENT_COMPLETE_INIT task to amdgpu. drm/radeon/pm: update current crtc info after setting the powerstate drm/amdgpu/pm: update current crtc info after setting the powerstate
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cz_dpm.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c3
-rw-r--r--drivers/gpu/drm/amd/powerplay/amd_powerplay.c5
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c1
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c8
10 files changed, 34 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index 89c3dd62ba21..119cdc2c43e7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -77,7 +77,7 @@ void amdgpu_connector_hotplug(struct drm_connector *connector)
77 } else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) { 77 } else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {
78 /* Don't try to start link training before we 78 /* Don't try to start link training before we
79 * have the dpcd */ 79 * have the dpcd */
80 if (!amdgpu_atombios_dp_get_dpcd(amdgpu_connector)) 80 if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
81 return; 81 return;
82 82
83 /* set it to OFF so that drm_helper_connector_dpms() 83 /* set it to OFF so that drm_helper_connector_dpms()
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index 66855b62a603..95a4a25d8df9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -649,9 +649,6 @@ force:
649 /* update display watermarks based on new power state */ 649 /* update display watermarks based on new power state */
650 amdgpu_display_bandwidth_update(adev); 650 amdgpu_display_bandwidth_update(adev);
651 651
652 adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs;
653 adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count;
654
655 /* wait for the rings to drain */ 652 /* wait for the rings to drain */
656 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 653 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
657 struct amdgpu_ring *ring = adev->rings[i]; 654 struct amdgpu_ring *ring = adev->rings[i];
@@ -670,6 +667,9 @@ force:
670 /* update displays */ 667 /* update displays */
671 amdgpu_dpm_display_configuration_changed(adev); 668 amdgpu_dpm_display_configuration_changed(adev);
672 669
670 adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs;
671 adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count;
672
673 if (adev->pm.funcs->force_performance_level) { 673 if (adev->pm.funcs->force_performance_level) {
674 if (adev->pm.dpm.thermal_active) { 674 if (adev->pm.dpm.thermal_active) {
675 enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level; 675 enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
index b9d0d55f6b47..3cb6d6c413c7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
@@ -143,8 +143,10 @@ static int amdgpu_pp_late_init(void *handle)
143 adev->powerplay.pp_handle); 143 adev->powerplay.pp_handle);
144 144
145#ifdef CONFIG_DRM_AMD_POWERPLAY 145#ifdef CONFIG_DRM_AMD_POWERPLAY
146 if (adev->pp_enabled) 146 if (adev->pp_enabled) {
147 amdgpu_pm_sysfs_init(adev); 147 amdgpu_pm_sysfs_init(adev);
148 amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_COMPLETE_INIT, NULL, NULL);
149 }
148#endif 150#endif
149 return ret; 151 return ret;
150} 152}
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
index 9056355309d1..e7ef2261ff4a 100644
--- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
@@ -2202,8 +2202,7 @@ static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate)
2202 AMD_PG_STATE_GATE); 2202 AMD_PG_STATE_GATE);
2203 2203
2204 cz_enable_vce_dpm(adev, false); 2204 cz_enable_vce_dpm(adev, false);
2205 /* TODO: to figure out why vce can't be poweroff. */ 2205 cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerOFF);
2206 /* cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerOFF); */
2207 pi->vce_power_gated = true; 2206 pi->vce_power_gated = true;
2208 } else { 2207 } else {
2209 cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerON); 2208 cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerON);
@@ -2226,10 +2225,8 @@ static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate)
2226 } 2225 }
2227 } else { /*pi->caps_vce_pg*/ 2226 } else { /*pi->caps_vce_pg*/
2228 cz_update_vce_dpm(adev); 2227 cz_update_vce_dpm(adev);
2229 cz_enable_vce_dpm(adev, true); 2228 cz_enable_vce_dpm(adev, !gate);
2230 } 2229 }
2231
2232 return;
2233} 2230}
2234 2231
2235const struct amd_ip_funcs cz_dpm_ip_funcs = { 2232const struct amd_ip_funcs cz_dpm_ip_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 7732059ae30f..06602df707f8 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -3628,6 +3628,19 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
3628 unsigned vm_id, uint64_t pd_addr) 3628 unsigned vm_id, uint64_t pd_addr)
3629{ 3629{
3630 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 3630 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
3631 uint32_t seq = ring->fence_drv.sync_seq;
3632 uint64_t addr = ring->fence_drv.gpu_addr;
3633
3634 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
3635 amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
3636 WAIT_REG_MEM_FUNCTION(3) | /* equal */
3637 WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */
3638 amdgpu_ring_write(ring, addr & 0xfffffffc);
3639 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
3640 amdgpu_ring_write(ring, seq);
3641 amdgpu_ring_write(ring, 0xffffffff);
3642 amdgpu_ring_write(ring, 4); /* poll interval */
3643
3631 if (usepfp) { 3644 if (usepfp) {
3632 /* synce CE with ME to prevent CE fetch CEIB before context switch done */ 3645 /* synce CE with ME to prevent CE fetch CEIB before context switch done */
3633 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 3646 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 1c40bd90afbb..7086ac17abee 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -4809,7 +4809,8 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
4809 4809
4810 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 4810 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
4811 amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ 4811 amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
4812 WAIT_REG_MEM_FUNCTION(3))); /* equal */ 4812 WAIT_REG_MEM_FUNCTION(3) | /* equal */
4813 WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */
4813 amdgpu_ring_write(ring, addr & 0xfffffffc); 4814 amdgpu_ring_write(ring, addr & 0xfffffffc);
4814 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); 4815 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
4815 amdgpu_ring_write(ring, seq); 4816 amdgpu_ring_write(ring, seq);
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
index aa67244a77ae..589599f66fcc 100644
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
@@ -402,8 +402,11 @@ int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, void *input,
402 402
403 data.requested_ui_label = power_state_convert(ps); 403 data.requested_ui_label = power_state_convert(ps);
404 ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); 404 ret = pem_handle_event(pp_handle->eventmgr, event_id, &data);
405 break;
405 } 406 }
406 break; 407 case AMD_PP_EVENT_COMPLETE_INIT:
408 ret = pem_handle_event(pp_handle->eventmgr, event_id, &data);
409 break;
407 default: 410 default:
408 break; 411 break;
409 } 412 }
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
index 83be3cf210e0..6b52c78cb404 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
@@ -165,6 +165,7 @@ const struct action_chain resume_action_chain = {
165}; 165};
166 166
167static const pem_event_action *complete_init_event[] = { 167static const pem_event_action *complete_init_event[] = {
168 unblock_adjust_power_state_tasks,
168 adjust_power_state_tasks, 169 adjust_power_state_tasks,
169 enable_gfx_clock_gating_tasks, 170 enable_gfx_clock_gating_tasks,
170 enable_gfx_voltage_island_power_gating_tasks, 171 enable_gfx_voltage_island_power_gating_tasks,
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
index ad7700822a1c..ff08ce41bde9 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
@@ -226,7 +226,7 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate)
226 } 226 }
227 } else { 227 } else {
228 cz_dpm_update_vce_dpm(hwmgr); 228 cz_dpm_update_vce_dpm(hwmgr);
229 cz_enable_disable_vce_dpm(hwmgr, true); 229 cz_enable_disable_vce_dpm(hwmgr, !bgate);
230 return 0; 230 return 0;
231 } 231 }
232 232
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index ca3be90a3bb4..0f14d897baf9 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -1080,10 +1080,6 @@ force:
1080 /* update display watermarks based on new power state */ 1080 /* update display watermarks based on new power state */
1081 radeon_bandwidth_update(rdev); 1081 radeon_bandwidth_update(rdev);
1082 1082
1083 rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
1084 rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count;
1085 rdev->pm.dpm.single_display = single_display;
1086
1087 /* wait for the rings to drain */ 1083 /* wait for the rings to drain */
1088 for (i = 0; i < RADEON_NUM_RINGS; i++) { 1084 for (i = 0; i < RADEON_NUM_RINGS; i++) {
1089 struct radeon_ring *ring = &rdev->ring[i]; 1085 struct radeon_ring *ring = &rdev->ring[i];
@@ -1102,6 +1098,10 @@ force:
1102 /* update displays */ 1098 /* update displays */
1103 radeon_dpm_display_configuration_changed(rdev); 1099 radeon_dpm_display_configuration_changed(rdev);
1104 1100
1101 rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
1102 rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count;
1103 rdev->pm.dpm.single_display = single_display;
1104
1105 if (rdev->asic->dpm.force_performance_level) { 1105 if (rdev->asic->dpm.force_performance_level) {
1106 if (rdev->pm.dpm.thermal_active) { 1106 if (rdev->pm.dpm.thermal_active) {
1107 enum radeon_dpm_forced_level level = rdev->pm.dpm.forced_level; 1107 enum radeon_dpm_forced_level level = rdev->pm.dpm.forced_level;