diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_sysfs.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 10 |
3 files changed, 23 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 66ee9d888d16..6ff5d655c202 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -434,20 +434,28 @@ i915_gem_object_wait_reservation(struct reservation_object *resv, | |||
| 434 | dma_fence_put(shared[i]); | 434 | dma_fence_put(shared[i]); |
| 435 | kfree(shared); | 435 | kfree(shared); |
| 436 | 436 | ||
| 437 | /* | ||
| 438 | * If both shared fences and an exclusive fence exist, | ||
| 439 | * then by construction the shared fences must be later | ||
| 440 | * than the exclusive fence. If we successfully wait for | ||
| 441 | * all the shared fences, we know that the exclusive fence | ||
| 442 | * must all be signaled. If all the shared fences are | ||
| 443 | * signaled, we can prune the array and recover the | ||
| 444 | * floating references on the fences/requests. | ||
| 445 | */ | ||
| 437 | prune_fences = count && timeout >= 0; | 446 | prune_fences = count && timeout >= 0; |
| 438 | } else { | 447 | } else { |
| 439 | excl = reservation_object_get_excl_rcu(resv); | 448 | excl = reservation_object_get_excl_rcu(resv); |
| 440 | } | 449 | } |
| 441 | 450 | ||
| 442 | if (excl && timeout >= 0) { | 451 | if (excl && timeout >= 0) |
| 443 | timeout = i915_gem_object_wait_fence(excl, flags, timeout, | 452 | timeout = i915_gem_object_wait_fence(excl, flags, timeout, |
| 444 | rps_client); | 453 | rps_client); |
| 445 | prune_fences = timeout >= 0; | ||
| 446 | } | ||
| 447 | 454 | ||
| 448 | dma_fence_put(excl); | 455 | dma_fence_put(excl); |
| 449 | 456 | ||
| 450 | /* Oportunistically prune the fences iff we know they have *all* been | 457 | /* |
| 458 | * Opportunistically prune the fences iff we know they have *all* been | ||
| 451 | * signaled and that the reservation object has not been changed (i.e. | 459 | * signaled and that the reservation object has not been changed (i.e. |
| 452 | * no new fences have been added). | 460 | * no new fences have been added). |
| 453 | */ | 461 | */ |
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c index b33d2158c234..e5e6f6bb2b05 100644 --- a/drivers/gpu/drm/i915/i915_sysfs.c +++ b/drivers/gpu/drm/i915/i915_sysfs.c | |||
| @@ -304,8 +304,9 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev, | |||
| 304 | { | 304 | { |
| 305 | struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); | 305 | struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev); |
| 306 | struct intel_rps *rps = &dev_priv->gt_pm.rps; | 306 | struct intel_rps *rps = &dev_priv->gt_pm.rps; |
| 307 | u32 val; | 307 | bool boost = false; |
| 308 | ssize_t ret; | 308 | ssize_t ret; |
| 309 | u32 val; | ||
| 309 | 310 | ||
| 310 | ret = kstrtou32(buf, 0, &val); | 311 | ret = kstrtou32(buf, 0, &val); |
| 311 | if (ret) | 312 | if (ret) |
| @@ -317,8 +318,13 @@ static ssize_t gt_boost_freq_mhz_store(struct device *kdev, | |||
| 317 | return -EINVAL; | 318 | return -EINVAL; |
| 318 | 319 | ||
| 319 | mutex_lock(&dev_priv->pcu_lock); | 320 | mutex_lock(&dev_priv->pcu_lock); |
| 320 | rps->boost_freq = val; | 321 | if (val != rps->boost_freq) { |
| 322 | rps->boost_freq = val; | ||
| 323 | boost = atomic_read(&rps->num_waiters); | ||
| 324 | } | ||
| 321 | mutex_unlock(&dev_priv->pcu_lock); | 325 | mutex_unlock(&dev_priv->pcu_lock); |
| 326 | if (boost) | ||
| 327 | schedule_work(&rps->work); | ||
| 322 | 328 | ||
| 323 | return count; | 329 | return count; |
| 324 | } | 330 | } |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 35c5299feab6..a29868cd30c7 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -620,19 +620,15 @@ static int | |||
| 620 | bxt_power_sequencer_idx(struct intel_dp *intel_dp) | 620 | bxt_power_sequencer_idx(struct intel_dp *intel_dp) |
| 621 | { | 621 | { |
| 622 | struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp)); | 622 | struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp)); |
| 623 | int backlight_controller = dev_priv->vbt.backlight.controller; | ||
| 623 | 624 | ||
| 624 | lockdep_assert_held(&dev_priv->pps_mutex); | 625 | lockdep_assert_held(&dev_priv->pps_mutex); |
| 625 | 626 | ||
| 626 | /* We should never land here with regular DP ports */ | 627 | /* We should never land here with regular DP ports */ |
| 627 | WARN_ON(!intel_dp_is_edp(intel_dp)); | 628 | WARN_ON(!intel_dp_is_edp(intel_dp)); |
| 628 | 629 | ||
| 629 | /* | ||
| 630 | * TODO: BXT has 2 PPS instances. The correct port->PPS instance | ||
| 631 | * mapping needs to be retrieved from VBT, for now just hard-code to | ||
| 632 | * use instance #0 always. | ||
| 633 | */ | ||
| 634 | if (!intel_dp->pps_reset) | 630 | if (!intel_dp->pps_reset) |
| 635 | return 0; | 631 | return backlight_controller; |
| 636 | 632 | ||
| 637 | intel_dp->pps_reset = false; | 633 | intel_dp->pps_reset = false; |
| 638 | 634 | ||
| @@ -642,7 +638,7 @@ bxt_power_sequencer_idx(struct intel_dp *intel_dp) | |||
| 642 | */ | 638 | */ |
| 643 | intel_dp_init_panel_power_sequencer_registers(intel_dp, false); | 639 | intel_dp_init_panel_power_sequencer_registers(intel_dp, false); |
| 644 | 640 | ||
| 645 | return 0; | 641 | return backlight_controller; |
| 646 | } | 642 | } |
| 647 | 643 | ||
| 648 | typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv, | 644 | typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv, |
