diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/kv_dpm.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 8 |
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 | ||
| 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 | } |
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 | ||
| 614 | static ssize_t radeon_hwmon_set_pwm1(struct device *dev, | 614 | static 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 | ||
