aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/radeon/cik.c37
-rw-r--r--drivers/gpu/drm/radeon/kv_dpm.c17
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c12
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c8
4 files changed, 48 insertions, 26 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index de77c27d8106..e6a4ba236c70 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -3905,7 +3905,21 @@ void cik_fence_gfx_ring_emit(struct radeon_device *rdev,
3905 struct radeon_ring *ring = &rdev->ring[fence->ring]; 3905 struct radeon_ring *ring = &rdev->ring[fence->ring];
3906 u64 addr = rdev->fence_drv[fence->ring].gpu_addr; 3906 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3907 3907
3908 /* EVENT_WRITE_EOP - flush caches, send int */ 3908 /* Workaround for cache flush problems. First send a dummy EOP
3909 * event down the pipe with seq one below.
3910 */
3911 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3912 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3913 EOP_TC_ACTION_EN |
3914 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
3915 EVENT_INDEX(5)));
3916 radeon_ring_write(ring, addr & 0xfffffffc);
3917 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) |
3918 DATA_SEL(1) | INT_SEL(0));
3919 radeon_ring_write(ring, fence->seq - 1);
3920 radeon_ring_write(ring, 0);
3921
3922 /* Then send the real EOP event down the pipe. */
3909 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 3923 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3910 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN | 3924 radeon_ring_write(ring, (EOP_TCL1_ACTION_EN |
3911 EOP_TC_ACTION_EN | 3925 EOP_TC_ACTION_EN |
@@ -7359,7 +7373,6 @@ int cik_irq_set(struct radeon_device *rdev)
7359 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; 7373 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
7360 u32 grbm_int_cntl = 0; 7374 u32 grbm_int_cntl = 0;
7361 u32 dma_cntl, dma_cntl1; 7375 u32 dma_cntl, dma_cntl1;
7362 u32 thermal_int;
7363 7376
7364 if (!rdev->irq.installed) { 7377 if (!rdev->irq.installed) {
7365 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");
@@ -7389,13 +7402,6 @@ int cik_irq_set(struct radeon_device *rdev)
7389 7402
7390 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;
7391 7404
7392 if (rdev->flags & RADEON_IS_IGP)
7393 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
7394 ~(THERM_INTH_MASK | THERM_INTL_MASK);
7395 else
7396 thermal_int = RREG32_SMC(CG_THERMAL_INT) &
7397 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
7398
7399 /* enable CP interrupts on all rings */ 7405 /* enable CP interrupts on all rings */
7400 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])) {
7401 DRM_DEBUG("cik_irq_set: sw int gfx\n"); 7407 DRM_DEBUG("cik_irq_set: sw int gfx\n");
@@ -7499,14 +7505,6 @@ int cik_irq_set(struct radeon_device *rdev)
7499 hpd6 |= DC_HPDx_INT_EN; 7505 hpd6 |= DC_HPDx_INT_EN;
7500 } 7506 }
7501 7507
7502 if (rdev->irq.dpm_thermal) {
7503 DRM_DEBUG("dpm thermal\n");
7504 if (rdev->flags & RADEON_IS_IGP)
7505 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
7506 else
7507 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
7508 }
7509
7510 WREG32(CP_INT_CNTL_RING0, cp_int_cntl); 7508 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
7511 7509
7512 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl); 7510 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
@@ -7553,11 +7551,6 @@ int cik_irq_set(struct radeon_device *rdev)
7553 WREG32(DC_HPD5_INT_CONTROL, hpd5); 7551 WREG32(DC_HPD5_INT_CONTROL, hpd5);
7554 WREG32(DC_HPD6_INT_CONTROL, hpd6); 7552 WREG32(DC_HPD6_INT_CONTROL, hpd6);
7555 7553
7556 if (rdev->flags & RADEON_IS_IGP)
7557 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
7558 else
7559 WREG32_SMC(CG_THERMAL_INT, thermal_int);
7560
7561 return 0; 7554 return 0;
7562} 7555}
7563 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}
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 1d955776f4d0..43e09942823e 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -238,6 +238,18 @@ int radeon_bo_create(struct radeon_device *rdev,
238 * See https://bugs.freedesktop.org/show_bug.cgi?id=84627 238 * See https://bugs.freedesktop.org/show_bug.cgi?id=84627
239 */ 239 */
240 bo->flags &= ~RADEON_GEM_GTT_WC; 240 bo->flags &= ~RADEON_GEM_GTT_WC;
241#elif defined(CONFIG_X86) && !defined(CONFIG_X86_PAT)
242 /* Don't try to enable write-combining when it can't work, or things
243 * may be slow
244 * See https://bugs.freedesktop.org/show_bug.cgi?id=88758
245 */
246
247#warning Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance \
248 thanks to write-combining
249
250 DRM_INFO_ONCE("Please enable CONFIG_MTRR and CONFIG_X86_PAT for "
251 "better performance thanks to write-combining\n");
252 bo->flags &= ~RADEON_GEM_GTT_WC;
241#endif 253#endif
242 254
243 radeon_ttm_placement_from_domain(bo, domain); 255 radeon_ttm_placement_from_domain(bo, domain);
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 91e1bd246cad..9f758d39420d 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -585,7 +585,7 @@ static ssize_t radeon_hwmon_set_pwm1_enable(struct device *dev,
585 if (err) 585 if (err)
586 return err; 586 return err;
587 587
588 switch(value) { 588 switch (value) {
589 case 1: /* manual, percent-based */ 589 case 1: /* manual, percent-based */
590 rdev->asic->dpm.fan_ctrl_set_mode(rdev, FDO_PWM_MODE_STATIC); 590 rdev->asic->dpm.fan_ctrl_set_mode(rdev, FDO_PWM_MODE_STATIC);
591 break; 591 break;
@@ -608,7 +608,7 @@ static ssize_t radeon_hwmon_get_pwm1_max(struct device *dev,
608 struct device_attribute *attr, 608 struct device_attribute *attr,
609 char *buf) 609 char *buf)
610{ 610{
611 return sprintf(buf, "%i\n", 100); /* pwm uses percent-based fan-control */ 611 return sprintf(buf, "%i\n", 255);
612} 612}
613 613
614static ssize_t radeon_hwmon_set_pwm1(struct device *dev, 614static ssize_t radeon_hwmon_set_pwm1(struct device *dev,
@@ -623,6 +623,8 @@ static ssize_t radeon_hwmon_set_pwm1(struct device *dev,
623 if (err) 623 if (err)
624 return err; 624 return err;
625 625
626 value = (value * 100) / 255;
627
626 err = rdev->asic->dpm.set_fan_speed_percent(rdev, value); 628 err = rdev->asic->dpm.set_fan_speed_percent(rdev, value);
627 if (err) 629 if (err)
628 return err; 630 return err;
@@ -642,6 +644,8 @@ static ssize_t radeon_hwmon_get_pwm1(struct device *dev,
642 if (err) 644 if (err)
643 return err; 645 return err;
644 646
647 speed = (speed * 255) / 100;
648
645 return sprintf(buf, "%i\n", speed); 649 return sprintf(buf, "%i\n", speed);
646} 650}
647 651