aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_device.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-12-18 14:07:14 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-12-24 17:57:06 -0500
commit6c7bccea390853bdec5b76fe31fc50f3b36f75d5 (patch)
tree2b6002db2816965b8d2850728b81ff0099b036a9 /drivers/gpu/drm/radeon/radeon_device.c
parente14cd2bbcb98541e199b7223f38d61527dfe45c9 (diff)
drm/radeon/pm: move pm handling into the asic specific code
We need more control over the ordering of dpm init with respect to the rest of the asic. Specifically, the SMC has to be initialized before the rlc and cg/pg. The pm code currently initializes late in the driver, but we need it to happen much earlier so move pm handling into the asic specific callbacks. This makes dpm more reliable and makes clockgating work properly on CIK parts and should help on SI parts as well. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_device.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 39b033b441d2..5f0ff43e5bb9 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1330,6 +1330,7 @@ int radeon_device_init(struct radeon_device *rdev,
1330 if (r) 1330 if (r)
1331 return r; 1331 return r;
1332 } 1332 }
1333
1333 if ((radeon_testing & 1)) { 1334 if ((radeon_testing & 1)) {
1334 if (rdev->accel_working) 1335 if (rdev->accel_working)
1335 radeon_test_moves(rdev); 1336 radeon_test_moves(rdev);
@@ -1455,7 +1456,6 @@ int radeon_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
1455 1456
1456 radeon_save_bios_scratch_regs(rdev); 1457 radeon_save_bios_scratch_regs(rdev);
1457 1458
1458 radeon_pm_suspend(rdev);
1459 radeon_suspend(rdev); 1459 radeon_suspend(rdev);
1460 radeon_hpd_fini(rdev); 1460 radeon_hpd_fini(rdev);
1461 /* evict remaining vram memory */ 1461 /* evict remaining vram memory */
@@ -1516,14 +1516,22 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1516 if (r) 1516 if (r)
1517 DRM_ERROR("ib ring test failed (%d).\n", r); 1517 DRM_ERROR("ib ring test failed (%d).\n", r);
1518 1518
1519 radeon_pm_resume(rdev); 1519 if (rdev->pm.dpm_enabled) {
1520 /* do dpm late init */
1521 r = radeon_pm_late_init(rdev);
1522 if (r) {
1523 rdev->pm.dpm_enabled = false;
1524 DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n");
1525 }
1526 }
1527
1520 radeon_restore_bios_scratch_regs(rdev); 1528 radeon_restore_bios_scratch_regs(rdev);
1521 1529
1522 if (fbcon) { 1530 if (fbcon) {
1523 radeon_fbdev_set_suspend(rdev, 0); 1531 radeon_fbdev_set_suspend(rdev, 0);
1524 console_unlock(); 1532 console_unlock();
1525 } 1533 }
1526 1534
1527 /* init dig PHYs, disp eng pll */ 1535 /* init dig PHYs, disp eng pll */
1528 if (rdev->is_atom_bios) { 1536 if (rdev->is_atom_bios) {
1529 radeon_atom_encoder_init(rdev); 1537 radeon_atom_encoder_init(rdev);