drm/radeon: handle cg in SI dpm code
authorAlex Deucher <alexander.deucher@amd.com>
Wed, 14 Aug 2013 21:24:08 +0000 (17:24 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 30 Aug 2013 20:30:51 +0000 (16:30 -0400)
Clockgating needs to be disabled around certain parts
of dpm setup otherwise the smc gets into a bad state
and dpm doesn't work properly.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/si_dpm.c

index 96d96f5df9e7cc9253abfde04c998a0d99ffa4e5..75a435f143807c3cbc528b8303aaec1d77650da9 100644 (file)
@@ -1753,6 +1753,9 @@ static int si_calculate_sclk_params(struct radeon_device *rdev,
                                    u32 engine_clock,
                                    SISLANDS_SMC_SCLK_VALUE *sclk);
 
+extern void si_update_cg(struct radeon_device *rdev,
+                        u32 block, bool enable);
+
 static struct si_power_info *si_get_pi(struct radeon_device *rdev)
 {
         struct si_power_info *pi = rdev->pm.dpm.priv;
@@ -5759,6 +5762,13 @@ int si_dpm_enable(struct radeon_device *rdev)
        struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
        int ret;
 
+       si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
+                           RADEON_CG_BLOCK_MC |
+                           RADEON_CG_BLOCK_SDMA |
+                           RADEON_CG_BLOCK_BIF |
+                           RADEON_CG_BLOCK_UVD |
+                           RADEON_CG_BLOCK_HDP), false);
+
        if (si_is_smc_running(rdev))
                return -EINVAL;
        if (pi->voltage_control)
@@ -5878,6 +5888,13 @@ int si_dpm_enable(struct radeon_device *rdev)
 
        si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
 
+       si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
+                           RADEON_CG_BLOCK_MC |
+                           RADEON_CG_BLOCK_SDMA |
+                           RADEON_CG_BLOCK_BIF |
+                           RADEON_CG_BLOCK_UVD |
+                           RADEON_CG_BLOCK_HDP), true);
+
        ni_update_current_ps(rdev, boot_ps);
 
        return 0;
@@ -5888,6 +5905,13 @@ void si_dpm_disable(struct radeon_device *rdev)
        struct rv7xx_power_info *pi = rv770_get_pi(rdev);
        struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
 
+       si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
+                           RADEON_CG_BLOCK_MC |
+                           RADEON_CG_BLOCK_SDMA |
+                           RADEON_CG_BLOCK_BIF |
+                           RADEON_CG_BLOCK_UVD |
+                           RADEON_CG_BLOCK_HDP), false);
+
        if (!si_is_smc_running(rdev))
                return;
        si_disable_ulv(rdev);
@@ -5952,6 +5976,13 @@ int si_dpm_set_power_state(struct radeon_device *rdev)
        struct radeon_ps *old_ps = &eg_pi->current_rps;
        int ret;
 
+       si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
+                           RADEON_CG_BLOCK_MC |
+                           RADEON_CG_BLOCK_SDMA |
+                           RADEON_CG_BLOCK_BIF |
+                           RADEON_CG_BLOCK_UVD |
+                           RADEON_CG_BLOCK_HDP), false);
+
        ret = si_disable_ulv(rdev);
        if (ret) {
                DRM_ERROR("si_disable_ulv failed\n");
@@ -6050,6 +6081,13 @@ int si_dpm_set_power_state(struct radeon_device *rdev)
                return ret;
        }
 
+       si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
+                           RADEON_CG_BLOCK_MC |
+                           RADEON_CG_BLOCK_SDMA |
+                           RADEON_CG_BLOCK_BIF |
+                           RADEON_CG_BLOCK_UVD |
+                           RADEON_CG_BLOCK_HDP), true);
+
        return 0;
 }