diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2015-02-06 12:53:27 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-02-11 12:01:35 -0500 |
commit | 410af8d7285a0b96314845c75c39fd612b755688 (patch) | |
tree | 2f1fe79a27cb08c95673df0a897e5178f128b77a | |
parent | a9c73a0e022c33954835e66fec3cd744af90ec98 (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.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/kv_dpm.c | 17 |
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 | ||
1172 | static 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 | |||
1172 | int kv_dpm_enable(struct radeon_device *rdev) | 1185 | int 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 | } |