aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2015-02-06 12:53:27 -0500
committerAlex Deucher <alexander.deucher@amd.com>2015-02-11 12:01:35 -0500
commit410af8d7285a0b96314845c75c39fd612b755688 (patch)
tree2f1fe79a27cb08c95673df0a897e5178f128b77a
parenta9c73a0e022c33954835e66fec3cd744af90ec98 (diff)
drm/radeon: only enable kv/kb dpm interrupts once v3
Enable at init and disable on fini. Workaround for hardware problems. v2 (chk): extend commit message v3: add new function Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Christian König <christian.koenig@amd.com> (v2) Cc: stable@vger.kernel.org
-rw-r--r--drivers/gpu/drm/radeon/cik.c21
-rw-r--r--drivers/gpu/drm/radeon/kv_dpm.c17
2 files changed, 15 insertions, 23 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 55944163dfef..e6a4ba236c70 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -7373,7 +7373,6 @@ int cik_irq_set(struct radeon_device *rdev)
7373 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; 7373 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
7374 u32 grbm_int_cntl = 0; 7374 u32 grbm_int_cntl = 0;
7375 u32 dma_cntl, dma_cntl1; 7375 u32 dma_cntl, dma_cntl1;
7376 u32 thermal_int;
7377 7376
7378 if (!rdev->irq.installed) { 7377 if (!rdev->irq.installed) {
7379 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); 7378 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
@@ -7403,13 +7402,6 @@ int cik_irq_set(struct radeon_device *rdev)
7403 7402
7404 cp_m1p0 = RREG32(CP_ME1_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE; 7403 cp_m1p0 = RREG32(CP_ME1_PIPE0_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
7405 7404
7406 if (rdev->flags & RADEON_IS_IGP)
7407 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
7408 ~(THERM_INTH_MASK | THERM_INTL_MASK);
7409 else
7410 thermal_int = RREG32_SMC(CG_THERMAL_INT) &
7411 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
7412
7413 /* enable CP interrupts on all rings */ 7405 /* enable CP interrupts on all rings */
7414 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) { 7406 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
7415 DRM_DEBUG("cik_irq_set: sw int gfx\n"); 7407 DRM_DEBUG("cik_irq_set: sw int gfx\n");
@@ -7513,14 +7505,6 @@ int cik_irq_set(struct radeon_device *rdev)
7513 hpd6 |= DC_HPDx_INT_EN; 7505 hpd6 |= DC_HPDx_INT_EN;
7514 } 7506 }
7515 7507
7516 if (rdev->irq.dpm_thermal) {
7517 DRM_DEBUG("dpm thermal\n");
7518 if (rdev->flags & RADEON_IS_IGP)
7519 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
7520 else
7521 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
7522 }
7523
7524 WREG32(CP_INT_CNTL_RING0, cp_int_cntl); 7508 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
7525 7509
7526 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl); 7510 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
@@ -7567,11 +7551,6 @@ int cik_irq_set(struct radeon_device *rdev)
7567 WREG32(DC_HPD5_INT_CONTROL, hpd5); 7551 WREG32(DC_HPD5_INT_CONTROL, hpd5);
7568 WREG32(DC_HPD6_INT_CONTROL, hpd6); 7552 WREG32(DC_HPD6_INT_CONTROL, hpd6);
7569 7553
7570 if (rdev->flags & RADEON_IS_IGP)
7571 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
7572 else
7573 WREG32_SMC(CG_THERMAL_INT, thermal_int);
7574
7575 return 0; 7554 return 0;
7576} 7555}
7577 7556
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c
index c5eb286517a8..0e236d067d66 100644
--- a/drivers/gpu/drm/radeon/kv_dpm.c
+++ b/drivers/gpu/drm/radeon/kv_dpm.c
@@ -1169,6 +1169,19 @@ void kv_dpm_enable_bapm(struct radeon_device *rdev, bool enable)
1169 } 1169 }
1170} 1170}
1171 1171
1172static void kv_enable_thermal_int(struct radeon_device *rdev, bool enable)
1173{
1174 u32 thermal_int;
1175
1176 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL);
1177 if (enable)
1178 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
1179 else
1180 thermal_int &= ~(THERM_INTH_MASK | THERM_INTL_MASK);
1181 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
1182
1183}
1184
1172int kv_dpm_enable(struct radeon_device *rdev) 1185int kv_dpm_enable(struct radeon_device *rdev)
1173{ 1186{
1174 struct kv_power_info *pi = kv_get_pi(rdev); 1187 struct kv_power_info *pi = kv_get_pi(rdev);
@@ -1280,8 +1293,7 @@ int kv_dpm_late_enable(struct radeon_device *rdev)
1280 DRM_ERROR("kv_set_thermal_temperature_range failed\n"); 1293 DRM_ERROR("kv_set_thermal_temperature_range failed\n");
1281 return ret; 1294 return ret;
1282 } 1295 }
1283 rdev->irq.dpm_thermal = true; 1296 kv_enable_thermal_int(rdev, true);
1284 radeon_irq_set(rdev);
1285 } 1297 }
1286 1298
1287 /* powerdown unused blocks for now */ 1299 /* powerdown unused blocks for now */
@@ -1312,6 +1324,7 @@ void kv_dpm_disable(struct radeon_device *rdev)
1312 kv_stop_dpm(rdev); 1324 kv_stop_dpm(rdev);
1313 kv_enable_ulv(rdev, false); 1325 kv_enable_ulv(rdev, false);
1314 kv_reset_am(rdev); 1326 kv_reset_am(rdev);
1327 kv_enable_thermal_int(rdev, false);
1315 1328
1316 kv_update_current_ps(rdev, rdev->pm.dpm.boot_ps); 1329 kv_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
1317} 1330}