aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérôme Glisse <jglisse@redhat.com>2015-06-05 13:33:57 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-06-11 10:26:42 -0400
commit6dfd197283bffc23a2b046a7f065588de7e1fc1e (patch)
treecc01011088c4f4ecb7bfbe5febfd15d931f74b05
parent38d8571dad8a759bdc051dbff747b189c90658cf (diff)
drm/radeon: fix freeze for laptop with Turks/Thames GPU.
Laptop with Turks/Thames GPU will freeze if dpm is enabled. It seems the SMC engine is relying on some state inside the CP engine. CP needs to chew at least one packet for it to get in good state for dynamic power management. This patch simply disabled and re-enable DPM after the ring test which is enough to avoid the freeze. Signed-off-by: Jérôme Glisse <jglisse@redhat.com> Cc: stable@vger.kernel.org Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index b7ca4c514621..a7fdfa4f0857 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1463,6 +1463,21 @@ int radeon_device_init(struct radeon_device *rdev,
1463 if (r) 1463 if (r)
1464 DRM_ERROR("ib ring test failed (%d).\n", r); 1464 DRM_ERROR("ib ring test failed (%d).\n", r);
1465 1465
1466 /*
1467 * Turks/Thames GPU will freeze whole laptop if DPM is not restarted
1468 * after the CP ring have chew one packet at least. Hence here we stop
1469 * and restart DPM after the radeon_ib_ring_tests().
1470 */
1471 if (rdev->pm.dpm_enabled &&
1472 (rdev->pm.pm_method == PM_METHOD_DPM) &&
1473 (rdev->family == CHIP_TURKS) &&
1474 (rdev->flags & RADEON_IS_MOBILITY)) {
1475 mutex_lock(&rdev->pm.mutex);
1476 radeon_dpm_disable(rdev);
1477 radeon_dpm_enable(rdev);
1478 mutex_unlock(&rdev->pm.mutex);
1479 }
1480
1466 if ((radeon_testing & 1)) { 1481 if ((radeon_testing & 1)) {
1467 if (rdev->accel_working) 1482 if (rdev->accel_working)
1468 radeon_test_moves(rdev); 1483 radeon_test_moves(rdev);